From 13313f3e31fdba4d5c78f4bb80845c34f29c01ce Mon Sep 17 00:00:00 2001 From: bicyclesoda <38231712+mountainflaw@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:25:47 -0400 Subject: [PATCH] [WIP] GCC Building + libhackerultra (#17) Co-authored-by: a --- Makefile | 200 +- README.md | 45 +- asm/boot.s | 92 +- asm/rom_header.s | 2 +- compile_flags.txt | 26 + extract_assets.py | 2 + include/ld.h | 79 + include/macros.h | 4 - include/segment_symbols.h | 6 +- include/segments.h | 51 +- .../hackerlibultra}/.clang-format | 26 +- .../.github/workflows/ci_gcc.yml | 35 + lib/hackerlibultra/.gitignore | 29 + lib/hackerlibultra/.gitrepo | 12 + lib/hackerlibultra/CODEOWNERS | 11 + lib/hackerlibultra/Makefile | 118 + lib/hackerlibultra/README.md | 78 + lib/hackerlibultra/base/I/libgultra.txt | 404 ++ lib/hackerlibultra/base/I/libgultra_d.txt | 404 ++ lib/hackerlibultra/base/I/libgultra_rom.txt | 404 ++ lib/hackerlibultra/base/I/libultra.txt | 400 ++ lib/hackerlibultra/base/I/libultra_d.txt | 404 ++ lib/hackerlibultra/base/I/libultra_rom.txt | 370 ++ lib/hackerlibultra/base/J/libgultra.txt | 446 ++ lib/hackerlibultra/base/J/libgultra_d.txt | 451 ++ lib/hackerlibultra/base/J/libgultra_rom.txt | 416 ++ lib/hackerlibultra/base/J/libultra.txt | 446 ++ lib/hackerlibultra/base/J/libultra_d.txt | 451 ++ lib/hackerlibultra/base/J/libultra_rom.txt | 418 ++ lib/hackerlibultra/base/K/libgultra.txt | 468 ++ lib/hackerlibultra/base/K/libgultra_d.txt | 471 ++ lib/hackerlibultra/base/K/libgultra_rom.txt | 425 ++ lib/hackerlibultra/base/K/libultra.txt | 468 ++ lib/hackerlibultra/base/K/libultra_d.txt | 471 ++ lib/hackerlibultra/base/K/libultra_rom.txt | 427 ++ lib/hackerlibultra/base/L/libgultra.txt | 483 ++ lib/hackerlibultra/base/L/libgultra_d.txt | 486 ++ lib/hackerlibultra/base/L/libgultra_rom.txt | 440 ++ lib/hackerlibultra/base/L/libultra.txt | 483 ++ lib/hackerlibultra/base/L/libultra_d.txt | 486 ++ lib/hackerlibultra/base/L/libultra_rom.txt | 442 ++ lib/hackerlibultra/format.py | 209 + lib/hackerlibultra/include/PR/R4300.h | 453 ++ lib/hackerlibultra/include/PR/abi.h | 401 ++ lib/hackerlibultra/include/PR/gbi.h | 4062 +++++++++++++++++ lib/hackerlibultra/include/PR/gs2dex.h | 398 ++ lib/hackerlibultra/include/PR/gt.h | 355 ++ lib/hackerlibultra/include/PR/gu.h | 216 + lib/hackerlibultra/include/PR/libaudio.h | 934 ++++ lib/hackerlibultra/include/PR/mbi.h | 97 + lib/hackerlibultra/include/PR/os.h | 107 + lib/hackerlibultra/include/PR/os_ai.h | 87 + lib/hackerlibultra/include/PR/os_cache.h | 91 + lib/hackerlibultra/include/PR/os_cont.h | 202 + lib/hackerlibultra/include/PR/os_convert.h | 106 + lib/hackerlibultra/include/PR/os_debug.h | 113 + lib/hackerlibultra/include/PR/os_eeprom.h | 101 + lib/hackerlibultra/include/PR/os_error.h | 81 + lib/hackerlibultra/include/PR/os_exception.h | 86 + lib/hackerlibultra/include/PR/os_flash.h | 74 + lib/hackerlibultra/include/PR/os_gbpak.h | 101 + lib/hackerlibultra/include/PR/os_gio.h | 81 + lib/hackerlibultra/include/PR/os_host.h | 162 + lib/hackerlibultra/include/PR/os_internal.h | 49 + .../include/PR/os_internal_debug.h | 42 + .../include/PR/os_internal_error.h | 44 + .../include/PR/os_internal_exception.h | 52 + .../include/PR/os_internal_flash.h | 40 + .../include/PR/os_internal_gio.h | 44 + .../include/PR/os_internal_host.h | 41 + .../include/PR/os_internal_reg.h | 57 + .../include/PR/os_internal_rsp.h | 47 + .../include/PR/os_internal_si.h | 45 + .../include/PR/os_internal_thread.h | 42 + .../include/PR/os_internal_tlb.h | 46 + lib/hackerlibultra/include/PR/os_libc.h | 100 + lib/hackerlibultra/include/PR/os_message.h | 157 + lib/hackerlibultra/include/PR/os_motor.h | 78 + lib/hackerlibultra/include/PR/os_pfs.h | 193 + lib/hackerlibultra/include/PR/os_pi.h | 214 + lib/hackerlibultra/include/PR/os_rdp.h | 87 + lib/hackerlibultra/include/PR/os_reg.h | 85 + lib/hackerlibultra/include/PR/os_rsp.h | 81 + lib/hackerlibultra/include/PR/os_si.h | 81 + lib/hackerlibultra/include/PR/os_system.h | 113 + lib/hackerlibultra/include/PR/os_thread.h | 157 + lib/hackerlibultra/include/PR/os_time.h | 107 + lib/hackerlibultra/include/PR/os_tlb.h | 102 + lib/hackerlibultra/include/PR/os_version.h | 26 + lib/hackerlibultra/include/PR/os_vi.h | 290 ++ lib/hackerlibultra/include/PR/os_voice.h | 103 + lib/hackerlibultra/include/PR/ramrom.h | 113 + lib/hackerlibultra/include/PR/rcp.h | 849 ++++ lib/hackerlibultra/include/PR/rdb.h | 90 + lib/hackerlibultra/include/PR/region.h | 113 + lib/hackerlibultra/include/PR/rmon.h | 39 + lib/hackerlibultra/include/PR/sched.h | 113 + lib/hackerlibultra/include/PR/sp.h | 196 + lib/hackerlibultra/include/PR/sptask.h | 197 + lib/hackerlibultra/include/PR/ucode.h | 191 + lib/hackerlibultra/include/PR/ultraerror.h | 165 + lib/hackerlibultra/include/PR/ultralog.h | 74 + lib/hackerlibultra/include/PR/ultratypes.h | 81 + .../include/PRinternal/controller.h | 277 ++ .../include/PRinternal/controller_gbpak.h | 8 + .../include/PRinternal/controller_voice.h | 59 + .../include/PRinternal/dbgdefs.h | 8 + .../include/PRinternal/dbgproto.h | 402 ++ .../include/PRinternal/macros.h | 22 + lib/hackerlibultra/include/PRinternal/osint.h | 55 + lib/hackerlibultra/include/PRinternal/piint.h | 192 + .../include/PRinternal/rmonint.h | 168 + lib/hackerlibultra/include/PRinternal/siint.h | 15 + lib/hackerlibultra/include/PRinternal/viint.h | 66 + lib/hackerlibultra/include/asm.h | 1 + lib/hackerlibultra/include/assert.h | 12 + .../include/compiler/gcc/math.h | 1 + .../include/compiler/gcc/memory.h | 23 + .../include/compiler/gcc/sgidefs.h | 44 + .../include/compiler/gcc/stdarg.h | 114 + .../include/compiler/gcc/stdio.h | 1 + .../include/compiler/gcc/stdlib.h | 80 + .../include/compiler/gcc/string.h | 42 + .../include/compiler/ido/math.h | 1 + .../include/compiler/ido/memory.h | 23 + .../include/compiler/ido/stdarg.h | 30 + .../include/compiler/ido/stdio.h | 1 + .../include/compiler/ido/stdlib.h | 80 + .../include/compiler/ido/string.h | 42 + .../include/compiler/modern_gcc/math.h | 1 + .../include/compiler/modern_gcc/memory.h | 23 + .../include/compiler/modern_gcc/sgidefs.h | 44 + .../include/compiler/modern_gcc/stdarg.h | 9 + .../include/compiler/modern_gcc/stdio.h | 1 + .../include/compiler/modern_gcc/stdlib.h | 80 + .../include/compiler/modern_gcc/string.h | 42 + .../hackerlibultra/include/fpregdef.h | 0 lib/hackerlibultra/include/regdef.h | 3 + lib/hackerlibultra/include/sgidefs.h | 3 + lib/hackerlibultra/include/sys/asm.h | 115 + lib/hackerlibultra/include/sys/fpregdef.h | 0 lib/hackerlibultra/include/sys/regdef.h | 187 + lib/hackerlibultra/include/ultra64.h | 40 + lib/hackerlibultra/include/ultrahost.h | 59 + lib/hackerlibultra/src/audio/Makefile | 120 + lib/hackerlibultra/src/audio/auxbus.c | 59 + lib/hackerlibultra/src/audio/bnkf.c | 131 + lib/hackerlibultra/src/audio/cents2ratio.c | 32 + lib/hackerlibultra/src/audio/copy.c | 33 + lib/hackerlibultra/src/audio/cseq.c | 345 ++ lib/hackerlibultra/src/audio/cseq.h | 8 + lib/hackerlibultra/src/audio/cseqp.h | 8 + lib/hackerlibultra/src/audio/cspdelete.c | 27 + lib/hackerlibultra/src/audio/cspgetchlvol.c | 25 + lib/hackerlibultra/src/audio/cspgetfxmix.c | 25 + lib/hackerlibultra/src/audio/cspgetpan.c | 25 + lib/hackerlibultra/src/audio/cspgetpriority.c | 25 + lib/hackerlibultra/src/audio/cspgetprogram.c | 40 + lib/hackerlibultra/src/audio/cspgetseq.c | 27 + lib/hackerlibultra/src/audio/cspgetstate.c | 27 + lib/hackerlibultra/src/audio/cspgettempo.c | 29 + lib/hackerlibultra/src/audio/cspgetvol.c | 25 + lib/hackerlibultra/src/audio/csplayer.c | 805 ++++ lib/hackerlibultra/src/audio/cspplay.c | 32 + lib/hackerlibultra/src/audio/cspsendmidi.c | 37 + lib/hackerlibultra/src/audio/cspsetbank.c | 30 + lib/hackerlibultra/src/audio/cspsetchlvol.c | 33 + lib/hackerlibultra/src/audio/cspsetfxmix.c | 33 + lib/hackerlibultra/src/audio/cspsetpan.c | 33 + lib/hackerlibultra/src/audio/cspsetpriority.c | 31 + lib/hackerlibultra/src/audio/cspsetprogram.c | 33 + lib/hackerlibultra/src/audio/cspsetseq.c | 32 + lib/hackerlibultra/src/audio/cspsettempo.c | 34 + lib/hackerlibultra/src/audio/cspsetvol.c | 30 + lib/hackerlibultra/src/audio/cspstop.c | 30 + lib/hackerlibultra/src/audio/drvrnew.c | 295 ++ lib/hackerlibultra/src/audio/env.c | 532 +++ lib/hackerlibultra/src/audio/event.c | 244 + lib/hackerlibultra/src/audio/filter.c | 31 + lib/hackerlibultra/src/audio/heapalloc.c | 64 + lib/hackerlibultra/src/audio/heapcheck.c | 67 + lib/hackerlibultra/src/audio/heapinit.c | 35 + lib/hackerlibultra/src/audio/initfx.h | 59 + lib/hackerlibultra/src/audio/load.c | 449 ++ lib/hackerlibultra/src/audio/mainbus.c | 62 + lib/hackerlibultra/src/audio/parse_abi.c | 19 + lib/hackerlibultra/src/audio/resample.c | 149 + lib/hackerlibultra/src/audio/reverb.c | 432 ++ lib/hackerlibultra/src/audio/save.c | 62 + lib/hackerlibultra/src/audio/seq.c | 312 ++ lib/hackerlibultra/src/audio/seq.h | 8 + lib/hackerlibultra/src/audio/seqp.h | 35 + lib/hackerlibultra/src/audio/seqpdelete.c | 36 + lib/hackerlibultra/src/audio/seqpgetchlvol.c | 25 + lib/hackerlibultra/src/audio/seqpgetfxmix.c | 25 + lib/hackerlibultra/src/audio/seqpgetpan.c | 25 + .../src/audio/seqpgetpriority.c | 25 + lib/hackerlibultra/src/audio/seqpgetprogram.c | 40 + lib/hackerlibultra/src/audio/seqpgetseq.c | 27 + lib/hackerlibultra/src/audio/seqpgetstate.c | 27 + lib/hackerlibultra/src/audio/seqpgettempo.c | 29 + lib/hackerlibultra/src/audio/seqpgetvol.c | 25 + lib/hackerlibultra/src/audio/seqplayer.c | 1127 +++++ lib/hackerlibultra/src/audio/seqploop.c | 32 + lib/hackerlibultra/src/audio/seqpplay.c | 32 + lib/hackerlibultra/src/audio/seqpsendmidi.c | 37 + lib/hackerlibultra/src/audio/seqpsetbank.c | 30 + lib/hackerlibultra/src/audio/seqpsetchlvol.c | 33 + lib/hackerlibultra/src/audio/seqpsetfxmix.c | 33 + lib/hackerlibultra/src/audio/seqpsetpan.c | 33 + .../src/audio/seqpsetpriority.c | 31 + lib/hackerlibultra/src/audio/seqpsetprogram.c | 35 + lib/hackerlibultra/src/audio/seqpsetseq.c | 32 + lib/hackerlibultra/src/audio/seqpsettempo.c | 34 + lib/hackerlibultra/src/audio/seqpsetvol.c | 30 + lib/hackerlibultra/src/audio/seqpstop.c | 30 + lib/hackerlibultra/src/audio/sl.c | 56 + lib/hackerlibultra/src/audio/sndp.h | 101 + lib/hackerlibultra/src/audio/sndpallocate.c | 41 + lib/hackerlibultra/src/audio/sndpdeallocate.c | 33 + lib/hackerlibultra/src/audio/sndpdelete.c | 42 + lib/hackerlibultra/src/audio/sndpgetsound.c | 25 + lib/hackerlibultra/src/audio/sndpgetstate.c | 27 + lib/hackerlibultra/src/audio/sndplayer.c | 289 ++ lib/hackerlibultra/src/audio/sndpplay.c | 34 + lib/hackerlibultra/src/audio/sndpplayat.c | 30 + lib/hackerlibultra/src/audio/sndpsetfxmix.c | 40 + lib/hackerlibultra/src/audio/sndpsetpan.c | 40 + lib/hackerlibultra/src/audio/sndpsetpitch.c | 46 + .../src/audio/sndpsetpriority.c | 36 + lib/hackerlibultra/src/audio/sndpsetsound.c | 34 + lib/hackerlibultra/src/audio/sndpsetvol.c | 40 + lib/hackerlibultra/src/audio/sndpstop.c | 33 + lib/hackerlibultra/src/audio/synaddplayer.c | 32 + lib/hackerlibultra/src/audio/synallocfx.c | 29 + lib/hackerlibultra/src/audio/synallocvoice.c | 128 + lib/hackerlibultra/src/audio/syndelete.c | 25 + lib/hackerlibultra/src/audio/synfreefx.c | 24 + lib/hackerlibultra/src/audio/synfreevoice.c | 52 + lib/hackerlibultra/src/audio/syngetfxref.c | 31 + lib/hackerlibultra/src/audio/syngetpriority.c | 25 + .../src/audio/synremoveplayer.c | 46 + lib/hackerlibultra/src/audio/synsetfxmix.c | 58 + lib/hackerlibultra/src/audio/synsetfxparam.c | 27 + lib/hackerlibultra/src/audio/synsetpan.c | 48 + lib/hackerlibultra/src/audio/synsetpitch.c | 48 + lib/hackerlibultra/src/audio/synsetpriority.c | 25 + lib/hackerlibultra/src/audio/synsetvol.c | 48 + lib/hackerlibultra/src/audio/synstartvoice.c | 46 + .../src/audio/synstartvoiceparam.c | 70 + lib/hackerlibultra/src/audio/synstopvoice.c | 41 + lib/hackerlibultra/src/audio/synthInternals.h | 334 ++ lib/hackerlibultra/src/audio/synthesizer.c | 306 ++ lib/hackerlibultra/src/debug/assert.c | 12 + lib/hackerlibultra/src/debug/assertbreak.s | 14 + .../os => hackerlibultra/src/debug}/atomic.c | 8 +- lib/hackerlibultra/src/debug/kdebugserver.c | 96 + lib/hackerlibultra/src/debug/osint_debug.h | 11 + lib/hackerlibultra/src/debug/profile.c | 176 + lib/hackerlibultra/src/debug/threadprofile.c | 22 + .../src/debug/threadprofileclear.c | 11 + .../src/debug/threadprofileinit.c | 16 + .../src/debug/threadprofilereadcount.c | 39 + .../src/debug/threadprofilereadtime.c | 51 + .../src/debug/threadprofilestart.c | 22 + .../src/debug/threadprofilestop.c | 47 + lib/hackerlibultra/src/error/commonerror.c | 193 + lib/hackerlibultra/src/error/error.c | 30 + lib/hackerlibultra/src/error/errorasm.s | 33 + lib/hackerlibultra/src/error/kmcprintf.c | 246 + lib/hackerlibultra/src/flash/flashallerase.c | 32 + .../src/flash/flashallerasethrough.c | 8 + lib/hackerlibultra/src/flash/flashchange.c | 8 + .../src/flash/flashcheckeraseend.c | 23 + .../src/flash/flashclearstatus.c | 10 + lib/hackerlibultra/src/flash/flashgetaddr.c | 16 + lib/hackerlibultra/src/flash/flashinit.c | 44 + lib/hackerlibultra/src/flash/flashreadarray.c | 50 + lib/hackerlibultra/src/flash/flashreadid.c | 27 + .../src/flash/flashreadstatus.c | 17 + lib/hackerlibultra/src/flash/flashreinit.c | 14 + .../src/flash/flashsectorerase.c | 32 + .../src/flash/flashsectorerasethrough.c | 8 + .../src/flash/flashwritearray.c | 34 + .../src/flash/flashwritebuffer.c | 20 + lib/hackerlibultra/src/gio/giointerrupt.c | 8 + lib/hackerlibultra/src/gio/giorawinterrupt.c | 13 + lib/hackerlibultra/src/gt/Makefile | 19 + lib/hackerlibultra/src/gt/dumpturbo.c | 226 + lib/hackerlibultra/src/gt/gt.c | 150 + lib/hackerlibultra/src/gt/gtint.h | 35 + lib/hackerlibultra/src/gu/Makefile | 52 + lib/hackerlibultra/src/gu/align.c | 73 + lib/{ultra => hackerlibultra/src}/gu/cosf.c | 92 +- lib/hackerlibultra/src/gu/coss.c | 43 + lib/hackerlibultra/src/gu/dump_gbi.c | 271 ++ lib/hackerlibultra/src/gu/frustum.c | 40 + lib/{ultra => hackerlibultra/src}/gu/guint.h | 38 +- lib/hackerlibultra/src/gu/guloadtile_bug.c | 199 + lib/hackerlibultra/src/gu/libm_vals.s | 5 + .../src/gu/loadtextureblockmipmap.c | 630 +++ lib/hackerlibultra/src/gu/lookat.c | 79 + lib/hackerlibultra/src/gu/lookathil.c | 164 + .../src}/gu/lookatref.c | 43 +- lib/hackerlibultra/src/gu/lookatstereo.c | 105 + lib/hackerlibultra/src/gu/mtxcatf.c | 60 + lib/hackerlibultra/src/gu/mtxcatl.c | 55 + lib/hackerlibultra/src/gu/mtxutil.c | 70 + .../src/gu/normalize.c} | 17 +- lib/{ultra => hackerlibultra/src}/gu/ortho.c | 37 +- lib/hackerlibultra/src/gu/parse_gbi.c | 130 + lib/hackerlibultra/src/gu/parse_rdp.c | 34 + lib/hackerlibultra/src/gu/parse_string.c | 33 + .../src}/gu/perspective.c | 45 +- lib/hackerlibultra/src/gu/position.c | 69 + lib/hackerlibultra/src/gu/poslight.c | 64 + lib/hackerlibultra/src/gu/poslighthil.c | 154 + .../src/gu/random.c} | 34 +- lib/hackerlibultra/src/gu/readme.txt | 17 + lib/{ultra => hackerlibultra/src}/gu/rotate.c | 67 +- lib/hackerlibultra/src/gu/rotaterpy.c | 56 + lib/{ultra => hackerlibultra/src}/gu/scale.c | 21 +- lib/{ultra => hackerlibultra/src}/gu/sinf.c | 108 +- lib/hackerlibultra/src/gu/sins.c | 59 + lib/hackerlibultra/src/gu/sintable.h | 81 + lib/{ultra => hackerlibultra/src}/gu/sqrtf.s | 8 +- .../src}/gu/translate.c | 21 +- lib/hackerlibultra/src/gu/us2dex.c | 74 + lib/hackerlibultra/src/gu/us2dex2_emu.c | 12 + lib/hackerlibultra/src/gu/us2dex_emu.c | 523 +++ lib/hackerlibultra/src/gu/usprite.c | 28 + lib/hackerlibultra/src/host/host_ptn64.c | 209 + lib/hackerlibultra/src/host/readhost.c | 36 + lib/hackerlibultra/src/host/writehost.c | 57 + lib/{ultra => hackerlibultra/src}/io/ai.c | 7 +- lib/hackerlibultra/src/io/aigetlen.c | 14 + lib/hackerlibultra/src/io/aigetstat.c | 8 + lib/hackerlibultra/src/io/aisetfreq.c | 68 + lib/hackerlibultra/src/io/aisetnextbuf.c | 67 + .../src}/io/cartrominit.c | 29 +- lib/hackerlibultra/src/io/contchannelreset.c | 28 + lib/hackerlibultra/src/io/conteeplongread.c | 15 + .../src}/io/conteeplongwrite.c | 9 +- lib/hackerlibultra/src/io/conteepprobe.c | 34 + lib/hackerlibultra/src/io/conteepread.c | 138 + .../src}/io/conteepwrite.c | 198 +- lib/hackerlibultra/src/io/contpfs.c | 392 ++ lib/hackerlibultra/src/io/contquery.c | 32 + .../src}/io/contramread.c | 88 +- .../src}/io/contramwrite.c | 81 +- lib/hackerlibultra/src/io/contreaddata.c | 69 + lib/hackerlibultra/src/io/contreset.c | 51 + lib/hackerlibultra/src/io/controller.c | 101 + lib/hackerlibultra/src/io/contsetch.c | 23 + lib/hackerlibultra/src/io/crc.c | 221 + lib/hackerlibultra/src/io/devmgr.c | 108 + lib/hackerlibultra/src/io/dp.c | 15 + lib/hackerlibultra/src/io/dpctr.c | 9 + lib/hackerlibultra/src/io/dpgetstat.c | 9 + lib/hackerlibultra/src/io/dpsetnextbuf.c | 39 + lib/hackerlibultra/src/io/dpsetstat.c | 9 + lib/hackerlibultra/src/io/driverominit.c | 31 + lib/hackerlibultra/src/io/epidma.c | 61 + lib/hackerlibultra/src/io/epigettype.c | 7 + lib/hackerlibultra/src/io/epilinkhandle.c | 11 + lib/hackerlibultra/src/io/epirawdma.c | 53 + lib/hackerlibultra/src/io/epirawread.c | 29 + lib/hackerlibultra/src/io/epirawwrite.c | 22 + lib/hackerlibultra/src/io/epiread.c | 19 + lib/hackerlibultra/src/io/epiwrite.c | 19 + .../src/io/gbpakcheckconnector.c | 131 + lib/hackerlibultra/src/io/gbpakgetbank.c | 28 + lib/hackerlibultra/src/io/gbpakgetstatus.c | 39 + lib/hackerlibultra/src/io/gbpakinit.c | 90 + lib/hackerlibultra/src/io/gbpakpower.c | 34 + lib/hackerlibultra/src/io/gbpakreadid.c | 97 + lib/hackerlibultra/src/io/gbpakreadwrite.c | 74 + lib/hackerlibultra/src/io/gbpaksetbank.c | 35 + .../src}/io/leodiskinit.c | 21 +- lib/hackerlibultra/src/io/leointerrupt.c | 195 + lib/{ultra => hackerlibultra/src}/io/motor.c | 359 +- lib/hackerlibultra/src/io/pfsallocatefile.c | 371 ++ lib/hackerlibultra/src/io/pfschecker.c | 258 ++ lib/hackerlibultra/src/io/pfsdeletefile.c | 176 + lib/hackerlibultra/src/io/pfsfilestate.c | 113 + lib/hackerlibultra/src/io/pfsfreeblocks.c | 32 + lib/hackerlibultra/src/io/pfsgetlabel.c | 26 + .../src}/io/pfsgetstatus.c | 88 +- lib/hackerlibultra/src/io/pfsinit.c | 25 + lib/hackerlibultra/src/io/pfsinitpak.c | 130 + .../src}/io/pfsisplug.c | 62 +- lib/hackerlibultra/src/io/pfsnumfiles.c | 34 + lib/hackerlibultra/src/io/pfsreadwritefile.c | 126 + lib/hackerlibultra/src/io/pfsreformat.c | 72 + lib/hackerlibultra/src/io/pfsrepairid.c | 74 + lib/hackerlibultra/src/io/pfssearchfile.c | 57 + .../src}/io/pfsselectbank.c | 17 +- lib/hackerlibultra/src/io/pfssetlabel.c | 42 + lib/hackerlibultra/src/io/pi.c | 15 + lib/{ultra => hackerlibultra/src}/io/piacs.c | 13 +- lib/hackerlibultra/src/io/pidma.c | 66 + lib/hackerlibultra/src/io/pigetcmdq.c | 10 + lib/hackerlibultra/src/io/pigetstat.c | 9 + lib/hackerlibultra/src/io/pigettype.c | 8 + lib/hackerlibultra/src/io/pimgr.c | 114 + lib/hackerlibultra/src/io/pirawdma.c | 53 + lib/hackerlibultra/src/io/pirawread.c | 29 + lib/hackerlibultra/src/io/pirawwrite.c | 21 + lib/hackerlibultra/src/io/piread.c | 19 + lib/hackerlibultra/src/io/piwrite.c | 19 + lib/{ultra => hackerlibultra/src}/io/si.c | 11 +- lib/{ultra => hackerlibultra/src}/io/siacs.c | 15 +- lib/hackerlibultra/src/io/sigetstat.c | 9 + .../src}/io/sirawdma.c | 28 +- lib/hackerlibultra/src/io/sirawread.c | 23 + lib/hackerlibultra/src/io/sirawwrite.c | 22 + lib/{ultra => hackerlibultra/src}/io/sp.c | 11 +- lib/hackerlibultra/src/io/spgetstat.c | 9 + lib/hackerlibultra/src/io/sprawdma.c | 33 + lib/hackerlibultra/src/io/sprawread.c | 24 + lib/hackerlibultra/src/io/sprawwrite.c | 23 + .../src}/io/spsetpc.c | 4 +- .../src}/io/spsetstat.c | 3 + lib/hackerlibultra/src/io/sptask.c | 88 + .../src}/io/sptaskyield.c | 0 .../src}/io/sptaskyielded.c | 6 +- lib/hackerlibultra/src/io/vi.c | 39 + .../src}/io/viblack.c | 4 + lib/hackerlibultra/src/io/viextendvstart.c | 19 + lib/hackerlibultra/src/io/vifade.c | 18 + lib/hackerlibultra/src/io/vigetcurrcontext.c | 9 + lib/hackerlibultra/src/io/vigetcurrframebuf.c | 20 + lib/hackerlibultra/src/io/vigetfield.c | 6 + lib/hackerlibultra/src/io/vigetline.c | 6 + lib/hackerlibultra/src/io/vigetmode.c | 21 + lib/hackerlibultra/src/io/vigetnextcontext.c | 6 + lib/hackerlibultra/src/io/vigetnextframebuf.c | 20 + lib/hackerlibultra/src/io/vigetstat.c | 6 + lib/hackerlibultra/src/io/vimgr.c | 126 + lib/hackerlibultra/src/io/virepeatline.c | 17 + lib/hackerlibultra/src/io/visetevent.c | 27 + lib/hackerlibultra/src/io/visetmode.c | 27 + lib/hackerlibultra/src/io/visetspecial.c | 86 + lib/hackerlibultra/src/io/visetxscale.c | 37 + lib/hackerlibultra/src/io/visetyscale.c | 34 + lib/hackerlibultra/src/io/viswapbuf.c | 31 + .../src}/io/viswapcontext.c | 20 +- lib/hackerlibultra/src/io/vitbl.c | 1744 +++++++ lib/hackerlibultra/src/libc/bcmp.s | 96 + lib/hackerlibultra/src/libc/bcopy.s | 220 + lib/hackerlibultra/src/libc/bzero.s | 72 + lib/{ultra => hackerlibultra/src}/libc/ldiv.c | 29 +- lib/{ultra => hackerlibultra/src}/libc/ll.c | 2 +- lib/hackerlibultra/src/libc/llbit.c | 51 + .../src}/libc/llcvt.c | 16 +- lib/hackerlibultra/src/libc/sprintf.c | 22 + lib/hackerlibultra/src/libc/string.c | 36 + lib/hackerlibultra/src/libc/syncprintf.c | 153 + .../src}/libc/xldtob.c | 150 +- lib/hackerlibultra/src/libc/xlitob.c | 58 + lib/hackerlibultra/src/libc/xprintf.c | 247 + .../src}/libc/xstdio.h | 29 +- lib/hackerlibultra/src/log/delay.s | 24 + lib/hackerlibultra/src/log/log.c | 124 + lib/hackerlibultra/src/log/logfloat.c | 11 + lib/hackerlibultra/src/mgu/Makefile | 36 + lib/hackerlibultra/src/mgu/asm.h | 47 + lib/hackerlibultra/src/mgu/mtxcatf.s | 103 + .../src/mgu/mtxcatl.c} | 45 +- lib/hackerlibultra/src/mgu/mtxf2l.s | 80 + lib/hackerlibultra/src/mgu/mtxident.s | 60 + .../src}/mgu/mtxidentf.s | 72 +- lib/hackerlibultra/src/mgu/mtxl2f.s | 80 + lib/hackerlibultra/src/mgu/mtxxfmf.c | 38 + lib/hackerlibultra/src/mgu/mtxxfml.c | 40 + lib/hackerlibultra/src/mgu/normalize.s | 56 + lib/hackerlibultra/src/mgu/regdef.h | 187 + lib/hackerlibultra/src/mgu/rotate.c | 71 + lib/hackerlibultra/src/mgu/scale.s | 85 + lib/hackerlibultra/src/mgu/scalef.s | 57 + lib/hackerlibultra/src/mgu/translate.s | 101 + lib/hackerlibultra/src/mgu/translatef.s | 58 + lib/hackerlibultra/src/monutil.s | 188 + lib/hackerlibultra/src/os/ackramromread.c | 16 + lib/hackerlibultra/src/os/ackramromwrite.c | 15 + lib/hackerlibultra/src/os/afterprenmi.c | 5 + lib/hackerlibultra/src/os/atomic.c | 16 + lib/hackerlibultra/src/os/createmesgqueue.c | 20 + lib/hackerlibultra/src/os/createthread.c | 54 + .../src}/os/destroythread.c | 13 +- .../src}/os/exceptasm.h | 20 +- lib/hackerlibultra/src/os/exceptasm.s | 1343 ++++++ lib/hackerlibultra/src/os/exit.c | 9 + lib/hackerlibultra/src/os/getactivequeue.c | 6 + .../src}/os/getcause.s | 4 +- lib/hackerlibultra/src/os/getcompare.s | 9 + lib/hackerlibultra/src/os/getconfig.s | 9 + .../src}/os/getcount.s | 9 +- .../src/os/getcurrfaultthread.c | 6 + lib/hackerlibultra/src/os/getfpccsr.s | 13 + lib/hackerlibultra/src/os/gethwinterrupt.c | 21 + lib/hackerlibultra/src/os/getintmask.s | 32 + lib/hackerlibultra/src/os/getmemsize.c | 53 + .../src/os/getnextfaultthread.c | 23 + lib/{ultra => hackerlibultra/src}/os/getsr.s | 4 +- lib/hackerlibultra/src/os/getthreadid.c | 10 + .../src}/os/getthreadpri.c | 4 +- lib/hackerlibultra/src/os/gettime.c | 25 + lib/hackerlibultra/src/os/gettlbasid.s | 11 + lib/hackerlibultra/src/os/gettlbhi.s | 17 + lib/hackerlibultra/src/os/gettlblo0.s | 17 + lib/hackerlibultra/src/os/gettlblo1.s | 17 + lib/hackerlibultra/src/os/gettlbpagemask.s | 17 + lib/hackerlibultra/src/os/getwatchlo.s | 9 + lib/hackerlibultra/src/os/initialize.c | 221 + lib/hackerlibultra/src/os/initialize_emu.c | 28 + lib/hackerlibultra/src/os/initialize_isv.c | 175 + lib/hackerlibultra/src/os/initialize_kmc.c | 152 + lib/hackerlibultra/src/os/initialize_msp.c | 152 + lib/hackerlibultra/src/os/initrdb.c | 31 + lib/hackerlibultra/src/os/interrupt.s | 55 + lib/hackerlibultra/src/os/invaldcache.s | 91 + lib/hackerlibultra/src/os/invalicache.s | 51 + .../src}/os/jammesg.c | 20 +- lib/hackerlibultra/src/os/maptlb.s | 110 + lib/hackerlibultra/src/os/maptlbrdb.s | 31 + lib/hackerlibultra/src/os/parameters.s | 17 + lib/hackerlibultra/src/os/physicaltovirtual.c | 6 + lib/hackerlibultra/src/os/probetlb.s | 85 + lib/hackerlibultra/src/os/rdbsend.c | 76 + .../src}/os/recvmesg.c | 16 +- .../src}/os/resetglobalintmask.c | 0 .../src}/os/sendmesg.c | 13 +- lib/hackerlibultra/src/os/setcause.s | 9 + .../src}/os/setcompare.s | 9 +- lib/hackerlibultra/src/os/setconfig.s | 9 + lib/hackerlibultra/src/os/setcount.s | 9 + lib/hackerlibultra/src/os/seterrorhandler.c | 10 + lib/hackerlibultra/src/os/seteventmesg.c | 39 + lib/hackerlibultra/src/os/setfpccsr.s | 14 + .../src}/os/setglobalintmask.c | 0 .../src}/os/sethwinterrupt.c | 30 +- .../src}/os/setintmask.s | 122 +- lib/hackerlibultra/src/os/setpiinterrupt.c | 16 + lib/{ultra => hackerlibultra/src}/os/setsr.s | 6 +- .../src}/os/setthreadpri.c | 17 +- lib/hackerlibultra/src/os/settime.c | 16 + .../src}/os/settimer.c | 26 +- lib/hackerlibultra/src/os/settlbasid.s | 32 + .../src}/os/setwatchlo.s | 6 +- .../src}/os/startthread.c | 11 +- lib/hackerlibultra/src/os/stopthread.c | 23 + lib/hackerlibultra/src/os/stoptimer.c | 39 + .../src}/os/syncputchars.c | 16 +- lib/hackerlibultra/src/os/testhost.c | 12 + lib/hackerlibultra/src/os/thread.c | 28 + lib/hackerlibultra/src/os/threadasm.h | 68 + .../src}/os/timerintr.c | 66 +- lib/hackerlibultra/src/os/unmaptlb.s | 45 + lib/hackerlibultra/src/os/unmaptlball.s | 26 + .../src}/os/virtualtophysical.c | 6 +- lib/hackerlibultra/src/os/writebackdcache.s | 54 + .../src}/os/writebackdcacheall.s | 6 +- .../src}/os/yieldthread.c | 2 +- lib/hackerlibultra/src/rg/free.c | 37 + lib/hackerlibultra/src/rg/getbufcount.c | 20 + lib/hackerlibultra/src/rg/getsize.c | 21 + lib/hackerlibultra/src/rg/malloc.c | 28 + lib/hackerlibultra/src/rg/printregion.c | 27 + lib/hackerlibultra/src/rg/region.c | 56 + lib/hackerlibultra/src/rmon/rmonbrk.c | 432 ++ lib/hackerlibultra/src/rmon/rmoncmds.c | 54 + lib/hackerlibultra/src/rmon/rmonmain.c | 137 + lib/hackerlibultra/src/rmon/rmonmem.c | 285 ++ lib/hackerlibultra/src/rmon/rmonmisc.c | 75 + lib/hackerlibultra/src/rmon/rmonprint.c | 1 + lib/hackerlibultra/src/rmon/rmonrcp.s | 60 + lib/hackerlibultra/src/rmon/rmonregs.c | 417 ++ lib/hackerlibultra/src/rmon/rmonsio.c | 89 + lib/hackerlibultra/src/rmon/rmontask.c | 345 ++ lib/hackerlibultra/src/sched/Makefile | 19 + lib/hackerlibultra/src/sched/sched.c | 593 +++ lib/hackerlibultra/src/sched/sched_log.fmt | 19 + lib/hackerlibultra/src/sp/Makefile | 30 + lib/hackerlibultra/src/sp/clearattribute.c | 33 + lib/hackerlibultra/src/sp/color.c | 36 + lib/hackerlibultra/src/sp/hide.c | 33 + lib/hackerlibultra/src/sp/setattribute.c | 33 + lib/hackerlibultra/src/sp/show.c | 33 + lib/hackerlibultra/src/sp/sprite.c | 678 +++ lib/hackerlibultra/src/sp/spriteex.c | 2 + lib/hackerlibultra/src/sp/spriteex2.c | 2 + lib/hackerlibultra/src/sp/spscale.c | 40 + .../src/vimodes/vimodefpalhaf1.c | 47 + .../src/vimodes/vimodefpalhan1.c | 47 + .../src/vimodes/vimodefpalhpf1.c | 47 + .../src/vimodes/vimodefpalhpf2.c | 47 + .../src/vimodes/vimodefpalhpn1.c | 47 + .../src/vimodes/vimodefpalhpn2.c | 47 + .../src/vimodes/vimodefpallaf1.c | 47 + .../src/vimodes/vimodefpallaf2.c | 47 + .../src/vimodes/vimodefpallan1.c | 47 + .../src/vimodes/vimodefpallan2.c | 47 + .../src/vimodes/vimodefpallpf1.c | 47 + .../src/vimodes/vimodefpallpf2.c | 47 + .../src/vimodes/vimodefpallpn1.c | 47 + .../src/vimodes/vimodefpallpn2.c | 47 + .../src/vimodes/vimodempalhaf1.c | 47 + .../src/vimodes/vimodempalhan1.c | 47 + .../src/vimodes/vimodempalhpf1.c | 47 + .../src/vimodes/vimodempalhpf2.c | 47 + .../src/vimodes/vimodempalhpn1.c | 47 + .../src/vimodes/vimodempalhpn2.c | 47 + .../src/vimodes/vimodempallaf1.c | 47 + .../src/vimodes/vimodempallaf2.c | 47 + .../src/vimodes/vimodempallan1.c | 47 + .../src/vimodes/vimodempallan2.c | 47 + .../src/vimodes/vimodempallpf1.c | 47 + .../src/vimodes/vimodempallpf2.c | 47 + .../src/vimodes/vimodempallpn1.c | 47 + .../src/vimodes/vimodempallpn2.c | 47 + .../src/vimodes/vimodentschaf1.c | 47 + .../src/vimodes/vimodentschan1.c | 47 + .../src/vimodes/vimodentschpf1.c | 47 + .../src/vimodes/vimodentschpf2.c | 47 + .../src/vimodes/vimodentschpn1.c | 47 + .../src/vimodes/vimodentschpn2.c | 47 + .../src/vimodes/vimodentsclaf1.c | 47 + .../src/vimodes/vimodentsclaf2.c | 47 + .../src/vimodes/vimodentsclan1.c | 47 + .../src/vimodes/vimodentsclan2.c | 47 + .../src/vimodes/vimodentsclpf1.c | 47 + .../src/vimodes/vimodentsclpf2.c | 47 + .../src/vimodes/vimodentsclpn1.c | 47 + .../src/vimodes/vimodentsclpn2.c | 47 + .../src/vimodes/vimodepalhaf1.c | 47 + .../src/vimodes/vimodepalhan1.c | 47 + .../src/vimodes/vimodepalhpf1.c | 47 + .../src/vimodes/vimodepalhpf2.c | 47 + .../src/vimodes/vimodepalhpn1.c | 47 + .../src/vimodes/vimodepalhpn2.c | 47 + .../src/vimodes/vimodepallaf1.c | 47 + .../src/vimodes/vimodepallaf2.c | 47 + .../src/vimodes/vimodepallan1.c | 47 + .../src/vimodes/vimodepallan2.c | 47 + .../src/vimodes/vimodepallpf1.c | 47 + .../src/vimodes/vimodepallpf2.c | 47 + .../src/vimodes/vimodepallpn1.c | 47 + .../src/vimodes/vimodepallpn2.c | 47 + .../src/voice/voicecheckresult.c | 32 + lib/hackerlibultra/src/voice/voicecheckword.c | 88 + .../src/voice/voicecleardictionary.c | 41 + lib/hackerlibultra/src/voice/voicecontread2.c | 80 + .../src/voice/voicecontread36.c | 80 + .../src/voice/voicecontrolgain.c | 35 + .../src/voice/voicecontwrite20.c | 81 + .../src/voice/voicecontwrite4.c | 81 + .../src/voice/voicecountsyllables.c | 59 + lib/hackerlibultra/src/voice/voicecrc.c | 50 + .../src/voice/voicegetreaddata.c | 100 + lib/hackerlibultra/src/voice/voicegetstatus.c | 66 + lib/hackerlibultra/src/voice/voiceinit.c | 49 + lib/hackerlibultra/src/voice/voiceinternal.h | 18 + .../src/voice/voicemaskdictionary.c | 55 + .../src/voice/voicesetadconverter.c | 75 + lib/hackerlibultra/src/voice/voicesetword.c | 61 + .../src/voice/voicestartreaddata.c | 42 + .../src/voice/voicestopreaddata.c | 65 + lib/hackerlibultra/tools/ar.py | 476 ++ .../tools/asm_differ/.gitignore | 2 + .../hackerlibultra/tools/asm_differ}/.gitrepo | 8 +- .../tools/asm_differ/.pre-commit-config.yaml | 6 + .../hackerlibultra/tools/asm_differ}/LICENSE | 0 lib/hackerlibultra/tools/asm_differ/README.md | 56 + .../tools/asm_differ/diff-stylesheet.css | 67 + lib/hackerlibultra/tools/asm_differ/diff.py | 2923 ++++++++++++ .../tools/asm_differ/diff_settings.py | 11 + lib/hackerlibultra/tools/asm_differ/mypy.ini | 17 + .../tools/asm_differ/screenshot.png | Bin 0 -> 99842 bytes lib/hackerlibultra/tools/check_format.py | 82 + lib/hackerlibultra/tools/compile_sjis.py | 25 + lib/hackerlibultra/tools/disassemble_elf.py | 312 ++ lib/hackerlibultra/tools/fix_objfile.py | 68 + lib/hackerlibultra/tools/libdiff.py | 150 + lib/hackerlibultra/tools/libelf.py | 1181 +++++ lib/hackerlibultra/tools/m2ctx.py | 76 + lib/hackerlibultra/tools/mdebug.py | 938 ++++ lib/hackerlibultra/tools/mips_isa.py | 1309 ++++++ lib/hackerlibultra/tools/patch_ar_meta.py | 90 + lib/hackerlibultra/tools/print_mdebug.py | 589 +++ lib/hackerlibultra/tools/set_o32abi_bit.py | 25 + lib/hackerlibultra/tools/shiftjis_conv.py | 58 + lib/hackerlibultra/tools/strip_debug.sh | 10 + lib/hackerlibultra/tools/util.py | 44 + lib/hackerlibultra/util.mk | 16 + lib/src/libgcc/_cmpdi2.c | 2 - lib/src/libgcc/_divdi3.c | 2 - lib/src/libgcc/_fixdfdi.c | 2 - lib/src/libgcc/_fixsfdi.c | 2 - lib/src/libgcc/_fixunsdfdi.c | 2 - lib/src/libgcc/_fixunssfdi.c | 2 - lib/src/libgcc/_floatdidf.c | 2 - lib/src/libgcc/_floatdisf.c | 2 - lib/src/libgcc/_moddi3.c | 2 - lib/src/libgcc/_udivdi3.c | 2 - lib/src/libgcc/_umoddi3.c | 2 - lib/src/libgcc/libgcc2.inc | 4021 ---------------- lib/src/libgcc/longlong.h | 242 - lib/ultra/D.inc | 115 - lib/ultra/F_I.inc | 155 - lib/ultra/K_L.inc | 146 - lib/ultra/audio/bnkf.c | 114 - lib/ultra/bb/os/_getcount.c | 35 - lib/ultra/bb/os/_setcompare.c | 22 - lib/ultra/bb/sk/skapi.s | 44 - lib/ultra/bb/wrapper.c | 20 - lib/ultra/debug/kdebugserver.c | 142 - lib/ultra/gu/mtxutil.c | 90 - lib/ultra/io/aigetlen.c | 5 - lib/ultra/io/aisetfreq.c | 32 - lib/ultra/io/aisetnextbuf.c | 55 - lib/ultra/io/conteeplongread.c | 24 - lib/ultra/io/conteepprobe.c | 65 - lib/ultra/io/conteepread.c | 174 - lib/ultra/io/contreaddata.c | 90 - lib/ultra/io/controller.c | 125 - lib/ultra/io/controller.h | 308 -- lib/ultra/io/crc.c | 111 - lib/ultra/io/devmgr.c | 196 - lib/ultra/io/driverominit.c | 49 - lib/ultra/io/epidma.c | 27 - lib/ultra/io/epirawdma.c | 120 - lib/ultra/io/epirawread.c | 17 - lib/ultra/io/epirawwrite.c | 17 - lib/ultra/io/leointerrupt.c | 279 -- lib/ultra/io/pidma.c | 32 - lib/ultra/io/pigetcmdq.c | 9 - lib/ultra/io/piint.h | 198 - lib/ultra/io/pimgr.c | 67 - lib/ultra/io/pirawdma.c | 22 - lib/ultra/io/pirawread.c | 10 - lib/ultra/io/sirawread.c | 11 - lib/ultra/io/sirawwrite.c | 11 - lib/ultra/io/spgetstat.c | 6 - lib/ultra/io/sprawdma.c | 20 - lib/ultra/io/sptask.c | 65 - lib/ultra/io/vi.c | 77 - lib/ultra/io/vigetcurrcontext.c | 5 - lib/ultra/io/vimgr.c | 118 - lib/ultra/io/visetevent.c | 10 - lib/ultra/io/visetmode.c | 20 - lib/ultra/io/visetspecial.c | 44 - lib/ultra/io/viswapbuf.c | 9 - lib/ultra/io/vitbl.c | 1750 ------- lib/ultra/ld.inc | 9 - lib/ultra/libc/bcopy.s | 219 - lib/ultra/libc/bzero.s | 55 - lib/ultra/libc/sprintf.c | 22 - lib/ultra/libc/string.c | 55 - lib/ultra/libc/syncprintf.c | 21 - lib/ultra/libc/xlitob.c | 59 - lib/ultra/libc/xprintf.c | 247 - lib/ultra/mgu/mtxf2l.s | 80 - lib/ultra/mgu/normalize.s | 60 - lib/ultra/mgu/scale.s | 74 - lib/ultra/mgu/translate.s | 93 - lib/ultra/os/createmesgqueue.c | 11 - lib/ultra/os/createthread.c | 30 - lib/ultra/os/exceptasm.s | 943 ---- lib/ultra/os/getcurrfaultthread.c | 6 - lib/ultra/os/gettime.c | 16 - lib/ultra/os/initialize.c | 203 - lib/ultra/os/interrupt.s | 50 - lib/ultra/os/invaldcache.s | 55 - lib/ultra/os/invalicache.s | 41 - lib/ultra/os/maptlb.s | 58 - lib/ultra/os/maptlbrdb.s | 30 - lib/ultra/os/osint.h | 50 - lib/ultra/os/parameters.s | 51 - lib/ultra/os/probetlb.s | 54 - lib/ultra/os/seteventmesg.c | 31 - lib/ultra/os/setfpccsr.s | 11 - lib/ultra/os/settime.c | 6 - lib/ultra/os/thread.c | 25 - lib/ultra/os/threadasm.h | 68 - lib/ultra/os/unmaptlball.s | 35 - lib/ultra/os/writebackdcache.s | 34 - lib/ultra/vimodes/vimodempallan1.c | 34 - lib/ultra/vimodes/vimodentsclan1.c | 34 - lib/ultra/vimodes/vimodepallan1.c | 34 - libultra.mk | 175 - sm64.ld | 548 +-- src/audio/external.c | 3 - src/game/crash_screen.c | 40 +- src/game/libgcc.c | 266 ++ src/game/main.c | 6 +- src/game/memory.c | 4 +- .../crash_screen/crash_screen_font.ia1.png | Bin 0 -> 739 bytes tools/Makefile | 10 +- tools/armips.cpp | 2 +- tools/asm-processor/.gitignore | 2 - tools/asm-processor/README.md | 112 - tools/asm-processor/add-test.sh | 5 - tools/asm-processor/asm_processor.py | 1472 ------ tools/asm-processor/build.py | 114 - tools/asm-processor/compile-test.sh | 26 - tools/asm-processor/prelude.inc | 43 - tools/asm-processor/run-tests.sh | 6 - tools/asm-processor/tests/ascii.c | 19 - tools/asm-processor/tests/ascii.objdump | 29 - tools/asm-processor/tests/comments.c | 6 - tools/asm-processor/tests/comments.objdump | 21 - tools/asm-processor/tests/force.c | 17 - tools/asm-processor/tests/force.objdump | 47 - tools/asm-processor/tests/kpic-o1.c | 93 - tools/asm-processor/tests/kpic-o1.objdump | 46 - tools/asm-processor/tests/kpic-o2.c | 92 - tools/asm-processor/tests/kpic-o2.objdump | 46 - tools/asm-processor/tests/label-sameline.c | 7 - .../tests/label-sameline.objdump | 25 - tools/asm-processor/tests/large.c | 164 - tools/asm-processor/tests/large.objdump | 58 - tools/asm-processor/tests/late_rodata_align.c | 80 - .../tests/late_rodata_align.objdump | 51 - .../asm-processor/tests/late_rodata_doubles.c | 83 - .../tests/late_rodata_doubles.objdump | 55 - .../tests/late_rodata_doubles_mips1.c | 86 - .../tests/late_rodata_doubles_mips1.objdump | 52 - tools/asm-processor/tests/late_rodata_jtbl.c | 153 - .../tests/late_rodata_jtbl.objdump | 110 - .../tests/late_rodata_jtbl_mips1.c | 155 - .../tests/late_rodata_jtbl_mips1.objdump | 110 - .../tests/late_rodata_misaligned_doubles.c | 77 - .../late_rodata_misaligned_doubles.objdump | 56 - .../tests/line-continuation-separate-file.s | 4 - .../tests/line-continuation.asmproc.d | 3 - tools/asm-processor/tests/line-continuation.c | 22 - .../tests/line-continuation.objdump | 30 - tools/asm-processor/tests/o0.c | 28 - tools/asm-processor/tests/o0.objdump | 44 - tools/asm-processor/tests/o2.c | 26 - tools/asm-processor/tests/o2.objdump | 40 - tools/asm-processor/tests/pascal.objdump | 137 - tools/asm-processor/tests/pascal.p | 95 - tools/asm-processor/tests/static-global.c | 33 - .../asm-processor/tests/static-global.objdump | 58 - tools/asm-processor/tests/static.c | 32 - tools/asm-processor/tests/static.objdump | 58 - tools/asm-processor/tests/test1.c | 71 - tools/asm-processor/tests/test1.objdump | 54 - tools/asm-processor/tests/test2.c | 69 - tools/asm-processor/tests/test2.objdump | 76 - tools/asm-processor/tests/test3.c | 70 - tools/asm-processor/tests/test3.objdump | 64 - tools/egcs/as | Bin 1148960 -> 0 bytes tools/egcs/cc1 | Bin 3366916 -> 0 bytes tools/egcs/cpp | Bin 1015916 -> 0 bytes tools/egcs/gcc | Bin 840332 -> 0 bytes tools/ido-static-recomp/.gitignore | 10 - tools/ido-static-recomp/DOCS.md | 19 - tools/ido-static-recomp/Makefile | 231 - tools/ido-static-recomp/README.md | 66 - tools/ido-static-recomp/elf.h | 99 - tools/ido-static-recomp/header.h | 24 - tools/ido-static-recomp/helpers.h | 15 - tools/ido-static-recomp/libc_impl.c | 2971 ------------ tools/ido-static-recomp/libc_impl.h | 182 - tools/ido-static-recomp/recomp.cpp | 3813 ---------------- .../tools/rabbitizer/.clang-format | 23 - .../tools/rabbitizer/.clang-tidy | 9 - .../tools/rabbitizer/.gitattributes | 2 - .../tools/rabbitizer/.github/workflows/ci.yml | 54 - .../rabbitizer/.github/workflows/make.yml | 14 - .../tools/rabbitizer/.gitignore | 215 - .../tools/rabbitizer/LICENSE | 21 - .../tools/rabbitizer/MANIFEST.in | 6 - .../tools/rabbitizer/Makefile | 140 - .../tools/rabbitizer/README.md | 55 - .../include/analysis/LoPairingInfo.hpp | 36 - .../include/analysis/RegistersTracker.hpp | 49 - .../include/instructions/InstrId.hpp | 38 - .../include/instructions/InstructionBase.hpp | 253 - .../include/instructions/InstructionCpu.hpp | 20 - .../include/instructions/InstructionR5900.hpp | 41 - .../include/instructions/InstructionRsp.hpp | 40 - .../include/instructions/OperandType.hpp | 27 - .../include/instructions/Registers.hpp | 94 - .../cplusplus/include/rabbitizer.hpp | 26 - .../cplusplus/src/analysis/LoPairingInfo.cpp | 34 - .../src/analysis/RegistersTracker.cpp | 64 - .../cplusplus/src/instructions/InstrId.cpp | 14 - .../src/instructions/InstructionBase.cpp | 1036 ----- .../src/instructions/InstructionCpu.cpp | 15 - .../src/instructions/InstructionR5900.cpp | 118 - .../src/instructions/InstructionRsp.cpp | 128 - .../analysis/RabbitizerLoPairingInfo.h | 34 - .../analysis/RabbitizerRegistersTracker.h | 65 - .../analysis/RabbitizerTrackedRegisterState.h | 80 - .../tools/rabbitizer/include/common/Abi.inc | 7 - .../include/common/RabbitizerConfig.h | 83 - .../include/common/RabbitizerVersion.h | 33 - .../tools/rabbitizer/include/common/Utils.h | 116 - .../include/instructions/InstrCategory.inc | 6 - .../instructions/RabbitizerInstrDescriptor.h | 141 - .../include/instructions/RabbitizerInstrId.h | 46 - .../instructions/RabbitizerInstrSuffix.h | 36 - .../instructions/RabbitizerInstruction.h | 263 -- .../instructions/RabbitizerInstructionR5900.h | 87 - .../instructions/RabbitizerInstructionRsp.h | 70 - .../instructions/RabbitizerOperandType.h | 33 - .../include/instructions/RabbitizerRegister.h | 143 - .../instr_id/RabbitizerInstrId_cpu.inc | 40 - .../instr_id/RabbitizerInstrId_r5900.inc | 46 - .../instr_id/RabbitizerInstrId_rsp.inc | 41 - .../instructions/instr_id/cpu/cpu_cop0.inc | 10 - .../instr_id/cpu/cpu_cop0_bc0.inc | 8 - .../instr_id/cpu/cpu_cop0_tlb.inc | 12 - .../instructions/instr_id/cpu/cpu_cop1.inc | 12 - .../instr_id/cpu/cpu_cop1_bc1.inc | 8 - .../instr_id/cpu/cpu_cop1_fpu_d.inc | 48 - .../instr_id/cpu/cpu_cop1_fpu_l.inc | 6 - .../instr_id/cpu/cpu_cop1_fpu_s.inc | 48 - .../instr_id/cpu/cpu_cop1_fpu_w.inc | 6 - .../instructions/instr_id/cpu/cpu_normal.inc | 83 - .../instructions/instr_id/cpu/cpu_regimm.inc | 25 - .../instructions/instr_id/cpu/cpu_special.inc | 93 - .../instr_id/r5900/r5900_cop0_tlb.inc | 23 - .../instr_id/r5900/r5900_cop1_fpu_s.inc | 46 - .../instr_id/r5900/r5900_cop2.inc | 21 - .../instr_id/r5900/r5900_cop2_bc2.inc | 21 - .../instr_id/r5900/r5900_cop2_special1.inc | 82 - .../instr_id/r5900/r5900_cop2_special2.inc | 125 - .../instructions/instr_id/r5900/r5900_mmi.inc | 49 - .../instr_id/r5900/r5900_mmi_0.inc | 50 - .../instr_id/r5900/r5900_mmi_1.inc | 43 - .../instr_id/r5900/r5900_mmi_2.inc | 48 - .../instr_id/r5900/r5900_mmi_3.inc | 37 - .../instr_id/r5900/r5900_normal.inc | 31 - .../instr_id/r5900/r5900_regimm.inc | 20 - .../instr_id/r5900/r5900_special.inc | 27 - .../instructions/instr_id/rsp/rsp_cop0.inc | 6 - .../instructions/instr_id/rsp/rsp_cop2.inc | 10 - .../instructions/instr_id/rsp/rsp_cop2_vu.inc | 53 - .../instructions/instr_id/rsp/rsp_normal.inc | 53 - .../instr_id/rsp/rsp_normal_lwc2.inc | 15 - .../instr_id/rsp/rsp_normal_swc2.inc | 17 - .../instructions/instr_id/rsp/rsp_regimm.inc | 14 - .../instructions/instr_id/rsp/rsp_special.inc | 49 - .../operands/RabbitizerOperandType_cpu.inc | 25 - .../operands/RabbitizerOperandType_r5900.inc | 33 - .../operands/RabbitizerOperandType_rsp.inc | 24 - .../registers/RabbitizerRegister_Cop0.inc | 35 - .../RabbitizerRegister_Cop1Control.inc | 35 - .../registers/RabbitizerRegister_Cop1N32.inc | 35 - .../registers/RabbitizerRegister_Cop1N64.inc | 35 - .../registers/RabbitizerRegister_Cop1O32.inc | 35 - .../registers/RabbitizerRegister_Cop2.inc | 35 - .../registers/RabbitizerRegister_GprN32.inc | 35 - .../registers/RabbitizerRegister_GprO32.inc | 35 - .../registers/RabbitizerRegister_R5900VF.inc | 35 - .../registers/RabbitizerRegister_R5900VI.inc | 35 - .../registers/RabbitizerRegister_RspCop0.inc | 19 - .../registers/RabbitizerRegister_RspCop2.inc | 35 - .../RabbitizerRegister_RspCop2Control.inc | 35 - .../registers/RabbitizerRegister_RspGpr.inc | 35 - .../RabbitizerRegister_RspVector.inc | 35 - .../tools/rabbitizer/include/rabbitizer.h | 25 - .../tools/rabbitizer/pyproject.toml | 9 - .../tools/rabbitizer/r5900test.c | 47 - .../tools/rabbitizer/rabbitizer/Config.pyi | 46 - .../tools/rabbitizer/rabbitizer/Enum.pyi | 24 - .../rabbitizer/rabbitizer/InstrCategory.pyi | 15 - .../tools/rabbitizer/rabbitizer/InstrId.pyi | 631 --- .../rabbitizer/rabbitizer/LoPairingInfo.pyi | 16 - .../tools/rabbitizer/rabbitizer/RegGprN32.pyi | 43 - .../tools/rabbitizer/rabbitizer/RegGprO32.pyi | 43 - .../rabbitizer/RegistersTracker.pyi | 28 - .../rabbitizer/TrackedRegisterState.pyi | 24 - .../tools/rabbitizer/rabbitizer/Utils.pyi | 14 - .../tools/rabbitizer/rabbitizer/__init__.pyi | 21 - .../rabbitizer/rabbitizer/enums/enums_utils.c | 38 - .../rabbitizer/rabbitizer/enums/enums_utils.h | 85 - .../rabbitizer/enums/rabbitizer_enum_Abi.c | 48 - .../enums/rabbitizer_enum_InstrCategory.c | 23 - .../enums/rabbitizer_enum_InstrId.c | 29 - .../rabbitizer/enums/rabbitizer_type_Enum.c | 211 - .../enums/registers/rabbitizer_enum_GprN32.c | 28 - .../enums/registers/rabbitizer_enum_GprO32.c | 28 - .../rabbitizer/rabbitizer/rabbitizer.pyi | 99 - .../rabbitizer/rabbitizer_global_config.c | 165 - .../rabbitizer/rabbitizer/rabbitizer_module.c | 142 - .../rabbitizer/rabbitizer/rabbitizer_module.h | 54 - .../rabbitizer/rabbitizer_submodule_Utils.c | 81 - .../rabbitizer/rabbitizer_type_Instruction.c | 436 -- .../rabbitizer_type_LoPairingInfo.c | 50 - .../rabbitizer_type_RegistersTracker.c | 320 -- .../rabbitizer_type_TrackedRegisterState.c | 102 - .../tools/rabbitizer/registersTrackerTest.c | 41 - .../tools/rabbitizer/rsptest.c | 44 - .../tools/rabbitizer/setup.cfg | 24 - .../tools/rabbitizer/setup.py | 28 - .../src/analysis/RabbitizerLoPairingInfo.c | 14 - .../src/analysis/RabbitizerRegistersTracker.c | 425 -- .../analysis/RabbitizerTrackedRegisterState.c | 142 - .../rabbitizer/src/common/RabbitizerConfig.c | 50 - .../rabbitizer/src/common/RabbitizerVersion.c | 10 - .../tools/rabbitizer/src/common/Utils.c | 78 - .../instructions/RabbitizerInstrDescriptor.c | 104 - .../src/instructions/RabbitizerInstrId.c | 28 - .../src/instructions/RabbitizerInstrSuffix.c | 62 - .../RabbitizerInstruction.c | 368 -- .../RabbitizerInstruction_Disassemble.c | 986 ---- .../RabbitizerInstruction_Examination.c | 840 ---- .../RabbitizerInstruction_ProcessUniqueId.c | 319 -- .../RabbitizerInstructionR5900.c | 17 - ...bbitizerInstructionR5900_ProcessUniqueId.c | 328 -- .../RabbitizerInstructionRsp.c | 56 - ...RabbitizerInstructionRsp_ProcessUniqueId.c | 233 - .../src/instructions/RabbitizerRegister.c | 181 - .../ido-static-recomp/tools/rabbitizer/test.c | 40 - .../tools/rabbitizer/tests/cplusplus/test.cpp | 16 - tools/ido5.3_compiler/LICENSE.md | 18 - tools/ido5.3_compiler/lib/libmalloc.so | Bin 28216 -> 0 bytes tools/ido5.3_compiler/lib/libmalloc_old.so | Bin 28216 -> 0 bytes tools/ido5.3_compiler/lib/rld | Bin 585876 -> 0 bytes tools/ido5.3_compiler/usr/bin/cc | Bin 275168 -> 0 bytes tools/ido5.3_compiler/usr/lib/acpp | Bin 93440 -> 0 bytes tools/ido5.3_compiler/usr/lib/as0 | Bin 175296 -> 0 bytes tools/ido5.3_compiler/usr/lib/as1 | Bin 816064 -> 0 bytes tools/ido5.3_compiler/usr/lib/cfe | Bin 902800 -> 0 bytes tools/ido5.3_compiler/usr/lib/copt | Bin 3597360 -> 0 bytes tools/ido5.3_compiler/usr/lib/crt1.o | Bin 3612 -> 0 bytes tools/ido5.3_compiler/usr/lib/err.english.cc | 1260 ----- tools/ido5.3_compiler/usr/lib/libc.so.1 | Bin 1483100 -> 0 bytes tools/ido5.3_compiler/usr/lib/libexc.so | Bin 29352 -> 0 bytes tools/ido5.3_compiler/usr/lib/libgen.so | Bin 69944 -> 0 bytes tools/ido5.3_compiler/usr/lib/libm.so | Bin 111272 -> 0 bytes tools/ido5.3_compiler/usr/lib/ugen | Bin 547616 -> 0 bytes tools/ido5.3_compiler/usr/lib/ujoin | Bin 101832 -> 0 bytes tools/ido5.3_compiler/usr/lib/uld | Bin 799088 -> 0 bytes tools/ido5.3_compiler/usr/lib/umerge | Bin 167408 -> 0 bytes tools/ido5.3_compiler/usr/lib/uopt | Bin 756800 -> 0 bytes tools/ido5.3_compiler/usr/lib/usplit | Bin 71408 -> 0 bytes tools/ld/libbfd-2.30.so | Bin 6351544 -> 0 bytes tools/ld/mips64-elf-ld | Bin 2030440 -> 0 bytes tools/patch_elf_32bit.c | 293 +- 1046 files changed, 71764 insertions(+), 40860 deletions(-) create mode 100644 compile_flags.txt create mode 100644 include/ld.h rename {tools/ido-static-recomp => lib/hackerlibultra}/.clang-format (64%) create mode 100644 lib/hackerlibultra/.github/workflows/ci_gcc.yml create mode 100644 lib/hackerlibultra/.gitignore create mode 100644 lib/hackerlibultra/.gitrepo create mode 100644 lib/hackerlibultra/CODEOWNERS create mode 100644 lib/hackerlibultra/Makefile create mode 100644 lib/hackerlibultra/README.md create mode 100644 lib/hackerlibultra/base/I/libgultra.txt create mode 100644 lib/hackerlibultra/base/I/libgultra_d.txt create mode 100644 lib/hackerlibultra/base/I/libgultra_rom.txt create mode 100644 lib/hackerlibultra/base/I/libultra.txt create mode 100644 lib/hackerlibultra/base/I/libultra_d.txt create mode 100644 lib/hackerlibultra/base/I/libultra_rom.txt create mode 100644 lib/hackerlibultra/base/J/libgultra.txt create mode 100644 lib/hackerlibultra/base/J/libgultra_d.txt create mode 100644 lib/hackerlibultra/base/J/libgultra_rom.txt create mode 100644 lib/hackerlibultra/base/J/libultra.txt create mode 100644 lib/hackerlibultra/base/J/libultra_d.txt create mode 100644 lib/hackerlibultra/base/J/libultra_rom.txt create mode 100644 lib/hackerlibultra/base/K/libgultra.txt create mode 100644 lib/hackerlibultra/base/K/libgultra_d.txt create mode 100644 lib/hackerlibultra/base/K/libgultra_rom.txt create mode 100644 lib/hackerlibultra/base/K/libultra.txt create mode 100644 lib/hackerlibultra/base/K/libultra_d.txt create mode 100644 lib/hackerlibultra/base/K/libultra_rom.txt create mode 100644 lib/hackerlibultra/base/L/libgultra.txt create mode 100644 lib/hackerlibultra/base/L/libgultra_d.txt create mode 100644 lib/hackerlibultra/base/L/libgultra_rom.txt create mode 100644 lib/hackerlibultra/base/L/libultra.txt create mode 100644 lib/hackerlibultra/base/L/libultra_d.txt create mode 100644 lib/hackerlibultra/base/L/libultra_rom.txt create mode 100644 lib/hackerlibultra/format.py create mode 100644 lib/hackerlibultra/include/PR/R4300.h create mode 100644 lib/hackerlibultra/include/PR/abi.h create mode 100644 lib/hackerlibultra/include/PR/gbi.h create mode 100644 lib/hackerlibultra/include/PR/gs2dex.h create mode 100644 lib/hackerlibultra/include/PR/gt.h create mode 100644 lib/hackerlibultra/include/PR/gu.h create mode 100644 lib/hackerlibultra/include/PR/libaudio.h create mode 100644 lib/hackerlibultra/include/PR/mbi.h create mode 100644 lib/hackerlibultra/include/PR/os.h create mode 100644 lib/hackerlibultra/include/PR/os_ai.h create mode 100644 lib/hackerlibultra/include/PR/os_cache.h create mode 100644 lib/hackerlibultra/include/PR/os_cont.h create mode 100644 lib/hackerlibultra/include/PR/os_convert.h create mode 100644 lib/hackerlibultra/include/PR/os_debug.h create mode 100644 lib/hackerlibultra/include/PR/os_eeprom.h create mode 100644 lib/hackerlibultra/include/PR/os_error.h create mode 100644 lib/hackerlibultra/include/PR/os_exception.h create mode 100644 lib/hackerlibultra/include/PR/os_flash.h create mode 100644 lib/hackerlibultra/include/PR/os_gbpak.h create mode 100644 lib/hackerlibultra/include/PR/os_gio.h create mode 100644 lib/hackerlibultra/include/PR/os_host.h create mode 100644 lib/hackerlibultra/include/PR/os_internal.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_debug.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_error.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_exception.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_flash.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_gio.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_host.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_reg.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_rsp.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_si.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_thread.h create mode 100644 lib/hackerlibultra/include/PR/os_internal_tlb.h create mode 100644 lib/hackerlibultra/include/PR/os_libc.h create mode 100644 lib/hackerlibultra/include/PR/os_message.h create mode 100644 lib/hackerlibultra/include/PR/os_motor.h create mode 100644 lib/hackerlibultra/include/PR/os_pfs.h create mode 100644 lib/hackerlibultra/include/PR/os_pi.h create mode 100644 lib/hackerlibultra/include/PR/os_rdp.h create mode 100644 lib/hackerlibultra/include/PR/os_reg.h create mode 100644 lib/hackerlibultra/include/PR/os_rsp.h create mode 100644 lib/hackerlibultra/include/PR/os_si.h create mode 100644 lib/hackerlibultra/include/PR/os_system.h create mode 100644 lib/hackerlibultra/include/PR/os_thread.h create mode 100644 lib/hackerlibultra/include/PR/os_time.h create mode 100644 lib/hackerlibultra/include/PR/os_tlb.h create mode 100644 lib/hackerlibultra/include/PR/os_version.h create mode 100644 lib/hackerlibultra/include/PR/os_vi.h create mode 100644 lib/hackerlibultra/include/PR/os_voice.h create mode 100644 lib/hackerlibultra/include/PR/ramrom.h create mode 100644 lib/hackerlibultra/include/PR/rcp.h create mode 100644 lib/hackerlibultra/include/PR/rdb.h create mode 100644 lib/hackerlibultra/include/PR/region.h create mode 100644 lib/hackerlibultra/include/PR/rmon.h create mode 100644 lib/hackerlibultra/include/PR/sched.h create mode 100644 lib/hackerlibultra/include/PR/sp.h create mode 100644 lib/hackerlibultra/include/PR/sptask.h create mode 100644 lib/hackerlibultra/include/PR/ucode.h create mode 100644 lib/hackerlibultra/include/PR/ultraerror.h create mode 100644 lib/hackerlibultra/include/PR/ultralog.h create mode 100644 lib/hackerlibultra/include/PR/ultratypes.h create mode 100644 lib/hackerlibultra/include/PRinternal/controller.h create mode 100644 lib/hackerlibultra/include/PRinternal/controller_gbpak.h create mode 100644 lib/hackerlibultra/include/PRinternal/controller_voice.h create mode 100644 lib/hackerlibultra/include/PRinternal/dbgdefs.h create mode 100644 lib/hackerlibultra/include/PRinternal/dbgproto.h create mode 100644 lib/hackerlibultra/include/PRinternal/macros.h create mode 100644 lib/hackerlibultra/include/PRinternal/osint.h create mode 100644 lib/hackerlibultra/include/PRinternal/piint.h create mode 100644 lib/hackerlibultra/include/PRinternal/rmonint.h create mode 100644 lib/hackerlibultra/include/PRinternal/siint.h create mode 100644 lib/hackerlibultra/include/PRinternal/viint.h create mode 100644 lib/hackerlibultra/include/asm.h create mode 100644 lib/hackerlibultra/include/assert.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/math.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/memory.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/sgidefs.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/stdarg.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/stdio.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/stdlib.h create mode 100644 lib/hackerlibultra/include/compiler/gcc/string.h create mode 100644 lib/hackerlibultra/include/compiler/ido/math.h create mode 100644 lib/hackerlibultra/include/compiler/ido/memory.h create mode 100644 lib/hackerlibultra/include/compiler/ido/stdarg.h create mode 100644 lib/hackerlibultra/include/compiler/ido/stdio.h create mode 100644 lib/hackerlibultra/include/compiler/ido/stdlib.h create mode 100644 lib/hackerlibultra/include/compiler/ido/string.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/math.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/memory.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/sgidefs.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/stdarg.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/stdio.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/stdlib.h create mode 100644 lib/hackerlibultra/include/compiler/modern_gcc/string.h rename tools/ido-static-recomp/tools/rabbitizer/rabbitizer/py.typed => lib/hackerlibultra/include/fpregdef.h (100%) create mode 100644 lib/hackerlibultra/include/regdef.h create mode 100644 lib/hackerlibultra/include/sgidefs.h create mode 100644 lib/hackerlibultra/include/sys/asm.h create mode 100644 lib/hackerlibultra/include/sys/fpregdef.h create mode 100644 lib/hackerlibultra/include/sys/regdef.h create mode 100644 lib/hackerlibultra/include/ultra64.h create mode 100644 lib/hackerlibultra/include/ultrahost.h create mode 100644 lib/hackerlibultra/src/audio/Makefile create mode 100644 lib/hackerlibultra/src/audio/auxbus.c create mode 100644 lib/hackerlibultra/src/audio/bnkf.c create mode 100644 lib/hackerlibultra/src/audio/cents2ratio.c create mode 100644 lib/hackerlibultra/src/audio/copy.c create mode 100644 lib/hackerlibultra/src/audio/cseq.c create mode 100644 lib/hackerlibultra/src/audio/cseq.h create mode 100644 lib/hackerlibultra/src/audio/cseqp.h create mode 100644 lib/hackerlibultra/src/audio/cspdelete.c create mode 100644 lib/hackerlibultra/src/audio/cspgetchlvol.c create mode 100644 lib/hackerlibultra/src/audio/cspgetfxmix.c create mode 100644 lib/hackerlibultra/src/audio/cspgetpan.c create mode 100644 lib/hackerlibultra/src/audio/cspgetpriority.c create mode 100644 lib/hackerlibultra/src/audio/cspgetprogram.c create mode 100644 lib/hackerlibultra/src/audio/cspgetseq.c create mode 100644 lib/hackerlibultra/src/audio/cspgetstate.c create mode 100644 lib/hackerlibultra/src/audio/cspgettempo.c create mode 100644 lib/hackerlibultra/src/audio/cspgetvol.c create mode 100644 lib/hackerlibultra/src/audio/csplayer.c create mode 100644 lib/hackerlibultra/src/audio/cspplay.c create mode 100644 lib/hackerlibultra/src/audio/cspsendmidi.c create mode 100644 lib/hackerlibultra/src/audio/cspsetbank.c create mode 100644 lib/hackerlibultra/src/audio/cspsetchlvol.c create mode 100644 lib/hackerlibultra/src/audio/cspsetfxmix.c create mode 100644 lib/hackerlibultra/src/audio/cspsetpan.c create mode 100644 lib/hackerlibultra/src/audio/cspsetpriority.c create mode 100644 lib/hackerlibultra/src/audio/cspsetprogram.c create mode 100644 lib/hackerlibultra/src/audio/cspsetseq.c create mode 100644 lib/hackerlibultra/src/audio/cspsettempo.c create mode 100644 lib/hackerlibultra/src/audio/cspsetvol.c create mode 100644 lib/hackerlibultra/src/audio/cspstop.c create mode 100644 lib/hackerlibultra/src/audio/drvrnew.c create mode 100644 lib/hackerlibultra/src/audio/env.c create mode 100644 lib/hackerlibultra/src/audio/event.c create mode 100644 lib/hackerlibultra/src/audio/filter.c create mode 100644 lib/hackerlibultra/src/audio/heapalloc.c create mode 100644 lib/hackerlibultra/src/audio/heapcheck.c create mode 100644 lib/hackerlibultra/src/audio/heapinit.c create mode 100644 lib/hackerlibultra/src/audio/initfx.h create mode 100644 lib/hackerlibultra/src/audio/load.c create mode 100644 lib/hackerlibultra/src/audio/mainbus.c create mode 100644 lib/hackerlibultra/src/audio/parse_abi.c create mode 100644 lib/hackerlibultra/src/audio/resample.c create mode 100644 lib/hackerlibultra/src/audio/reverb.c create mode 100644 lib/hackerlibultra/src/audio/save.c create mode 100644 lib/hackerlibultra/src/audio/seq.c create mode 100644 lib/hackerlibultra/src/audio/seq.h create mode 100644 lib/hackerlibultra/src/audio/seqp.h create mode 100644 lib/hackerlibultra/src/audio/seqpdelete.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetchlvol.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetfxmix.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetpan.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetpriority.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetprogram.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetseq.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetstate.c create mode 100644 lib/hackerlibultra/src/audio/seqpgettempo.c create mode 100644 lib/hackerlibultra/src/audio/seqpgetvol.c create mode 100644 lib/hackerlibultra/src/audio/seqplayer.c create mode 100644 lib/hackerlibultra/src/audio/seqploop.c create mode 100644 lib/hackerlibultra/src/audio/seqpplay.c create mode 100644 lib/hackerlibultra/src/audio/seqpsendmidi.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetbank.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetchlvol.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetfxmix.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetpan.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetpriority.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetprogram.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetseq.c create mode 100644 lib/hackerlibultra/src/audio/seqpsettempo.c create mode 100644 lib/hackerlibultra/src/audio/seqpsetvol.c create mode 100644 lib/hackerlibultra/src/audio/seqpstop.c create mode 100644 lib/hackerlibultra/src/audio/sl.c create mode 100644 lib/hackerlibultra/src/audio/sndp.h create mode 100644 lib/hackerlibultra/src/audio/sndpallocate.c create mode 100644 lib/hackerlibultra/src/audio/sndpdeallocate.c create mode 100644 lib/hackerlibultra/src/audio/sndpdelete.c create mode 100644 lib/hackerlibultra/src/audio/sndpgetsound.c create mode 100644 lib/hackerlibultra/src/audio/sndpgetstate.c create mode 100644 lib/hackerlibultra/src/audio/sndplayer.c create mode 100644 lib/hackerlibultra/src/audio/sndpplay.c create mode 100644 lib/hackerlibultra/src/audio/sndpplayat.c create mode 100644 lib/hackerlibultra/src/audio/sndpsetfxmix.c create mode 100644 lib/hackerlibultra/src/audio/sndpsetpan.c create mode 100644 lib/hackerlibultra/src/audio/sndpsetpitch.c create mode 100644 lib/hackerlibultra/src/audio/sndpsetpriority.c create mode 100644 lib/hackerlibultra/src/audio/sndpsetsound.c create mode 100644 lib/hackerlibultra/src/audio/sndpsetvol.c create mode 100644 lib/hackerlibultra/src/audio/sndpstop.c create mode 100644 lib/hackerlibultra/src/audio/synaddplayer.c create mode 100644 lib/hackerlibultra/src/audio/synallocfx.c create mode 100644 lib/hackerlibultra/src/audio/synallocvoice.c create mode 100644 lib/hackerlibultra/src/audio/syndelete.c create mode 100644 lib/hackerlibultra/src/audio/synfreefx.c create mode 100644 lib/hackerlibultra/src/audio/synfreevoice.c create mode 100644 lib/hackerlibultra/src/audio/syngetfxref.c create mode 100644 lib/hackerlibultra/src/audio/syngetpriority.c create mode 100644 lib/hackerlibultra/src/audio/synremoveplayer.c create mode 100644 lib/hackerlibultra/src/audio/synsetfxmix.c create mode 100644 lib/hackerlibultra/src/audio/synsetfxparam.c create mode 100644 lib/hackerlibultra/src/audio/synsetpan.c create mode 100644 lib/hackerlibultra/src/audio/synsetpitch.c create mode 100644 lib/hackerlibultra/src/audio/synsetpriority.c create mode 100644 lib/hackerlibultra/src/audio/synsetvol.c create mode 100644 lib/hackerlibultra/src/audio/synstartvoice.c create mode 100644 lib/hackerlibultra/src/audio/synstartvoiceparam.c create mode 100644 lib/hackerlibultra/src/audio/synstopvoice.c create mode 100644 lib/hackerlibultra/src/audio/synthInternals.h create mode 100644 lib/hackerlibultra/src/audio/synthesizer.c create mode 100644 lib/hackerlibultra/src/debug/assert.c create mode 100644 lib/hackerlibultra/src/debug/assertbreak.s rename lib/{ultra/os => hackerlibultra/src/debug}/atomic.c (69%) create mode 100644 lib/hackerlibultra/src/debug/kdebugserver.c create mode 100644 lib/hackerlibultra/src/debug/osint_debug.h create mode 100644 lib/hackerlibultra/src/debug/profile.c create mode 100644 lib/hackerlibultra/src/debug/threadprofile.c create mode 100644 lib/hackerlibultra/src/debug/threadprofileclear.c create mode 100644 lib/hackerlibultra/src/debug/threadprofileinit.c create mode 100644 lib/hackerlibultra/src/debug/threadprofilereadcount.c create mode 100644 lib/hackerlibultra/src/debug/threadprofilereadtime.c create mode 100644 lib/hackerlibultra/src/debug/threadprofilestart.c create mode 100644 lib/hackerlibultra/src/debug/threadprofilestop.c create mode 100644 lib/hackerlibultra/src/error/commonerror.c create mode 100644 lib/hackerlibultra/src/error/error.c create mode 100644 lib/hackerlibultra/src/error/errorasm.s create mode 100644 lib/hackerlibultra/src/error/kmcprintf.c create mode 100644 lib/hackerlibultra/src/flash/flashallerase.c create mode 100644 lib/hackerlibultra/src/flash/flashallerasethrough.c create mode 100644 lib/hackerlibultra/src/flash/flashchange.c create mode 100644 lib/hackerlibultra/src/flash/flashcheckeraseend.c create mode 100644 lib/hackerlibultra/src/flash/flashclearstatus.c create mode 100644 lib/hackerlibultra/src/flash/flashgetaddr.c create mode 100644 lib/hackerlibultra/src/flash/flashinit.c create mode 100644 lib/hackerlibultra/src/flash/flashreadarray.c create mode 100644 lib/hackerlibultra/src/flash/flashreadid.c create mode 100644 lib/hackerlibultra/src/flash/flashreadstatus.c create mode 100644 lib/hackerlibultra/src/flash/flashreinit.c create mode 100644 lib/hackerlibultra/src/flash/flashsectorerase.c create mode 100644 lib/hackerlibultra/src/flash/flashsectorerasethrough.c create mode 100644 lib/hackerlibultra/src/flash/flashwritearray.c create mode 100644 lib/hackerlibultra/src/flash/flashwritebuffer.c create mode 100644 lib/hackerlibultra/src/gio/giointerrupt.c create mode 100644 lib/hackerlibultra/src/gio/giorawinterrupt.c create mode 100644 lib/hackerlibultra/src/gt/Makefile create mode 100644 lib/hackerlibultra/src/gt/dumpturbo.c create mode 100644 lib/hackerlibultra/src/gt/gt.c create mode 100644 lib/hackerlibultra/src/gt/gtint.h create mode 100644 lib/hackerlibultra/src/gu/Makefile create mode 100644 lib/hackerlibultra/src/gu/align.c rename lib/{ultra => hackerlibultra/src}/gu/cosf.c (55%) create mode 100644 lib/hackerlibultra/src/gu/coss.c create mode 100644 lib/hackerlibultra/src/gu/dump_gbi.c create mode 100644 lib/hackerlibultra/src/gu/frustum.c rename lib/{ultra => hackerlibultra/src}/gu/guint.h (53%) create mode 100644 lib/hackerlibultra/src/gu/guloadtile_bug.c create mode 100644 lib/hackerlibultra/src/gu/libm_vals.s create mode 100644 lib/hackerlibultra/src/gu/loadtextureblockmipmap.c create mode 100644 lib/hackerlibultra/src/gu/lookat.c create mode 100644 lib/hackerlibultra/src/gu/lookathil.c rename lib/{ultra => hackerlibultra/src}/gu/lookatref.c (66%) create mode 100644 lib/hackerlibultra/src/gu/lookatstereo.c create mode 100644 lib/hackerlibultra/src/gu/mtxcatf.c create mode 100644 lib/hackerlibultra/src/gu/mtxcatl.c create mode 100644 lib/hackerlibultra/src/gu/mtxutil.c rename lib/{ultra/gu/libm_vals.c => hackerlibultra/src/gu/normalize.c} (68%) rename lib/{ultra => hackerlibultra/src}/gu/ortho.c (55%) create mode 100644 lib/hackerlibultra/src/gu/parse_gbi.c create mode 100644 lib/hackerlibultra/src/gu/parse_rdp.c create mode 100644 lib/hackerlibultra/src/gu/parse_string.c rename lib/{ultra => hackerlibultra/src}/gu/perspective.c (50%) create mode 100644 lib/hackerlibultra/src/gu/position.c create mode 100644 lib/hackerlibultra/src/gu/poslight.c create mode 100644 lib/hackerlibultra/src/gu/poslighthil.c rename lib/{ultra/gu/normalize.c => hackerlibultra/src/gu/random.c} (57%) create mode 100644 lib/hackerlibultra/src/gu/readme.txt rename lib/{ultra => hackerlibultra/src}/gu/rotate.c (51%) create mode 100644 lib/hackerlibultra/src/gu/rotaterpy.c rename lib/{ultra => hackerlibultra/src}/gu/scale.c (64%) rename lib/{ultra => hackerlibultra/src}/gu/sinf.c (52%) create mode 100644 lib/hackerlibultra/src/gu/sins.c create mode 100644 lib/hackerlibultra/src/gu/sintable.h rename lib/{ultra => hackerlibultra/src}/gu/sqrtf.s (81%) rename lib/{ultra => hackerlibultra/src}/gu/translate.c (63%) create mode 100644 lib/hackerlibultra/src/gu/us2dex.c create mode 100644 lib/hackerlibultra/src/gu/us2dex2_emu.c create mode 100644 lib/hackerlibultra/src/gu/us2dex_emu.c create mode 100644 lib/hackerlibultra/src/gu/usprite.c create mode 100644 lib/hackerlibultra/src/host/host_ptn64.c create mode 100644 lib/hackerlibultra/src/host/readhost.c create mode 100644 lib/hackerlibultra/src/host/writehost.c rename lib/{ultra => hackerlibultra/src}/io/ai.c (67%) create mode 100644 lib/hackerlibultra/src/io/aigetlen.c create mode 100644 lib/hackerlibultra/src/io/aigetstat.c create mode 100644 lib/hackerlibultra/src/io/aisetfreq.c create mode 100644 lib/hackerlibultra/src/io/aisetnextbuf.c rename lib/{ultra => hackerlibultra/src}/io/cartrominit.c (84%) create mode 100644 lib/hackerlibultra/src/io/contchannelreset.c create mode 100644 lib/hackerlibultra/src/io/conteeplongread.c rename lib/{ultra => hackerlibultra/src}/io/conteeplongwrite.c (67%) create mode 100644 lib/hackerlibultra/src/io/conteepprobe.c create mode 100644 lib/hackerlibultra/src/io/conteepread.c rename lib/{ultra => hackerlibultra/src}/io/conteepwrite.c (51%) create mode 100644 lib/hackerlibultra/src/io/contpfs.c create mode 100644 lib/hackerlibultra/src/io/contquery.c rename lib/{ultra => hackerlibultra/src}/io/contramread.c (66%) rename lib/{ultra => hackerlibultra/src}/io/contramwrite.c (70%) create mode 100644 lib/hackerlibultra/src/io/contreaddata.c create mode 100644 lib/hackerlibultra/src/io/contreset.c create mode 100644 lib/hackerlibultra/src/io/controller.c create mode 100644 lib/hackerlibultra/src/io/contsetch.c create mode 100644 lib/hackerlibultra/src/io/crc.c create mode 100644 lib/hackerlibultra/src/io/devmgr.c create mode 100644 lib/hackerlibultra/src/io/dp.c create mode 100644 lib/hackerlibultra/src/io/dpctr.c create mode 100644 lib/hackerlibultra/src/io/dpgetstat.c create mode 100644 lib/hackerlibultra/src/io/dpsetnextbuf.c create mode 100644 lib/hackerlibultra/src/io/dpsetstat.c create mode 100644 lib/hackerlibultra/src/io/driverominit.c create mode 100644 lib/hackerlibultra/src/io/epidma.c create mode 100644 lib/hackerlibultra/src/io/epigettype.c create mode 100644 lib/hackerlibultra/src/io/epilinkhandle.c create mode 100644 lib/hackerlibultra/src/io/epirawdma.c create mode 100644 lib/hackerlibultra/src/io/epirawread.c create mode 100644 lib/hackerlibultra/src/io/epirawwrite.c create mode 100644 lib/hackerlibultra/src/io/epiread.c create mode 100644 lib/hackerlibultra/src/io/epiwrite.c create mode 100644 lib/hackerlibultra/src/io/gbpakcheckconnector.c create mode 100644 lib/hackerlibultra/src/io/gbpakgetbank.c create mode 100644 lib/hackerlibultra/src/io/gbpakgetstatus.c create mode 100644 lib/hackerlibultra/src/io/gbpakinit.c create mode 100644 lib/hackerlibultra/src/io/gbpakpower.c create mode 100644 lib/hackerlibultra/src/io/gbpakreadid.c create mode 100644 lib/hackerlibultra/src/io/gbpakreadwrite.c create mode 100644 lib/hackerlibultra/src/io/gbpaksetbank.c rename lib/{ultra => hackerlibultra/src}/io/leodiskinit.c (80%) create mode 100644 lib/hackerlibultra/src/io/leointerrupt.c rename lib/{ultra => hackerlibultra/src}/io/motor.c (62%) create mode 100644 lib/hackerlibultra/src/io/pfsallocatefile.c create mode 100644 lib/hackerlibultra/src/io/pfschecker.c create mode 100644 lib/hackerlibultra/src/io/pfsdeletefile.c create mode 100644 lib/hackerlibultra/src/io/pfsfilestate.c create mode 100644 lib/hackerlibultra/src/io/pfsfreeblocks.c create mode 100644 lib/hackerlibultra/src/io/pfsgetlabel.c rename lib/{ultra => hackerlibultra/src}/io/pfsgetstatus.c (52%) create mode 100644 lib/hackerlibultra/src/io/pfsinit.c create mode 100644 lib/hackerlibultra/src/io/pfsinitpak.c rename lib/{ultra => hackerlibultra/src}/io/pfsisplug.c (57%) create mode 100644 lib/hackerlibultra/src/io/pfsnumfiles.c create mode 100644 lib/hackerlibultra/src/io/pfsreadwritefile.c create mode 100644 lib/hackerlibultra/src/io/pfsreformat.c create mode 100644 lib/hackerlibultra/src/io/pfsrepairid.c create mode 100644 lib/hackerlibultra/src/io/pfssearchfile.c rename lib/{ultra => hackerlibultra/src}/io/pfsselectbank.c (55%) create mode 100644 lib/hackerlibultra/src/io/pfssetlabel.c create mode 100644 lib/hackerlibultra/src/io/pi.c rename lib/{ultra => hackerlibultra/src}/io/piacs.c (59%) create mode 100644 lib/hackerlibultra/src/io/pidma.c create mode 100644 lib/hackerlibultra/src/io/pigetcmdq.c create mode 100644 lib/hackerlibultra/src/io/pigetstat.c create mode 100644 lib/hackerlibultra/src/io/pigettype.c create mode 100644 lib/hackerlibultra/src/io/pimgr.c create mode 100644 lib/hackerlibultra/src/io/pirawdma.c create mode 100644 lib/hackerlibultra/src/io/pirawread.c create mode 100644 lib/hackerlibultra/src/io/pirawwrite.c create mode 100644 lib/hackerlibultra/src/io/piread.c create mode 100644 lib/hackerlibultra/src/io/piwrite.c rename lib/{ultra => hackerlibultra/src}/io/si.c (51%) rename lib/{ultra => hackerlibultra/src}/io/siacs.c (53%) create mode 100644 lib/hackerlibultra/src/io/sigetstat.c rename lib/{ultra => hackerlibultra/src}/io/sirawdma.c (68%) create mode 100644 lib/hackerlibultra/src/io/sirawread.c create mode 100644 lib/hackerlibultra/src/io/sirawwrite.c rename lib/{ultra => hackerlibultra/src}/io/sp.c (59%) create mode 100644 lib/hackerlibultra/src/io/spgetstat.c create mode 100644 lib/hackerlibultra/src/io/sprawdma.c create mode 100644 lib/hackerlibultra/src/io/sprawread.c create mode 100644 lib/hackerlibultra/src/io/sprawwrite.c rename lib/{ultra => hackerlibultra/src}/io/spsetpc.c (76%) rename lib/{ultra => hackerlibultra/src}/io/spsetstat.c (65%) create mode 100644 lib/hackerlibultra/src/io/sptask.c rename lib/{ultra => hackerlibultra/src}/io/sptaskyield.c (100%) rename lib/{ultra => hackerlibultra/src}/io/sptaskyielded.c (78%) create mode 100644 lib/hackerlibultra/src/io/vi.c rename lib/{ultra => hackerlibultra/src}/io/viblack.c (74%) create mode 100644 lib/hackerlibultra/src/io/viextendvstart.c create mode 100644 lib/hackerlibultra/src/io/vifade.c create mode 100644 lib/hackerlibultra/src/io/vigetcurrcontext.c create mode 100644 lib/hackerlibultra/src/io/vigetcurrframebuf.c create mode 100644 lib/hackerlibultra/src/io/vigetfield.c create mode 100644 lib/hackerlibultra/src/io/vigetline.c create mode 100644 lib/hackerlibultra/src/io/vigetmode.c create mode 100644 lib/hackerlibultra/src/io/vigetnextcontext.c create mode 100644 lib/hackerlibultra/src/io/vigetnextframebuf.c create mode 100644 lib/hackerlibultra/src/io/vigetstat.c create mode 100644 lib/hackerlibultra/src/io/vimgr.c create mode 100644 lib/hackerlibultra/src/io/virepeatline.c create mode 100644 lib/hackerlibultra/src/io/visetevent.c create mode 100644 lib/hackerlibultra/src/io/visetmode.c create mode 100644 lib/hackerlibultra/src/io/visetspecial.c create mode 100644 lib/hackerlibultra/src/io/visetxscale.c create mode 100644 lib/hackerlibultra/src/io/visetyscale.c create mode 100644 lib/hackerlibultra/src/io/viswapbuf.c rename lib/{ultra => hackerlibultra/src}/io/viswapcontext.c (83%) create mode 100644 lib/hackerlibultra/src/io/vitbl.c create mode 100644 lib/hackerlibultra/src/libc/bcmp.s create mode 100644 lib/hackerlibultra/src/libc/bcopy.s create mode 100644 lib/hackerlibultra/src/libc/bzero.s rename lib/{ultra => hackerlibultra/src}/libc/ldiv.c (52%) rename lib/{ultra => hackerlibultra/src}/libc/ll.c (94%) create mode 100644 lib/hackerlibultra/src/libc/llbit.c rename lib/{ultra => hackerlibultra/src}/libc/llcvt.c (73%) create mode 100644 lib/hackerlibultra/src/libc/sprintf.c create mode 100644 lib/hackerlibultra/src/libc/string.c create mode 100644 lib/hackerlibultra/src/libc/syncprintf.c rename lib/{ultra => hackerlibultra/src}/libc/xldtob.c (65%) create mode 100644 lib/hackerlibultra/src/libc/xlitob.c create mode 100644 lib/hackerlibultra/src/libc/xprintf.c rename lib/{ultra => hackerlibultra/src}/libc/xstdio.h (50%) create mode 100644 lib/hackerlibultra/src/log/delay.s create mode 100644 lib/hackerlibultra/src/log/log.c create mode 100644 lib/hackerlibultra/src/log/logfloat.c create mode 100644 lib/hackerlibultra/src/mgu/Makefile create mode 100644 lib/hackerlibultra/src/mgu/asm.h create mode 100644 lib/hackerlibultra/src/mgu/mtxcatf.s rename lib/{ultra/mgu/guasm.h => hackerlibultra/src/mgu/mtxcatl.c} (57%) create mode 100644 lib/hackerlibultra/src/mgu/mtxf2l.s create mode 100644 lib/hackerlibultra/src/mgu/mtxident.s rename lib/{ultra => hackerlibultra/src}/mgu/mtxidentf.s (51%) create mode 100644 lib/hackerlibultra/src/mgu/mtxl2f.s create mode 100644 lib/hackerlibultra/src/mgu/mtxxfmf.c create mode 100644 lib/hackerlibultra/src/mgu/mtxxfml.c create mode 100644 lib/hackerlibultra/src/mgu/normalize.s create mode 100644 lib/hackerlibultra/src/mgu/regdef.h create mode 100644 lib/hackerlibultra/src/mgu/rotate.c create mode 100644 lib/hackerlibultra/src/mgu/scale.s create mode 100644 lib/hackerlibultra/src/mgu/scalef.s create mode 100644 lib/hackerlibultra/src/mgu/translate.s create mode 100644 lib/hackerlibultra/src/mgu/translatef.s create mode 100644 lib/hackerlibultra/src/monutil.s create mode 100644 lib/hackerlibultra/src/os/ackramromread.c create mode 100644 lib/hackerlibultra/src/os/ackramromwrite.c create mode 100644 lib/hackerlibultra/src/os/afterprenmi.c create mode 100644 lib/hackerlibultra/src/os/atomic.c create mode 100644 lib/hackerlibultra/src/os/createmesgqueue.c create mode 100644 lib/hackerlibultra/src/os/createthread.c rename lib/{ultra => hackerlibultra/src}/os/destroythread.c (79%) rename lib/{ultra => hackerlibultra/src}/os/exceptasm.h (51%) create mode 100644 lib/hackerlibultra/src/os/exceptasm.s create mode 100644 lib/hackerlibultra/src/os/exit.c create mode 100644 lib/hackerlibultra/src/os/getactivequeue.c rename lib/{ultra => hackerlibultra/src}/os/getcause.s (73%) create mode 100644 lib/hackerlibultra/src/os/getcompare.s create mode 100644 lib/hackerlibultra/src/os/getconfig.s rename lib/{ultra => hackerlibultra/src}/os/getcount.s (61%) create mode 100644 lib/hackerlibultra/src/os/getcurrfaultthread.c create mode 100644 lib/hackerlibultra/src/os/getfpccsr.s create mode 100644 lib/hackerlibultra/src/os/gethwinterrupt.c create mode 100644 lib/hackerlibultra/src/os/getintmask.s create mode 100644 lib/hackerlibultra/src/os/getmemsize.c create mode 100644 lib/hackerlibultra/src/os/getnextfaultthread.c rename lib/{ultra => hackerlibultra/src}/os/getsr.s (73%) create mode 100644 lib/hackerlibultra/src/os/getthreadid.c rename lib/{ultra => hackerlibultra/src}/os/getthreadpri.c (64%) create mode 100644 lib/hackerlibultra/src/os/gettime.c create mode 100644 lib/hackerlibultra/src/os/gettlbasid.s create mode 100644 lib/hackerlibultra/src/os/gettlbhi.s create mode 100644 lib/hackerlibultra/src/os/gettlblo0.s create mode 100644 lib/hackerlibultra/src/os/gettlblo1.s create mode 100644 lib/hackerlibultra/src/os/gettlbpagemask.s create mode 100644 lib/hackerlibultra/src/os/getwatchlo.s create mode 100644 lib/hackerlibultra/src/os/initialize.c create mode 100644 lib/hackerlibultra/src/os/initialize_emu.c create mode 100644 lib/hackerlibultra/src/os/initialize_isv.c create mode 100644 lib/hackerlibultra/src/os/initialize_kmc.c create mode 100644 lib/hackerlibultra/src/os/initialize_msp.c create mode 100644 lib/hackerlibultra/src/os/initrdb.c create mode 100644 lib/hackerlibultra/src/os/interrupt.s create mode 100644 lib/hackerlibultra/src/os/invaldcache.s create mode 100644 lib/hackerlibultra/src/os/invalicache.s rename lib/{ultra => hackerlibultra/src}/os/jammesg.c (54%) create mode 100644 lib/hackerlibultra/src/os/maptlb.s create mode 100644 lib/hackerlibultra/src/os/maptlbrdb.s create mode 100644 lib/hackerlibultra/src/os/parameters.s create mode 100644 lib/hackerlibultra/src/os/physicaltovirtual.c create mode 100644 lib/hackerlibultra/src/os/probetlb.s create mode 100644 lib/hackerlibultra/src/os/rdbsend.c rename lib/{ultra => hackerlibultra/src}/os/recvmesg.c (63%) rename lib/{ultra => hackerlibultra/src}/os/resetglobalintmask.c (100%) rename lib/{ultra => hackerlibultra/src}/os/sendmesg.c (69%) create mode 100644 lib/hackerlibultra/src/os/setcause.s rename lib/{ultra => hackerlibultra/src}/os/setcompare.s (62%) create mode 100644 lib/hackerlibultra/src/os/setconfig.s create mode 100644 lib/hackerlibultra/src/os/setcount.s create mode 100644 lib/hackerlibultra/src/os/seterrorhandler.c create mode 100644 lib/hackerlibultra/src/os/seteventmesg.c create mode 100644 lib/hackerlibultra/src/os/setfpccsr.s rename lib/{ultra => hackerlibultra/src}/os/setglobalintmask.c (100%) rename lib/{ultra => hackerlibultra/src}/os/sethwinterrupt.c (75%) rename lib/{ultra => hackerlibultra/src}/os/setintmask.s (75%) create mode 100644 lib/hackerlibultra/src/os/setpiinterrupt.c rename lib/{ultra => hackerlibultra/src}/os/setsr.s (67%) rename lib/{ultra => hackerlibultra/src}/os/setthreadpri.c (62%) create mode 100644 lib/hackerlibultra/src/os/settime.c rename lib/{ultra => hackerlibultra/src}/os/settimer.c (69%) create mode 100644 lib/hackerlibultra/src/os/settlbasid.s rename lib/{ultra => hackerlibultra/src}/os/setwatchlo.s (67%) rename lib/{ultra => hackerlibultra/src}/os/startthread.c (80%) create mode 100644 lib/hackerlibultra/src/os/stopthread.c create mode 100644 lib/hackerlibultra/src/os/stoptimer.c rename lib/{ultra => hackerlibultra/src}/os/syncputchars.c (61%) create mode 100644 lib/hackerlibultra/src/os/testhost.c create mode 100644 lib/hackerlibultra/src/os/thread.c create mode 100644 lib/hackerlibultra/src/os/threadasm.h rename lib/{ultra => hackerlibultra/src}/os/timerintr.c (57%) create mode 100644 lib/hackerlibultra/src/os/unmaptlb.s create mode 100644 lib/hackerlibultra/src/os/unmaptlball.s rename lib/{ultra => hackerlibultra/src}/os/virtualtophysical.c (66%) create mode 100644 lib/hackerlibultra/src/os/writebackdcache.s rename lib/{ultra => hackerlibultra/src}/os/writebackdcacheall.s (74%) rename lib/{ultra => hackerlibultra/src}/os/yieldthread.c (88%) create mode 100644 lib/hackerlibultra/src/rg/free.c create mode 100644 lib/hackerlibultra/src/rg/getbufcount.c create mode 100644 lib/hackerlibultra/src/rg/getsize.c create mode 100644 lib/hackerlibultra/src/rg/malloc.c create mode 100644 lib/hackerlibultra/src/rg/printregion.c create mode 100644 lib/hackerlibultra/src/rg/region.c create mode 100644 lib/hackerlibultra/src/rmon/rmonbrk.c create mode 100644 lib/hackerlibultra/src/rmon/rmoncmds.c create mode 100644 lib/hackerlibultra/src/rmon/rmonmain.c create mode 100644 lib/hackerlibultra/src/rmon/rmonmem.c create mode 100644 lib/hackerlibultra/src/rmon/rmonmisc.c create mode 100644 lib/hackerlibultra/src/rmon/rmonprint.c create mode 100644 lib/hackerlibultra/src/rmon/rmonrcp.s create mode 100644 lib/hackerlibultra/src/rmon/rmonregs.c create mode 100644 lib/hackerlibultra/src/rmon/rmonsio.c create mode 100644 lib/hackerlibultra/src/rmon/rmontask.c create mode 100644 lib/hackerlibultra/src/sched/Makefile create mode 100644 lib/hackerlibultra/src/sched/sched.c create mode 100644 lib/hackerlibultra/src/sched/sched_log.fmt create mode 100644 lib/hackerlibultra/src/sp/Makefile create mode 100644 lib/hackerlibultra/src/sp/clearattribute.c create mode 100644 lib/hackerlibultra/src/sp/color.c create mode 100644 lib/hackerlibultra/src/sp/hide.c create mode 100644 lib/hackerlibultra/src/sp/setattribute.c create mode 100644 lib/hackerlibultra/src/sp/show.c create mode 100644 lib/hackerlibultra/src/sp/sprite.c create mode 100644 lib/hackerlibultra/src/sp/spriteex.c create mode 100644 lib/hackerlibultra/src/sp/spriteex2.c create mode 100644 lib/hackerlibultra/src/sp/spscale.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpalhaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpalhan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpalhpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpalhpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpalhpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpalhpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallaf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallan2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodefpallpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempalhaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempalhan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempalhpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempalhpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempalhpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempalhpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallaf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallan2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodempallpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentschaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentschan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentschpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentschpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentschpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentschpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclaf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclan2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodentsclpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepalhaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepalhan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepalhpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepalhpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepalhpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepalhpn2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallaf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallaf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallan1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallan2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallpf1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallpf2.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallpn1.c create mode 100644 lib/hackerlibultra/src/vimodes/vimodepallpn2.c create mode 100644 lib/hackerlibultra/src/voice/voicecheckresult.c create mode 100644 lib/hackerlibultra/src/voice/voicecheckword.c create mode 100644 lib/hackerlibultra/src/voice/voicecleardictionary.c create mode 100644 lib/hackerlibultra/src/voice/voicecontread2.c create mode 100644 lib/hackerlibultra/src/voice/voicecontread36.c create mode 100644 lib/hackerlibultra/src/voice/voicecontrolgain.c create mode 100644 lib/hackerlibultra/src/voice/voicecontwrite20.c create mode 100644 lib/hackerlibultra/src/voice/voicecontwrite4.c create mode 100644 lib/hackerlibultra/src/voice/voicecountsyllables.c create mode 100644 lib/hackerlibultra/src/voice/voicecrc.c create mode 100644 lib/hackerlibultra/src/voice/voicegetreaddata.c create mode 100644 lib/hackerlibultra/src/voice/voicegetstatus.c create mode 100644 lib/hackerlibultra/src/voice/voiceinit.c create mode 100644 lib/hackerlibultra/src/voice/voiceinternal.h create mode 100644 lib/hackerlibultra/src/voice/voicemaskdictionary.c create mode 100644 lib/hackerlibultra/src/voice/voicesetadconverter.c create mode 100644 lib/hackerlibultra/src/voice/voicesetword.c create mode 100644 lib/hackerlibultra/src/voice/voicestartreaddata.c create mode 100644 lib/hackerlibultra/src/voice/voicestopreaddata.c create mode 100755 lib/hackerlibultra/tools/ar.py create mode 100644 lib/hackerlibultra/tools/asm_differ/.gitignore rename {tools/ido-static-recomp/tools/rabbitizer => lib/hackerlibultra/tools/asm_differ}/.gitrepo (58%) create mode 100644 lib/hackerlibultra/tools/asm_differ/.pre-commit-config.yaml rename {tools/asm-processor => lib/hackerlibultra/tools/asm_differ}/LICENSE (100%) create mode 100644 lib/hackerlibultra/tools/asm_differ/README.md create mode 100644 lib/hackerlibultra/tools/asm_differ/diff-stylesheet.css create mode 100755 lib/hackerlibultra/tools/asm_differ/diff.py create mode 100644 lib/hackerlibultra/tools/asm_differ/diff_settings.py create mode 100644 lib/hackerlibultra/tools/asm_differ/mypy.ini create mode 100644 lib/hackerlibultra/tools/asm_differ/screenshot.png create mode 100644 lib/hackerlibultra/tools/check_format.py create mode 100755 lib/hackerlibultra/tools/compile_sjis.py create mode 100755 lib/hackerlibultra/tools/disassemble_elf.py create mode 100755 lib/hackerlibultra/tools/fix_objfile.py create mode 100755 lib/hackerlibultra/tools/libdiff.py create mode 100755 lib/hackerlibultra/tools/libelf.py create mode 100755 lib/hackerlibultra/tools/m2ctx.py create mode 100644 lib/hackerlibultra/tools/mdebug.py create mode 100644 lib/hackerlibultra/tools/mips_isa.py create mode 100755 lib/hackerlibultra/tools/patch_ar_meta.py create mode 100755 lib/hackerlibultra/tools/print_mdebug.py create mode 100755 lib/hackerlibultra/tools/set_o32abi_bit.py create mode 100755 lib/hackerlibultra/tools/shiftjis_conv.py create mode 100755 lib/hackerlibultra/tools/strip_debug.sh create mode 100644 lib/hackerlibultra/tools/util.py create mode 100644 lib/hackerlibultra/util.mk delete mode 100644 lib/src/libgcc/_cmpdi2.c delete mode 100644 lib/src/libgcc/_divdi3.c delete mode 100644 lib/src/libgcc/_fixdfdi.c delete mode 100644 lib/src/libgcc/_fixsfdi.c delete mode 100644 lib/src/libgcc/_fixunsdfdi.c delete mode 100644 lib/src/libgcc/_fixunssfdi.c delete mode 100644 lib/src/libgcc/_floatdidf.c delete mode 100644 lib/src/libgcc/_floatdisf.c delete mode 100644 lib/src/libgcc/_moddi3.c delete mode 100644 lib/src/libgcc/_udivdi3.c delete mode 100644 lib/src/libgcc/_umoddi3.c delete mode 100644 lib/src/libgcc/libgcc2.inc delete mode 100644 lib/src/libgcc/longlong.h delete mode 100644 lib/ultra/D.inc delete mode 100644 lib/ultra/F_I.inc delete mode 100644 lib/ultra/K_L.inc delete mode 100644 lib/ultra/audio/bnkf.c delete mode 100644 lib/ultra/bb/os/_getcount.c delete mode 100644 lib/ultra/bb/os/_setcompare.c delete mode 100644 lib/ultra/bb/sk/skapi.s delete mode 100644 lib/ultra/bb/wrapper.c delete mode 100644 lib/ultra/debug/kdebugserver.c delete mode 100644 lib/ultra/gu/mtxutil.c delete mode 100644 lib/ultra/io/aigetlen.c delete mode 100644 lib/ultra/io/aisetfreq.c delete mode 100644 lib/ultra/io/aisetnextbuf.c delete mode 100644 lib/ultra/io/conteeplongread.c delete mode 100644 lib/ultra/io/conteepprobe.c delete mode 100644 lib/ultra/io/conteepread.c delete mode 100644 lib/ultra/io/contreaddata.c delete mode 100644 lib/ultra/io/controller.c delete mode 100644 lib/ultra/io/controller.h delete mode 100644 lib/ultra/io/crc.c delete mode 100644 lib/ultra/io/devmgr.c delete mode 100644 lib/ultra/io/driverominit.c delete mode 100644 lib/ultra/io/epidma.c delete mode 100644 lib/ultra/io/epirawdma.c delete mode 100644 lib/ultra/io/epirawread.c delete mode 100644 lib/ultra/io/epirawwrite.c delete mode 100644 lib/ultra/io/leointerrupt.c delete mode 100644 lib/ultra/io/pidma.c delete mode 100644 lib/ultra/io/pigetcmdq.c delete mode 100644 lib/ultra/io/piint.h delete mode 100644 lib/ultra/io/pimgr.c delete mode 100644 lib/ultra/io/pirawdma.c delete mode 100644 lib/ultra/io/pirawread.c delete mode 100644 lib/ultra/io/sirawread.c delete mode 100644 lib/ultra/io/sirawwrite.c delete mode 100644 lib/ultra/io/spgetstat.c delete mode 100644 lib/ultra/io/sprawdma.c delete mode 100644 lib/ultra/io/sptask.c delete mode 100644 lib/ultra/io/vi.c delete mode 100644 lib/ultra/io/vigetcurrcontext.c delete mode 100644 lib/ultra/io/vimgr.c delete mode 100644 lib/ultra/io/visetevent.c delete mode 100644 lib/ultra/io/visetmode.c delete mode 100644 lib/ultra/io/visetspecial.c delete mode 100644 lib/ultra/io/viswapbuf.c delete mode 100644 lib/ultra/io/vitbl.c delete mode 100644 lib/ultra/ld.inc delete mode 100644 lib/ultra/libc/bcopy.s delete mode 100644 lib/ultra/libc/bzero.s delete mode 100644 lib/ultra/libc/sprintf.c delete mode 100644 lib/ultra/libc/string.c delete mode 100644 lib/ultra/libc/syncprintf.c delete mode 100644 lib/ultra/libc/xlitob.c delete mode 100644 lib/ultra/libc/xprintf.c delete mode 100644 lib/ultra/mgu/mtxf2l.s delete mode 100644 lib/ultra/mgu/normalize.s delete mode 100644 lib/ultra/mgu/scale.s delete mode 100644 lib/ultra/mgu/translate.s delete mode 100644 lib/ultra/os/createmesgqueue.c delete mode 100644 lib/ultra/os/createthread.c delete mode 100644 lib/ultra/os/exceptasm.s delete mode 100644 lib/ultra/os/getcurrfaultthread.c delete mode 100644 lib/ultra/os/gettime.c delete mode 100644 lib/ultra/os/initialize.c delete mode 100644 lib/ultra/os/interrupt.s delete mode 100644 lib/ultra/os/invaldcache.s delete mode 100644 lib/ultra/os/invalicache.s delete mode 100644 lib/ultra/os/maptlb.s delete mode 100644 lib/ultra/os/maptlbrdb.s delete mode 100644 lib/ultra/os/osint.h delete mode 100644 lib/ultra/os/parameters.s delete mode 100644 lib/ultra/os/probetlb.s delete mode 100644 lib/ultra/os/seteventmesg.c delete mode 100644 lib/ultra/os/setfpccsr.s delete mode 100644 lib/ultra/os/settime.c delete mode 100644 lib/ultra/os/thread.c delete mode 100644 lib/ultra/os/threadasm.h delete mode 100644 lib/ultra/os/unmaptlball.s delete mode 100644 lib/ultra/os/writebackdcache.s delete mode 100644 lib/ultra/vimodes/vimodempallan1.c delete mode 100644 lib/ultra/vimodes/vimodentsclan1.c delete mode 100644 lib/ultra/vimodes/vimodepallan1.c delete mode 100644 libultra.mk create mode 100644 src/game/libgcc.c create mode 100644 textures/crash_screen/crash_screen_font.ia1.png delete mode 100644 tools/asm-processor/.gitignore delete mode 100644 tools/asm-processor/README.md delete mode 100644 tools/asm-processor/add-test.sh delete mode 100644 tools/asm-processor/asm_processor.py delete mode 100644 tools/asm-processor/build.py delete mode 100644 tools/asm-processor/compile-test.sh delete mode 100644 tools/asm-processor/prelude.inc delete mode 100644 tools/asm-processor/run-tests.sh delete mode 100644 tools/asm-processor/tests/ascii.c delete mode 100644 tools/asm-processor/tests/ascii.objdump delete mode 100644 tools/asm-processor/tests/comments.c delete mode 100644 tools/asm-processor/tests/comments.objdump delete mode 100644 tools/asm-processor/tests/force.c delete mode 100644 tools/asm-processor/tests/force.objdump delete mode 100644 tools/asm-processor/tests/kpic-o1.c delete mode 100644 tools/asm-processor/tests/kpic-o1.objdump delete mode 100644 tools/asm-processor/tests/kpic-o2.c delete mode 100644 tools/asm-processor/tests/kpic-o2.objdump delete mode 100644 tools/asm-processor/tests/label-sameline.c delete mode 100644 tools/asm-processor/tests/label-sameline.objdump delete mode 100644 tools/asm-processor/tests/large.c delete mode 100644 tools/asm-processor/tests/large.objdump delete mode 100644 tools/asm-processor/tests/late_rodata_align.c delete mode 100644 tools/asm-processor/tests/late_rodata_align.objdump delete mode 100644 tools/asm-processor/tests/late_rodata_doubles.c delete mode 100644 tools/asm-processor/tests/late_rodata_doubles.objdump delete mode 100644 tools/asm-processor/tests/late_rodata_doubles_mips1.c delete mode 100644 tools/asm-processor/tests/late_rodata_doubles_mips1.objdump delete mode 100644 tools/asm-processor/tests/late_rodata_jtbl.c delete mode 100644 tools/asm-processor/tests/late_rodata_jtbl.objdump delete mode 100644 tools/asm-processor/tests/late_rodata_jtbl_mips1.c delete mode 100644 tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump delete mode 100644 tools/asm-processor/tests/late_rodata_misaligned_doubles.c delete mode 100644 tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump delete mode 100644 tools/asm-processor/tests/line-continuation-separate-file.s delete mode 100644 tools/asm-processor/tests/line-continuation.asmproc.d delete mode 100644 tools/asm-processor/tests/line-continuation.c delete mode 100644 tools/asm-processor/tests/line-continuation.objdump delete mode 100644 tools/asm-processor/tests/o0.c delete mode 100644 tools/asm-processor/tests/o0.objdump delete mode 100644 tools/asm-processor/tests/o2.c delete mode 100644 tools/asm-processor/tests/o2.objdump delete mode 100644 tools/asm-processor/tests/pascal.objdump delete mode 100644 tools/asm-processor/tests/pascal.p delete mode 100644 tools/asm-processor/tests/static-global.c delete mode 100644 tools/asm-processor/tests/static-global.objdump delete mode 100644 tools/asm-processor/tests/static.c delete mode 100644 tools/asm-processor/tests/static.objdump delete mode 100644 tools/asm-processor/tests/test1.c delete mode 100644 tools/asm-processor/tests/test1.objdump delete mode 100644 tools/asm-processor/tests/test2.c delete mode 100644 tools/asm-processor/tests/test2.objdump delete mode 100644 tools/asm-processor/tests/test3.c delete mode 100644 tools/asm-processor/tests/test3.objdump delete mode 100755 tools/egcs/as delete mode 100755 tools/egcs/cc1 delete mode 100755 tools/egcs/cpp delete mode 100755 tools/egcs/gcc delete mode 100644 tools/ido-static-recomp/.gitignore delete mode 100644 tools/ido-static-recomp/DOCS.md delete mode 100644 tools/ido-static-recomp/Makefile delete mode 100644 tools/ido-static-recomp/README.md delete mode 100644 tools/ido-static-recomp/elf.h delete mode 100644 tools/ido-static-recomp/header.h delete mode 100644 tools/ido-static-recomp/helpers.h delete mode 100644 tools/ido-static-recomp/libc_impl.c delete mode 100644 tools/ido-static-recomp/libc_impl.h delete mode 100644 tools/ido-static-recomp/recomp.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.clang-format delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.clang-tidy delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.gitattributes delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/.gitignore delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/LICENSE delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/Makefile delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/README.md delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/pyproject.toml delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/r5900test.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/rsptest.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/setup.cfg delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/setup.py delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/test.c delete mode 100644 tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp delete mode 100644 tools/ido5.3_compiler/LICENSE.md delete mode 100644 tools/ido5.3_compiler/lib/libmalloc.so delete mode 100644 tools/ido5.3_compiler/lib/libmalloc_old.so delete mode 100755 tools/ido5.3_compiler/lib/rld delete mode 100755 tools/ido5.3_compiler/usr/bin/cc delete mode 100755 tools/ido5.3_compiler/usr/lib/acpp delete mode 100755 tools/ido5.3_compiler/usr/lib/as0 delete mode 100755 tools/ido5.3_compiler/usr/lib/as1 delete mode 100755 tools/ido5.3_compiler/usr/lib/cfe delete mode 100755 tools/ido5.3_compiler/usr/lib/copt delete mode 100644 tools/ido5.3_compiler/usr/lib/crt1.o delete mode 100644 tools/ido5.3_compiler/usr/lib/err.english.cc delete mode 100755 tools/ido5.3_compiler/usr/lib/libc.so.1 delete mode 100644 tools/ido5.3_compiler/usr/lib/libexc.so delete mode 100644 tools/ido5.3_compiler/usr/lib/libgen.so delete mode 100644 tools/ido5.3_compiler/usr/lib/libm.so delete mode 100755 tools/ido5.3_compiler/usr/lib/ugen delete mode 100755 tools/ido5.3_compiler/usr/lib/ujoin delete mode 100755 tools/ido5.3_compiler/usr/lib/uld delete mode 100755 tools/ido5.3_compiler/usr/lib/umerge delete mode 100755 tools/ido5.3_compiler/usr/lib/uopt delete mode 100755 tools/ido5.3_compiler/usr/lib/usplit delete mode 100644 tools/ld/libbfd-2.30.so delete mode 100755 tools/ld/mips64-elf-ld diff --git a/Makefile b/Makefile index 6e426ca6..326fb5bd 100644 --- a/Makefile +++ b/Makefile @@ -18,13 +18,8 @@ DEFINES := # Build for the N64 (turn this off for ports) TARGET_N64 ?= 1 - -# COMPILER - selects the C compiler to use -# ido - uses the SGI IRIS Development Option compiler, which is used to build -# an original matching N64 ROM -# gcc - uses the GNU C Compiler -COMPILER ?= ido -$(eval $(call validate-option,COMPILER,ido gcc)) +COMPILER ?= gcc +$(eval $(call validate-option,COMPILER, gcc)) # VERSION - selects the version of the game to build @@ -92,27 +87,9 @@ else ifeq ($(GRUCODE),f3dzex) # Fast3DZEX (2.0J / Animal Forest - Dōbutsu no Mo DEFINES += F3DZEX_GBI_2=1 F3DEX_GBI_2=1 F3DEX_GBI_SHARED=1 endif -# USE_QEMU_IRIX - when ido is selected, select which way to emulate IRIX programs -# 1 - use qemu-irix -# 0 - statically recompile the IRIX programs -USE_QEMU_IRIX ?= 0 -$(eval $(call validate-option,USE_QEMU_IRIX,0 1)) - -ifeq ($(COMPILER),ido) - ifeq ($(USE_QEMU_IRIX),1) - # Verify that qemu-irix exists - QEMU_IRIX ?= $(call find-command,qemu-irix) - ifeq (, $(QEMU_IRIX)) - $(error Using the IDO compiler requires qemu-irix. Please install qemu-irix package or set the QEMU_IRIX environment variable to the full qemu-irix binary path) - endif - endif - - MIPSISET := -mips2 -else ifeq ($(COMPILER),gcc) - NON_MATCHING := 1 - MIPSISET := -mips3 - OPT_FLAGS := -O2 -endif +NON_MATCHING := 1 +MIPSISET := -mips3 +OPT_FLAGS := -O2 # NON_MATCHING - whether to build a matching, identical copy of the ROM @@ -171,7 +148,7 @@ ifeq ($(filter clean distclean,$(MAKECMDGOALS)),) $(info =======================) endif -DEFINES += _FINALROM=1 +DEFINES += _FINALROM=1 LIBULTRA_VERSION=9 ifeq ($(TARGET_N64),1) DEFINES += TARGET_N64=1 @@ -182,6 +159,8 @@ endif #==============================================================================# TOOLS_DIR := tools +LIBULTRA_DIR := lib/hackerlibultra +LIBULTRA_BUILD_DIR := lib/hackerlibultra/build/L/libgultra_rom # (This is a bit hacky, but a lot of rules implicitly depend # on tools and assets, and we use directory globs further down @@ -211,6 +190,13 @@ ifeq ($(filter clean distclean print-%,$(MAKECMDGOALS)),) ifeq ($(DUMMY),FAIL) $(error Failed to build tools) endif + + $(info Building hackerlibultra...) + DUMMY != $(MAKE) -s -C $(LIBULTRA_DIR) >&2 || echo FAIL + ifeq ($(DUMMY),FAIL) + $(error Failed to build hackerlibultra) + endif + $(info Building ROM...) endif @@ -237,10 +223,6 @@ LEVEL_DIRS := $(patsubst levels/%,%,$(dir $(wildcard levels/*/header.h))) SRC_DIRS := src src/engine src/game src/menu src/buffers src/audio $(AUDIO_SRC_DIR) actors levels bin data assets asm lib sound BIN_DIRS := bin bin/$(VERSION) -ifeq ($(VERSION),cn) - LIBGCC_SRC_DIRS += lib/src/libgcc -endif - GODDARD_SRC_DIRS := src/goddard src/goddard/dynlists # File dependencies and variables for specific files @@ -251,7 +233,6 @@ LEVEL_C_FILES := $(wildcard levels/*/leveldata.c) $(wildcard levels/*/script C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) $(LEVEL_C_FILES) S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s)) GODDARD_C_FILES := $(foreach dir,$(GODDARD_SRC_DIRS),$(wildcard $(dir)/*.c)) -LIBGCC_C_FILES := $(foreach dir,$(LIBGCC_SRC_DIRS),$(wildcard $(dir)/*.c)) GENERATED_C_FILES := $(BUILD_DIR)/assets/mario_anim_data.c $(BUILD_DIR)/assets/demo_data.c # Sound files @@ -279,58 +260,23 @@ O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \ GODDARD_O_FILES := $(foreach file,$(GODDARD_C_FILES),$(BUILD_DIR)/$(file:.c=.o)) -LIBGCC_O_FILES := $(foreach file,$(LIBGCC_C_FILES),$(BUILD_DIR)/$(file:.c=.o)) - # Automatic dependency files -DEP_FILES := $(O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(LIBGCC_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d - -# Files with GLOBAL_ASM blocks -ifeq ($(NON_MATCHING),0) - GLOBAL_ASM_C_FILES != grep -rl 'GLOBAL_ASM(' $(wildcard src/**/*.c) - GLOBAL_ASM_O_FILES = $(foreach file,$(GLOBAL_ASM_C_FILES),$(BUILD_DIR)/$(file:.c=.o)) - GLOBAL_ASM_DEP = $(BUILD_DIR)/src/audio/non_matching_dep -endif - +DEP_FILES := $(O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d #==============================================================================# # Compiler Options # #==============================================================================# -EGCS_PATH := $(TOOLS_DIR)/egcs -LD_PATH := $(TOOLS_DIR)/ld - -# detect prefix for MIPS toolchain -ifneq ($(call find-command,mips-linux-gnu-ld),) - CROSS := mips-linux-gnu- -else ifneq ($(call find-command,mips64-linux-gnu-ld),) - CROSS := mips64-linux-gnu- -else ifneq ($(call find-command,mips64-elf-ld),) - CROSS := mips64-elf- +# detect hackerchain +ifneq ($(call find-command, $(HACKERCHAIN)/mips64-elf-ld),) + CROSS := $(HACKERCHAIN)/mips64-elf- else - $(error Unable to detect a suitable MIPS toolchain installed) + $(error Unable to detect a hackerchain toolchain installation.) endif AS := $(CROSS)as -ifeq ($(COMPILER),gcc) - CC := $(CROSS)gcc -else - ifeq ($(USE_QEMU_IRIX),1) - IRIX_ROOT := $(TOOLS_DIR)/ido5.3_compiler - CC := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/bin/cc - ACPP := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/acpp - COPT := $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/copt - else - IDO_ROOT := $(TOOLS_DIR)/ido-static-recomp/build/out - CC := $(IDO_ROOT)/cc - ACPP := $(IDO_ROOT)/acpp - COPT := $(IDO_ROOT)/copt - endif -endif -ifeq ($(COMPILER),gcc) - LD := $(CROSS)ld -else - LD := LD_LIBRARY_PATH=$(LD_PATH) $(LD_PATH)/mips64-elf-ld -endif +CC := $(CROSS)gcc +LD := $(CROSS)ld AR := $(CROSS)ar OBJDUMP := $(CROSS)objdump OBJCOPY := $(CROSS)objcopy @@ -348,32 +294,6 @@ endif C_DEFINES := $(foreach d,$(DEFINES),-D$(d)) DEF_INC_CFLAGS := $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(C_DEFINES) -EGCS_AS := $(EGCS_PATH)/as -EGCS_ASFLAGS = -mcpu=r4300 -mabi=32 $(foreach i,$(INCLUDE_DIRS),-I$(i)) - -include libultra.mk - -ifeq ($(VERSION),cn) - EGCS_REASSEMBLED_ASM_FILES := $(wildcard asm/*.s) - EGCS_REASSEMBLED_ASM_FILES := $(filter-out asm/ipl3_font.s, $(EGCS_REASSEMBLED_ASM_FILES)) - EGCS_REASSEMBLED := $(foreach file,$(EGCS_REASSEMBLED_ASM_FILES),$(BUILD_DIR)/$(file:.s=.o)) - $(EGCS_REASSEMBLED): AS := $(EGCS_AS) - $(EGCS_REASSEMBLED): ASFLAGS = $(EGCS_ASFLAGS) -endif - -EGCS_CC := COMPILER_PATH=$(EGCS_PATH) $(EGCS_PATH)/gcc -EGCS_CFLAGS = -G 0 $(TARGET_CFLAGS) -mcpu=r4300 -fno-pic -Wa,--strip-local-absolute $(DEF_INC_CFLAGS) - -# iQue recompiled some files with a different compiler -ifeq ($(VERSION),cn) - IQUE_RECOMPILED_SRC_GAME := $(addprefix $(BUILD_DIR)/src/game/,rumble_init.o level_update.o memory.o area.o print.o ingame_menu.o hud.o cn_common_syms_1.o cn_common_syms_2.o) $(addprefix $(BUILD_DIR)/src/menu/,title_screen.o intro_geo.o file_select.o star_select.o) - IQUE_RECOMPILED_LIBGCC_SRC := $(LIBGCC_O_FILES) - IQUE_RECOMPILED = $(IQUE_RECOMPILED_SRC_GAME) $(IQUE_RECOMPILED_LIBGCC_SRC) - $(IQUE_RECOMPILED): CC := $(EGCS_CC) - $(IQUE_RECOMPILED): CFLAGS = $(EGCS_CFLAGS) - $(IQUE_RECOMPILED): MIPSISET := -endif - # Prefer clang as C preprocessor if installed on the system ifneq (,$(call find-command,clang)) CPP := clang @@ -383,29 +303,15 @@ else CPPFLAGS := -P -Wno-trigraphs $(DEF_INC_CFLAGS) endif -# Check code syntax with host compiler -CC_CHECK := gcc -CC_CHECK_CFLAGS := -fsyntax-only -fsigned-char $(CC_CFLAGS) $(TARGET_CFLAGS) -std=gnu90 -Wall -Wextra -Wno-format-security -Wno-main -DNON_MATCHING -DAVOID_UB $(DEF_INC_CFLAGS) - # C compiler options CFLAGS = -G 0 $(TARGET_CFLAGS) $(DEF_INC_CFLAGS) -ifeq ($(COMPILER),gcc) - CFLAGS += -mno-shared -march=vr4300 -mfix4300 -mabi=32 -mhard-float -mdivide-breaks -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra -else - CFLAGS += -non_shared -Wab,-r4300_mul -Xcpluscomm -Xfullwarn -signed -32 -endif +CFLAGS += -mno-shared -march=vr4300 -mfix4300 -mabi=32 -mhard-float -mdivide-breaks -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra -Wno-trigraphs +CFLAGS += -Wno-missing-braces ASFLAGS := -march=vr4300 -mabi=32 $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(foreach d,$(DEFINES),--defsym $(d)) +ASMFLAGS := -G 0 $(OPT_FLAGS) $(TARGET_CFLAGS) -mips3 $(DEF_INC_CFLAGS) -mno-shared -march=vr4300 -mfix4300 -mabi=32 -mhard-float -mdivide-breaks -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra RSPASMFLAGS := $(foreach d,$(DEFINES),-definelabel $(subst =, ,$(d))) -ifeq ($(shell getconf LONG_BIT), 32) - # Work around memory allocation bug in QEMU - export QEMU_GUEST_BASE := 1 -else - # Ensure that gcc treats the code as 32-bit - CC_CHECK_CFLAGS += -m32 -endif - # Prevent a crash with -sopt export LANG := C @@ -447,12 +353,7 @@ BLINK := \033[33;5m endif # Use objcopy instead of extract_data_for_mio to get 16-byte aligned padding -ifeq ($(COMPILER),gcc) - EXTRACT_DATA_FOR_MIO := $(OBJCOPY) -O binary --only-section=.data -endif -ifeq ($(VERSION),cn) - EXTRACT_DATA_FOR_MIO := $(OBJCOPY) -O binary --only-section=.data -endif +EXTRACT_DATA_FOR_MIO := $(OBJCOPY) -O binary --only-section=.data # Common build print status function define print @@ -476,6 +377,7 @@ distclean: clean $(PYTHON) extract_assets.py --clean $(MAKE) -C $(TOOLS_DIR) clean $(MAKE) -C $(TOOLS_DIR)/sm64tools clean + $(MAKE) -C $(LIBULTRA_DIR) clean test: $(ROM) $(EMULATOR) $(EMU_FLAGS) $< @@ -494,10 +396,6 @@ $(BUILD_DIR)/src/audio/sh/load.o: $(SOUND_BIN_DIR)/bank_sets.inc.c $(SOUND_BIN_D $(CRASH_TEXTURE_C_FILES): TEXTURE_ENCODING := u32 -ifeq ($(COMPILER),gcc) - $(BUILD_DIR)/lib/src/math/%.o: CFLAGS += -fno-builtin -endif - ifeq ($(VERSION),eu) TEXT_DIRS := text/de text/us text/fr @@ -522,7 +420,7 @@ else endif $(BUILD_DIR)/bin/segment2.o: $(BUILD_DIR)/text/debug_text.raw.inc.c -ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(ULTRA_SRC_DIRS) $(LIBGCC_SRC_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(MIO0_DIR) $(addprefix $(MIO0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION) +ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(ULTRA_SRC_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(MIO0_DIR) $(addprefix $(MIO0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION) # Make sure build directory exists before compiling anything DUMMY != mkdir -p $(ALL_DIRS) @@ -690,18 +588,6 @@ $(BUILD_DIR)/include/level_headers.h: levels/level_headers.h.in $(call print,Preprocessing level headers:,$<,$@) $(V)$(CPP) $(CPPFLAGS) -I . $< | sed -E 's|(.+)|#include "\1"|' > $@ -# Run asm_processor on files that have NON_MATCHING code -ifeq ($(NON_MATCHING),0) -$(GLOBAL_ASM_O_FILES): CC := $(V)$(PYTHON) $(TOOLS_DIR)/asm_processor/build.py $(CC) -- $(AS) $(ASFLAGS) -- -endif - -# Rebuild files with 'GLOBAL_ASM' if the NON_MATCHING flag changes. -$(GLOBAL_ASM_O_FILES): $(GLOBAL_ASM_DEP).$(NON_MATCHING) -$(GLOBAL_ASM_DEP).$(NON_MATCHING): - @$(RM) $(GLOBAL_ASM_DEP).* - $(V)touch $@ - - #==============================================================================# # Compilation Recipes # #==============================================================================# @@ -713,9 +599,6 @@ ifeq ($(NON_MATCHING),0) $(BUILD_DIR)/bin/%.o: OPT_FLAGS := -g $(BUILD_DIR)/src/goddard/%.o: OPT_FLAGS := -g $(BUILD_DIR)/src/goddard/%.o: MIPSISET := -mips1 - ifeq ($(VERSION),cn) - $(BUILD_DIR)/lib/src/libgcc/%.o: OPT_FLAGS := -O2 -g -mips2 - endif # Audio specific flags: @@ -749,18 +632,10 @@ endif # Compile C code $(BUILD_DIR)/%.o: %.c $(call print,Compiling:,$<,$@) - $(V)$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/$*.d $< $(V)$(CC) -c $(CFLAGS) $(OPT_FLAGS) $(MIPSISET) -o $@ $< -ifeq ($(VERSION),cn) - $(V)$(TOOLS_DIR)/patch_elf_32bit $@ -endif $(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c $(call print,Compiling:,$<,$@) - $(V)$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/$*.d $< $(V)$(CC) -c $(CFLAGS) $(OPT_FLAGS) $(MIPSISET) -o $@ $< -ifeq ($(VERSION),cn) - $(V)$(TOOLS_DIR)/patch_elf_32bit $@ -endif # Assemble assembly code $(BUILD_DIR)/%.o: %.s @@ -775,38 +650,25 @@ $(BUILD_DIR)/rsp/%.bin $(BUILD_DIR)/rsp/%_data.bin: rsp/%.s # Run linker script through the C preprocessor $(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) $(call print,Preprocessing linker script:,$<,$@) - $(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $< + $(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -DULTRA_BUILD_DIR=$(LIBULTRA_BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $< # Link libgoddard $(BUILD_DIR)/libgoddard.a: $(GODDARD_O_FILES) @$(PRINT) "$(GREEN)Linking libgoddard: $(BLUE)$@ $(NO_COL)\n" $(V)$(AR) rcs -o $@ $(GODDARD_O_FILES) -# Link libgcc -$(BUILD_DIR)/libgcc.a: $(LIBGCC_O_FILES) - @$(PRINT) "$(GREEN)Linking libgcc: $(BLUE)$@ $(NO_COL)\n" - $(V)$(AR) rcs -o $@ $(LIBGCC_O_FILES) - # Link SM64 ELF file -$(ELF): $(O_FILES) $(MIO0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) $(LIBULTRA_AR) $(BUILD_DIR)/libgoddard.a $(BUILD_DIR)/libgcc.a +$(ELF): $(LIBULTRA_BUILD_DIR)/libgultra_rom.a $(O_FILES) $(MIO0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) $(BUILD_DIR)/libgoddard.a @$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n" - $(V)$(LD) -L $(BUILD_DIR) -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -lultra -lgoddard -lgcc + $(V)$(LD) -L $(BUILD_DIR) -L $(LIBULTRA_BUILD_DIR) -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -lgultra_rom -lgoddard # Build ROM -ifeq ($(VERSION),cn) - PAD_TO_GAP_FILL := --pad-to=0x7B0000 --gap-fill=0x00 -else PAD_TO_GAP_FILL := --pad-to=0x800000 --gap-fill=0xFF -endif $(ROM): $(ELF) $(call print,Building ROM:,$<,$@) -ifeq ($(VERSION),cn) # cn has no checksums - $(V)$(OBJCOPY) $(PAD_TO_GAP_FILL) $< $(@) -O binary -else $(V)$(OBJCOPY) $(PAD_TO_GAP_FILL) $< $(@:.z64=.bin) -O binary $(V)$(N64CKSUM) $(@:.z64=.bin) $@ -endif $(BUILD_DIR)/$(TARGET).objdump: $(ELF) $(OBJDUMP) -D $< > $@ diff --git a/README.md b/README.md index 752486f3..d2bc5aee 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ This repository is a clean slate for basic enhancements built upon the *Super Ma ## Quick Start (for Ubuntu) -1. Install prerequisites: `sudo apt install -y binutils-mips-linux-gnu build-essential git pkgconf python3` +1. Install prerequisites: `sudo apt install -y build-essential git pkgconf python3 isl libgmp-dev libmpfr-dev libmpc-dev` 2. Clone the repo from within Linux: `git clone https://github.com/HackerN64/ultrasm64-2.git` -3. Place a Super Mario 64 ROM called `baserom..z64` into the project folder for asset extraction, where `VERSION` can be `jp`, `us`, `eu`, `sh`, or `cn`. +3. Place a Super Mario 64 ROM called `baserom..z64` into the project folder for asset extraction, where `VERSION` can be `jp`, `us`, `eu`, `sh`. 4. Run `make` to build. Specify the version through `make VERSION=`. Add `-j4` to improve build speed (hardware dependent). Ensure the repo path length does not exceed 255 characters. Long path names result in build errors. @@ -32,41 +32,43 @@ There are 3 steps to set up a working build. #### Step 1: Install dependencies The build system has the following package requirements: - * binutils-mips * pkgconf * python3 >= 3.6 +##### Required Packages + Dependency installation instructions for common Linux distros are provided below: -##### Debian / Ubuntu +###### Fedora / RHEL To install build dependencies: ``` -sudo apt install -y binutils-mips-linux-gnu build-essential git pkgconf python3 +sudo dnf group install -y development-tools +sudo dnf install -y python pkgconf isl-devel gmp-devel mpfr-devel libmpc-devel ``` +For SUSE users, please use `mpc-devel` in place of `libmpc-devel`. -##### Arch Linux +###### Debian / Ubuntu To install build dependencies: ``` -sudo pacman -S base-devel python +sudo apt install -y build-essential git pkgconf python3 isl libgmp-dev libmpfr-dev libmpc-dev ``` -Install the following AUR packages: -* [mips64-elf-binutils](https://aur.archlinux.org/packages/mips64-elf-binutils) (AUR) -##### Other Linux distributions +###### Arch Linux +To install build dependencies: +``` +sudo pacman -S base-devel python gcc gcc-libs libisl libmpc zstd lib32-gcc-libs glibc libmpc mpfr gmp +``` -Most modern Linux distributions should have equivalent packages to the other two listed above. -You may have to use a different version of GNU binutils. Listed below are fully compatible binutils -distributions with support in the makefile, and examples of distros that offer them: +##### Setup Hackerchain -* `mips64-elf-` (Arch AUR) -* `mips-linux-gnu-` (Ubuntu and other Debian-based distros) -* `mips64-linux-gnu-` (RHEL/CentOS/Fedora) - -You may also use [Docker](#docker-installation) to handle installing an image with minimal dependencies. +1. Download the Hackerchain setup script [here](https://gist.github.com/mountainflaw/820121d579b3d8e83194b69d9b287753). +2. Create a directory where you'd like to have the build process and build output take place. +3. After running and building Hackerchain, define the environment variable `HACKERCHAIN` in your shell's init file (`~/.bashrc` for Bash typically), have it point to the `bin` directory inside your directory for building Hackerchain. +4. Restart your terminal. #### Step 2: Copy baserom(s) for asset extraction -For each version (jp/us/eu/sh/cn) for which you want to build a ROM, put an existing ROM at +For each version (jp/us/eu/sh) for which you want to build a ROM, put an existing ROM at `./baserom..z64` for asset extraction. ##### Step 3: Build the ROM @@ -82,11 +84,10 @@ Resulting artifacts can be found in the `build` directory. The full list of configurable variables are listed below, with the default being the first listed: -* ``VERSION``: ``jp``, ``us``, ``eu``, ``sh``, ``cn`` +* ``VERSION``: ``jp``, ``us``, ``eu``, ``sh`` * ``GRUCODE``: ``f3d_old``, ``f3d_new``, ``f3dex``, ``f3dex2``, ``f3dzex`` * ``COMPARE``: ``1`` (compare ROM hash), ``0`` (do not compare ROM hash) * ``NON_MATCHING``: Use functionally equivalent C implementations for non-matchings. Also will avoid instances of undefined behavior. -* ``CROSS``: Cross-compiler tool prefix (Example: ``mips64-elf-``). ### macOS @@ -103,7 +104,7 @@ brew install coreutils make pkg-config tehzz/n64-dev/mips64-elf-binutils #### Step 2: Copy baserom(s) for asset extraction -For each version (jp/us/eu/sh/cn) for which you want to build a ROM, put an existing ROM at +For each version (jp/us/eu/sh) for which you want to build a ROM, put an existing ROM at `./baserom..z64` for asset extraction. ##### Step 3: Build the ROM diff --git a/asm/boot.s b/asm/boot.s index bd93ad74..a8ae046f 100644 --- a/asm/boot.s +++ b/asm/boot.s @@ -19,7 +19,11 @@ .equ INITIAL_DMA_LEN, (0x00100000 - 1) .equ INITIAL_DMA_ROMPOS, 0x1000 -#ifdef VERSION_CN +#if defined(VERSION_CN) && !defined(AVOID_UB) +#define BB_BOOT +#endif + +#ifdef BB_BOOT .macro cn_li a b li \a, \b .endm @@ -181,7 +185,7 @@ glabel ipl3_entry // 0xA4000040 bnez $t0, .LA4000168 nop .LA400025C: -#ifdef VERSION_CN +#ifdef BB_BOOT li $t0, 0xc0000000 #else li $t0, 0xc4000000 @@ -317,7 +321,7 @@ glabel ipl3_entry // 0xA4000040 bnez $at, .LA4000448 addiu $t0, $t0, 0x10 .LA4000458: -#ifdef VERSION_CN +#ifdef BB_BOOT la $t0, SP_DMEM_CN_UNK0 lui $t1, 0xf ori $t1, $t1, 0xffff @@ -437,7 +441,7 @@ glabel ipl3_entry // 0xA4000040 andi $t3, $t3, 0x1 bnez $t3, .LA4000514 nop -#ifdef VERSION_CN +#ifdef BB_BOOT nop nop nop @@ -503,7 +507,7 @@ glabel ipl3_entry // 0xA4000040 nop nop #endif -#ifdef VERSION_CN +#ifdef BB_BOOT lui $t1, %hi(PHYS_TO_K1(SP_PC_REG)) lw $t1, %lo(PHYS_TO_K1(SP_PC_REG))($t1) beqz $t1, .LA4000698 @@ -638,7 +642,7 @@ func_A4000690: sw $s7, 0x14($t0) #endif sw $s5, 0xc($t0) -#ifdef VERSION_CN +#ifdef BB_BOOT beqz $s3, .LA4000728 sw $s7, 0x14($t0) b .LA4000730 @@ -657,7 +661,7 @@ func_A4000690: sw $t1, 0x8($t0) cn_li $t0, PHYS_TO_K1(SP_DMEM_START) addi $t1, $t0, 0x1000 -#ifdef VERSION_CN +#ifdef BB_BOOT .LA4000710: sw $zero, ($t0) addiu $t0, $t0, 4 @@ -671,7 +675,7 @@ func_A4000690: #endif cn_li $t0, PHYS_TO_K1(SP_IMEM_START) addi $t1, $t0, 0x1000 -#ifdef VERSION_CN +#ifdef BB_BOOT .LA400072C: sw $zero, ($t0) addiu $t0, $t0, 4 @@ -691,7 +695,7 @@ func_A4000690: func_A4000778: addiu $sp, $sp, -0xa0 -#ifndef VERSION_CN +#ifndef BB_BOOT sw $s0, 0x40($sp) sw $s1, 0x44($sp) move $s1, $zero @@ -713,7 +717,7 @@ func_A4000778: sw $t7, 0x34($sp) sw $t8, 0x38($sp) sw $t9, 0x3c($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT sw $s0, 0x40($sp) sw $s1, 0x44($sp) #endif @@ -725,7 +729,7 @@ func_A4000778: sw $s7, 0x5c($sp) sw $fp, 0x60($sp) sw $ra, 0x64($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT move $s0, $zero move $s1, $zero #endif @@ -733,12 +737,12 @@ func_A4000778: jal func_A4000880 nop addiu $s0, $s0, 1 -#ifdef VERSION_CN +#ifdef BB_BOOT addu $s1, $s1, $v0 #endif slti $t1, $s0, 4 bnez $t1, .LA40007EC -#ifdef VERSION_CN +#ifdef BB_BOOT nop #else addu $s1, $s1, $v0 @@ -746,7 +750,7 @@ func_A4000778: srl $a0, $s1, 2 jal func_A4000A40 li $a1, 1 -#ifdef VERSION_CN +#ifdef BB_BOOT srl $v0, $s1, 2 #else lw $ra, 0x64($sp) @@ -769,7 +773,7 @@ func_A4000778: lw $t8, 0x38($sp) lw $t9, 0x3c($sp) lw $s0, 0x40($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT lw $s1, 0x44($sp) #endif lw $s2, 0x48($sp) @@ -779,7 +783,7 @@ func_A4000778: lw $s6, 0x58($sp) lw $s7, 0x5c($sp) lw $fp, 0x60($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT lw $ra, 0x64($sp) #endif jr $ra @@ -793,7 +797,7 @@ func_A4000880: move $t4, $zero .LA4000894: slti $k0, $t4, 0x40 -#ifdef VERSION_CN +#ifdef BB_BOOT beqz $k0, .LA40008D4 nop #else @@ -802,7 +806,7 @@ func_A4000880: #endif jal func_A400090C move $a0, $t4 -#ifdef VERSION_CN +#ifdef BB_BOOT blez $v0, .LA40008CC nop #else @@ -811,24 +815,24 @@ func_A4000880: #endif subu $k0, $v0, $t1 multu $k0, $t4 -#ifndef VERSION_CN +#ifndef BB_BOOT move $t1, $v0 #endif mflo $k0 addu $t3, $t3, $k0 -#ifdef VERSION_CN +#ifdef BB_BOOT move $t1, $v0 #else nop slti $k0, $t1, 0x50 #endif .LA40008CC: -#ifdef VERSION_CN +#ifdef BB_BOOT addiu $t4, $t4, 1 slti $k0, $t1, 0x50 #endif bnez $k0, .LA4000894 -#ifdef VERSION_CN +#ifdef BB_BOOT nop #else addiu $t4, $t4, 1 @@ -840,7 +844,7 @@ func_A4000880: sll $a0, $a0, 1 jal func_A4000980 addiu $a0, $a0, -0x370 -#ifdef VERSION_CN +#ifdef BB_BOOT b .LA40008FC nop .LA40008D4: @@ -853,7 +857,7 @@ func_A4000880: .LA40008FC: lw $ra, 0x1c($sp) .LA4000900: -#ifdef VERSION_CN +#ifdef BB_BOOT jr $ra addiu $sp, $sp, 0x20 #else @@ -871,7 +875,7 @@ func_A400090C: move $fp, $zero .LA40008FC_cn: li $k0, -1 -#ifdef VERSION_CN +#ifdef BB_BOOT sw $k0, ($s4) sw $k0, ($s4) sw $k0, 4($s4) @@ -889,7 +893,7 @@ func_A400090C: #endif .LA4000940: andi $k0, $v1, 1 -#ifdef VERSION_CN +#ifdef BB_BOOT beqz $k0, .LA4000928_cn nop #else @@ -897,7 +901,7 @@ func_A400090C: addiu $gp, $gp, 1 #endif addiu $v0, $v0, 1 -#ifdef VERSION_CN +#ifdef BB_BOOT .LA4000928_cn: srl $v1, $v1, 1 #endif @@ -905,14 +909,14 @@ func_A400090C: .LA4000954: slti $k0, $gp, 8 bnez $k0, .LA4000940 -#ifdef VERSION_CN +#ifdef BB_BOOT nop #else srl $v1, $v1, 1 #endif addiu $fp, $fp, 1 slti $k0, $fp, 0xa -#ifdef VERSION_CN +#ifdef BB_BOOT bnez $k0, .LA40008FC_cn nop lw $ra, 0x1c($sp) @@ -931,22 +935,22 @@ func_A4000980: addiu $sp, $sp, -0x28 sw $ra, 0x1c($sp) sw $a0, 0x20($sp) -#ifndef VERSION_CN +#ifndef BB_BOOT sb $zero, 0x27($sp) #endif move $t0, $zero move $t2, $zero li $t5, 51200 -#ifdef VERSION_CN +#ifdef BB_BOOT sb $zero, 0x27($sp) #endif move $t6, $zero -#ifdef VERSION_CN +#ifdef BB_BOOT .LA4000978: #endif slti $k0, $t6, 0x40 .LA40009A4: -#ifdef VERSION_CN +#ifdef BB_BOOT bnez $k0, .LA400098C_cn nop #else @@ -955,11 +959,11 @@ func_A4000980: #endif b .LA4000A30 move $v0, $zero -#ifdef VERSION_CN +#ifdef BB_BOOT .LA400098C_cn: #endif move $a0, $t6 -#ifndef VERSION_CN +#ifndef BB_BOOT .LA40009B8: #endif jal func_A4000A40 @@ -970,7 +974,7 @@ func_A4000980: addiu $a0, $sp, 0x27 lbu $k0, 0x27($sp) li $k1, 800 -#ifdef VERSION_CN +#ifdef BB_BOOT multu $k0, $k1 mflo $t0 lw $a0, 0x20($sp) @@ -1035,7 +1039,7 @@ func_A4000980: func_A4000A40: addiu $sp, $sp, -0x28 -#ifdef VERSION_CN +#ifdef BB_BOOT sw $ra, 0x1c($sp) lui $t7, 0x4200 andi $a0, $a0, 0xff @@ -1072,7 +1076,7 @@ func_A4000A40: andi $k0, $a0, 0x20 sll $k0, $k0, 0x12 or $t7, $t7, $k0 -#ifdef VERSION_CN +#ifdef BB_BOOT sw $t7, ($s5) li $k1, 1 bne $a1, $k1, .LA4000AC0 @@ -1086,7 +1090,7 @@ func_A4000A40: sw $zero, %lo(PHYS_TO_K1(MI_BASE_REG))($k0) .LA4000AC0: lw $ra, 0x1c($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT jr $ra addiu $sp, $sp, 0x28 #else @@ -1098,25 +1102,25 @@ func_A4000A40: func_A4000AD0: addiu $sp, $sp, -0x28 sw $ra, 0x1c($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT move $fp, $zero #endif li $k0, 0x2000 lui $k1, %hi(PHYS_TO_K1(MI_BASE_REG)) sw $k0, %lo(PHYS_TO_K1(MI_BASE_REG))($k1) -#ifndef VERSION_CN +#ifndef BB_BOOT move $fp, $zero #endif lw $fp, ($s5) li $k0, 0x1000 sw $k0, %lo(PHYS_TO_K1(MI_BASE_REG))($k1) -#ifdef VERSION_CN +#ifdef BB_BOOT move $k0, $zero #endif li $k1, 0x40 and $k1, $k1, $fp srl $k1, $k1, 6 -#ifndef VERSION_CN +#ifndef BB_BOOT move $k0, $zero #endif or $k0, $k0, $k1 @@ -1142,7 +1146,7 @@ func_A4000AD0: or $k0, $k0, $k1 sb $k0, ($a0) lw $ra, 0x1c($sp) -#ifdef VERSION_CN +#ifdef BB_BOOT jr $ra addiu $sp, $sp, 0x28 .fill 0x30 diff --git a/asm/rom_header.s b/asm/rom_header.s index 82dd3b3b..feb84d7e 100644 --- a/asm/rom_header.s +++ b/asm/rom_header.s @@ -10,7 +10,7 @@ /* Revision */ .half 0x0000 .byte 20 /* Major version 2.0 */ -.ascii LIBULTRA_STR_VER /* Minor Version */ +.ascii "L" /* Minor Version */ #ifdef VERSION_CN .fill 0x30 diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 00000000..2b970d34 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,26 @@ +-Iinclude/n64 +-Iinclude +-Itextures +-Ibuild/us_n64 +-Isrc + + +-include include/types.h +-include include/n64/ultra64.h +-include include/sm64.h +-include include/config.h +-include include/make_const_nonconst.h +-include include/geo_commands.h +-include include/level_commands.h +-include include/segment_symbols.h +-include include/command_macros_base.h +-include include/object_constants.h + + +-DTARGET_N64=1 +-DVERSION_US=1 +-DF3DEX_GBI_2=1 +-DF3DZEX_NON_GBI_2=1 +-DF3DEX_GBI_SHARED=1 +-D_LANGUAGE_C=1 +-DLIBULTRA_VERSION=OS_VER_K diff --git a/extract_assets.py b/extract_assets.py index b09d26c9..bbb1f345 100755 --- a/extract_assets.py +++ b/extract_assets.py @@ -38,6 +38,8 @@ def asset_needs_update(asset, version): def remove_file(fname): + if fname == "textures/crash_screen/crash_screen_font.ia1.png": # Preserve crash screen font + return os.remove(fname) print("deleting", fname) try: diff --git a/include/ld.h b/include/ld.h new file mode 100644 index 00000000..151eeeb4 --- /dev/null +++ b/include/ld.h @@ -0,0 +1,79 @@ +#pragma once + +#ifndef USE_EXT_RAM +#define ADDR_OR_ALIGN(addr) (addr) +#else +#define ADDR_OR_ALIGN(addr) ALIGN(0x1000) +#endif + +#if defined(VERSION_US) || defined(VERSION_JP) +#define AUDIO_DIR BUILD_DIR/src/audio/us_jp +#elif defined(VERSION_EU) +#define AUDIO_DIR BUILD_DIR/src/audio/eu +#elif defined(VERSION_SH) || defined(VERSION_CN) +#define AUDIO_DIR BUILD_DIR/src/audio/sh +#endif + +#define BEGIN_SEG(name, addr) \ + _##name##SegmentStart = ADDR(.name); \ + _##name##SegmentRomStart = __romPos; \ + .name (addr) : AT(__romPos) + +#define END_SEG(name) \ + _##name##SegmentEnd = ADDR(.name) + SIZEOF(.name); \ + _##name##SegmentRomEnd = __romPos + SIZEOF(.name); \ + __romPos += SIZEOF(.name); + +#define BEGIN_NOLOAD(name) \ + _##name##SegmentNoloadStart = ADDR(.name.noload); \ + .name.noload (NOLOAD) : + +#define END_NOLOAD(name) \ + _##name##SegmentNoloadEnd = ADDR(.name.noload) + SIZEOF(.name.noload); + +#define MIO0_SEG(name, segAddr) \ + BEGIN_SEG(name##_mio0, segAddr) \ + { \ + BUILD_DIR/bin/name.mio0.o(.data); \ + . = ALIGN(0x10); \ + } \ + END_SEG(name##_mio0) + +#define MIO0_EU_SEG(name, segAddr) \ + BEGIN_SEG(name##_mio0, segAddr) \ + { \ + BUILD_DIR/bin/eu/name.mio0.o(.data); \ + . = ALIGN(0x10); \ + } \ + END_SEG(name##_mio0) + +#define STANDARD_LEVEL(name) \ + BEGIN_SEG(name##_segment_7, 0x07000000) \ + { \ + BUILD_DIR/levels/name/leveldata.mio0.o(.data); \ + . = ALIGN(0x10); \ + } \ + END_SEG(name##_segment_7) \ + BEGIN_SEG(name, 0x0E000000) \ + { \ + BUILD_DIR/levels/name/script.o(.data); \ + BUILD_DIR/levels/name/geo.o(.data); \ + } \ + END_SEG(name) + +#define STANDARD_OBJECTS(name, segAddr, geoAddr) \ + BEGIN_SEG(name##_mio0, segAddr) \ + { \ + BUILD_DIR/actors/name.mio0.o(.data); \ + . = ALIGN(0x10); \ + } \ + END_SEG(name##_mio0) \ + BEGIN_SEG(name##_geo, geoAddr) \ + { \ + BUILD_DIR/actors/name##_geo.o(.data); \ + } \ + END_SEG(name##_geo) + +#define CREATE_LO_HI_PAIR(name, value) \ + name##Hi = (value) >> 16; \ + name##Lo = (value) & 0xffff; diff --git a/include/macros.h b/include/macros.h index 803fc6c1..918716f9 100644 --- a/include/macros.h +++ b/include/macros.h @@ -12,10 +12,6 @@ // Since we are using both compilers to match iQue, ignore these errors. #ifndef EGCS_GCC -#ifndef __sgi -#define GLOBAL_ASM(...) -#endif - #if !defined(__sgi) && (!defined(NON_MATCHING) || !defined(AVOID_UB)) // asm-process isn't supported outside of IDO, and undefined behavior causes crashes. #error Matching build is only possible on IDO; please build with NON_MATCHING=1. diff --git a/include/segment_symbols.h b/include/segment_symbols.h index 73cdd7e1..81a7a2c3 100644 --- a/include/segment_symbols.h +++ b/include/segment_symbols.h @@ -40,14 +40,14 @@ DECLARE_SEGMENT(engine) DECLARE_SEGMENT(behavior) DECLARE_SEGMENT(scripts) DECLARE_SEGMENT(goddard) +DECLARE_SEGMENT(framebuffers) extern u8 _goddardSegmentStart[]; -#ifdef USE_EXT_RAM extern u8 _engineSegmentStart[]; -extern u8 _framebuffersSegmentNoloadStart[]; +extern u8 _engineSegmentNoloadEnd[]; +extern u8 _engineSegmentEnd[]; extern u8 _framebuffersSegmentNoloadEnd[]; -#endif DECLARE_LEVEL_SEGMENT(menu) DECLARE_LEVEL_SEGMENT(intro) diff --git a/include/segments.h b/include/segments.h index 6c1be3d7..d048fe18 100644 --- a/include/segments.h +++ b/include/segments.h @@ -1,7 +1,9 @@ #ifndef SEGMENTS_H #define SEGMENTS_H -#include "config.h" +#ifndef _LD +#include "segment_symbols.h" +#endif /* * Memory addresses for segments. Ideally, this header file would not be @@ -13,50 +15,17 @@ * linker script syntax. */ -#define SEG_START 0x8005C000 +#define USE_EXT_RAM // Undefine this to set a strict 4MB limit. -#define SEG_FRAMEBUFFERS_SIZE (2 * SCREEN_WIDTH * SCREEN_HEIGHT * 3) -#define SEG_GODDARD_POOL_OFFSET 0x52000 // Offset from right side of pool -#define SEG_GODDARD (SEG_POOL_END - SEG_GODDARD_POOL_OFFSET) - -#ifndef USE_EXT_RAM /* Default: Runs out of memory quickly when importing custom assets. */ - -#define SEG_RAM_END 0x80400000 - -#define SEG_POOL_START SEG_START -#define SEG_POOL_SIZE 0x165000 -#define SEG_POOL_END (SEG_POOL_START + SEG_POOL_SIZE) - -#define SEG_BUFFERS SEG_POOL_END - -#ifdef VERSION_EU -#define SEG_ENGINE 0x8036FF00 +#ifndef USE_EXT_RAM +#define RAM_END 0x80400000 #else -#define SEG_ENGINE 0x80378800 +#define RAM_END 0x80800000 #endif #define SEG_FRAMEBUFFERS (SEG_RAM_END - SEG_FRAMEBUFFERS_SIZE) - -#else /* Use Expansion Pak space for pool. */ - -/* - * Workaround for running out of pool space due to - * importing large custom content. - */ - -#ifdef VERSION_CN -#define SEG_RAM_END 0x807C0000 // iQue has stuff like EEPROM mapped at 807C0000 onwards. TODO: Code this using osMemSize -#else -#define SEG_RAM_END 0x80800000 -#endif - -#define SEG_BUFFERS SEG_START -#define SEG_ENGINE ((u32) &_engineSegmentStart) -#define SEG_FRAMEBUFFERS ((u32) &_framebuffersSegmentNoloadStart) -#define SEG_POOL_START ((u32) &_framebuffersSegmentNoloadEnd) -#define SEG_POOL_END SEG_RAM_END -#define SEG_POOL_END_4MB 0x80400000 // For the error message screen enhancement. - -#endif +#define SEG_POOL_START _framebuffersSegmentNoloadEnd // 0x0165000 in size +#define SEG_GODDARD SEG_POOL_START + 0x113000 +#define POOL_SIZE RAM_END - SEG_POOL_START #endif // SEGMENTS_H diff --git a/tools/ido-static-recomp/.clang-format b/lib/hackerlibultra/.clang-format similarity index 64% rename from tools/ido-static-recomp/.clang-format rename to lib/hackerlibultra/.clang-format index c7b900f0..180d2723 100644 --- a/tools/ido-static-recomp/.clang-format +++ b/lib/hackerlibultra/.clang-format @@ -1,23 +1,19 @@ IndentWidth: 4 Language: Cpp -UseTab: Never +AlignAfterOpenBracket: Align +SortIncludes: false ColumnLimit: 120 PointerAlignment: Left -BreakBeforeBraces: Attach -SpaceAfterCStyleCast: false -Cpp11BracedListStyle: false -IndentCaseLabels: true +AllowShortFunctionsOnASingleLine: false +AllowShortIfStatementsOnASingleLine: false +AlignConsecutiveMacros: true BinPackArguments: true BinPackParameters: true -AlignAfterOpenBracket: Align -AlignOperands: true +BreakBeforeBraces: Attach BreakBeforeTernaryOperators: true -BreakBeforeBinaryOperators: None -AllowShortBlocksOnASingleLine: true -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: false -AlignEscapedNewlines: Left +BreakBeforeBinaryOperators: NonAssignment +Cpp11BracedListStyle: false +IndentCaseLabels: true AlignTrailingComments: true -SortIncludes: false +AlignConsecutiveBitFields: true +UseTab: Never diff --git a/lib/hackerlibultra/.github/workflows/ci_gcc.yml b/lib/hackerlibultra/.github/workflows/ci_gcc.yml new file mode 100644 index 00000000..a50d7799 --- /dev/null +++ b/lib/hackerlibultra/.github/workflows/ci_gcc.yml @@ -0,0 +1,35 @@ +# CI file for GCC builds + +name: Build GCC libgultra + +# Build on every branch push, tag push, and pull request change: +on: [push, pull_request_target] + +jobs: + build_repo: + name: Build repo + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + version: [L] # [H, I, I_patch, J, K, L] + suffix: [~, _d, _rom] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Install package requirements + run: sudo apt-get install -y clang-tools clang-format clang-tidy gcc-mips-linux-gnu binutils-mips-linux-gnu build-essential python3 + + - name: Verify formatting on all files + run: python3 tools/check_format.py --verbose + + - name: Setup + run: make setup -j $(nproc) TARGET=libgultra${{ matrix.suffix }} VERSION=${{ matrix.version }} + + - name: Build libgultra${{ matrix.suffix }} ${{ matrix.version }} + run: make -j $(nproc) TARGET=libgultra${{ matrix.suffix }} VERSION=${{ matrix.version }} diff --git a/lib/hackerlibultra/.gitignore b/lib/hackerlibultra/.gitignore new file mode 100644 index 00000000..1193e995 --- /dev/null +++ b/lib/hackerlibultra/.gitignore @@ -0,0 +1,29 @@ +# Cache files +__pycache__/ +.pyc +.DS_Store + +# Text editor remnants +.vscode/ +.vs/ +.idea/ +CMakeLists.txt +cmake-build-debug +venv/ +.venv + +# Project-specific ignores +base_*/ +build/ +expected/ +notes/ +tools/gcc +tools/ido +*.elf +*.o +*.a + +# Tool artifacts +ctx.c + +libultra_collection/ diff --git a/lib/hackerlibultra/.gitrepo b/lib/hackerlibultra/.gitrepo new file mode 100644 index 00000000..94ad2edc --- /dev/null +++ b/lib/hackerlibultra/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = https://github.com/HackerN64/hackerlibultra + branch = main + commit = 08e84e89acc16e3ec5d1614e6e7c6bf6f218f2c1 + parent = 1afde17e882b1928371bf032dccfd418c7b615b9 + method = merge + cmdver = 0.4.9 diff --git a/lib/hackerlibultra/CODEOWNERS b/lib/hackerlibultra/CODEOWNERS new file mode 100644 index 00000000..a1c01d61 --- /dev/null +++ b/lib/hackerlibultra/CODEOWNERS @@ -0,0 +1,11 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# These owners will be the default owners for everything in the repo. +* @someone2639 @Thar0 @gheskett + +# Order is important. The last matching pattern has the most precedence. +# So if a pull request only touches javascript files, only these owners +# will be requested to review. + +# You can also use email addresses if you prefer. diff --git a/lib/hackerlibultra/Makefile b/lib/hackerlibultra/Makefile new file mode 100644 index 00000000..c6664a2f --- /dev/null +++ b/lib/hackerlibultra/Makefile @@ -0,0 +1,118 @@ +# One of: +# libgultra_rom, libgultra_d, libgultra +# libultra_rom, libultra_d, libultra +TARGET ?= libgultra_rom +VERSION ?= L +VERBOSE ?= 0 + +include util.mk + +ifeq ($(VERBOSE), 0) +V=@ +else +V= +endif +# detect hackerchain +ifneq ($(call find-command, $(HACKERCHAIN)/mips64-elf-ld),) + CROSS := $(HACKERCHAIN)/mips64-elf- +else + $(error Unable to detect a hackerchain toolchain installation.) +endif + +BUILD_ROOT := build +BUILD_DIR := $(BUILD_ROOT)/$(VERSION)/$(TARGET) +BUILD_AR := $(BUILD_DIR)/$(TARGET).a + +WORKING_DIR := $(shell pwd) + +CPP := cpp -P +AR := $(CROSS)ar + +VERSION_DEFINE := -DBUILD_VERSION=VERSION_$(VERSION) -DBUILD_VERSION_STRING=\"2.0$(VERSION)\" + +ifeq ($(findstring _d,$(TARGET)),_d) +DEBUGFLAG := -D_DEBUG +else +DEBUGFLAG := -DNDEBUG +endif + +AS := $(CROSS)gcc -x assembler-with-cpp +CC := $(CROSS)gcc + +WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable -Wno-builtin-declaration-mismatch +WARNINGS += -Wno-int-conversion -Wno-incompatible-pointer-types -Wno-implicit-function-declaration # TODO: Try adjusting code to remove these +CFLAGS := -G 0 -c -nostdinc -march=vr4300 -mfix4300 -mabi=32 -mno-abicalls -mdivide-breaks -fno-PIC -fno-common -ffreestanding -fbuiltin -fno-builtin-sinf -fno-builtin-cosf -funsigned-char $(WARNINGS) +CFLAGS += -fno-strict-aliasing # TODO: Try adjusting code to remove this +ASFLAGS := -w -nostdinc -c -G 0 -march=vr4300 -mabi=32 -mgp32 -mfp32 -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_MIPS_SIM=1 -D_ULTRA64 +CPPFLAGS = -DMODERN_CC -D_MIPS_SZLONG=32 -D__USE_ISOC99 $(GBIDEFINE) $(VERSION_DEFINE) $(DEBUGFLAG) +IINC = -I . -I $(WORKING_DIR)/include -I $(WORKING_DIR)/include/compiler/modern_gcc -I $(WORKING_DIR)/include/PR +MIPS_VERSION := -mips3 +ASOPTFLAGS := + +ifeq ($(findstring _d,$(TARGET)),_d) +OPTFLAGS := -Og -ggdb3 -ffast-math -fno-unsafe-math-optimizations +else +OPTFLAGS := -Os -ggdb3 -ffast-math -fno-unsafe-math-optimizations +endif + +ifeq ($(findstring _rom,$(TARGET)),_rom) +CPPFLAGS += -D_FINALROM +endif + +SRC_DIRS := $(shell find src -type d) +C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) +S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s)) + +# Versions J and below used the C matrix math implementations +MGU_MATRIX_FILES := mtxcatf normalize scale translate +ifneq ($(filter $(VERSION),D E F G H I J),) +S_FILES := $(filter-out $(addprefix src/mgu/,$(MGU_MATRIX_FILES:=.s)),$(S_FILES)) +else +C_FILES := $(filter-out $(addprefix src/gu/,$(MGU_MATRIX_FILES:=.c)),$(C_FILES)) +endif + +C_O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) +S_O_FILES := $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) +O_FILES := $(S_O_FILES) $(C_O_FILES) + +AR_OBJECTS := $(shell cat base/$(VERSION)/$(TARGET).txt) + +$(shell mkdir -p src $(foreach dir,$(SRC_DIRS),$(BUILD_DIR)/$(dir))) + +.PHONY: all clean distclean setup +all: $(BUILD_AR) + +$(BUILD_AR): $(O_FILES) + @printf " [AR] $@\n" + $(V)$(AR) rcs $@ $^ + +clean: + $(RM) -rf $(BUILD_DIR) + +distclean: + $(RM) -rf extracted/ $(BUILD_ROOT) + +GBIDEFINE := -DF3DEX_GBI + +$(BUILD_DIR)/src/gu/parse_gbi.o: GBIDEFINE := -DF3D_GBI +$(BUILD_DIR)/src/gu/us2dex_emu.o: GBIDEFINE := +$(BUILD_DIR)/src/gu/us2dex2_emu.o: GBIDEFINE := +$(BUILD_DIR)/src/sp/sprite.o: GBIDEFINE := -DF3D_GBI +$(BUILD_DIR)/src/sp/spriteex.o: GBIDEFINE := +$(BUILD_DIR)/src/sp/spriteex2.o: GBIDEFINE := +$(BUILD_DIR)/src/voice/%.o: OPTFLAGS += -DLANG_JAPANESE -I$(WORKING_DIR)/src -I$(WORKING_DIR)/src/voice +$(BUILD_DIR)/src/voice/%.o: CC := $(WORKING_DIR)/tools/compile_sjis.py -D__CC=$(CC) -D__BUILD_DIR=$(BUILD_DIR) + +$(BUILD_DIR)/%.o: %.c + @printf " [CC] $<\n" + $(V)$(CC) $(CFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(OPTFLAGS) $< $(IINC) -o $@ + $(V)tools/set_o32abi_bit.py $@ + +$(BUILD_DIR)/%.o: %.s + @printf " [AS] $<\n" + $(V)$(AS) $(ASFLAGS) $(MIPS_VERSION) $(CPPFLAGS) $(ASOPTFLAGS) $< $(IINC) -o $@ + $(V)tools/set_o32abi_bit.py $@ + +# Disable built-in rules +.SUFFIXES: +print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/lib/hackerlibultra/README.md b/lib/hackerlibultra/README.md new file mode 100644 index 00000000..8128718a --- /dev/null +++ b/lib/hackerlibultra/README.md @@ -0,0 +1,78 @@ +# ultralib + +Reverse engineering of libultra + +## Compatibility + +Currently this repo supports building the following versions: + +| IDO / GCC | `libultra.a` / `libgultra.a` | `libultra_d.a` / `libgultra_d.a` | `libultra_rom.a` / `libgultra_rom.a` | +| - | :-: | :-: | :-: | +| 2.0E | :x: / N/A | :x: / N/A | :x: / N/A | +| 2.0F | :x: / N/A | :x: / N/A | :x: / N/A | +| 2.0G | :x: / N/A | :x: / N/A | :x: / N/A | +| 2.0H | N/A / :x: | N/A / :x: | N/A / :x: | +| 2.0I | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: | +| 2.0I_patch | :x: / :x: | :x: / :x: | :x: / :x: | +| 2.0J | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: | +| 2.0K | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: | +| 2.0L | :heavy_check_mark: / :heavy_check_mark: | :x: / :heavy_check_mark: | :heavy_check_mark: / :heavy_check_mark: | +| ique_v1.5 | :x: | :x: | :x: | + +## Preparation + +After cloning the repo, put a copy of the target archive(s) in their correct version folder in `base/`. +For example, if your target archive is libgultra_rom.a 2.0L then you'd place it in `base/L/`. +If you will be building without a target archive by setting `COMPARE=0` then you can skip this step. + +## Build dependencies + +The build process requires the following packages: + +- build-essential +- python3 +- binutils-mips-linux-gnu (libultra* only) + +Under Debian / Ubunutu you can install them with the following commands: + +```bash +sudo apt update +sudo apt install build-essential python3 +``` + +If building any libultra you can install binutils-mips-linux-gnu with: + +```bash +sudo apt install binutils-mips-linux-gnu +``` + +## Building + +Run make setup with the proper flags set followed by make with optional jobs. +For example, if building the 2.0L PC archive you'd do the following: + +- `make VERSION=L TARGET=libgultra_rom setup` +- `make VERSION=L TARGET=libgultra_rom` + +Every target flag combination requires separate a setup command. + +If building without an target archive, than you can use `COMPARE=0` like the the following: + +- `make VERSION=L TARGET=libgultra_rom COMPARE=0 setup` +- `make VERSION=L TARGET=libgultra_rom COMPARE=0` + +note that running setup without `COMPARE=0` and no archive will result in an error, +and only needs to be run once instead of per target flag combination + +If building for use with modern linkers, than you can use `MODERN_LD=1` like the following: + +- `make VERSION=L TARGET=libgultra_rom MODERN_LD=1 setup` +- `make VERSION=L TARGET=libgultra_rom MODERN_LD=1` + +note that running with `MODERN_LD=1` will automatically set `COMPARE=0`. + +It is also possible to build archives using modern gcc by using `MODERN_GCC=1` like the following: + +- `make VERSION=L TARGET=libgultra_rom MODERN_GCC=1` + +note that running with `MODERN_GCC=1` will automatically set `COMPARE=0` and `MODERN_LD=0`. diff --git a/lib/hackerlibultra/base/I/libgultra.txt b/lib/hackerlibultra/base/I/libgultra.txt new file mode 100644 index 00000000..315e830f --- /dev/null +++ b/lib/hackerlibultra/base/I/libgultra.txt @@ -0,0 +1,404 @@ +gt.o +dumpturbo.o +sqrtf.o +libm_vals.o +align.o +cosf.o +coss.o +frustum.o +lookat.o +lookatref.o +lookathil.o +lookatstereo.o +mtxutil.o +mtxcatf.o +mtxcatl.o +normalize.o +ortho.o +perspective.o +rotate.o +rotaterpy.o +scale.o +sinf.o +sins.o +translate.o +loadtextureblockmipmap.o +guloadtile_bug.o +position.o +poslight.o +poslighthil.o +random.o +usprite.o +us2dex.o +us2dex_emu.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +exceptasm.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +getintmask.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +invaldcache.o +invalicache.o +interrupt.o +maptlb.o +parameters.o +probetlb.o +setintmask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +unmaptlb.o +unmaptlball.o +writebackdcache.o +writebackdcacheall.o +maptlbrdb.o +errorasm.o +assertbreak.o +atomic.o +createmesgqueue.o +createthread.o +destroythread.o +getactivequeue.o +getthreadid.o +getthreadpri.o +gettime.o +initialize.o +jammesg.o +kdebugserver.o +physicaltovirtual.o +recvmesg.o +resetglobalintmask.o +sendmesg.o +seteventmesg.o +setglobalintmask.o +sethwinterrupt.o +setthreadpri.o +settime.o +settimer.o +startthread.o +stopthread.o +stoptimer.o +syncputchars.o +thread.o +timerintr.o +virtualtophysical.o +yieldthread.o +getcurrfaultthread.o +getnextfaultthread.o +initrdb.o +rdbsend.o +getmemsize.o +error.o +seterrorhandler.o +assert.o +exit.o +profile.o +readhost.o +testhost.o +writehost.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +color.o +clearattribute.o +hide.o +spscale.o +setattribute.o +show.o +sprite.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +crc.o +contramread.o +contramwrite.o +contpfs.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +motor.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +leodiskinit.o +leointerrupt.o +driverominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +giorawinterrupt.o +giointerrupt.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +sched.o diff --git a/lib/hackerlibultra/base/I/libgultra_d.txt b/lib/hackerlibultra/base/I/libgultra_d.txt new file mode 100644 index 00000000..315e830f --- /dev/null +++ b/lib/hackerlibultra/base/I/libgultra_d.txt @@ -0,0 +1,404 @@ +gt.o +dumpturbo.o +sqrtf.o +libm_vals.o +align.o +cosf.o +coss.o +frustum.o +lookat.o +lookatref.o +lookathil.o +lookatstereo.o +mtxutil.o +mtxcatf.o +mtxcatl.o +normalize.o +ortho.o +perspective.o +rotate.o +rotaterpy.o +scale.o +sinf.o +sins.o +translate.o +loadtextureblockmipmap.o +guloadtile_bug.o +position.o +poslight.o +poslighthil.o +random.o +usprite.o +us2dex.o +us2dex_emu.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +exceptasm.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +getintmask.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +invaldcache.o +invalicache.o +interrupt.o +maptlb.o +parameters.o +probetlb.o +setintmask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +unmaptlb.o +unmaptlball.o +writebackdcache.o +writebackdcacheall.o +maptlbrdb.o +errorasm.o +assertbreak.o +atomic.o +createmesgqueue.o +createthread.o +destroythread.o +getactivequeue.o +getthreadid.o +getthreadpri.o +gettime.o +initialize.o +jammesg.o +kdebugserver.o +physicaltovirtual.o +recvmesg.o +resetglobalintmask.o +sendmesg.o +seteventmesg.o +setglobalintmask.o +sethwinterrupt.o +setthreadpri.o +settime.o +settimer.o +startthread.o +stopthread.o +stoptimer.o +syncputchars.o +thread.o +timerintr.o +virtualtophysical.o +yieldthread.o +getcurrfaultthread.o +getnextfaultthread.o +initrdb.o +rdbsend.o +getmemsize.o +error.o +seterrorhandler.o +assert.o +exit.o +profile.o +readhost.o +testhost.o +writehost.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +color.o +clearattribute.o +hide.o +spscale.o +setattribute.o +show.o +sprite.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +crc.o +contramread.o +contramwrite.o +contpfs.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +motor.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +leodiskinit.o +leointerrupt.o +driverominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +giorawinterrupt.o +giointerrupt.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +sched.o diff --git a/lib/hackerlibultra/base/I/libgultra_rom.txt b/lib/hackerlibultra/base/I/libgultra_rom.txt new file mode 100644 index 00000000..315e830f --- /dev/null +++ b/lib/hackerlibultra/base/I/libgultra_rom.txt @@ -0,0 +1,404 @@ +gt.o +dumpturbo.o +sqrtf.o +libm_vals.o +align.o +cosf.o +coss.o +frustum.o +lookat.o +lookatref.o +lookathil.o +lookatstereo.o +mtxutil.o +mtxcatf.o +mtxcatl.o +normalize.o +ortho.o +perspective.o +rotate.o +rotaterpy.o +scale.o +sinf.o +sins.o +translate.o +loadtextureblockmipmap.o +guloadtile_bug.o +position.o +poslight.o +poslighthil.o +random.o +usprite.o +us2dex.o +us2dex_emu.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +exceptasm.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +getintmask.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +invaldcache.o +invalicache.o +interrupt.o +maptlb.o +parameters.o +probetlb.o +setintmask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +unmaptlb.o +unmaptlball.o +writebackdcache.o +writebackdcacheall.o +maptlbrdb.o +errorasm.o +assertbreak.o +atomic.o +createmesgqueue.o +createthread.o +destroythread.o +getactivequeue.o +getthreadid.o +getthreadpri.o +gettime.o +initialize.o +jammesg.o +kdebugserver.o +physicaltovirtual.o +recvmesg.o +resetglobalintmask.o +sendmesg.o +seteventmesg.o +setglobalintmask.o +sethwinterrupt.o +setthreadpri.o +settime.o +settimer.o +startthread.o +stopthread.o +stoptimer.o +syncputchars.o +thread.o +timerintr.o +virtualtophysical.o +yieldthread.o +getcurrfaultthread.o +getnextfaultthread.o +initrdb.o +rdbsend.o +getmemsize.o +error.o +seterrorhandler.o +assert.o +exit.o +profile.o +readhost.o +testhost.o +writehost.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +color.o +clearattribute.o +hide.o +spscale.o +setattribute.o +show.o +sprite.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +crc.o +contramread.o +contramwrite.o +contpfs.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +motor.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +leodiskinit.o +leointerrupt.o +driverominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +giorawinterrupt.o +giointerrupt.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +sched.o diff --git a/lib/hackerlibultra/base/I/libultra.txt b/lib/hackerlibultra/base/I/libultra.txt new file mode 100644 index 00000000..bb176319 --- /dev/null +++ b/lib/hackerlibultra/base/I/libultra.txt @@ -0,0 +1,400 @@ +gt.o +dumpturbo.o +sqrtf.o +libm_vals.o +align.o +cosf.o +coss.o +frustum.o +lookat.o +lookatref.o +lookathil.o +lookatstereo.o +mtxutil.o +mtxcatf.o +mtxcatl.o +normalize.o +ortho.o +perspective.o +rotate.o +rotateRPY.o +scale.o +sinf.o +sins.o +translate.o +loadtextureblockmipmap.o +guLoadTile_bug.o +position.o +poslight.o +poslighthil.o +random.o +usprite.o +us2dex.o +us2dex_emu.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +exceptasm.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +getintmask.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +invaldcache.o +invalicache.o +interrupt.o +maptlb.o +parameters.o +probetlb.o +setintmask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +unmaptlb.o +unmaptlball.o +writebackdcache.o +writebackdcacheall.o +maptlbrdb.o +assertbreak.o +atomic.o +createmesgqueue.o +createthread.o +destroythread.o +getactivequeue.o +getthreadid.o +getthreadpri.o +gettime.o +initialize.o +jammesg.o +kdebugserver.o +physicaltovirtual.o +recvmesg.o +resetglobalintmask.o +sendmesg.o +seteventmesg.o +setglobalintmask.o +sethwinterrupt.o +setthreadpri.o +settime.o +settimer.o +startthread.o +stopthread.o +stoptimer.o +syncputchars.o +thread.o +timerintr.o +virtualtophysical.o +yieldthread.o +getcurrfaultthread.o +getnextfaultthread.o +initrdb.o +rdbsend.o +getmemsize.o +exit.o +profile.o +readhost.o +testhost.o +writehost.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +color.o +clearattribute.o +hide.o +spscale.o +setattribute.o +show.o +sprite.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +crc.o +contramread.o +contramwrite.o +contpfs.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +motor.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +leodiskinit.o +leointerrupt.o +driverominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +giorawinterrupt.o +giointerrupt.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +sched.o diff --git a/lib/hackerlibultra/base/I/libultra_d.txt b/lib/hackerlibultra/base/I/libultra_d.txt new file mode 100644 index 00000000..934ef458 --- /dev/null +++ b/lib/hackerlibultra/base/I/libultra_d.txt @@ -0,0 +1,404 @@ +gt.o +dumpturbo.o +sqrtf.o +libm_vals.o +align.o +cosf.o +coss.o +frustum.o +lookat.o +lookatref.o +lookathil.o +lookatstereo.o +mtxutil.o +mtxcatf.o +mtxcatl.o +normalize.o +ortho.o +perspective.o +rotate.o +rotateRPY.o +scale.o +sinf.o +sins.o +translate.o +loadtextureblockmipmap.o +guLoadTile_bug.o +position.o +poslight.o +poslighthil.o +random.o +usprite.o +us2dex.o +us2dex_emu.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +exceptasm.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +getintmask.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +invaldcache.o +invalicache.o +interrupt.o +maptlb.o +parameters.o +probetlb.o +setintmask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +unmaptlb.o +unmaptlball.o +writebackdcache.o +writebackdcacheall.o +maptlbrdb.o +errorasm.o +assertbreak.o +atomic.o +createmesgqueue.o +createthread.o +destroythread.o +getactivequeue.o +getthreadid.o +getthreadpri.o +gettime.o +initialize.o +jammesg.o +kdebugserver.o +physicaltovirtual.o +recvmesg.o +resetglobalintmask.o +sendmesg.o +seteventmesg.o +setglobalintmask.o +sethwinterrupt.o +setthreadpri.o +settime.o +settimer.o +startthread.o +stopthread.o +stoptimer.o +syncputchars.o +thread.o +timerintr.o +virtualtophysical.o +yieldthread.o +getcurrfaultthread.o +getnextfaultthread.o +initrdb.o +rdbsend.o +getmemsize.o +error.o +seterrorhandler.o +assert.o +exit.o +profile.o +readhost.o +testhost.o +writehost.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +color.o +clearattribute.o +hide.o +spscale.o +setattribute.o +show.o +sprite.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +crc.o +contramread.o +contramwrite.o +contpfs.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +motor.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +leodiskinit.o +leointerrupt.o +driverominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +giorawinterrupt.o +giointerrupt.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +sched.o diff --git a/lib/hackerlibultra/base/I/libultra_rom.txt b/lib/hackerlibultra/base/I/libultra_rom.txt new file mode 100644 index 00000000..c879d125 --- /dev/null +++ b/lib/hackerlibultra/base/I/libultra_rom.txt @@ -0,0 +1,370 @@ +gt.o +sqrtf.o +libm_vals.o +align.o +cosf.o +coss.o +frustum.o +lookat.o +lookatref.o +lookathil.o +lookatstereo.o +mtxutil.o +mtxcatf.o +mtxcatl.o +normalize.o +ortho.o +perspective.o +rotate.o +rotateRPY.o +scale.o +sinf.o +sins.o +translate.o +loadtextureblockmipmap.o +guLoadTile_bug.o +position.o +poslight.o +poslighthil.o +random.o +usprite.o +us2dex.o +us2dex_emu.o +exceptasm.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +getintmask.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +invaldcache.o +invalicache.o +interrupt.o +maptlb.o +parameters.o +probetlb.o +setintmask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +unmaptlb.o +unmaptlball.o +writebackdcache.o +writebackdcacheall.o +maptlbrdb.o +atomic.o +createmesgqueue.o +createthread.o +destroythread.o +getactivequeue.o +getthreadid.o +getthreadpri.o +gettime.o +initialize.o +jammesg.o +kdebugserver.o +physicaltovirtual.o +recvmesg.o +resetglobalintmask.o +sendmesg.o +seteventmesg.o +setglobalintmask.o +sethwinterrupt.o +setthreadpri.o +settime.o +settimer.o +startthread.o +stopthread.o +stoptimer.o +syncputchars.o +thread.o +timerintr.o +virtualtophysical.o +yieldthread.o +getcurrfaultthread.o +getnextfaultthread.o +initrdb.o +rdbsend.o +getmemsize.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +color.o +clearattribute.o +hide.o +spscale.o +setattribute.o +show.o +sprite.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +crc.o +contramread.o +contramwrite.o +contpfs.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +motor.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +leodiskinit.o +leointerrupt.o +driverominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +sched.o diff --git a/lib/hackerlibultra/base/J/libgultra.txt b/lib/hackerlibultra/base/J/libgultra.txt new file mode 100644 index 00000000..575ae945 --- /dev/null +++ b/lib/hackerlibultra/base/J/libgultra.txt @@ -0,0 +1,446 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +profile.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +mtxcatf.o +mtxcatl.o +mtxutil.o +normalize.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotate.o +rotaterpy.o +scale.o +sinf.o +sins.o +translate.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +exit.o diff --git a/lib/hackerlibultra/base/J/libgultra_d.txt b/lib/hackerlibultra/base/J/libgultra_d.txt new file mode 100644 index 00000000..a25743ca --- /dev/null +++ b/lib/hackerlibultra/base/J/libgultra_d.txt @@ -0,0 +1,451 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +errorasm.o +getcurrfaultthread.o +getnextfaultthread.o +error.o +seterrorhandler.o +kmcprintf.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +mtxcatf.o +mtxcatl.o +mtxutil.o +normalize.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotate.o +rotaterpy.o +scale.o +sinf.o +sins.o +translate.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +exit.o diff --git a/lib/hackerlibultra/base/J/libgultra_rom.txt b/lib/hackerlibultra/base/J/libgultra_rom.txt new file mode 100644 index 00000000..7fcf23ee --- /dev/null +++ b/lib/hackerlibultra/base/J/libgultra_rom.txt @@ -0,0 +1,416 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +atomic.o +kdebugserver.o +syncputchars.o +gt.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +mtxcatf.o +mtxcatl.o +mtxutil.o +normalize.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotate.o +rotaterpy.o +scale.o +sinf.o +sins.o +translate.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +rdbsend.o +initrdb.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o diff --git a/lib/hackerlibultra/base/J/libultra.txt b/lib/hackerlibultra/base/J/libultra.txt new file mode 100644 index 00000000..ba8bbc29 --- /dev/null +++ b/lib/hackerlibultra/base/J/libultra.txt @@ -0,0 +1,446 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +profile.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +mtxcatf.o +mtxcatl.o +mtxutil.o +normalize.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotate.o +rotateRPY.o +scale.o +sinf.o +sins.o +translate.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +exit.o diff --git a/lib/hackerlibultra/base/J/libultra_d.txt b/lib/hackerlibultra/base/J/libultra_d.txt new file mode 100644 index 00000000..0b357b47 --- /dev/null +++ b/lib/hackerlibultra/base/J/libultra_d.txt @@ -0,0 +1,451 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +mtxcatf.o +mtxcatl.o +mtxutil.o +normalize.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotate.o +rotateRPY.o +scale.o +sinf.o +sins.o +translate.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +errorasm.o +getcurrfaultthread.o +getnextfaultthread.o +error.o +seterrorhandler.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +exit.o +kmcprintf.o diff --git a/lib/hackerlibultra/base/J/libultra_rom.txt b/lib/hackerlibultra/base/J/libultra_rom.txt new file mode 100644 index 00000000..73da3e30 --- /dev/null +++ b/lib/hackerlibultra/base/J/libultra_rom.txt @@ -0,0 +1,418 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +atomic.o +kdebugserver.o +syncputchars.o +giorawinterrupt.o +giointerrupt.o +gt.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +mtxcatf.o +mtxcatl.o +mtxutil.o +normalize.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotate.o +rotateRPY.o +scale.o +sinf.o +sins.o +translate.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +rdbsend.o +initrdb.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o diff --git a/lib/hackerlibultra/base/K/libgultra.txt b/lib/hackerlibultra/base/K/libgultra.txt new file mode 100644 index 00000000..78144873 --- /dev/null +++ b/lib/hackerlibultra/base/K/libgultra.txt @@ -0,0 +1,468 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotaterpy.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +initialize_isv.o +monutil.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/K/libgultra_d.txt b/lib/hackerlibultra/base/K/libgultra_d.txt new file mode 100644 index 00000000..0a78430d --- /dev/null +++ b/lib/hackerlibultra/base/K/libgultra_d.txt @@ -0,0 +1,471 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +errorasm.o +getcurrfaultthread.o +getnextfaultthread.o +seterrorhandler.o +commonerror.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotaterpy.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +initialize_isv.o +monutil.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/K/libgultra_rom.txt b/lib/hackerlibultra/base/K/libgultra_rom.txt new file mode 100644 index 00000000..67e702ea --- /dev/null +++ b/lib/hackerlibultra/base/K/libgultra_rom.txt @@ -0,0 +1,425 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +atomic.o +kdebugserver.o +syncputchars.o +gt.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotaterpy.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +rdbsend.o +initrdb.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o diff --git a/lib/hackerlibultra/base/K/libultra.txt b/lib/hackerlibultra/base/K/libultra.txt new file mode 100644 index 00000000..4048e297 --- /dev/null +++ b/lib/hackerlibultra/base/K/libultra.txt @@ -0,0 +1,468 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotateRPY.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +initialize_isv.o +monutil.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/K/libultra_d.txt b/lib/hackerlibultra/base/K/libultra_d.txt new file mode 100644 index 00000000..3a171d0b --- /dev/null +++ b/lib/hackerlibultra/base/K/libultra_d.txt @@ -0,0 +1,471 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotateRPY.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +initialize_isv.o +monutil.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +errorasm.o +getcurrfaultthread.o +getnextfaultthread.o +seterrorhandler.o +commonerror.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/K/libultra_rom.txt b/lib/hackerlibultra/base/K/libultra_rom.txt new file mode 100644 index 00000000..d890186b --- /dev/null +++ b/lib/hackerlibultra/base/K/libultra_rom.txt @@ -0,0 +1,427 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +atomic.o +kdebugserver.o +syncputchars.o +giorawinterrupt.o +giointerrupt.o +gt.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotateRPY.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +rdbsend.o +initrdb.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o diff --git a/lib/hackerlibultra/base/L/libgultra.txt b/lib/hackerlibultra/base/L/libgultra.txt new file mode 100644 index 00000000..b4fc9775 --- /dev/null +++ b/lib/hackerlibultra/base/L/libgultra.txt @@ -0,0 +1,483 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +flashgetaddr.o +flashreinit.o +flashchange.o +flashinit.o +flashreadstatus.o +flashreadid.o +flashclearstatus.o +flashallerase.o +flashallerasethrough.o +flashcheckeraseend.o +flashsectorerase.o +flashsectorerasethrough.o +flashwritebuffer.o +flashwritearray.o +flashreadarray.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotaterpy.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +initialize_isv.o +monutil.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/L/libgultra_d.txt b/lib/hackerlibultra/base/L/libgultra_d.txt new file mode 100644 index 00000000..78c619e5 --- /dev/null +++ b/lib/hackerlibultra/base/L/libgultra_d.txt @@ -0,0 +1,486 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +errorasm.o +getcurrfaultthread.o +getnextfaultthread.o +seterrorhandler.o +commonerror.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +flashgetaddr.o +flashreinit.o +flashchange.o +flashinit.o +flashreadstatus.o +flashreadid.o +flashclearstatus.o +flashallerase.o +flashallerasethrough.o +flashcheckeraseend.o +flashsectorerase.o +flashsectorerasethrough.o +flashwritebuffer.o +flashwritearray.o +flashreadarray.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotaterpy.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +initialize_isv.o +monutil.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/L/libgultra_rom.txt b/lib/hackerlibultra/base/L/libgultra_rom.txt new file mode 100644 index 00000000..4e1e0b79 --- /dev/null +++ b/lib/hackerlibultra/base/L/libgultra_rom.txt @@ -0,0 +1,440 @@ +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +flashgetaddr.o +flashreinit.o +flashchange.o +flashinit.o +flashreadstatus.o +flashreadid.o +flashclearstatus.o +flashallerase.o +flashallerasethrough.o +flashcheckeraseend.o +flashsectorerase.o +flashsectorerasethrough.o +flashwritebuffer.o +flashwritearray.o +flashreadarray.o +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrnew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +atomic.o +kdebugserver.o +syncputchars.o +gt.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guloadtile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotaterpy.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +rdbsend.o +initrdb.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteex.o +spriteex2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o diff --git a/lib/hackerlibultra/base/L/libultra.txt b/lib/hackerlibultra/base/L/libultra.txt new file mode 100644 index 00000000..ce952e2d --- /dev/null +++ b/lib/hackerlibultra/base/L/libultra.txt @@ -0,0 +1,483 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotateRPY.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +initialize_isv.o +monutil.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +flashgetaddr.o +flashreinit.o +flashchange.o +flashinit.o +flashreadstatus.o +flashreadid.o +flashclearstatus.o +flashallerase.o +flashallerasethrough.o +flashcheckeraseend.o +flashsectorerase.o +flashsectorerasethrough.o +flashwritebuffer.o +flashwritearray.o +flashreadarray.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/L/libultra_d.txt b/lib/hackerlibultra/base/L/libultra_d.txt new file mode 100644 index 00000000..ca76edaf --- /dev/null +++ b/lib/hackerlibultra/base/L/libultra_d.txt @@ -0,0 +1,486 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +assertbreak.o +atomic.o +kdebugserver.o +syncputchars.o +assert.o +profile.o +threadprofile.o +threadprofileclear.o +threadprofileinit.o +threadprofilereadcount.o +threadprofilereadtime.o +threadprofilestart.o +threadprofilestop.o +giorawinterrupt.o +giointerrupt.o +gt.o +dumpturbo.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotateRPY.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +parse_rdp.o +parse_gbi.o +dump_gbi.o +parse_string.o +rdbsend.o +initrdb.o +ackramromread.o +ackramromwrite.o +host_ptn64.o +readhost.o +testhost.o +writehost.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +delay.o +log.o +logfloat.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +printregion.o +rmonrcp.o +rmonbrk.o +rmoncmds.o +rmonmem.o +rmonmisc.o +rmonprint.o +rmonregs.o +rmontask.o +rmonmain.o +rmonsio.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +initialize_isv.o +monutil.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +errorasm.o +getcurrfaultthread.o +getnextfaultthread.o +seterrorhandler.o +commonerror.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +flashgetaddr.o +flashreinit.o +flashchange.o +flashinit.o +flashreadstatus.o +flashreadid.o +flashclearstatus.o +flashallerase.o +flashallerasethrough.o +flashcheckeraseend.o +flashsectorerase.o +flashsectorerasethrough.o +flashwritebuffer.o +flashwritearray.o +flashreadarray.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o +initialize_kmc.o +initialize_msp.o +initialize_emu.o +exit.o diff --git a/lib/hackerlibultra/base/L/libultra_rom.txt b/lib/hackerlibultra/base/L/libultra_rom.txt new file mode 100644 index 00000000..065ef277 --- /dev/null +++ b/lib/hackerlibultra/base/L/libultra_rom.txt @@ -0,0 +1,442 @@ +ai.o +aigetlen.o +aigetstat.o +aisetfreq.o +aisetnextbuf.o +drvrNew.o +load.o +auxbus.o +bnkf.o +env.o +event.o +filter.o +mainbus.o +resample.o +reverb.o +save.o +seq.o +sl.o +heapcheck.o +heapinit.o +heapalloc.o +copy.o +seqpdelete.o +seqpgetfxmix.o +seqpgetpan.o +seqpgetchlvol.o +seqpgetpriority.o +seqpgetprogram.o +seqpgetseq.o +seqpgettempo.o +seqpgetvol.o +seqpgetstate.o +seqploop.o +seqpplay.o +seqpsendmidi.o +seqpsetbank.o +seqpsetfxmix.o +seqpsetpan.o +seqpsetchlvol.o +seqpsetpriority.o +seqpsetprogram.o +seqpsetseq.o +seqpsettempo.o +seqpsetvol.o +seqpstop.o +seqplayer.o +cseq.o +cspdelete.o +cspgetfxmix.o +cspgetpan.o +cspgetchlvol.o +cspgetpriority.o +cspgetprogram.o +cspgetseq.o +cspgettempo.o +cspgetvol.o +cspgetstate.o +cspplay.o +cspsendmidi.o +cspsetbank.o +cspsetfxmix.o +cspsetpan.o +cspsetchlvol.o +cspsetpriority.o +cspsetprogram.o +cspsetseq.o +cspsettempo.o +cspsetvol.o +cspstop.o +csplayer.o +sndplayer.o +sndpdelete.o +sndpallocate.o +sndpdeallocate.o +sndpsetsound.o +sndpplay.o +sndpplayat.o +sndpgetsound.o +sndpstop.o +sndpgetstate.o +sndpsetpitch.o +sndpsetpriority.o +sndpsetvol.o +sndpsetpan.o +sndpsetfxmix.o +synthesizer.o +syndelete.o +synaddplayer.o +synremoveplayer.o +synfreevoice.o +synallocvoice.o +synstopvoice.o +synstartvoice.o +synstartvoiceparam.o +synsetpitch.o +synsetvol.o +synsetfxmix.o +synsetpan.o +syngetpriority.o +synsetpriority.o +synallocfx.o +synfreefx.o +syngetfxref.o +synsetfxparam.o +cents2ratio.o +parse_abi.o +invaldcache.o +invalicache.o +writebackdcache.o +writebackdcacheall.o +contquery.o +contreaddata.o +contreset.o +controller.o +contsetch.o +physicaltovirtual.o +virtualtophysical.o +atomic.o +kdebugserver.o +syncputchars.o +giorawinterrupt.o +giointerrupt.o +gt.o +libm_vals.o +sqrtf.o +align.o +cosf.o +coss.o +frustum.o +guLoadTile_bug.o +loadtextureblockmipmap.o +lookat.o +lookathil.o +lookatref.o +lookatstereo.o +ortho.o +perspective.o +position.o +poslight.o +poslighthil.o +random.o +rotateRPY.o +sinf.o +sins.o +us2dex.o +us2dex_emu.o +us2dex2_emu.o +usprite.o +rdbsend.o +initrdb.o +bcmp.o +bcopy.o +bzero.o +ll.o +llcvt.o +string.o +ldiv.o +llbit.o +xlitob.o +xldtob.o +xprintf.o +sprintf.o +syncprintf.o +createmesgqueue.o +jammesg.o +recvmesg.o +sendmesg.o +seteventmesg.o +dp.o +dpgetstat.o +dpsetstat.o +dpsetnextbuf.o +dpctr.o +getcause.o +getcompare.o +getconfig.o +getcount.o +getfpccsr.o +getsr.o +gettlbasid.o +gettlbhi.o +gettlblo0.o +gettlblo1.o +gettlbpagemask.o +setcause.o +setcompare.o +setconfig.o +setcount.o +setfpccsr.o +setsr.o +settlbasid.o +getwatchlo.o +setwatchlo.o +region.o +malloc.o +free.o +getbufcount.o +getsize.o +sp.o +spgetstat.o +spsetstat.o +spsetpc.o +sprawread.o +sprawwrite.o +sprawdma.o +sptask.o +sptaskyield.o +sptaskyielded.o +sched.o +si.o +sigetstat.o +sirawread.o +sirawwrite.o +sirawdma.o +siacs.o +crc.o +clearattribute.o +color.o +hide.o +setattribute.o +show.o +sprite.o +spriteEX.o +spriteEX2.o +spscale.o +createthread.o +destroythread.o +getthreadid.o +getthreadpri.o +setthreadpri.o +startthread.o +stopthread.o +thread.o +yieldthread.o +getactivequeue.o +gettime.o +settime.o +settimer.o +stoptimer.o +timerintr.o +maptlb.o +probetlb.o +maptlbrdb.o +unmaptlb.o +unmaptlball.o +vi.o +vigetcurrcontext.o +vigetfield.o +vigetcurrframebuf.o +vigetnextframebuf.o +vigetline.o +vigetmode.o +vigetnextcontext.o +vigetstat.o +vimgr.o +visetevent.o +visetmode.o +visetspecial.o +visetxscale.o +visetyscale.o +viswapbuf.o +viswapcontext.o +vitbl.o +viblack.o +virepeatline.o +vifade.o +viextendvstart.o +vimodentsclpn1.o +vimodentsclpf1.o +vimodentsclan1.o +vimodentsclaf1.o +vimodentsclpn2.o +vimodentsclpf2.o +vimodentsclan2.o +vimodentsclaf2.o +vimodentschpn1.o +vimodentschpf1.o +vimodentschan1.o +vimodentschaf1.o +vimodentschpn2.o +vimodentschpf2.o +vimodepallpn1.o +vimodepallpf1.o +vimodepallan1.o +vimodepallaf1.o +vimodepallpn2.o +vimodepallpf2.o +vimodepallan2.o +vimodepallaf2.o +vimodepalhpn1.o +vimodepalhpf1.o +vimodepalhan1.o +vimodepalhaf1.o +vimodepalhpn2.o +vimodepalhpf2.o +vimodempallpn1.o +vimodempallpf1.o +vimodempallan1.o +vimodempallaf1.o +vimodempallpn2.o +vimodempallpf2.o +vimodempallan2.o +vimodempallaf2.o +vimodempalhpn1.o +vimodempalhpf1.o +vimodempalhan1.o +vimodempalhaf1.o +vimodempalhpn2.o +vimodempalhpf2.o +vimodefpallpn1.o +vimodefpallpf1.o +vimodefpallan1.o +vimodefpallaf1.o +vimodefpallpn2.o +vimodefpallpf2.o +vimodefpallan2.o +vimodefpallaf2.o +vimodefpalhpn1.o +vimodefpalhpf1.o +vimodefpalhan1.o +vimodefpalhaf1.o +vimodefpalhpn2.o +vimodefpalhpf2.o +mtxident.o +mtxidentf.o +mtxf2l.o +mtxl2f.o +mtxcatf.o +scale.o +scalef.o +normalize.o +translate.o +translatef.o +mtxcatl.o +mtxxfml.o +mtxxfmf.o +rotate.o +conteepread.o +conteepwrite.o +conteepprobe.o +conteeplongwrite.o +conteeplongread.o +getcurrfaultthread.o +getnextfaultthread.o +exceptasm.o +interrupt.o +setintmask.o +getintmask.o +sethwinterrupt.o +gethwinterrupt.o +setpiinterrupt.o +setglobalintmask.o +resetglobalintmask.o +pi.o +pigettype.o +pigetstat.o +pirawread.o +pirawwrite.o +pirawdma.o +pigetcmdq.o +pimgr.o +epirawread.o +epirawwrite.o +epirawdma.o +epiwrite.o +epiread.o +epidma.o +epigettype.o +epilinkhandle.o +cartrominit.o +devmgr.o +piacs.o +piwrite.o +piread.o +pidma.o +voicecontrolgain.o +voiceinit.o +voicecheckresult.o +voicecontwrite20.o +voicemaskdictionary.o +voicecheckword.o +voicecontwrite4.o +voicesetadconverter.o +voicecleardictionary.o +voicecrc.o +voicesetword.o +voicecontread2.o +voicegetreaddata.o +voicestartreaddata.o +voicecontread36.o +voicegetstatus.o +voicestopreaddata.o +voicecountsyllables.o +contchannelreset.o +flashgetaddr.o +flashreinit.o +flashchange.o +flashinit.o +flashreadstatus.o +flashreadid.o +flashclearstatus.o +flashallerase.o +flashallerasethrough.o +flashcheckeraseend.o +flashsectorerase.o +flashsectorerasethrough.o +flashwritebuffer.o +flashwritearray.o +flashreadarray.o +gbpakinit.o +gbpakgetstatus.o +gbpaksetbank.o +gbpakgetbank.o +gbpakpower.o +gbpakreadwrite.o +gbpakreadid.o +gbpakcheckconnector.o +motor.o +pfsreformat.o +pfschecker.o +pfsinit.o +pfsallocatefile.o +pfsdeletefile.o +pfsreadwritefile.o +pfsfilestate.o +pfssearchfile.o +pfssetlabel.o +pfsgetlabel.o +pfsisplug.o +pfsfreeblocks.o +pfsnumfiles.o +pfsinitpak.o +pfsrepairid.o +pfsgetstatus.o +pfsselectbank.o +contpfs.o +contramread.o +contramwrite.o +parameters.o +afterprenmi.o +getmemsize.o +initialize.o diff --git a/lib/hackerlibultra/format.py b/lib/hackerlibultra/format.py new file mode 100644 index 00000000..f9588534 --- /dev/null +++ b/lib/hackerlibultra/format.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 + +import argparse +import glob +import multiprocessing +import os +from pathlib import Path +import re +import shutil +import subprocess +import sys +import tempfile +from functools import partial +from typing import List + + +# clang-format, clang-tidy and clang-apply-replacements default version +# This specific version is used when available, for more consistency between contributors +CLANG_VER = 14 + +# Clang-Format options (see .clang-format for rules applied) +FORMAT_OPTS = "-i -style=file" + +# Clang-Tidy options (see .clang-tidy for checks enabled) +TIDY_OPTS = "-p ." +TIDY_FIX_OPTS = "--fix --fix-errors" + +# Clang-Apply-Replacements options (used for multiprocessing) +APPLY_OPTS = "--format --style=file" + +# Compiler options used with Clang-Tidy +# Normal warnings are disabled with -Wno-everything to focus only on tidying +INCLUDES = "-Iinclude -Isrc -Ibuild/gc-eu-mq-dbg -I." +DEFINES = "-D_LANGUAGE_C -DNON_MATCHING -DF3DEX_GBI_2 -DBUILD_CREATOR=\"\" -DBUILD_DATE=__DATE__ -DBUILD_TIME=__TIME__" +COMPILER_OPTS = f"-fno-builtin -std=gnu90 -m32 -Wno-everything {INCLUDES} {DEFINES}" + + +def get_clang_executable(allowed_executables: List[str]): + for executable in allowed_executables: + try: + subprocess.check_call([executable, "--version"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + return executable + except FileNotFoundError or subprocess.CalledProcessError: + pass + return None + + +def get_tidy_version(tidy_executable: str): + tidy_version_run = subprocess.run([tidy_executable, "--version"], stdout=subprocess.PIPE, universal_newlines=True) + match = re.search(r"LLVM version ([0-9]+)", tidy_version_run.stdout) + return int(match.group(1)) + + +CLANG_FORMAT = get_clang_executable([f"clang-format-{CLANG_VER}", "clang-format"]) +if CLANG_FORMAT is None: + sys.exit(f"Error: neither clang-format nor clang-format-{CLANG_VER} found") + +CLANG_TIDY = get_clang_executable([f"clang-tidy-{CLANG_VER}", "clang-tidy"]) +if CLANG_TIDY is None: + sys.exit(f"Error: neither clang-tidy nor clang-tidy-{CLANG_VER} found") + +CLANG_APPLY_REPLACEMENTS = get_clang_executable([f"clang-apply-replacements-{CLANG_VER}", "clang-apply-replacements"]) + +# Try to detect the clang-tidy version and add --fix-notes for version 13+ +# This is used to ensure all fixes are applied properly in recent versions +if get_tidy_version(CLANG_TIDY) >= 13: + TIDY_FIX_OPTS += " --fix-notes" + + +def list_chunks(list: List, chunk_length: int): + for i in range(0, len(list), chunk_length): + yield list[i : i + chunk_length] + + +def run_clang_format(files: List[str]): + exec_str = f"{CLANG_FORMAT} {FORMAT_OPTS} {' '.join(files)}" + subprocess.run(exec_str, shell=True) + + +def run_clang_tidy(files: List[str]): + exec_str = f"{CLANG_TIDY} {TIDY_OPTS} {TIDY_FIX_OPTS} {' '.join(files)} -- {COMPILER_OPTS}" + subprocess.run(exec_str, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + +def run_clang_tidy_with_export(tmp_dir: str, files: List[str]): + (handle, tmp_file) = tempfile.mkstemp(suffix=".yaml", dir=tmp_dir) + os.close(handle) + + exec_str = f"{CLANG_TIDY} {TIDY_OPTS} --export-fixes={tmp_file} {' '.join(files)} -- {COMPILER_OPTS}" + subprocess.run(exec_str, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + +def run_clang_apply_replacements(tmp_dir: str): + exec_str = f"{CLANG_APPLY_REPLACEMENTS} {APPLY_OPTS} {tmp_dir}" + subprocess.run(exec_str, shell=True) + + +def cleanup_whitespace(file: str): + """ + Remove whitespace at the end of lines, and ensure all lines end with a newline. + """ + file_p = Path(file) + contents = file_p.read_text(encoding="UTF-8") + modified = False + + contents, n_subst = re.subn(r"[^\S\n]+\n", "\n", contents) + if n_subst != 0: + modified = True + + if contents and not contents.endswith("\n"): + contents += "\n" + modified = True + + if modified: + file_p.write_text(contents, encoding="UTF-8") + + +def format_files(src_files: List[str], extra_files: List[str], nb_jobs: int): + if nb_jobs != 1: + print(f"Formatting files with {nb_jobs} jobs") + else: + print("Formatting files with a single job (consider using -j to make this faster)") + + # Format files in chunks to improve performance while still utilizing jobs + file_chunks = list(list_chunks(src_files, (len(src_files) // nb_jobs) + 1)) + + print("Running clang-format...") + # clang-format only applies changes in the given files, so it's safe to run in parallel + with multiprocessing.get_context("fork").Pool(nb_jobs) as pool: + pool.map(run_clang_format, file_chunks) + + print("Running clang-tidy...") + if nb_jobs > 1: + # clang-tidy may apply changes in #included files, so when running it in parallel we use --export-fixes + # then we call clang-apply-replacements to apply all suggested fixes at the end + tmp_dir = tempfile.mkdtemp() + + try: + with multiprocessing.get_context("fork").Pool(nb_jobs) as pool: + pool.map(partial(run_clang_tidy_with_export, tmp_dir), file_chunks) + + run_clang_apply_replacements(tmp_dir) + finally: + shutil.rmtree(tmp_dir) + else: + run_clang_tidy(src_files) + + print("Cleaning up whitespace...") + # Safe to do in parallel and can be applied to all types of files + with multiprocessing.get_context("fork").Pool(nb_jobs) as pool: + pool.map(cleanup_whitespace, src_files + extra_files) + + print("Done formatting files.") + + +def list_files_to_format(): + files = glob.glob("src/**/*.c", recursive=True) + extra_files = ( + glob.glob("assets/**/*.xml", recursive=True) + + glob.glob("include/**/*.h", recursive=True) + + glob.glob("src/**/*.h", recursive=True) + ) + return files, extra_files + + +def main(): + parser = argparse.ArgumentParser(description="Format files in the codebase to enforce most style rules") + parser.add_argument( + "--show-paths", + dest="show_paths", + action="store_true", + help="Print the paths to the clang-* binaries used", + ) + parser.add_argument("files", metavar="file", nargs="*") + parser.add_argument( + "-j", + dest="jobs", + type=int, + nargs="?", + default=1, + help="number of jobs to run (default: 1 without -j, number of cpus with -j)", + ) + args = parser.parse_args() + + if args.show_paths: + import shutil + + print("CLANG_FORMAT ->", shutil.which(CLANG_FORMAT)) + print("CLANG_TIDY ->", shutil.which(CLANG_TIDY)) + print("CLANG_APPLY_REPLACEMENTS ->", shutil.which(CLANG_APPLY_REPLACEMENTS)) + + nb_jobs = args.jobs or multiprocessing.cpu_count() + if nb_jobs > 1: + if CLANG_APPLY_REPLACEMENTS is None: + sys.exit( + f"Error: neither clang-apply-replacements nor clang-apply-replacements-{CLANG_VER} found (required to use -j)" + ) + + if args.files: + files = args.files + extra_files = [] + else: + files, extra_files = list_files_to_format() + + format_files(files, extra_files, nb_jobs) + + +if __name__ == "__main__": + main() diff --git a/lib/hackerlibultra/include/PR/R4300.h b/lib/hackerlibultra/include/PR/R4300.h new file mode 100644 index 00000000..544c697d --- /dev/null +++ b/lib/hackerlibultra/include/PR/R4300.h @@ -0,0 +1,453 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.13 $ + * $Date: 1997/02/11 08:15:34 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/R4300.h,v $ + * + **************************************************************************/ + +#ifndef __R4300_H__ +#define __R4300_H__ + +#include + +/* + * Segment base addresses and sizes + */ +#define KUBASE 0 +#define KUSIZE 0x80000000 +#define K0BASE 0x80000000 +#define K0SIZE 0x20000000 +#define K1BASE 0xA0000000 +#define K1SIZE 0x20000000 +#define K2BASE 0xC0000000 +#define K2SIZE 0x20000000 + +/* + * Exception vectors + */ +#define SIZE_EXCVEC 0x80 /* Size of an exc. vec */ +#define UT_VEC K0BASE /* utlbmiss vector */ +#define R_VEC (K1BASE + 0x1fc00000) /* reset vector */ +#define XUT_VEC (K0BASE + 0x80) /* extended address tlbmiss */ +#define ECC_VEC (K0BASE + 0x100) /* Ecc exception vector */ +#define E_VEC (K0BASE + 0x180) /* Gen. exception vector */ + +/* + * Address conversion macros + */ +#ifdef _LANGUAGE_ASSEMBLY + +#define K0_TO_K1(x) ((x) | 0xA0000000) /* kseg0 to kseg1 */ +#define K1_TO_K0(x) ((x) & 0x9FFFFFFF) /* kseg1 to kseg0 */ +#define K0_TO_PHYS(x) ((x) & 0x1FFFFFFF) /* kseg0 to physical */ +#define K1_TO_PHYS(x) ((x) & 0x1FFFFFFF) /* kseg1 to physical */ +#define KDM_TO_PHYS(x) ((x) & 0x1FFFFFFF) /* direct mapped to physical */ +#define PHYS_TO_K0(x) ((x) | 0x80000000) /* physical to kseg0 */ +#define PHYS_TO_K1(x) ((x) | 0xA0000000) /* physical to kseg1 */ + +#else /* _LANGUAGE_C */ + +#define K0_TO_K1(x) ((u32)(x) | 0xA0000000) /* kseg0 to kseg1 */ +#define K1_TO_K0(x) ((u32)(x) & 0x9FFFFFFF) /* kseg1 to kseg0 */ +#define K0_TO_PHYS(x) ((u32)(x) & 0x1FFFFFFF) /* kseg0 to physical */ +#define K1_TO_PHYS(x) ((u32)(x) & 0x1FFFFFFF) /* kseg1 to physical */ +#define KDM_TO_PHYS(x) ((u32)(x) & 0x1FFFFFFF) /* direct mapped to physical */ +#define PHYS_TO_K0(x) ((u32)(x) | 0x80000000) /* physical to kseg0 */ +#define PHYS_TO_K1(x) ((u32)(x) | 0xA0000000) /* physical to kseg1 */ + +#endif /* _LANGUAGE_ASSEMBLY */ + +/* + * Address predicates + */ +#define IS_KSEG0(x) ((u32)(x) >= K0BASE && (u32)(x) < K1BASE) +#define IS_KSEG1(x) ((u32)(x) >= K1BASE && (u32)(x) < K2BASE) +#define IS_KSEGDM(x) ((u32)(x) >= K0BASE && (u32)(x) < K2BASE) +#define IS_KSEG2(x) ((u32)(x) >= K2BASE && (u32)(x) < KPTE_SHDUBASE) +#define IS_KPTESEG(x) ((u32)(x) >= KPTE_SHDUBASE) +#define IS_KUSEG(x) ((u32)(x) < K0BASE) + +/* + * TLB size constants + */ + +#define NTLBENTRIES 31 /* entry 31 is reserved by rdb */ + +#define TLBHI_VPN2MASK 0xffffe000 +#define TLBHI_VPN2SHIFT 13 +#define TLBHI_PIDMASK 0xff +#define TLBHI_PIDSHIFT 0 +#define TLBHI_NPID 255 /* 255 to fit in 8 bits */ + +#define TLBLO_PFNMASK 0x3fffffc0 +#define TLBLO_PFNSHIFT 6 +#define TLBLO_CACHMASK 0x38 /* cache coherency algorithm */ +#define TLBLO_CACHSHIFT 3 +#define TLBLO_UNCACHED 0x10 /* not cached */ +#define TLBLO_NONCOHRNT 0x18 /* Cacheable non-coherent */ +#define TLBLO_EXLWR 0x28 /* Exclusive write */ +#define TLBLO_D 0x4 /* writeable */ +#define TLBLO_V 0x2 /* valid bit */ +#define TLBLO_G 0x1 /* global access bit */ + +#define TLBINX_PROBE 0x80000000 +#define TLBINX_INXMASK 0x3f +#define TLBINX_INXSHIFT 0 + +#define TLBRAND_RANDMASK 0x3f +#define TLBRAND_RANDSHIFT 0 + +#define TLBWIRED_WIREDMASK 0x3f + +#define TLBCTXT_BASEMASK 0xff800000 +#define TLBCTXT_BASESHIFT 23 +#define TLBCTXT_BASEBITS 9 + +#define TLBCTXT_VPNMASK 0x7ffff0 +#define TLBCTXT_VPNSHIFT 4 + +#define TLBPGMASK_4K 0x0 +#define TLBPGMASK_16K 0x6000 +#define TLBPGMASK_64K 0x1e000 + +/* + * Status register + */ +#define SR_CUMASK 0xf0000000 /* coproc usable bits */ + +#define SR_CU3 0x80000000 /* Coprocessor 3 usable */ +#define SR_CU2 0x40000000 /* Coprocessor 2 usable */ +#define SR_CU1 0x20000000 /* Coprocessor 1 usable */ +#define SR_CU0 0x10000000 /* Coprocessor 0 usable */ +#define SR_RP 0x08000000 /* Reduced power (quarter speed) */ +#define SR_FR 0x04000000 /* MIPS III FP register mode */ +#define SR_RE 0x02000000 /* Reverse endian */ +#define SR_ITS 0x01000000 /* Instruction trace support */ +#define SR_BEV 0x00400000 /* Use boot exception vectors */ +#define SR_TS 0x00200000 /* TLB shutdown */ +#define SR_SR 0x00100000 /* Soft reset occured */ +#define SR_CH 0x00040000 /* Cache hit for last 'cache' op */ +#define SR_CE 0x00020000 /* Create ECC */ +#define SR_DE 0x00010000 /* ECC of parity does not cause error */ + +/* + * Interrupt enable bits + * (NOTE: bits set to 1 enable the corresponding level interrupt) + */ +#define SR_IMASK 0x0000ff00 /* Interrupt mask */ +#define SR_IMASK8 0x00000000 /* mask level 8 */ +#define SR_IMASK7 0x00008000 /* mask level 7 */ +#define SR_IMASK6 0x0000c000 /* mask level 6 */ +#define SR_IMASK5 0x0000e000 /* mask level 5 */ +#define SR_IMASK4 0x0000f000 /* mask level 4 */ +#define SR_IMASK3 0x0000f800 /* mask level 3 */ +#define SR_IMASK2 0x0000fc00 /* mask level 2 */ +#define SR_IMASK1 0x0000fe00 /* mask level 1 */ +#define SR_IMASK0 0x0000ff00 /* mask level 0 */ + +#define SR_IBIT8 0x00008000 /* bit level 8 */ +#define SR_IBIT7 0x00004000 /* bit level 7 */ +#define SR_IBIT6 0x00002000 /* bit level 6 */ +#define SR_IBIT5 0x00001000 /* bit level 5 */ +#define SR_IBIT4 0x00000800 /* bit level 4 */ +#define SR_IBIT3 0x00000400 /* bit level 3 */ +#define SR_IBIT2 0x00000200 /* bit level 2 */ +#define SR_IBIT1 0x00000100 /* bit level 1 */ + +#define SR_IMASKSHIFT 8 + +#define SR_KX 0x00000080 /* extended-addr TLB vec in kernel */ +#define SR_SX 0x00000040 /* xtended-addr TLB vec supervisor */ +#define SR_UX 0x00000020 /* xtended-addr TLB vec in user mode */ +#define SR_KSU_MASK 0x00000018 /* mode mask */ +#define SR_KSU_USR 0x00000010 /* user mode */ +#define SR_KSU_SUP 0x00000008 /* supervisor mode */ +#define SR_KSU_KER 0x00000000 /* kernel mode */ +#define SR_ERL 0x00000004 /* Error level, 1=>cache error */ +#define SR_EXL 0x00000002 /* Exception level, 1=>exception */ +#define SR_IE 0x00000001 /* interrupt enable, 1=>enable */ + +/* + * Cause Register + */ +#define CAUSE_BD 0x80000000 /* Branch delay slot */ +#define CAUSE_CEMASK 0x30000000 /* coprocessor error */ +#define CAUSE_CESHIFT 28 + +/* Interrupt pending bits */ +#define CAUSE_IP8 0x00008000 /* External level 8 pending - COMPARE */ +#define CAUSE_IP7 0x00004000 /* External level 7 pending - INT4 */ +#define CAUSE_IP6 0x00002000 /* External level 6 pending - INT3 */ +#define CAUSE_IP5 0x00001000 /* External level 5 pending - INT2 */ +#define CAUSE_IP4 0x00000800 /* External level 4 pending - INT1 */ +#define CAUSE_IP3 0x00000400 /* External level 3 pending - INT0 */ +#define CAUSE_SW2 0x00000200 /* Software level 2 pending */ +#define CAUSE_SW1 0x00000100 /* Software level 1 pending */ + +#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */ +#define CAUSE_IPSHIFT 8 + +#define CAUSE_EXCMASK 0x0000007C /* Cause code bits */ + +#define CAUSE_EXCSHIFT 2 + +/* Cause register exception codes */ + +#define EXC_CODE(x) ((x) << 2) + +/* Hardware exception codes */ +#define EXC_INT EXC_CODE(0) /* interrupt */ +#define EXC_MOD EXC_CODE(1) /* TLB mod */ +#define EXC_RMISS EXC_CODE(2) /* Read TLB Miss */ +#define EXC_WMISS EXC_CODE(3) /* Write TLB Miss */ +#define EXC_RADE EXC_CODE(4) /* Read Address Error */ +#define EXC_WADE EXC_CODE(5) /* Write Address Error */ +#define EXC_IBE EXC_CODE(6) /* Instruction Bus Error */ +#define EXC_DBE EXC_CODE(7) /* Data Bus Error */ +#define EXC_SYSCALL EXC_CODE(8) /* SYSCALL */ +#define EXC_BREAK EXC_CODE(9) /* BREAKpoint */ +#define EXC_II EXC_CODE(10) /* Illegal Instruction */ +#define EXC_CPU EXC_CODE(11) /* CoProcessor Unusable */ +#define EXC_OV EXC_CODE(12) /* OVerflow */ +#define EXC_TRAP EXC_CODE(13) /* Trap exception */ +#define EXC_VCEI EXC_CODE(14) /* Virt. Coherency on Inst. fetch */ +#define EXC_FPE EXC_CODE(15) /* Floating Point Exception */ +#define EXC_WATCH EXC_CODE(23) /* Watchpoint reference */ +#define EXC_VCED EXC_CODE(31) /* Virt. Coherency on data read */ + +/* C0_PRID Defines */ +#define C0_IMPMASK 0xff00 +#define C0_IMPSHIFT 8 +#define C0_REVMASK 0xff +#define C0_MAJREVMASK 0xf0 +#define C0_MAJREVSHIFT 4 +#define C0_MINREVMASK 0xf + +/* + * Coprocessor 0 operations + */ +#define C0_READI 0x1 /* read ITLB entry addressed by C0_INDEX */ +#define C0_WRITEI 0x2 /* write ITLB entry addressed by C0_INDEX */ +#define C0_WRITER 0x6 /* write ITLB entry addressed by C0_RAND */ +#define C0_PROBE 0x8 /* probe for ITLB entry addressed by TLBHI */ +#define C0_RFE 0x10 /* restore for exception */ + +/* + * 'cache' instruction definitions + */ + +/* Target cache */ +#define CACH_PI 0x0 /* specifies primary inst. cache */ +#define CACH_PD 0x1 /* primary data cache */ +#define CACH_SI 0x2 /* secondary instruction cache */ +#define CACH_SD 0x3 /* secondary data cache */ + +/* Cache operations */ +#define C_IINV 0x0 /* index invalidate (inst, 2nd inst) */ +#define C_IWBINV 0x0 /* index writeback inval (d, sd) */ +#define C_ILT 0x4 /* index load tag (all) */ +#define C_IST 0x8 /* index store tag (all) */ +#define C_CDX 0xc /* create dirty exclusive (d, sd) */ +#define C_HINV 0x10 /* hit invalidate (all) */ +#define C_HWBINV 0x14 /* hit writeback inv. (d, sd) */ +#define C_FILL 0x14 /* fill (i) */ +#define C_HWB 0x18 /* hit writeback (i, d, sd) */ +#define C_HSV 0x1c /* hit set virt. (si, sd) */ + +/* + * Cache size definitions + */ +#define ICACHE_SIZE 0x4000 /* 16K */ +#define ICACHE_LINESIZE 32 /* 8 words */ +#define ICACHE_LINEMASK (ICACHE_LINESIZE - 1) + +#define DCACHE_SIZE 0x2000 /* 8K */ +#define DCACHE_LINESIZE 16 /* 4 words */ +#define DCACHE_LINEMASK (DCACHE_LINESIZE - 1) + +/* + * C0_CONFIG register definitions + */ +#define CONFIG_CM 0x80000000 /* 1 == Master-Checker enabled */ +#define CONFIG_EC 0x70000000 /* System Clock ratio */ +#define CONFIG_EC_1_1 0x6 /* System Clock ratio 1 :1 */ +#define CONFIG_EC_3_2 0x7 /* System Clock ratio 1.5 :1 */ +#define CONFIG_EC_2_1 0x0 /* System Clock ratio 2 :1 */ +#define CONFIG_EC_3_1 0x1 /* System Clock ratio 3 :1 */ +#define CONFIG_EP 0x0f000000 /* Transmit Data Pattern */ +#define CONFIG_SB 0x00c00000 /* Secondary cache block size */ + +#define CONFIG_SS 0x00200000 /* Split scache: 0 == I&D combined */ +#define CONFIG_SW 0x00100000 /* scache port: 0==128, 1==64 */ +#define CONFIG_EW 0x000c0000 /* System Port width: 0==64, 1==32 */ +#define CONFIG_SC 0x00020000 /* 0 -> 2nd cache present */ +#define CONFIG_SM 0x00010000 /* 0 -> Dirty Shared Coherency enabled*/ +#define CONFIG_BE 0x00008000 /* Endian-ness: 1 --> BE */ +#define CONFIG_EM 0x00004000 /* 1 -> ECC mode, 0 -> parity */ +#define CONFIG_EB 0x00002000 /* Block order:1->sequent,0->subblock */ + +#define CONFIG_IC 0x00000e00 /* Primary Icache size */ +#define CONFIG_DC 0x000001c0 /* Primary Dcache size */ +#define CONFIG_IB 0x00000020 /* Icache block size */ +#define CONFIG_DB 0x00000010 /* Dcache block size */ +#define CONFIG_CU 0x00000008 /* Update on Store-conditional */ +#define CONFIG_K0 0x00000007 /* K0SEG Coherency algorithm */ + +#define CONFIG_UNCACHED 0x00000002 /* K0 is uncached */ +#define CONFIG_NONCOHRNT 0x00000003 +#define CONFIG_COHRNT_EXLWR 0x00000005 +#define CONFIG_SB_SHFT 22 /* shift SB to bit position 0 */ +#define CONFIG_IC_SHFT 9 /* shift IC to bit position 0 */ +#define CONFIG_DC_SHFT 6 /* shift DC to bit position 0 */ +#define CONFIG_BE_SHFT 15 /* shift BE to bit position 0 */ + +/* + * C0_TAGLO definitions for setting/getting cache states and physaddr bits + */ +#define SADDRMASK 0xFFFFE000 /* 31..13 -> scache paddr bits 35..17 */ +#define SVINDEXMASK 0x00000380 /* 9..7: prim virt index bits 14..12 */ +#define SSTATEMASK 0x00001c00 /* bits 12..10 hold scache line state */ +#define SINVALID 0x00000000 /* invalid --> 000 == state 0 */ +#define SCLEANEXCL 0x00001000 /* clean exclusive --> 100 == state 4 */ +#define SDIRTYEXCL 0x00001400 /* dirty exclusive --> 101 == state 5 */ +#define SECC_MASK 0x0000007f /* low 7 bits are ecc for the tag */ +#define SADDR_SHIFT 4 /* shift STagLo (31..13) to 35..17 */ + +#define PADDRMASK 0xFFFFFF00 /* PTagLo31..8->prim paddr bits35..12 */ +#define PADDR_SHIFT 4 /* roll bits 35..12 down to 31..8 */ +#define PSTATEMASK 0x00C0 /* bits 7..6 hold primary line state */ +#define PINVALID 0x0000 /* invalid --> 000 == state 0 */ +#define PCLEANEXCL 0x0080 /* clean exclusive --> 10 == state 2 */ +#define PDIRTYEXCL 0x00C0 /* dirty exclusive --> 11 == state 3 */ +#define PPARITY_MASK 0x0001 /* low bit is parity bit (even). */ + +/* + * C0_CACHE_ERR definitions. + */ +#define CACHERR_ER 0x80000000 /* 0: inst ref, 1: data ref */ +#define CACHERR_EC 0x40000000 /* 0: primary, 1: secondary */ +#define CACHERR_ED 0x20000000 /* 1: data error */ +#define CACHERR_ET 0x10000000 /* 1: tag error */ +#define CACHERR_ES 0x08000000 /* 1: external ref, e.g. snoop*/ +#define CACHERR_EE 0x04000000 /* error on SysAD bus */ +#define CACHERR_EB 0x02000000 /* complicated, see spec. */ +#define CACHERR_EI 0x01000000 /* complicated, see spec. */ +#define CACHERR_SIDX_MASK 0x003ffff8 /* secondary cache index */ +#define CACHERR_PIDX_MASK 0x00000007 /* primary cache index */ +#define CACHERR_PIDX_SHIFT 12 /* bits 2..0 are paddr14..12 */ + +/* R4000 family supports hardware watchpoints: + * C0_WATCHLO: + * bits 31..3 are bits 31..3 of physaddr to watch + * bit 2: reserved; must be written as 0. + * bit 1: when set causes a watchpoint trap on load accesses to paddr. + * bit 0: when set traps on stores to paddr; + * C0_WATCHHI + * bits 31..4 are reserved and must be written as zeros. + * bits 3..0 are bits 35..32 of the physaddr to watch + */ +#define WATCHLO_WTRAP 0x00000001 +#define WATCHLO_RTRAP 0x00000002 +#define WATCHLO_ADDRMASK 0xfffffff8 +#define WATCHLO_VALIDMASK 0xfffffffb +#define WATCHHI_VALIDMASK 0x0000000f + +/* + * Coprocessor 0 registers + */ +#ifdef _LANGUAGE_ASSEMBLY +#define C0_INX $0 +#define C0_RAND $1 +#define C0_ENTRYLO0 $2 +#define C0_ENTRYLO1 $3 +#define C0_CONTEXT $4 +#define C0_PAGEMASK $5 /* page mask */ +#define C0_WIRED $6 /* # wired entries in tlb */ +#define C0_BADVADDR $8 +#define C0_COUNT $9 /* free-running counter */ +#define C0_ENTRYHI $10 +#define C0_SR $12 +#define C0_CAUSE $13 +#define C0_EPC $14 +#define C0_PRID $15 /* revision identifier */ +#define C0_COMPARE $11 /* counter comparison reg. */ +#define C0_CONFIG $16 /* hardware configuration */ +#define C0_LLADDR $17 /* load linked address */ +#define C0_WATCHLO $18 /* watchpoint */ +#define C0_WATCHHI $19 /* watchpoint */ +#define C0_ECC $26 /* S-cache ECC and primary parity */ +#define C0_CACHE_ERR $27 /* cache error status */ +#define C0_TAGLO $28 /* cache operations */ +#define C0_TAGHI $29 /* cache operations */ +#define C0_ERROR_EPC $30 /* ECC error prg. counter */ + +#else /* ! _LANGUAGE_ASSEMBLY */ + +#define C0_INX 0 +#define C0_RAND 1 +#define C0_ENTRYLO0 2 +#define C0_ENTRYLO1 3 +#define C0_CONTEXT 4 +#define C0_PAGEMASK 5 /* page mask */ +#define C0_WIRED 6 /* # wired entries in tlb */ +#define C0_BADVADDR 8 +#define C0_COUNT 9 /* free-running counter */ +#define C0_ENTRYHI 10 +#define C0_SR 12 +#define C0_CAUSE 13 +#define C0_EPC 14 +#define C0_PRID 15 /* revision identifier */ +#define C0_COMPARE 11 /* counter comparison reg. */ +#define C0_CONFIG 16 /* hardware configuration */ +#define C0_LLADDR 17 /* load linked address */ +#define C0_WATCHLO 18 /* watchpoint */ +#define C0_WATCHHI 19 /* watchpoint */ +#define C0_ECC 26 /* S-cache ECC and primary parity */ +#define C0_CACHE_ERR 27 /* cache error status */ +#define C0_TAGLO 28 /* cache operations */ +#define C0_TAGHI 29 /* cache operations */ +#define C0_ERROR_EPC 30 /* ECC error prg. counter */ + +#endif /* _LANGUAGE_ASSEMBLY */ + +/* + * floating-point status register + */ +#define FPCSR_FS 0x01000000 /* flush denorm to zero */ +#define FPCSR_C 0x00800000 /* condition bit */ +#define FPCSR_CE 0x00020000 /* cause: unimplemented operation */ +#define FPCSR_CV 0x00010000 /* cause: invalid operation */ +#define FPCSR_CZ 0x00008000 /* cause: division by zero */ +#define FPCSR_CO 0x00004000 /* cause: overflow */ +#define FPCSR_CU 0x00002000 /* cause: underflow */ +#define FPCSR_CI 0x00001000 /* cause: inexact operation */ +#define FPCSR_EV 0x00000800 /* enable: invalid operation */ +#define FPCSR_EZ 0x00000400 /* enable: division by zero */ +#define FPCSR_EO 0x00000200 /* enable: overflow */ +#define FPCSR_EU 0x00000100 /* enable: underflow */ +#define FPCSR_EI 0x00000080 /* enable: inexact operation */ +#define FPCSR_FV 0x00000040 /* flag: invalid operation */ +#define FPCSR_FZ 0x00000020 /* flag: division by zero */ +#define FPCSR_FO 0x00000010 /* flag: overflow */ +#define FPCSR_FU 0x00000008 /* flag: underflow */ +#define FPCSR_FI 0x00000004 /* flag: inexact operation */ +#define FPCSR_RM_MASK 0x00000003 /* rounding mode mask */ +#define FPCSR_RM_RN 0x00000000 /* round to nearest */ +#define FPCSR_RM_RZ 0x00000001 /* round to zero */ +#define FPCSR_RM_RP 0x00000002 /* round to positive infinity */ +#define FPCSR_RM_RM 0x00000003 /* round to negative infinity */ + +#endif /* __R4300_H */ diff --git a/lib/hackerlibultra/include/PR/abi.h b/lib/hackerlibultra/include/PR/abi.h new file mode 100644 index 00000000..adb7de94 --- /dev/null +++ b/lib/hackerlibultra/include/PR/abi.h @@ -0,0 +1,401 @@ +#ifndef _ABI_H_ +#define _ABI_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.32 $ + * $Date: 1997/02/11 08:16:37 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/abi.h,v $ + * + **************************************************************************/ + +/* + * Header file for the Audio Binary Interface. + * This is included in the Media Binary Interface file + * mbi.h. + * + * This file follows the framework used for graphics. + * + */ + +/* Audio commands: */ +#define A_SPNOOP 0 +#define A_ADPCM 1 +#define A_CLEARBUFF 2 +#define A_ENVMIXER 3 +#define A_LOADBUFF 4 +#define A_RESAMPLE 5 +#define A_SAVEBUFF 6 +#define A_SEGMENT 7 +#define A_SETBUFF 8 +#define A_SETVOL 9 +#define A_DMEMMOVE 10 +#define A_LOADADPCM 11 +#define A_MIXER 12 +#define A_INTERLEAVE 13 +#define A_POLEF 14 +#define A_SETLOOP 15 + +#define ACMD_SIZE 32 +/* + * Audio flags + */ + +#define A_INIT 0x01 +#define A_CONTINUE 0x00 +#define A_LOOP 0x02 +#define A_OUT 0x02 +#define A_LEFT 0x02 +#define A_RIGHT 0x00 +#define A_VOL 0x04 +#define A_RATE 0x00 +#define A_AUX 0x08 +#define A_NOAUX 0x00 +#define A_MAIN 0x00 +#define A_MIX 0x10 + +/* + * BEGIN C-specific section: (typedef's) + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * Data Structures. + */ + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int gain : 16; + unsigned int addr; +} Aadpcm; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int gain : 16; + unsigned int addr; +} Apolef; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int pad1 : 16; + unsigned int addr; +} Aenvelope; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 8; + unsigned int dmem : 16; + unsigned int pad2 : 16; + unsigned int count : 16; +} Aclearbuff; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 8; + unsigned int pad2 : 16; + unsigned int inL : 16; + unsigned int inR : 16; +} Ainterleave; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 24; + unsigned int addr; +} Aloadbuff; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int pad1 : 16; + unsigned int addr; +} Aenvmixer; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int gain : 16; + unsigned int dmemi : 16; + unsigned int dmemo : 16; +} Amixer; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int dmem2 : 16; + unsigned int addr; +} Apan; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int pitch : 16; + unsigned int addr; +} Aresample; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int pad1 : 16; + unsigned int addr; +} Areverb; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 24; + unsigned int addr; +} Asavebuff; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 24; + unsigned int pad2 : 2; + unsigned int number : 4; + unsigned int base : 24; +} Asegment; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int dmemin : 16; + unsigned int dmemout : 16; + unsigned int count : 16; +} Asetbuff; + +typedef struct { + unsigned int cmd : 8; + unsigned int flags : 8; + unsigned int vol : 16; + unsigned int voltgt : 16; + unsigned int volrate : 16; +} Asetvol; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 8; + unsigned int dmemin : 16; + unsigned int dmemout : 16; + unsigned int count : 16; +} Admemmove; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 8; + unsigned int count : 16; + unsigned int addr; +} Aloadadpcm; + +typedef struct { + unsigned int cmd : 8; + unsigned int pad1 : 8; + unsigned int pad2 : 16; + unsigned int addr; +} Asetloop; + +/* + * Generic Acmd Packet + */ + +typedef struct { + unsigned int w0; + unsigned int w1; +} Awords; + +typedef union { + Awords words; + Aadpcm adpcm; + Apolef polef; + Aclearbuff clearbuff; + Aenvelope envelope; + Ainterleave interleave; + Aloadbuff loadbuff; + Aenvmixer envmixer; + Aresample resample; + Areverb reverb; + Asavebuff savebuff; + Asegment segment; + Asetbuff setbuff; + Asetvol setvol; + Admemmove dmemmove; + Aloadadpcm loadadpcm; + Amixer mixer; + Asetloop setloop; + long long int force_union_align; /* dummy, force alignment */ +} Acmd; + +/* + * ADPCM State + */ +#define ADPCMVSIZE 8 +#define ADPCMFSIZE 16 +typedef short ADPCM_STATE[ADPCMFSIZE]; + +/* + * Pole filter state + */ +typedef short POLEF_STATE[4]; + +/* + * Resampler state + */ +typedef short RESAMPLE_STATE[16]; + +/* + * Resampler constants + */ +#define UNITY_PITCH 0x8000 +#define MAX_RATIO 1.99996 /* within .03 cents of +1 octave */ + +/* + * Enveloper/Mixer state + */ +typedef short ENVMIX_STATE[40]; + +/* + * Macros to assemble the audio command list + */ + +#define aADPCMdec(pkt, f, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ADPCM, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aPoleFilter(pkt, f, g, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_POLEF, 24, 8) | _SHIFTL(f, 16, 8) | _SHIFTL(g, 0, 16)); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aClearBuffer(pkt, d, c) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_CLEARBUFF, 24, 8) | _SHIFTL(d, 0, 24); \ + _a->words.w1 = (unsigned int)(c); \ + } + +#define aEnvMixer(pkt, f, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_ENVMIXER, 24, 8) | _SHIFTL(f, 16, 8); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aInterleave(pkt, l, r) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \ + _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \ + } + +#define aLoadBuffer(pkt, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADBUFF, 24, 8); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aMix(pkt, f, g, i, o) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_MIXER, 24, 8) | _SHIFTL(f, 16, 8) | _SHIFTL(g, 0, 16)); \ + _a->words.w1 = _SHIFTL(i, 16, 16) | _SHIFTL(o, 0, 16); \ + } + +#define aPan(pkt, f, d, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_PAN, 24, 8) | _SHIFTL(f, 16, 8) | _SHIFTL(d, 0, 16)); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aResample(pkt, f, p, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_RESAMPLE, 24, 8) | _SHIFTL(f, 16, 8) | _SHIFTL(p, 0, 16)); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aSaveBuffer(pkt, s) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SAVEBUFF, 24, 8); \ + _a->words.w1 = (unsigned int)(s); \ + } + +#define aSegment(pkt, s, b) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_SEGMENT, 24, 8); \ + _a->words.w1 = _SHIFTL(s, 24, 8) | _SHIFTL(b, 0, 24); \ + } + +#define aSetBuffer(pkt, f, i, o, c) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETBUFF, 24, 8) | _SHIFTL(f, 16, 8) | _SHIFTL(i, 0, 16)); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ + } + +#define aSetVolume(pkt, f, v, t, r) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = (_SHIFTL(A_SETVOL, 24, 8) | _SHIFTL(f, 16, 16) | _SHIFTL(v, 0, 16)); \ + _a->words.w1 = _SHIFTL(t, 16, 16) | _SHIFTL(r, 0, 16); \ + } + +#define aSetLoop(pkt, a) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + _a->words.w0 = _SHIFTL(A_SETLOOP, 24, 8); \ + _a->words.w1 = (unsigned int)(a); \ + } + +#define aDMEMMove(pkt, i, o, c) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_DMEMMOVE, 24, 8) | _SHIFTL(i, 0, 24); \ + _a->words.w1 = _SHIFTL(o, 16, 16) | _SHIFTL(c, 0, 16); \ + } + +#define aLoadADPCM(pkt, c, d) \ + { \ + Acmd* _a = (Acmd*)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_LOADADPCM, 24, 8) | _SHIFTL(c, 0, 24); \ + _a->words.w1 = (unsigned int)d; \ + } + +#endif /* _LANGUAGE_C */ + +#endif /* !_ABI_H_ */ diff --git a/lib/hackerlibultra/include/PR/gbi.h b/lib/hackerlibultra/include/PR/gbi.h new file mode 100644 index 00000000..8062511e --- /dev/null +++ b/lib/hackerlibultra/include/PR/gbi.h @@ -0,0 +1,4062 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ +/************************************************************************** + * + * $Revision: 1.141 $ + * $Date: 1999/09/03 03:43:08 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gbi.h,v $ + * + **************************************************************************/ + +#ifndef _GBI_H_ +#define _GBI_H_ + +#include + +/* + * To use the F3DEX ucodes, define F3DEX_GBI before include this file. + * + * #define F3DEX_GBI + * #include + * + * or + * + * cc -c -DF3DEX_GBI -I.... foo.c + * + */ + +/************************************************************************** + * + * Graphics Binary Interface + * + **************************************************************************/ + +/* + * Graphics Commands, 'xxx' parts may be generated from ucode + * + * The command format is + * + * |00xxxxxx| = DMA 0,..,127 + * |10xxxxxx| = Immediate Mode -65,..,-128 + * |11xxxxxx| = RDP cmds -1,..,-64 + * + * Note: in order for the RSP microcode to process RDP commands opaquely, + * we need to further identify those RDP commands that need DRAM address + * "fixup". To do this, we have the dummy command G_RDP_ADDR_FIXUP, and + * all |RDP commands| less than this are commands with embedded DRAM + * addresses. Further, the format of these commands should be similar so + * only one fixup routine is needed. + * + * Further explanation: + * The names of the commands are somewhat misleading. Here is clarification: + * + * - a 'DMA' type command has a pointer to additional data and + * causes a DMA transfer to bring that into DMEM. + * + * - an 'Immediate' type command isn't really 'immediate', in the + * traditional sense. This just means that the entire command fits + * in the 64-bit word, and the ucode can execute it 'immediately' + * without additional memory transfers. + * + * - an 'RDP' command is identified as such because the RDP + * commands can be passed-thru the RSP and sent to the RDP + * directly. One further confusing thing, is that some 'DP' + * macros below actually generate immediate commands, not + * not direct DP commands. + * + * IMPLEMENTATION NOTE: + * There is another group of RDP commands that includes the triangle commands + * generated by the RSP code. These are the raw commands the rasterizer + * hardware chews on, with slope info, etc. They will follow the RDP + * ordering... + * + * IMPLEMENTATION NOTE: + * The RDP hardware has some of these bit patterns wired up. If the hardware + * changes, we must adjust this table, likewise we can't change/add things + * once the hardware is frozen. (actually, the RDP hardware only looks at + * the lower 6 bits of the command byte) + * + */ + +#ifdef F3DEX_GBI_2 +#ifndef F3DEX_GBI +#define F3DEX_GBI +#endif +#define G_NOOP 0x00 +#define G_RDPHALF_2 0xf1 +#define G_SETOTHERMODE_H 0xe3 +#define G_SETOTHERMODE_L 0xe2 +#define G_RDPHALF_1 0xe1 +#define G_SPNOOP 0xe0 +#define G_ENDDL 0xdf +#define G_DL 0xde +#define G_LOAD_UCODE 0xdd +#define G_MOVEMEM 0xdc +#define G_MOVEWORD 0xdb +#define G_MTX 0xda +#define G_GEOMETRYMODE 0xd9 +#define G_POPMTX 0xd8 +#define G_TEXTURE 0xd7 +#define G_DMA_IO 0xd6 +#define G_SPECIAL_1 0xd5 +#define G_SPECIAL_2 0xd4 +#define G_SPECIAL_3 0xd3 + +#define G_VTX 0x01 +#define G_MODIFYVTX 0x02 +#define G_CULLDL 0x03 +#define G_BRANCH_Z 0x04 +#define G_TRI1 0x05 +#define G_TRI2 0x06 +#define G_QUAD 0x07 +#define G_LINE3D 0x08 +#else /* F3DEX_GBI_2 */ + +/* DMA commands: */ +#define G_SPNOOP 0 /* handle 0 gracefully */ +#define G_MTX 1 +#define G_RESERVED0 2 /* not implemeted */ +#define G_MOVEMEM 3 /* move a block of memory (up to 4 words) to dmem */ +#define G_VTX 4 +#define G_RESERVED1 5 /* not implemeted */ +#define G_DL 6 +#define G_RESERVED2 7 /* not implemeted */ +#define G_RESERVED3 8 /* not implemeted */ +#define G_SPRITE2D_BASE 9 /* sprite command */ + +/* IMMEDIATE commands: */ +#define G_IMMFIRST -65 +#define G_TRI1 (G_IMMFIRST - 0) +#define G_CULLDL (G_IMMFIRST - 1) +#define G_POPMTX (G_IMMFIRST - 2) +#define G_MOVEWORD (G_IMMFIRST - 3) +#define G_TEXTURE (G_IMMFIRST - 4) +#define G_SETOTHERMODE_H (G_IMMFIRST - 5) +#define G_SETOTHERMODE_L (G_IMMFIRST - 6) +#define G_ENDDL (G_IMMFIRST - 7) +#define G_SETGEOMETRYMODE (G_IMMFIRST - 8) +#define G_CLEARGEOMETRYMODE (G_IMMFIRST - 9) +#define G_LINE3D (G_IMMFIRST - 10) +#define G_RDPHALF_1 (G_IMMFIRST - 11) +#define G_RDPHALF_2 (G_IMMFIRST - 12) +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +#define G_MODIFYVTX (G_IMMFIRST - 13) +#define G_TRI2 (G_IMMFIRST - 14) +#define G_BRANCH_Z (G_IMMFIRST - 15) +#define G_LOAD_UCODE (G_IMMFIRST - 16) +#else +#define G_RDPHALF_CONT (G_IMMFIRST - 13) +#endif + +/* We are overloading 2 of the immediate commands + to keep the byte alignment of dmem the same */ + +#define G_SPRITE2D_SCALEFLIP (G_IMMFIRST - 1) +#define G_SPRITE2D_DRAW (G_IMMFIRST - 2) + +/* RDP commands: */ +#define G_NOOP 0xc0 /* 0 */ + +#endif /* F3DEX_GBI_2 */ + +/* RDP commands: */ +#define G_SETCIMG 0xff /* -1 */ +#define G_SETZIMG 0xfe /* -2 */ +#define G_SETTIMG 0xfd /* -3 */ +#define G_SETCOMBINE 0xfc /* -4 */ +#define G_SETENVCOLOR 0xfb /* -5 */ +#define G_SETPRIMCOLOR 0xfa /* -6 */ +#define G_SETBLENDCOLOR 0xf9 /* -7 */ +#define G_SETFOGCOLOR 0xf8 /* -8 */ +#define G_SETFILLCOLOR 0xf7 /* -9 */ +#define G_FILLRECT 0xf6 /* -10 */ +#define G_SETTILE 0xf5 /* -11 */ +#define G_LOADTILE 0xf4 /* -12 */ +#define G_LOADBLOCK 0xf3 /* -13 */ +#define G_SETTILESIZE 0xf2 /* -14 */ +#define G_LOADTLUT 0xf0 /* -16 */ +#define G_RDPSETOTHERMODE 0xef /* -17 */ +#define G_SETPRIMDEPTH 0xee /* -18 */ +#define G_SETSCISSOR 0xed /* -19 */ +#define G_SETCONVERT 0xec /* -20 */ +#define G_SETKEYR 0xeb /* -21 */ +#define G_SETKEYGB 0xea /* -22 */ +#define G_RDPFULLSYNC 0xe9 /* -23 */ +#define G_RDPTILESYNC 0xe8 /* -24 */ +#define G_RDPPIPESYNC 0xe7 /* -25 */ +#define G_RDPLOADSYNC 0xe6 /* -26 */ +#define G_TEXRECTFLIP 0xe5 /* -27 */ +#define G_TEXRECT 0xe4 /* -28 */ + +/* + * The following commands are the "generated" RDP commands; the user + * never sees them, the RSP microcode generates them. + * + * The layout of the bits is magical, to save work in the ucode. + * These id's are -56, -52, -54, -50, -55, -51, -53, -49, ... + * edge, shade, texture, zbuff bits: estz + */ +#define G_TRI_FILL 0xc8 /* fill triangle: 11001000 */ +#define G_TRI_SHADE 0xcc /* shade triangle: 11001100 */ +#define G_TRI_TXTR 0xca /* texture triangle: 11001010 */ +#define G_TRI_SHADE_TXTR 0xce /* shade, texture triangle: 11001110 */ +#define G_TRI_FILL_ZBUFF 0xc9 /* fill, zbuff triangle: 11001001 */ +#define G_TRI_SHADE_ZBUFF 0xcd /* shade, zbuff triangle: 11001101 */ +#define G_TRI_TXTR_ZBUFF 0xcb /* texture, zbuff triangle: 11001011 */ +#define G_TRI_SHADE_TXTR_ZBUFF 0xcf /* shade, txtr, zbuff trngl: 11001111 */ + +/* + * A TRI_FILL triangle is just the edges. You need to set the DP + * to use primcolor, in order to see anything. (it is NOT a triangle + * that gets rendered in 'fill mode'. Triangles can't be rendered + * in 'fill mode') + * + * A TRI_SHADE is a gouraud triangle that has colors interpolated. + * Flat-shaded triangles (from the software) are still gouraud shaded, + * it's just the colors are all the same and the deltas are 0. + * + * Other triangle types, and combinations are more obvious. + */ + +/* masks to build RDP triangle commands: */ +#define G_RDP_TRI_FILL_MASK 0x08 +#define G_RDP_TRI_SHADE_MASK 0x04 +#define G_RDP_TRI_TXTR_MASK 0x02 +#define G_RDP_TRI_ZBUFF_MASK 0x01 + +/* + * HACK: + * This is a dreadful hack. For version 1.0 hardware, there are still + * some 'bowtie' hangs. This parameter can be increased to avoid + * the hangs. Every increase of 4 chops one scanline off of every + * triangle. Values of 4,8,12 should be sufficient to avoid any + * bowtie hang. + * + * Change this value, then recompile ALL of your program (including static + * display lists!) + * + * THIS WILL BE REMOVED FOR HARDWARE VERSION 2.0! + */ +#define BOWTIE_VAL 0 + +/* gets added to RDP command, in order to test for addres fixup: */ +#define G_RDP_ADDR_FIXUP 3 /* |RDP cmds| <= this, do addr fixup */ +#ifdef _LANGUAGE_ASSEMBLY +#define G_RDP_TEXRECT_CHECK ((-1 * G_TEXRECTFLIP) & 0xff) +#endif + +/* macros for command parsing: */ +#define GDMACMD(x) (x) +#define GIMMCMD(x) (G_IMMFIRST - (x)) +#define GRDPCMD(x) (0xff - (x)) + +#define G_DMACMDSIZ 128 +#define G_IMMCMDSIZ 64 +#define G_RDPCMDSIZ 64 + +/* + * Coordinate shift values, number of bits of fraction + */ +#define G_TEXTURE_IMAGE_FRAC 2 +#define G_TEXTURE_SCALE_FRAC 16 +#define G_SCALE_FRAC 8 +#define G_ROTATE_FRAC 16 + +/* + * Parameters to graphics commands + */ + +/* + * Data packing macros + */ + +/* + * Maximum z-buffer value, used to initialize the z-buffer. + * Note : this number is NOT the viewport z-scale constant. + * See the comment next to G_MAXZ for more info. + */ +#define G_MAXFBZ 0x3fff /* 3b exp, 11b mantissa */ + +#define GPACK_RGBA5551(r, g, b, a) ((((r) << 8) & 0xf800) | (((g) << 3) & 0x7c0) | (((b) >> 2) & 0x3e) | ((a) & 0x1)) +#define GPACK_ZDZ(z, dz) ((z) << 2 | (dz)) + +/* + * G_MTX: parameter flags + */ +#ifdef F3DEX_GBI_2 +#define G_MTX_MODELVIEW 0x00 /* matrix types */ +#define G_MTX_PROJECTION 0x04 +#define G_MTX_MUL 0x00 /* concat or load */ +#define G_MTX_LOAD 0x02 +#define G_MTX_NOPUSH 0x00 /* push or not */ +#define G_MTX_PUSH 0x01 +#else /* F3DEX_GBI_2 */ +#define G_MTX_MODELVIEW 0x00 /* matrix types */ +#define G_MTX_PROJECTION 0x01 +#define G_MTX_MUL 0x00 /* concat or load */ +#define G_MTX_LOAD 0x02 +#define G_MTX_NOPUSH 0x00 /* push or not */ +#define G_MTX_PUSH 0x04 +#endif /* F3DEX_GBI_2 */ + +/* + * flags for G_SETGEOMETRYMODE + * (this rendering state is maintained in RSP) + * + * DO NOT USE THE LOW 8 BITS OF GEOMETRYMODE: + * The weird bit-ordering is for the micro-code: the lower byte + * can be OR'd in with G_TRI_SHADE (11001100) to construct + * the triangle command directly. Don't break it... + * + * DO NOT USE THE HIGH 8 BITS OF GEOMETRYMODE: + * The high byte is OR'd with 0x703 to form the clip code mask. + * If it is set to 0x04, this will cause near clipping to occur. + * If it is zero, near clipping will not occur. + * + * Further explanation: + * G_SHADE is necessary in order to see the color that you passed + * down with the vertex. If G_SHADE isn't set, you need to set the DP + * appropriately and use primcolor to see anything. + * + * G_SHADING_SMOOTH enabled means use all 3 colors of the triangle. + * If it is not set, then do 'flat shading', where only one vertex color + * is used (and all 3 vertices are set to that same color by the ucode) + * See the man page for gSP1Triangle(). + * + */ +#define G_ZBUFFER 0x00000001 +#define G_SHADE 0x00000004 /* enable Gouraud interp */ +/* rest of low byte reserved for setup ucode */ +#ifdef F3DEX_GBI_2 +#define G_TEXTURE_ENABLE 0x00000000 /* Ignored */ +#define G_SHADING_SMOOTH 0x00200000 /* flat or smooth shaded */ +#define G_CULL_FRONT 0x00000200 +#define G_CULL_BACK 0x00000400 +#define G_CULL_BOTH 0x00000600 /* To make code cleaner */ +#else +#define G_TEXTURE_ENABLE 0x00000002 /* Microcode use only */ +#define G_SHADING_SMOOTH 0x00000200 /* flat or smooth shaded */ +#define G_CULL_FRONT 0x00001000 +#define G_CULL_BACK 0x00002000 +#define G_CULL_BOTH 0x00003000 /* To make code cleaner */ +#endif +#define G_FOG 0x00010000 +#define G_LIGHTING 0x00020000 +#define G_TEXTURE_GEN 0x00040000 +#define G_TEXTURE_GEN_LINEAR 0x00080000 +#define G_LOD 0x00100000 /* NOT IMPLEMENTED */ +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +#define G_CLIPPING 0x00800000 +#else +#define G_CLIPPING 0x00000000 +#endif + +#ifdef _LANGUAGE_ASSEMBLY +#define G_FOG_H (G_FOG / 0x10000) +#define G_LIGHTING_H (G_LIGHTING / 0x10000) +#define G_TEXTURE_GEN_H (G_TEXTURE_GEN / 0x10000) +#define G_TEXTURE_GEN_LINEAR_H (G_TEXTURE_GEN_LINEAR / 0x10000) +#define G_LOD_H (G_LOD / 0x10000) /* NOT IMPLEMENTED */ +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +#define G_CLIPPING_H (G_CLIPPING / 0x10000) +#endif +#endif + +/* Need these defined for Sprite Microcode */ +#ifdef _LANGUAGE_ASSEMBLY +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +#define G_TX_NOMIRROR 0 +#define G_TX_WRAP 0 +#define G_TX_MIRROR 0x1 +#define G_TX_CLAMP 0x2 +#define G_TX_NOMASK 0 +#define G_TX_NOLOD 0 +#endif + +/* + * G_SETIMG fmt: set image formats + */ +#define G_IM_FMT_RGBA 0 +#define G_IM_FMT_YUV 1 +#define G_IM_FMT_CI 2 +#define G_IM_FMT_IA 3 +#define G_IM_FMT_I 4 + +/* + * G_SETIMG siz: set image pixel size + */ +#define G_IM_SIZ_4b 0 +#define G_IM_SIZ_8b 1 +#define G_IM_SIZ_16b 2 +#define G_IM_SIZ_32b 3 +#define G_IM_SIZ_DD 5 + +#define G_IM_SIZ_4b_BYTES 0 +#define G_IM_SIZ_4b_TILE_BYTES G_IM_SIZ_4b_BYTES +#define G_IM_SIZ_4b_LINE_BYTES G_IM_SIZ_4b_BYTES + +#define G_IM_SIZ_8b_BYTES 1 +#define G_IM_SIZ_8b_TILE_BYTES G_IM_SIZ_8b_BYTES +#define G_IM_SIZ_8b_LINE_BYTES G_IM_SIZ_8b_BYTES + +#define G_IM_SIZ_16b_BYTES 2 +#define G_IM_SIZ_16b_TILE_BYTES G_IM_SIZ_16b_BYTES +#define G_IM_SIZ_16b_LINE_BYTES G_IM_SIZ_16b_BYTES + +#define G_IM_SIZ_32b_BYTES 4 +#define G_IM_SIZ_32b_TILE_BYTES 2 +#define G_IM_SIZ_32b_LINE_BYTES 2 + +#define G_IM_SIZ_4b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_8b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_16b_LOAD_BLOCK G_IM_SIZ_16b +#define G_IM_SIZ_32b_LOAD_BLOCK G_IM_SIZ_32b + +#define G_IM_SIZ_4b_SHIFT 2 +#define G_IM_SIZ_8b_SHIFT 1 +#define G_IM_SIZ_16b_SHIFT 0 +#define G_IM_SIZ_32b_SHIFT 0 + +#define G_IM_SIZ_4b_INCR 3 +#define G_IM_SIZ_8b_INCR 1 +#define G_IM_SIZ_16b_INCR 0 +#define G_IM_SIZ_32b_INCR 0 + +/* + * G_SETCOMBINE: color combine modes + */ +/* Color combiner constants: */ +#define G_CCMUX_COMBINED 0 +#define G_CCMUX_TEXEL0 1 +#define G_CCMUX_TEXEL1 2 +#define G_CCMUX_PRIMITIVE 3 +#define G_CCMUX_SHADE 4 +#define G_CCMUX_ENVIRONMENT 5 +#define G_CCMUX_CENTER 6 +#define G_CCMUX_SCALE 6 +#define G_CCMUX_COMBINED_ALPHA 7 +#define G_CCMUX_TEXEL0_ALPHA 8 +#define G_CCMUX_TEXEL1_ALPHA 9 +#define G_CCMUX_PRIMITIVE_ALPHA 10 +#define G_CCMUX_SHADE_ALPHA 11 +#define G_CCMUX_ENV_ALPHA 12 +#define G_CCMUX_LOD_FRACTION 13 +#define G_CCMUX_PRIM_LOD_FRAC 14 +#define G_CCMUX_NOISE 7 +#define G_CCMUX_K4 7 +#define G_CCMUX_K5 15 +#define G_CCMUX_1 6 +#define G_CCMUX_0 31 + +/* Alpha combiner constants: */ +#define G_ACMUX_COMBINED 0 +#define G_ACMUX_TEXEL0 1 +#define G_ACMUX_TEXEL1 2 +#define G_ACMUX_PRIMITIVE 3 +#define G_ACMUX_SHADE 4 +#define G_ACMUX_ENVIRONMENT 5 +#define G_ACMUX_LOD_FRACTION 0 +#define G_ACMUX_PRIM_LOD_FRAC 6 +#define G_ACMUX_1 6 +#define G_ACMUX_0 7 + +/* typical CC cycle 1 modes */ +#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE +#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE +#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE +#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0 +#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0 +#define G_CC_MODULATERGB G_CC_MODULATEI +#define G_CC_MODULATERGBA G_CC_MODULATEIA +#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA +#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0 +#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0 +#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM +#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM +#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM +#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE +#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0 +#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_ADDRGB 1, 0, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_ADDRGBDECALA 1, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE +#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0 +#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0 +#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0 + +/* oddball modes */ +#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0 +#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0 +#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE +/* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */ +#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0 + +/* typical CC cycle 1 modes, usually followed by other cycle 2 modes */ +#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0 +#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0 + +/* + * One-cycle color convert operation + */ +#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE + +/* + * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock. + * Therefore, CC looks for step1 results in TEXEL1 + */ +#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0 + +/* typical CC cycle 2 modes */ +#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED +#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE +#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0 +#define G_CC_MODULATERGB2 G_CC_MODULATEI2 +#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2 +#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE +#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0 +#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2 +#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2 +#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE +/* + * ? +#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE +*/ +#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE +#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0 +#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0 +#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE +#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED +#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0 +#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED + +/* + * G_SETOTHERMODE_L sft: shift count + */ +#define G_MDSFT_ALPHACOMPARE 0 +#define G_MDSFT_ZSRCSEL 2 +#define G_MDSFT_RENDERMODE 3 +#define G_MDSFT_BLENDER 16 + +/* + * G_SETOTHERMODE_H sft: shift count + */ +#define G_MDSFT_BLENDMASK 0 /* unsupported */ +#define G_MDSFT_ALPHADITHER 4 +#define G_MDSFT_RGBDITHER 6 + +#define G_MDSFT_COMBKEY 8 +#define G_MDSFT_TEXTCONV 9 +#define G_MDSFT_TEXTFILT 12 +#define G_MDSFT_TEXTLUT 14 +#define G_MDSFT_TEXTLOD 16 +#define G_MDSFT_TEXTDETAIL 17 +#define G_MDSFT_TEXTPERSP 19 +#define G_MDSFT_CYCLETYPE 20 +#define G_MDSFT_COLORDITHER 22 /* unsupported in HW 2.0 */ +#define G_MDSFT_PIPELINE 23 + +/* G_SETOTHERMODE_H gPipelineMode */ +#define G_PM_1PRIMITIVE (1 << G_MDSFT_PIPELINE) +#define G_PM_NPRIMITIVE (0 << G_MDSFT_PIPELINE) + +/* G_SETOTHERMODE_H gSetCycleType */ +#define G_CYC_1CYCLE (0 << G_MDSFT_CYCLETYPE) +#define G_CYC_2CYCLE (1 << G_MDSFT_CYCLETYPE) +#define G_CYC_COPY (2 << G_MDSFT_CYCLETYPE) +#define G_CYC_FILL (3 << G_MDSFT_CYCLETYPE) + +/* G_SETOTHERMODE_H gSetTexturePersp */ +#define G_TP_NONE (0 << G_MDSFT_TEXTPERSP) +#define G_TP_PERSP (1 << G_MDSFT_TEXTPERSP) + +/* G_SETOTHERMODE_H gSetTextureDetail */ +#define G_TD_CLAMP (0 << G_MDSFT_TEXTDETAIL) +#define G_TD_SHARPEN (1 << G_MDSFT_TEXTDETAIL) +#define G_TD_DETAIL (2 << G_MDSFT_TEXTDETAIL) + +/* G_SETOTHERMODE_H gSetTextureLOD */ +#define G_TL_TILE (0 << G_MDSFT_TEXTLOD) +#define G_TL_LOD (1 << G_MDSFT_TEXTLOD) + +/* G_SETOTHERMODE_H gSetTextureLUT */ +#define G_TT_NONE (0 << G_MDSFT_TEXTLUT) +#define G_TT_RGBA16 (2 << G_MDSFT_TEXTLUT) +#define G_TT_IA16 (3 << G_MDSFT_TEXTLUT) + +/* G_SETOTHERMODE_H gSetTextureFilter */ +#define G_TF_POINT (0 << G_MDSFT_TEXTFILT) +#define G_TF_AVERAGE (3 << G_MDSFT_TEXTFILT) +#define G_TF_BILERP (2 << G_MDSFT_TEXTFILT) + +/* G_SETOTHERMODE_H gSetTextureConvert */ +#define G_TC_CONV (0 << G_MDSFT_TEXTCONV) +#define G_TC_FILTCONV (5 << G_MDSFT_TEXTCONV) +#define G_TC_FILT (6 << G_MDSFT_TEXTCONV) + +/* G_SETOTHERMODE_H gSetCombineKey */ +#define G_CK_NONE (0 << G_MDSFT_COMBKEY) +#define G_CK_KEY (1 << G_MDSFT_COMBKEY) + +/* G_SETOTHERMODE_H gSetColorDither */ +#define G_CD_MAGICSQ (0 << G_MDSFT_RGBDITHER) +#define G_CD_BAYER (1 << G_MDSFT_RGBDITHER) +#define G_CD_NOISE (2 << G_MDSFT_RGBDITHER) + +#ifndef _HW_VERSION_1 +#define G_CD_DISABLE (3 << G_MDSFT_RGBDITHER) +#define G_CD_ENABLE G_CD_NOISE /* HW 1.0 compatibility mode */ +#else +#define G_CD_ENABLE (1 << G_MDSFT_COLORDITHER) +#define G_CD_DISABLE (0 << G_MDSFT_COLORDITHER) +#endif + +/* G_SETOTHERMODE_H gSetAlphaDither */ +#define G_AD_PATTERN (0 << G_MDSFT_ALPHADITHER) +#define G_AD_NOTPATTERN (1 << G_MDSFT_ALPHADITHER) +#define G_AD_NOISE (2 << G_MDSFT_ALPHADITHER) +#define G_AD_DISABLE (3 << G_MDSFT_ALPHADITHER) + +/* G_SETOTHERMODE_L gSetAlphaCompare */ +#define G_AC_NONE (0 << G_MDSFT_ALPHACOMPARE) +#define G_AC_THRESHOLD (1 << G_MDSFT_ALPHACOMPARE) +#define G_AC_DITHER (3 << G_MDSFT_ALPHACOMPARE) + +/* G_SETOTHERMODE_L gSetDepthSource */ +#define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL) +#define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL) + +/* G_SETOTHERMODE_L gSetRenderMode */ +#define AA_EN 0x8 +#define Z_CMP 0x10 +#define Z_UPD 0x20 +#define IM_RD 0x40 +#define CLR_ON_CVG 0x80 +#define CVG_DST_CLAMP 0 +#define CVG_DST_WRAP 0x100 +#define CVG_DST_FULL 0x200 +#define CVG_DST_SAVE 0x300 +#define ZMODE_OPA 0 +#define ZMODE_INTER 0x400 +#define ZMODE_XLU 0x800 +#define ZMODE_DEC 0xc00 +#define CVG_X_ALPHA 0x1000 +#define ALPHA_CVG_SEL 0x2000 +#define FORCE_BL 0x4000 +#define TEX_EDGE 0x0000 /* used to be 0x8000 */ + +#define G_BL_CLR_IN 0 +#define G_BL_CLR_MEM 1 +#define G_BL_CLR_BL 2 +#define G_BL_CLR_FOG 3 +#define G_BL_1MA 0 +#define G_BL_A_MEM 1 +#define G_BL_A_IN 0 +#define G_BL_A_FOG 1 +#define G_BL_A_SHADE 2 +#define G_BL_1 2 +#define G_BL_0 3 + +#define GBL_c1(m1a, m1b, m2a, m2b) (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 +#define GBL_c2(m1a, m1b, m2a, m2b) (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 + +#define RM_AA_ZB_OPA_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_SURF(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_XLU \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_DECAL(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | ZMODE_DEC \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_DECAL(clk) \ + AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | ZMODE_DEC \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_DECAL(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_DEC \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ALPHA_CVG_SEL | ZMODE_INTER \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_ZB_OPA_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ALPHA_CVG_SEL | ZMODE_INTER \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_XLU_INTER(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_INTER \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_XLU_LINE(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_DEC_LINE(clk) \ + AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_TEX_EDGE(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_TEX_INTER(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_SUB_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_ZB_PCL_SURF(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | G_AC_DITHER \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_OPA_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_TEX_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_ZB_SUB_TERR(clk) \ + AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_OPA_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_RA_OPA_SURF(clk) \ + AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_XLU_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | ZMODE_OPA \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_XLU_LINE(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_DEC_LINE(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_TEX_EDGE(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_SUB_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_AA_PCL_SURF(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | G_AC_DITHER | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_OPA_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_TEX_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_AA_SUB_TERR(clk) \ + AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OPA_SURF(clk) \ + Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_OPA \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_ZB_XLU_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OPA_DECAL(clk) \ + Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) + +#define RM_ZB_XLU_DECAL(clk) \ + Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_CLD_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_OVL_SURF(clk) \ + Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_ZB_PCL_SURF(clk) \ + Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | G_AC_DITHER | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_OPA_SURF(clk) CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_XLU_SURF(clk) \ + IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_TEX_EDGE(clk) \ + CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | TEX_EDGE | AA_EN \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_CLD_SURF(clk) \ + IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define RM_PCL_SURF(clk) \ + CVG_DST_FULL | FORCE_BL | ZMODE_OPA | G_AC_DITHER | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define RM_ADD(clk) \ + IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) + +#define RM_NOOP(clk) GBL_c##clk(0, 0, 0, 0) + +#define RM_VISCVG(clk) IM_RD | FORCE_BL | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) + +/* for rendering to an 8-bit framebuffer */ +#define RM_OPA_CI(clk) CVG_DST_CLAMP | ZMODE_OPA | GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +#define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1) +#define G_RM_AA_ZB_OPA_SURF2 RM_AA_ZB_OPA_SURF(2) +#define G_RM_AA_ZB_XLU_SURF RM_AA_ZB_XLU_SURF(1) +#define G_RM_AA_ZB_XLU_SURF2 RM_AA_ZB_XLU_SURF(2) +#define G_RM_AA_ZB_OPA_DECAL RM_AA_ZB_OPA_DECAL(1) +#define G_RM_AA_ZB_OPA_DECAL2 RM_AA_ZB_OPA_DECAL(2) +#define G_RM_AA_ZB_XLU_DECAL RM_AA_ZB_XLU_DECAL(1) +#define G_RM_AA_ZB_XLU_DECAL2 RM_AA_ZB_XLU_DECAL(2) +#define G_RM_AA_ZB_OPA_INTER RM_AA_ZB_OPA_INTER(1) +#define G_RM_AA_ZB_OPA_INTER2 RM_AA_ZB_OPA_INTER(2) +#define G_RM_AA_ZB_XLU_INTER RM_AA_ZB_XLU_INTER(1) +#define G_RM_AA_ZB_XLU_INTER2 RM_AA_ZB_XLU_INTER(2) +#define G_RM_AA_ZB_XLU_LINE RM_AA_ZB_XLU_LINE(1) +#define G_RM_AA_ZB_XLU_LINE2 RM_AA_ZB_XLU_LINE(2) +#define G_RM_AA_ZB_DEC_LINE RM_AA_ZB_DEC_LINE(1) +#define G_RM_AA_ZB_DEC_LINE2 RM_AA_ZB_DEC_LINE(2) +#define G_RM_AA_ZB_TEX_EDGE RM_AA_ZB_TEX_EDGE(1) +#define G_RM_AA_ZB_TEX_EDGE2 RM_AA_ZB_TEX_EDGE(2) +#define G_RM_AA_ZB_TEX_INTER RM_AA_ZB_TEX_INTER(1) +#define G_RM_AA_ZB_TEX_INTER2 RM_AA_ZB_TEX_INTER(2) +#define G_RM_AA_ZB_SUB_SURF RM_AA_ZB_SUB_SURF(1) +#define G_RM_AA_ZB_SUB_SURF2 RM_AA_ZB_SUB_SURF(2) +#define G_RM_AA_ZB_PCL_SURF RM_AA_ZB_PCL_SURF(1) +#define G_RM_AA_ZB_PCL_SURF2 RM_AA_ZB_PCL_SURF(2) +#define G_RM_AA_ZB_OPA_TERR RM_AA_ZB_OPA_TERR(1) +#define G_RM_AA_ZB_OPA_TERR2 RM_AA_ZB_OPA_TERR(2) +#define G_RM_AA_ZB_TEX_TERR RM_AA_ZB_TEX_TERR(1) +#define G_RM_AA_ZB_TEX_TERR2 RM_AA_ZB_TEX_TERR(2) +#define G_RM_AA_ZB_SUB_TERR RM_AA_ZB_SUB_TERR(1) +#define G_RM_AA_ZB_SUB_TERR2 RM_AA_ZB_SUB_TERR(2) + +#define G_RM_RA_ZB_OPA_SURF RM_RA_ZB_OPA_SURF(1) +#define G_RM_RA_ZB_OPA_SURF2 RM_RA_ZB_OPA_SURF(2) +#define G_RM_RA_ZB_OPA_DECAL RM_RA_ZB_OPA_DECAL(1) +#define G_RM_RA_ZB_OPA_DECAL2 RM_RA_ZB_OPA_DECAL(2) +#define G_RM_RA_ZB_OPA_INTER RM_RA_ZB_OPA_INTER(1) +#define G_RM_RA_ZB_OPA_INTER2 RM_RA_ZB_OPA_INTER(2) + +#define G_RM_AA_OPA_SURF RM_AA_OPA_SURF(1) +#define G_RM_AA_OPA_SURF2 RM_AA_OPA_SURF(2) +#define G_RM_AA_XLU_SURF RM_AA_XLU_SURF(1) +#define G_RM_AA_XLU_SURF2 RM_AA_XLU_SURF(2) +#define G_RM_AA_XLU_LINE RM_AA_XLU_LINE(1) +#define G_RM_AA_XLU_LINE2 RM_AA_XLU_LINE(2) +#define G_RM_AA_DEC_LINE RM_AA_DEC_LINE(1) +#define G_RM_AA_DEC_LINE2 RM_AA_DEC_LINE(2) +#define G_RM_AA_TEX_EDGE RM_AA_TEX_EDGE(1) +#define G_RM_AA_TEX_EDGE2 RM_AA_TEX_EDGE(2) +#define G_RM_AA_SUB_SURF RM_AA_SUB_SURF(1) +#define G_RM_AA_SUB_SURF2 RM_AA_SUB_SURF(2) +#define G_RM_AA_PCL_SURF RM_AA_PCL_SURF(1) +#define G_RM_AA_PCL_SURF2 RM_AA_PCL_SURF(2) +#define G_RM_AA_OPA_TERR RM_AA_OPA_TERR(1) +#define G_RM_AA_OPA_TERR2 RM_AA_OPA_TERR(2) +#define G_RM_AA_TEX_TERR RM_AA_TEX_TERR(1) +#define G_RM_AA_TEX_TERR2 RM_AA_TEX_TERR(2) +#define G_RM_AA_SUB_TERR RM_AA_SUB_TERR(1) +#define G_RM_AA_SUB_TERR2 RM_AA_SUB_TERR(2) + +#define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1) +#define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2) + +#define G_RM_ZB_OPA_SURF RM_ZB_OPA_SURF(1) +#define G_RM_ZB_OPA_SURF2 RM_ZB_OPA_SURF(2) +#define G_RM_ZB_XLU_SURF RM_ZB_XLU_SURF(1) +#define G_RM_ZB_XLU_SURF2 RM_ZB_XLU_SURF(2) +#define G_RM_ZB_OPA_DECAL RM_ZB_OPA_DECAL(1) +#define G_RM_ZB_OPA_DECAL2 RM_ZB_OPA_DECAL(2) +#define G_RM_ZB_XLU_DECAL RM_ZB_XLU_DECAL(1) +#define G_RM_ZB_XLU_DECAL2 RM_ZB_XLU_DECAL(2) +#define G_RM_ZB_CLD_SURF RM_ZB_CLD_SURF(1) +#define G_RM_ZB_CLD_SURF2 RM_ZB_CLD_SURF(2) +#define G_RM_ZB_OVL_SURF RM_ZB_OVL_SURF(1) +#define G_RM_ZB_OVL_SURF2 RM_ZB_OVL_SURF(2) +#define G_RM_ZB_PCL_SURF RM_ZB_PCL_SURF(1) +#define G_RM_ZB_PCL_SURF2 RM_ZB_PCL_SURF(2) + +#define G_RM_OPA_SURF RM_OPA_SURF(1) +#define G_RM_OPA_SURF2 RM_OPA_SURF(2) +#define G_RM_XLU_SURF RM_XLU_SURF(1) +#define G_RM_XLU_SURF2 RM_XLU_SURF(2) +#define G_RM_CLD_SURF RM_CLD_SURF(1) +#define G_RM_CLD_SURF2 RM_CLD_SURF(2) +#define G_RM_TEX_EDGE RM_TEX_EDGE(1) +#define G_RM_TEX_EDGE2 RM_TEX_EDGE(2) +#define G_RM_PCL_SURF RM_PCL_SURF(1) +#define G_RM_PCL_SURF2 RM_PCL_SURF(2) +#define G_RM_ADD RM_ADD(1) +#define G_RM_ADD2 RM_ADD(2) +#define G_RM_NOOP RM_NOOP(1) +#define G_RM_NOOP2 RM_NOOP(2) +#define G_RM_VISCVG RM_VISCVG(1) +#define G_RM_VISCVG2 RM_VISCVG(2) +#define G_RM_OPA_CI RM_OPA_CI(1) +#define G_RM_OPA_CI2 RM_OPA_CI(2) + +#define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA) +#define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA) +#define G_RM_PASS GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) + +/* + * G_SETCONVERT: K0-5 + */ +#define G_CV_K0 175 +#define G_CV_K1 -43 +#define G_CV_K2 -89 +#define G_CV_K3 222 +#define G_CV_K4 114 +#define G_CV_K5 42 + +/* + * G_SETSCISSOR: interlace mode + */ +#define G_SC_NON_INTERLACE 0 +#define G_SC_ODD_INTERLACE 3 +#define G_SC_EVEN_INTERLACE 2 + +/* flags to inhibit pushing of the display list (on branch) */ +#define G_DL_PUSH 0x00 +#define G_DL_NOPUSH 0x01 + +/* + * BEGIN C-specific section: (typedef's) + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * Data Structures + * + * NOTE: + * The DMA transfer hardware requires 64-bit aligned, 64-bit multiple- + * sized transfers. This important hardware optimization is unfortunately + * reflected in the programming interface, with some structures + * padded and alignment enforced. + * + * Since structures are aligned to the boundary of the "worst-case" + * element, we can't depend on the C compiler to align things + * properly. + * + * 64-bit structure alignment is enforced by wrapping structures with + * unions that contain a dummy "long long int". Why this works is + * explained in the ANSI C Spec, or on page 186 of the second edition + * of K&R, "The C Programming Language". + * + * The price we pay for this is a little awkwardness referencing the + * structures through the union. There is no memory penalty, since + * all the structures are at least 64-bits the dummy alignment field + * does not increase the size of the union. + * + * Static initialization of these union structures works because + * the ANSI C spec states that static initialization for unions + * works by using the first union element. We put the dummy alignment + * field last for this reason. + * + * (it's possible a newer 64-bit compiler from MIPS might make this + * easier with a flag, but we can't wait for it...) + * + */ + +/* + * Vertex (set up for use with colors) + */ +typedef struct { + short ob[3]; /* x, y, z */ + unsigned short flag; + short tc[2]; /* texture coord */ + unsigned char cn[4]; /* color & alpha */ +} Vtx_t; + +/* + * Vertex (set up for use with normals) + */ +typedef struct { + short ob[3]; /* x, y, z */ + unsigned short flag; + short tc[2]; /* texture coord */ + signed char n[3]; /* normal */ + unsigned char a; /* alpha */ +} Vtx_tn; + +typedef union { + Vtx_t v; /* Use this one for colors */ + Vtx_tn n; /* Use this one for normals */ + long long int force_structure_alignment; +} Vtx; + +/* + * Sprite structure + */ + +typedef struct { + void* SourceImagePointer; + void* TlutPointer; + short Stride; + short SubImageWidth; + short SubImageHeight; + char SourceImageType; + char SourceImageBitSize; + short SourceImageOffsetS; + short SourceImageOffsetT; + /* 20 bytes for above */ + + /* padding to bring structure size to 64 bit allignment */ + char dummy[4]; + +} uSprite_t; + +typedef union { + uSprite_t s; + + /* Need to make sure this is 64 bit aligned */ + long long int force_structure_allignment[3]; +} uSprite; + +/* + * Triangle face + */ +typedef struct { + unsigned char flag; + unsigned char v[3]; +} Tri; + +/* + * 4x4 matrix, fixed point s15.16 format. + * First 8 words are integer portion of the 4x4 matrix + * Last 8 words are the fraction portion of the 4x4 matrix + */ +typedef long Mtx_t[4][4]; + +typedef union { + Mtx_t m; + long long int force_structure_alignment; +} Mtx; + +/* + * Viewport + */ + +/* + * + * This magic value is the maximum INTEGER z-range of the hardware + * (there are also 16-bits of fraction, which are introduced during + * any transformations). This is not just a good idea, it's the law. + * Feeding the hardware eventual z-coordinates (after any transforms + * or scaling) bigger than this, will not work. + * + * This number is DIFFERENT than G_MAXFBZ, which is the maximum value + * you want to use to initialize the z-buffer. + * + * The reason these are different is mildly interesting, but too long + * to explain here. It is basically the result of optimizations in the + * hardware. A more generic API might hide this detail from the users, + * but we don't have the ucode to do that... + * + */ +#define G_MAXZ 0x03ff /* 10 bits of integer screen-Z precision */ + +/* + * The viewport structure elements have 2 bits of fraction, necessary + * to accomodate the sub-pixel positioning scaling for the hardware. + * This can also be exploited to handle odd-sized viewports. + * + * Accounting for these fractional bits, using the default projection + * and viewing matrices, the viewport structure is initialized thusly: + * + * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, G_MAXZ, 0, + * (SCREEN_WD/2)*4, (SCREEN_HT/2)*4, 0, 0, + */ +typedef struct { + short vscale[4]; /* scale, 2 bits fraction */ + short vtrans[4]; /* translate, 2 bits fraction */ + /* both the above arrays are padded to 64-bit boundary */ +} Vp_t; + +typedef union { + Vp_t vp; + long long int force_structure_alignment; +} Vp; + +/* + * MOVEMEM indices + * + * Each of these indexes an entry in a dmem table + * which points to a 1-4 word block of dmem in + * which to store a 1-4 word DMA. + * + */ +#ifdef F3DEX_GBI_2 +/* 0,4 are reserved by G_MTX */ +#define G_MV_MMTX 2 +#define G_MV_PMTX 6 +#define G_MV_VIEWPORT 8 +#define G_MV_LIGHT 10 +#define G_MV_POINT 12 +#define G_MV_MATRIX 14 /* NOTE: this is in moveword table */ +#define G_MVO_LOOKATX (0 * 24) +#define G_MVO_LOOKATY (1 * 24) +#define G_MVO_L0 (2 * 24) +#define G_MVO_L1 (3 * 24) +#define G_MVO_L2 (4 * 24) +#define G_MVO_L3 (5 * 24) +#define G_MVO_L4 (6 * 24) +#define G_MVO_L5 (7 * 24) +#define G_MVO_L6 (8 * 24) +#define G_MVO_L7 (9 * 24) +#else /* F3DEX_GBI_2 */ +#define G_MV_VIEWPORT 0x80 +#define G_MV_LOOKATY 0x82 +#define G_MV_LOOKATX 0x84 +#define G_MV_L0 0x86 +#define G_MV_L1 0x88 +#define G_MV_L2 0x8a +#define G_MV_L3 0x8c +#define G_MV_L4 0x8e +#define G_MV_L5 0x90 +#define G_MV_L6 0x92 +#define G_MV_L7 0x94 +#define G_MV_TXTATT 0x96 +#define G_MV_MATRIX_1 0x9e /* NOTE: this is in moveword table */ +#define G_MV_MATRIX_2 0x98 +#define G_MV_MATRIX_3 0x9a +#define G_MV_MATRIX_4 0x9c +#endif /* F3DEX_GBI_2 */ + +/* + * MOVEWORD indices + * + * Each of these indexes an entry in a dmem table + * which points to a word in dmem in dmem where + * an immediate word will be stored. + * + */ +#define G_MW_MATRIX 0x00 /* NOTE: also used by movemem */ +#define G_MW_NUMLIGHT 0x02 +#define G_MW_CLIP 0x04 +#define G_MW_SEGMENT 0x06 +#define G_MW_FOG 0x08 +#define G_MW_LIGHTCOL 0x0a +#ifdef F3DEX_GBI_2 +#define G_MW_FORCEMTX 0x0c +#else /* F3DEX_GBI_2 */ +#define G_MW_POINTS 0x0c +#endif /* F3DEX_GBI_2 */ +#define G_MW_PERSPNORM 0x0e + +/* + * These are offsets from the address in the dmem table + */ +#define G_MWO_NUMLIGHT 0x00 +#define G_MWO_CLIP_RNX 0x04 +#define G_MWO_CLIP_RNY 0x0c +#define G_MWO_CLIP_RPX 0x14 +#define G_MWO_CLIP_RPY 0x1c +#define G_MWO_SEGMENT_0 0x00 +#define G_MWO_SEGMENT_1 0x01 +#define G_MWO_SEGMENT_2 0x02 +#define G_MWO_SEGMENT_3 0x03 +#define G_MWO_SEGMENT_4 0x04 +#define G_MWO_SEGMENT_5 0x05 +#define G_MWO_SEGMENT_6 0x06 +#define G_MWO_SEGMENT_7 0x07 +#define G_MWO_SEGMENT_8 0x08 +#define G_MWO_SEGMENT_9 0x09 +#define G_MWO_SEGMENT_A 0x0a +#define G_MWO_SEGMENT_B 0x0b +#define G_MWO_SEGMENT_C 0x0c +#define G_MWO_SEGMENT_D 0x0d +#define G_MWO_SEGMENT_E 0x0e +#define G_MWO_SEGMENT_F 0x0f +#define G_MWO_FOG 0x00 +#define G_MWO_aLIGHT_1 0x00 +#define G_MWO_bLIGHT_1 0x04 +#ifdef F3DEX_GBI_2 +#define G_MWO_aLIGHT_2 0x18 +#define G_MWO_bLIGHT_2 0x1c +#define G_MWO_aLIGHT_3 0x30 +#define G_MWO_bLIGHT_3 0x34 +#define G_MWO_aLIGHT_4 0x48 +#define G_MWO_bLIGHT_4 0x4c +#define G_MWO_aLIGHT_5 0x60 +#define G_MWO_bLIGHT_5 0x64 +#define G_MWO_aLIGHT_6 0x78 +#define G_MWO_bLIGHT_6 0x7c +#define G_MWO_aLIGHT_7 0x90 +#define G_MWO_bLIGHT_7 0x94 +#define G_MWO_aLIGHT_8 0xa8 +#define G_MWO_bLIGHT_8 0xac +#else +#define G_MWO_aLIGHT_2 0x20 +#define G_MWO_bLIGHT_2 0x24 +#define G_MWO_aLIGHT_3 0x40 +#define G_MWO_bLIGHT_3 0x44 +#define G_MWO_aLIGHT_4 0x60 +#define G_MWO_bLIGHT_4 0x64 +#define G_MWO_aLIGHT_5 0x80 +#define G_MWO_bLIGHT_5 0x84 +#define G_MWO_aLIGHT_6 0xa0 +#define G_MWO_bLIGHT_6 0xa4 +#define G_MWO_aLIGHT_7 0xc0 +#define G_MWO_bLIGHT_7 0xc4 +#define G_MWO_aLIGHT_8 0xe0 +#define G_MWO_bLIGHT_8 0xe4 +#endif +#define G_MWO_MATRIX_XX_XY_I 0x00 +#define G_MWO_MATRIX_XZ_XW_I 0x04 +#define G_MWO_MATRIX_YX_YY_I 0x08 +#define G_MWO_MATRIX_YZ_YW_I 0x0c +#define G_MWO_MATRIX_ZX_ZY_I 0x10 +#define G_MWO_MATRIX_ZZ_ZW_I 0x14 +#define G_MWO_MATRIX_WX_WY_I 0x18 +#define G_MWO_MATRIX_WZ_WW_I 0x1c +#define G_MWO_MATRIX_XX_XY_F 0x20 +#define G_MWO_MATRIX_XZ_XW_F 0x24 +#define G_MWO_MATRIX_YX_YY_F 0x28 +#define G_MWO_MATRIX_YZ_YW_F 0x2c +#define G_MWO_MATRIX_ZX_ZY_F 0x30 +#define G_MWO_MATRIX_ZZ_ZW_F 0x34 +#define G_MWO_MATRIX_WX_WY_F 0x38 +#define G_MWO_MATRIX_WZ_WW_F 0x3c +#define G_MWO_POINT_RGBA 0x10 +#define G_MWO_POINT_ST 0x14 +#define G_MWO_POINT_XYSCREEN 0x18 +#define G_MWO_POINT_ZSCREEN 0x1c + +/* + * Light structure. + * + * Note: only directional (infinite) lights are currently supported. + * + * Note: the weird order is for the DMEM alignment benefit of + * the microcode. + * + */ + +typedef struct { + unsigned char col[3]; /* diffuse light value (rgba) */ + char pad1; + unsigned char colc[3]; /* copy of diffuse light value (rgba) */ + char pad2; + signed char dir[3]; /* direction of light (normalized) */ + char pad3; +} Light_t; + +typedef struct { + unsigned char col[3]; /* ambient light value (rgba) */ + char pad1; + unsigned char colc[3]; /* copy of ambient light value (rgba) */ + char pad2; +} Ambient_t; + +typedef struct { + int x1, y1, x2, y2; /* texture offsets for highlight 1/2 */ +} Hilite_t; + +typedef union { + Light_t l; + long long int force_structure_alignment[2]; +} Light; + +typedef union { + Ambient_t l; + long long int force_structure_alignment[1]; +} Ambient; + +typedef struct { + Ambient a; + Light l[7]; +} Lightsn; + +typedef struct { + Ambient a; + Light l[1]; +} Lights0; + +typedef struct { + Ambient a; + Light l[1]; +} Lights1; + +typedef struct { + Ambient a; + Light l[2]; +} Lights2; + +typedef struct { + Ambient a; + Light l[3]; +} Lights3; + +typedef struct { + Ambient a; + Light l[4]; +} Lights4; + +typedef struct { + Ambient a; + Light l[5]; +} Lights5; + +typedef struct { + Ambient a; + Light l[6]; +} Lights6; + +typedef struct { + Ambient a; + Light l[7]; +} Lights7; + +typedef struct { + Light l[2]; +} LookAt; + +typedef union { + Hilite_t h; + long int force_structure_alignment[4]; +} Hilite; + +#define gdSPDefLights0(ar, ag, ab) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + {{ { 0, 0, 0},0,{ 0, 0, 0},0,{ 0, 0, 0},0}} \ + } \ + } +#define gdSPDefLights1(ar, ag, ab, r1, g1, b1, x1, y1, z1) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + {{ {r1,g1,b1},0,{r1,g1,b1},0,{x1,y1,z1},0}} \ + } \ + } +#define gdSPDefLights2(ar, ag, ab, r1, g1, b1, x1, y1, z1, r2, g2, b2, x2, y2, z2) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + { { { r1, g1, b1 }, 0, { r1, g1, b1 }, 0, { x1, y1, z1 }, 0 } }, {{ {r2,g2,b2},0,{r2,g2,b2},0,{x2,y2,z2},0}} \ + } \ + } +#define gdSPDefLights3(ar, ag, ab, r1, g1, b1, x1, y1, z1, r2, g2, b2, x2, y2, z2, r3, g3, b3, x3, y3, z3) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + { { { r1, g1, b1 }, 0, { r1, g1, b1 }, 0, { x1, y1, z1 }, 0 } }, \ + { { { r2, g2, b2 }, 0, { r2, g2, b2 }, 0, { x2, y2, z2 }, 0 } }, {{ {r3,g3,b3},0,{r3,g3,b3},0,{x3,y3,z3},0}} \ + } \ + } +#define gdSPDefLights4(ar, ag, ab, r1, g1, b1, x1, y1, z1, r2, g2, b2, x2, y2, z2, r3, g3, b3, x3, y3, z3, r4, g4, b4, \ + x4, y4, z4) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + { { { r1, g1, b1 }, 0, { r1, g1, b1 }, 0, { x1, y1, z1 }, 0 } }, \ + { { { r2, g2, b2 }, 0, { r2, g2, b2 }, 0, { x2, y2, z2 }, 0 } }, \ + { { { r3, g3, b3 }, 0, { r3, g3, b3 }, 0, { x3, y3, z3 }, 0 } }, {{ {r4,g4,b4},0,{r4,g4,b4},0,{x4,y4,z4},0}} \ + } \ + } +#define gdSPDefLights5(ar, ag, ab, r1, g1, b1, x1, y1, z1, r2, g2, b2, x2, y2, z2, r3, g3, b3, x3, y3, z3, r4, g4, b4, \ + x4, y4, z4, r5, g5, b5, x5, y5, z5) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + { { { r1, g1, b1 }, 0, { r1, g1, b1 }, 0, { x1, y1, z1 }, 0 } }, \ + { { { r2, g2, b2 }, 0, { r2, g2, b2 }, 0, { x2, y2, z2 }, 0 } }, \ + { { { r3, g3, b3 }, 0, { r3, g3, b3 }, 0, { x3, y3, z3 }, 0 } }, \ + { { { r4, g4, b4 }, 0, { r4, g4, b4 }, 0, { x4, y4, z4 }, 0 } }, {{ {r5,g5,b5},0,{r5,g5,b5},0,{x5,y5,z5},0}} \ + } \ + } + +#define gdSPDefLights6(ar, ag, ab, r1, g1, b1, x1, y1, z1, r2, g2, b2, x2, y2, z2, r3, g3, b3, x3, y3, z3, r4, g4, b4, \ + x4, y4, z4, r5, g5, b5, x5, y5, z5, r6, g6, b6, x6, y6, z6) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + { { { r1, g1, b1 }, 0, { r1, g1, b1 }, 0, { x1, y1, z1 }, 0 } }, \ + { { { r2, g2, b2 }, 0, { r2, g2, b2 }, 0, { x2, y2, z2 }, 0 } }, \ + { { { r3, g3, b3 }, 0, { r3, g3, b3 }, 0, { x3, y3, z3 }, 0 } }, \ + { { { r4, g4, b4 }, 0, { r4, g4, b4 }, 0, { x4, y4, z4 }, 0 } }, \ + { { { r5, g5, b5 }, 0, { r5, g5, b5 }, 0, { x5, y5, z5 }, 0 } }, {{ {r6,g6,b6},0,{r6,g6,b6},0,{x6,y6,z6},0}} \ + } \ + } + +#define gdSPDefLights7(ar, ag, ab, r1, g1, b1, x1, y1, z1, r2, g2, b2, x2, y2, z2, r3, g3, b3, x3, y3, z3, r4, g4, b4, \ + x4, y4, z4, r5, g5, b5, x5, y5, z5, r6, g6, b6, x6, y6, z6, r7, g7, b7, x7, y7, z7) \ + { \ + { { { ar, ag, ab }, 0, { ar, ag, ab }, 0 } }, { \ + { { { r1, g1, b1 }, 0, { r1, g1, b1 }, 0, { x1, y1, z1 }, 0 } }, \ + { { { r2, g2, b2 }, 0, { r2, g2, b2 }, 0, { x2, y2, z2 }, 0 } }, \ + { { { r3, g3, b3 }, 0, { r3, g3, b3 }, 0, { x3, y3, z3 }, 0 } }, \ + { { { r4, g4, b4 }, 0, { r4, g4, b4 }, 0, { x4, y4, z4 }, 0 } }, \ + { { { r5, g5, b5 }, 0, { r5, g5, b5 }, 0, { x5, y5, z5 }, 0 } }, \ + { { { r6, g6, b6 }, 0, { r6, g6, b6 }, 0, { x6, y6, z6 }, 0 } }, {{ {r7,g7,b7},0,{r7,g7,b7},0,{x7,y7,z7},0}} \ + } \ + } + +#define gdSPDefLookAt(rightx, righty, rightz, upx, upy, upz) \ + { \ + { \ + { { { 0, 0, 0 }, 0, { 0, 0, 0 }, 0, { rightx, righty, rightz }, 0 } }, { {{0,0x80,0},0,{0,0x80,0},0,{upx,upy,upz},0}} \ + } \ + } + +/* + * Graphics DMA Packet + */ +typedef struct { + int cmd : 8; + unsigned int par : 8; + unsigned int len : 16; + unsigned int addr; +} Gdma; + +/* + * Graphics Immediate Mode Packet types + */ +typedef struct { + int cmd : 8; + int pad : 24; + Tri tri; +} Gtri; + +typedef struct { + int cmd : 8; + int pad1 : 24; + int pad2 : 24; + unsigned char param : 8; +} Gpopmtx; + +/* + * typedef struct { + * int cmd:8; + * int pad0:24; + * int pad1:4; + * int number:4; + * int base:24; + * } Gsegment; + */ +typedef struct { + int cmd : 8; + int pad0 : 8; + int mw_index : 8; + int number : 8; + int pad1 : 8; + int base : 24; +} Gsegment; + +typedef struct { + int cmd : 8; + int pad0 : 8; + int sft : 8; + int len : 8; + unsigned int data : 32; +} GsetothermodeL; + +typedef struct { + int cmd : 8; + int pad0 : 8; + int sft : 8; + int len : 8; + unsigned int data : 32; +} GsetothermodeH; + +typedef struct { + unsigned char cmd; + unsigned char lodscale; + unsigned char tile; + unsigned char on; + unsigned short s; + unsigned short t; +} Gtexture; + +typedef struct { + int cmd : 8; + int pad : 24; + Tri line; +} Gline3D; + +typedef struct { + int cmd : 8; + int pad1 : 24; + short int pad2; + short int scale; +} Gperspnorm; + +/* + * RDP Packet types + */ +typedef struct { + int cmd : 8; + unsigned int fmt : 3; + unsigned int siz : 2; + unsigned int pad : 7; + unsigned int wd : 12; /* really only 10 bits, extra */ + unsigned int dram; /* to account for 1024 */ +} Gsetimg; + +typedef struct { + int cmd : 8; + unsigned int muxs0 : 24; + unsigned int muxs1 : 32; +} Gsetcombine; + +typedef struct { + int cmd : 8; + unsigned char pad; + unsigned char prim_min_level; + unsigned char prim_level; + unsigned long color; +} Gsetcolor; + +typedef struct { + int cmd : 8; + int x0 : 10; + int x0frac : 2; + int y0 : 10; + int y0frac : 2; + unsigned int pad : 8; + int x1 : 10; + int x1frac : 2; + int y1 : 10; + int y1frac : 2; +} Gfillrect; + +typedef struct { + int cmd : 8; + unsigned int fmt : 3; + unsigned int siz : 2; + unsigned int pad0 : 1; + unsigned int line : 9; + unsigned int tmem : 9; + unsigned int pad1 : 5; + unsigned int tile : 3; + unsigned int palette : 4; + unsigned int ct : 1; + unsigned int mt : 1; + unsigned int maskt : 4; + unsigned int shiftt : 4; + unsigned int cs : 1; + unsigned int ms : 1; + unsigned int masks : 4; + unsigned int shifts : 4; +} Gsettile; + +typedef struct { + int cmd : 8; + unsigned int sl : 12; + unsigned int tl : 12; + int pad : 5; + unsigned int tile : 3; + unsigned int sh : 12; + unsigned int th : 12; +} Gloadtile; + +typedef Gloadtile Gloadblock; + +typedef Gloadtile Gsettilesize; + +typedef Gloadtile Gloadtlut; + +typedef struct { + unsigned int cmd : 8; /* command */ + unsigned int xl : 12; /* X coordinate of upper left */ + unsigned int yl : 12; /* Y coordinate of upper left */ + unsigned int pad1 : 5; /* Padding */ + unsigned int tile : 3; /* Tile descriptor index */ + unsigned int xh : 12; /* X coordinate of lower right */ + unsigned int yh : 12; /* Y coordinate of lower right */ + unsigned int s : 16; /* S texture coord at top left */ + unsigned int t : 16; /* T texture coord at top left */ + unsigned int dsdx : 16; /* Change in S per change in X */ + unsigned int dtdy : 16; /* Change in T per change in Y */ +} Gtexrect; + +#define MakeTexRect(xh, yh, flip, tile, xl, yl, s, t, dsdx, dtdy) \ + G_TEXRECT, xh, yh, 0, flip, 0, tile, xl, yl, s, t, dsdx, dtdy + +/* + * Textured rectangles are 128 bits not 64 bits + */ +typedef struct { + unsigned long w0; + unsigned long w1; + unsigned long w2; + unsigned long w3; +} TexRect; + +/* + * Generic Gfx Packet + */ +typedef struct { + unsigned int w0; + unsigned int w1; +} Gwords; + +/* + * This union is the fundamental type of the display list. + * It is, by law, exactly 64 bits in size. + */ +typedef union { + Gwords words; + Gdma dma; + Gtri tri; + Gline3D line; + Gpopmtx popmtx; + Gsegment segment; + GsetothermodeH setothermodeH; + GsetothermodeL setothermodeL; + Gtexture texture; + Gperspnorm perspnorm; + Gsetimg setimg; + Gsetcombine setcombine; + Gsetcolor setcolor; + Gfillrect fillrect; /* use for setscissor also */ + Gsettile settile; + Gloadtile loadtile; /* use for loadblock also, th is dxt */ + Gsettilesize settilesize; + Gloadtlut loadtlut; + long long int force_structure_alignment; +} Gfx; + +/* + * Macros to assemble the graphics display list + */ + +/* + * DMA macros + */ +#define gDma0p(pkt, c, s, l) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8) | _SHIFTL((l), 0, 24); \ + _g->words.w1 = (unsigned int)(s); \ + } + +#define gsDma0p(c, s, l) \ + { \ + { \ + _SHIFTL((c), 24, 8) | _SHIFTL((l), 0, 24), (unsigned int)(s) \ + } \ + } + +#define gDma1p(pkt, c, s, l, p) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | _SHIFTL((l), 0, 16)); \ + _g->words.w1 = (unsigned int)(s); \ + } + +#define gsDma1p(c, s, l, p) \ + { \ + { \ + (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | _SHIFTL((l), 0, 16)), (unsigned int)(s) \ + } \ + } + +#define gDma2p(pkt, c, adrs, len, idx, ofs) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = \ + (_SHIFTL((c), 24, 8) | _SHIFTL(((len) - 1) / 8, 19, 5) | _SHIFTL((ofs) / 8, 8, 8) | _SHIFTL((idx), 0, 8)); \ + _g->words.w1 = (unsigned int)(adrs); \ + } +#define gsDma2p(c, adrs, len, idx, ofs) \ + { \ + { \ + (_SHIFTL((c), 24, 8) | _SHIFTL(((len) - 1) / 8, 19, 5) | _SHIFTL((ofs) / 8, 8, 8) | _SHIFTL((idx), 0, 8)), \ + (unsigned int)(adrs) \ + } \ + } + +#define gSPNoOp(pkt) gDma0p(pkt, G_SPNOOP, 0, 0) +#define gsSPNoOp() gsDma0p(G_SPNOOP, 0, 0) + +#ifdef F3DEX_GBI_2 +#define gSPMatrix(pkt, m, p) gDma2p((pkt), G_MTX, (m), sizeof(Mtx), (p) ^ G_MTX_PUSH, 0) +#define gsSPMatrix(m, p) gsDma2p(G_MTX, (m), sizeof(Mtx), (p) ^ G_MTX_PUSH, 0) +#else /* F3DEX_GBI_2 */ +#define gSPMatrix(pkt, m, p) gDma1p(pkt, G_MTX, m, sizeof(Mtx), p) +#define gsSPMatrix(m, p) gsDma1p(G_MTX, m, sizeof(Mtx), p) +#endif /* F3DEX_GBI_2 */ + +#if defined(F3DEX_GBI_2) +/* + * F3DEX_GBI_2: G_VTX GBI format was changed. + * + * +--------+----+---+---+----+------+-+ + * G_VTX | cmd:8 |0000| n:8 |0000|v0+n:7|0| + * +-+---+--+----+---+---+----+------+-+ + * | |seg| address | + * +-+---+-----------------------------+ + */ +#define gSPVertex(pkt, v, n, v0) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = _SHIFTL(G_VTX, 24, 8) | _SHIFTL((n), 12, 8) | _SHIFTL((v0) + (n), 1, 7); \ + _g->words.w1 = (unsigned int)(v); \ + } +#define gsSPVertex(v, n, v0) \ + { \ + { \ + (_SHIFTL(G_VTX, 24, 8) | _SHIFTL((n), 12, 8) | _SHIFTL((v0) + (n), 1, 7)), (unsigned int)(v) \ + } \ + } +#elif (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +/* + * F3DEX_GBI: G_VTX GBI format was changed to support 64 vertice. + * + * +--------+--------+------+----------+ + * G_VTX | cmd:8 | v0:8 | n:6 |length:10 | + * +-+---+--+--------+------+----------+ + * | |seg| address | + * +-+---+-----------------------------+ + */ +#define gSPVertex(pkt, v, n, v0) gDma1p((pkt), G_VTX, (v), ((n) << 10) | (sizeof(Vtx) * (n) - 1), (v0) * 2) +#define gsSPVertex(v, n, v0) gsDma1p(G_VTX, (v), ((n) << 10) | (sizeof(Vtx) * (n) - 1), (v0) * 2) +#else +#define gSPVertex(pkt, v, n, v0) gDma1p(pkt, G_VTX, v, sizeof(Vtx) * (n), ((n) - 1) << 4 | (v0)) +#define gsSPVertex(v, n, v0) gsDma1p(G_VTX, v, sizeof(Vtx) * (n), ((n) - 1) << 4 | (v0)) +#endif + +#ifdef F3DEX_GBI_2 +#define gSPViewport(pkt, v) gDma2p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0) +#define gsSPViewport(v) gsDma2p(G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0) +#else /* F3DEX_GBI_2 */ +#define gSPViewport(pkt, v) gDma1p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT) +#define gsSPViewport(v) gsDma1p(G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT) +#endif /* F3DEX_GBI_2 */ + +#define gSPDisplayList(pkt, dl) gDma1p(pkt, G_DL, dl, 0, G_DL_PUSH) +#define gsSPDisplayList(dl) gsDma1p(G_DL, dl, 0, G_DL_PUSH) + +#define gSPBranchList(pkt, dl) gDma1p(pkt, G_DL, dl, 0, G_DL_NOPUSH) +#define gsSPBranchList(dl) gsDma1p(G_DL, dl, 0, G_DL_NOPUSH) + +#define gSPSprite2DBase(pkt, s) gDma1p(pkt, G_SPRITE2D_BASE, s, sizeof(uSprite), 0) +#define gsSPSprite2DBase(s) gsDma1p(G_SPRITE2D_BASE, s, sizeof(uSprite), 0) + +/* + * RSP short command (no DMA required) macros + */ +#define gImmp0(pkt, c) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + } + +#define gsImmp0(c) \ + { \ + { \ + _SHIFTL((c), 24, 8) \ + } \ + } + +#define gImmp1(pkt, c, p0) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = (unsigned int)(p0); \ + } + +#define gsImmp1(c, p0) \ + { \ + { \ + _SHIFTL((c), 24, 8), (unsigned int)(p0) \ + } \ + } + +#define gImmp2(pkt, c, p0, p1) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8); \ + } + +#define gsImmp2(c, p0, p1) \ + { \ + { \ + _SHIFTL((c), 24, 8), _SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) \ + } \ + } + +#define gImmp3(pkt, c, p0, p1, p2) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL((c), 24, 8); \ + _g->words.w1 = (_SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) | _SHIFTL((p2), 0, 8)); \ + } + +#define gsImmp3(c, p0, p1, p2) \ + { \ + { \ + _SHIFTL((c), 24, 8), (_SHIFTL((p0), 16, 16) | _SHIFTL((p1), 8, 8) | _SHIFTL((p2), 0, 8)) \ + } \ + } + +#define gImmp21(pkt, c, p0, p1, dat) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | _SHIFTL((p1), 0, 8)); \ + _g->words.w1 = (unsigned int)(dat); \ + } + +#define gsImmp21(c, p0, p1, dat) \ + { \ + { \ + _SHIFTL((c), 24, 8) | _SHIFTL((p0), 8, 16) | _SHIFTL((p1), 0, 8), (unsigned int)(dat) \ + } \ + } + +#ifdef F3DEX_GBI_2 +#define gMoveWd(pkt, index, offset, data) gDma1p((pkt), G_MOVEWORD, data, offset, index) +#define gsMoveWd(index, offset, data) gsDma1p(G_MOVEWORD, data, offset, index) +#else /* F3DEX_GBI_2 */ +#define gMoveWd(pkt, index, offset, data) gImmp21((pkt), G_MOVEWORD, offset, index, data) +#define gsMoveWd(index, offset, data) gsImmp21(G_MOVEWORD, offset, index, data) +#endif /* F3DEX_GBI_2 */ + +/* Sprite immediate macros, there is also a sprite dma macro above */ + +#define gSPSprite2DScaleFlip(pkt, sx, sy, fx, fy) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SPRITE2D_SCALEFLIP, 24, 8) | _SHIFTL((fx), 8, 8) | _SHIFTL((fy), 0, 8)); \ + _g->words.w1 = (_SHIFTL((sx), 16, 16) | _SHIFTL((sy), 0, 16)); \ + } + +#define gsSPSprite2DScaleFlip(sx, sy, fx, fy) \ + { \ + { \ + (_SHIFTL(G_SPRITE2D_SCALEFLIP, 24, 8) | _SHIFTL((fx), 8, 8) | _SHIFTL((fy), 0, 8)), \ + (_SHIFTL((sx), 16, 16) | _SHIFTL((sy), 0, 16)) \ + } \ + } + +#define gSPSprite2DDraw(pkt, px, py) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SPRITE2D_DRAW, 24, 8)); \ + _g->words.w1 = (_SHIFTL((px), 16, 16) | _SHIFTL((py), 0, 16)); \ + } + +#define gsSPSprite2DDraw(px, py) \ + { \ + { \ + (_SHIFTL(G_SPRITE2D_DRAW, 24, 8)), (_SHIFTL((px), 16, 16) | _SHIFTL((py), 0, 16)) \ + } \ + } + +/* + * Note: the SP1Triangle() and line macros multiply the vertex indices + * by 10, this is an optimization for the microcode. + */ +#if (defined(F3DLP_GBI) || defined(F3DEX_GBI)) +#define __gsSP1Triangle_w1(v0, v1, v2) (_SHIFTL((v0) * 2, 16, 8) | _SHIFTL((v1) * 2, 8, 8) | _SHIFTL((v2) * 2, 0, 8)) +#define __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2) \ + : ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v0) \ + : __gsSP1Triangle_w1(v2, v0, v1)) +#define __gsSPLine3D_w1(v0, v1, wd) (_SHIFTL((v0) * 2, 16, 8) | _SHIFT((v1) * 2, 8, 8) | _SHIFT((wd), 0, 8)) +#define __gsSPLine3D_w1f(v0, v1, wd, flag) (((flag) == 0) ? __gsSPLine3D_w1(v0, v1, wd) : __gsSPLine3D_w1(v1, v0, wd)) +#define __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2) \ + : ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v3) \ + : ((flag) == 2) ? __gsSP1Triangle_w1(v2, v3, v0) \ + : __gsSP1Triangle_w1(v3, v0, v1)) +#define __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ + (((flag) == 0) ? __gsSP1Triangle_w1(v0, v2, v3) \ + : ((flag) == 1) ? __gsSP1Triangle_w1(v1, v3, v0) \ + : ((flag) == 2) ? __gsSP1Triangle_w1(v2, v0, v1) \ + : __gsSP1Triangle_w1(v3, v1, v2)) +#else +#define __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + (_SHIFTL((flag), 24, 8) | _SHIFTL((v0) * 10, 16, 8) | _SHIFTL((v1) * 10, 8, 8) | _SHIFTL((v2) * 10, 0, 8)) +#define __gsSPLine3D_w1f(v0, v1, wd, flag) \ + (_SHIFTL((flag), 24, 8) | _SHIFTL((v0) * 10, 16, 8) | _SHIFTL((v1) * 10, 8, 8) | _SHIFTL((wd), 0, 8)) +#endif + +#ifdef F3DEX_GBI_2 +/*** + *** 1 Triangle + ***/ +#define gSP1Triangle(pkt, v0, v1, v2, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_TRI1, 24, 8) | __gsSP1Triangle_w1f(v0, v1, v2, flag); \ + _g->words.w1 = 0; \ + } +#define gsSP1Triangle(v0, v1, v2, flag) { { _SHIFTL(G_TRI1, 24, 8) | __gsSP1Triangle_w1f(v0, v1, v2, flag), 0 } } + +/*** + *** Line + ***/ +#define gSPLine3D(pkt, v0, v1, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8) | __gsSPLine3D_w1f(v0, v1, 0, flag); \ + _g->words.w1 = 0; \ + } +#define gsSPLine3D(v0, v1, flag) { { _SHIFTL(G_LINE3D, 24, 8) | __gsSPLine3D_w1f(v0, v1, 0, flag), 0 } } + +/*** + *** LineW + ***/ +/* these macros are the same as SPLine3D, except they have an + * additional parameter for width. The width is added to the "minimum" + * thickness, which is 1.5 pixels. The units for width are in + * half-pixel units, so a width of 1 translates to (.5 + 1.5) or + * a 2.0 pixels wide line. + */ +#define gSPLineW3D(pkt, v0, v1, wd, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8) | __gsSPLine3D_w1f(v0, v1, wd, flag); \ + _g->words.w1 = 0; \ + } +#define gsSPLineW3D(v0, v1, wd, flag) { { _SHIFTL(G_LINE3D, 24, 8) | __gsSPLine3D_w1f(v0, v1, wd, flag), 0 } } + +/*** + *** 1 Quadrangle + ***/ +#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_QUAD, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ + _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ + } + +#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ + { \ + { \ + (_SHIFTL(G_QUAD, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \ + __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ + } \ + } +#else /* F3DEX_GBI_2 */ + +/*** + *** 1 Triangle + ***/ +#define gSP1Triangle(pkt, v0, v1, v2, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \ + _g->words.w1 = __gsSP1Triangle_w1f(v0, v1, v2, flag); \ + } +#define gsSP1Triangle(v0, v1, v2, flag) \ + { \ + { \ + _SHIFTL(G_TRI1, 24, 8), __gsSP1Triangle_w1f(v0, v1, v2, flag) \ + } \ + } + +/*** + *** Line + ***/ +#define gSPLine3D(pkt, v0, v1, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8); \ + _g->words.w1 = __gsSPLine3D_w1f(v0, v1, 0, flag); \ + } +#define gsSPLine3D(v0, v1, flag) \ + { \ + { \ + _SHIFTL(G_LINE3D, 24, 8), __gsSPLine3D_w1f(v0, v1, 0, flag) \ + } \ + } + +/*** + *** LineW + ***/ +/* these macros are the same as SPLine3D, except they have an + * additional parameter for width. The width is added to the "minimum" + * thickness, which is 1.5 pixels. The units for width are in + * half-pixel units, so a width of 1 translates to (.5 + 1.5) or + * a 2.0 pixels wide line. + */ +#define gSPLineW3D(pkt, v0, v1, wd, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_LINE3D, 24, 8); \ + _g->words.w1 = __gsSPLine3D_w1f(v0, v1, wd, flag); \ + } +#define gsSPLineW3D(v0, v1, wd, flag) \ + { \ + { \ + _SHIFTL(G_LINE3D, 24, 8), __gsSPLine3D_w1f(v0, v1, wd, flag) \ + } \ + } + +/*** + *** 1 Quadrangle + ***/ +#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \ + _g->words.w1 = __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag); \ + } + +#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \ + { \ + { \ + (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \ + __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \ + } \ + } +#endif /* F3DEX_GBI_2 */ + +#if (defined(F3DLP_GBI) || defined(F3DEX_GBI)) +/*** + *** 2 Triangles + ***/ +#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \ + _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \ + } + +#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \ + { \ + { \ + (_SHIFTL(G_TRI2, 24, 8) | __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \ + __gsSP1Triangle_w1f(v10, v11, v12, flag1) \ + } \ + } + +#endif /* F3DEX_GBI/F3DLP_GBI */ + +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +#define gSPCullDisplayList(pkt, vstart, vend) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart) * 2, 0, 16); \ + _g->words.w1 = _SHIFTL((vend) * 2, 0, 16); \ + } + +#define gsSPCullDisplayList(vstart, vend) \ + { \ + { \ + _SHIFTL(G_CULLDL, 24, 8) | _SHIFTL((vstart) * 2, 0, 16), _SHIFTL((vend) * 2, 0, 16) \ + } \ + } + +#else +#define gSPCullDisplayList(pkt, vstart, vend) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart)) * 40); \ + _g->words.w1 = (unsigned int)((0x0f & ((vend) + 1)) * 40); \ + } + +#define gsSPCullDisplayList(vstart, vend) \ + { \ + { \ + _SHIFTL(G_CULLDL, 24, 8) | ((0x0f & (vstart)) * 40), ((0x0f & ((vend) + 1)) * 40) \ + } \ + } +#endif + +#define gSPSegment(pkt, segment, base) gMoveWd(pkt, G_MW_SEGMENT, (segment) * 4, base) +#define gsSPSegment(segment, base) gsMoveWd(G_MW_SEGMENT, (segment) * 4, base) + +/* + * Clipping Macros + */ +#define FR_NEG_FRUSTRATIO_1 0x00000001 +#define FR_POS_FRUSTRATIO_1 0x0000ffff +#define FR_NEG_FRUSTRATIO_2 0x00000002 +#define FR_POS_FRUSTRATIO_2 0x0000fffe +#define FR_NEG_FRUSTRATIO_3 0x00000003 +#define FR_POS_FRUSTRATIO_3 0x0000fffd +#define FR_NEG_FRUSTRATIO_4 0x00000004 +#define FR_POS_FRUSTRATIO_4 0x0000fffc +#define FR_NEG_FRUSTRATIO_5 0x00000005 +#define FR_POS_FRUSTRATIO_5 0x0000fffb +#define FR_NEG_FRUSTRATIO_6 0x00000006 +#define FR_POS_FRUSTRATIO_6 0x0000fffa +/* + * r should be one of: FRUSTRATIO_1, FRUSTRATIO_2, FRUSTRATIO_3, ... FRUSTRATIO_6 + */ +#define gSPClipRatio(pkt, r) \ + { \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r); \ + gMoveWd(pkt, G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r); \ + } + +#define gsSPClipRatio(r) \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, FR_NEG_##r), gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, FR_NEG_##r), \ + gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, FR_POS_##r), gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, FR_POS_##r) + +/* + * Insert values into Matrix + * + * where = element of matrix (byte offset) + * num = new element (32 bit value replacing 2 int or 2 frac matrix + * componants + */ +#ifdef F3DEX_GBI_2 +#define gSPInsertMatrix(pkt, where, num) ERROR !!gSPInsertMatrix is no longer supported. +#define gsSPInsertMatrix(where, num) ERROR !!gsSPInsertMatrix is no longer supported. +#else +#define gSPInsertMatrix(pkt, where, num) gMoveWd(pkt, G_MW_MATRIX, where, num) +#define gsSPInsertMatrix(where, num) gsMoveWd(G_MW_MATRIX, where, num) +#endif + +/* + * Load new matrix directly + * + * mptr = pointer to matrix + */ +#ifdef F3DEX_GBI_2 +#define gSPForceMatrix(pkt, mptr) \ + { \ + gDma2p((pkt), G_MOVEMEM, (mptr), sizeof(Mtx), G_MV_MATRIX, 0); \ + gMoveWd((pkt), G_MW_FORCEMTX, 0, 0x00010000); \ + } +#define gsSPForceMatrix(mptr) \ + gsDma2p(G_MOVEMEM, (mptr), sizeof(Mtx), G_MV_MATRIX, 0), gsMoveWd(G_MW_FORCEMTX, 0, 0x00010000) + +#else /* F3DEX_GBI_2 */ +#define gSPForceMatrix(pkt, mptr) \ + { \ + gDma1p(pkt, G_MOVEMEM, mptr, 16, G_MV_MATRIX_1); \ + gDma1p(pkt, G_MOVEMEM, (char*)(mptr) + 16, 16, G_MV_MATRIX_2); \ + gDma1p(pkt, G_MOVEMEM, (char*)(mptr) + 32, 16, G_MV_MATRIX_3); \ + gDma1p(pkt, G_MOVEMEM, (char*)(mptr) + 48, 16, G_MV_MATRIX_4); \ + } +#define gsSPForceMatrix(mptr) \ + gsDma1p(G_MOVEMEM, mptr, 16, G_MV_MATRIX_1), gsDma1p(G_MOVEMEM, (char*)(mptr) + 16, 16, G_MV_MATRIX_2), \ + gsDma1p(G_MOVEMEM, (char*)(mptr) + 32, 16, G_MV_MATRIX_3), \ + gsDma1p(G_MOVEMEM, (char*)(mptr) + 48, 16, G_MV_MATRIX_4) +#endif /* F3DEX_GBI_2 */ + +/* + * Insert values into Points + * + * point = point number 0-15 + * where = which element of point to modify (byte offset into point) + * num = new value (32 bit) + */ +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +#define gSPModifyVertex(pkt, vtx, where, val) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = (_SHIFTL(G_MODIFYVTX, 24, 8) | _SHIFTL((where), 16, 8) | _SHIFTL((vtx) * 2, 0, 16)); \ + _g->words.w1 = (unsigned int)(val); \ + } +#define gsSPModifyVertex(vtx, where, val) \ + { \ + { \ + _SHIFTL(G_MODIFYVTX, 24, 8) | _SHIFTL((where), 16, 8) | _SHIFTL((vtx) * 2, 0, 16), (unsigned int)(val) \ + } \ + } +#else +#define gSPModifyVertex(pkt, vtx, where, val) gMoveWd(pkt, G_MW_POINTS, (vtx) * 40 + (where), val) +#define gsSPModifyVertex(vtx, where, val) gsMoveWd(G_MW_POINTS, (vtx) * 40 + (where), val) +#endif + +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI)) +/* + * gSPBranchLessZ Branch DL if (vtx.z) less than or equal (zval). + * + * dl = DL branch to + * vtx = Vertex + * zval = Screen depth + * near = Near plane + * far = Far plane + * flag = G_BZ_PERSP or G_BZ_ORTHO + */ + +#define G_BZ_PERSP 0 +#define G_BZ_ORTHO 1 + +#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \ + (((unsigned int)FTOFIX32(((flag) == G_BZ_PERSP \ + ? (1.0f - (float)(near) / (float)(zval)) / (1.0f - (float)(near) / (float)(far)) \ + : ((float)(zval) - (float)(near)) / ((float)(far) - (float)(near))))) \ + * (((int)((zmax) - (zmin))) & ~1) \ + + (int)FTOFIX32(zmin)) + +#define G_DEPTOZS(zval, near, far, flag) G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ) + +#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \ + _g->words.w1 = (unsigned int)(dl); \ + _g = (Gfx*)(pkt); \ + _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12)); \ + _g->words.w1 = G_DEPTOZSrg(zval, near, far, flag, zmin, zmax); \ + } + +#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \ + { { \ + _SHIFTL(G_RDPHALF_1, 24, 8), \ + (unsigned int)(dl), \ + } }, \ + { \ + { \ + _SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12), \ + G_DEPTOZSrg(zval, near, far, flag, zmin, zmax), \ + } \ + } + +#define gSPBranchLessZ(pkt, dl, vtx, zval, near, far, flag) \ + gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, 0, G_MAXZ) +#define gsSPBranchLessZ(dl, vtx, zval, near, far, flag) gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, 0, G_MAXZ) + +/* + * gSPBranchLessZraw Branch DL if (vtx.z) less than or equal (raw zval). + * + * dl = DL branch to + * vtx = Vertex + * zval = Raw value of screen depth + */ +#define gSPBranchLessZraw(pkt, dl, vtx, zval) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \ + _g->words.w1 = (unsigned int)(dl); \ + _g = (Gfx*)(pkt); \ + _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12)); \ + _g->words.w1 = (unsigned int)(zval); \ + } + +#define gsSPBranchLessZraw(dl, vtx, zval) \ + { { \ + _SHIFTL(G_RDPHALF_1, 24, 8), \ + (unsigned int)(dl), \ + } }, \ + { \ + { \ + _SHIFTL(G_BRANCH_Z, 24, 8) | _SHIFTL((vtx) * 5, 12, 12) | _SHIFTL((vtx) * 2, 0, 12), (unsigned int)(zval), \ + } \ + } + +/* + * gSPLoadUcode RSP loads specified ucode. + * + * uc_start = ucode text section start + * uc_dstart = ucode data section start + */ +#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \ + _g->words.w1 = (unsigned int)(uc_dstart); \ + _g = (Gfx*)(pkt); \ + _g->words.w0 = (_SHIFTL(G_LOAD_UCODE, 24, 8) | _SHIFTL((int)(uc_dsize) - 1, 0, 16)); \ + _g->words.w1 = (unsigned int)(uc_start); \ + } + +#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \ + { { \ + _SHIFTL(G_RDPHALF_1, 24, 8), \ + (unsigned int)(uc_dstart), \ + } }, \ + { \ + { \ + _SHIFTL(G_LOAD_UCODE, 24, 8) | _SHIFTL((int)(uc_dsize) - 1, 0, 16), (unsigned int)(uc_start), \ + } \ + } + +#define gSPLoadUcode(pkt, uc_start, uc_dstart) gSPLoadUcodeEx((pkt), (uc_start), (uc_dstart), SP_UCODE_DATA_SIZE) +#define gsSPLoadUcode(uc_start, uc_dstart) gsSPLoadUcodeEx((uc_start), (uc_dstart), SP_UCODE_DATA_SIZE) + +#define gSPLoadUcodeL(pkt, ucode) \ + gSPLoadUcode((pkt), OS_K0_TO_PHYSICAL(&##ucode##TextStart), OS_K0_TO_PHYSICAL(&##ucode##DataStart)) +#define gsSPLoadUcodeL(ucode) \ + gsSPLoadUcode(OS_K0_TO_PHYSICAL(&##ucode##TextStart), OS_K0_TO_PHYSICAL(&##ucode##DataStart)) +#endif + +#ifdef F3DEX_GBI_2 +/* + * gSPDma_io DMA to/from DMEM/IMEM for DEBUG. + */ +#define gSPDma_io(pkt, flag, dmem, dram, size) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = _SHIFTL(G_DMA_IO, 24, 8) | _SHIFTL((flag), 23, 1) | _SHIFTL((dmem) / 8, 13, 10) \ + | _SHIFTL((size) - 1, 0, 12); \ + _g->words.w1 = (unsigned int)(dram); \ + } + +#define gsSPDma_io(flag, dmem, dram, size) \ + { \ + { \ + _SHIFTL(G_DMA_IO, 24, 8) | _SHIFTL((flag), 23, 1) | _SHIFTL((dmem) / 8, 13, 10) \ + | _SHIFTL((size) - 1, 0, 12), \ + (unsigned int)(dram) \ + } \ + } + +#define gSPDmaRead(pkt, dmem, dram, size) gSPDma_io((pkt), 0, (dmem), (dram), (size)) +#define gsSPDmaRead(dmem, dram, size) gsSPDma_io(0, (dmem), (dram), (size)) +#define gSPDmaWrite(pkt, dmem, dram, size) gSPDma_io((pkt), 1, (dmem), (dram), (size)) +#define gsSPDmaWrite(dmem, dram, size) gsSPDma_io(1, (dmem), (dram), (size)) +#endif + +/* + * Lighting Macros + */ +#ifdef F3DEX_GBI_2 +#define NUML(n) ((n) * 24) +#else +#define NUML(n) (((n) + 1) * 32 + 0x80000000) +#endif +#define NUMLIGHTS_0 1 +#define NUMLIGHTS_1 1 +#define NUMLIGHTS_2 2 +#define NUMLIGHTS_3 3 +#define NUMLIGHTS_4 4 +#define NUMLIGHTS_5 5 +#define NUMLIGHTS_6 6 +#define NUMLIGHTS_7 7 +/* + * n should be one of: NUMLIGHTS_0, NUMLIGHTS_1, ..., NUMLIGHTS_7 + * NOTE: in addition to the number of directional lights specified, + * there is always 1 ambient light + */ +#define gSPNumLights(pkt, n) gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) +#define gsSPNumLights(n) gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n)) + +#define LIGHT_1 1 +#define LIGHT_2 2 +#define LIGHT_3 3 +#define LIGHT_4 4 +#define LIGHT_5 5 +#define LIGHT_6 6 +#define LIGHT_7 7 +#define LIGHT_8 8 +/* + * l should point to a Light struct + * n should be one of: LIGHT_1, LIGHT_2, ..., LIGHT_8 + * NOTE: the highest numbered light is always the ambient light (eg if there are + * 3 directional lights defined: gsSPNumLights(NUMLIGHTS_3), then lights + * LIGHT_1 through LIGHT_3 will be the directional lights and light + * LIGHT_4 will be the ambient light. + */ +#ifdef F3DEX_GBI_2 +#define gSPLight(pkt, l, n) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, (n) * 24 + 24) +#define gsSPLight(l, n) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, (n) * 24 + 24) +#else /* F3DEX_GBI_2 */ +#define gSPLight(pkt, l, n) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), ((n) - 1) * 2 + G_MV_L0) +#define gsSPLight(l, n) gsDma1p(G_MOVEMEM, l, sizeof(Light), ((n) - 1) * 2 + G_MV_L0) +#endif /* F3DEX_GBI_2 */ + +/* + * gSPLightColor changes color of light without recalculating light direction + * col is a 32 bit word with r,g,b,a (alpha is ignored) + * n should be one of LIGHT_1, LIGHT_2, ..., LIGHT_8 + */ +#define gSPLightColor(pkt, n, col) \ + { \ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_a##n, col); \ + gMoveWd(pkt, G_MW_LIGHTCOL, G_MWO_b##n, col); \ + } +#define gsSPLightColor(n, col) gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##n, col), gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##n, col) + +/* These macros use a structure "name" which is init'd with the gdSPDefLights macros*/ + +#define gSPSetLights0(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_0); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.a, 2); \ + } +#define gsSPSetLights0(name) gsSPNumLights(NUMLIGHTS_0), gsSPLight(&name.l[0], 1), gsSPLight(&name.a, 2) + +#define gSPSetLights1(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_1); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.a, 2); \ + } +#define gsSPSetLights1(name) gsSPNumLights(NUMLIGHTS_1), gsSPLight(&name.l[0], 1), gsSPLight(&name.a, 2) + +#define gSPSetLights2(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_2); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.l[1], 2); \ + gSPLight(pkt, &name.a, 3); \ + } +#define gsSPSetLights2(name) \ + gsSPNumLights(NUMLIGHTS_2), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.a, 3) + +#define gSPSetLights3(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_3); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.l[1], 2); \ + gSPLight(pkt, &name.l[2], 3); \ + gSPLight(pkt, &name.a, 4); \ + } +#define gsSPSetLights3(name) \ + gsSPNumLights(NUMLIGHTS_3), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \ + gsSPLight(&name.a, 4) + +#define gSPSetLights4(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_4); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.l[1], 2); \ + gSPLight(pkt, &name.l[2], 3); \ + gSPLight(pkt, &name.l[3], 4); \ + gSPLight(pkt, &name.a, 5); \ + } +#define gsSPSetLights4(name) \ + gsSPNumLights(NUMLIGHTS_4), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \ + gsSPLight(&name.l[3], 4), gsSPLight(&name.a, 5) + +#define gSPSetLights5(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_5); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.l[1], 2); \ + gSPLight(pkt, &name.l[2], 3); \ + gSPLight(pkt, &name.l[3], 4); \ + gSPLight(pkt, &name.l[4], 5); \ + gSPLight(pkt, &name.a, 6); \ + } + +#define gsSPSetLights5(name) \ + gsSPNumLights(NUMLIGHTS_5), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \ + gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.a, 6) + +#define gSPSetLights6(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_6); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.l[1], 2); \ + gSPLight(pkt, &name.l[2], 3); \ + gSPLight(pkt, &name.l[3], 4); \ + gSPLight(pkt, &name.l[4], 5); \ + gSPLight(pkt, &name.l[5], 6); \ + gSPLight(pkt, &name.a, 7); \ + } + +#define gsSPSetLights6(name) \ + gsSPNumLights(NUMLIGHTS_6), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \ + gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.l[5], 6), gsSPLight(&name.a, 7) + +#define gSPSetLights7(pkt, name) \ + { \ + gSPNumLights(pkt, NUMLIGHTS_7); \ + gSPLight(pkt, &name.l[0], 1); \ + gSPLight(pkt, &name.l[1], 2); \ + gSPLight(pkt, &name.l[2], 3); \ + gSPLight(pkt, &name.l[3], 4); \ + gSPLight(pkt, &name.l[4], 5); \ + gSPLight(pkt, &name.l[5], 6); \ + gSPLight(pkt, &name.l[6], 7); \ + gSPLight(pkt, &name.a, 8); \ + } + +#define gsSPSetLights7(name) \ + gsSPNumLights(NUMLIGHTS_7), gsSPLight(&name.l[0], 1), gsSPLight(&name.l[1], 2), gsSPLight(&name.l[2], 3), \ + gsSPLight(&name.l[3], 4), gsSPLight(&name.l[4], 5), gsSPLight(&name.l[5], 6), gsSPLight(&name.l[6], 7), \ + gsSPLight(&name.a, 8) + +/* + * Reflection/Hiliting Macros + */ +#ifdef F3DEX_GBI_2 +#define gSPLookAtX(pkt, l) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX) +#define gsSPLookAtX(l) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX) +#define gSPLookAtY(pkt, l) gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY) +#define gsSPLookAtY(l) gsDma2p(G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY) +#else /* F3DEX_GBI_2 */ +#define gSPLookAtX(pkt, l) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATX) +#define gsSPLookAtX(l) gsDma1p(G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATX) +#define gSPLookAtY(pkt, l) gDma1p(pkt, G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATY) +#define gsSPLookAtY(l) gsDma1p(G_MOVEMEM, l, sizeof(Light), G_MV_LOOKATY) +#endif /* F3DEX_GBI_2 */ + +#define gSPLookAt(pkt, la) { gSPLookAtX(pkt, la) gSPLookAtY(pkt, (char*)(la) + 16) } +#define gsSPLookAt(la) gsSPLookAtX(la), gsSPLookAtY((char*)(la) + 16) + +#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \ + gDPSetTileSize(pkt, tile, (hilite)->h.x1 & 0xfff, (hilite)->h.y1 & 0xfff, \ + ((((width) - 1) * 4) + (hilite)->h.x1) & 0xfff, ((((height) - 1) * 4) + (hilite)->h.y1) & 0xfff) + +#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \ + gDPSetTileSize(pkt, tile, (hilite)->h.x2 & 0xfff, (hilite)->h.y2 & 0xfff, \ + ((((width) - 1) * 4) + (hilite)->h.x2) & 0xfff, ((((height) - 1) * 4) + (hilite)->h.y2) & 0xfff) + +/* + * FOG macros + * fm = z multiplier + * fo = z offset + * FOG FORMULA: alpha(fog) = (eyespace z) * fm + fo CLAMPED 0 to 255 + * note: (eyespace z) ranges -1 to 1 + * + * Alternate method of setting fog: + * min, max: range 0 to 1000: 0=nearplane, 1000=farplane + * min is where fog begins (usually less than max and often 0) + * max is where fog is thickest (usually 1000) + * + */ +#define gSPFogFactor(pkt, fm, fo) gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16))) + +#define gsSPFogFactor(fm, fo) gsMoveWd(G_MW_FOG, G_MWO_FOG, (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16))) + +#define gSPFogPosition(pkt, min, max) \ + gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL((128000 / ((max) - (min))), 16, 16) | _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16))) + +#define gsSPFogPosition(min, max) \ + gsMoveWd(G_MW_FOG, G_MWO_FOG, \ + (_SHIFTL((128000 / ((max) - (min))), 16, 16) | _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16))) + +#ifdef F3DEX_GBI_2 +/* + * Macros to turn texture on/off + */ +#define gSPTexture(pkt, s, t, level, tile, on) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) \ + | _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)); \ + _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \ + } +#define gsSPTexture(s, t, level, tile, on) \ + { \ + { \ + (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) \ + | _SHIFTL((on), 1, 7)), \ + (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \ + } \ + } +/* + * Different version of SPTexture macro, has an additional parameter + * which is currently reserved in the microcode. + */ +#define gSPTextureL(pkt, s, t, level, xparam, tile, on) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) \ + | _SHIFTL((tile), 8, 3) | _SHIFTL((on), 1, 7)); \ + _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \ + } +#define gsSPTextureL(s, t, level, xparam, tile, on) \ + { \ + { \ + (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) \ + | _SHIFTL((on), 1, 7)), \ + (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \ + } \ + } +#else +/* + * Macros to turn texture on/off + */ +#define gSPTexture(pkt, s, t, level, tile, on) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) \ + | _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)); \ + _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \ + } +#define gsSPTexture(s, t, level, tile, on) \ + { \ + { \ + (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL(BOWTIE_VAL, 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) \ + | _SHIFTL((on), 0, 8)), \ + (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \ + } \ + } +/* + * Different version of SPTexture macro, has an additional parameter + * which is currently reserved in the microcode. + */ +#define gSPTextureL(pkt, s, t, level, xparam, tile, on) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) \ + | _SHIFTL((tile), 8, 3) | _SHIFTL((on), 0, 8)); \ + _g->words.w1 = (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)); \ + } +#define gsSPTextureL(s, t, level, xparam, tile, on) \ + { \ + { \ + (_SHIFTL(G_TEXTURE, 24, 8) | _SHIFTL((xparam), 16, 8) | _SHIFTL((level), 11, 3) | _SHIFTL((tile), 8, 3) \ + | _SHIFTL((on), 0, 8)), \ + (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)) \ + } \ + } +#endif + +#define gSPPerspNormalize(pkt, s) gMoveWd(pkt, G_MW_PERSPNORM, 0, (s)) +#define gsSPPerspNormalize(s) gsMoveWd(G_MW_PERSPNORM, 0, (s)) + +#ifdef F3DEX_GBI_2 +#define gSPPopMatrixN(pkt, n, num) gDma2p((pkt), G_POPMTX, (num) * 64, 64, 2, 0) +#define gsSPPopMatrixN(n, num) gsDma2p(G_POPMTX, (num) * 64, 64, 2, 0) +#define gSPPopMatrix(pkt, n) gSPPopMatrixN((pkt), (n), 1) +#define gsSPPopMatrix(n) gsSPPopMatrixN((n), 1) +#else /* F3DEX_GBI_2 */ +#define gSPPopMatrix(pkt, n) gImmp1(pkt, G_POPMTX, n) +#define gsSPPopMatrix(n) gsImmp1(G_POPMTX, n) +#endif /* F3DEX_GBI_2 */ + +#define gSPEndDisplayList(pkt) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \ + _g->words.w1 = 0; \ + } + +#define gsSPEndDisplayList() { { _SHIFTL(G_ENDDL, 24, 8), 0 } } + +#ifdef F3DEX_GBI_2 +/* + * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs. + * + * gSPClearGeometryMode(pkt,c) + * gSPSetGeometryMode(pkt,s) + * + * gSPLoadGeometryMode(pkt, word) sets GeometryMode directly. + */ +#define gSPGeometryMode(pkt, c, s) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = _SHIFTL(G_GEOMETRYMODE, 24, 8) | _SHIFTL(~(u32)(c), 0, 24); \ + _g->words.w1 = (u32)(s); \ + } + +#define gsSPGeometryMode(c, s) \ + { \ + { \ + (_SHIFTL(G_GEOMETRYMODE, 24, 8) | _SHIFTL(~(u32)(c), 0, 24)), (u32)(s) \ + } \ + } +#define gSPSetGeometryMode(pkt, word) gSPGeometryMode((pkt), 0, (word)) +#define gsSPSetGeometryMode(word) gsSPGeometryMode(0, (word)) +#define gSPClearGeometryMode(pkt, word) gSPGeometryMode((pkt), (word), 0) +#define gsSPClearGeometryMode(word) gsSPGeometryMode((word), 0) +#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt), -1, (word)) +#define gsSPLoadGeometryMode(word) gsSPGeometryMode(-1, (word)) + +#else /* F3DEX_GBI_2 */ +#define gSPSetGeometryMode(pkt, word) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \ + _g->words.w1 = (unsigned int)(word); \ + } + +#define gsSPSetGeometryMode(word) \ + { \ + { \ + _SHIFTL(G_SETGEOMETRYMODE, 24, 8), (unsigned int)(word) \ + } \ + } + +#define gSPClearGeometryMode(pkt, word) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \ + _g->words.w1 = (unsigned int)(word); \ + } + +#define gsSPClearGeometryMode(word) \ + { \ + { \ + _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8), (unsigned int)(word) \ + } \ + } +#endif /* F3DEX_GBI_2 */ + +#ifdef F3DEX_GBI_2 +#define gSPSetOtherMode(pkt, cmd, sft, len, data) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(32 - (sft) - (len), 8, 8) | _SHIFTL((len) - 1, 0, 8)); \ + _g->words.w1 = (unsigned int)(data); \ + } + +#define gsSPSetOtherMode(cmd, sft, len, data) \ + { \ + { \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(32 - (sft) - (len), 8, 8) | _SHIFTL((len) - 1, 0, 8), (unsigned int)(data) \ + } \ + } +#else +#define gSPSetOtherMode(pkt, cmd, sft, len, data) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8)); \ + _g->words.w1 = (unsigned int)(data); \ + } + +#define gsSPSetOtherMode(cmd, sft, len, data) \ + { \ + { \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(sft, 8, 8) | _SHIFTL(len, 0, 8), (unsigned int)(data) \ + } \ + } +#endif + +/* + * RDP setothermode register commands - register shadowed in RSP + */ +#define gDPPipelineMode(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode) +#define gsDPPipelineMode(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode) + +#define gDPSetCycleType(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type) +#define gsDPSetCycleType(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type) + +#define gDPSetTexturePersp(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type) +#define gsDPSetTexturePersp(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type) + +#define gDPSetTextureDetail(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type) +#define gsDPSetTextureDetail(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type) + +#define gDPSetTextureLOD(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type) +#define gsDPSetTextureLOD(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type) + +#define gDPSetTextureLUT(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type) +#define gsDPSetTextureLUT(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type) + +#define gDPSetTextureFilter(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type) +#define gsDPSetTextureFilter(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type) + +#define gDPSetTextureConvert(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type) +#define gsDPSetTextureConvert(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type) + +#define gDPSetCombineKey(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type) +#define gsDPSetCombineKey(type) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type) + +#ifndef _HW_VERSION_1 +#define gDPSetColorDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode) +#define gsDPSetColorDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode) +#else +#define gDPSetColorDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode) +#define gsDPSetColorDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COLORDITHER, 1, mode) +#endif + +#ifndef _HW_VERSION_1 +#define gDPSetAlphaDither(pkt, mode) gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode) +#define gsDPSetAlphaDither(mode) gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode) +#endif + +/* 'blendmask' is not supported anymore. + * The bits are reserved for future use. + * Fri May 26 13:45:55 PDT 1995 + */ +#define gDPSetBlendMask(pkt, mask) gDPNoOp(pkt) +#define gsDPSetBlendMask(mask) gsDPNoOp() + +#define gDPSetAlphaCompare(pkt, type) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) +#define gsDPSetAlphaCompare(type) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) + +#define gDPSetDepthSource(pkt, src) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src) +#define gsDPSetDepthSource(src) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src) + +#define gDPSetRenderMode(pkt, c0, c1) gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1)) +#define gsDPSetRenderMode(c0, c1) gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1)) + +#define gSetImage(pkt, cmd, fmt, siz, width, i) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL((width) - 1, 0, 12); \ + _g->words.w1 = (unsigned int)(i); \ + } + +#define gsSetImage(cmd, fmt, siz, width, i) \ + { \ + { \ + _SHIFTL(cmd, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL((width) - 1, 0, 12), \ + (unsigned int)(i) \ + } \ + } + +#define gDPSetColorImage(pkt, f, s, w, i) gSetImage(pkt, G_SETCIMG, f, s, w, i) +#define gsDPSetColorImage(f, s, w, i) gsSetImage(G_SETCIMG, f, s, w, i) + +/* use these for new code */ +#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i) +#define gsDPSetDepthImage(i) gsSetImage(G_SETZIMG, 0, 0, 1, i) +/* kept for compatibility */ +#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i) +#define gsDPSetMaskImage(i) gsDPSetDepthImage(i) + +#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i) +#define gsDPSetTextureImage(f, s, w, i) gsSetImage(G_SETTIMG, f, s, w, i) + +/* + * RDP macros + */ + +#define gDPSetCombine(pkt, muxs0, muxs1) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24); \ + _g->words.w1 = (unsigned int)(muxs1); \ + } + +#define gsDPSetCombine(muxs0, muxs1) \ + { \ + { \ + _SHIFTL(G_SETCOMBINE, 24, 8) | _SHIFTL(muxs0, 0, 24), (unsigned int)(muxs1) \ + } \ + } + +#define GCCc0w0(saRGB0, mRGB0, saA0, mA0) \ + (_SHIFTL((saRGB0), 20, 4) | _SHIFTL((mRGB0), 15, 5) | _SHIFTL((saA0), 12, 3) | _SHIFTL((mA0), 9, 3)) + +#define GCCc1w0(saRGB1, mRGB1) (_SHIFTL((saRGB1), 5, 4) | _SHIFTL((mRGB1), 0, 5)) + +#define GCCc0w1(sbRGB0, aRGB0, sbA0, aA0) \ + (_SHIFTL((sbRGB0), 28, 4) | _SHIFTL((aRGB0), 15, 3) | _SHIFTL((sbA0), 12, 3) | _SHIFTL((aA0), 9, 3)) + +#define GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1) \ + (_SHIFTL((sbRGB1), 24, 4) | _SHIFTL((saA1), 21, 3) | _SHIFTL((mA1), 18, 3) | _SHIFTL((aRGB1), 6, 3) \ + | _SHIFTL((sbA1), 3, 3) | _SHIFTL((aA1), 0, 3)) + +#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) \ + | _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, G_ACMUX_##Aa0, G_ACMUX_##Ac0) \ + | GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \ + 0, 24); \ + _g->words.w1 = (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, G_ACMUX_##Ab0, G_ACMUX_##Ad0) \ + | GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, G_ACMUX_##Ac1, G_CCMUX_##d1, \ + G_ACMUX_##Ab1, G_ACMUX_##Ad1)); \ + } + +#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ + { \ + { \ + _SHIFTL(G_SETCOMBINE, 24, 8) \ + | _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, G_ACMUX_##Aa0, G_ACMUX_##Ac0) \ + | GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \ + 0, 24), \ + (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, G_ACMUX_##Ab0, G_ACMUX_##Ad0) \ + | GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, G_ACMUX_##Ac1, G_CCMUX_##d1, G_ACMUX_##Ab1, \ + G_ACMUX_##Ad1)) \ + } \ + } + +/* + * SetCombineMode macros are NOT redunant. It allow the C preprocessor + * to substitute single parameter which includes commas in the token and + * rescan for higher parameter count macro substitution. + * + * eg. gsDPSetCombineMode(G_CC_MODULATE, G_CC_MODULATE) turns into + * gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, + * TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0) + */ + +#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b) +#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP(a, b) + +#define gDPSetColor(pkt, c, d) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(c, 24, 8); \ + _g->words.w1 = (unsigned int)(d); \ + } + +#define gsDPSetColor(c, d) \ + { \ + { \ + _SHIFTL(c, 24, 8), (unsigned int)(d) \ + } \ + } + +#define DPRGBColor(pkt, cmd, r, g, b, a) \ + gDPSetColor(pkt, cmd, (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) +#define sDPRGBColor(cmd, r, g, b, a) \ + gsDPSetColor(cmd, (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) + +#define gDPSetEnvColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETENVCOLOR, r, g, b, a) +#define gsDPSetEnvColor(r, g, b, a) sDPRGBColor(G_SETENVCOLOR, r, g, b, a) +#define gDPSetBlendColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETBLENDCOLOR, r, g, b, a) +#define gsDPSetBlendColor(r, g, b, a) sDPRGBColor(G_SETBLENDCOLOR, r, g, b, a) +#define gDPSetFogColor(pkt, r, g, b, a) DPRGBColor(pkt, G_SETFOGCOLOR, r, g, b, a) +#define gsDPSetFogColor(r, g, b, a) sDPRGBColor(G_SETFOGCOLOR, r, g, b, a) +#define gDPSetFillColor(pkt, d) gDPSetColor(pkt, G_SETFILLCOLOR, (d)) +#define gsDPSetFillColor(d) gsDPSetColor(G_SETFILLCOLOR, (d)) + +#define gDPSetPrimDepth(pkt, z, dz) gDPSetColor(pkt, G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16)) +#define gsDPSetPrimDepth(z, dz) gsDPSetColor(G_SETPRIMDEPTH, _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16)) + +#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)); \ + _g->words.w1 = (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)); \ + } + +#define gsDPSetPrimColor(m, l, r, g, b, a) \ + { \ + { \ + (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)), \ + (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8)) \ + } \ + } + +/* + * gDPSetOtherMode (This is for expert user.) + * + * This command makes all othermode parameters set. + * Do not use this command in the same DL with another g*SPSetOtherMode DLs. + * + * [Usage] + * gDPSetOtherMode(pkt, modeA, modeB) + * + * 'modeA' is described all parameters of GroupA GBI command. + * 'modeB' is also described all parameters of GroupB GBI command. + * + * GroupA: + * gDPPipelineMode, gDPSetCycleType, gSPSetTexturePersp, + * gDPSetTextureDetail, gDPSetTextureLOD, gDPSetTextureLUT, + * gDPSetTextureFilter, gDPSetTextureConvert, gDPSetCombineKey, + * gDPSetColorDither, gDPSetAlphaDither + * + * GroupB: + * gDPSetAlphaCompare, gDPSetDepthSource, gDPSetRenderMode + * + * Use 'OR' operation to get modeA and modeB. + * + * modeA = G_PM_* | G_CYC_* | G_TP_* | G_TD_* | G_TL_* | G_TT_* | G_TF_* + * G_TC_* | G_CK_* | G_CD_* | G_AD_*; + * + * modeB = G_AC_* | G_ZS_* | G_RM_* | G_RM_*2; + */ +#define gDPSetOtherMode(pkt, mode0, mode1) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(mode0, 0, 24); \ + _g->words.w1 = (unsigned int)(mode1); \ + } + +#define gsDPSetOtherMode(mode0, mode1) \ + { \ + { \ + _SHIFTL(G_RDPSETOTHERMODE, 24, 8) | _SHIFTL(mode0, 0, 24), (unsigned int)(mode1) \ + } \ + } + +/* + * Texturing macros + */ + +/* These are also defined defined above for Sprite Microcode */ + +#define G_TX_LOADTILE 7 +#define G_TX_RENDERTILE 0 + +#define G_TX_NOMIRROR 0 +#define G_TX_WRAP 0 +#define G_TX_MIRROR 0x1 +#define G_TX_CLAMP 0x2 +#define G_TX_NOMASK 0 +#define G_TX_NOLOD 0 + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif +/* + * Dxt is the inverse of the number of 64-bit words in a line of + * the texture being loaded using the load_block command. If + * there are any 1's to the right of the 11th fractional bit, + * dxt should be rounded up. The following macros accomplish + * this. The 4b macros are a special case since 4-bit textures + * are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM + */ +#define G_TX_DXT_FRAC 11 + +/* + * For RCP 2.0, the maximum number of texels that can be loaded + * using a load_block command is 2048. In order to load the total + * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, + * then change the tile to the proper texel size after the load. + * The g*DPLoadTextureBlock macros already do this, so this change + * will be transparent if you use these macros. If you use + * the g*DPLoadBlock macros directly, you will need to handle this + * tile manipulation yourself. RJM. + */ +#ifdef _HW_VERSION_1 +#define G_TX_LDBLK_MAX_TXL 4095 +#else +#define G_TX_LDBLK_MAX_TXL 2047 +#endif /* _HW_VERSION_1 */ + +#define TXL2WORDS(txls, b_txl) MAX(1, ((txls) * (b_txl) / 8)) +#define CALC_DXT(width, b_txl) (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / TXL2WORDS(width, b_txl)) + +#define TXL2WORDS_4b(txls) MAX(1, ((txls) / 16)) +#define CALC_DXT_4b(width) (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / TXL2WORDS_4b(width)) + +#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12); \ + _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12); \ + } + +#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \ + { \ + { \ + _SHIFTL(c, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12), \ + _SHIFTL(tile, 24, 3) | _SHIFTL(lrs, 12, 12) | _SHIFTL(lrt, 0, 12) \ + } \ + } + +#define gDPSetTileSize(pkt, t, uls, ult, lrs, lrt) gDPLoadTileGeneric(pkt, G_SETTILESIZE, t, uls, ult, lrs, lrt) +#define gsDPSetTileSize(t, uls, ult, lrs, lrt) gsDPLoadTileGeneric(G_SETTILESIZE, t, uls, ult, lrs, lrt) +#define gDPLoadTile(pkt, t, uls, ult, lrs, lrt) gDPLoadTileGeneric(pkt, G_LOADTILE, t, uls, ult, lrs, lrt) +#define gsDPLoadTile(t, uls, ult, lrs, lrt) gsDPLoadTileGeneric(G_LOADTILE, t, uls, ult, lrs, lrt) + +#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) \ + | _SHIFTL(tmem, 0, 9); \ + _g->words.w1 = _SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) \ + | _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4); \ + } + +#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, maskt, shiftt, cms, masks, shifts) \ + { \ + { \ + (_SHIFTL(G_SETTILE, 24, 8) | _SHIFTL(fmt, 21, 3) | _SHIFTL(siz, 19, 2) | _SHIFTL(line, 9, 9) \ + | _SHIFTL(tmem, 0, 9)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(palette, 20, 4) | _SHIFTL(cmt, 18, 2) | _SHIFTL(maskt, 14, 4) \ + | _SHIFTL(shiftt, 10, 4) | _SHIFTL(cms, 8, 2) | _SHIFTL(masks, 4, 4) | _SHIFTL(shifts, 0, 4)) \ + } \ + } + +/* + * For RCP 2.0, the maximum number of texels that can be loaded + * using a load_block command is 2048. In order to load the total + * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b, + * then change the tile to the proper texel size after the load. + * The g*DPLoadTextureBlock macros already do this, so this change + * will be transparent if you use these macros. If you use + * the g*DPLoadBlock macros directly, you will need to handle this + * tile manipulation yourself. RJM. + */ +#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | _SHIFTL(dxt, 0, 12)); \ + } + +#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \ + { \ + { \ + (_SHIFTL(G_LOADBLOCK, 24, 8) | _SHIFTL(uls, 12, 12) | _SHIFTL(ult, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | _SHIFTL(dxt, 0, 12)) \ + } \ + } + +#define gDPLoadTLUTCmd(pkt, tile, count) \ + { \ + Gfx* _g = (Gfx*)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \ + _g->words.w1 = _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10); \ + } + +#define gsDPLoadTLUTCmd(tile, count) \ + { \ + { \ + _SHIFTL(G_LOADTLUT, 24, 8), _SHIFTL((tile), 24, 3) | _SHIFTL((count), 14, 10) \ + } \ + } + +#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* Load fix rww 27jun95 */ +/* The S at the end means odd lines are already word Swapped */ + +#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * Allow tmem address and render tile to be specified. + * The S at the end means odd lines are already word Swapped + */ +#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * allows tmem address to be specified + */ +#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, G_TX_RENDERTILE, pal, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * allows tmem address and render tile to be specified + */ +#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * allows tmem address and render tile to be specified + */ +#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \ + gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* Here is the static form of the pre-swapped texture block loading */ +/* See gDPLoadTextureBlockS() for reference. Basically, just don't + calculate DxT, use 0 */ + +#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allow tmem address to be specified + */ +#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, \ + shiftt, cms, masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allow tmem address and render_tile to be specified + */ +#define _gsDPLoadTextureBlockTile(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allow tmem address and render_tile to be specified, useful when loading + * mutilple tiles at a time. + */ +#define gsDPLoadMultiBlock(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \ + CALC_DXT(width, siz##_BYTES)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allows tmem and render tile to be specified. Useful when loading + * several tiles at a time. + * + * Here is the static form of the pre-swapped texture block loading + * See gDPLoadTextureBlockS() for reference. Basically, just don't + * calculate DxT, use 0 + */ + +#define gsDPLoadMultiBlockS(timg, tmem, rtile, fmt, siz, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \ + gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \ + cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* Load fix rww 27jun95 */ +/* The S at the end means odd lines are already word Swapped */ + +#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \ + cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * 4-bit load block. Useful when loading multiple tiles + */ +#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * 4-bit load block. Allows tmem and render tile to be specified. Useful when + * loading multiple tiles. The S means odd lines are already word swapped. + */ +#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, \ + masks, shifts); \ + gDPSetTileSize(pkt, rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \ + cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0), gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * 4-bit load block. Allows tmem address and render tile to be specified. + * Useful when loading multiple tiles. + */ +#define gsDPLoadMultiBlock_4b(timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * 4-bit load block. Allows tmem address and render tile to be specified. + * Useful when loading multiple tiles. S means odd lines are already swapped. + */ +#define gsDPLoadMultiBlock_4bS(timg, tmem, rtile, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, 0), gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +/* + * Allows tmem address to be specified + */ +#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, cms, cmt, masks, maskt, shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \ + gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, (((width) * (height) + 3) >> 2) - 1, CALC_DXT_4b(width)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, ((((width) >> 1) + 7) >> 3), tmem, G_TX_RENDERTILE, pal, cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \ + ((height) - 1) << G_TEXTURE_IMAGE_FRAC) + +#ifndef _HW_VERSION_1 + +#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \ + shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz, width, timg); \ + gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \ + } + +#else /******** WORKAROUND hw 1 load tile bug ********/ + +#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \ + shifts, shiftt) \ + \ + { \ + int _loadtile_i, _loadtile_nw; \ + Gfx* _loadtile_temp = pkt; \ + guDPLoadTextureTile(_loadtile_temp, timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \ + maskt, shifts, shiftt); \ + _loadtile_nw = guGetDPLoadTextureTileSz(ult, lrt) - 1; \ + for (_loadtile_i = 0; _loadtile_i < _loadtile_nw; _loadtile_i++) \ + pkt; \ + } + +#endif /* HW_VERSION_1 */ + +/* + * Load texture tile. Allows tmem address and render tile to be specified. + * Useful for loading multiple tiles. + */ +#define gDPLoadMultiTile(pkt, timg, tmem, rtile, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \ + maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, siz, width, timg); \ + gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define gsDPLoadTextureTile(timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + \ + gsDPSetTextureImage(fmt, siz, width, timg), \ + gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \ + shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile(G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) + +/* + * Load texture tile. Allows tmem address and render tile to be specified. + * Useful for loading multiple tiles. + */ +#define gsDPLoadMultiTile(timg, tmem, rtile, fmt, siz, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \ + shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, siz, width, timg), \ + gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, \ + maskt, shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile(G_TX_LOADTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, siz, (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \ + shiftt, cms, masks, shifts), \ + gsDPSetTileSize(rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) + +#define gDPLoadTextureTile_4b(pkt, timg, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \ + (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, \ + maskt, shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \ + } + +/* + * Load texture tile. Allows tmem address and render tile to be specified. + * Useful for loading multiple tiles. + */ +#define gDPLoadMultiTile_4b(pkt, timg, tmem, rtile, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, \ + maskt, shifts, shiftt) \ + { \ + gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile(pkt, G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \ + (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)); \ + gDPPipeSync(pkt); \ + gDPSetTile(pkt, fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, \ + shiftt, cms, masks, shifts); \ + gDPSetTileSize(pkt, rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) \ + } + +#define gsDPLoadTextureTile_4b(timg, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, shifts, \ + shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \ + gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_LOADTILE, 0, cmt, maskt, \ + shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile(G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \ + (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, G_TX_RENDERTILE, pal, cmt, maskt, \ + shiftt, cms, masks, shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) + +/* + * Load texture tile. Allows tmem address and render tile to be specified. + * Useful for loading multiple tiles. + */ +#define gsDPLoadMultiTile_4b(timg, tmem, rtile, fmt, width, height, uls, ult, lrs, lrt, pal, cms, cmt, masks, maskt, \ + shifts, shiftt) \ + \ + gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \ + gsDPSetTile(fmt, G_IM_SIZ_8b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, G_TX_LOADTILE, 0, cmt, maskt, \ + shiftt, cms, masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile(G_TX_LOADTILE, (uls) << (G_TEXTURE_IMAGE_FRAC - 1), (ult) << (G_TEXTURE_IMAGE_FRAC), \ + (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), (lrt) << (G_TEXTURE_IMAGE_FRAC)), \ + gsDPPipeSync(), \ + gsDPSetTile(fmt, G_IM_SIZ_4b, (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, rtile, pal, cmt, maskt, shiftt, \ + cms, masks, shifts), \ + gsDPSetTileSize(rtile, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, \ + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC) + +/* + * Load a 16-entry palette (for 4-bit CI textures) + * Assumes a 16 entry tlut is being loaded, palette # is 0-15 + */ +#ifndef _HW_VERSION_1 + +#define gDPLoadTLUT_pal16(pkt, pal, dram) \ + { \ + gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \ + gDPTileSync(pkt); \ + gDPSetTile(pkt, 0, 0, 0, (256 + (((pal) & 0xf) * 16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \ + gDPLoadSync(pkt); \ + gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 15); \ + gDPPipeSync(pkt) \ + } + +#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ + +#define gDPLoadTLUT_pal16(pkt, pal, dram) \ + \ + _gDPLoadTextureBlock(pkt, dram, (256 + (((pal) & 0xf) * 16)), G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 16, 1, pal, 0, 0, \ + 0, 0, 0, 0) + +#endif /* _HW_VERSION_1 */ + +/* + * Load a 16-entry palette (for 4-bit CI textures) + * Assumes a 16 entry tlut is being loaded, palette # is 0-15 + */ +#ifndef _HW_VERSION_1 + +#define gsDPLoadTLUT_pal16(pal, dram) \ + \ + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \ + gsDPSetTile(0, 0, 0, (256 + (((pal) & 0xf) * 16)), G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \ + gsDPLoadTLUTCmd(G_TX_LOADTILE, 15), gsDPPipeSync() + +#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ + +#define gsDPLoadTLUT_pal16(pal, dram) \ + \ + _gsDPLoadTextureBlock(dram, (256 + (((pal) & 0xf) * 16)), G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 16, 1, pal, 0, 0, 0, 0, \ + 0, 0) + +#endif /* _HW_VERSION_1 */ + +/* + * Load a 256-entry palette (for 8-bit CI textures) + * Assumes a 256 entry tlut is being loaded, palette # is not used + */ +#ifndef _HW_VERSION_1 + +#define gDPLoadTLUT_pal256(pkt, dram) \ + { \ + gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \ + gDPTileSync(pkt); \ + gDPSetTile(pkt, 0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \ + gDPLoadSync(pkt); \ + gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 255); \ + gDPPipeSync(pkt) \ + } + +#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ + +#define gDPLoadTLUT_pal256(pkt, dram) \ + \ + _gDPLoadTextureBlock(pkt, dram, 256, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 256, 1, 0, 0, 0, 0, 0, 0, 0) + +#endif /* _HW_VERSION_1 */ + +#ifndef _HW_VERSION_1 + +#define gsDPLoadTLUT_pal256(dram) \ + \ + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \ + gsDPSetTile(0, 0, 0, 256, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \ + gsDPLoadTLUTCmd(G_TX_LOADTILE, 255), gsDPPipeSync() + +#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ + +#define gsDPLoadTLUT_pal256(dram) \ + \ + _gsDPLoadTextureBlock(dram, 256, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4 * 256, 1, 0, 0, 0, 0, 0, 0, 0) + +#endif /* _HW_VERSION_1 */ + +#ifndef _HW_VERSION_1 + +#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \ + { \ + gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \ + gDPTileSync(pkt); \ + gDPSetTile(pkt, 0, 0, 0, tmemaddr, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0); \ + gDPLoadSync(pkt); \ + gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, ((count) - 1)); \ + gDPPipeSync(pkt); \ + } + +#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ + +#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \ + \ + _gDPLoadTextureBlock(pkt, dram, tmemaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, count, 0, 0, 0, 0, 0, 0, 0) + +#endif /* _HW_VERSION_1 */ + +#ifndef _HW_VERSION_1 + +#define gsDPLoadTLUT(count, tmemaddr, dram) \ + \ + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), gsDPTileSync(), \ + gsDPSetTile(0, 0, 0, tmemaddr, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), gsDPLoadSync(), \ + gsDPLoadTLUTCmd(G_TX_LOADTILE, ((count) - 1)), gsDPPipeSync() + +#else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ +#define gsDPLoadTLUT(count, tmemaddr, dram) \ + \ + _gsDPLoadTextureBlock(dram, tmemaddr, G_IM_FMT_RGBA, G_IM_SIZ_16b, 4, count, 0, 0, 0, 0, 0, 0, 0) + +#endif /* _HW_VERSION_1 */ + +#define gDPSetScissor(pkt, mode, ulx, uly, lrx, lry) \ + { \ + Gfx* _g = (Gfx*)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int)((float)(ulx) * 4.0F), 12, 12) \ + | _SHIFTL((int)((float)(uly) * 4.0F), 0, 12); \ + _g->words.w1 = _SHIFTL(mode, 24, 2) | _SHIFTL((int)((float)(lrx) * 4.0F), 12, 12) \ + | _SHIFTL((int)((float)(lry) * 4.0F), 0, 12); \ + } + +#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \ + { \ + Gfx* _g = (Gfx*)pkt; \ + \ + _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int)((ulx)), 12, 12) | _SHIFTL((int)((uly)), 0, 12); \ + _g->words.w1 = _SHIFTL(mode, 24, 2) | _SHIFTL((int)((lrx)), 12, 12) | _SHIFTL((int)((lry)), 0, 12); \ + } + +#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \ + { \ + { \ + _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int)((float)(ulx) * 4.0F), 12, 12) \ + | _SHIFTL((int)((float)(uly) * 4.0F), 0, 12), \ + _SHIFTL(mode, 24, 2) | _SHIFTL((int)((float)(lrx) * 4.0F), 12, 12) \ + | _SHIFTL((int)((float)(lry) * 4.0F), 0, 12) \ + } \ + } + +#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \ + { \ + { \ + _SHIFTL(G_SETSCISSOR, 24, 8) | _SHIFTL((int)((ulx)), 12, 12) | _SHIFTL((int)((uly)), 0, 12), \ + _SHIFTL(mode, 24, 2) | _SHIFTL((int)(lrx), 12, 12) | _SHIFTL((int)(lry), 0, 12) \ + } \ + } + +/* Fraction never used in fill */ +#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10)); \ + _g->words.w1 = (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)); \ + } + +#define gsDPFillRectangle(ulx, uly, lrx, lry) \ + { \ + { \ + (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL((lrx), 14, 10) | _SHIFTL((lry), 2, 10)), \ + (_SHIFTL((ulx), 14, 10) | _SHIFTL((uly), 2, 10)) \ + } \ + } + +/* like gDPFillRectangle but accepts negative arguments */ +#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | _SHIFTL(MAX((lrx), 0), 14, 10) | _SHIFTL(MAX((lry), 0), 2, 10)); \ + _g->words.w1 = (_SHIFTL(MAX((ulx), 0), 14, 10) | _SHIFTL(MAX((uly), 0), 2, 10)); \ + } + +#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETCONVERT, 24, 8) | _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)); \ + _g->words.w1 = (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)); \ + } + +#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \ + { \ + { \ + (_SHIFTL(G_SETCONVERT, 24, 8) | _SHIFTL(k0, 13, 9) | _SHIFTL(k1, 4, 9) | _SHIFTR(k2, 5, 4)), \ + (_SHIFTL(k2, 27, 5) | _SHIFTL(k3, 18, 9) | _SHIFTL(k4, 9, 9) | _SHIFTL(k5, 0, 9)) \ + } \ + } + +#define gDPSetKeyR(pkt, cR, sR, wR) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETKEYR, 24, 8); \ + _g->words.w1 = (_SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8)); \ + } + +#define gsDPSetKeyR(cR, sR, wR) \ + { \ + { \ + _SHIFTL(G_SETKEYR, 24, 8), _SHIFTL(wR, 16, 12) | _SHIFTL(cR, 8, 8) | _SHIFTL(sR, 0, 8) \ + } \ + } + +#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)); \ + _g->words.w1 = (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)); \ + } + +#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \ + { \ + { \ + (_SHIFTL(G_SETKEYGB, 24, 8) | _SHIFTL(wG, 12, 12) | _SHIFTL(wB, 0, 12)), \ + (_SHIFTL(cG, 24, 8) | _SHIFTL(sG, 16, 8) | _SHIFTL(cB, 8, 8) | _SHIFTL(sB, 0, 8)) \ + } \ + } + +#define gDPNoParam(pkt, cmd) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8); \ + _g->words.w1 = 0; \ + } + +#define gsDPNoParam(cmd) { { _SHIFTL(cmd, 24, 8), 0 } } + +#define gDPParam(pkt, cmd, param) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(cmd, 24, 8); \ + _g->words.w1 = (param); \ + } + +#define gsDPParam(cmd, param) \ + { \ + { \ + _SHIFTL(cmd, 24, 8), (param) \ + } \ + } + +/* Notice that textured rectangles are 128-bit commands, therefore + * gsDPTextureRectangle() should not be used in display lists + * under normal circumstances (use gsSPTextureRectangle()). + * That is also why there is no gDPTextureRectangle() macros. + */ +#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { { \ + (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \ + } }, \ + { \ + { \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ + } \ + } + +#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + if (pkt) \ + ; \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \ + _g++; \ + _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ + } + +#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { { \ + (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)), \ + } }, \ + { \ + { \ + _SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16), _SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16) \ + } \ + } + +#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + if (pkt) \ + ; \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \ + _g++; \ + _g->words.w0 = (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16)); \ + _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16)); \ + } + +#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { { (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \ + gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ + } + +/* like gSPTextureRectangle but accepts negative position arguments */ +#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = \ + (_SHIFTL(G_TEXRECT, 24, 8) | _SHIFTL(MAX((s16)(xh), 0), 12, 12) | _SHIFTL(MAX((s16)(yh), 0), 0, 12)); \ + _g->words.w1 = \ + (_SHIFTL((tile), 24, 3) | _SHIFTL(MAX((s16)(xl), 0), 12, 12) | _SHIFTL(MAX((s16)(yl), 0), 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, \ + (_SHIFTL(((s) \ + - (((s16)(xl) < 0) ? (((s16)(dsdx) < 0) ? (MAX((((s16)(xl) * (s16)(dsdx)) >> 7), 0)) \ + : (MIN((((s16)(xl) * (s16)(dsdx)) >> 7), 0))) \ + : 0)), \ + 16, 16) \ + | _SHIFTL(((t) \ + - (((yl) < 0) ? (((s16)(dtdy) < 0) ? (MAX((((s16)(yl) * (s16)(dtdy)) >> 7), 0)) \ + : (MIN((((s16)(yl) * (s16)(dtdy)) >> 7), 0))) \ + : 0)), \ + 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL((dsdx), 16, 16) | _SHIFTL((dtdy), 0, 16))); \ + } + +#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { { (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)), \ + (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)) } }, \ + gsImmp1(G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))), \ + gsImmp1(G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))) + +#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | _SHIFTL(xh, 12, 12) | _SHIFTL(yh, 0, 12)); \ + _g->words.w1 = (_SHIFTL(tile, 24, 3) | _SHIFTL(xl, 12, 12) | _SHIFTL(yl, 0, 12)); \ + gImmp1(pkt, G_RDPHALF_1, (_SHIFTL(s, 16, 16) | _SHIFTL(t, 0, 16))); \ + gImmp1(pkt, G_RDPHALF_2, (_SHIFTL(dsdx, 16, 16) | _SHIFTL(dtdy, 0, 16))); \ + } + +#define gsDPWord(wordhi, wordlo) \ + gsImmp1(G_RDPHALF_1, (unsigned int)(wordhi)), gsImmp1(G_RDPHALF_2, (unsigned int)(wordlo)) + +#define gDPWord(pkt, wordhi, wordlo) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + gImmp1(pkt, G_RDPHALF_1, (unsigned int)(wordhi)); \ + gImmp1(pkt, G_RDPHALF_2, (unsigned int)(wordlo)); \ + } + +#define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC) +#define gsDPFullSync() gsDPNoParam(G_RDPFULLSYNC) +#define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC) +#define gsDPTileSync() gsDPNoParam(G_RDPTILESYNC) +#define gDPPipeSync(pkt) gDPNoParam(pkt, G_RDPPIPESYNC) +#define gsDPPipeSync() gsDPNoParam(G_RDPPIPESYNC) +#define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC) +#define gsDPLoadSync() gsDPNoParam(G_RDPLOADSYNC) +#define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP) +#define gsDPNoOp() gsDPNoParam(G_NOOP) +#define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag) +#define gsDPNoOpTag(tag) gsDPParam(G_NOOP, tag) + +#endif /* _LANGUAGE_C */ + +#endif /* _GBI_H_ */ diff --git a/lib/hackerlibultra/include/PR/gs2dex.h b/lib/hackerlibultra/include/PR/gs2dex.h new file mode 100644 index 00000000..81559cd6 --- /dev/null +++ b/lib/hackerlibultra/include/PR/gs2dex.h @@ -0,0 +1,398 @@ +/*--------------------------------------------------------------------- + Copyright (C) 1997, Nintendo. + + File gs2dex.h + Coded by Yoshitaka Yasumoto. Jul 31, 1997. + Modified by + Comments Header file for S2DEX ucode. + + $Id: gs2dex.h,v 1.21 1998/05/28 00:14:49 has Exp $ + ---------------------------------------------------------------------*/ + +#ifndef _GS2DEX_H_ +#define _GS2DEX_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/*===========================================================================* + * Macro + *===========================================================================*/ +#define GS_CALC_DXT(line) (((1 << G_TX_DXT_FRAC) - 1) / (line) + 1) +#define GS_PIX2TMEM(pix, siz) ((pix) >> (4 - (siz))) +#define GS_PIX2DXT(pix, siz) GS_CALC_DXT(GS_PIX2TMEM((pix), (siz))) + +/*===========================================================================* + * Data structures for S2DEX microcode + *===========================================================================*/ + +/*---------------------------------------------------------------------------* + * Background + *---------------------------------------------------------------------------*/ +#define G_BGLT_LOADBLOCK 0x0033 +#define G_BGLT_LOADTILE 0xfff4 + +#define G_BG_FLAG_FLIPS 0x01 +#define G_BG_FLAG_FLIPT 0x10 + +/* Non scalable background plane */ +typedef struct { + u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */ + u16 imageW; /* width of the texture (u10.2) */ + s16 frameX; /* upper-left position of transferred frame (s10.2) */ + u16 frameW; /* width of transferred frame (u10.2) */ + + u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */ + u16 imageH; /* height of the texture (u10.2) */ + s16 frameY; /* upper-left position of transferred frame (s10.2) */ + u16 frameH; /* height of transferred frame (u10.2) */ + + u64* imagePtr; /* texture source address on DRAM */ + u16 imageLoad; /* which to use, LoadBlock or LoadTile */ + u8 imageFmt; /* format of texel - G_IM_FMT_* */ + u8 imageSiz; /* size of texel - G_IM_SIZ_* */ + u16 imagePal; /* pallet number */ + u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */ + + /* The following is set in the initialization routine guS2DInitBg(). There is no need for the user + * to set it. */ + u16 tmemW; /* TMEM width and Word size of frame 1 line. + At LoadBlock, GS_PIX2TMEM(imageW/4,imageSiz) + At LoadTile GS_PIX2TMEM(frameW/4,imageSiz)+1 */ + u16 tmemH; /* height of TMEM loadable at a time (s13.2) 4 times value + When the normal texture, 512/tmemW*4 + When the CI texture, 256/tmemW*4 */ + u16 tmemLoadSH; /* SH value + At LoadBlock, tmemSize/2-1 + At LoadTile, tmemW*16-1 */ + u16 tmemLoadTH; /* TH value or Stride value + At LoadBlock, GS_CALC_DXT(tmemW) + At LoadTile, tmemH-1 */ + u16 tmemSizeW; /* skip value of imagePtr for image 1-line + At LoadBlock, tmemW*2 + At LoadTile, GS_PIX2TMEM(imageW/4,imageSiz)*2 */ + u16 tmemSize; /* skip value of imagePtr for 1-loading + = tmemSizeW*tmemH */ +} uObjBg_t; /* 40 bytes */ + +/* Scalable background plane */ +typedef struct { + u16 imageX; /* x-coordinate of upper-left position of texture (u10.5) */ + u16 imageW; /* width of texture (u10.2) */ + s16 frameX; /* upper-left position of transferred frame (s10.2) */ + u16 frameW; /* width of transferred frame (u10.2) */ + + u16 imageY; /* y-coordinate of upper-left position of texture (u10.5) */ + u16 imageH; /* height of texture (u10.2) */ + s16 frameY; /* upper-left position of transferred frame (s10.2) */ + u16 frameH; /* height of transferred frame (u10.2) */ + + u64* imagePtr; /* texture source address on DRAM */ + u16 imageLoad; /* Which to use, LoadBlock or LoadTile? */ + u8 imageFmt; /* format of texel - G_IM_FMT_* */ + u8 imageSiz; /* size of texel - G_IM_SIZ_* */ + u16 imagePal; /* pallet number */ + u16 imageFlip; /* right & left image inversion (Inverted by G_BG_FLAG_FLIPS) */ + + u16 scaleW; /* scale value of X-direction (u5.10) */ + u16 scaleH; /* scale value of Y-direction (u5.10) */ + s32 imageYorig; /* start point of drawing on image (s20.5) */ + + u8 padding[4]; + +} uObjScaleBg_t; /* 40 bytes */ + +typedef union { + uObjBg_t b; + uObjScaleBg_t s; + long long int force_structure_alignment; +} uObjBg; + +/*---------------------------------------------------------------------------* + * 2D Objects + *---------------------------------------------------------------------------*/ +#define G_OBJ_FLAG_FLIPS 1 << 0 /* inversion to S-direction */ +#define G_OBJ_FLAG_FLIPT 1 << 4 /* nversion to T-direction */ + +typedef struct { + s16 objX; /* s10.2 OBJ x-coordinate of upper-left end */ + u16 scaleW; /* u5.10 Scaling of u5.10 width direction */ + u16 imageW; /* u10.5 width of u10.5 texture (length of S-direction) */ + u16 paddingX; /* Unused - Always 0 */ + s16 objY; /* s10.2 OBJ y-coordinate of s10.2 OBJ upper-left end */ + u16 scaleH; /* u5.10 Scaling of u5.10 height direction */ + u16 imageH; /* u10.5 height of u10.5 texture (length of T-direction) */ + u16 paddingY; /* Unused - Always 0 */ + u16 imageStride; /* folding width of texel (In units of 64bit word) */ + u16 imageAdrs; /* texture header position in TMEM (In units of 64bit word) */ + u8 imageFmt; /* format of texel - G_IM_FMT_* */ + u8 imageSiz; /* size of texel - G_IM_SIZ_* */ + u8 imagePal; /* pallet number (0-7) */ + u8 imageFlags; /* The display flag - G_OBJ_FLAG_FLIP* */ +} uObjSprite_t; /* 24 bytes */ + +typedef union { + uObjSprite_t s; + long long int force_structure_alignment; +} uObjSprite; + +/*---------------------------------------------------------------------------* + * 2D Matrix + *---------------------------------------------------------------------------*/ +typedef struct { + s32 A, B, C, D; /* s15.16 */ + s16 X, Y; /* s10.2 */ + u16 BaseScaleX; /* u5.10 */ + u16 BaseScaleY; /* u5.10 */ +} uObjMtx_t; /* 24 bytes */ + +typedef union { + uObjMtx_t m; + long long int force_structure_alignment; +} uObjMtx; + +typedef struct { + s16 X, Y; /* s10.2 */ + u16 BaseScaleX; /* u5.10 */ + u16 BaseScaleY; /* u5.10 */ +} uObjSubMtx_t; /* 8 bytes */ + +typedef union { + uObjSubMtx_t m; + long long int force_structure_alignment; +} uObjSubMtx; + +/*---------------------------------------------------------------------------* + * Loading into TMEM + *---------------------------------------------------------------------------*/ +#define G_OBJLT_TXTRBLOCK 0x00001033 +#define G_OBJLT_TXTRTILE 0x00fc1034 +#define G_OBJLT_TLUT 0x00000030 + +#define GS_TB_TSIZE(pix, siz) (GS_PIX2TMEM((pix), (siz)) - 1) +#define GS_TB_TLINE(pix, siz) (GS_CALC_DXT(GS_PIX2TMEM((pix), (siz)))) + +typedef struct { + u32 type; /* G_OBJLT_TXTRBLOCK divided into types */ + u64* image; /* texture source address on DRAM */ + u16 tmem; /* loaded TMEM word address (8byteWORD) */ + u16 tsize; /* Texture size, Specified by macro GS_TB_TSIZE() */ + u16 tline; /* width of Texture 1-line, Specified by macro GS_TB_TLINE() */ + u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrBlock_t; /* 24 bytes */ + +#define GS_TT_TWIDTH(pix, siz) ((GS_PIX2TMEM((pix), (siz)) << 2) - 1) +#define GS_TT_THEIGHT(pix, siz) (((pix) << 2) - 1) + +typedef struct { + u32 type; /* G_OBJLT_TXTRTILE divided into types */ + u64* image; /* texture source address on DRAM */ + u16 tmem; /* loaded TMEM word address (8byteWORD)*/ + u16 twidth; /* width of Texture (Specified by macro GS_TT_TWIDTH()) */ + u16 theight; /* height of Texture (Specified by macro GS_TT_THEIGHT()) */ + u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12) */ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrTile_t; /* 24 bytes */ + +#define GS_PAL_HEAD(head) ((head) + 256) +#define GS_PAL_NUM(num) ((num) - 1) + +typedef struct { + u32 type; /* G_OBJLT_TLUT divided into types */ + u64* image; /* texture source address on DRAM */ + u16 phead; /* pallet number of load header (Between 256 and 511) */ + u16 pnum; /* loading pallet number -1 */ + u16 zero; /* Assign 0 all the time */ + u16 sid; /* STATE ID Multipled by 4 (Either one of 0, 4, 8 and 12)*/ + u32 flag; /* STATE flag */ + u32 mask; /* STATE mask */ +} uObjTxtrTLUT_t; /* 24 bytes */ + +typedef union { + uObjTxtrBlock_t block; + uObjTxtrTile_t tile; + uObjTxtrTLUT_t tlut; + long long int force_structure_alignment; +} uObjTxtr; + +/*---------------------------------------------------------------------------* + * Loading into TMEM & 2D Objects + *---------------------------------------------------------------------------*/ +typedef struct { + uObjTxtr txtr; + uObjSprite sprite; +} uObjTxSprite; /* 48 bytes */ + +/*===========================================================================* + * GBI Commands for S2DEX microcode + *===========================================================================*/ +/* GBI Header */ +#ifdef F3DEX_GBI_2 +#define G_OBJ_RECTANGLE_R 0xda +#define G_OBJ_MOVEMEM 0xdc +#define G_RDPHALF_0 0xe4 +#define G_OBJ_RECTANGLE 0x01 +#define G_OBJ_SPRITE 0x02 +#define G_SELECT_DL 0x04 +#define G_OBJ_LOADTXTR 0x05 +#define G_OBJ_LDTX_SPRITE 0x06 +#define G_OBJ_LDTX_RECT 0x07 +#define G_OBJ_LDTX_RECT_R 0x08 +#define G_BG_1CYC 0x09 +#define G_BG_COPY 0x0a +#define G_OBJ_RENDERMODE 0x0b +#else +#define G_BG_1CYC 0x01 +#define G_BG_COPY 0x02 +#define G_OBJ_RECTANGLE 0x03 +#define G_OBJ_SPRITE 0x04 +#define G_OBJ_MOVEMEM 0x05 +#define G_SELECT_DL 0xb0 +#define G_OBJ_RENDERMODE 0xb1 +#define G_OBJ_RECTANGLE_R 0xb2 +#define G_OBJ_LOADTXTR 0xc1 +#define G_OBJ_LDTX_SPRITE 0xc2 +#define G_OBJ_LDTX_RECT 0xc3 +#define G_OBJ_LDTX_RECT_R 0xc4 +#define G_RDPHALF_0 0xe4 +#endif + +/*---------------------------------------------------------------------------* + * Background wrapped screen + *---------------------------------------------------------------------------*/ +#define gSPBgRectangle(pkt, m, mptr) gDma0p((pkt), (m), (mptr), 0) +#define gsSPBgRectangle(m, mptr) gsDma0p((m), (mptr), 0) +#define gSPBgRectCopy(pkt, mptr) gSPBgRectangle((pkt), G_BG_COPY, (mptr)) +#define gsSPBgRectCopy(mptr) gsSPBgRectangle(G_BG_COPY, (mptr)) +#define gSPBgRect1Cyc(pkt, mptr) gSPBgRectangle((pkt), G_BG_1CYC, (mptr)) +#define gsSPBgRect1Cyc(mptr) gsSPBgRectangle(G_BG_1CYC, (mptr)) + +/*---------------------------------------------------------------------------* + * 2D Objects + *---------------------------------------------------------------------------*/ +#define gSPObjSprite(pkt, mptr) gDma0p((pkt), G_OBJ_SPRITE, (mptr), 0) +#define gsSPObjSprite(mptr) gsDma0p(G_OBJ_SPRITE, (mptr), 0) +#define gSPObjRectangle(pkt, mptr) gDma0p((pkt), G_OBJ_RECTANGLE, (mptr), 0) +#define gsSPObjRectangle(mptr) gsDma0p(G_OBJ_RECTANGLE, (mptr), 0) +#define gSPObjRectangleR(pkt, mptr) gDma0p((pkt), G_OBJ_RECTANGLE_R, (mptr), 0) +#define gsSPObjRectangleR(mptr) gsDma0p(G_OBJ_RECTANGLE_R, (mptr), 0) + +/*---------------------------------------------------------------------------* + * 2D Matrix + *---------------------------------------------------------------------------*/ +#define gSPObjMatrix(pkt, mptr) gDma1p((pkt), G_OBJ_MOVEMEM, (mptr), 0, 23) +#define gsSPObjMatrix(mptr) gsDma1p(G_OBJ_MOVEMEM, (mptr), 0, 23) +#define gSPObjSubMatrix(pkt, mptr) gDma1p((pkt), G_OBJ_MOVEMEM, (mptr), 2, 7) +#define gsSPObjSubMatrix(mptr) gsDma1p(G_OBJ_MOVEMEM, (mptr), 2, 7) + +/*---------------------------------------------------------------------------* + * Loading into TMEM + *---------------------------------------------------------------------------*/ +#define gSPObjLoadTxtr(pkt, tptr) gDma0p((pkt), G_OBJ_LOADTXTR, (tptr), 23) +#define gsSPObjLoadTxtr(tptr) gsDma0p(G_OBJ_LOADTXTR, (tptr), 23) +#define gSPObjLoadTxSprite(pkt, tptr) gDma0p((pkt), G_OBJ_LDTX_SPRITE, (tptr), 47) +#define gsSPObjLoadTxSprite(tptr) gsDma0p(G_OBJ_LDTX_SPRITE, (tptr), 47) +#define gSPObjLoadTxRect(pkt, tptr) gDma0p((pkt), G_OBJ_LDTX_RECT, (tptr), 47) +#define gsSPObjLoadTxRect(tptr) gsDma0p(G_OBJ_LDTX_RECT, (tptr), 47) +#define gSPObjLoadTxRectR(pkt, tptr) gDma0p((pkt), G_OBJ_LDTX_RECT_R, (tptr), 47) +#define gsSPObjLoadTxRectR(tptr) gsDma0p(G_OBJ_LDTX_RECT_R, (tptr), 47) + +/*---------------------------------------------------------------------------* + * Select Display List + *---------------------------------------------------------------------------*/ +#define gSPSelectDL(pkt, mptr, sid, flag, mask) \ + { \ + gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); \ + } +#define gsSPSelectDL(mptr, sid, flag, mask) \ + { \ + gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_PUSH); \ + } +#define gSPSelectBranchDL(pkt, mptr, sid, flag, mask) \ + { \ + gDma1p((pkt), G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gDma1p((pkt), G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); \ + } +#define gsSPSelectBranchDL(mptr, sid, flag, mask) \ + { \ + gsDma1p(G_RDPHALF_0, (flag), (u32)(mptr) & 0xffff, (sid)); \ + gsDma1p(G_SELECT_DL, (mask), (u32)(mptr) >> 16, G_DL_NOPUSH); \ + } + +/*---------------------------------------------------------------------------* + * Set general status + *---------------------------------------------------------------------------*/ +#define G_MW_GENSTAT 0x08 /* Note that it is the same value of G_MW_FOG */ + +#define gSPSetStatus(pkt, sid, val) gMoveWd((pkt), G_MW_GENSTAT, (sid), (val)) +#define gsSPSetStatus(sid, val) gsMoveWd(G_MW_GENSTAT, (sid), (val)) + +/*---------------------------------------------------------------------------* + * Set Object Render Mode + *---------------------------------------------------------------------------*/ +#define G_OBJRM_NOTXCLAMP 0x01 +#define G_OBJRM_XLU 0x02 /* Ignored */ +#define G_OBJRM_ANTIALIAS 0x04 /* Ignored */ +#define G_OBJRM_BILERP 0x08 +#define G_OBJRM_SHRINKSIZE_1 0x10 +#define G_OBJRM_SHRINKSIZE_2 0x20 +#define G_OBJRM_WIDEN 0x40 + +#define gSPObjRenderMode(pkt, mode) gImmp1((pkt), G_OBJ_RENDERMODE, (mode)) +#define gsSPObjRenderMode(mode) gsImmp1(G_OBJ_RENDERMODE, (mode)) + +/*===========================================================================* + * Render Mode Macro + *===========================================================================*/ +#define RM_RA_SPRITE(clk) \ + AA_EN | CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE \ + | GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) + +#define G_RM_SPRITE G_RM_OPA_SURF +#define G_RM_SPRITE2 G_RM_OPA_SURF2 +#define G_RM_RA_SPRITE RM_RA_SPRITE(1) +#define G_RM_RA_SPRITE2 RM_RA_SPRITE(2) +#define G_RM_AA_SPRITE G_RM_AA_TEX_TERR +#define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2 +#define G_RM_XLU_SPRITE G_RM_XLU_SURF +#define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2 +#define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF +#define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2 + +/*===========================================================================* + * External functions + *===========================================================================*/ +extern u64 gspS2DEX_fifoTextStart[], gspS2DEX_fifoTextEnd[]; +extern u64 gspS2DEX_fifoDataStart[], gspS2DEX_fifoDataEnd[]; +extern u64 gspS2DEX_fifo_dTextStart[], gspS2DEX_fifo_dTextEnd[]; +extern u64 gspS2DEX_fifo_dDataStart[], gspS2DEX_fifo_dDataEnd[]; +extern u64 gspS2DEX2_fifoTextStart[], gspS2DEX2_fifoTextEnd[]; +extern u64 gspS2DEX2_fifoDataStart[], gspS2DEX2_fifoDataEnd[]; +extern u64 gspS2DEX2_xbusTextStart[], gspS2DEX2_xbusTextEnd[]; +extern u64 gspS2DEX2_xbusDataStart[], gspS2DEX2_xbusDataEnd[]; +extern void guS2DInitBg(uObjBg*); + +#ifdef F3DEX_GBI_2 +#define guS2DEmuBgRect1Cyc guS2D2EmuBgRect1Cyc /*Wrapper*/ +#define guS2DEmuSetScissor guS2D2EmuSetScissor /*Wrapper*/ +extern void guS2D2EmuSetScissor(u32, u32, u32, u32, u8); +extern void guS2D2EmuBgRect1Cyc(Gfx**, uObjBg*); +#else +extern void guS2DEmuSetScissor(u32, u32, u32, u32, u8); +extern void guS2DEmuBgRect1Cyc(Gfx**, uObjBg*); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif +#endif /* _GS2DEX_H_ */ + +/*======== End of gs2dex.h ========*/ diff --git a/lib/hackerlibultra/include/PR/gt.h b/lib/hackerlibultra/include/PR/gt.h new file mode 100644 index 00000000..bfc39b46 --- /dev/null +++ b/lib/hackerlibultra/include/PR/gt.h @@ -0,0 +1,355 @@ + +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: gt.h + * Creator: hsa@sgi.com + * Create Date: Thu Oct 12 15:48:14 PDT 1995 + * + * This file defines the GBI for the TURBO 3D graphics microcode. + * The turbo microcode is a special FEATURE-LIMITED microcode designed + * for specific applications. It is not for general use. + * + * (see XXX for more information) + * + */ + +/************************************************************************** + * + * $Revision: 1.16 $ + * $Date: 1998/05/28 00:14:50 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gt.h,v $ + * + **************************************************************************/ + +#ifndef _GT_H_ +#define _GT_H_ + +/* this file should be #included AFTER gbi.h */ + +#include "sptask.h" + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif /* _LANGUAGE_C_PLUS_PLUS */ + +#include + +/* the following #defines seem out of order, but we need them + * for the microcode. + */ + +/* + * object state field: rendState + * + * This flag word is built up out of the bits from a + * subset of the G_SETGEOMETRYMODE flags from gbi.h. + * + * When each of these bits is '1', the comments below explain + * the effect on the triangles. + */ +#define GT_ZBUFFER G_ZBUFFER +#define GT_TEXTURE G_TEXTURE_ENABLE /* texture ON */ +#define GT_CULL_BACK G_CULL_BACK /* reject backfaces */ +#define GT_SHADING_SMOOTH G_SHADING_SMOOTH /* smooth shade ON */ + +/* + * object state field: textureState + * + * The lower 3 bits of this flag word contain the texture tile number + * to be used. All triangles of an object are rendered with the same + * texture tile. + */ + +/* + * object state field: flag + * + * This is a group of what would be pad bits. We use them for some + * flag bits. + */ +#define GT_FLAG_NOMTX 0x01 /* don't load the matrix */ +#define GT_FLAG_NO_XFM 0x02 /* load vtx, use verbatim */ +#define GT_FLAG_XFM_ONLY 0x04 /* xform vtx, write to *TriN */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* turbo 3D ucode: */ +extern long long int gspTurbo3DTextStart[], gspTurbo3DTextEnd[]; +extern long long int gspTurbo3DDataStart[], gspTurbo3DDataEnd[]; +extern long long int gspTurbo3D_dramTextStart[], gspTurbo3D_dramTextEnd[]; +extern long long int gspTurbo3D_dramDataStart[], gspTurbo3D_dramDataEnd[]; +extern long long int gspTurbo3D_fifoTextStart[], gspTurbo3D_fifoTextEnd[]; +extern long long int gspTurbo3D_fifoDataStart[], gspTurbo3D_fifoDataEnd[]; + +/* + * This is the global state structure. It's definition carefully + * matches the ucode, so if this structure changes, you must also change + * the ucode. + */ +typedef struct { + u16 perspNorm; /* persp normalization */ + u16 pad0; + u32 flag; + Gfx rdpOthermode; + u32 segBases[16]; /* table of segment base addrs (SEE NOTE!) */ + Vp viewport; /* the viewport to use */ + Gfx* rdpCmds; /* block of RDP data, process if !NULL + * block terminated by gDPEndDisplayList() + * (This is a segment address) + */ +} gtGlobState_t; + +/* NOTE: + * Although there are 16 segment table entries, the first one (segment 0) + * is reserved for physical memory mapping. You should not segment 0 + * to anything other than 0x0. + */ + +typedef union { + gtGlobState_t sp; + long long int force_structure_alignment; +} gtGlobState; + +/* + * This is the 'state' structure associated with each object + * to be rendered. It's definition carefully matches the + * ucode, so if this structure changes, you must also change + * the gtoff.c tool and the ucode. + */ +typedef struct { + u32 renderState; /* render state */ + u32 textureState; /* texture state */ + u8 vtxCount; /* how many verts? */ + u8 vtxV0; /* where to load verts? */ + u8 triCount; /* how many tris? */ + u8 flag; + Gfx* rdpCmds; /* ptr (segment address) to RDP DL */ + Gfx rdpOthermode; + Mtx transform; /* the transform matrix to use */ +} gtState_t; + +typedef union { + gtState_t sp; + long long int force_structure_alignment; +} gtState; + +/* gtStateLite : same as gtState, but no matrix (see flags below) */ +/* this structure must be identical to gtState! (bad) */ +typedef struct { + u32 renderState; /* render state */ + u32 textureState; /* texture state */ + u8 vtxCount; /* how many verts? */ + u8 vtxV0; /* where to load verts? */ + u8 triCount; /* how many tris? */ + u8 flag; + Gfx* rdpCmds; /* ptr (segment address) to RDP DL */ + Gfx rdpOthermode; +} gtStateL_t; + +typedef union { + gtStateL_t sp; + long long int force_structure_alignment; +} gtStateL; + +/* + * The vertex list for the turbo display list uses the + * Vtx struct in gbi.h + * + */ + +/* + * This structure represents a single triangle, part of the + * triangle list of the object to be rendered. + * + * NOTE: The triangle list MUST be aligned to an 8-byte boundary. + * Since this structure is only 4 bytes, we are REQUIRING that + * this structure only be used as an array of triangles, and we + * depend on the MIPS C compiler (which always aligns arrays to + * 8-byte boundaries). THIS IS DANGEROUS!!!! + * + */ +typedef struct { + u8 v0, v1, v2, flag; /* flag is which one for flat shade */ +} gtTriN; + +/* + * This structure represents the transformed points. It is the format + * of the points written out when GT_FLAG_XFM_ONLY is set, as well as + * the format expected when GT_FLAG_NO_XFM is used. + * + * NOTE: The size and layout of these points is very similar to Vtx, + * except the screen coordinates overwrite the x,y,z,pad fields. + * (we could consider adding to the Vtx union, but we want to keep + * turbo stuff out of gbi.h) + * + * NOTE: The z is a special format. It can be used to compare vertices + * for sorting, but it should not be used for other purposes. If modified, + * the z-buffer hardware might not understand the data. + * + */ +typedef struct { + short int xscrn; /* x,y screen coordinates are SSSS10.2 */ + short int yscrn; + int zscrn; /* z screen is S15.16 */ + + short int s; /* transformed texture coord, S10.5 */ + short int t; + + u8 r; /* color (or normal) */ + u8 g; + u8 b; + u8 a; +} gtVtxOut_t; + +/* see "Data Structure" comment in gbi.h for information about why + * we use this union. + */ +typedef union { + gtVtxOut_t v; + long long int force_structure_alignment; +} gtVtxOut; + +/* + * state field: rdpOthermode + * + * This is one of the trickier state fields. The turbo interface + * requires the RDP othermode command to be cached by the host, + * therefore we provide a different interface in libultra to help cache + * this in the gt state (this word is just bits, you could pack them + * on your own). + * + * gtStateSetOthermode() accomplishs this, taking as arguments + * the state, one of the following mode enums, and a piece of data + * (othermode parameters from gbi.h). + * + * By definition, the othermode word from the gt state structure is sent + * to the RDP *before* any RDP commands from the rdpCmds[] field. The + * othermode is *always* sent. + * + * Stated another way, NONE of the gbi RDP othermode commands equivalent + * to those listed here are allowed in the rdpCmd[] field of the + * gt state structure. + * + * Notice also that many of these commands do not make sense for + * the turbo ucode (they control features not supported, like mip-mapping). + * They are only included here for completeness. + * + */ +typedef enum { + GT_CLEAR, /* special gt mode, clears othermode state */ + GT_ALPHACOMPARE, + GT_ZSRCSEL, + GT_RENDERMODE, + GT_ALPHADITHER, + GT_RGBDITHER, + GT_COMBKEY, + GT_TEXTCONV, + GT_TEXTFILT, + GT_TEXTLUT, + GT_TEXTLOD, + GT_TEXTDETAIL, + GT_TEXTPERSP, + GT_CYCLETYPE, + GT_PIPELINE +} gtStateOthermode_t; + +/* + * This call builds up an othermode command word. The 'mode' is one of + * the above modes, the 'data' field comes from gbi.h, it is the data + * field for the equivalent gbi setothermode macro. + */ +extern void gtStateSetOthermode(Gfx* om, gtStateOthermode_t mode, int data); + +/* + * This call dumps a turbo display list for use with gbi2mem and RSPSIM + */ +#define GT_DUMPTURBO_HANGAFTER 64 +#define GT_DUMPTURBO_NOTEXTURES 128 +extern void gtDumpTurbo(OSTask* tp, u8 flags); + +/* + * Special macros to init othermode words to all 0's, a good default + * value. + */ +#define gDPClearOtherMode(pkt) \ + { \ + Gfx* _g = (Gfx*)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_RDPSETOTHERMODE, 24, 8); \ + _g->words.w1 = 0x0; \ + } + +#define gsDPClearOtherMode() { _SHIFTL(G_RDPSETOTHERMODE, 24, 8), 0x0 } + +/* + * Special macros to end DP blocks (see above). These commands + * generate all 0's, which the turbo ucode looks for. They *aren't* + * real DP commands! + */ +#define gDPEndDisplayList(pkt) gSPNoOp(pkt) +#define gsDPEndDisplayList() gsSPNoOp() + +/* + * This structure is a turbo 'object', the turbo display list is + * simply a list of these. + * + * NOTE: All pointers are segment addresses + * + * NOTE: If (statep->flag & GT_FLAG_XFM_ONLY), the trip field is + * interpreted as a pointer to gtVtxOut[] that can be used to store + * the transformed points. (statep->triCount should be 0, else bad + * things could happen...) + * + * NOTE: If (statep->flag & GT_FLAG_NO_XFM), the vtxp field is + * interpreted as a pointer to gtVtxOut[] that can be used to load + * pre-transformed points. + * + */ +typedef struct { + gtGlobState* gstatep; /* global state, usually NULL */ + gtState* statep; /* if this is NULL, end object processing */ + Vtx* vtxp; /* if this is NULL, use points in buffer */ + gtTriN* trip; /* if this is NULL, use tris in buffer */ +} gtGfx_t; + +typedef union { + gtGfx_t obj; + long long int force_structure_alignment; +} gtGfx; + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_ASSEMBLY +#include +#endif /* _LANGUAGE_ASSEMBLY */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif /* _LANGUAGE_C_PLUS_PLUS */ + +#ifdef _LANGUAGE_MAKEROM +#endif /* _LANGUAGE_MAKEROM */ + +#endif /* _GT_H_ */ diff --git a/lib/hackerlibultra/include/PR/gu.h b/lib/hackerlibultra/include/PR/gu.h new file mode 100644 index 00000000..bd5858c6 --- /dev/null +++ b/lib/hackerlibultra/include/PR/gu.h @@ -0,0 +1,216 @@ +#ifndef _GU_H_ +#define _GU_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.48 $ + * $Date: 1999/07/13 08:00:20 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/gu.h,v $ + * + **************************************************************************/ + +#include +#include +#include +#include + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#define M_PI 3.14159265358979323846 +#define M_DTOR (3.14159265358979323846 / 180.0) + +#define FTOFIX32(x) (long)((x) * (float)0x00010000) +#define FIX32TOF(x) ((float)(x) * (1.0f / (float)0x00010000)) +#define FTOFRAC8(x) ((int)MIN(((x) * (128.0f)), 127.0f) & 0xff) + +#define FILTER_WRAP 0 +#define FILTER_CLAMP 1 + +#define RAND(x) (guRandom() % x) /* random number between 0 to x */ + +/* + * Data Structures + */ +typedef struct { + unsigned char* base; + int fmt, siz; + int xsize, ysize; + int lsize; + /* current tile info */ + int addr; + int w, h; + int s, t; +} Image; + +typedef struct { + float col[3]; + float pos[3]; + float a1, a2; /* actual color = col/(a1*dist + a2) */ +} PositionalLight; + +/* + * Function Prototypes + */ + +extern int guLoadTextureBlockMipMap(Gfx** glist, unsigned char* tbuf, Image* im, unsigned char startTile, + unsigned char pal, unsigned char cms, unsigned char cmt, unsigned char masks, + unsigned char maskt, unsigned char shifts, unsigned char shiftt, unsigned char cfs, + unsigned char cft); + +extern int guGetDPLoadTextureTileSz(int ult, int lrt); +extern void guDPLoadTextureTile(Gfx* glistp, void* timg, int texl_fmt, int texl_size, int img_width, int img_height, + int uls, int ult, int lrs, int lrt, int palette, int cms, int cmt, int masks, int maskt, + int shifts, int shiftt); + +/* + * matrix operations: + * + * The 'F' version is floating point, in case the application wants + * to do matrix manipulations and convert to fixed-point at the last + * minute. + */ +extern void guMtxIdent(Mtx* m); +extern void guMtxIdentF(float mf[4][4]); +extern void guOrtho(Mtx* m, float l, float r, float b, float t, float n, float f, float scale); +extern void guOrthoF(float mf[4][4], float l, float r, float b, float t, float n, float f, float scale); +extern void guFrustum(Mtx* m, float l, float r, float b, float t, float n, float f, float scale); +extern void guFrustumF(float mf[4][4], float l, float r, float b, float t, float n, float f, float scale); +extern void guPerspective(Mtx* m, u16* perspNorm, float fovy, float aspect, float near, float far, float scale); +extern void guPerspectiveF(float mf[4][4], u16* perspNorm, float fovy, float aspect, float near, float far, + float scale); +extern void guLookAt(Mtx* m, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, float yUp, + float zUp); +extern void guLookAtF(float mf[4][4], float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, + float yUp, float zUp); +extern void guLookAtReflect(Mtx* m, LookAt* l, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp); +extern void guLookAtReflectF(float mf[4][4], LookAt* l, float xEye, float yEye, float zEye, float xAt, float yAt, + float zAt, float xUp, float yUp, float zUp); +extern void guLookAtHilite(Mtx* m, LookAt* l, Hilite* h, float xEye, float yEye, float zEye, float xAt, float yAt, + float zAt, float xUp, float yUp, float zUp, float xl1, float yl1, float zl1, float xl2, + float yl2, float zl2, int twidth, int theight); +extern void guLookAtHiliteF(float mf[4][4], LookAt* l, Hilite* h, float xEye, float yEye, float zEye, float xAt, + float yAt, float zAt, float xUp, float yUp, float zUp, float xl1, float yl1, float zl1, + float xl2, float yl2, float zl2, int twidth, int theight); +extern void guLookAtStereo(Mtx* m, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, + float yUp, float zUp, float eyedist); +extern void guLookAtStereoF(float mf[4][4], float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, float eyedist); +extern void guRotate(Mtx* m, float a, float x, float y, float z); +extern void guRotateF(float mf[4][4], float a, float x, float y, float z); +extern void guRotateRPY(Mtx* m, float r, float p, float y); +extern void guRotateRPYF(float mf[4][4], float r, float p, float h); +extern void guAlign(Mtx* m, float a, float x, float y, float z); +extern void guAlignF(float mf[4][4], float a, float x, float y, float z); +extern void guScale(Mtx* m, float x, float y, float z); +extern void guScaleF(float mf[4][4], float x, float y, float z); +extern void guTranslate(Mtx* m, float x, float y, float z); +extern void guTranslateF(float mf[4][4], float x, float y, float z); +extern void guPosition(Mtx* m, float r, float p, float h, float s, float x, float y, float z); +extern void guPositionF(float mf[4][4], float r, float p, float h, float s, float x, float y, float z); +extern void guMtxF2L(float mf[4][4], Mtx* m); +extern void guMtxL2F(float mf[4][4], Mtx* m); +extern void guMtxCatF(float m[4][4], float n[4][4], float r[4][4]); +extern void guMtxCatL(Mtx* m, Mtx* n, Mtx* res); +extern void guMtxXFMF(float mf[4][4], float x, float y, float z, float* ox, float* oy, float* oz); +extern void guMtxXFML(Mtx* m, float x, float y, float z, float* ox, float* oy, float* oz); + +/* vector utility: */ +extern void guNormalize(float* x, float* y, float* z); + +/* light utilities: */ +void guPosLight(PositionalLight* pl, Light* l, float xOb, float yOb, float zOb); +void guPosLightHilite(PositionalLight* pl1, PositionalLight* pl2, Light* l1, Light* l2, LookAt* l, Hilite* h, + float xEye, float yEye, float zEye, float xOb, float yOb, float zOb, float xUp, float yUp, + float zUp, int twidth, int theight); +extern int guRandom(void); + +/* + * Math functions + */ +extern float sinf(float angle); +extern float cosf(float angle); +extern signed short sins(unsigned short angle); +extern signed short coss(unsigned short angle); +extern float sqrtf(float value); +#if defined(__sgi) && BUILD_VERSION >= VERSION_K +#pragma intrinsic(sqrtf); +#endif + +/* + * Dump routines for low-level display lists + */ +/* flag values for guParseRdpDL() */ +#define GU_PARSERDP_VERBOSE 1 +#define GU_PARSERDP_PRAREA 2 +#define GU_PARSERDP_PRHISTO 4 +#define GU_PARSERDP_DUMPONLY 32 /* doesn't need to be same as */ + /* GU_PARSEGBI_DUMPOLNY, but this */ + /* allows app to use interchangeably */ + +extern void guParseRdpDL(u64* rdp_dl, u64 nbytes, u8 flags); +extern void guParseString(char* StringPointer, u64 nbytes); + +/* + * NO LONGER SUPPORTED, + * use guParseRdpDL with GU_PARSERDP_DUMPONLY flags + */ +/* extern void guDumpRawRdpDL(u64 *rdp_dl, u64 nbytes); */ + +/* flag values for guBlinkRdpDL() */ +#define GU_BLINKRDP_HILITE 1 +#define GU_BLINKRDP_EXTRACT 2 + +extern void guBlinkRdpDL(u64* rdp_dl_in, u64 nbytes_in, u64* rdp_dl_out, u64* nbytes_out, u32 x, u32 y, u32 radius, + u8 red, u8 green, u8 blue, u8 flags); + +/* flag values for guParseGbiDL() */ +#define GU_PARSEGBI_ROWMAJOR 1 +#define GU_PARSEGBI_NONEST 2 +#define GU_PARSEGBI_FLTMTX 4 +#define GU_PARSEGBI_SHOWDMA 8 +#define GU_PARSEGBI_ALLMTX 16 +#define GU_PARSEGBI_DUMPONLY 32 +/* +#define GU_PARSEGBI_HANGAFTER 64 +#define GU_PARSEGBI_NOTEXTURES 128 +*/ +extern void guParseGbiDL(u64* gbi_dl, u32 nbytes, u8 flags); +extern void guDumpGbiDL(OSTask* tp, u8 flags); + +#define GU_PARSE_GBI_TYPE 1 +#define GU_PARSE_RDP_TYPE 2 +#define GU_PARSE_READY 3 +#define GU_PARSE_MEM_BLOCK 4 +#define GU_PARSE_ABI_TYPE 5 +#define GU_PARSE_STRING_TYPE 6 + +typedef struct { + int dataSize; + int dlType; + int flags; + u32 paddr; +} guDLPrintCB; + +void guSprite2DInit(uSprite* SpritePointer, void* SourceImagePointer, void* TlutPointer, int Stride, int SubImageWidth, + int SubImageHeight, int SourceImageType, int SourceImageBitSize, int SourceImageOffsetS, + int SourceImageOffsetT); + +#endif /* !_GU_H_ */ diff --git a/lib/hackerlibultra/include/PR/libaudio.h b/lib/hackerlibultra/include/PR/libaudio.h new file mode 100644 index 00000000..cb3c959a --- /dev/null +++ b/lib/hackerlibultra/include/PR/libaudio.h @@ -0,0 +1,934 @@ +/*==================================================================== + * libaudio.h + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.173 $ + * $Date: 1997/12/01 12:42:21 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/libaudio.h,v $ + * + **************************************************************************/ + +#ifndef __LIB_AUDIO__ +#define __LIB_AUDIO__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +/*********************************************************************** + * misc defines + ***********************************************************************/ +#ifndef _EMULATOR +#ifdef AUD_PROFILE + +#define PROFILE_AUD(num, cnt, max, min) \ + { \ + u32 currCnt = osGetCount(); \ + currCnt -= lastCnt[cnt_index]; \ + cnt_index--; \ + cnt += currCnt; \ + num++; \ + \ + if (currCnt > max) \ + max = currCnt; \ + if (currCnt < min) \ + min = currCnt; \ + } + +#endif /* AUD_PROFILE */ +#endif /* EMULATOR */ + +#ifndef NULL +#define NULL 0 +#endif + +#define AL_FX_BUFFER_SIZE 8192 +#define AL_FRAME_INIT -1 +#define AL_USEC_PER_FRAME 16000 +#define AL_MAX_PRIORITY 127 +#define AL_GAIN_CHANGE_TIME 1000 + +typedef s32 ALMicroTime; +typedef u8 ALPan; + +#define AL_PAN_CENTER 64 +#define AL_PAN_LEFT 0 +#define AL_PAN_RIGHT 127 +#define AL_VOL_FULL 127 +#define AL_KEY_MIN 0 +#define AL_KEY_MAX 127 +#define AL_DEFAULT_FXMIX 0 +#define AL_SUSTAIN 63 + +/*********************************************************************** + * Error handling + ***********************************************************************/ + +#ifdef _DEBUG +#define ALFailIf(condition, error) \ + if (condition) { \ + __osError(error, 0); \ + return; \ + } + +#else +#define ALFailIf(condition, error) \ + if (condition) { \ + return; \ + } +#endif + +#ifdef _DEBUG +#define ALFlagFailIf(condition, flag, error) \ + if (condition) { \ + if (flag) \ + __osError(error, 0); \ + return; \ + } + +#else +#define ALFlagFailIf(condition, flag, error) \ + if (condition) { \ + return; \ + } +#endif + +/*********************************************************************** + * Audio Library global routines + ***********************************************************************/ +typedef struct ALLink_s { + struct ALLink_s* next; + struct ALLink_s* prev; +} ALLink; + +void alUnlink(ALLink* element); +void alLink(ALLink* element, ALLink* after); + +typedef s32 (*ALDMAproc)(s32 addr, s32 len, void* state); +typedef ALDMAproc (*ALDMANew)(void* state); + +void alCopy(void* src, void* dest, s32 len); + +typedef struct { + u8* base; + u8* cur; + s32 len; + s32 count; +} ALHeap; + +#define AL_HEAP_DEBUG 1 +#define AL_HEAP_MAGIC 0x20736a73 +#define AL_HEAP_INIT 0 + +void alHeapInit(ALHeap* hp, u8* base, s32 len); +void* alHeapDBAlloc(u8* file, s32 line, ALHeap* hp, s32 num, s32 size); +s32 alHeapCheck(ALHeap* hp); + +#ifdef _DEBUG +#define alHeapAlloc(hp, elem, size) alHeapDBAlloc((u8*)__FILE__, __LINE__, (hp), (elem), (size)) +#else +#define alHeapAlloc(hp, elem, size) alHeapDBAlloc(0, 0, (hp), (elem), (size)) +#endif + +/*********************************************************************** + * FX Stuff + ***********************************************************************/ +#define AL_FX_NONE 0 +#define AL_FX_SMALLROOM 1 +#define AL_FX_BIGROOM 2 +#define AL_FX_CHORUS 3 +#define AL_FX_FLANGE 4 +#define AL_FX_ECHO 5 +#define AL_FX_CUSTOM 6 + +typedef u8 ALFxId; +typedef void* ALFxRef; + +/*********************************************************************** + * data structures for sound banks + ***********************************************************************/ + +#define AL_BANK_VERSION 0x4231 /* 'B1' */ + +/* Possible wavetable types */ +enum { AL_ADPCM_WAVE = 0, AL_RAW16_WAVE }; + +typedef struct { + s32 order; + s32 npredictors; + s16 book[1]; /* Actually variable size. Must be 8-byte aligned */ +} ALADPCMBook; + +typedef struct { + u32 start; + u32 end; + u32 count; + ADPCM_STATE state; +} ALADPCMloop; + +typedef struct { + u32 start; + u32 end; + u32 count; +} ALRawLoop; + +typedef struct { + ALMicroTime attackTime; + ALMicroTime decayTime; + ALMicroTime releaseTime; + u8 attackVolume; + u8 decayVolume; +} ALEnvelope; + +typedef struct { + u8 velocityMin; + u8 velocityMax; + u8 keyMin; + u8 keyMax; + u8 keyBase; + s8 detune; +} ALKeyMap; + +typedef struct { + ALADPCMloop* loop; + ALADPCMBook* book; +} ALADPCMWaveInfo; + +typedef struct { + ALRawLoop* loop; +} ALRAWWaveInfo; + +typedef struct ALWaveTable_s { + u8* base; /* ptr to start of wave data */ + s32 len; /* length of data in bytes */ + u8 type; /* compression type */ + u8 flags; /* offset/address flags */ + union { + ALADPCMWaveInfo adpcmWave; + ALRAWWaveInfo rawWave; + } waveInfo; +} ALWaveTable; + +typedef struct ALSound_s { + ALEnvelope* envelope; + ALKeyMap* keyMap; + ALWaveTable* wavetable; /* offset to wavetable struct */ + ALPan samplePan; + u8 sampleVolume; + u8 flags; +} ALSound; + +typedef struct { + u8 volume; /* overall volume for this instrument */ + ALPan pan; /* 0 = hard left, 127 = hard right */ + u8 priority; /* voice priority for this instrument */ + u8 flags; + u8 tremType; /* the type of tremelo osc. to use */ + u8 tremRate; /* the rate of the tremelo osc. */ + u8 tremDepth; /* the depth of the tremelo osc */ + u8 tremDelay; /* the delay for the tremelo osc */ + u8 vibType; /* the type of tremelo osc. to use */ + u8 vibRate; /* the rate of the tremelo osc. */ + u8 vibDepth; /* the depth of the tremelo osc */ + u8 vibDelay; /* the delay for the tremelo osc */ + s16 bendRange; /* pitch bend range in cents */ + s16 soundCount; /* number of sounds in this array */ + ALSound* soundArray[1]; +} ALInstrument; + +typedef struct ALBank_s { + s16 instCount; /* number of programs in this bank */ + u8 flags; + u8 pad; + s32 sampleRate; /* e.g. 44100, 22050, etc... */ + ALInstrument* percussion; /* default percussion for GM */ + ALInstrument* instArray[1]; /* ARRAY of instruments */ +} ALBank; + +typedef struct { /* Note: sizeof won't be correct */ + s16 revision; /* format revision of this file */ + s16 bankCount; /* number of banks */ + ALBank* bankArray[1]; /* ARRAY of bank offsets */ +} ALBankFile; + +void alBnkfNew(ALBankFile* f, u8* table); + +/*********************************************************************** + * Sequence Files + ***********************************************************************/ +#define AL_SEQBANK_VERSION 'S1' + +typedef struct { + u8* offset; + s32 len; +} ALSeqData; + +typedef struct { /* Note: sizeof won't be correct */ + s16 revision; /* format revision of this file */ + s16 seqCount; /* number of sequences */ + ALSeqData seqArray[1]; /* ARRAY of sequence info */ +} ALSeqFile; + +void alSeqFileNew(ALSeqFile* f, u8* base); + +/*********************************************************************** + * Synthesis driver stuff + ***********************************************************************/ +typedef ALMicroTime (*ALVoiceHandler)(void*); + +typedef struct { + s32 maxVVoices; /* obsolete */ + s32 maxPVoices; + s32 maxUpdates; + s32 maxFXbusses; + void* dmaproc; + ALHeap* heap; + s32 outputRate; /* output sample rate */ + ALFxId fxType; + s32* params; +} ALSynConfig; + +typedef struct ALPlayer_s { + struct ALPlayer_s* next; + void* clientData; /* storage for client callback */ + ALVoiceHandler handler; /* voice handler for player */ + ALMicroTime callTime; /* usec requested callback */ + s32 samplesLeft; /* usec remaining to callback */ +} ALPlayer; + +typedef struct ALVoice_s { + ALLink node; + struct PVoice_s* pvoice; + ALWaveTable* table; + void* clientPrivate; + s16 state; + s16 priority; + s16 fxBus; + s16 unityPitch; +} ALVoice; + +typedef struct ALVoiceConfig_s { + s16 priority; /* voice priority */ + s16 fxBus; /* bus assignment */ + u8 unityPitch; /* unity pitch flag */ +} ALVoiceConfig; + +typedef struct { + ALPlayer* head; /* client list head */ + ALLink pFreeList; /* list of free physical voices */ + ALLink pAllocList; /* list of allocated physical voices */ + ALLink pLameList; /* list of voices ready to be freed */ + s32 paramSamples; + s32 curSamples; /* samples from start of game */ + ALDMANew dma; + ALHeap* heap; + + struct ALParam_s* paramList; + + struct ALMainBus_s* mainBus; + struct ALAuxBus_s* auxBus; /* ptr to array of aux bus structs */ + struct ALFilter_s* outputFilter; /* last filter in the filter chain */ + + s32 numPVoices; + s32 maxAuxBusses; + s32 outputRate; /* output sample rate */ + s32 maxOutSamples; /* Maximum samples rsp can generate + at one time at output rate */ +} ALSynth; + +void alSynNew(ALSynth* s, ALSynConfig* config); +void alSynDelete(ALSynth* s); + +void alSynAddPlayer(ALSynth* s, ALPlayer* client); +void alSynRemovePlayer(ALSynth* s, ALPlayer* client); + +s32 alSynAllocVoice(ALSynth* s, ALVoice* v, ALVoiceConfig* vc); +void alSynFreeVoice(ALSynth* s, ALVoice* voice); + +void alSynStartVoice(ALSynth* s, ALVoice* voice, ALWaveTable* w); +void alSynStartVoiceParams(ALSynth* s, ALVoice* voice, ALWaveTable* w, f32 pitch, s16 vol, ALPan pan, u8 fxmix, + ALMicroTime t); +void alSynStopVoice(ALSynth* s, ALVoice* voice); + +void alSynSetVol(ALSynth* s, ALVoice* v, s16 vol, ALMicroTime delta); +void alSynSetPitch(ALSynth* s, ALVoice* voice, f32 ratio); +void alSynSetPan(ALSynth* s, ALVoice* voice, ALPan pan); +void alSynSetFXMix(ALSynth* s, ALVoice* voice, u8 fxmix); +void alSynSetPriority(ALSynth* s, ALVoice* voice, s16 priority); +s16 alSynGetPriority(ALSynth* s, ALVoice* voice); + +ALFxRef* alSynAllocFX(ALSynth* s, s16 bus, ALSynConfig* c, ALHeap* hp); +ALFxRef alSynGetFXRef(ALSynth* s, s16 bus, s16 index); +void alSynFreeFX(ALSynth* s, ALFxRef* fx); +void alSynSetFXParam(ALSynth* s, ALFxRef fx, s16 paramID, void* param); + +/*********************************************************************** + * Audio Library (AL) stuff + ***********************************************************************/ +typedef struct { + ALSynth drvr; +} ALGlobals; + +extern ALGlobals* alGlobals; + +void alInit(ALGlobals* glob, ALSynConfig* c); +void alClose(ALGlobals* glob); + +Acmd* alAudioFrame(Acmd* cmdList, s32* cmdLen, s16* outBuf, s32 outLen); + +/*********************************************************************** + * Sequence Player stuff + ***********************************************************************/ + +/* + * Play states + */ +#define AL_STOPPED 0 +#define AL_PLAYING 1 +#define AL_STOPPING 2 + +#define AL_DEFAULT_PRIORITY 5 +#define AL_DEFAULT_VOICE 0 +#define AL_MAX_CHANNELS 16 + +/* + * Audio Library event type definitions + */ +enum ALMsg { + AL_SEQ_REF_EVT, /* Reference to a pending event in the sequence. */ + AL_SEQ_MIDI_EVT, + AL_SEQP_MIDI_EVT, + AL_TEMPO_EVT, + AL_SEQ_END_EVT, + AL_NOTE_END_EVT, + AL_SEQP_ENV_EVT, + AL_SEQP_META_EVT, + AL_SEQP_PROG_EVT, + AL_SEQP_API_EVT, + AL_SEQP_VOL_EVT, + AL_SEQP_LOOP_EVT, + AL_SEQP_PRIORITY_EVT, + AL_SEQP_SEQ_EVT, + AL_SEQP_BANK_EVT, + AL_SEQP_PLAY_EVT, + AL_SEQP_STOP_EVT, + AL_SEQP_STOPPING_EVT, + AL_TRACK_END, + AL_CSP_LOOPSTART, + AL_CSP_LOOPEND, + AL_CSP_NOTEOFF_EVT, + AL_TREM_OSC_EVT, + AL_VIB_OSC_EVT +}; + +/* + * Midi event definitions + */ +#define AL_EVTQ_END 0x7fffffff + +enum AL_MIDIstatus { + /* For distinguishing channel number from status */ + AL_MIDI_ChannelMask = 0x0F, + AL_MIDI_StatusMask = 0xF0, + + /* Channel voice messages */ + AL_MIDI_ChannelVoice = 0x80, + AL_MIDI_NoteOff = 0x80, + AL_MIDI_NoteOn = 0x90, + AL_MIDI_PolyKeyPressure = 0xA0, + AL_MIDI_ControlChange = 0xB0, + AL_MIDI_ChannelModeSelect = 0xB0, + AL_MIDI_ProgramChange = 0xC0, + AL_MIDI_ChannelPressure = 0xD0, + AL_MIDI_PitchBendChange = 0xE0, + + /* System messages */ + AL_MIDI_SysEx = 0xF0, /* System Exclusive */ + + /* System common */ + AL_MIDI_SystemCommon = 0xF1, + AL_MIDI_TimeCodeQuarterFrame = 0xF1, + AL_MIDI_SongPositionPointer = 0xF2, + AL_MIDI_SongSelect = 0xF3, + AL_MIDI_Undefined1 = 0xF4, + AL_MIDI_Undefined2 = 0xF5, + AL_MIDI_TuneRequest = 0xF6, + AL_MIDI_EOX = 0xF7, /* End of System Exclusive */ + + /* System real time */ + AL_MIDI_SystemRealTime = 0xF8, + AL_MIDI_TimingClock = 0xF8, + AL_MIDI_Undefined3 = 0xF9, + AL_MIDI_Start = 0xFA, + AL_MIDI_Continue = 0xFB, + AL_MIDI_Stop = 0xFC, + AL_MIDI_Undefined4 = 0xFD, + AL_MIDI_ActiveSensing = 0xFE, + AL_MIDI_SystemReset = 0xFF, + AL_MIDI_Meta = 0xFF /* MIDI Files only */ +}; + +enum AL_MIDIctrl { + AL_MIDI_VOLUME_CTRL = 0x07, + AL_MIDI_PAN_CTRL = 0x0A, + AL_MIDI_PRIORITY_CTRL = 0x10, /* use general purpose controller for priority */ + AL_MIDI_FX_CTRL_0 = 0x14, + AL_MIDI_FX_CTRL_1 = 0x15, + AL_MIDI_FX_CTRL_2 = 0x16, + AL_MIDI_FX_CTRL_3 = 0x17, + AL_MIDI_FX_CTRL_4 = 0x18, + AL_MIDI_FX_CTRL_5 = 0x19, + AL_MIDI_FX_CTRL_6 = 0x1A, + AL_MIDI_FX_CTRL_7 = 0x1B, + AL_MIDI_FX_CTRL_8 = 0x1C, + AL_MIDI_FX_CTRL_9 = 0x1D, + AL_MIDI_SUSTAIN_CTRL = 0x40, + AL_MIDI_FX1_CTRL = 0x5B, + AL_MIDI_FX3_CTRL = 0x5D +}; + +enum AL_MIDImeta { AL_MIDI_META_TEMPO = 0x51, AL_MIDI_META_EOT = 0x2f }; + +#define AL_CMIDI_BLOCK_CODE 0xFE +#define AL_CMIDI_LOOPSTART_CODE 0x2E +#define AL_CMIDI_LOOPEND_CODE 0x2D +#define AL_CMIDI_CNTRL_LOOPSTART 102 +#define AL_CMIDI_CNTRL_LOOPEND 103 +#define AL_CMIDI_CNTRL_LOOPCOUNT_SM 104 +#define AL_CMIDI_CNTRL_LOOPCOUNT_BIG 105 + +typedef struct { + u8* curPtr; /* ptr to the next event */ + s32 lastTicks; /* sequence clock ticks (used by alSeqSetLoc) */ + s32 curTicks; /* sequence clock ticks of next event (used by loop end test) */ + s16 lastStatus; /* the last status msg */ +} ALSeqMarker; + +typedef struct { + s32 ticks; /* MIDI, Tempo and End events must start with ticks */ + u8 status; + u8 byte1; + u8 byte2; + u32 duration; +} ALMIDIEvent; + +typedef struct { + s32 ticks; + u8 status; + u8 type; + u8 len; + u8 byte1; + u8 byte2; + u8 byte3; +} ALTempoEvent; + +typedef struct { + s32 ticks; + u8 status; + u8 type; + u8 len; +} ALEndEvent; + +typedef struct { + struct ALVoice_s* voice; +} ALNoteEvent; + +typedef struct { + struct ALVoice_s* voice; + ALMicroTime delta; + u8 vol; +} ALVolumeEvent; + +typedef struct { + s16 vol; +} ALSeqpVolEvent; + +typedef struct { + ALSeqMarker* start; + ALSeqMarker* end; + s32 count; +} ALSeqpLoopEvent; + +typedef struct { + u8 chan; + u8 priority; +} ALSeqpPriorityEvent; + +typedef struct { + void* seq; /* pointer to a seq (could be an ALSeq or an ALCSeq). */ +} ALSeqpSeqEvent; + +typedef struct { + ALBank* bank; +} ALSeqpBankEvent; + +typedef struct { + struct ALVoiceState_s* vs; + void* oscState; + u8 chan; +} ALOscEvent; + +typedef struct { + s16 type; + union { + ALMIDIEvent midi; + ALTempoEvent tempo; + ALEndEvent end; + ALNoteEvent note; + ALVolumeEvent vol; + ALSeqpLoopEvent loop; + ALSeqpVolEvent spvol; + ALSeqpPriorityEvent sppriority; + ALSeqpSeqEvent spseq; + ALSeqpBankEvent spbank; + ALOscEvent osc; + } msg; +} ALEvent; + +typedef struct { + ALLink node; + ALMicroTime delta; + ALEvent evt; +} ALEventListItem; + +typedef struct { + ALLink freeList; + ALLink allocList; + s32 eventCount; +} ALEventQueue; + +void alEvtqNew(ALEventQueue* evtq, ALEventListItem* items, s32 itemCount); +ALMicroTime alEvtqNextEvent(ALEventQueue* evtq, ALEvent* evt); +void alEvtqPostEvent(ALEventQueue* evtq, ALEvent* evt, ALMicroTime delta); +void alEvtqFlush(ALEventQueue* evtq); +void alEvtqFlushType(ALEventQueue* evtq, s16 type); + +#define AL_PHASE_ATTACK 0 +#define AL_PHASE_NOTEON 0 +#define AL_PHASE_DECAY 1 +#define AL_PHASE_SUSTAIN 2 +#define AL_PHASE_RELEASE 3 +#define AL_PHASE_SUSTREL 4 + +typedef struct ALVoiceState_s { + struct ALVoiceState_s* next; /* MUST be first */ + ALVoice voice; + ALSound* sound; + ALMicroTime envEndTime; /* time of envelope segment end */ + f32 pitch; /* currect pitch ratio */ + f32 vibrato; /* current value of the vibrato */ + u8 envGain; /* current envelope gain */ + u8 channel; /* channel assignment */ + u8 key; /* note on key number */ + u8 velocity; /* note on velocity */ + u8 envPhase; /* what envelope phase */ + u8 phase; + u8 tremelo; /* current value of the tremelo */ + u8 flags; /* bit 0 tremelo flag + bit 1 vibrato flag */ +} ALVoiceState; + +typedef struct { + ALInstrument* instrument; /* instrument assigned to this chan */ + s16 bendRange; /* pitch bend range in cents */ + ALFxId fxId; /* type of fx assigned to this chan */ + ALPan pan; /* overall pan for this chan */ + u8 priority; /* priority for this chan */ + u8 vol; /* current volume for this chan */ + u8 fxmix; /* current fx mix for this chan */ + u8 sustain; /* current sustain pedal state */ + f32 pitchBend; /* current pitch bend val in cents */ +} ALChanState; + +typedef struct ALSeq_s { + u8* base; /* ptr to start of sequence file */ + u8* trackStart; /* ptr to first MIDI event */ + u8* curPtr; /* ptr to next event to read */ + s32 lastTicks; /* MIDI ticks for last event */ + s32 len; /* length of sequence in bytes */ + f32 qnpt; /* qrter notes / tick (1/division) */ + s16 division; /* ticks per quarter note */ + s16 lastStatus; /* for running status */ +} ALSeq; + +typedef struct { + u32 trackOffset[16]; + u32 division; +} ALCMidiHdr; + +typedef struct ALCSeq_s { + ALCMidiHdr* base; /* ptr to start of sequence file */ + u32 validTracks; /* set of flags, showing valid tracks */ + f32 qnpt; /* qrter notes / tick (1/division) */ + u32 lastTicks; /* keep track of ticks incase app wants */ + u32 lastDeltaTicks; /* number of delta ticks of last event */ + u32 deltaFlag; /* flag: set if delta's not subtracted */ + u8* curLoc[16]; /* ptr to current track location, */ + /* may point to next event, or may point */ + /* to a backup code */ + u8* curBUPtr[16]; /* ptr to next event if in backup mode */ + u8 curBULen[16]; /* if > 0, then in backup mode */ + u8 lastStatus[16]; /* for running status */ + u32 evtDeltaTicks[16]; /* delta time to next event */ +} ALCSeq; + +typedef struct { + u32 validTracks; + s32 lastTicks; + u32 lastDeltaTicks; + u8* curLoc[16]; + u8* curBUPtr[16]; + u8 curBULen[16]; + u8 lastStatus[16]; + u32 evtDeltaTicks[16]; +} ALCSeqMarker; + +#define NO_SOUND_ERR_MASK 0x01 +#define NOTE_OFF_ERR_MASK 0x02 +#define NO_VOICE_ERR_MASK 0x04 + +typedef struct { + s32 maxVoices; /* max number of voices to alloc */ + s32 maxEvents; /* max internal events to support */ + u8 maxChannels; /* max MIDI channels to support (16)*/ + u8 debugFlags; /* control which error get reported */ + ALHeap* heap; /* ptr to initialized heap */ + void* initOsc; + void* updateOsc; + void* stopOsc; +} ALSeqpConfig; + +typedef ALMicroTime (*ALOscInit)(void** oscState, f32* initVal, u8 oscType, u8 oscRate, u8 oscDepth, u8 oscDelay); +typedef ALMicroTime (*ALOscUpdate)(void* oscState, f32* updateVal); +typedef void (*ALOscStop)(void* oscState); + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALSynth* drvr; /* reference to the client driver */ + ALSeq* target; /* current sequence */ + ALMicroTime curTime; + ALBank* bank; /* current ALBank */ + s32 uspt; /* microseconds per tick */ + s32 nextDelta; /* microseconds to next callback */ + s32 state; + u16 chanMask; /* active channels */ + s16 vol; /* overall sequence volume */ + u8 maxChannels; /* number of MIDI channels */ + u8 debugFlags; /* control which error get reported */ + ALEvent nextEvent; + ALEventQueue evtq; + ALMicroTime frameTime; + ALChanState* chanState; /* 16 channels for MIDI */ + ALVoiceState* vAllocHead; /* list head for allocated voices */ + ALVoiceState* vAllocTail; /* list tail for allocated voices */ + ALVoiceState* vFreeList; /* list of free voice state structs */ + ALOscInit initOsc; + ALOscUpdate updateOsc; + ALOscStop stopOsc; + ALSeqMarker* loopStart; + ALSeqMarker* loopEnd; + s32 loopCount; /* -1 = loop forever, 0 = no loop */ +} ALSeqPlayer; + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALSynth* drvr; /* reference to the client driver */ + ALCSeq* target; /* current sequence */ + ALMicroTime curTime; + ALBank* bank; /* current ALBank */ + s32 uspt; /* microseconds per tick */ + s32 nextDelta; /* microseconds to next callback */ + s32 state; + u16 chanMask; /* active channels */ + s16 vol; /* overall sequence volume */ + u8 maxChannels; /* number of MIDI channels */ + u8 debugFlags; /* control which error get reported */ + ALEvent nextEvent; + ALEventQueue evtq; + ALMicroTime frameTime; + ALChanState* chanState; /* 16 channels for MIDI */ + ALVoiceState* vAllocHead; /* list head for allocated voices */ + ALVoiceState* vAllocTail; /* list tail for allocated voices */ + ALVoiceState* vFreeList; /* list of free voice state structs */ + ALOscInit initOsc; + ALOscUpdate updateOsc; + ALOscStop stopOsc; +} ALCSPlayer; + +/* + * Sequence data representation routines + */ +void alSeqNew(ALSeq* seq, u8* ptr, s32 len); +void alSeqNextEvent(ALSeq* seq, ALEvent* event); +s32 alSeqGetTicks(ALSeq* seq); +f32 alSeqTicksToSec(ALSeq* seq, s32 ticks, u32 tempo); +u32 alSeqSecToTicks(ALSeq* seq, f32 sec, u32 tempo); +void alSeqNewMarker(ALSeq* seq, ALSeqMarker* m, u32 ticks); +void alSeqSetLoc(ALSeq* seq, ALSeqMarker* marker); +void alSeqGetLoc(ALSeq* seq, ALSeqMarker* marker); +/* + * Compact Sequence data representation routines + */ +void alCSeqNew(ALCSeq* seq, u8* ptr); +void alCSeqNextEvent(ALCSeq* seq, ALEvent* evt); +s32 alCSeqGetTicks(ALCSeq* seq); +f32 alCSeqTicksToSec(ALCSeq* seq, s32 ticks, u32 tempo); +u32 alCSeqSecToTicks(ALCSeq* seq, f32 sec, u32 tempo); +void alCSeqNewMarker(ALCSeq* seq, ALCSeqMarker* m, u32 ticks); +void alCSeqSetLoc(ALCSeq* seq, ALCSeqMarker* marker); +void alCSeqGetLoc(ALCSeq* seq, ALCSeqMarker* marker); + +/* + * Sequence Player routines + */ +f32 alCents2Ratio(s32 cents); + +void alSeqpNew(ALSeqPlayer* seqp, ALSeqpConfig* config); +void alSeqpDelete(ALSeqPlayer* seqp); +void alSeqpSetSeq(ALSeqPlayer* seqp, ALSeq* seq); +ALSeq* alSeqpGetSeq(ALSeqPlayer* seqp); +void alSeqpPlay(ALSeqPlayer* seqp); +void alSeqpStop(ALSeqPlayer* seqp); +s32 alSeqpGetState(ALSeqPlayer* seqp); +void alSeqpSetBank(ALSeqPlayer* seqp, ALBank* b); +void alSeqpSetTempo(ALSeqPlayer* seqp, s32 tempo); +s32 alSeqpGetTempo(ALSeqPlayer* seqp); +s16 alSeqpGetVol(ALSeqPlayer* seqp); /* Master volume control */ +void alSeqpSetVol(ALSeqPlayer* seqp, s16 vol); +void alSeqpLoop(ALSeqPlayer* seqp, ALSeqMarker* start, ALSeqMarker* end, s32 count); + +void alSeqpSetChlProgram(ALSeqPlayer* seqp, u8 chan, u8 prog); +s32 alSeqpGetChlProgram(ALSeqPlayer* seqp, u8 chan); +void alSeqpSetChlFXMix(ALSeqPlayer* seqp, u8 chan, u8 fxmix); +u8 alSeqpGetChlFXMix(ALSeqPlayer* seqp, u8 chan); +void alSeqpSetChlVol(ALSeqPlayer* seqp, u8 chan, u8 vol); +u8 alSeqpGetChlVol(ALSeqPlayer* seqp, u8 chan); +void alSeqpSetChlPan(ALSeqPlayer* seqp, u8 chan, ALPan pan); +ALPan alSeqpGetChlPan(ALSeqPlayer* seqp, u8 chan); +void alSeqpSetChlPriority(ALSeqPlayer* seqp, u8 chan, u8 priority); +u8 alSeqpGetChlPriority(ALSeqPlayer* seqp, u8 chan); +void alSeqpSendMidi(ALSeqPlayer* seqp, s32 ticks, u8 status, u8 byte1, u8 byte2); + +/* Maintain backwards compatibility with old routine names. */ +#define alSeqpSetProgram alSeqpSetChlProgram +#define alSeqpGetProgram alSeqpGetChlProgram +#define alSeqpSetFXMix alSeqpSetChlFXMix +#define alSeqpGetFXMix alSeqpGetChlFXMix +#define alSeqpSetPan alSeqpSetChlPan +#define alSeqpGetPan alSeqpGetChlPan +#define alSeqpSetChannelPriority alSeqpSetChlPriority +#define alSeqpGetChannelPriority alSeqpGetChlPriority + +/* + * Compressed Sequence Player routines + */ +void alCSPNew(ALCSPlayer* seqp, ALSeqpConfig* config); +void alCSPDelete(ALCSPlayer* seqp); +void alCSPSetSeq(ALCSPlayer* seqp, ALCSeq* seq); +ALCSeq* alCSPGetSeq(ALCSPlayer* seqp); +void alCSPPlay(ALCSPlayer* seqp); +void alCSPStop(ALCSPlayer* seqp); +s32 alCSPGetState(ALCSPlayer* seqp); +void alCSPSetBank(ALCSPlayer* seqp, ALBank* b); +void alCSPSetTempo(ALCSPlayer* seqp, s32 tempo); +s32 alCSPGetTempo(ALCSPlayer* seqp); +s16 alCSPGetVol(ALCSPlayer* seqp); +void alCSPSetVol(ALCSPlayer* seqp, s16 vol); + +void alCSPSetChlProgram(ALCSPlayer* seqp, u8 chan, u8 prog); +s32 alCSPGetChlProgram(ALCSPlayer* seqp, u8 chan); +void alCSPSetChlFXMix(ALCSPlayer* seqp, u8 chan, u8 fxmix); +u8 alCSPGetChlFXMix(ALCSPlayer* seqp, u8 chan); +void alCSPSetChlPan(ALCSPlayer* seqp, u8 chan, ALPan pan); +ALPan alCSPGetChlPan(ALCSPlayer* seqp, u8 chan); +void alCSPSetChlVol(ALCSPlayer* seqp, u8 chan, u8 vol); +u8 alCSPGetChlVol(ALCSPlayer* seqp, u8 chan); +void alCSPSetChlPriority(ALCSPlayer* seqp, u8 chan, u8 priority); +u8 alCSPGetChlPriority(ALCSPlayer* seqp, u8 chan); +void alCSPSendMidi(ALCSPlayer* seqp, s32 ticks, u8 status, u8 byte1, u8 byte2); + +/* Maintain backwards compatibility with old routine names. */ +#define alCSPSetProgram alCSPSetChlProgram +#define alCSPGetProgram alCSPGetChlProgram +#define alCSPSetFXMix alCSPSetChlFXMix +#define alCSPGetFXMix alCSPGetChlFXMix +#define alCSPSetPan alCSPSetChlPan +#define alCSPGetPan alCSPGetChlPan +#define alCSPSetChannelPriority alCSPSetChlPriority +#define alCSPGetChannelPriority alCSPGetChlPriority + +/*********************************************************************** + * Sound Player stuff + ***********************************************************************/ + +typedef struct { + s32 maxSounds; + s32 maxEvents; + ALHeap* heap; +} ALSndpConfig; + +typedef struct { + ALPlayer node; /* note: must be first in structure */ + ALEventQueue evtq; + ALEvent nextEvent; + ALSynth* drvr; /* reference to the client driver */ + s32 target; + void* sndState; + s32 maxSounds; + ALMicroTime frameTime; + ALMicroTime nextDelta; /* microseconds to next callback */ + ALMicroTime curTime; +} ALSndPlayer; + +typedef s16 ALSndId; + +void alSndpNew(ALSndPlayer* sndp, ALSndpConfig* c); +void alSndpDelete(ALSndPlayer* sndp); + +ALSndId alSndpAllocate(ALSndPlayer* sndp, ALSound* sound); +void alSndpDeallocate(ALSndPlayer* sndp, ALSndId id); + +void alSndpSetSound(ALSndPlayer* sndp, ALSndId id); +ALSndId alSndpGetSound(ALSndPlayer* sndp); + +void alSndpPlay(ALSndPlayer* sndp); +void alSndpPlayAt(ALSndPlayer* sndp, ALMicroTime delta); +void alSndpStop(ALSndPlayer* sndp); + +void alSndpSetVol(ALSndPlayer* sndp, s16 vol); +void alSndpSetPitch(ALSndPlayer* sndp, f32 pitch); +void alSndpSetPan(ALSndPlayer* sndp, ALPan pan); +void alSndpSetPriority(ALSndPlayer* sndp, ALSndId id, u8 priority); + +void alSndpSetFXMix(ALSndPlayer* sndp, u8 mix); +s32 alSndpGetState(ALSndPlayer* sndp); + +#ifndef _FINALROM +void alParseAbiCL(Acmd* cmdList, u32 nbytes); +#endif +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !__LIB_AUDIO__ */ diff --git a/lib/hackerlibultra/include/PR/mbi.h b/lib/hackerlibultra/include/PR/mbi.h new file mode 100644 index 00000000..39e186b8 --- /dev/null +++ b/lib/hackerlibultra/include/PR/mbi.h @@ -0,0 +1,97 @@ +#ifndef _MBI_H_ +#define _MBI_H_ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.136 $ + * $Date: 1999/01/05 13:04:00 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/mbi.h,v $ + * + **************************************************************************/ + +/* + * Header file for the Media Binary Interface + * + * NOTE: This file is included by the RSP microcode, so any C-specific + * constructs must be bracketed by #ifdef _LANGUAGE_C + * + */ + +/* + * the SHIFT macros are used to build display list commands, inserting + * bit-fields into a 32-bit word. They take a value, a shift amount, + * and a width. + * + * For the left shift, the lower bits of the value are masked, + * then shifted left. + * + * For the right shift, the value is shifted right, then the lower bits + * are masked. + * + * (NOTE: _SHIFTL(v, 0, 32) won't work, just use an assignment) + * + */ +#define _SHIFTL(v, s, w) ((unsigned int)(((unsigned int)(v) & ((0x01 << (w)) - 1)) << (s))) +#define _SHIFTR(v, s, w) ((unsigned int)(((unsigned int)(v) >> (s)) & ((0x01 << (w)) - 1))) + +#define _SHIFT _SHIFTL /* old, for compatibility only */ + +#define G_ON (1) +#define G_OFF (0) + +/************************************************************************** + * + * Graphics Binary Interface + * + **************************************************************************/ + +#include + +/************************************************************************** + * + * Audio Binary Interface + * + **************************************************************************/ + +#include + +/************************************************************************** + * + * Task list + * + **************************************************************************/ + +#define M_GFXTASK 1 +#define M_AUDTASK 2 +#define M_VIDTASK 3 +#define M_HVQTASK 6 +#define M_HVQMTASK 7 + +/************************************************************************** + * + * Segment macros and definitions + * + **************************************************************************/ + +#define NUM_SEGMENTS (16) +#define SEGMENT_OFFSET(a) ((unsigned int)(a) & 0x00ffffff) +#define SEGMENT_NUMBER(a) (((unsigned int)(a) << 4) >> 28) +#define SEGMENT_ADDR(num, off) (((num) << 24) + (off)) + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* !_MBI_H_ */ diff --git a/lib/hackerlibultra/include/PR/os.h b/lib/hackerlibultra/include/PR/os.h new file mode 100644 index 00000000..2ce02f99 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * os.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os.h,v $ + $Revision: 1.168 $ + $Date: 2000/06/15 06:24:52 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_H_ +#define _OS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Stack size for I/O device managers: PIM (PI Manager), VIM (VI Manager), + * SIM (SI Manager) + * + */ +#define OS_PIM_STACKSIZE 4096 +#define OS_VIM_STACKSIZE 4096 +#define OS_SIM_STACKSIZE 4096 + +#define OS_MIN_STACKSIZE 72 + +/* + * Leo Disk + */ + +/* transfer mode */ + +#define LEO_BLOCK_MODE 1 +#define LEO_TRACK_MODE 2 +#define LEO_SECTOR_MODE 3 + +/* + * Boot addresses + */ +#define BOOT_ADDRESS_ULTRA 0x80000400 +#define BOOT_ADDRESS_COSIM 0x80002000 +#define BOOT_ADDRESS_EMU 0x20010000 +#define BOOT_ADDRESS_INDY 0x88100000 + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_H */ diff --git a/lib/hackerlibultra/include/PR/os_ai.h b/lib/hackerlibultra/include/PR/os_ai.h new file mode 100644 index 00000000..4aaf9d8d --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_ai.h @@ -0,0 +1,87 @@ + +/*==================================================================== + * os_ai.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_ai.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:04 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_AI_H_ +#define _OS_AI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Audio interface (Ai) */ +extern u32 osAiGetStatus(void); +extern u32 osAiGetLength(void); +extern s32 osAiSetFrequency(u32); +extern s32 osAiSetNextBuffer(void*, u32); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_AI_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_cache.h b/lib/hackerlibultra/include/PR/os_cache.h new file mode 100644 index 00000000..c4849b37 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_cache.h @@ -0,0 +1,91 @@ + +/*==================================================================== + * os_cache.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_cache.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:04 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CACHE_H_ +#define _OS_CACHE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define OS_DCACHE_ROUNDUP_ADDR(x) (void*)(((((u32)(x) + 0xf) / 0x10) * 0x10)) +#define OS_DCACHE_ROUNDUP_SIZE(x) (u32)(((((u32)(x) + 0xf) / 0x10) * 0x10)) + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Cache operations and macros */ + +extern void osInvalDCache(void*, s32); +extern void osInvalICache(void*, s32); +extern void osWritebackDCache(void*, s32); +extern void osWritebackDCacheAll(void); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CACHE_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_cont.h b/lib/hackerlibultra/include/PR/os_cont.h new file mode 100644 index 00000000..942a8fa2 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_cont.h @@ -0,0 +1,202 @@ + +/*==================================================================== + * os_cont.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_cont.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:05 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CONT_H_ +#define _OS_CONT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for controllers + */ + +typedef struct { + u16 type; /* Controller Type */ + u8 status; /* Controller status */ + u8 errno; +} OSContStatus; + +typedef struct { + u16 button; + s8 stick_x; /* -80 <= stick_x <= 80 */ + s8 stick_y; /* -80 <= stick_y <= 80 */ + u8 errno; +} OSContPad; + +typedef struct { + void* address; /* Ram pad Address: 11 bits */ + u8 databuffer[32]; /* address of the data buffer */ + u8 addressCrc; /* CRC code for address */ + u8 dataCrc; /* CRC code for data */ + u8 errno; +} OSContRamIo; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Controllers number + */ + +#ifndef _HW_VERSION_1 +#define MAXCONTROLLERS 4 +#else +#define MAXCONTROLLERS 6 +#endif + +/* controller errors */ +#define CONT_NO_RESPONSE_ERROR 0x8 +#define CONT_OVERRUN_ERROR 0x4 +#define CONT_RANGE_ERROR -1 +#ifdef _HW_VERSION_1 +#define CONT_FRAME_ERROR 0x2 +#define CONT_COLLISION_ERROR 0x1 +#endif + +/* Controller type */ + +#define CONT_ABSOLUTE 0x0001 +#define CONT_RELATIVE 0x0002 +#define CONT_JOYPORT 0x0004 +#define CONT_EEPROM 0x8000 +#define CONT_EEP16K 0x4000 +#define CONT_TYPE_MASK 0x1f07 +#define CONT_TYPE_NORMAL 0x0005 +#define CONT_TYPE_MOUSE 0x0002 +#define CONT_TYPE_VOICE 0x0100 + +/* Controller status */ + +#define CONT_CARD_ON 0x01 +#define CONT_CARD_PULL 0x02 +#define CONT_ADDR_CRC_ER 0x04 +#define CONT_EEPROM_BUSY 0x80 + +/* Buttons */ + +#define CONT_A 0x8000 +#define CONT_B 0x4000 +#define CONT_G 0x2000 +#define CONT_START 0x1000 +#define CONT_UP 0x0800 +#define CONT_DOWN 0x0400 +#define CONT_LEFT 0x0200 +#define CONT_RIGHT 0x0100 +#define CONT_L 0x0020 +#define CONT_R 0x0010 +#define CONT_E 0x0008 +#define CONT_D 0x0004 +#define CONT_C 0x0002 +#define CONT_F 0x0001 + +/* Nintendo's official button names */ + +#define A_BUTTON CONT_A +#define B_BUTTON CONT_B +#define L_TRIG CONT_L +#define R_TRIG CONT_R +#define Z_TRIG CONT_G +#define START_BUTTON CONT_START +#define U_JPAD CONT_UP +#define L_JPAD CONT_LEFT +#define R_JPAD CONT_RIGHT +#define D_JPAD CONT_DOWN +#define U_CBUTTONS CONT_E +#define L_CBUTTONS CONT_C +#define R_CBUTTONS CONT_F +#define D_CBUTTONS CONT_D + +/* Controller error number */ + +#define CONT_ERR_NO_CONTROLLER PFS_ERR_NOPACK /* 1 */ +#define CONT_ERR_CONTRFAIL CONT_OVERRUN_ERROR /* 4 */ +#define CONT_ERR_INVALID PFS_ERR_INVALID /* 5 */ +#define CONT_ERR_DEVICE PFS_ERR_DEVICE /* 11 */ +#define CONT_ERR_NOT_READY 12 +#define CONT_ERR_VOICE_MEMORY 13 +#define CONT_ERR_VOICE_WORD 14 +#define CONT_ERR_VOICE_NO_RESPONSE 15 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Controller interface */ + +extern s32 osContInit(OSMesgQueue*, u8*, OSContStatus*); +extern s32 osContReset(OSMesgQueue*, OSContStatus*); +extern s32 osContStartQuery(OSMesgQueue*); +extern s32 osContStartReadData(OSMesgQueue*); +#ifndef _HW_VERSION_1 +extern s32 osContSetCh(u8); +#endif +extern void osContGetQuery(OSContStatus*); +extern void osContGetReadData(OSContPad*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CONT_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_convert.h b/lib/hackerlibultra/include/PR/os_convert.h new file mode 100644 index 00000000..93766a79 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_convert.h @@ -0,0 +1,106 @@ + +/*==================================================================== + * os_convert.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_convert.h,v $ + $Revision: 1.2 $ + $Date: 1999/04/21 02:53:11 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_CONVERT_H_ +#define _OS_CONVERT_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#define OS_CLOCK_RATE 62500000LL +#define OS_CPU_COUNTER (OS_CLOCK_RATE * 3 / 4) + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +#define OS_NSEC_TO_CYCLES(n) (((u64)(n) * (OS_CPU_COUNTER / 15625000LL)) / (1000000000LL / 15625000LL)) +#define OS_USEC_TO_CYCLES(n) (((u64)(n) * (OS_CPU_COUNTER / 15625LL)) / (1000000LL / 15625LL)) +#define OS_CYCLES_TO_NSEC(c) (((u64)(c) * (1000000000LL / 15625000LL)) / (OS_CPU_COUNTER / 15625000LL)) +#define OS_CYCLES_TO_USEC(c) (((u64)(c) * (1000000LL / 15625LL)) / (OS_CPU_COUNTER / 15625LL)) + +/* OS_K?_TO_PHYSICAL macro bug fix for CodeWarrior */ +#ifndef __MWERKS__ +#define OS_K0_TO_PHYSICAL(x) (u32)(((char*)(x) - 0x80000000)) +#define OS_K1_TO_PHYSICAL(x) (u32)(((char*)(x) - 0xa0000000)) +#else +#define OS_K0_TO_PHYSICAL(x) ((char*)(x) - 0x80000000) +#define OS_K1_TO_PHYSICAL(x) ((char*)(x) - 0xa0000000) +#endif + +#define OS_PHYSICAL_TO_K0(x) (void*)(((u32)(x) + 0x80000000)) +#define OS_PHYSICAL_TO_K1(x) (void*)(((u32)(x) + 0xa0000000)) + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Address translation routines and macros */ + +extern u32 osVirtualToPhysical(void*); +extern void* osPhysicalToVirtual(u32); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_CONVERT_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_debug.h b/lib/hackerlibultra/include/PR/os_debug.h new file mode 100644 index 00000000..6e0a214d --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_debug.h @@ -0,0 +1,113 @@ + +/*==================================================================== + * os_debug.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_debug.h,v $ + $Revision: 1.4 $ + $Date: 1999/06/30 03:04:08 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_DEBUG_H_ +#define _OS_DEBUG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for Profiler + */ +typedef struct { + u16* histo_base; /* histogram base */ + u32 histo_size; /* histogram size */ + u32* text_start; /* start of text segment */ + u32* text_end; /* end of text segment */ +} OSProf; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Profiler constants + */ +#define PROF_MIN_INTERVAL 50 /* microseconds */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Profiler Interface */ + +extern void osProfileInit(OSProf*, u32 profcnt); +extern void osProfileStart(u32); +extern void osProfileFlush(void); +extern void osProfileStop(void); + +/* Thread Profiler Interface */ +extern void osThreadProfileClear(OSId); +extern void osThreadProfileInit(void); +extern void osThreadProfileStart(void); +extern void osThreadProfileStop(void); +extern u32 osThreadProfileReadCount(OSId); +extern u32 osThreadProfileReadCountTh(OSThread*); +extern OSTime osThreadProfileReadTime(OSId); +extern OSTime osThreadProfileReadTimeTh(OSThread*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_DEBUG_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_eeprom.h b/lib/hackerlibultra/include/PR/os_eeprom.h new file mode 100644 index 00000000..4a11ba0b --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_eeprom.h @@ -0,0 +1,101 @@ + +/*==================================================================== + * os_eeprom.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_eeprom.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:06 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_EEPROM_H_ +#define _OS_EEPROM_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* EEPROM TYPE */ + +#define EEPROM_TYPE_4K 0x01 +#define EEPROM_TYPE_16K 0x02 + +/* definition for EEPROM */ + +#define EEPROM_MAXBLOCKS 64 +#define EEP16K_MAXBLOCKS 256 +#define EEPROM_BLOCK_SIZE 8 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* EEPROM interface */ + +extern s32 osEepromProbe(OSMesgQueue*); +extern s32 osEepromRead(OSMesgQueue*, u8, u8*); +extern s32 osEepromWrite(OSMesgQueue*, u8, u8*); +extern s32 osEepromLongRead(OSMesgQueue*, u8, u8*, int); +extern s32 osEepromLongWrite(OSMesgQueue*, u8, u8*, int); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_EEPROM_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_error.h b/lib/hackerlibultra/include/PR/os_error.h new file mode 100644 index 00000000..d2837fc9 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_error.h @@ -0,0 +1,81 @@ + +/*==================================================================== + * os_error.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_error.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:06 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_ERROR_H_ +#define _OS_ERROR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_ERROR_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_exception.h b/lib/hackerlibultra/include/PR/os_exception.h new file mode 100644 index 00000000..39ee64f4 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_exception.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * os_exception.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_exception.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:07 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_EXCEPTION_H_ +#define _OS_EXCEPTION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef u32 OSIntMask; +typedef u32 OSHWIntr; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/* Flags for debugging purpose */ + +#define OS_FLAG_CPU_BREAK 1 /* Break exception has occurred */ +#define OS_FLAG_FAULT 2 /* CPU fault has occurred */ + +/* Interrupt masks */ + +#define OS_IM_NONE 0x00000001 +#define OS_IM_RCP 0x00000401 +#define OS_IM_SW1 0x00000501 +#define OS_IM_SW2 0x00000601 +#define OS_IM_CART 0x00000c01 +#define OS_IM_PRENMI 0x00001401 +#define OS_IM_RDBWRITE 0x00002401 +#define OS_IM_RDBREAD 0x00004401 +#define OS_IM_COUNTER 0x00008401 +#define OS_IM_CPU 0x0000ff01 +#define OS_IM_SP 0x00010401 +#define OS_IM_SI 0x00020401 +#define OS_IM_AI 0x00040401 +#define OS_IM_VI 0x00080401 +#define OS_IM_PI 0x00100401 +#define OS_IM_DP 0x00200401 +#define OS_IM_ALL 0x003fff01 +#define RCP_IMASK 0x003f0000 +#define RCP_IMASKSHIFT 16 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Interrupt operations */ + +extern OSIntMask osGetIntMask(void); +extern OSIntMask osSetIntMask(OSIntMask); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_EXCEPTION_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_flash.h b/lib/hackerlibultra/include/PR/os_flash.h new file mode 100644 index 00000000..bb66ce55 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_flash.h @@ -0,0 +1,74 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_flash.h,v $ + $Revision: 1.1 $ + $Date: 2000/06/15 06:24:55 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_FLASH_H_ +#define _OS_FLASH_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" +#include "os_pi.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* + * defines for FLASH + */ +#define FLASH_START_ADDR 0x08000000 + +#define FLASH_SIZE 0x20000 + +#define FLASH_LATENCY 0x5 +#define FLASH_PULSE 0x0c +#define FLASH_PAGE_SIZE 0xf +#define FLASH_REL_DURATION 0x2 +#define DEVICE_TYPE_FLASH 8 + +#define FLASH_VERSION_MX_PROTO_A 0x00c20000 +#define FLASH_VERSION_MX_A 0x00c20001 +#define FLASH_VERSION_MX_C 0x00c2001e +#define FLASH_VERSION_MX_B_AND_D 0x00c2001d +#define FLASH_VERSION_MEI 0x003200f1 + +/* OLD_FLASH is MX_PROTO_A, MX_A and MX_C */ +#define OLD_FLASH 0 +/* NEW_FLASH is MX_B_AND_D and MATSUSHITA flash */ +#define NEW_FLASH 1 + +#define FLASH_STATUS_ERASE_BUSY 2 +#define FLASH_STATUS_ERASE_OK 0 +#define FLASH_STATUS_ERASE_ERROR -1 + +#define FLASH_STATUS_WRITE_BUSY 1 +#define FLASH_STATUS_WRITE_OK 0 +#define FLASH_STATUS_WRITE_ERROR -1 + +extern OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 page_size, u8 rel_duration, u32 start); +extern OSPiHandle* osFlashInit(void); +extern void osFlashReadStatus(u8* flash_status); +extern void osFlashReadId(u32* flash_type, u32* flash_maker); +extern void osFlashClearStatus(void); +extern s32 osFlashAllErase(void); +extern s32 osFlashSectorErase(u32 page_num); +extern s32 osFlashWriteBuffer(OSIoMesg* mb, s32 priority, void* dramAddr, OSMesgQueue* mq); +extern s32 osFlashWriteArray(u32 page_num); +extern s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 page_num, void* dramAddr, u32 n_pages, OSMesgQueue* mq); +extern void osFlashChange(u32 flash_num); +extern void osFlashAllEraseThrough(void); +extern void osFlashSectorEraseThrough(u32 page_num); +extern s32 osFlashCheckEraseEnd(void); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_FLASH_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_gbpak.h b/lib/hackerlibultra/include/PR/os_gbpak.h new file mode 100644 index 00000000..8bc9aa58 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_gbpak.h @@ -0,0 +1,101 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_gbpak.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:07 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_GBPAK_H_ +#define _OS_GBPAK_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" +#include "os_pfs.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { + u16 fixed1; + u16 start_address; + u8 nintendo_chr[0x30]; + u8 game_title[16]; + u16 company_code; + u8 body_code; + u8 cart_type; + u8 rom_size; + u8 ram_size; + u8 country_code; + u8 fixed2; + u8 version; + u8 isum; + u16 sum; +} OSGbpakId; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* definition for 64GB-PAK */ + +#define OS_GBPAK_POWER 0x01 +#define OS_GBPAK_RSTB_DETECTION 0x04 +#define OS_GBPAK_RSTB_STATUS 0x08 +#define OS_GBPAK_GBCART_PULL 0x40 +#define OS_GBPAK_GBCART_ON 0x80 + +#define OS_GBPAK_POWER_OFF 0x00 /* power of 64GB-PAK */ +#define OS_GBPAK_POWER_ON 0x01 + +#define OS_GBPAK_ROM_ID_SIZE 0x50 /* ID size of GB cartridge */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* 64GB-PAK */ +extern s32 osGbpakInit(OSMesgQueue*, OSPfs*, int); +extern s32 osGbpakPower(OSPfs*, s32); +extern s32 osGbpakGetStatus(OSPfs*, u8*); +extern s32 osGbpakReadWrite(OSPfs*, u16, u16, u8*, u16); +extern s32 osGbpakReadId(OSPfs*, OSGbpakId*, u8*); +extern s32 osGbpakCheckConnector(OSPfs*, u8*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_GBPAK_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_gio.h b/lib/hackerlibultra/include/PR/os_gio.h new file mode 100644 index 00000000..9d45bc9c --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_gio.h @@ -0,0 +1,81 @@ + +/*==================================================================== + * os_gio.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_gio.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:08 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_GIO_H_ +#define _OS_GIO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_GIO_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_host.h b/lib/hackerlibultra/include/PR/os_host.h new file mode 100644 index 00000000..d41be228 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_host.h @@ -0,0 +1,162 @@ + +/*==================================================================== + * os_host.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_host.h,v $ + $Revision: 1.3 $ + $Date: 1999/06/24 09:23:06 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_HOST_H_ +#define _OS_HOST_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +extern void __osInitialize_common(void); + +#if defined(_FINALROM) + +#define osInitialize() __osInitialize_common() + +#else + +/* PARTNER-N64 */ +#if defined(PTN64) +extern void __osInitialize_kmc(void); +#define osReadHost osReadHost_pt +#define osWriteHost osWriteHost_pt +#define osInitialize() \ + { \ + __osInitialize_common(); \ + __osInitialize_kmc(); \ + } + +/* MONEGI SMART PACK A */ +#elif defined(MWN64) +extern void __osInitialize_msp(void); +#define osReadHost osReadHost_pt +#define osWriteHost osWriteHost_pt +#define osInitialize() \ + { \ + __osInitialize_common(); \ + __osInitialize_msp(); \ + } + +/* IS-Viewer(for Debugger) */ +#elif defined(ISV64) +extern void __osInitialize_isv(void); +#define osInitialize() \ + { \ + __osInitialize_common(); \ + __osInitialize_isv(); \ + } + +/* Emulation board for INDY */ +#elif defined(EMU64) +extern void __osInitialize_emu(void); +#define osInitialize() \ + { \ + __osInitialize_common(); \ + __osInitialize_emu(); \ + } + +#else +/* Default (auto detect) */ +extern void __osInitialize_autodetect(void); +extern void __osInitialize_msp(void); +extern void __osInitialize_kmc(void); +extern void __osInitialize_isv(void); +extern void __osInitialize_emu(void); +#define osInitialize() \ + { \ + __osInitialize_common(); \ + __osInitialize_autodetect(); \ + } +#endif + +#endif /* _FINAL_ROM */ + +#if BUILD_VERSION < VERSION_K +#undef osInitialize +#endif + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Game <> Host data transfer functions */ + +extern s32 osTestHost(void); +extern void osReadHost(void*, u32); +extern void osWriteHost(void*, u32); +extern void osAckRamromRead(void); +extern void osAckRamromWrite(void); + +/* RDB port operations */ + +extern void osInitRdb(u8* sendBuf, u32 sendSize); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_HOST_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_internal.h b/lib/hackerlibultra/include/PR/os_internal.h new file mode 100644 index 00000000..6a2c731d --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal.h @@ -0,0 +1,49 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal.h,v $ + $Revision: 1.20 $ + $Date: 1998/10/09 08:01:09 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_H_ +#define _OS_INTERNAL_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +#include "os_internal_reg.h" +#include "os_internal_exception.h" +#include "os_internal_tlb.h" +#include "os_internal_si.h" +#include "os_internal_rsp.h" +#include "os_internal_error.h" +#include "os_internal_gio.h" +#include "os_internal_thread.h" +#include "os_internal_debug.h" +#include "os_internal_host.h" + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_debug.h b/lib/hackerlibultra/include/PR/os_internal_debug.h new file mode 100644 index 00000000..22621178 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_debug.h @@ -0,0 +1,42 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_debug.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:09 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_DEBUG_H_ +#define _OS_INTERNAL_DEBUG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Debug port */ +extern void __osSyncPutChars(int, int, const char*); +extern int __osAtomicDec(unsigned int* p); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_DEBUG_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_error.h b/lib/hackerlibultra/include/PR/os_internal_error.h new file mode 100644 index 00000000..d6ebed7d --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_error.h @@ -0,0 +1,44 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_error.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:10 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_ERROR_H_ +#define _OS_INTERNAL_ERROR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Error handling */ + +extern void __osError(s16, s16, ...); +extern OSThread* __osGetCurrFaultedThread(void); +extern OSThread* __osGetNextFaultedThread(OSThread*); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_ERROR_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_exception.h b/lib/hackerlibultra/include/PR/os_internal_exception.h new file mode 100644 index 00000000..fc3a6f6c --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_exception.h @@ -0,0 +1,52 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_exception.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:10 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_EXCEPTION_H_ +#define _OS_INTERNAL_EXCEPTION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "os.h" +#include "os_version.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routine for HW interrupt "handler" */ +#if BUILD_VERSION >= VERSION_J +extern void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void* stackEnd); +extern void __osGetHWIntrRoutine(OSHWIntr interrupt, s32 (**handler)(void), void** stackEnd); +#else +extern void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void)); +extern void __osGetHWIntrRoutine(OSHWIntr interrupt, s32 (**handler)(void)); +#endif + +/* Routine for global interrupt mask */ +extern void __osSetGlobalIntMask(OSHWIntr); +extern void __osResetGlobalIntMask(OSHWIntr); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_EXCEPTION_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_flash.h b/lib/hackerlibultra/include/PR/os_internal_flash.h new file mode 100644 index 00000000..2ebd25a0 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_flash.h @@ -0,0 +1,40 @@ +#ifndef _OS_INTERNAL_FLASH_H_ +#define _OS_INTERNAL_FLASH_H_ + +#include "os_message.h" +#include "os_flash.h" + +#define FLASH_BLOCK_SIZE 128 + +/** + * Flash commands + */ +#define FLASH_CMD_REG 0x10000 + +/* set whole chip erase mode */ +#define FLASH_CMD_CHIP_ERASE 0x3C000000 +/* set sector erase mode */ +#define FLASH_CMD_SECTOR_ERASE 0x4B000000 +/* do erasure */ +#define FLASH_CMD_EXECUTE_ERASE 0x78000000 +/* program selected page */ +#define FLASH_CMD_PROGRAM_PAGE 0xA5000000 +/* set page program mode */ +#define FLASH_CMD_PAGE_PROGRAM 0xB4000000 +/* set status mode */ +#define FLASH_CMD_STATUS 0xD2000000 +/* set silicon id mode */ +#define FLASH_CMD_ID 0xE1000000 +/* set read mode */ +#define FLASH_CMD_READ_ARRAY 0xF0000000 + +extern OSIoMesg __osFlashMsg; +extern OSMesgQueue __osFlashMessageQ; +extern OSPiHandle __osFlashHandler; +extern OSMesg __osFlashMsgBuf[1]; +extern s32 __osFlashVersion; +extern u32 __osFlashID[4]; + +u32 __osFlashGetAddr(u32 page_num); + +#endif diff --git a/lib/hackerlibultra/include/PR/os_internal_gio.h b/lib/hackerlibultra/include/PR/os_internal_gio.h new file mode 100644 index 00000000..3a6d8d84 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_gio.h @@ -0,0 +1,44 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_gio.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:11 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_GIO_H_ +#define _OS_INTERNAL_GIO_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Development board functions */ + +extern void __osGIOInit(s32); +extern void __osGIOInterrupt(s32); +extern void __osGIORawInterrupt(s32); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_GIO_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_host.h b/lib/hackerlibultra/include/PR/os_internal_host.h new file mode 100644 index 00000000..6cc25483 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_host.h @@ -0,0 +1,41 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_host.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:11 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_HOST_H_ +#define _OS_INTERNAL_HOST_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* routine for rdb port */ +extern u32 __osRdbSend(u8* buf, u32 size, u32 type); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_HOST_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_reg.h b/lib/hackerlibultra/include/PR/os_internal_reg.h new file mode 100644 index 00000000..cdd3b995 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_reg.h @@ -0,0 +1,57 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_reg.h,v $ + $Revision: 1.2 $ + $Date: 1999/03/10 12:19:14 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_REG_H_ +#define _OS_INTERNAL_REG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "os.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routines to get/fetch coprocessor 0 registers */ +extern u32 __osGetCause(void); +extern void __osSetCause(u32); +extern u32 __osGetCompare(void); +extern void __osSetCompare(u32); +extern u32 __osGetConfig(void); +extern void __osSetConfig(u32); +extern void __osSetCount(u32); +extern u32 __osGetSR(void); +extern void __osSetSR(u32); +extern u32 __osDisableInt(void); +extern void __osRestoreInt(u32); +extern u32 __osGetWatchLo(void); +extern void __osSetWatchLo(u32); + +/* Routines to get/set floating-point control and status register */ +extern u32 __osSetFpcCsr(u32); +extern u32 __osGetFpcCsr(void); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_REG_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_rsp.h b/lib/hackerlibultra/include/PR/os_internal_rsp.h new file mode 100644 index 00000000..0b36224e --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_rsp.h @@ -0,0 +1,47 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_rsp.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:12 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_RSP_H_ +#define _OS_INTERNAL_RSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Signal processor interface (Sp) */ + +extern u32 __osSpGetStatus(void); +extern void __osSpSetStatus(u32); +extern s32 __osSpSetPc(u32); +extern s32 __osSpRawWriteIo(u32, u32); +extern s32 __osSpRawReadIo(u32, u32*); +extern s32 __osSpRawStartDma(s32, u32, void*, u32); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_RSP_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_si.h b/lib/hackerlibultra/include/PR/os_internal_si.h new file mode 100644 index 00000000..207c4400 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_si.h @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_si.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:13 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_SI_H_ +#define _OS_INTERNAL_SI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Serial interface (Si) */ + +extern u32 __osSiGetStatus(void); +extern s32 __osSiRawWriteIo(u32, u32); +extern s32 __osSiRawReadIo(u32, u32*); +extern s32 __osSiRawStartDma(s32, void*); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_SI_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_thread.h b/lib/hackerlibultra/include/PR/os_internal_thread.h new file mode 100644 index 00000000..e66720cb --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_thread.h @@ -0,0 +1,42 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_thread.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:13 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_THREAD_H_ +#define _OS_INTERNAL_THREAD_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* For debugger use */ + +extern OSThread* __osGetActiveQueue(void); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_THREAD_H */ diff --git a/lib/hackerlibultra/include/PR/os_internal_tlb.h b/lib/hackerlibultra/include/PR/os_internal_tlb.h new file mode 100644 index 00000000..8682cb90 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_internal_tlb.h @@ -0,0 +1,46 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_internal_tlb.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:14 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_INTERNAL_TLB_H_ +#define _OS_INTERNAL_TLB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Routines for fetch TLB info */ + +extern u32 __osGetTLBASID(void); +extern u32 __osGetTLBPageMask(s32); +extern u32 __osGetTLBHi(s32); +extern u32 __osGetTLBLo0(s32); +extern u32 __osGetTLBLo1(s32); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_INTERNAL_TLB_H */ diff --git a/lib/hackerlibultra/include/PR/os_libc.h b/lib/hackerlibultra/include/PR/os_libc.h new file mode 100644 index 00000000..ec0e89b0 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_libc.h @@ -0,0 +1,100 @@ + +/*==================================================================== + * os_libc.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_libc.h,v $ + $Revision: 1.3 $ + $Date: 1999/07/13 01:43:47 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_LIBC_H_ +#define _OS_LIBC_H_ + +#include "os_pfs.h" + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* byte string operations */ + +#ifndef MODERN_CC +extern void bcopy(const void*, void*, int); +extern int bcmp(const void*, const void*, int); +extern void bzero(void*, int); +#else +extern void bcopy(const void*, void*, size_t); +extern int bcmp(const void*, const void*, size_t); +extern void bzero(void*, size_t); +#endif + +/* Printf */ + +extern int sprintf(char* s, const char* fmt, ...); +extern void osSyncPrintf(const char* fmt, ...); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_LIBC_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_message.h b/lib/hackerlibultra/include/PR/os_message.h new file mode 100644 index 00000000..c585eade --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_message.h @@ -0,0 +1,157 @@ + +/*==================================================================== + * os_message.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_message.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:15 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_MESSAGE_H_ +#define _OS_MESSAGE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" +#include "os_thread.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSEvent; + +/* + * Structure for message + */ +typedef void* OSMesg; + +/* + * Structure for message queue + */ +typedef struct OSMesgQueue_s { + OSThread* mtqueue; /* Queue to store threads blocked on empty mailboxes (receive) */ + OSThread* fullqueue; /* Queue to store threads blocked on full mailboxes (send) */ + s32 validCount; /* Contains number of valid message */ + s32 first; /* Points to first valid message */ + s32 msgCount; /* Contains total # of messages */ + OSMesg* msg; /* Points to message buffer array */ +} OSMesgQueue; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Events */ +#ifdef _FINALROM +#define OS_NUM_EVENTS 15 +#else +#define OS_NUM_EVENTS 23 +#endif + +#define OS_EVENT_SW1 0 /* CPU SW1 interrupt */ +#define OS_EVENT_SW2 1 /* CPU SW2 interrupt */ +#define OS_EVENT_CART 2 /* Cartridge interrupt: used by rmon */ +#define OS_EVENT_COUNTER 3 /* Counter int: used by VI/Timer Mgr */ +#define OS_EVENT_SP 4 /* SP task done interrupt */ +#define OS_EVENT_SI 5 /* SI (controller) interrupt */ +#define OS_EVENT_AI 6 /* AI interrupt */ +#define OS_EVENT_VI 7 /* VI interrupt: used by VI/Timer Mgr */ +#define OS_EVENT_PI 8 /* PI interrupt: used by PI Manager */ +#define OS_EVENT_DP 9 /* DP full sync interrupt */ +#define OS_EVENT_CPU_BREAK 10 /* CPU breakpoint: used by rmon */ +#define OS_EVENT_SP_BREAK 11 /* SP breakpoint: used by rmon */ +#define OS_EVENT_FAULT 12 /* CPU fault event: used by rmon */ +#define OS_EVENT_THREADSTATUS 13 /* CPU thread status: used by rmon */ +#define OS_EVENT_PRENMI 14 /* Pre NMI interrupt */ +#ifndef _FINALROM +#define OS_EVENT_RDB_READ_DONE 15 /* RDB read ok event: used by rmon */ +#define OS_EVENT_RDB_LOG_DONE 16 /* read of log data complete */ +#define OS_EVENT_RDB_DATA_DONE 17 /* read of hostio data complete */ +#define OS_EVENT_RDB_REQ_RAMROM 18 /* host needs ramrom access */ +#define OS_EVENT_RDB_FREE_RAMROM 19 /* host is done with ramrom access */ +#define OS_EVENT_RDB_DBG_DONE 20 +#define OS_EVENT_RDB_FLUSH_PROF 21 +#define OS_EVENT_RDB_ACK_PROF 22 +#endif + +/* Flags to turn blocking on/off when sending/receiving message */ + +#define OS_MESG_NOBLOCK 0 +#define OS_MESG_BLOCK 1 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* Get count of valid messages in queue */ +#define MQ_GET_COUNT(mq) ((mq)->validCount) + +/* Figure out if message queue is empty or full */ +#define MQ_IS_EMPTY(mq) (MQ_GET_COUNT(mq) == 0) +#define MQ_IS_FULL(mq) (MQ_GET_COUNT(mq) >= (mq)->msgCount) + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Message operations */ + +extern void osCreateMesgQueue(OSMesgQueue*, OSMesg*, s32); +extern s32 osSendMesg(OSMesgQueue*, OSMesg, s32); +extern s32 osJamMesg(OSMesgQueue*, OSMesg, s32); +extern s32 osRecvMesg(OSMesgQueue*, OSMesg*, s32); + +/* Event operations */ + +extern void osSetEventMesg(OSEvent, OSMesgQueue*, OSMesg); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_MESSAGE_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_motor.h b/lib/hackerlibultra/include/PR/os_motor.h new file mode 100644 index 00000000..1c1c0097 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_motor.h @@ -0,0 +1,78 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_motor.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:15 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_MOTOR_H_ +#define _OS_MOTOR_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" +#include "os_pfs.h" +#include "os_version.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Rumble PAK interface */ + +extern s32 osMotorInit(OSMesgQueue*, OSPfs*, int); +#if BUILD_VERSION >= VERSION_J +#define MOTOR_START 1 +#define MOTOR_STOP 0 +#define osMotorStart(x) __osMotorAccess((x), MOTOR_START) +#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP) +extern s32 __osMotorAccess(OSPfs*, s32); +#else +extern s32 osMotorStop(OSPfs*); +extern s32 osMotorStart(OSPfs*); +#endif + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_MOTOR_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_pfs.h b/lib/hackerlibultra/include/PR/os_pfs.h new file mode 100644 index 00000000..40c085d1 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_pfs.h @@ -0,0 +1,193 @@ + +/*==================================================================== + * os_pfs.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_pfs.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:16 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_PFS_H_ +#define _OS_PFS_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for file system + */ +typedef struct { + int status; + OSMesgQueue* queue; + int channel; + u8 id[32]; + u8 label[32]; + int version; + int dir_size; + int inode_table; /* block location */ + int minode_table; /* mirrioring inode_table */ + int dir_table; /* block location */ + int inode_start_page; /* page # */ + u8 banks; + u8 activebank; +} OSPfs; + +typedef struct { + u32 file_size; /* bytes */ + u32 game_code; + u16 company_code; + char ext_name[4]; + char game_name[16]; +} OSPfsState; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* File System size */ +#define OS_PFS_VERSION 0x0200 +#define OS_PFS_VERSION_HI (OS_PFS_VERSION >> 8) +#define OS_PFS_VERSION_LO (OS_PFS_VERSION & 255) + +#define PFS_INODE_SIZE_PER_PAGE 128 +#define PFS_FILE_NAME_LEN 16 +#define PFS_FILE_EXT_LEN 4 +#define BLOCKSIZE 32 /* bytes */ +#define PFS_ONE_PAGE 8 /* blocks */ +#define PFS_MAX_BANKS 62 + +/* File System flag */ + +#define PFS_READ 0 +#define PFS_WRITE 1 +#define PFS_CREATE 2 + +/* File System status */ +#define PFS_INITIALIZED 0x1 +#define PFS_CORRUPTED 0x2 +#define PFS_ID_BROKEN 0x4 +#define PFS_MOTOR_INITIALIZED 0x8 +#define PFS_GBPAK_INITIALIZED 0x10 + +/* Definition for page usage */ +#define PFS_EOF 1 +#define PFS_PAGE_NOT_EXIST 2 +#define PFS_PAGE_NOT_USED 3 + +/* File System error number */ + +#define PFS_ERR_NOPACK 1 /* no memory card is plugged or */ +#define PFS_ERR_NEW_PACK 2 /* ram pack has been changed to a different one */ +#define PFS_ERR_INCONSISTENT 3 /* need to run Pfschecker*/ +#define PFS_ERR_CONTRFAIL CONT_OVERRUN_ERROR +#define PFS_ERR_INVALID 5 /* invalid parameter or file not exist*/ +#define PFS_ERR_BAD_DATA 6 /* the data read from pack are bad*/ +#define PFS_DATA_FULL 7 /* no free pages on ram pack*/ +#define PFS_DIR_FULL 8 /* no free directories on ram pack*/ +#define PFS_ERR_EXIST 9 /* file exists*/ +#define PFS_ERR_ID_FATAL 10 /* dead ram pack */ +#define PFS_ERR_DEVICE 11 /* wrong device type*/ +#define PFS_ERR_NO_GBCART 12 /* no gb cartridge (64GB-PAK) */ +#define PFS_ERR_NEW_GBCART 13 /* gb cartridge may be changed */ + +/* Definition for bank */ +#define PFS_ID_BANK_256K 0 +#define PFS_ID_BANK_1M 4 +#define PFS_BANKS_256K 1 + +#define PFS_WRITTEN 2 +#define DEF_DIR_PAGES 2 + +#define PFS_ID_0AREA 1 +#define PFS_ID_1AREA 3 +#define PFS_ID_2AREA 4 +#define PFS_ID_3AREA 6 +#define PFS_LABEL_AREA 7 +#define PFS_ID_PAGE PFS_ONE_PAGE * 0 + +#define PFS_BANK_LAPPED_BY 8 /* => u8 */ +#define PFS_SECTOR_PER_BANK 32 +#define PFS_INODE_DIST_MAP (PFS_BANK_LAPPED_BY * PFS_SECTOR_PER_BANK) +#define PFS_SECTOR_SIZE (PFS_INODE_SIZE_PER_PAGE / PFS_SECTOR_PER_BANK) + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* file system interface */ + +extern s32 osPfsInitPak(OSMesgQueue*, OSPfs*, int); +extern s32 osPfsRepairId(OSPfs*); +extern s32 osPfsInit(OSMesgQueue*, OSPfs*, int); +extern s32 osPfsReFormat(OSPfs*, OSMesgQueue*, int); +extern s32 osPfsChecker(OSPfs*); +extern s32 osPfsAllocateFile(OSPfs*, u16, u32, u8*, u8*, int, s32*); +extern s32 osPfsFindFile(OSPfs*, u16, u32, u8*, u8*, s32*); +extern s32 osPfsDeleteFile(OSPfs*, u16, u32, u8*, u8*); +extern s32 osPfsReadWriteFile(OSPfs*, s32, u8, int, int, u8*); +extern s32 osPfsFileState(OSPfs*, s32, OSPfsState*); +extern s32 osPfsGetLabel(OSPfs*, u8*, int*); +extern s32 osPfsSetLabel(OSPfs*, u8*); +extern s32 osPfsIsPlug(OSMesgQueue*, u8*); +extern s32 osPfsFreeBlocks(OSPfs*, s32*); +extern s32 osPfsNumFiles(OSPfs*, s32*, s32*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_PFS_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_pi.h b/lib/hackerlibultra/include/PR/os_pi.h new file mode 100644 index 00000000..784eab26 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_pi.h @@ -0,0 +1,214 @@ + +/*==================================================================== + * os_pi.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_pi.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:16 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_PI_H_ +#define _OS_PI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" +#include "os_thread.h" +#include "os_message.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for Enhanced PI interface + */ + +/* + * OSTranxInfo is set up for Leo Disk DMA. This info will be maintained + * by exception handler. This is how the PIMGR and the ISR communicate. + */ + +typedef struct { + u32 errStatus; /* error status */ + void* dramAddr; /* RDRAM buffer address (DMA) */ + void* C2Addr; /* C2 buffer address */ + u32 sectorSize; /* size of transfering sector */ + u32 C1ErrNum; /* total # of C1 errors */ + u32 C1ErrSector[4]; /* error sectors */ +} __OSBlockInfo; + +typedef struct { + u32 cmdType; /* for disk only */ + u16 transferMode; /* Block, Track, or sector? */ + u16 blockNum; /* which block is transfering */ + s32 sectorNum; /* which sector is transfering */ + u32 devAddr; /* Device buffer address */ + u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */ + u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */ + __OSBlockInfo block[2]; /* bolck transfer info */ +} __OSTranxInfo; + +typedef struct OSPiHandle_s { + struct OSPiHandle_s* next; /* point to next handle on the table */ + u8 type; /* DEVICE_TYPE_BULK for disk */ + u8 latency; /* domain latency */ + u8 pageSize; /* domain page size */ + u8 relDuration; /* domain release duration */ + u8 pulse; /* domain pulse width */ + u8 domain; /* which domain */ + u32 baseAddress; /* Domain address */ + u32 speed; /* for roms only */ + /* The following are "private" elements" */ + __OSTranxInfo transferInfo; /* for disk only */ +} OSPiHandle; + +typedef struct { + u8 type; + u32 address; +} OSPiInfo; + +/* + * Structure for I/O message block + */ +typedef struct { + u16 type; /* Message type */ + u8 pri; /* Message priority (High or Normal) */ + u8 status; /* Return status */ + OSMesgQueue* retQueue; /* Return message queue to notify I/O completion */ +} OSIoMesgHdr; + +typedef struct { + OSIoMesgHdr hdr; /* Message header */ + void* dramAddr; /* RDRAM buffer address (DMA) */ + u32 devAddr; /* Device buffer address (DMA) */ + u32 size; /* DMA transfer size in bytes */ + OSPiHandle* piHandle; /* PI device handle */ +} OSIoMesg; + +/* + * Structure for device manager block + */ +typedef struct { + s32 active; /* Status flag */ + OSThread* thread; /* Calling thread */ + OSMesgQueue* cmdQueue; /* Command queue */ + OSMesgQueue* evtQueue; /* Event queue */ + OSMesgQueue* acsQueue; /* Access queue */ + /* Raw DMA routine */ + s32 (*dma)(s32, u32, void*, u32); + s32 (*edma)(OSPiHandle*, s32, u32, void*, u32); +} OSDevMgr; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Flags to indicate direction of data transfer */ + +#define OS_READ 0 /* device -> RDRAM */ +#define OS_WRITE 1 /* device <- RDRAM */ +#define OS_OTHERS 2 /* for Leo disk only */ + +/* + * I/O message types + */ +#define OS_MESG_TYPE_BASE (10) +#define OS_MESG_TYPE_LOOPBACK (OS_MESG_TYPE_BASE + 0) +#define OS_MESG_TYPE_DMAREAD (OS_MESG_TYPE_BASE + 1) +#define OS_MESG_TYPE_DMAWRITE (OS_MESG_TYPE_BASE + 2) +#define OS_MESG_TYPE_VRETRACE (OS_MESG_TYPE_BASE + 3) +#define OS_MESG_TYPE_COUNTER (OS_MESG_TYPE_BASE + 4) +#define OS_MESG_TYPE_EDMAREAD (OS_MESG_TYPE_BASE + 5) +#define OS_MESG_TYPE_EDMAWRITE (OS_MESG_TYPE_BASE + 6) + +/* + * I/O message priority + */ +#define OS_MESG_PRI_NORMAL 0 +#define OS_MESG_PRI_HIGH 1 + +/* + * PI/EPI + */ +#define PI_DOMAIN1 0 +#define PI_DOMAIN2 1 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +extern OSPiHandle* __osPiTable; /* The head of OSPiHandle link list */ + +/************************************************************************** + * + * Function prototypes + * + */ + +extern u32 osPiGetStatus(void); +extern s32 osPiGetDeviceType(void); +extern s32 osPiWriteIo(u32, u32); +extern s32 osPiReadIo(u32, u32*); +extern s32 osPiStartDma(OSIoMesg*, s32, s32, u32, void*, u32, OSMesgQueue*); +extern void osCreatePiManager(OSPri, OSMesgQueue*, OSMesg*, s32); + +/* Enhanced PI interface */ + +extern OSPiHandle* osCartRomInit(void); +extern OSPiHandle* osLeoDiskInit(void); +extern OSPiHandle* osDriveRomInit(void); + +extern s32 osEPiDeviceType(OSPiHandle*, OSPiInfo*); +extern s32 osEPiWriteIo(OSPiHandle*, u32, u32); +extern s32 osEPiReadIo(OSPiHandle*, u32, u32*); +extern s32 osEPiStartDma(OSPiHandle*, OSIoMesg*, s32); +extern s32 osEPiLinkHandle(OSPiHandle*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_PI_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_rdp.h b/lib/hackerlibultra/include/PR/os_rdp.h new file mode 100644 index 00000000..995bd464 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_rdp.h @@ -0,0 +1,87 @@ + +/*==================================================================== + * os_rdp.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_rdp.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:16 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_RDP_H_ +#define _OS_RDP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Display processor interface (Dp) */ +extern u32 osDpGetStatus(void); +extern void osDpSetStatus(u32); +extern void osDpGetCounters(u32*); +extern s32 osDpSetNextBuffer(void*, u64); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_RDP_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_reg.h b/lib/hackerlibultra/include/PR/os_reg.h new file mode 100644 index 00000000..ad505474 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_reg.h @@ -0,0 +1,85 @@ + +/*==================================================================== + * os_reg.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_reg.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:17 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_REG_H_ +#define _OS_REG_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Miscellaneous operations */ + +extern u32 osGetCount(void); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_REG_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_rsp.h b/lib/hackerlibultra/include/PR/os_rsp.h new file mode 100644 index 00000000..6115659d --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_rsp.h @@ -0,0 +1,81 @@ + +/*==================================================================== + * os_rsp.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_rsp.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:17 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_RSP_H_ +#define _OS_RSP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_RSP_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_si.h b/lib/hackerlibultra/include/PR/os_si.h new file mode 100644 index 00000000..86cc2282 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_si.h @@ -0,0 +1,81 @@ + +/*==================================================================== + * os_si.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_si.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:18 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_SI_H_ +#define _OS_SI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_SI_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_system.h b/lib/hackerlibultra/include/PR/os_system.h new file mode 100644 index 00000000..20e6f130 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_system.h @@ -0,0 +1,113 @@ + +/*==================================================================== + * os_system.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_system.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:18 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_SYSTEM_H_ +#define _OS_SYSTEM_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Values for osTvType + */ +#define OS_TV_PAL 0 +#define OS_TV_NTSC 1 +#define OS_TV_MPAL 2 + +/* + * Size of buffer the retains contents after NMI + */ +#define OS_APP_NMI_BUFSIZE 64 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +extern s32 osRomType; /* Bulk or cartridge ROM. 0=cartridge 1=bulk */ +extern void* osRomBase; /* Rom base address of the game image */ +extern s32 osTvType; /* 0 = PAL, 1 = NTSC, 2 = MPAL */ +extern s32 osResetType; /* 0 = cold reset, 1 = NMI */ +extern s32 osCicId; +extern s32 osVersion; +extern u32 osMemSize; /* Memory Size */ +extern s32 osAppNMIBuffer[]; + +extern u64 osClockRate; + +extern OSIntMask __OSGlobalIntMask; /* global interrupt mask */ + +/************************************************************************** + * + * Function prototypes + * + */ + +extern void osInitialize(void); +extern void osExit(void); +extern u32 osGetMemSize(void); + +/* pre-NMI */ +extern s32 osAfterPreNMI(void); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_SYSTEM_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_thread.h b/lib/hackerlibultra/include/PR/os_thread.h new file mode 100644 index 00000000..a2b8564e --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_thread.h @@ -0,0 +1,157 @@ + +/*==================================================================== + * os_thread.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_thread.h,v $ + $Revision: 1.3 $ + $Date: 1999/06/15 12:39:40 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_THREAD_H_ +#define _OS_THREAD_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef s32 OSPri; +typedef s32 OSId; + +typedef union { + struct { + f32 f_odd; + f32 f_even; + } f; + f64 d; +} __OSfp; + +typedef struct { + u64 at, v0, v1, a0, a1, a2, a3; + u64 t0, t1, t2, t3, t4, t5, t6, t7; + u64 s0, s1, s2, s3, s4, s5, s6, s7; + u64 t8, t9; + u64 gp, sp, s8, ra; + u64 lo, hi; + u32 sr, pc, cause, badvaddr, rcp; + u32 fpcsr; + __OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14; + __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30; +} __OSThreadContext; + +typedef struct { + u32 flag; + u32 count; + u64 time; +} __OSThreadprofile_s; + +typedef struct OSThread_s { + struct OSThread_s* next; /* run/mesg queue link */ + OSPri priority; /* run/mesg queue priority */ + struct OSThread_s** queue; /* queue thread is on */ + struct OSThread_s* tlnext; /* all threads queue link */ + u16 state; /* OS_STATE_* */ + u16 flags; /* flags for rmon */ + OSId id; /* id for debugging */ + int fp; /* thread has used fp unit */ + __OSThreadprofile_s* thprof; /* workarea for thread profiler */ + __OSThreadContext context; /* register/interrupt mask */ +} OSThread; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* Thread states */ + +#define OS_STATE_STOPPED (1 << 0) +#define OS_STATE_RUNNABLE (1 << 1) +#define OS_STATE_RUNNING (1 << 2) +#define OS_STATE_WAITING (1 << 3) + +/* Recommended thread priorities for the system threads */ + +#define OS_PRIORITY_MAX 255 +#define OS_PRIORITY_VIMGR 254 +#define OS_PRIORITY_RMON 250 +#define OS_PRIORITY_RMONSPIN 200 +#define OS_PRIORITY_PIMGR 150 +#define OS_PRIORITY_SIMGR 140 +#define OS_PRIORITY_APPMAX 127 +#define OS_PRIORITY_IDLE 0 /* Must be 0 */ + +/* For thread profiler */ +#define THPROF_IDMAX 64 +#define THPROF_STACKSIZE 256 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Thread operations */ + +extern void osCreateThread(OSThread*, OSId, void (*)(void*), void*, void*, OSPri); +extern void osDestroyThread(OSThread*); +extern void osYieldThread(void); +extern void osStartThread(OSThread*); +extern void osStopThread(OSThread*); +extern OSId osGetThreadId(OSThread*); +extern void osSetThreadPri(OSThread*, OSPri); +extern OSPri osGetThreadPri(OSThread*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_THREAD_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_time.h b/lib/hackerlibultra/include/PR/os_time.h new file mode 100644 index 00000000..8215f2dc --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_time.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * os_time.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_time.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:19 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_TIME_H_ +#define _OS_TIME_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_message.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure for time value + */ +typedef u64 OSTime; + +/* + * Structure for interval timer + */ +typedef struct OSTimer_s { + struct OSTimer_s* next; /* point to next timer in list */ + struct OSTimer_s* prev; /* point to previous timer in list */ + OSTime interval; /* duration set by user */ + OSTime value; /* time remaining before */ + /* timer fires */ + OSMesgQueue* mq; /* Message Queue */ + OSMesg msg; /* Message to send */ +} OSTimer; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Timer interface */ + +extern OSTime osGetTime(void); +extern void osSetTime(OSTime); +extern int osSetTimer(OSTimer*, OSTime, OSTime, OSMesgQueue*, OSMesg); +extern int osStopTimer(OSTimer*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_TIME_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_tlb.h b/lib/hackerlibultra/include/PR/os_tlb.h new file mode 100644 index 00000000..c23359a1 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_tlb.h @@ -0,0 +1,102 @@ + +/*==================================================================== + * os_tlb.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_tlb.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:20 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_TLB_H_ +#define _OS_TLB_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef u32 OSPageMask; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Page size argument for TLB routines + */ +#define OS_PM_4K 0x0000000 +#define OS_PM_16K 0x0006000 +#define OS_PM_64K 0x001e000 +#define OS_PM_256K 0x007e000 +#define OS_PM_1M 0x01fe000 +#define OS_PM_4M 0x07fe000 +#define OS_PM_16M 0x1ffe000 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* TLB management routines */ + +extern void osMapTLB(s32, OSPageMask, void*, u32, u32, s32); +extern void osMapTLBRdb(void); +extern void osUnmapTLB(s32); +extern void osUnmapTLBAll(void); +extern void osSetTLBASID(s32); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_TLB_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_version.h b/lib/hackerlibultra/include/PR/os_version.h new file mode 100644 index 00000000..545a1379 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_version.h @@ -0,0 +1,26 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_version.h,v $ + $Revision: 1.2 $ + $Date: 1999/06/17 01:33:01 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VERSION_H_ +#define _OS_VERSION_H_ + +#define VERSION_D 1 +#define VERSION_E 2 +#define VERSION_F 3 +#define VERSION_G 4 +#define VERSION_H 5 +#define VERSION_I 6 +#define VERSION_J 7 +#define VERSION_K 8 +#define VERSION_L 9 + +#define OS_MAJOR_VERSION BUILD_VERSION_STRING /* major version */ +#define OS_MINOR_VERSION 0 /* patch level */ + +#endif /* !_OS_VERSION_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_vi.h b/lib/hackerlibultra/include/PR/os_vi.h new file mode 100644 index 00000000..692d84d0 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_vi.h @@ -0,0 +1,290 @@ + +/*==================================================================== + * os_vi.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. (Originated by SGI) + + $RCSfile: os_vi.h,v $ + $Revision: 1.1 $ + $Date: 1998/10/09 08:01:20 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VI_H_ +#define _OS_VI_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include "os_thread.h" +#include "os_message.h" + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Structure to store VI register values that remain the same between 2 fields + */ +typedef struct { + u32 ctrl; + u32 width; + u32 burst; + u32 vSync; + u32 hSync; + u32 leap; + u32 hStart; + u32 xScale; + u32 vCurrent; +} OSViCommonRegs; + +/* + * Structure to store VI register values that change between fields + */ +typedef struct { + u32 origin; + u32 yScale; + u32 vStart; + u32 vBurst; + u32 vIntr; +} OSViFieldRegs; + +/* + * Structure for VI mode + */ +typedef struct { + u8 type; /* Mode type */ + OSViCommonRegs comRegs; /* Common registers for both fields */ + OSViFieldRegs fldRegs[2]; /* Registers for Field 1 & 2 */ +} OSViMode; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* + * Video Interface (VI) mode type + */ +#define OS_VI_NTSC_LPN1 0 /* NTSC */ +#define OS_VI_NTSC_LPF1 1 +#define OS_VI_NTSC_LAN1 2 +#define OS_VI_NTSC_LAF1 3 +#define OS_VI_NTSC_LPN2 4 +#define OS_VI_NTSC_LPF2 5 +#define OS_VI_NTSC_LAN2 6 +#define OS_VI_NTSC_LAF2 7 +#define OS_VI_NTSC_HPN1 8 +#define OS_VI_NTSC_HPF1 9 +#define OS_VI_NTSC_HAN1 10 +#define OS_VI_NTSC_HAF1 11 +#define OS_VI_NTSC_HPN2 12 +#define OS_VI_NTSC_HPF2 13 + +#define OS_VI_PAL_LPN1 14 /* PAL */ +#define OS_VI_PAL_LPF1 15 +#define OS_VI_PAL_LAN1 16 +#define OS_VI_PAL_LAF1 17 +#define OS_VI_PAL_LPN2 18 +#define OS_VI_PAL_LPF2 19 +#define OS_VI_PAL_LAN2 20 +#define OS_VI_PAL_LAF2 21 +#define OS_VI_PAL_HPN1 22 +#define OS_VI_PAL_HPF1 23 +#define OS_VI_PAL_HAN1 24 +#define OS_VI_PAL_HAF1 25 +#define OS_VI_PAL_HPN2 26 +#define OS_VI_PAL_HPF2 27 + +#define OS_VI_MPAL_LPN1 28 /* MPAL - mainly Brazil */ +#define OS_VI_MPAL_LPF1 29 +#define OS_VI_MPAL_LAN1 30 +#define OS_VI_MPAL_LAF1 31 +#define OS_VI_MPAL_LPN2 32 +#define OS_VI_MPAL_LPF2 33 +#define OS_VI_MPAL_LAN2 34 +#define OS_VI_MPAL_LAF2 35 +#define OS_VI_MPAL_HPN1 36 +#define OS_VI_MPAL_HPF1 37 +#define OS_VI_MPAL_HAN1 38 +#define OS_VI_MPAL_HAF1 39 +#define OS_VI_MPAL_HPN2 40 +#define OS_VI_MPAL_HPF2 41 + +#define OS_VI_FPAL_LPN1 42 /* FPAL - Full screen PAL */ +#define OS_VI_FPAL_LPF1 43 +#define OS_VI_FPAL_LAN1 44 +#define OS_VI_FPAL_LAF1 45 +#define OS_VI_FPAL_LPN2 46 +#define OS_VI_FPAL_LPF2 47 +#define OS_VI_FPAL_LAN2 48 +#define OS_VI_FPAL_LAF2 49 +#define OS_VI_FPAL_HPN1 50 +#define OS_VI_FPAL_HPF1 51 +#define OS_VI_FPAL_HAN1 52 +#define OS_VI_FPAL_HAF1 53 +#define OS_VI_FPAL_HPN2 54 +#define OS_VI_FPAL_HPF2 55 + +/* + * Video Interface (VI) special features + */ +#define OS_VI_GAMMA_ON 0x0001 +#define OS_VI_GAMMA_OFF 0x0002 +#define OS_VI_GAMMA_DITHER_ON 0x0004 +#define OS_VI_GAMMA_DITHER_OFF 0x0008 +#define OS_VI_DIVOT_ON 0x0010 +#define OS_VI_DIVOT_OFF 0x0020 +#define OS_VI_DITHER_FILTER_ON 0x0040 +#define OS_VI_DITHER_FILTER_OFF 0x0080 + +/* + * Video Interface (VI) mode attribute bit + */ +#define OS_VI_BIT_NONINTERLACE 0x0001 /* lo-res */ +#define OS_VI_BIT_INTERLACE 0x0002 /* lo-res */ +#define OS_VI_BIT_NORMALINTERLACE 0x0004 /* hi-res */ +#define OS_VI_BIT_DEFLICKINTERLACE 0x0008 /* hi-res */ +#define OS_VI_BIT_ANTIALIAS 0x0010 +#define OS_VI_BIT_POINTSAMPLE 0x0020 +#define OS_VI_BIT_16PIXEL 0x0040 +#define OS_VI_BIT_32PIXEL 0x0080 +#define OS_VI_BIT_LORES 0x0100 +#define OS_VI_BIT_HIRES 0x0200 +#define OS_VI_BIT_NTSC 0x0400 +#define OS_VI_BIT_PAL 0x0800 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +extern OSViMode osViModeTable[]; /* Global VI mode table */ + +extern OSViMode osViModeNtscLpn1; /* Individual VI NTSC modes */ +extern OSViMode osViModeNtscLpf1; +extern OSViMode osViModeNtscLan1; +extern OSViMode osViModeNtscLaf1; +extern OSViMode osViModeNtscLpn2; +extern OSViMode osViModeNtscLpf2; +extern OSViMode osViModeNtscLan2; +extern OSViMode osViModeNtscLaf2; +extern OSViMode osViModeNtscHpn1; +extern OSViMode osViModeNtscHpf1; +extern OSViMode osViModeNtscHan1; +extern OSViMode osViModeNtscHaf1; +extern OSViMode osViModeNtscHpn2; +extern OSViMode osViModeNtscHpf2; + +extern OSViMode osViModePalLpn1; /* Individual VI PAL modes */ +extern OSViMode osViModePalLpf1; +extern OSViMode osViModePalLan1; +extern OSViMode osViModePalLaf1; +extern OSViMode osViModePalLpn2; +extern OSViMode osViModePalLpf2; +extern OSViMode osViModePalLan2; +extern OSViMode osViModePalLaf2; +extern OSViMode osViModePalHpn1; +extern OSViMode osViModePalHpf1; +extern OSViMode osViModePalHan1; +extern OSViMode osViModePalHaf1; +extern OSViMode osViModePalHpn2; +extern OSViMode osViModePalHpf2; + +extern OSViMode osViModeMpalLpn1; /* Individual VI MPAL modes */ +extern OSViMode osViModeMpalLpf1; +extern OSViMode osViModeMpalLan1; +extern OSViMode osViModeMpalLaf1; +extern OSViMode osViModeMpalLpn2; +extern OSViMode osViModeMpalLpf2; +extern OSViMode osViModeMpalLan2; +extern OSViMode osViModeMpalLaf2; +extern OSViMode osViModeMpalHpn1; +extern OSViMode osViModeMpalHpf1; +extern OSViMode osViModeMpalHan1; +extern OSViMode osViModeMpalHaf1; +extern OSViMode osViModeMpalHpn2; +extern OSViMode osViModeMpalHpf2; + +extern OSViMode osViModeFpalLpn1; /* Individual VI FPAL modes */ +extern OSViMode osViModeFpalLpf1; +extern OSViMode osViModeFpalLan1; +extern OSViMode osViModeFpalLaf1; +extern OSViMode osViModeFpalLpn2; +extern OSViMode osViModeFpalLpf2; +extern OSViMode osViModeFpalLan2; +extern OSViMode osViModeFpalLaf2; +extern OSViMode osViModeFpalHpn1; +extern OSViMode osViModeFpalHpf1; +extern OSViMode osViModeFpalHan1; +extern OSViMode osViModeFpalHaf1; +extern OSViMode osViModeFpalHpn2; +extern OSViMode osViModeFpalHpf2; + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Video interface (Vi) */ +extern u32 osViGetStatus(void); +extern u32 osViGetCurrentMode(void); +extern u32 osViGetCurrentLine(void); +extern u32 osViGetCurrentField(void); +extern void* osViGetCurrentFramebuffer(void); +extern void* osViGetNextFramebuffer(void); +extern void osViSetXScale(f32); +extern void osViSetYScale(f32); +extern void osViExtendVStart(u32); +extern void osViSetSpecialFeatures(u32); +extern void osViSetMode(OSViMode*); +extern void osViSetEvent(OSMesgQueue*, OSMesg, u32); +extern void osViSwapBuffer(void*); +extern void osViBlack(u8); +extern void osViFade(u8, u16); +extern void osViRepeatLine(u8); +extern void osCreateViManager(OSPri); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_VI_H_ */ diff --git a/lib/hackerlibultra/include/PR/os_voice.h b/lib/hackerlibultra/include/PR/os_voice.h new file mode 100644 index 00000000..692c0c07 --- /dev/null +++ b/lib/hackerlibultra/include/PR/os_voice.h @@ -0,0 +1,103 @@ + +/*---------------------------------------------------------------------* + Copyright (C) 1998 Nintendo. + + $RCSfile: os_voice.h,v $ + $Revision: 1.2 $ + $Date: 1999/07/13 08:36:42 $ + *---------------------------------------------------------------------*/ + +#ifndef _OS_VOICE_H_ +#define _OS_VOICE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +typedef struct { /* Voice Recognition System */ + OSMesgQueue* __mq; /* SI Message Queue */ + int __channel; /* Controller Port # */ + s32 __mode; + u8 cmd_status; /* Command Status */ +} OSVoiceHandle; + +typedef struct { /* Voice Recognition System */ + u16 warning; + u16 answer_num; /* 0...5 */ + u16 voice_level; + u16 voice_sn; + u16 voice_time; + u16 answer[5]; + u16 distance[5]; +} OSVoiceData; + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +/************************************************************************** + * + * Global definitions + * + */ + +/* definition for Voice Recognition System */ + +#define VOICE_WARN_TOO_SMALL 0x0400 +#define VOICE_WARN_TOO_LARGE 0x0800 +#define VOICE_WARN_NOT_FIT 0x4000 +#define VOICE_WARN_TOO_NOISY 0x8000 + +#define VOICE_STATUS_READY 0 +#define VOICE_STATUS_START 1 +#define VOICE_STATUS_CANCEL 3 +#define VOICE_STATUS_BUSY 5 +#define VOICE_STATUS_END 7 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* Voice Recognition System */ +extern s32 osVoiceInit(OSMesgQueue*, OSVoiceHandle*, int); +extern s32 osVoiceCheckWord(u8* data); +extern s32 osVoiceClearDictionary(OSVoiceHandle*, u8); +extern s32 osVoiceControlGain(OSVoiceHandle*, s32, s32); +extern s32 osVoiceSetWord(OSVoiceHandle*, u8*); +extern s32 osVoiceStartReadData(OSVoiceHandle*); +extern s32 osVoiceStopReadData(OSVoiceHandle*); +extern s32 osVoiceGetReadData(OSVoiceHandle*, OSVoiceData*); +extern s32 osVoiceMaskDictionary(OSVoiceHandle*, u8*, int); +extern void osVoiceCountSyllables(u8*, u32*); + +#endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_VOICE_H_ */ diff --git a/lib/hackerlibultra/include/PR/ramrom.h b/lib/hackerlibultra/include/PR/ramrom.h new file mode 100644 index 00000000..b935bb7c --- /dev/null +++ b/lib/hackerlibultra/include/PR/ramrom.h @@ -0,0 +1,113 @@ +#ifndef _RAMROM_H +#define _RAMROM_H + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.20 $ + * $Date: 1997/02/11 08:26:47 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ramrom.h,v $ + * + **************************************************************************/ + +/* + * Defines for the GIO card in the Nintendo Development Station + * + * The RAM on the GIO card acts as ROM for the game + * Interrupts available between the game and the Indy host + * + * The last part of the ramrom is used for communication between + * game and host. There are 6 4K buffers defined: + * log, printf, rmon to indy, rmon from indy, app to indy, app from indy + * The last 8 bytes of the buffer are used in the emulator environment + */ + +#define RAMROM_SIZE (0x1000000) + +#define RAMROM_BUF_SIZE (4096) +#define RAMROM_MSG_SIZE (RAMROM_BUF_SIZE * 6) +#define RAMROM_MSG_ADDR (RAMROM_SIZE - RAMROM_MSG_SIZE) +#define RAMROM_MSG_HDR_SIZE (3 * sizeof(long)) +#define RAMROM_USER_DATA_SIZE (RAMROM_MSG_SIZE - RAMROM_MSG_HDR_SIZE) + +#define RAMROM_APP_READ_ADDR (RAMROM_MSG_ADDR + (0 * RAMROM_BUF_SIZE)) +#define RAMROM_APP_WRITE_ADDR (RAMROM_MSG_ADDR + (1 * RAMROM_BUF_SIZE)) +#define RAMROM_RMON_READ_ADDR (RAMROM_MSG_ADDR + (2 * RAMROM_BUF_SIZE)) +#define RAMROM_RMON_WRITE_ADDR (RAMROM_MSG_ADDR + (3 * RAMROM_BUF_SIZE)) +#define RAMROM_PRINTF_ADDR (RAMROM_MSG_ADDR + (4 * RAMROM_BUF_SIZE)) +#define RAMROM_LOG_ADDR (RAMROM_MSG_ADDR + (5 * RAMROM_BUF_SIZE)) + +/*#define RAMROM_GIO_INTERRUPT (RAMROM_MSG_ADDR + RAMROM_MSG_SIZE - 4)*/ + +/* + * For the initial round of PIF bringup, we will load in a bootstrap loader + * 0x400 bytes into the ramrom, and the rom will be loaded at 0x2000 + */ +#ifndef _HW_VERSION_1 +#define RAMROM_BOOTSTRAP_OFFSET 0x40 +#define RAMROM_GAME_OFFSET 0x1000 +#define RAMROM_FONTDATA_OFFSET 0xb70 +#define RAMROM_FONTDATA_SIZE 1152 +#else +#define RAMROM_BOOTSTRAP_OFFSET 0x400 +#define RAMROM_GAME_OFFSET 0x2000 +#endif +#define RAMROM_CLOCKRATE_OFFSET 0x4 +#define RAMROM_CLOCKRATE_MASK 0xfffffff0 +#define RAMROM_BOOTADDR_OFFSET 0x8 +#define RAMROM_RELEASE_OFFSET 0xc +/* + * Second version of the PIF jumps to location 0x1000, and we'll put a jump to + * location 0x400 into the ramrom (for backwards compatibility). + */ +#define RAMROM_PIF2BOOTSTRAP_OFFSET 0x1000 + +typedef struct { + long type; + long length; /* in bytes of userdata */ + long magic; + char userdata[RAMROM_USER_DATA_SIZE]; +} RamRomBuffer; + +/* + * Interrupt values (must fit in 6 bits!) + * values are used for both request & response + * Transactions initiated by the host start with HOST + * and those initiated by the target start with GAME. + */ + +#define HOST_PIACCESS_REQ 1 +#define HOST_DBG_CMD_READY 2 +#define GAME_DBG_DATA_SEND 3 +#define HOST_DBG_DATA_ACK 4 +#define GAME_PRINTF_SEND 5 +#define HOST_PRINTF_ACK 6 +#define GAME_LOG_SEND 7 +#define HOST_LOG_ACK 8 +#define HOST_APP_CMD_READY 9 +#define GAME_APP_DATA_READY 10 +#define HOST_PROF_REQ 11 +#define GAME_PROF_SEND 12 +#define HOST_PROF_ACK 13 +#define GAME_FAULT_SEND 14 +#define HOST_FAULT_ACK 15 +#define GAME_EXIT 16 +#define HOST_DATA_ACK 17 + +#ifdef _EMULATOR +void __RamRomInit(int key, void* romaddr); +void __RamRomDestroy(int key); +#endif /* _EMULATOR */ + +#endif /* !_RAMROM_H */ diff --git a/lib/hackerlibultra/include/PR/rcp.h b/lib/hackerlibultra/include/PR/rcp.h new file mode 100644 index 00000000..a03d3d57 --- /dev/null +++ b/lib/hackerlibultra/include/PR/rcp.h @@ -0,0 +1,849 @@ +#ifndef _RCP_H_ +#define _RCP_H_ + +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * File: rcp.h + * + * This file contains register and bit definitions for RCP memory map. + * $Revision: 1.22 $ + * $Date: 1999/05/20 03:01:49 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/rcp.h,v $ + * + **************************************************************************/ + +#include "R4300.h" +#include "ultratypes.h" + +/** + * RCP memory map overview: + * + * 0x0000_0000 .. 0x03ef_ffff RDRAM memory + * 0x03f0_0000 .. 0x03ff_ffff RDRAM registers + * + * 0x0400_0000 .. 0x0400_2000 SP memory + * 0x0404_0000 .. 0x040f_ffff SP registers + * 0x0410_0000 .. 0x041f_ffff DP command registers + * 0x0420_0000 .. 0x042f_ffff DP span registers + * 0x0430_0000 .. 0x043f_ffff MI registers + * 0x0440_0000 .. 0x044f_ffff VI registers + * 0x0450_0000 .. 0x045f_ffff AI registers + * 0x0460_0000 .. 0x046f_ffff PI registers + * 0x0470_0000 .. 0x047f_ffff RI registers + * 0x0480_0000 .. 0x048f_ffff SI registers + * 0x0490_0000 .. 0x04ff_ffff unused + * + * 0x0500_0000 .. 0x05ff_ffff cartridge domain 2 + * 0x0600_0000 .. 0x07ff_ffff cartridge domain 1 + * 0x0800_0000 .. 0x0fff_ffff cartridge domain 2 + * 0x1000_0000 .. 0x1fbf_ffff cartridge domain 1 + * + * 0x1fc0_0000 .. 0x1fc0_07bf PIF Boot Rom (1984 bytes) + * 0x1fc0_07c0 .. 0x1fc0_07ff PIF (JoyChannel) RAM (64 bytes) + * 0x1fc0_0800 .. 0x1fcf_ffff Reserved + * 0x1fd0_0000 .. 0x7fff_ffff cartridge domain 1 + * 0x8000_0000 .. 0xffff_ffff external SysAD device + */ + +/** + * RDRAM memory + */ + +#define RDRAM_0_START 0x00000000 +#define RDRAM_0_END 0x001FFFFF +#define RDRAM_1_START 0x00200000 +#define RDRAM_1_END 0x003FFFFF + +#define RDRAM_START RDRAM_0_START +#define RDRAM_END RDRAM_1_END + +/** + * RDRAM registers + */ +#define RDRAM_BASE_REG 0x03F00000 + +#define RDRAM_CONFIG_REG (RDRAM_BASE_REG + 0x00) +#define RDRAM_DEVICE_TYPE_REG (RDRAM_BASE_REG + 0x00) +#define RDRAM_DEVICE_ID_REG (RDRAM_BASE_REG + 0x04) +#define RDRAM_DELAY_REG (RDRAM_BASE_REG + 0x08) +#define RDRAM_MODE_REG (RDRAM_BASE_REG + 0x0c) +#define RDRAM_REF_INTERVAL_REG (RDRAM_BASE_REG + 0x10) +#define RDRAM_REF_ROW_REG (RDRAM_BASE_REG + 0x14) +#define RDRAM_RAS_INTERVAL_REG (RDRAM_BASE_REG + 0x18) +#define RDRAM_MIN_INTERVAL_REG (RDRAM_BASE_REG + 0x1c) +#define RDRAM_ADDR_SELECT_REG (RDRAM_BASE_REG + 0x20) +#define RDRAM_DEVICE_MANUF_REG (RDRAM_BASE_REG + 0x24) + +#define RDRAM_0_DEVICE_ID 0 +#define RDRAM_1_DEVICE_ID 1 + +#define RDRAM_RESET_MODE 0 +#define RDRAM_ACTIVE_MODE 1 +#define RDRAM_STANDBY_MODE 2 + +#define RDRAM_LENGTH (2 * 512 * 2048) +#define RDRAM_0_BASE_ADDRESS (RDRAM_0_DEVICE_ID * RDRAM_LENGTH) +#define RDRAM_1_BASE_ADDRESS (RDRAM_1_DEVICE_ID * RDRAM_LENGTH) + +#define RDRAM_0_CONFIG 0x00000 +#define RDRAM_1_CONFIG 0x00400 +#define RDRAM_GLOBAL_CONFIG 0x80000 + +/** + * PIF Physical memory map (total size = 2 KB) + * + * Size Description Mode + * 1FC007FF +-------+-----------------+-----+ + * | 64 B | JoyChannel RAM | R/W | + * 1FC007C0 +-------+-----------------+-----+ + * |1984 B | Boot ROM | * | * = Reserved + * 1FC00000 +-------+-----------------+-----+ + */ +#define PIF_ROM_START 0x1FC00000 +#define PIF_ROM_END 0x1FC007BF +#define PIF_RAM_START 0x1FC007C0 +#define PIF_RAM_END 0x1FC007FF + +/** + * Controller channel + * Each game controller channel has 4 error bits that are defined in bit 6-7 of + * the Rx and Tx data size area bytes. Programmers need to clear these bits + * when setting the Tx/Rx size area values for a channel + */ +#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */ +#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */ +#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */ +#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */ + +#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */ + +/** + * External device info + */ +#define DEVICE_TYPE_CART 0 /* ROM cartridge */ +#define DEVICE_TYPE_BULK 1 /* ROM bulk */ +#define DEVICE_TYPE_64DD 2 /* 64 Disk Drive */ +#define DEVICE_TYPE_SRAM 3 /* SRAM */ +/* 4-6 are reserved */ +#define DEVICE_TYPE_INIT 7 /* initial value */ +/* 8-14 are reserved */ + +/** + * Signal Processor (SP) Memory + */ +#define SP_DMEM_START 0x04000000 +#define SP_DMEM_END 0x04000FFF +#define SP_IMEM_START 0x04001000 +#define SP_IMEM_END 0x04001FFF + +/** + * Signal Processor (SP) CP0 Registers + */ + +#define SP_BASE_REG 0x04040000 + +/* SP memory address (R/W): [11:0] DMEM/IMEM address, [12] 0=DMEM,1=IMEM */ +#define SP_MEM_ADDR_REG (SP_BASE_REG + 0x00) + +/* SP DRAM DMA address (R/W): [23:0] RDRAM address */ +#define SP_DRAM_ADDR_REG (SP_BASE_REG + 0x04) + +/* SP read DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip; RDRAM -> I/DMEM */ +#define SP_RD_LEN_REG (SP_BASE_REG + 0x08) + +/* SP write DMA length (R/W): [11:0] length, [19:12] count, [31:20] skip; I/DMEM -> RDRAM */ +#define SP_WR_LEN_REG (SP_BASE_REG + 0x0C) + +/* SP status (R/W): [14:0] valid bits; see below for write/read mode */ +#define SP_STATUS_REG (SP_BASE_REG + 0x10) + +/* SP DMA full (R): [0] dma full */ +#define SP_DMA_FULL_REG (SP_BASE_REG + 0x14) + +/* SP DMA busy (R): [0] dma busy */ +#define SP_DMA_BUSY_REG (SP_BASE_REG + 0x18) + +/* SP semaphore (R/W): Read: [0] acquire semaphore; Write: [] release semaphore */ +#define SP_SEMAPHORE_REG (SP_BASE_REG + 0x1C) + +/* SP PC (R/W): [11:0] program counter */ +#define SP_PC_REG 0x04080000 + +/** + * SP_MEM_ADDR_REG: bit 12 + */ +#define SP_DMA_DMEM (0 << 12) +#define SP_DMA_IMEM (1 << 12) + +/** + * SP_STATUS_REG: write bits + */ +#define SP_CLR_HALT (1 << 0) /* clear halt */ +#define SP_SET_HALT (1 << 1) /* set halt */ +#define SP_CLR_BROKE (1 << 2) /* clear broke */ +#define SP_CLR_INTR (1 << 3) /* clear interrupt */ +#define SP_SET_INTR (1 << 4) /* set interrupt */ +#define SP_CLR_SSTEP (1 << 5) /* clear sstep */ +#define SP_SET_SSTEP (1 << 6) /* set sstep */ +#define SP_CLR_INTR_BREAK (1 << 7) /* clear interrupt on break */ +#define SP_SET_INTR_BREAK (1 << 8) /* set interrupt on break */ +#define SP_CLR_SIG0 (1 << 9) /* clear signal 0 */ +#define SP_SET_SIG0 (1 << 10) /* set signal 0 */ +#define SP_CLR_SIG1 (1 << 11) /* clear signal 1 */ +#define SP_SET_SIG1 (1 << 12) /* set signal 1 */ +#define SP_CLR_SIG2 (1 << 13) /* clear signal 2 */ +#define SP_SET_SIG2 (1 << 14) /* set signal 2 */ +#define SP_CLR_SIG3 (1 << 15) /* clear signal 3 */ +#define SP_SET_SIG3 (1 << 16) /* set signal 3 */ +#define SP_CLR_SIG4 (1 << 17) /* clear signal 4 */ +#define SP_SET_SIG4 (1 << 18) /* set signal 4 */ +#define SP_CLR_SIG5 (1 << 19) /* clear signal 5 */ +#define SP_SET_SIG5 (1 << 20) /* set signal 5 */ +#define SP_CLR_SIG6 (1 << 21) /* clear signal 6 */ +#define SP_SET_SIG6 (1 << 22) /* set signal 6 */ +#define SP_CLR_SIG7 (1 << 23) /* clear signal 7 */ +#define SP_SET_SIG7 (1 << 24) /* set signal 7 */ + +/* + * SP_STATUS_REG: read bits + */ +#define SP_STATUS_HALT (1 << 0) +#define SP_STATUS_BROKE (1 << 1) +#define SP_STATUS_DMA_BUSY (1 << 2) +#define SP_STATUS_DMA_FULL (1 << 3) +#define SP_STATUS_IO_FULL (1 << 4) +#define SP_STATUS_SSTEP (1 << 5) +#define SP_STATUS_INTR_BREAK (1 << 6) +#define SP_STATUS_SIG0 (1 << 7) +#define SP_STATUS_SIG1 (1 << 8) +#define SP_STATUS_SIG2 (1 << 9) +#define SP_STATUS_SIG3 (1 << 10) +#define SP_STATUS_SIG4 (1 << 11) +#define SP_STATUS_SIG5 (1 << 12) +#define SP_STATUS_SIG6 (1 << 13) +#define SP_STATUS_SIG7 (1 << 14) + +/* + * SP_STATUS_REG: use of SIG bits + */ +#define SP_CLR_YIELD SP_CLR_SIG0 +#define SP_SET_YIELD SP_SET_SIG0 +#define SP_STATUS_YIELD SP_STATUS_SIG0 +#define SP_CLR_YIELDED SP_CLR_SIG1 +#define SP_SET_YIELDED SP_SET_SIG1 +#define SP_STATUS_YIELDED SP_STATUS_SIG1 +#define SP_CLR_TASKDONE SP_CLR_SIG2 +#define SP_SET_TASKDONE SP_SET_SIG2 +#define SP_STATUS_TASKDONE SP_STATUS_SIG2 +#define SP_CLR_RSPSIGNAL SP_CLR_SIG3 +#define SP_SET_RSPSIGNAL SP_SET_SIG3 +#define SP_STATUS_RSPSIGNAL SP_STATUS_SIG3 +#define SP_CLR_CPUSIGNAL SP_CLR_SIG4 +#define SP_SET_CPUSIGNAL SP_SET_SIG4 +#define SP_STATUS_CPUSIGNAL SP_STATUS_SIG4 + +/* + * SP IMEM BIST REG (R/W): [6:0] BIST status bits; see below for detail + */ +#define SP_IBIST_REG 0x04080004 + +/* + * SP_IBIST_REG: write bits + */ +#define SP_IBIST_CHECK (1 << 0) /* BIST check */ +#define SP_IBIST_GO (1 << 1) /* BIST go */ +#define SP_IBIST_CLEAR (1 << 2) /* BIST clear */ + +/* + * SP_BIST_REG: read bits + * First 2 bits are same as in write mode + */ +#define SP_IBIST_DONE (1 << 2) +#define SP_IBIST_FAILED 0x78 /* bits [6:3], BIST fail */ + +/** + * Display Processor Command (DPC) Registers + */ +#define DPC_BASE_REG 0x04100000 + +/* DP CMD DMA start (R/W): [23:0] DMEM/RDRAM start address */ +#define DPC_START_REG (DPC_BASE_REG + 0x00) + +/* DP CMD DMA end (R/W): [23:0] DMEM/RDRAM end address */ +#define DPC_END_REG (DPC_BASE_REG + 0x04) + +/* DP CMD DMA end (R): [23:0] DMEM/RDRAM current address */ +#define DPC_CURRENT_REG (DPC_BASE_REG + 0x08) + +/* DP CMD status (R/W): [9:0] valid bits - see below for definitions */ +#define DPC_STATUS_REG (DPC_BASE_REG + 0x0C) + +/* DP clock counter (R): [23:0] clock counter */ +#define DPC_CLOCK_REG (DPC_BASE_REG + 0x10) + +/* DP buffer busy counter (R): [23:0] clock counter */ +#define DPC_BUFBUSY_REG (DPC_BASE_REG + 0x14) + +/* DP pipe busy counter (R): [23:0] clock counter */ +#define DPC_PIPEBUSY_REG (DPC_BASE_REG + 0x18) + +/* DP TMEM load counter (R): [23:0] clock counter */ +#define DPC_TMEM_REG (DPC_BASE_REG + 0x1C) + +/** + * DPC_STATUS_REG: write bits + */ +#define DPC_CLR_XBUS_DMEM_DMA (1 << 0) +#define DPC_SET_XBUS_DMEM_DMA (1 << 1) +#define DPC_CLR_FREEZE (1 << 2) +#define DPC_SET_FREEZE (1 << 3) +#define DPC_CLR_FLUSH (1 << 4) +#define DPC_SET_FLUSH (1 << 5) +#define DPC_CLR_TMEM_CTR (1 << 6) +#define DPC_CLR_PIPE_CTR (1 << 7) +#define DPC_CLR_CMD_CTR (1 << 8) +#define DPC_CLR_CLOCK_CTR (1 << 9) + +/** + * DPC_STATUS_REG: read bits + */ +#define DPC_STATUS_XBUS_DMEM_DMA (1 << 0) +#define DPC_STATUS_FREEZE (1 << 1) +#define DPC_STATUS_FLUSH (1 << 2) +#define DPC_STATUS_START_GCLK (1 << 3) +#define DPC_STATUS_TMEM_BUSY (1 << 4) +#define DPC_STATUS_PIPE_BUSY (1 << 5) +#define DPC_STATUS_CMD_BUSY (1 << 6) +#define DPC_STATUS_CBUF_READY (1 << 7) +#define DPC_STATUS_DMA_BUSY (1 << 8) +#define DPC_STATUS_END_VALID (1 << 9) +#define DPC_STATUS_START_VALID (1 << 10) + +/** + * Display Processor Span (DPS) Registers + */ +#define DPS_BASE_REG 0x04200000 + +/* DP tmem built-in self-test (R/W): [10:0] BIST status bits */ +#define DPS_TBIST_REG (DPS_BASE_REG + 0x00) + +/* DP span test mode (R/W): [0] Span buffer test access enable */ +#define DPS_TEST_MODE_REG (DPS_BASE_REG + 0x04) + +/* DP span buffer test address (R/W): [6:0] bits */ +#define DPS_BUFTEST_ADDR_REG (DPS_BASE_REG + 0x08) + +/* DP span buffer test data (R/W): [31:0] span buffer data */ +#define DPS_BUFTEST_DATA_REG (DPS_BASE_REG + 0x0C) + +/* + * DPS_TMEM_BIST_REG: write bits + */ +#define DPS_TBIST_CHECK (1 << 0) +#define DPS_TBIST_GO (1 << 1) +#define DPS_TBIST_CLEAR (1 << 2) + +/* + * DPS_TMEM_BIST_REG: read bits + * First 2 bits are same as in write mode + */ +#define DPS_TBIST_DONE (1 << 2) +#define DPS_TBIST_FAILED 0x7F8 /* bits [10:3], BIST fail */ + +/** + * MIPS Interface (MI) Registers + */ +#define MI_BASE_REG 0x04300000 + +/* + * MI init mode (W): [6:0] init length, [7] clear init mode, [8] set init mode + * [9/10] clear/set ebus test mode, [11] clear DP interrupt + * (R): [6:0] init length, [7] init mode, [8] ebus test mode + */ +#define MI_INIT_MODE_REG (MI_BASE_REG + 0x00) +#define MI_MODE_REG MI_INIT_MODE_REG + +/* + * MI_MODE_REG: write bits + */ +#define MI_CLR_INIT (1 << 7) /* clear init mode */ +#define MI_SET_INIT (1 << 8) /* set init mode */ +#define MI_CLR_EBUS (1 << 9) /* clear ebus test */ +#define MI_SET_EBUS (1 << 10) /* set ebus test mode */ +#define MI_CLR_DP_INTR (1 << 11) /* clear dp interrupt */ +#define MI_CLR_RDRAM (1 << 12) /* clear RDRAM reg */ +#define MI_SET_RDRAM (1 << 13) /* set RDRAM reg mode */ + +/* + * MI_MODE_REG: read bits + */ +#define MI_MODE_INIT (1 << 7) /* init mode */ +#define MI_MODE_EBUS (1 << 8) /* ebus test mode */ +#define MI_MODE_RDRAM (1 << 9) /* RDRAM reg mode */ + +/* MI version (R): [7:0] io, [15:8] rac, [23:16] rdp, [31:24] rsp */ +#define MI_VERSION_REG (MI_BASE_REG + 0x04) +#define MI_NOOP_REG MI_VERSION_REG + +/* MI interrupt (R): [5:0] valid bits - see below for bit patterns */ +#define MI_INTR_REG (MI_BASE_REG + 0x08) + +/* + * MI interrupt mask (W): [11:0] valid bits - see below for bit patterns + * (R): [5:0] valid bits - see below for bit patterns + */ +#define MI_INTR_MASK_REG (MI_BASE_REG + 0x0C) + +/* + * MI_INTR_REG: read bits + */ +#define MI_INTR_SP (1 << 0) /* SP intr */ +#define MI_INTR_SI (1 << 1) /* SI intr */ +#define MI_INTR_AI (1 << 2) /* AI intr */ +#define MI_INTR_VI (1 << 3) /* VI intr */ +#define MI_INTR_PI (1 << 4) /* PI intr */ +#define MI_INTR_DP (1 << 5) /* DP intr */ + +/* + * MI_INTR_MASK_REG: write bits + */ +#define MI_INTR_MASK_CLR_SP (1 << 0) /* clear SP mask */ +#define MI_INTR_MASK_SET_SP (1 << 1) /* set SP mask */ +#define MI_INTR_MASK_CLR_SI (1 << 2) /* clear SI mask */ +#define MI_INTR_MASK_SET_SI (1 << 3) /* set SI mask */ +#define MI_INTR_MASK_CLR_AI (1 << 4) /* clear AI mask */ +#define MI_INTR_MASK_SET_AI (1 << 5) /* set AI mask */ +#define MI_INTR_MASK_CLR_VI (1 << 6) /* clear VI mask */ +#define MI_INTR_MASK_SET_VI (1 << 7) /* set VI mask */ +#define MI_INTR_MASK_CLR_PI (1 << 8) /* clear PI mask */ +#define MI_INTR_MASK_SET_PI (1 << 9) /* set PI mask */ +#define MI_INTR_MASK_CLR_DP (1 << 10) /* clear DP mask */ +#define MI_INTR_MASK_SET_DP (1 << 11) /* set DP mask */ + +/* + * MI_INTR_MASK_REG: read bits + */ +#define MI_INTR_MASK_SP (1 << 0) /* SP intr mask */ +#define MI_INTR_MASK_SI (1 << 1) /* SI intr mask */ +#define MI_INTR_MASK_AI (1 << 2) /* AI intr mask */ +#define MI_INTR_MASK_VI (1 << 3) /* VI intr mask */ +#define MI_INTR_MASK_PI (1 << 4) /* PI intr mask */ +#define MI_INTR_MASK_DP (1 << 5) /* DP intr mask */ + +/** + * Video Interface (VI) Registers + */ +#define VI_BASE_REG 0x04400000 + +/* VI status/control (R/W): [15-0] valid bits: + * [1:0] = type[1:0] (pixel size) + * 0: blank (no data, no sync) + * 1: reserved + * 2: 5/5/5/3 ("16" bit) + * 3: 8/8/8/8 (32 bit) + * [2] = gamma_dither_enable (normally on, unless "special effect") + * [3] = gamma_enable (normally on, unless MPEG/JPEG) + * [4] = divot_enable (normally on if antialiased, unless decal lines) + * [5] = reserved - always off + * [6] = serrate (always on if interlaced, off if not) + * [7] = reserved - diagnostics only + * [9:8] = anti-alias (aa) mode[1:0] + * 0: aa & resamp (always fetch extra lines) + * 1: aa & resamp (fetch extra lines if needed) + * 2: resamp only (treat as all fully covered) + * 3: neither (replicate pixels, no interpolate) + * [11] = reserved - diagnostics only + * [15:12] = reserved + * + */ +#define VI_CONTROL_REG (VI_BASE_REG + 0x00) +#define VI_STATUS_REG VI_CONTROL_REG + +/* VI origin (R/W): [23:0] frame buffer origin in bytes */ +#define VI_ORIGIN_REG (VI_BASE_REG + 0x04) +#define VI_DRAM_ADDR_REG VI_ORIGIN_REG + +/* VI width (R/W): [11:0] frame buffer line width in pixels */ +#define VI_WIDTH_REG (VI_BASE_REG + 0x08) +#define VI_H_WIDTH_REG VI_WIDTH_REG + +/* VI vertical intr (R/W): [9:0] interrupt when current half-line = V_INTR */ +#define VI_INTR_REG (VI_BASE_REG + 0x0C) +#define VI_V_INTR_REG VI_INTR_REG + +/* + * VI current vertical line (R/W): [9:0] current half line, sampled once per + * line (the lsb of V_CURRENT is constant within a field, and in + * interlaced modes gives the field number - which is constant for non- + * interlaced modes) + * - Any write to this register will clear interrupt line + */ +#define VI_CURRENT_REG (VI_BASE_REG + 0x10) +#define VI_V_CURRENT_LINE_REG VI_CURRENT_REG + +/* + * VI video timing (R/W): [ 7: 0] horizontal sync width in pixels, + * [15: 8] color burst width in pixels, + * [19:16] vertical sync width in half lines, + * [29:20] start of color burst in pixels from h-sync + */ +#define VI_BURST_REG (VI_BASE_REG + 0x14) +#define VI_TIMING_REG VI_BURST_REG + +/* VI vertical sync (R/W): [9:0] number of half-lines per field */ +#define VI_V_SYNC_REG (VI_BASE_REG + 0x18) + +/* VI horizontal sync (R/W): [11: 0] total duration of a line in 1/4 pixel + * [20:16] a 5-bit leap pattern used for PAL only + * (h_sync_period) + */ +#define VI_H_SYNC_REG (VI_BASE_REG + 0x1C) + +/* + * VI horizontal sync leap (R/W): [11: 0] identical to h_sync_period + * [27:16] identical to h_sync_period + */ +#define VI_LEAP_REG (VI_BASE_REG + 0x20) +#define VI_H_SYNC_LEAP_REG VI_LEAP_REG + +/* + * VI horizontal video (R/W): [ 9: 0] end of active video in screen pixels + * : [25:16] start of active video in screen pixels + */ +#define VI_H_START_REG (VI_BASE_REG + 0x24) +#define VI_H_VIDEO_REG VI_H_START_REG + +/* + * VI vertical video (R/W): [ 9: 0] end of active video in screen half-lines + * : [25:16] start of active video in screen half-lines + */ +#define VI_V_START_REG (VI_BASE_REG + 0x28) +#define VI_V_VIDEO_REG VI_V_START_REG + +/* + * VI vertical burst (R/W): [ 9: 0] end of color burst enable in half-lines + * : [25:16] start of color burst enable in half-lines + */ +#define VI_V_BURST_REG (VI_BASE_REG + 0x2C) + +/* VI x-scale (R/W): [11: 0] 1/horizontal scale up factor (2.10 format) + * [27:16] horizontal subpixel offset (2.10 format) + */ +#define VI_X_SCALE_REG (VI_BASE_REG + 0x30) + +/* VI y-scale (R/W): [11: 0] 1/vertical scale up factor (2.10 format) + * [27:16] vertical subpixel offset (2.10 format) + */ +#define VI_Y_SCALE_REG (VI_BASE_REG + 0x34) + +/* + * Patterns to interpret VI_CONTROL_REG + */ +#define VI_CTRL_TYPE_16 0x00002 /* [1:0] pixel size: 16 bit */ +#define VI_CTRL_TYPE_32 0x00003 /* [1:0] pixel size: 32 bit */ +#define VI_CTRL_GAMMA_DITHER_ON 0x00004 /* 2: default = on */ +#define VI_CTRL_GAMMA_ON 0x00008 /* 3: default = on */ +#define VI_CTRL_DIVOT_ON 0x00010 /* 4: default = on */ +#define VI_CTRL_SERRATE_ON 0x00040 /* 6: on if interlaced */ +#define VI_CTRL_ANTIALIAS_MASK 0x00300 /* [9:8] anti-alias mode */ +#define VI_CTRL_ANTIALIAS_MODE_0 \ + 0x00000 /* Bit [9:8] anti-alias mode: AA enabled, resampling enabled, always fetch extra lines */ +#define VI_CTRL_ANTIALIAS_MODE_1 \ + 0x00100 /* Bit [9:8] anti-alias mode: AA enabled, resampling enabled, fetch extra lines as-needed \ + */ +#define VI_CTRL_ANTIALIAS_MODE_2 \ + 0x00200 /* Bit [9:8] anti-alias mode: AA disabled, resampling enabled, operate as if everything is \ + covered */ +#define VI_CTRL_ANTIALIAS_MODE_3 \ + 0x00300 /* Bit [9:8] anti-alias mode: AA disabled, resampling disabled, replicate pixels */ +#define VI_CTRL_PIXEL_ADV_MASK 0x0F000 /* [15:12] pixel advance mode? */ +#define VI_CTRL_PIXEL_ADV_1 0x01000 /* Bit [15:12] pixel advance mode? */ +#define VI_CTRL_PIXEL_ADV_2 0x02000 /* Bit [15:12] pixel advance mode? */ +#define VI_CTRL_PIXEL_ADV_3 0x03000 /* Bit [15:12] pixel advance mode? */ +#define VI_CTRL_DITHER_FILTER_ON 0x10000 /* 16: dither-filter mode */ + +/* + * Possible video clocks (NTSC or PAL) + */ +#define VI_NTSC_CLOCK 48681812 /* Hz = 48.681812 MHz */ +#define VI_PAL_CLOCK 49656530 /* Hz = 49.656530 MHz */ +#define VI_MPAL_CLOCK 48628316 /* Hz = 48.628316 MHz */ + +/** + * The address and length registers are double buffered; that is, they + * can be written twice before becoming full. + * The address must be written before the length. + */ + +/** + * Audio Interface (AI) Registers + */ +#define AI_BASE_REG 0x04500000 + +/* AI DRAM address (W): [23:0] starting RDRAM address (8B-aligned) */ +#define AI_DRAM_ADDR_REG (AI_BASE_REG + 0x00) /* R0: DRAM address */ + +/* AI length (R/W): [14:0] transfer length (v1.0) - Bottom 3 bits are ignored */ +/* [17:0] transfer length (v2.0) - Bottom 3 bits are ignored */ +#define AI_LEN_REG (AI_BASE_REG + 0x04) /* R1: Length */ + +/* AI control (W): [0] DMA enable - if LSB == 1, DMA is enabled */ +#define AI_CONTROL_REG (AI_BASE_REG + 0x08) /* R2: DMA Control */ + +/* Value for control register */ +#define AI_CONTROL_DMA_ON 1 /* LSB = 1: DMA enable*/ +#define AI_CONTROL_DMA_OFF 0 /* LSB = 1: DMA enable*/ + +/* + * AI status (R): [31]/[0] ai_full (addr & len buffer full), [30] ai_busy + * Note that a 1->0 transition in ai_full will set interrupt + * (W): clear audio interrupt + */ +#define AI_STATUS_REG (AI_BASE_REG + 0x0C) /* R3: Status */ + +/* Value for status register */ +#define AI_STATUS_FIFO_FULL (1 << 31) +#define AI_STATUS_DMA_BUSY (1 << 30) + +/* + * AI DAC sample period register (W): [13:0] dac rate + * - vid_clock/(dperiod + 1) is the DAC sample rate + * - (dperiod + 1) >= 66 * (aclockhp + 1) must be true + */ +#define AI_DACRATE_REG (AI_BASE_REG + 0x10) /* R4: DAC rate 14-lsb*/ + +/* DAC rate = video clock / audio frequency + * - DAC rate >= (66 * Bit rate) must be true + */ +#define AI_MAX_DAC_RATE 16384 /* 14-bit+1 */ +#define AI_MIN_DAC_RATE 132 + +/* + * AI bit rate (W): [3:0] bit rate (abus clock half period register - aclockhp) + * - vid_clock/(2 * (aclockhp + 1)) is the DAC clock rate + * - The abus clock stops if aclockhp is zero + */ +#define AI_BITRATE_REG (AI_BASE_REG + 0x14) /* R5: Bit rate 4-lsb */ + +/* Bit rate <= (DAC rate / 66) */ +#define AI_MAX_BIT_RATE 16 /* 4-bit+1 */ +#define AI_MIN_BIT_RATE 2 + +/* + * Maximum and minimum values for audio frequency based on video clocks + * max frequency = (video clock / min dac rate) + * min frequency = (video clock / max dac rate) + */ +#define AI_NTSC_MAX_FREQ 368000 /* 368 KHz */ +#define AI_NTSC_MIN_FREQ 3000 /* 3 KHz ~ 2971 Hz */ + +#define AI_PAL_MAX_FREQ 376000 /* 376 KHz */ +#define AI_PAL_MIN_FREQ 3050 /* 3 KHz ~ 3031 Hz */ + +#define AI_MPAL_MAX_FREQ 368000 /* 368 KHz */ +#define AI_MPAL_MIN_FREQ 3000 /* 3 KHz ~ 2968 Hz */ + +/** + * Peripheral Interface (PI) Registers + */ +#define PI_BASE_REG 0x04600000 + +/* PI DRAM address (R/W): [23:0] starting RDRAM address */ +#define PI_DRAM_ADDR_REG (PI_BASE_REG + 0x00) /* DRAM address */ + +/* PI pbus (cartridge) address (R/W): [31:0] starting AD16 address */ +#define PI_CART_ADDR_REG (PI_BASE_REG + 0x04) + +/* PI read length (R/W): [23:0] read data length */ +#define PI_RD_LEN_REG (PI_BASE_REG + 0x08) + +/* PI write length (R/W): [23:0] write data length */ +#define PI_WR_LEN_REG (PI_BASE_REG + 0x0C) + +/* + * PI status (R): [0] DMA busy, [1] IO busy, [2], error + * (W): [0] reset controller (and abort current op), [1] clear intr + */ +#define PI_STATUS_REG (PI_BASE_REG + 0x10) + +/* PI dom1 latency (R/W): [7:0] domain 1 device latency */ +#define PI_BSD_DOM1_LAT_REG (PI_BASE_REG + 0x14) + +/* PI dom1 pulse width (R/W): [7:0] domain 1 device R/W strobe pulse width */ +#define PI_BSD_DOM1_PWD_REG (PI_BASE_REG + 0x18) + +/* PI dom1 page size (R/W): [3:0] domain 1 device page size */ +#define PI_BSD_DOM1_PGS_REG (PI_BASE_REG + 0x1C) /* page size */ + +/* PI dom1 release (R/W): [1:0] domain 1 device R/W release duration */ +#define PI_BSD_DOM1_RLS_REG (PI_BASE_REG + 0x20) + +/* PI dom2 latency (R/W): [7:0] domain 2 device latency */ +#define PI_BSD_DOM2_LAT_REG (PI_BASE_REG + 0x24) /* Domain 2 latency */ + +/* PI dom2 pulse width (R/W): [7:0] domain 2 device R/W strobe pulse width */ +#define PI_BSD_DOM2_PWD_REG (PI_BASE_REG + 0x28) /* pulse width */ + +/* PI dom2 page size (R/W): [3:0] domain 2 device page size */ +#define PI_BSD_DOM2_PGS_REG (PI_BASE_REG + 0x2C) /* page size */ + +/* PI dom2 release (R/W): [1:0] domain 2 device R/W release duration */ +#define PI_BSD_DOM2_RLS_REG (PI_BASE_REG + 0x30) /* release duration */ + +#define PI_DOMAIN1_REG PI_BSD_DOM1_LAT_REG +#define PI_DOMAIN2_REG PI_BSD_DOM2_LAT_REG + +#define PI_DOM_LAT_OFS 0x00 +#define PI_DOM_PWD_OFS 0x04 +#define PI_DOM_PGS_OFS 0x08 +#define PI_DOM_RLS_OFS 0x0C + +/* + * PI status register has 3 bits active when read from (PI_STATUS_REG - read) + * Bit 0: DMA busy - set when DMA is in progress + * Bit 1: IO busy - set when IO is in progress + * Bit 2: Error - set when CPU issues IO request while DMA is busy + */ +#define PI_STATUS_DMA_BUSY (1 << 0) +#define PI_STATUS_IO_BUSY (1 << 1) +#define PI_STATUS_ERROR (1 << 2) + +/* PI status register has 2 bits active when written to: + * Bit 0: When set, reset PIC + * Bit 1: When set, clear interrupt flag + * The values of the two bits can be ORed together to both reset PIC and + * clear interrupt at the same time. + * + * Note: + * - The PIC does generate an interrupt at the end of each DMA. CPU + * needs to clear the interrupt flag explicitly (from an interrupt + * handler) by writing into the STATUS register with bit 1 set. + * + * - When a DMA completes, the interrupt flag is set. CPU can issue + * another request even while the interrupt flag is set (as long as + * PIC is idle). However, it is the CPU's responsibility for + * maintaining accurate correspondence between DMA completions and + * interrupts. + * + * - When PIC is reset, if PIC happens to be busy, an interrupt will + * be generated as PIC returns to idle. Otherwise, no interrupt will + * be generated and PIC remains idle. + */ + +/* + * PI_STATUS_REG: write bits + */ +#define PI_STATUS_RESET (1 << 0) +#define PI_SET_RESET PI_STATUS_RESET + +#define PI_STATUS_CLR_INTR (1 << 1) +#define PI_CLR_INTR PI_STATUS_CLR_INTR + +#define PI_DMA_BUFFER_SIZE 128 + +#define PI_DOM1_ADDR1 0x06000000 /* to 0x07FFFFFF */ +#define PI_DOM1_ADDR2 0x10000000 /* to 0x1FBFFFFF */ +#define PI_DOM1_ADDR3 0x1FD00000 /* to 0x7FFFFFFF */ +#define PI_DOM2_ADDR1 0x05000000 /* to 0x05FFFFFF */ +#define PI_DOM2_ADDR2 0x08000000 /* to 0x0FFFFFFF */ + +/** + * RDRAM Interface (RI) Registers + */ +#define RI_BASE_REG 0x04700000 + +/* RI mode (R/W): [1:0] operating mode, [2] stop T active, [3] stop R active */ +#define RI_MODE_REG (RI_BASE_REG + 0x00) + +/* RI config (R/W): [5:0] current control input, [6] current control enable */ +#define RI_CONFIG_REG (RI_BASE_REG + 0x04) + +/* RI current load (W): [] any write updates current control register */ +#define RI_CURRENT_LOAD_REG (RI_BASE_REG + 0x08) + +/* RI select (R/W): [2:0] receive select, [2:0] transmit select */ +#define RI_SELECT_REG (RI_BASE_REG + 0x0C) + +/* RI refresh (R/W): [7:0] clean refresh delay, [15:8] dirty refresh delay, + * [16] refresh bank, [17] refresh enable + * [18] refresh optimize + */ +#define RI_REFRESH_REG (RI_BASE_REG + 0x10) +#define RI_COUNT_REG RI_REFRESH_REG + +/* RI latency (R/W): [3:0] DMA latency/overlap */ +#define RI_LATENCY_REG (RI_BASE_REG + 0x14) + +/* RI error (R): [0] nack error, [1] ack error */ +#define RI_RERROR_REG (RI_BASE_REG + 0x18) + +/* RI error (W): [] any write clears all error bits */ +#define RI_WERROR_REG (RI_BASE_REG + 0x1C) + +/** + * Serial Interface (SI) Registers + */ +#define SI_BASE_REG 0x04800000 + +/* SI DRAM address (R/W): [23:0] starting RDRAM address */ +#define SI_DRAM_ADDR_REG (SI_BASE_REG + 0x00) + +/* SI address read 64B (W): [] write begins a 64B DMA write PIF RAM -> RDRAM */ +#define SI_PIF_ADDR_RD64B_REG (SI_BASE_REG + 0x04) + +/* Address SI_BASE_REG + (0x08, 0x0C, 0x14) are reserved */ + +/* SI address write 64B (W): [] write begins a 64B DMA read RDRAM -> PIF RAM */ +#define SI_PIF_ADDR_WR64B_REG (SI_BASE_REG + 0x10) + +/* SI status (R/W): [] any write clears interrupt */ +#define SI_STATUS_REG (SI_BASE_REG + 0x18) + +/* + * SI_STATUS_REG: read bits + */ +#define SI_STATUS_DMA_BUSY (1 << 0) /* DMA in progress */ +#define SI_STATUS_RD_BUSY (1 << 1) /* IO access in progress */ +#define SI_STATUS_DMA_ERROR (1 << 3) /* Overlapping DMA requests */ +#define SI_STATUS_INTERRUPT (1 << 12) /* Interrupt is set */ + +/** + * Development Board GIO Control Registers + */ + +#define GIO_BASE_REG 0x18000000 + +/* Game to Host Interrupt */ +#define GIO_GIO_INTR_REG (GIO_BASE_REG + 0x000) + +/* Game to Host SYNC */ +#define GIO_GIO_SYNC_REG (GIO_BASE_REG + 0x400) + +/* Host to Game Interrupt */ +#define GIO_CART_INTR_REG (GIO_BASE_REG + 0x800) + +/** + * Common macros + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +#define IO_READ(addr) (*(vu32*)PHYS_TO_K1(addr)) +#define IO_WRITE(addr, data) (*(vu32*)PHYS_TO_K1(addr) = (u32)(data)) +#define RCP_STAT_PRINT \ + rmonPrintf("current=%x start=%x end=%x dpstat=%x spstat=%x\n", IO_READ(DPC_CURRENT_REG), IO_READ(DPC_START_REG), \ + IO_READ(DPC_END_REG), IO_READ(DPC_STATUS_REG), IO_READ(SP_STATUS_REG)) + +#endif + +#endif /* _RCP_H_ */ diff --git a/lib/hackerlibultra/include/PR/rdb.h b/lib/hackerlibultra/include/PR/rdb.h new file mode 100644 index 00000000..6cce00a8 --- /dev/null +++ b/lib/hackerlibultra/include/PR/rdb.h @@ -0,0 +1,90 @@ + +/************************************************************************** + * + * $Revision: 1.6 $ + * $Date: 1997/02/11 08:29:31 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/rdb.h,v $ + * + **************************************************************************/ + +#ifndef _RDB_H +#define _RDB_H + +/* U64 side address */ +#define RDB_BASE_REG 0xc0000000 +#define RDB_WRITE_INTR_REG (RDB_BASE_REG + 0x8) +#define RDB_READ_INTR_REG (RDB_BASE_REG + 0xc) +#define RDB_BASE_VIRTUAL_ADDR 0x80000000 + +/* packet type Have six bits, so can have up to 63 types */ +#define RDB_TYPE_INVALID 0 +#define RDB_TYPE_GtoH_PRINT 1 +#define RDB_TYPE_GtoH_FAULT 2 +#define RDB_TYPE_GtoH_LOG_CT 3 +#define RDB_TYPE_GtoH_LOG 4 +#define RDB_TYPE_GtoH_READY_FOR_DATA 5 +#define RDB_TYPE_GtoH_DATA_CT 6 +#define RDB_TYPE_GtoH_DATA 7 +#define RDB_TYPE_GtoH_DEBUG 8 +#define RDB_TYPE_GtoH_RAMROM 9 +#define RDB_TYPE_GtoH_DEBUG_DONE 10 +#define RDB_TYPE_GtoH_DEBUG_READY 11 +#define RDB_TYPE_GtoH_KDEBUG 12 +#define RDB_TYPE_GtoH_PROF_DATA 22 + +#define RDB_TYPE_HtoG_LOG_DONE 13 +#define RDB_TYPE_HtoG_DEBUG 14 +#define RDB_TYPE_HtoG_DEBUG_CT 15 +#define RDB_TYPE_HtoG_DATA 16 +#define RDB_TYPE_HtoG_DATA_DONE 17 +#define RDB_TYPE_HtoG_REQ_RAMROM 18 +#define RDB_TYPE_HtoG_FREE_RAMROM 19 +#define RDB_TYPE_HtoG_KDEBUG 20 +#define RDB_TYPE_HtoG_PROF_SIGNAL 21 + +#define RDB_PROF_ACK_SIG 1 +#define RDB_PROF_FLUSH_SIG 2 +#define PROF_BLOCK_SIZE 2048 + +#define RDB_LOG_MAX_BLOCK_SIZE 0x8000 +#define RDB_DATA_MAX_BLOCK_SIZE 0x8000 + +/* GIO side address */ +#define GIO_RDB_BASE_REG 0xbf480000 +#define GIO_RDB_WRITE_INTR_REG (GIO_RDB_BASE_REG + 0x8) +#define GIO_RDB_READ_INTR_REG (GIO_RDB_BASE_REG + 0xc) + +/* minor device number */ +#define GIO_RDB_PRINT_MINOR 1 +#define GIO_RDB_DEBUG_MINOR 2 + +/* interrupt bit */ +#define GIO_RDB_WRITE_INTR_BIT 0x80000000 +#define GIO_RDB_READ_INTR_BIT 0x40000000 + +/* debug command */ +#define DEBUG_COMMAND_NULL 0 +#define DEBUG_COMMAND_MEMORY 1 +#define DEBUG_COMMAND_REGISTER 2 +#define DEBUG_COMMAND_INVALID 255 + +/* debug state */ +#define DEBUG_STATE_NULL 0 +#define DEBUG_STATE_RECEIVE 1 +#define DEBUG_STATE_INVALID 255 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/* Structure for debug port */ +typedef struct { + unsigned type : 6; /* 0: invalid, 1: print, 2: debug */ + unsigned length : 2; /* 1, 2, or 3 */ + char buf[3]; /* character buffer */ +} rdbPacket; + +extern unsigned int __osRdbWriteOK; +extern unsigned int __osRdbSendMessage; + +#endif /* _LANGUAGE_C */ + +#endif /* !_RDB_H */ diff --git a/lib/hackerlibultra/include/PR/region.h b/lib/hackerlibultra/include/PR/region.h new file mode 100644 index 00000000..b310b147 --- /dev/null +++ b/lib/hackerlibultra/include/PR/region.h @@ -0,0 +1,113 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * Module: region.h + * + * $Revision: 1.8 $ + * $Date: 1997/11/26 00:30:56 $ + * $Author: mitu $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/region.h,v $ + * + * Description: + * This file contains macros and structure definitions for the region + * library. + * + **************************************************************************/ + +#ifndef _REGION_H_ +#define _REGION_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +/*************************************** + * + * Global defines + * + */ +/* Alignment sizes */ +#define ALIGNSZ (sizeof(long long)) /* 8 bytes */ +#define ALIGNOFFST (ALIGNSZ - 1) + +/* size for storing index to free buffer */ +#define BUF_CTRL_SIZE ALIGNSZ + +/* Max bufcount = 32K */ +#define MAX_BUFCOUNT 0x8000 +/* code for last free buffer */ +#define BUF_FREE_WO_NEXT 0x8000 + +/* + * Global defines for alignment size (default is 8-byte alignment) + */ +#define OS_RG_ALIGN_2B 2 /* 2 bytes = 16-bit alignment */ +#define OS_RG_ALIGN_4B 4 /* 4 bytes = 32-bit alignment */ +#define OS_RG_ALIGN_8B 8 /* 8 bytes = 64-bit alignment */ +#define OS_RG_ALIGN_16B 16 /* 16 bytes = 128-bit alignment */ + +#define OS_RG_ALIGN_DEFAULT OS_RG_ALIGN_8B + +/*************************************** + * + * Macro definitions + * + */ + +/* Perform alignment on input 's' */ +#define ALIGN(s, align) (((u32)(s) + ((align) - 1)) & ~((align) - 1)) + +/*************************************** + * + * Typedefs & structure definitions + * + */ +/* + * Structure for region header/control area + */ +typedef struct _Region_s { + u8* r_startBufferAddress; /* start address to data buffer */ + u8* r_endAddress; /* end address of region */ + s32 r_bufferSize; /* size of buffers for this region */ + s32 r_bufferCount; /* up to 32K entries; MSB is used for + setting end-of-list/used */ + u16 r_freeList; /* point to array index of first + available memory buffer */ + u16 r_alignSize; /* alignment size (# of bytes) */ +} OSRegion; + +/* + * Macro to simplify accessing region header structure + */ +#define RP(x) rp->r_##x + +/*************************************** + * + * Function prototypes + * + */ +extern void* osCreateRegion(void*, u32, u32, u32); +extern void* osMalloc(void*); +extern void osFree(void*, void*); +extern s32 osGetRegionBufCount(void*); +extern s32 osGetRegionBufSize(void*); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* _REGION_H_ */ diff --git a/lib/hackerlibultra/include/PR/rmon.h b/lib/hackerlibultra/include/PR/rmon.h new file mode 100644 index 00000000..64f16401 --- /dev/null +++ b/lib/hackerlibultra/include/PR/rmon.h @@ -0,0 +1,39 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.6 $ + * $Date: 1997/02/11 08:30:08 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/rmon.h,v $ + * + **************************************************************************/ + +#ifndef _RMON_H_ +#define _RMON_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#define RMON_DBG_BUF_SIZE 2048 +#define RMON_STACKSIZE 0x1000 + +extern void rmonMain(void*); +extern void rmonPrintf(const char*, ...); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_OS_H */ diff --git a/lib/hackerlibultra/include/PR/sched.h b/lib/hackerlibultra/include/PR/sched.h new file mode 100644 index 00000000..59d7b688 --- /dev/null +++ b/lib/hackerlibultra/include/PR/sched.h @@ -0,0 +1,113 @@ +/*==================================================================== + * sched.h + * + * Synopsis: + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.7 $ + * $Date: 1997/02/11 08:32:02 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/sched.h,v $ + * + **************************************************************************/ + +#ifndef __sched__ +#define __sched__ + +#include + +#define OS_SC_STACKSIZE 0x2000 + +#define OS_SC_RETRACE_MSG 1 +#define OS_SC_DONE_MSG 2 +#define OS_SC_RDP_DONE_MSG 3 +#define OS_SC_PRE_NMI_MSG 4 +#define OS_SC_LAST_MSG 4 /* this should have highest number */ +#define OS_SC_MAX_MESGS 8 + +typedef struct { + short type; + char misc[30]; +} OSScMsg; + +typedef struct OSScTask_s { + struct OSScTask_s* next; /* note: this must be first */ + u32 state; + u32 flags; + void* framebuffer; /* used by graphics tasks */ + + OSTask list; + OSMesgQueue* msgQ; + OSMesg msg; +#ifndef _FINALROM /* all #ifdef items should */ + OSTime startTime; /* remain at the end!!, or */ + OSTime totalTime; /* possible conflict if */ +#endif /* FINALROM library used with */ +} OSScTask; /* non FINALROM code */ + +/* + * OSScTask flags: + */ +#define OS_SC_NEEDS_RDP 0x0001 /* uses the RDP */ +#define OS_SC_NEEDS_RSP 0x0002 /* uses the RSP */ +#define OS_SC_DRAM_DLIST 0x0004 /* SP & DP communicate through DRAM */ +#define OS_SC_PARALLEL_TASK 0x0010 /* must be first gfx task on list */ +#define OS_SC_LAST_TASK 0x0020 /* last task in queue for frame */ +#define OS_SC_SWAPBUFFER 0x0040 /* swapbuffers when gfx task done */ + +#define OS_SC_RCP_MASK 0x0003 /* mask for needs bits */ +#define OS_SC_TYPE_MASK 0x0007 /* complete type mask */ +/* + * OSScClient: + * + * Data structure used by threads that wish to communicate to the + * scheduling thread + * + */ +typedef struct SCClient_s { + struct SCClient_s* next; /* next client in the list */ + OSMesgQueue* msgQ; /* where to send the frame msg */ +} OSScClient; + +typedef struct { + OSScMsg retraceMsg; + OSScMsg prenmiMsg; + OSMesgQueue interruptQ; + OSMesg intBuf[OS_SC_MAX_MESGS]; + OSMesgQueue cmdQ; + OSMesg cmdMsgBuf[OS_SC_MAX_MESGS]; + OSThread thread; + OSScClient* clientList; + OSScTask* audioListHead; + OSScTask* gfxListHead; + OSScTask* audioListTail; + OSScTask* gfxListTail; + OSScTask* curRSPTask; + OSScTask* curRDPTask; + u32 frameCount; + s32 doAudio; +} OSSched; + +void osCreateScheduler(OSSched* s, void* stack, OSPri priority, u8 mode, u8 numFields); +void osScAddClient(OSSched* s, OSScClient* c, OSMesgQueue* msgQ); +void osScRemoveClient(OSSched* s, OSScClient* c); +OSMesgQueue* osScGetCmdQ(OSSched* s); + +#endif diff --git a/lib/hackerlibultra/include/PR/sp.h b/lib/hackerlibultra/include/PR/sp.h new file mode 100644 index 00000000..3a315cf3 --- /dev/null +++ b/lib/hackerlibultra/include/PR/sp.h @@ -0,0 +1,196 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * Sprite library include file + * + * $Revision: 1.16 $ + * $Date: 1998/04/17 05:03:46 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/sp.h,v $ + * + **************************************************************************/ + +#ifndef _SP_H_ +#define _SP_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include +#include + +struct bitmap { + s16 width; /* Size across to draw in texels */ + /* Done if width = 0 */ + + s16 width_img; /* Size across of bitmap in texels */ + /* Done if width = 0 */ + + s16 s; /* Horizontal offset into bitmap */ + /* if (s > width), then load only! */ + + s16 t; /* Vertical offset into base */ + + void* buf; /* Pointer to bitmap data */ + /* Don't re-load if new buf */ + /* is the same as the old one */ + /* Skip if NULL */ + + s16 actualHeight; /* True Height of this bitmap piece */ + + s16 LUToffset; /* LUT base index */ +}; + +typedef struct bitmap Bitmap; + +struct sprite { + s16 x, y; /* Target position */ + + s16 width, height; /* Target size */ + + f32 scalex, scaley; /* Texel to Pixel scale factor */ + + s16 expx, expy; /* Explosion spacing */ + + u16 attr; /* Attribute Flags */ + s16 zdepth; /* Z Depth */ + + u8 red; /* Red component */ + u8 green; /* Green component */ + u8 blue; /* Blue component */ + u8 alpha; /* Alpha component */ + + s16 startTLUT; /* Lookup Table Entry Starting index */ + s16 nTLUT; /* Total number of Lookup Table Entries */ + + int* LUT; /* Pointer to Lookup Table */ + + s16 istart; /* Starting bitmap index */ + s16 istep; /* Bitmaps index step (see SP_INCY) */ + /* if 0, then variable width bitmaps */ + + s16 nbitmaps; /* Total number of bitmaps */ + s16 ndisplist; /* Total number of display-list words */ + + s16 bmheight; /* Bitmap Texel height (Used) */ + s16 bmHreal; /* Bitmap Texel height (Real) */ + u8 bmfmt; /* Bitmap Format */ + u8 bmsiz; /* Bitmap Texel Size */ + + Bitmap* bitmap; /* Pointer to first bitmap */ + + Gfx* rsp_dl; /* Pointer to RSP display list */ + + Gfx* rsp_dl_next; /* Pointer to next RSP display entry */ + + s16 frac_s, /* Fractional Texture offsets */ + frac_t; /* These have 5 fraction bits */ +}; + +typedef struct sprite Sprite; + +/* + * DANGER! + * This is bad programming. Where the *heck* do these numbers come + * from? + * + * They are obviously 'maximums' from the sprite library, but since + * the sprite library is built on top of gbi.h, which includes macros + * that decode into multiple macros, etc., it is nearly impossible to + * know what these maximums should be. + * + * Worse, there are some gbi macros (texture alignment mostly) that + * decode into *many* macros, so if we choose that as a maximum, we + * are wasting TONS of space... + * + * These numbers work for "reasonable" sprite library usage, and + * there is an assert() in the library to detect when they aren't + * enough. (use the debug version) + */ +#define DL_BM_OVERHEAD (12) +#define DL_SPRITE_OVERHEAD (24) + +#define NUM_DL(nb) ((nb) * DL_BM_OVERHEAD + DL_SPRITE_OVERHEAD) + +/* + * Misc constants + */ + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +/* + * For sprite->attr + */ + +#define SP_TRANSPARENT 0x00000001 +#define SP_CUTOUT 0x00000002 +#define SP_HIDDEN 0x00000004 +#define SP_Z 0x00000008 +#define SP_SCALE 0x00000010 +#define SP_FASTCOPY 0x00000020 +#define SP_OVERLAP 0x00000040 +#define SP_TEXSHIFT 0x00000080 +#define SP_FRACPOS 0x00000100 +#define SP_TEXSHUF 0x00000200 +#define SP_EXTERN 0x00000400 + +/* + * Function wrapper + */ +#if defined(F3DEX_GBI_2) +#define spMove spX2Move +#define spSetZ spX2SetZ +#define spScissor spX2Scissor +#define spDraw spX2Draw +#define spInit spX2Init +#define spFinish spX2Finish +#elif defined(F3DEX_GBI) +#define spMove spXMove +#define spSetZ spXSetZ +#define spScissor spXScissor +#define spDraw spXDraw +#define spInit spXInit +#define spFinish spXFinish +#endif + +/* + * Function prototypes + */ + +void spSetAttribute(Sprite* sp, s32 attr); +void spClearAttribute(Sprite* sp, s32 attr); +void spMove(Sprite* sp, s32 x, s32 y); +void spScale(Sprite* sp, f32 sx, f32 sy); +void spSetZ(Sprite* sp, s32 z); +void spColor(Sprite* sp, u8 red, u8 green, u8 blue, u8 alpha); +Gfx* spDraw(Sprite* sp); +void spInit(Gfx** glistp); +void spScissor(s32 xmin, s32 xmax, s32 ymin, s32 ymax); +void spFinish(Gfx** glistp); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* _SP_H_ */ diff --git a/lib/hackerlibultra/include/PR/sptask.h b/lib/hackerlibultra/include/PR/sptask.h new file mode 100644 index 00000000..74e0fcab --- /dev/null +++ b/lib/hackerlibultra/include/PR/sptask.h @@ -0,0 +1,197 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.9 $ + * $Date: 1998/03/05 06:40:29 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/sptask.h,v $ + * + **************************************************************************/ + +#ifndef _SPTASK_H_ +#define _SPTASK_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Type definitions + * + */ + +/* + * Task List Structure. + * + * Things an app might pass to the SP via the task list. + * Not every task ucode would need/use every field, but + * + * - type (audio, gfx, video, ...) + * - flags + * - wait for DP to drain before running new task + * - SEE BIT DEFINITIONS UNDER "Task Flags field" + * - pointer to boot ucode + * - size of boot ucode + * - pointer to ucode + * - size of ucode + * - pointer to initial DMEM data + * - size of initial DMEM data + * - pointer to DRAM stack + * - size of DRAM stack (max) + * - pointer to output buffer + * - pointer to store output buffer length + * - generic data pointer (for display list, etc.) + * - generic data length (for display list, etc.) + * - pointer to buffer where to store saved DMEM (in yield case) + * - size of buffer to store saved DMEM. + * + * IMPORTANT!!! Watch alignment issues. + * + * IMPORTANT!!! Watch data cache issues. The RCP may write data into the + * dram_stack, output_buff, output_buff_size, and the yield_data_ptr areas. + * These buffers should be cache aligned and use the entire line (16 bytes) to + * avoid corruption by writebacks by the CPU (cache tearing). + * + * IMPORTANT!!! all addresses are virtual addresses. Library does + * any necessary translation. + * + */ +typedef struct { + u32 type; + u32 flags; + + u64* ucode_boot; + u32 ucode_boot_size; + + u64* ucode; + u32 ucode_size; + + u64* ucode_data; + u32 ucode_data_size; + + u64* dram_stack; + u32 dram_stack_size; + + u64* output_buff; + u64* output_buff_size; + + u64* data_ptr; + u32 data_size; + + u64* yield_data_ptr; + u32 yield_data_size; + +} OSTask_t; + +typedef union { + OSTask_t t; + long long int force_structure_alignment; +} OSTask; + +typedef u32 OSYieldResult; + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_ASSEMBLY + +/* + * For the RSP ucode: + * offsets into the task structure + */ + +#include + +#endif + +/* + * Task Flags field + */ +#define OS_TASK_YIELDED 0x0001 +#define OS_TASK_DP_WAIT 0x0002 +#define OS_TASK_LOADABLE 0x0004 +#define OS_TASK_SP_ONLY 0x0008 +#define OS_TASK_USR0 0x0010 +#define OS_TASK_USR1 0x0020 +#define OS_TASK_USR2 0x0040 +#define OS_TASK_USR3 0x0080 + +/* + * Size of Yield buffer. The taskHdrPtr->t.yield_data_ptr must point to a + * buffer of this size. (The size is in bytes). ONLY If the task will NEVER + * yield it may be a null pointer. The buffer must be aligned to a 64 bit + * boundary. The taskHdrPtr->t.yield_data_ptr must be set to point to the + * buffer BEFORE the task is started. + */ +#if (defined(F3DEX_GBI) || defined(F3DLP_GBI) || defined(F3DEX_GBI_2)) +#define OS_YIELD_DATA_SIZE 0xc00 +#else +#define OS_YIELD_DATA_SIZE 0x900 +#endif +#define OS_YIELD_AUDIO_SIZE 0x400 + +/************************************************************************** + * + * Global definitions + * + */ + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* + * this macro simulates atomic action. + */ +#define osSpTaskStart(tp) \ + { \ + osSpTaskLoad((tp)); \ + osSpTaskStartGo((tp)); \ + } + +/************************************************************************** + * + * Extern variables + * + */ + +/************************************************************************** + * + * Function prototypes + * + */ + +/* + * break this up into two steps for debugging. + */ +extern void osSpTaskLoad(OSTask* tp); +extern void osSpTaskStartGo(OSTask* tp); + +extern void osSpTaskYield(void); +extern OSYieldResult osSpTaskYielded(OSTask* tp); + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_SPTASK_H */ diff --git a/lib/hackerlibultra/include/PR/ucode.h b/lib/hackerlibultra/include/PR/ucode.h new file mode 100644 index 00000000..69a069b8 --- /dev/null +++ b/lib/hackerlibultra/include/PR/ucode.h @@ -0,0 +1,191 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.15 $ + * $Date: 1998/03/31 07:58:57 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ucode.h,v $ + * + **************************************************************************/ + +#ifndef _UCODE_H_ +#define _UCODE_H_ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +/************************************************************************** + * + * Macro definitions + * + */ + +/* + * This is the recommended size of the SP DRAM stack area, used + * by the graphics ucode. This stack is used primarily for the + * matrix stack, so it needs to be AT LEAST (10 * 64bytes) in size. + */ +#define SP_DRAM_STACK_SIZE8 (1024) +#define SP_DRAM_STACK_SIZE64 (SP_DRAM_STACK_SIZE8 >> 3) + +/* + * This is the size of the IMEM, which is also the size of the + * graphics microcode. (other ucode might be less) + * This value is used in apps to tell the OS how much ucode to + * load. + */ +#define SP_UCODE_SIZE 4096 + +/* + * This is 1/2 the size of DMEM, which is the maximum amount of + * initialized DMEM data any of the ucode tasks need to start up. + * This value is dependent on all of the task ucodes, and is therefore + * fixed per release. + */ +#define SP_UCODE_DATA_SIZE 2048 + +/************************************************************************** + * + * Extern variables + * + */ + +/* + * Symbols generated by "rsp2elf", included by "makerom" that indicate + * the location and size of the SP microcode objects. The ucode objects + * are loaded as part of the codesegment (arbitrary, could do other + * ways) + * + */ + +/* standard boot ucode: */ +extern long long int rspbootTextStart[], rspbootTextEnd[]; + +/* standard 3D ucode: */ +extern long long int gspFast3DTextStart[], gspFast3DTextEnd[]; +extern long long int gspFast3DDataStart[], gspFast3DDataEnd[]; + +/* 3D ucode with output to DRAM: */ +extern long long int gspFast3D_dramTextStart[], gspFast3D_dramTextEnd[]; +extern long long int gspFast3D_dramDataStart[], gspFast3D_dramDataEnd[]; + +/* 3D ucode with output through DRAM FIFO to RDP: */ +extern long long int gspFast3D_fifoTextStart[], gspFast3D_fifoTextEnd[]; +extern long long int gspFast3D_fifoDataStart[], gspFast3D_fifoDataEnd[]; + +/* 3D ucode without nearclip: */ +extern long long int gspF3DNoNTextStart[], gspF3DNoNTextEnd[]; +extern long long int gspF3DNoNDataStart[], gspF3DNoNDataEnd[]; + +/* 3D ucode without nearclip with output to DRAM: */ +extern long long int gspF3DNoN_dramTextStart[]; +extern long long int gspF3DNoN_dramTextEnd[]; +extern long long int gspF3DNoN_dramDataStart[]; +extern long long int gspF3DNoN_dramDataEnd[]; + +/* 3D ucode without nearclip with output through DRAM FIFO to RDP: */ +extern long long int gspF3DNoN_fifoTextStart[]; +extern long long int gspF3DNoN_fifoTextEnd[]; +extern long long int gspF3DNoN_fifoDataStart[]; +extern long long int gspF3DNoN_fifoDataEnd[]; + +/* 3D line ucode: */ +extern long long int gspLine3DTextStart[], gspLine3DTextEnd[]; +extern long long int gspLine3DDataStart[], gspLine3DDataEnd[]; + +/* 3D line ucode with output to DRAM: */ +extern long long int gspLine3D_dramTextStart[], gspLine3D_dramTextEnd[]; +extern long long int gspLine3D_dramDataStart[], gspLine3D_dramDataEnd[]; + +/* 3D line ucode with output through DRAM FIFO to RDP: */ +extern long long int gspLine3D_fifoTextStart[], gspLine3D_fifoTextEnd[]; +extern long long int gspLine3D_fifoDataStart[], gspLine3D_fifoDataEnd[]; + +/* 2D sprite ucode: */ +extern long long int gspSprite2DTextStart[], gspSprite2DTextEnd[]; +extern long long int gspSprite2DDataStart[], gspSprite2DDataEnd[]; + +/* 2D sprite ucode with output to DRAM: */ +extern long long int gspSprite2D_dramTextStart[], gspSprite2D_dramTextEnd[]; +extern long long int gspSprite2D_dramDataStart[], gspSprite2D_dramDataEnd[]; + +/* 2D sprite ucode with output through DRAM FIFO to RDP: */ +extern long long int gspSprite2D_fifoTextStart[], gspSprite2D_fifoTextEnd[]; +extern long long int gspSprite2D_fifoDataStart[], gspSprite2D_fifoDataEnd[]; + +/* basic audio ucode: */ +extern long long int aspMainTextStart[], aspMainTextEnd[]; +extern long long int aspMainDataStart[], aspMainDataEnd[]; + +/*========== F3DEX/F3DLX/F3DLP/L3DEX ==========*/ +/* FIFO version only */ +extern long long int gspF3DEX_fifoTextStart[], gspF3DEX_fifoTextEnd[]; +extern long long int gspF3DEX_fifoDataStart[], gspF3DEX_fifoDataEnd[]; +extern long long int gspF3DEX_NoN_fifoTextStart[], gspF3DEX_NoN_fifoTextEnd[]; +extern long long int gspF3DEX_NoN_fifoDataStart[], gspF3DEX_NoN_fifoDataEnd[]; + +extern long long int gspF3DLX_fifoTextStart[], gspF3DLX_fifoTextEnd[]; +extern long long int gspF3DLX_fifoDataStart[], gspF3DLX_fifoDataEnd[]; +extern long long int gspF3DLX_NoN_fifoTextStart[], gspF3DLX_NoN_fifoTextEnd[]; +extern long long int gspF3DLX_NoN_fifoDataStart[], gspF3DLX_NoN_fifoDataEnd[]; +extern long long int gspF3DLX_Rej_fifoTextStart[], gspF3DLX_Rej_fifoTextEnd[]; +extern long long int gspF3DLX_Rej_fifoDataStart[], gspF3DLX_Rej_fifoDataEnd[]; + +extern long long int gspF3DLP_Rej_fifoTextStart[], gspF3DLP_Rej_fifoTextEnd[]; +extern long long int gspF3DLP_Rej_fifoDataStart[], gspF3DLP_Rej_fifoDataEnd[]; +extern long long int gspL3DEX_fifoTextStart[], gspL3DEX_fifoTextEnd[]; +extern long long int gspL3DEX_fifoDataStart[], gspL3DEX_fifoDataEnd[]; + +/*========== F3DEX2/F3DLX2/F3DLP2/L3DEX2 ==========*/ +/* FIFO version */ +extern long long int gspF3DEX2_fifoTextStart[], gspF3DEX2_fifoTextEnd[]; +extern long long int gspF3DEX2_fifoDataStart[], gspF3DEX2_fifoDataEnd[]; +extern long long int gspF3DEX2_NoN_fifoTextStart[], gspF3DEX2_NoN_fifoTextEnd[]; +extern long long int gspF3DEX2_NoN_fifoDataStart[], gspF3DEX2_NoN_fifoDataEnd[]; +extern long long int gspF3DEX2_Rej_fifoTextStart[], gspF3DEX2_Rej_fifoTextEnd[]; +extern long long int gspF3DEX2_Rej_fifoDataStart[], gspF3DEX2_Rej_fifoDataEnd[]; +extern long long int gspF3DLX2_Rej_fifoTextStart[], gspF3DLX2_Rej_fifoTextEnd[]; +extern long long int gspF3DLX2_Rej_fifoDataStart[], gspF3DLX2_Rej_fifoDataEnd[]; +extern long long int gspL3DEX2_fifoTextStart[], gspL3DEX2_fifoTextEnd[]; +extern long long int gspL3DEX2_fifoDataStart[], gspL3DEX2_fifoDataEnd[]; + +/* XBUS version */ +extern long long int gspF3DEX2_xbusTextStart[], gspF3DEX2_xbusTextEnd[]; +extern long long int gspF3DEX2_xbusDataStart[], gspF3DEX2_xbusDataEnd[]; +extern long long int gspF3DEX2_NoN_xbusTextStart[], gspF3DEX2_NoN_xbusTextEnd[]; +extern long long int gspF3DEX2_NoN_xbusDataStart[], gspF3DEX2_NoN_xbusDataEnd[]; +extern long long int gspF3DEX2_Rej_xbusTextStart[], gspF3DEX2_Rej_xbusTextEnd[]; +extern long long int gspF3DEX2_Rej_xbusDataStart[], gspF3DEX2_Rej_xbusDataEnd[]; +extern long long int gspF3DLX2_Rej_xbusTextStart[], gspF3DLX2_Rej_xbusTextEnd[]; +extern long long int gspF3DLX2_Rej_xbusDataStart[], gspF3DLX2_Rej_xbusDataEnd[]; +extern long long int gspL3DEX2_xbusTextStart[], gspL3DEX2_xbusTextEnd[]; +extern long long int gspL3DEX2_xbusDataStart[], gspL3DEX2_xbusDataEnd[]; + +/************************************************************************** + * + * Function prototypes + * + */ + +#endif /* _LANGUAGE_C */ + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* !_UCODE_H */ diff --git a/lib/hackerlibultra/include/PR/ultraerror.h b/lib/hackerlibultra/include/PR/ultraerror.h new file mode 100644 index 00000000..88cc1c12 --- /dev/null +++ b/lib/hackerlibultra/include/PR/ultraerror.h @@ -0,0 +1,165 @@ +/*==================================================================== + * ultraerror.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.27 $ + * $Date: 1999/07/14 02:44:00 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultraerror.h,v $ + * + **************************************************************************/ + +#ifndef __ULTRAERROR_H__ +#define __ULTRAERROR_H__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include "ultratypes.h" + +#define OS_ERROR_FMT "/usr/lib/PR/error.fmt" +#define OS_ERROR_MAGIC 0x6b617479 + +/* OS error codes */ + +#define ERR_OSCREATETHREAD_SP 1 +#define ERR_OSCREATETHREAD_PRI 2 +#define ERR_OSSTARTTHREAD 3 +#define ERR_OSSETTHREADPRI 4 +#define ERR_OSCREATEMESGQUEUE 5 +#define ERR_OSSENDMESG 6 +#define ERR_OSJAMMESG 7 +#define ERR_OSRECVMESG 8 +#define ERR_OSSETEVENTMESG 9 +#define ERR_OSMAPTLB_INDEX 10 +#define ERR_OSMAPTLB_ASID 11 +#define ERR_OSUNMAPTLB 12 +#define ERR_OSSETTLBASID 13 +#define ERR_OSAISETFREQUENCY 14 +#define ERR_OSAISETNEXTBUFFER_ADDR 15 +#define ERR_OSAISETNEXTBUFFER_SIZE 16 +#define ERR_OSDPSETNEXTBUFFER_ADDR 17 +#define ERR_OSDPSETNEXTBUFFER_SIZE 18 +#define ERR_OSPIRAWREADIO 19 +#define ERR_OSPIRAWWRITEIO 20 +#define ERR_OSPIRAWSTARTDMA_DIR 21 +#define ERR_OSPIRAWSTARTDMA_DEVADDR 22 +#define ERR_OSPIRAWSTARTDMA_ADDR 23 +#define ERR_OSPIRAWSTARTDMA_SIZE 24 +#define ERR_OSPIRAWSTARTDMA_RANGE 25 +#define ERR_OSPIREADIO 26 +#define ERR_OSPIWRITEIO 27 +#define ERR_OSPISTARTDMA_PIMGR 28 +#define ERR_OSPISTARTDMA_PRI 29 +#define ERR_OSPISTARTDMA_DIR 30 +#define ERR_OSPISTARTDMA_DEVADDR 31 +#define ERR_OSPISTARTDMA_ADDR 32 +#define ERR_OSPISTARTDMA_SIZE 33 +#define ERR_OSPISTARTDMA_RANGE 34 +#define ERR_OSCREATEPIMANAGER 35 +#define ERR_OSVIGETCURRENTMODE 36 +#define ERR_OSVIGETCURRENTFRAMEBUFFER 37 +#define ERR_OSVIGETNEXTFRAMEBUFFER 38 +#define ERR_OSVISETXSCALE_VALUE 39 +#define ERR_OSVISETXSCALE_VIMGR 40 +#define ERR_OSVISETYSCALE_VALUE 41 +#define ERR_OSVISETYSCALE_VIMGR 42 +#define ERR_OSVISETSPECIAL_VALUE 43 +#define ERR_OSVISETSPECIAL_VIMGR 44 +#define ERR_OSVISETMODE 45 +#define ERR_OSVISETEVENT 46 +#define ERR_OSVISWAPBUFFER_ADDR 47 +#define ERR_OSVISWAPBUFFER_VIMGR 48 +#define ERR_OSCREATEVIMANAGER 49 +#define ERR_OSCREATEREGION_ALIGN 50 +#define ERR_OSCREATEREGION_SIZE 51 +#define ERR_OSMALLOC 52 +#define ERR_OSFREE_REGION 53 +#define ERR_OSFREE_ADDR 54 +#define ERR_OSGETREGIONBUFCOUNT 55 +#define ERR_OSGETREGIONBUFSIZE 56 +#define ERR_OSSPTASKLOAD_DRAM 57 +#define ERR_OSSPTASKLOAD_OUT 58 +#define ERR_OSSPTASKLOAD_OUTSIZE 59 +#define ERR_OSSPTASKLOAD_YIELD 60 +#define ERR_OSPROFILEINIT_STR 61 +#define ERR_OSPROFILEINIT_CNT 62 +#define ERR_OSPROFILEINIT_ALN 63 +#define ERR_OSPROFILEINIT_ORD 64 +#define ERR_OSPROFILEINIT_SIZ 65 +#define ERR_OSPROFILESTART_TIME 66 +#define ERR_OSPROFILESTART_FLAG 67 +#define ERR_OSPROFILESTOP_FLAG 68 +#define ERR_OSPROFILESTOP_TIMER 69 +#define ERR_OSREADHOST_ADDR 70 +#define ERR_OSREADHOST_SIZE 71 +#define ERR_OSWRITEHOST_ADDR 72 +#define ERR_OSWRITEHOST_SIZE 73 +#define ERR_OSGETTIME 74 +#define ERR_OSSETTIME 75 +#define ERR_OSSETTIMER 76 +#define ERR_OSSTOPTIMER 77 +#define ERR_ALSEQP_NO_SOUND 100 +#define ERR_ALSEQP_NO_VOICE 101 +#define ERR_ALSEQP_MAP_VOICE 102 +#define ERR_ALSEQP_OFF_VOICE 103 +#define ERR_ALSEQP_POLY_VOICE 104 +#define ERR_ALSNDP_NO_VOICE 105 +#define ERR_ALSYN_NO_UPDATE 106 +#define ERR_ALSNDPDEALLOCATE 107 +#define ERR_ALSNDPDELETE 108 +#define ERR_ALSNDPPLAY 109 +#define ERR_ALSNDPSETSOUND 110 +#define ERR_ALSNDPSETPRIORITY 111 +#define ERR_ALSNDPSETPAR 112 +#define ERR_ALBNKFNEW 113 +#define ERR_ALSEQNOTMIDI 114 +#define ERR_ALSEQNOTMIDI0 115 +#define ERR_ALSEQNUMTRACKS 116 +#define ERR_ALSEQTIME 117 +#define ERR_ALSEQTRACKHDR 118 +#define ERR_ALSEQSYSEX 119 +#define ERR_ALSEQMETA 120 +#define ERR_ALSEQPINVALIDPROG 121 +#define ERR_ALSEQPUNKNOWNMIDI 122 +#define ERR_ALSEQPUNMAP 123 +#define ERR_ALEVENTNOFREE 124 +#define ERR_ALHEAPNOFREE 125 +#define ERR_ALHEAPCORRUPT 126 +#define ERR_ALHEAPFIRSTBLOCK 127 +#define ERR_ALCSEQZEROSTATUS 128 +#define ERR_ALCSEQZEROVEL 129 +#define ERR_ALCSPVNOTFREE 130 +#define ERR_ALSEQOVERRUN 131 +#define ERR_OSAISETNEXTBUFFER_ENDADDR 132 +#define ERR_ALMODDELAYOVERFLOW 133 + +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) +typedef void (*OSErrorHandler)(s16, s16, ...); + +OSErrorHandler osSetErrorHandler(OSErrorHandler); +#endif + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif /* __ULTRAERROR_H__ */ diff --git a/lib/hackerlibultra/include/PR/ultralog.h b/lib/hackerlibultra/include/PR/ultralog.h new file mode 100644 index 00000000..ad197054 --- /dev/null +++ b/lib/hackerlibultra/include/PR/ultralog.h @@ -0,0 +1,74 @@ +/*==================================================================== + * ultralog.h + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/************************************************************************** + * + * $Revision: 1.6 $ + * $Date: 1997/02/11 08:39:05 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultralog.h,v $ + * + **************************************************************************/ + +#ifndef __log__ +#define __log__ + +#ifdef _LANGUAGE_C_PLUS_PLUS +extern "C" { +#endif + +#include + +#define OS_LOG_MAX_ARGS 16 +#define OS_LOG_MAGIC 0x20736a73 +#define OS_LOG_FLOAT(x) (*(int*)&(x)) +#define OS_LOG_VERSION 1 + +typedef struct { + u32 magic; /* log identifier */ + u32 len; /* length of log data + log structure */ + u32* base; /* starting addr array */ + s32 startCount; /* read offset from dataBase */ + s32 writeOffset; /* write offset from dataBase */ +} OSLog; + +typedef struct { + u32 magic; + u32 timeStamp; + u16 argCount; + u16 eventID; +} OSLogItem; + +typedef struct { + u32 magic; /* log identifier */ + u32 version; /* 1 */ +} OSLogFileHdr; + +void osCreateLog(OSLog* log, u32* base, s32 len); +void osLogEvent(OSLog* log, s16 code, s16 numArgs, ...); +void osFlushLog(OSLog* log); +u32 osLogFloat(f32); + +extern void osDelay(int count); + +#ifdef _LANGUAGE_C_PLUS_PLUS +} +#endif + +#endif diff --git a/lib/hackerlibultra/include/PR/ultratypes.h b/lib/hackerlibultra/include/PR/ultratypes.h new file mode 100644 index 00000000..0e86c914 --- /dev/null +++ b/lib/hackerlibultra/include/PR/ultratypes.h @@ -0,0 +1,81 @@ +#ifndef _ULTRATYPES_H_ +#define _ULTRATYPES_H_ + +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/************************************************************************* + * + * File: ultratypes.h + * + * This file contains various types used in Ultra64 interfaces. + * + * $Revision: 1.6 $ + * $Date: 1997/12/17 04:02:06 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultratypes.h,v $ + * + **************************************************************************/ + +/********************************************************************** + * General data types for R4300 + */ +#if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) + +typedef unsigned char u8; /* unsigned 8-bit */ +typedef unsigned short u16; /* unsigned 16-bit */ +typedef unsigned long u32; /* unsigned 32-bit */ +typedef unsigned long long u64; /* unsigned 64-bit */ + +typedef signed char s8; /* signed 8-bit */ +typedef short s16; /* signed 16-bit */ +typedef long s32; /* signed 32-bit */ +typedef long long s64; /* signed 64-bit */ + +typedef volatile unsigned char vu8; /* unsigned 8-bit */ +typedef volatile unsigned short vu16; /* unsigned 16-bit */ +typedef volatile unsigned long vu32; /* unsigned 32-bit */ +typedef volatile unsigned long long vu64; /* unsigned 64-bit */ + +typedef volatile signed char vs8; /* signed 8-bit */ +typedef volatile short vs16; /* signed 16-bit */ +typedef volatile long vs32; /* signed 32-bit */ +typedef volatile long long vs64; /* signed 64-bit */ + +typedef float f32; /* single prec floating point */ +typedef double f64; /* double prec floating point */ + +#if !defined(_SIZE_T) && !defined(_SIZE_T_) && !defined(_SIZE_T_DEF) +#define _SIZE_T +#define _SIZE_T_DEF /* exeGCC size_t define label */ +#if (_MIPS_SZLONG == 32) +typedef unsigned int size_t; +#endif +#if (_MIPS_SZLONG == 64) +typedef unsigned long size_t; +#endif +#endif + +#endif /* _LANGUAGE_C */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* _ULTRATYPES_H_ */ diff --git a/lib/hackerlibultra/include/PRinternal/controller.h b/lib/hackerlibultra/include/PRinternal/controller.h new file mode 100644 index 00000000..079c0537 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/controller.h @@ -0,0 +1,277 @@ +#ifndef _CONTROLLER_H +#define _CONTROLLER_H + +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "PR/rcp.h" + +#include "PRinternal/macros.h" + +#define CHNL_ERR(format) (((format).rxsize & CHNL_ERR_MASK) >> 4) + +typedef struct { + /* 0x0 */ u32 ramarray[15]; + /* 0x3C */ u32 pifstatus; +} OSPifRam ALIGNED(0x10); + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u16 button; + /* 0x6 */ s8 stick_x; + /* 0x7 */ s8 stick_y; +} __OSContReadFormat; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 typeh; + /* 0x5 */ u8 typel; + /* 0x6 */ u8 status; + /* 0x7 */ u8 dummy1; +} __OSContRequesFormat; + +typedef struct { + /* 0x0 */ u8 txsize; + /* 0x1 */ u8 rxsize; + /* 0x2 */ u8 cmd; + /* 0x3 */ u8 typeh; + /* 0x4 */ u8 typel; + /* 0x5 */ u8 status; +} __OSContRequesFormatShort; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; +#if BUILD_VERSION >= VERSION_J + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; +#else + /* 0x4 */ u16 address; +#endif + /* 0x6 */ u8 data[BLOCKSIZE]; + /* 0x26 */ u8 datacrc; +} __OSContRamReadFormat; + +typedef union { + /* 0x0 */ struct { + /* 0x0 */ u8 bank; + /* 0x1 */ u8 page; + } inode_t; + /* 0x0 */ u16 ipage; +} __OSInodeUnit; + +typedef struct { + /* 0x0 */ u32 game_code; + /* 0x4 */ u16 company_code; + /* 0x6 */ __OSInodeUnit start_page; + /* 0x8 */ u8 status; + /* 0x9 */ s8 reserved; + /* 0xA */ u16 data_sum; + /* 0xC */ u8 ext_name[PFS_FILE_EXT_LEN]; + /* 0x10 */ u8 game_name[PFS_FILE_NAME_LEN]; +} __OSDir; + +typedef struct { + /* 0x0 */ __OSInodeUnit inode_page[128]; +} __OSInode; + +typedef struct { + /* 0x0 */ u32 repaired; + /* 0x4 */ u32 random; + /* 0x8 */ u64 serial_mid; + /* 0x10 */ u64 serial_low; + /* 0x18 */ u16 deviceid; + /* 0x1A */ u8 banks; + /* 0x1B */ u8 version; + /* 0x1C */ u16 checksum; + /* 0x1E */ u16 inverted_checksum; +} __OSPackId; + +typedef struct { + /* 0x0 */ u8 txsize; + /* 0x1 */ u8 rxsize; + /* 0x2 */ u8 cmd; + /* 0x3 */ u8 address; + /* 0x4 */ u8 data[EEPROM_BLOCK_SIZE]; +} __OSContEepromFormat; + +// Joybus commands +// from: http://en64.shoutwiki.com/wiki/SI_Registers_Detailed#CONT_CMD_Usage +#define CONT_CMD_REQUEST_STATUS 0 +#define CONT_CMD_READ_BUTTON 1 +#define CONT_CMD_READ_PAK 2 +#define CONT_CMD_WRITE_PAK 3 +#define CONT_CMD_READ_EEPROM 4 +#define CONT_CMD_WRITE_EEPROM 5 +#define CONT_CMD_READ36_VOICE 9 +#define CONT_CMD_WRITE20_VOICE 10 +#define CONT_CMD_READ2_VOICE 11 +#define CONT_CMD_WRITE4_VOICE 12 +#define CONT_CMD_SWRITE_VOICE 13 +#define CONT_CMD_CHANNEL_RESET 0xFD +#define CONT_CMD_RESET 0xFF + +// Bytes transmitted for each joybus command +#define CONT_CMD_REQUEST_STATUS_TX 1 +#define CONT_CMD_READ_BUTTON_TX 1 +#define CONT_CMD_READ_PAK_TX 3 +#define CONT_CMD_WRITE_PAK_TX 35 +#define CONT_CMD_READ_EEPROM_TX 2 +#define CONT_CMD_WRITE_EEPROM_TX 10 +#define CONT_CMD_READ36_VOICE_TX 3 +#define CONT_CMD_WRITE20_VOICE_TX 23 +#define CONT_CMD_READ2_VOICE_TX 3 +#define CONT_CMD_WRITE4_VOICE_TX 7 +#define CONT_CMD_SWRITE_VOICE_TX 3 +#define CONT_CMD_RESET_TX 1 + +// Bytes received for each joybus command +#define CONT_CMD_REQUEST_STATUS_RX 3 +#define CONT_CMD_READ_BUTTON_RX 4 +#define CONT_CMD_READ_PAK_RX 33 +#define CONT_CMD_WRITE_PAK_RX 1 +#define CONT_CMD_READ_EEPROM_RX 8 +#define CONT_CMD_WRITE_EEPROM_RX 1 +#define CONT_CMD_READ36_VOICE_RX 37 +#define CONT_CMD_WRITE20_VOICE_RX 1 +#define CONT_CMD_READ2_VOICE_RX 3 +#define CONT_CMD_WRITE4_VOICE_RX 1 +#define CONT_CMD_SWRITE_VOICE_RX 1 +#define CONT_CMD_RESET_RX 3 + +#define CONT_CMD_NOP 0xff +#define CONT_CMD_END 0xfe // indicates end of a command +#define CONT_CMD_EXE 1 // set pif ram status byte to this to do a command + +#define DIR_STATUS_EMPTY 0 +#define DIR_STATUS_UNKNOWN 1 +#define DIR_STATUS_OCCUPIED 2 + +// Controller accessory addresses +// https://github.com/joeldipops/TransferBoy/blob/master/docs/TransferPakReference.md + +// Accesory detection +#define CONT_ADDR_DETECT 0x8000 +// Rumble +#define CONT_ADDR_RUMBLE 0xC000 +// Controller Pak +// Transfer Pak +#define CONT_ADDR_GB_POWER 0x8000 // Same as the detection address, but semantically different +#define CONT_ADDR_GB_BANK 0xA000 +#define CONT_ADDR_GB_STATUS 0xB000 + +// Addresses sent to controller accessories are in blocks, not bytes +#define CONT_BLOCKS(x) ((x) / BLOCKSIZE) + +// Block addresses of the above +#define CONT_BLOCK_DETECT CONT_BLOCKS(CONT_ADDR_DETECT) +#define CONT_BLOCK_RUMBLE CONT_BLOCKS(CONT_ADDR_RUMBLE) +#define CONT_BLOCK_GB_POWER CONT_BLOCKS(CONT_ADDR_GB_POWER) +#define CONT_BLOCK_GB_BANK CONT_BLOCKS(CONT_ADDR_GB_BANK) +#define CONT_BLOCK_GB_STATUS CONT_BLOCKS(CONT_ADDR_GB_STATUS) + +// Transfer pak + +#define GB_POWER_ON 0x84 +#define GB_POWER_OFF 0xFE + +typedef struct { + /* 0x0 */ __OSInode inode; + /* 0x100 */ u8 bank; + /* 0x101 */ u8 map[PFS_INODE_DIST_MAP]; +} __OSInodeCache; + +extern s32 __osEepStatus(OSMesgQueue*, OSContStatus*); +u16 __osSumcalc(u8* ptr, int length); +s32 __osIdCheckSum(u16* ptr, u16* csum, u16* icsum); +s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid); +s32 __osCheckPackId(OSPfs* pfs, __OSPackId* temp); +s32 __osGetId(OSPfs* pfs); +s32 __osCheckId(OSPfs* pfs); +s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank); +#if BUILD_VERSION >= VERSION_J +s32 __osPfsSelectBank(OSPfs* pfs, u8 bank); +#else +s32 __osPfsSelectBank(OSPfs* pfs); +#endif +s32 __osPfsDeclearPage(OSPfs* pfs, __OSInode* inode, int file_size_in_pages, int* first_page, u8 bank, int* decleared, + int* last_page); +#if BUILD_VERSION >= VERSION_J +s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u8 bank, __OSInodeUnit* last_page); +#else +s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u16* sum, u8 bank, __OSInodeUnit* last_page, + int flag); +#endif +s32 __osBlockSum(OSPfs* pfs, u8 page_no, u16* sum, u8 bank); +s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force); +void __osContGetInitData(u8* pattern, OSContStatus* data); +void __osPackRequestData(u8 cmd); +void __osPfsRequestData(u8 cmd); +void __osPfsGetInitData(u8* pattern, OSContStatus* data); +u8 __osContAddressCrc(u16 addr); +u8 __osContDataCrc(u8* data); +s32 __osPfsGetStatus(OSMesgQueue* queue, int channel); + +extern u8 __osContLastCmd; +extern OSTimer __osEepromTimer; +extern OSMesg __osEepromTimerMsg; +extern OSMesgQueue __osEepromTimerQ; +extern OSPifRam __osEepPifRam; +extern OSPifRam __osContPifRam; +extern OSPifRam __osPfsPifRam; +extern u8 __osMaxControllers; + +// some version of this almost certainly existed since there's plenty of times where it's used right +// before a return 0 +#define ERRCK(fn) \ + ret = fn; \ + if (ret != 0) \ + return ret + +#if BUILD_VERSION >= VERSION_J + +#define SELECT_BANK(pfs, bank) __osPfsSelectBank((pfs), (bank)) + +#define SET_ACTIVEBANK_TO_ZERO() \ + if (pfs->activebank != 0) { \ + ERRCK(__osPfsSelectBank(pfs, 0)); \ + } \ + (void)0 + +#else + +#define SELECT_BANK(pfs, bank) (pfs->activebank = (bank), __osPfsSelectBank((pfs))) + +#define SET_ACTIVEBANK_TO_ZERO() \ + if (pfs->activebank != 0) { \ + pfs->activebank = 0; \ + ERRCK(__osPfsSelectBank(pfs)); \ + } \ + (void)0 + +#endif + +#define PFS_CHECK_ID() \ + if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) \ + return PFS_ERR_NEW_PACK + +#define PFS_CHECK_STATUS() \ + if ((pfs->status & PFS_INITIALIZED) == 0) \ + return PFS_ERR_INVALID + +#define PFS_GET_STATUS() \ + __osSiGetAccess(); \ + ret = __osPfsGetStatus(queue, channel); \ + __osSiRelAccess(); \ + if (ret != 0) \ + return ret + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/controller_gbpak.h b/lib/hackerlibultra/include/PRinternal/controller_gbpak.h new file mode 100644 index 00000000..db98bd48 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/controller_gbpak.h @@ -0,0 +1,8 @@ +#ifndef _CONTROLLER_GBPAK_H +#define _CONTROLLER_GBPAK_H + +extern OSTimer __osGbpakTimer; +extern OSMesg __osGbpakTimerMsg; +extern OSMesgQueue __osGbpakTimerQ; + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/controller_voice.h b/lib/hackerlibultra/include/PRinternal/controller_voice.h new file mode 100644 index 00000000..1b9dee6d --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/controller_voice.h @@ -0,0 +1,59 @@ +#ifndef CONTROLLER_VOICE_H +#define CONTROLLER_VOICE_H + +#include "PR/ultratypes.h" + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[2]; + /* 0x8 */ u8 datacrc; +} __OSVoiceRead2Format; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[36]; + /* 0x2A */ u8 datacrc; +} __OSVoiceRead36Format; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[4]; + /* 0xA */ u8 datacrc; +} __OSVoiceWrite4Format; + +typedef struct { + /* 0x0 */ u8 dummy; + /* 0x1 */ u8 txsize; + /* 0x2 */ u8 rxsize; + /* 0x3 */ u8 cmd; + /* 0x4 */ u8 addrh; + /* 0x5 */ u8 addrl; + /* 0x6 */ u8 data[20]; + /* 0x1A */ u8 datacrc; +} __OSVoiceWrite20Format; + +typedef struct { + /* 0x0 */ u8 txsize; + /* 0x1 */ u8 rxsize; + /* 0x2 */ u8 cmd; + /* 0x3 */ u8 data; + /* 0x4 */ u8 scrc; + /* 0x5 */ u8 datacrc; +} __OSVoiceSWriteFormat; + +#endif // CONTROLLER_VOICE_H diff --git a/lib/hackerlibultra/include/PRinternal/dbgdefs.h b/lib/hackerlibultra/include/PRinternal/dbgdefs.h new file mode 100644 index 00000000..f7ead714 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/dbgdefs.h @@ -0,0 +1,8 @@ +#ifndef _DBGDEFS_H__ +#define _DBGDEFS_H__ + +typedef int TVid; +typedef unsigned short TVushort; +typedef char TVuchar; + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/dbgproto.h b/lib/hackerlibultra/include/PRinternal/dbgproto.h new file mode 100644 index 00000000..fc94d383 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/dbgproto.h @@ -0,0 +1,402 @@ +#ifndef _DBGPROTO_H__ +#define _DBGPROTO_H__ + +#include "PRinternal/dbgdefs.h" + +#define KK_REV 2 + +#define KK_CODE_THREAD_STATUS 4 + +#define KK_TYPE_REQUEST 0 +#define KK_TYPE_REPLY 1 +#define KK_TYPE_EXCEPTION 2 +#define KK_TYPE_THREAD_EXIT 3 +#define KK_TYPE_PROCESS_EXIT 4 +#define KK_TYPE_CONSOLE 5 + +#define TV_ERROR_NO_ERROR 0 +#define TV_ERROR_ILLEGAL_CALL -1 +#define TV_ERROR_INVALID_ID -2 +#define TV_ERROR_INVALID_TYPE -3 +#define TV_ERROR_OPERATIONS_PROTECTED -4 +#define TV_ERROR_INVALID_ADDRESS -5 +#define TV_ERROR_INVALID_PRIORITY -6 +#define TV_ERROR_INVALID_FLAGS -7 +#define TV_ERROR_INVALID_CAPABILITY -8 +#define TV_ERROR_NO_HANDLER -9 +#define TV_ERROR_NO_MORE_IDS -10 +#define TV_ERROR_NO_MORE_MESSAGES -11 +#define TV_ERROR_NO_MORE_PROCESSES -12 +#define TV_ERROR_NO_MORE_THREADS -13 +#define TV_ERROR_NO_MORE_REGIONS -14 +#define TV_ERROR_NO_MORE_TIMERS -15 +#define TV_ERROR_NO_MORE_LOCKS -16 +#define TV_ERROR_NO_MORE_QUEUES -17 +#define TV_ERROR_NO_MORE_SETS -18 +#define TV_ERROR_NO_MORE_MEMORY -19 +#define TV_ERROR_NOT_LOCKED -20 + +typedef struct __KKTimeStruct { + long seconds; + long nanoseconds; +} KKTimeStruct; + +typedef struct __KKObjsStruct { + TVushort number; + TVid objects[1]; +} KKObjs; + +typedef struct __KKFaultInfoStruct { + unsigned int addr; + short major; + short minor; +} KKFaultInfo; + +typedef struct __KKThreadStatusStruct { + int flags; + short why; + short what; + TVid tid; + TVid pid; + unsigned int instr; + KKFaultInfo info; + int priority; + int start; + int rv; + unsigned int args[6]; +} KKThreadStatus; + +#define KK_RUN_SSTEP (1 << 0) +#define KK_RUN_SETPC (1 << 1) + +typedef struct __KKRunStruct { + int flags; + unsigned int vaddr; +} KKRun; + +typedef struct __KKFaultStruct { + short majorMask; + short minorMask; +} KKFault; + +typedef struct __KKRegionStruct { + unsigned int vaddr; + unsigned int size; + short flags; + unsigned int paddr; +} KKRegion; + +typedef struct __KKGregSetStruct { + unsigned int gregs[37]; +} KKGregSet; + +typedef struct __KKFPregSetStruct { + union { + double dregs[16]; + float fregs[32]; + unsigned int regs[32]; + } fpregs; + unsigned int fpcsr; + unsigned int fppad; +} KKFPregSet; + +typedef struct __KKRegisterContextStruct { + KKGregSet gregs; + KKFPregSet fpregs; +} KKRegisterContext; + +typedef struct __KKCpScalarSetStruct { + unsigned int sregs[40]; +} KKCpScalarRegSet; + +typedef struct __KKCpVectorSetStruct { + unsigned int vregs[128]; +} KKCpVectorRegSet; + +typedef struct __KKCpRegisterContextStruct { + KKCpScalarRegSet sregs; + KKCpVectorRegSet vregs; +} KKCpRegisterContext; + +typedef struct __KKUsageStruct { + KKTimeStruct tstamp; + KKTimeStruct created; + KKTimeStruct states[10]; +} KKUsage; + +typedef struct __KKLogEventSetStruct { + int from; + int to; +} KKLogEventSet; + +typedef struct __KKLogStatusStruct { + int bufferType; + int bufferSize; + int dataSize; + int logState; + int flushLimit; +} KKLogStatus; + +typedef struct __KKProcUsageStruct { + TVid pid; + KKTimeStruct states[10]; +} KKProcUsage; + +typedef struct __KKHeaderStruct { + int length; + char code; + char type; + short error; + char rev; + char method; + short notused2; +} KKHeader; + +typedef struct __KKGetFrameRequestStruct { + KKHeader header; + int height; + int width; + int which; +} KKGetFrameRequest; + +typedef struct __KKLoadExecutableRequestStruct { + KKHeader header; + char str[1]; +} KKLoadExecutableRequest; + +typedef struct __KKObjectRequestStruct { + KKHeader header; + TVid object; +} KKObjectRequest; + +typedef struct __KKRunThreadRequestStruct { + KKHeader header; + TVid tid; + KKRun actions; +} KKRunThreadRequest; + +typedef struct __KKFaultRequestStruct { + KKHeader header; + TVid tid; + KKFault fault; + TVuchar stopAllThreads; +} KKFaultRequest; + +typedef struct __KKGRegsetRequestStruct { + KKHeader header; + TVid tid; + KKGregSet registers; +} KKGRegsetRequest; + +typedef struct __KKFPRegsetRequestStruct { + KKHeader header; + TVid tid; + KKFPregSet registers; +} KKFPRegsetRequest; + +typedef struct __KKCpScalarRegsetRequestStruct { + KKHeader header; + TVid tid; + KKCpScalarRegSet registers; +} KKCpScalarRegsetRequest; + +typedef struct __KKCpVectorRegsetRequestStruct { + KKHeader header; + TVid tid; + KKCpVectorRegSet registers; +} KKCpVectorRegsetRequest; + +typedef struct __KKReadRequestStruct { + KKHeader header; + TVid object; + unsigned int addr; + unsigned int nbytes; +} KKReadRequest; + +typedef struct __KKWriteHeaderStruct { + KKHeader header; + TVid object; + unsigned int addr; + unsigned int nbytes; +} KKWriteHeader; + +typedef struct __KKWriteRequestStruct { + KKWriteHeader writeHeader; + char buffer[1]; +} KKWriteRequest; + +typedef struct __KKSetBkptRequestStruct { + KKHeader header; + TVid object; + unsigned int addr; +} KKSetBkptRequest; + +typedef struct __KKClrBkptRequestStruct { + KKHeader header; + TVid object; + TVid bp; +} KKClrBkptRequest; + +typedef struct __KKWatchRequestStruct { + KKHeader header; + TVid object; + unsigned int number; + KKRegion wp[1]; +} KKWatchRequest; + +typedef struct __KKSetCommRequestStruct { + KKHeader header; + unsigned int how; + unsigned int addr; +} KKSetCommRequest; + +typedef struct __KKSysCallSetStruct { + unsigned int word[8]; +} KKSysCallSet; + +typedef struct __KKSysCallRequestStruct { + KKHeader header; + TVid pid; + KKSysCallSet syscallset; +} KKSysCallRequest; + +typedef struct __KKLogEventRequestStruct { + KKHeader header; + unsigned int numSet; + KKLogEventSet set[1]; +} KKLogEventRequest; + +typedef struct __KKNewLogRequestStruct { + KKHeader header; + char str[1]; +} KKNewLogRequest; + +typedef struct __KKRemoteRequestStruct { + KKHeader header; + int len; + char buf[16]; +} KKRemoteRequest; + +typedef struct __KKFlushLogRequestStruct { + KKHeader header; + int no_block; +} KKFlushLogRequest; + +typedef struct __KKLogControlRequestStruct { + KKHeader header; + int command; + int arg; +} KKLogControlRequest; + +typedef struct __KKSetTrptRequestStruct { + KKSetBkptRequest bpRequest; + unsigned short code; +} KKSetTrptRequest; + +typedef KKClrBkptRequest KKClrTrptRequest; + +typedef struct __KKObjectEventStruct { + KKHeader header; + TVid object; +} KKObjectEvent; + +typedef struct __KKObjsEventStruct { + KKHeader header; + TVid object; + KKObjs objs; +} KKObjsEvent; + +typedef struct __KKBufferEventStruct { + KKHeader header; + TVid object; + char buffer[1]; +} KKBufferEvent; + +typedef struct __KKStatusEventStruct { + KKHeader header; + KKThreadStatus status; +} KKStatusEvent; + +typedef struct __KKFaultEventStruct { + KKHeader header; + TVid tid; + KKFault fault; + TVuchar stopAllThreads; +} KKFaultEvent; + +typedef struct __KKNumberEventStruct { + KKHeader header; + TVid object; + unsigned int number; +} KKNumberEvent; + +typedef struct __KKRegionEventStruct { + KKHeader header; + TVid object; + unsigned int number; + KKRegion regions[1]; +} KKRegionEvent; + +typedef struct __KKGregEventStruct { + KKHeader header; + TVid tid; + KKGregSet registers; +} KKGregEvent; + +typedef struct __KKFPregEventStruct { + KKHeader header; + TVid tid; + KKFPregSet registers; +} KKFPregEvent; + +typedef struct __KKCpSregEventStruct { + KKHeader header; + TVid tid; + KKCpScalarRegSet registers; +} KKCpSregEvent; + +typedef struct __KKCpVregEventStruct { + KKHeader header; + TVid tid; + KKCpVectorRegSet registers; +} KKCpVregEvent; + +typedef struct __KKBkptEventStruct { + KKHeader header; + TVid object; + TVid bp; + unsigned int instruction; +} KKBkptEvent; + +typedef struct __KKUsageEventStruct { + KKHeader header; + TVid tid; + KKUsage usage; +} KKUsageEvent; + +typedef struct __KKFlushEventStruct { + KKHeader header; + int bufferType; + char buffer[1]; +} KKFlushEvent; + +typedef struct __KKLogStatusEventStruct { + KKHeader header; + KKLogStatus status; +} KKLogStatusEvent; + +typedef struct __KKSysUsageEventStruct { + KKHeader header; + KKTimeStruct tstamp; + int numProc; + KKProcUsage usage[1]; +} KKSysUsageEvent; + +typedef struct __KKStringEventStruct { + KKHeader header; + char str[1]; +} KKStringEvent; + +typedef KKSysCallRequest KKSysCallEvent; + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/macros.h b/lib/hackerlibultra/include/PRinternal/macros.h new file mode 100644 index 00000000..23d2b7d2 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/macros.h @@ -0,0 +1,22 @@ +#ifndef __MACROS_H__ +#define __MACROS_H__ + +#define ALIGNED(x) __attribute__((aligned(x))) + +#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0]))) + +#define STUBBED_PRINTF(x) ((void)(x)) + +#define UNUSED __attribute__((unused)) + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +#define ALIGN8(val) (((val) + 7) & ~7) + +#define STACK(stack, size) u64 stack[ALIGN8(size) / sizeof(u64)] + +#define STACK_START(stack) ((u8*)(stack) + sizeof(stack)) + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/osint.h b/lib/hackerlibultra/include/PRinternal/osint.h new file mode 100644 index 00000000..f0d0ad67 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/osint.h @@ -0,0 +1,55 @@ +#ifndef _OSINT_H +#define _OSINT_H +#include "PR/os_internal.h" +typedef struct __OSEventState { + OSMesgQueue* messageQueue; + OSMesg message; +} __OSEventState; +extern struct __osThreadTail { + OSThread* next; + OSPri priority; +} __osThreadTail; + +// maybe should be in exceptasm.h? +extern void __osEnqueueAndYield(OSThread**); +extern void __osDequeueThread(OSThread**, OSThread*); +extern void __osEnqueueThread(OSThread**, OSThread*); +extern OSThread* __osPopThread(OSThread**); +extern void __osDispatchThread(void); +extern void __osCleanupThread(void); + +extern void __osSetTimerIntr(OSTime); +extern OSTime __osInsertTimer(OSTimer*); +extern void __osTimerInterrupt(void); +extern u32 __osProbeTLB(void*); +extern int __osSpDeviceBusy(void); + +extern OSThread* __osRunningThread; +extern OSThread* __osActiveQueue; +extern OSThread* __osFaultedThread; +extern OSThread* __osRunQueue; + +extern OSTimer* __osTimerList; +extern OSTimer __osBaseTimer; +extern OSTime __osCurrentTime; +extern u32 __osBaseCounter; +extern u32 __osViIntrCount; +extern u32 __osTimerCounter; +extern u32 __osShutdown; + +extern OSMesgQueue __osProfTimerQ; +extern OSProf* __osProfileList; +extern OSProf* __osProfileListEnd; +extern u32 __osProfileOverflowBin; + +extern __OSEventState __osEventStateTab[]; + +extern void __osTimerServicesInit(void); +extern s32 __osAiDeviceBusy(void); +extern int __osDpDeviceBusy(void); + +#ifndef _FINALROM +extern void* __printfunc; +#endif + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/piint.h b/lib/hackerlibultra/include/PRinternal/piint.h new file mode 100644 index 00000000..bbee63f0 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/piint.h @@ -0,0 +1,192 @@ +#ifndef _PIINT_H_ +#define _PIINT_H_ + +#include "PR/os_internal.h" +#include "PR/rcp.h" + +// https://github.com/LuigiBlood/64dd/wiki/Memory-Map + +#define LEO_BASE_REG 0x05000000 + +#define LEO_CMD (LEO_BASE_REG + 0x508) +#define LEO_STATUS (LEO_BASE_REG + 0x508) + +#define LEO_BM_CTL (LEO_BASE_REG + 0x510) +#define LEO_BM_STATUS (LEO_BASE_REG + 0x510) + +#define LEO_SEQ_CTL (LEO_BASE_REG + 0x518) +#define LEO_SEQ_STATUS (LEO_BASE_REG + 0x518) + +#define LEO_C2_BUFF (LEO_BASE_REG + 0x000) // C2 Sector Buffer +#define LEO_SECTOR_BUFF (LEO_BASE_REG + 0x400) // Data Sector Buffer +#define LEO_DATA (LEO_BASE_REG + 0x500) // Data +#define LEO_MISC_REG (LEO_BASE_REG + 0x504) // Misc Register +#define LEO_CUR_TK (LEO_BASE_REG + 0x50C) // Current Track +#define LEO_ERR_SECTOR (LEO_BASE_REG + 0x514) // Sector Error Status +#define LEO_CUR_SECTOR (LEO_BASE_REG + 0x51C) // Current Sector +#define LEO_HARD_RESET (LEO_BASE_REG + 0x520) // Hard Reset +#define LEO_C1_S0 (LEO_BASE_REG + 0x524) // C1 +#define LEO_HOST_SECBYTE (LEO_BASE_REG + 0x528) // Sector Size (in bytes) +#define LEO_C1_S2 (LEO_BASE_REG + 0x52C) // C1 +#define LEO_SEC_BYTE (LEO_BASE_REG + 0x530) // Sectors per Block, Full Size +#define LEO_C1_S4 (LEO_BASE_REG + 0x534) // C1 +#define LEO_C1_S6 (LEO_BASE_REG + 0x538) // C1 +#define LEO_CUR_ADDR (LEO_BASE_REG + 0x53C) // Current Address? +#define LEO_ID_REG (LEO_BASE_REG + 0x540) // ID +#define LEO_TEST_REG (LEO_BASE_REG + 0x544) // Test Read +#define LEO_TEST_PIN_SEL (LEO_BASE_REG + 0x548) // Test Write +#define LEO_RAM_ADDR (LEO_BASE_REG + 0x580) // Microsequencer RAM + +#define LEO_STATUS_PRESENCE_MASK 0xFFFF + +#define LEO_STATUS_DATA_REQUEST 0x40000000 +#define LEO_STATUS_C2_TRANSFER 0x10000000 +#define LEO_STATUS_BUFFER_MANAGER_ERROR 0x08000000 +#define LEO_STATUS_BUFFER_MANAGER_INTERRUPT 0x04000000 +#define LEO_STATUS_MECHANIC_INTERRUPT 0x02000000 +#define LEO_STATUS_DISK_PRESENT 0x01000000 +#define LEO_STATUS_BUSY_STATE 0x00800000 +#define LEO_STATUS_RESET_STATE 0x00400000 +#define LEO_STATUS_MOTOR_NOT_SPINNING 0x00100000 +#define LEO_STATUS_HEAD_RETRACTED 0x00080000 +#define LEO_STATUS_WRITE_PROTECT_ERROR 0x00040000 +#define LEO_STATUS_MECHANIC_ERROR 0x00020000 +#define LEO_STATUS_DISK_CHANGE 0x00010000 + +#define LEO_STATUS_MODE_MASK (LEO_STATUS_MOTOR_NOT_SPINNING | LEO_STATUS_HEAD_RETRACTED) +#define LEO_STATUS_MODE_SLEEP (LEO_STATUS_MOTOR_NOT_SPINNING | LEO_STATUS_HEAD_RETRACTED) +#define LEO_STATUS_MODE_STANDBY (LEO_STATUS_HEAD_RETRACTED) +#define LEO_STATUS_MODE_ACTIVE 0 + +#define LEO_CUR_TK_INDEX_LOCK 0x60000000 + +#define LEO_BM_STATUS_RUNNING 0x80000000 // Running +#define LEO_BM_STATUS_ERROR 0x04000000 // Error +#define LEO_BM_STATUS_MICRO 0x02000000 // Micro Status? +#define LEO_BM_STATUS_BLOCK 0x01000000 // Block Transfer +#define LEO_BM_STATUS_C1CORRECTION 0x00800000 // C1 Correction +#define LEO_BM_STATUS_C1DOUBLE 0x00400000 // C1 Double +#define LEO_BM_STATUS_C1SINGLE 0x00200000 // C1 Single +#define LEO_BM_STATUS_C1ERROR 0x00010000 // C1 Error + +#define LEO_BM_CTL_START 0x80000000 // Start Buffer Manager +#define LEO_BM_CTL_MODE 0x40000000 // Buffer Manager Mode +#define LEO_BM_CTL_IMASK 0x20000000 // BM Interrupt Mask +#define LEO_BM_CTL_RESET 0x10000000 // Buffer Manager Reset +#define LEO_BM_CTL_DISABLE_OR 0x08000000 // Disable OR Check? +#define LEO_BM_CTL_DISABLE_C1 0x04000000 // Disable C1 Correction +#define LEO_BM_CTL_BLOCK 0x02000000 // Block Transfer +#define LEO_BM_CTL_CLR_MECHANIC_INTR 0x01000000 // Mechanic Interrupt Reset + +#define LEO_BM_CTL_CONTROL_MASK 0xFF000000 +#define LEO_BM_CTL_SECTOR_MASK 0x00FF0000 +#define LEO_BM_CTL_SECTOR_SHIFT 16 + +#define LEO_CMD_TYPE_0 0 // TODO: name +#define LEO_CMD_TYPE_1 1 // TODO: name +#define LEO_CMD_TYPE_2 2 // TODO: name + +#define LEO_ERROR_GOOD 0 +#define LEO_ERROR_4 4 // maybe busy? +#define LEO_ERROR_22 22 // +#define LEO_ERROR_23 23 // unrecovered read error? +#define LEO_ERROR_24 24 // no reference position found? +#define LEO_ERROR_29 29 // + +extern OSDevMgr __osPiDevMgr; +extern OSPiHandle* __osCurrentHandle[]; +extern OSPiHandle CartRomHandle; +extern OSPiHandle LeoDiskHandle; +extern OSMesgQueue __osPiAccessQueue; +extern u32 __osPiAccessQueueEnabled; + +// These symbols were all renamed in 2.0J. +#if BUILD_VERSION < VERSION_J +#define __osEPiRawStartDma osEPiRawStartDma +#define __osEPiRawReadIo osEPiRawReadIo +#define __osEPiRawWriteIo osEPiRawWriteIo +#define __osPiRawStartDma osPiRawStartDma +#define __osPiRawWriteIo osPiRawWriteIo +#define __osPiRawReadIo osPiRawReadIo +#endif + +int __osPiDeviceBusy(void); +void __osDevMgrMain(void*); +void __osPiCreateAccessQueue(void); +void __osPiRelAccess(void); +void __osPiGetAccess(void); +s32 __osPiRawStartDma(s32, u32, void*, u32); +s32 __osPiRawWriteIo(u32, u32); +s32 __osPiRawReadIo(u32, u32*); +s32 __osEPiRawWriteIo(OSPiHandle*, u32, u32); +s32 __osEPiRawReadIo(OSPiHandle*, u32, u32*); +s32 __osEPiRawStartDma(OSPiHandle*, s32, u32, void*, u32); +OSMesgQueue* osPiGetCmdQueue(void); + +#define WAIT_ON_IOBUSY(stat) \ + { \ + stat = IO_READ(PI_STATUS_REG); \ + while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \ + stat = IO_READ(PI_STATUS_REG); \ + } \ + (void)0 + +#define UPDATE_REG(pihandle, reg, var) \ + if (cHandle->var != pihandle->var) \ + IO_WRITE(reg, pihandle->var) + +#if BUILD_VERSION >= VERSION_J + +#define EPI_SYNC(pihandle, stat, domain) \ + \ + WAIT_ON_IOBUSY(stat); \ + \ + domain = pihandle->domain; \ + if (__osCurrentHandle[domain]->type != pihandle->type) { \ + OSPiHandle* cHandle = __osCurrentHandle[domain]; \ + if (domain == PI_DOMAIN1) { \ + UPDATE_REG(pihandle, PI_BSD_DOM1_LAT_REG, latency); \ + UPDATE_REG(pihandle, PI_BSD_DOM1_PGS_REG, pageSize); \ + UPDATE_REG(pihandle, PI_BSD_DOM1_RLS_REG, relDuration); \ + UPDATE_REG(pihandle, PI_BSD_DOM1_PWD_REG, pulse); \ + } else { \ + UPDATE_REG(pihandle, PI_BSD_DOM2_LAT_REG, latency); \ + UPDATE_REG(pihandle, PI_BSD_DOM2_PGS_REG, pageSize); \ + UPDATE_REG(pihandle, PI_BSD_DOM2_RLS_REG, relDuration); \ + UPDATE_REG(pihandle, PI_BSD_DOM2_PWD_REG, pulse); \ + } \ + cHandle->type = pihandle->type; \ + cHandle->latency = pihandle->latency; \ + cHandle->pageSize = pihandle->pageSize; \ + cHandle->relDuration = pihandle->relDuration; \ + cHandle->pulse = pihandle->pulse; \ + } \ + (void)0 + +#else + +#define EPI_SYNC(pihandle, stat, domain) \ + \ + WAIT_ON_IOBUSY(stat); \ + \ + domain = pihandle->domain; \ + if (__osCurrentHandle[domain] != pihandle) { \ + OSPiHandle* cHandle = __osCurrentHandle[domain]; \ + if (domain == PI_DOMAIN1) { \ + UPDATE_REG(pihandle, PI_BSD_DOM1_LAT_REG, latency); \ + UPDATE_REG(pihandle, PI_BSD_DOM1_PGS_REG, pageSize); \ + UPDATE_REG(pihandle, PI_BSD_DOM1_RLS_REG, relDuration); \ + UPDATE_REG(pihandle, PI_BSD_DOM1_PWD_REG, pulse); \ + } else { \ + UPDATE_REG(pihandle, PI_BSD_DOM2_LAT_REG, latency); \ + UPDATE_REG(pihandle, PI_BSD_DOM2_PGS_REG, pageSize); \ + UPDATE_REG(pihandle, PI_BSD_DOM2_RLS_REG, relDuration); \ + UPDATE_REG(pihandle, PI_BSD_DOM2_PWD_REG, pulse); \ + } \ + __osCurrentHandle[domain] = pihandle; \ + } \ + (void)0 + +#endif + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/rmonint.h b/lib/hackerlibultra/include/PRinternal/rmonint.h new file mode 100644 index 00000000..66d8e2d0 --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/rmonint.h @@ -0,0 +1,168 @@ +#ifndef _RMONINT_H +#define _RMONINT_H + +#include "PRinternal/dbgproto.h" +#include "PR/os_internal.h" + +/* mips */ + +#define MIPS_LWC2_OPCODE 50 +#define MIPS_SWC2_OPCODE 58 + +#define MIPS_LW_OPCODE 35 +#define MIPS_SW_OPCODE 43 + +#define MIPS_BREAK_OPCODE 0xD +#define MIPS_BREAK_MASK 0xFC00003F + +#define MIPS_BREAK(code) ((((code) & 0xFFFFF) << 6) | MIPS_BREAK_OPCODE) + +/* R4300 General Purpose Register Indices */ +#define GREG_IDX_ZERO 0 +#define GREG_IDX_AT 1 +#define GREG_IDX_T9 25 +#define GREG_IDX_K0 26 +#define GREG_IDX_GP 28 +#define GREG_IDX_RA 31 +#define GREG_IDX_LO 32 +#define GREG_IDX_HI 33 +#define GREG_IDX_CAUSE 34 +#define GREG_IDX_PC 35 +#define GREG_IDX_SR 36 + +/* RSP Scalar Register Indices */ +#define SREG_IDX_ZERO 0 +#define SREG_IDX_RA 31 +#define SREG_IDX_DRAM_ADDR (32 + 0) +#define SREG_IDX_MEM_ADDR (32 + 1) +#define SREG_IDX_RD_LEN (32 + 2) +#define SREG_IDX_PC (32 + 3) +#define SREG_IDX_WR_LEN (32 + 4) +#define SREG_IDX_STATUS (32 + 5) +#define SREG_IDX_DMA_FULL (32 + 6) +#define SREG_IDX_DMA_BUSY (32 + 7) + +/* RSP Vector Register Properties */ +#define VREG_NUM 32 +#define VREG_SIZE 0x10 + +/* rmon */ + +#define RMON_MESG_CPU_BREAK 2 +#define RMON_MESG_SP_BREAK 4 +#define RMON_MESG_FAULT 8 + +#define RMON_CPU 0 +#define RMON_RSP 1 + +/* "thread id" for rsp */ +#define RMON_TID_RSP 1000 +/* "thread priority" for rsp */ +#define RMON_PRI_RSP 42 + +/* "thread id" for no thread running */ +#define RMON_TID_NOTHREAD 1003 + +#define RMON_PID_CPU 1002 +#define RMON_PID_RSP 1001 + +/* Largest serviceable read/write memory request */ +#define RMON_MAX_XFER_SIZE 1024 + +/* rmonmain */ + +void __rmonSendHeader(KKHeader* const block, u32 blockSize, u32 type); +void __rmonSendReply(KKHeader* const block, u32 blockSize, u32 replyType); +void __rmonSendData(char* const block, unsigned int blockSize); + +extern int __rmonActive; + +/* rmonmisc */ + +void __rmonInit(void); +void __rmonPanic(void); + +extern OSMesgQueue __rmonMQ; + +/* rmonmem */ + +void __rmonWriteWordTo(u32* addr, u32 val); +u32 __rmonReadWordAt(u32* addr); +void __rmonMemcpy(u8* dest, u8* srce, u32 count); +void __rmonCopyWords(u32* dest, u32* srce, u32 count); + +extern u8 __rmonUtilityBuffer[]; + +/* rmonsio */ + +void __rmonSendFault(OSThread* thread); +void __rmonIOflush(void); +void __rmonIOputw(u32 word); +void __rmonIOhandler(void); + +extern void* __osRdb_DbgRead_Buf; +extern u8 rmonRdbReadBuf[]; + +/* rmonrcp */ + +int __rmonRCPrunning(void); +void __rmonIdleRCP(void); +void __rmonStepRCP(void); +void __rmonRunRCP(void); + +/* rmonbrk */ + +u32 __rmonGetBranchTarget(int method, int thread, char* addr); +int __rmonSetSingleStep(int thread, u32* instptr); +void __rmonGetExceptionStatus(KKStatusEvent* reply); +void __rmonHitBreak(void); +void __rmonHitSpBreak(void); +void __rmonHitCpuFault(void); + +extern u8 __rmonRcpAtBreak; + +/* rmonregs */ + +u32 __rmonGetRegisterContents(int method, int threadNumber, int regNumber); + +/* rmontask */ + +void __rmonMaskIdleThreadInts(void); +OSThread* __rmonGetTCB(int threadNumber); +int __rmonStopUserThreads(int whichThread); +int __rmonGetThreadStatus(int method, int id, KKStatusEvent* reply); + +/* rmoncmds */ + +int __rmonExecute(KKHeader* request); + +/* commands */ + +typedef int (*FUNPTR)(); + +int __rmonLoadProgram(KKHeader* req); +int __rmonListProcesses(KKHeader* req); +int __rmonGetExeName(KKHeader* req); +int __rmonListThreads(KKHeader* req); +int __rmonThreadStatus(KKHeader* req); +int __rmonStopThread(KKHeader* req); +int __rmonRunThread(KKHeader* req); +int __rmonSetFault(KKHeader* req); +int __rmonGetRegionCount(KKHeader* req); +int __rmonGetRegions(KKHeader* req); +int __rmonGetGRegisters(KKHeader* req); +int __rmonSetGRegisters(KKHeader* req); +int __rmonGetFRegisters(KKHeader* req); +int __rmonSetFRegisters(KKHeader* req); +int __rmonReadMem(KKHeader* req); +int __rmonWriteMem(KKHeader* req); +int __rmonSetBreak(KKHeader* req); +int __rmonClearBreak(KKHeader* req); +int __rmonListBreak(KKHeader* req); +int __rmonSetComm(KKHeader* req); +int __rmonGetSRegs(KKHeader* req); +int __rmonSetSRegs(KKHeader* req); +int __rmonGetVRegs(KKHeader* req); +int __rmonSetVRegs(KKHeader* req); + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/siint.h b/lib/hackerlibultra/include/PRinternal/siint.h new file mode 100644 index 00000000..636a87ff --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/siint.h @@ -0,0 +1,15 @@ +#ifndef _SIINT_H +#define _SIINT_H + +#include "PR/os_internal.h" +#include "PR/rcp.h" + +extern s32 __osEepromRead16K; +extern u8 __osPfsInodeCacheBank; + +void __osSiGetAccess(void); +void __osSiRelAccess(void); +int __osSiDeviceBusy(void); +void __osSiCreateAccessQueue(void); + +#endif diff --git a/lib/hackerlibultra/include/PRinternal/viint.h b/lib/hackerlibultra/include/PRinternal/viint.h new file mode 100644 index 00000000..fb369b1f --- /dev/null +++ b/lib/hackerlibultra/include/PRinternal/viint.h @@ -0,0 +1,66 @@ +#ifndef _VIINT_H +#define _VIINT_H +#include "PR/os_internal.h" + +#define OS_TV_TYPE_PAL 0 +#define OS_TV_TYPE_NTSC 1 +#define OS_TV_TYPE_MPAL 2 + +#define VI_STATE_MODE_UPDATED 0x01 +#define VI_STATE_XSCALE_UPDATED 0x02 +#define VI_STATE_YSCALE_UPDATED 0x04 +#define VI_STATE_CTRL_UPDATED 0x08 // related to control regs changing +#define VI_STATE_BUFFER_UPDATED 0x10 // swap buffer +#define VI_STATE_BLACK 0x20 // probably related to a black screen +#define VI_STATE_REPEATLINE 0x40 // repeat line? +#define VI_STATE_FADE 0x80 // fade + +#define VI_SCALE_MASK 0xfff // see rcp scale_x/scale_y +#define VI_2_10_FPART_MASK 0x3ff +#define VI_SUBPIXEL_SH 0x10 + +#define BURST(hsync_width, color_width, vsync_width, color_start) \ + (((u32)(hsync_width) & 0xFF) | (((u32)(color_width) & 0xFF) << 8) | (((u32)(vsync_width) & 0xF) << 16) \ + | (((u32)(color_start) & 0xFFFF) << 20)) +#define WIDTH(v) (v) +#define VSYNC(v) (v) +#define HSYNC(duration, leap) (((u32)(leap) << 16) | ((u32)(duration) & 0xFFFF)) +#define LEAP(upper, lower) (((u32)(upper) << 16) | ((u32)(lower) & 0xFFFF)) +#define START(start, end) (((u32)(start) << 16) | ((u32)(end) & 0xFFFF)) + +#define FTOFIX(val, i, f) ((u32)((val) * (f32)(1 << (f))) & ((1 << ((i) + (f))) - 1)) + +#define F210(val) FTOFIX(val, 2, 10) +#define SCALE(scaleup, off) (F210((1.0f / (f32)(scaleup))) | (F210((f32)(off)) << 16)) + +#define VCURRENT(v) v // seemingly unused +#define ORIGIN(v) v +#define VINTR(v) v +#define HSTART START + +typedef struct { + /* 0x0 */ f32 factor; + /* 0x4 */ u16 offset; + /* 0x8 */ u32 scale; +} __OSViScale; + +typedef struct { + /* 0x0 */ u16 state; + /* 0x2 */ u16 retraceCount; + /* 0x4 */ void* framep; + /* 0x8 */ OSViMode* modep; + /* 0xC */ u32 control; + /* 0x10 */ OSMesgQueue* msgq; + /* 0x14 */ OSMesg msg; + /* 0x18 */ __OSViScale x; + /* 0x24 */ __OSViScale y; +} __OSViContext; // 0x30 bytes + +void __osViSwapContext(void); +extern __OSViContext* __osViCurr; +extern __OSViContext* __osViNext; +extern u32 __additional_scanline; +__OSViContext* __osViGetCurrentContext(void); +void __osViInit(void); +extern OSDevMgr __osViDevMgr; +#endif diff --git a/lib/hackerlibultra/include/asm.h b/lib/hackerlibultra/include/asm.h new file mode 100644 index 00000000..1de9f0ad --- /dev/null +++ b/lib/hackerlibultra/include/asm.h @@ -0,0 +1 @@ +#include diff --git a/lib/hackerlibultra/include/assert.h b/lib/hackerlibultra/include/assert.h new file mode 100644 index 00000000..f34a33ba --- /dev/null +++ b/lib/hackerlibultra/include/assert.h @@ -0,0 +1,12 @@ +#ifndef __ASSERT_H__ +#define __ASSERT_H__ + +#ifdef NDEBUG +#undef assert +#define assert(EX) ((void)0) +#else +extern void __assert(const char*, const char*, int); +#define assert(EX) ((EX) ? ((void)0) : __assert("EX", __FILE__, __LINE__)) +#endif /* NDEBUG */ + +#endif /* !__ASSERT_H__ */ diff --git a/lib/hackerlibultra/include/compiler/gcc/math.h b/lib/hackerlibultra/include/compiler/gcc/math.h new file mode 100644 index 00000000..3e93ceb1 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/hackerlibultra/include/compiler/gcc/memory.h b/lib/hackerlibultra/include/compiler/gcc/memory.h new file mode 100644 index 00000000..c2e4ef97 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/memory.h @@ -0,0 +1,23 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +/* + memory.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +void* memccpy(void*, void*, int, size_t); +void* memchr(void*, int, size_t); +int memcmp(const void*, const void*, size_t); +void* memcpy(void*, const void*, size_t); +int memicmp(void*, void*, size_t); +void* memmove(void*, void*, size_t); +void* memset(void*, int, size_t); + +void movmem(void*, void*, unsigned); +void setmem(void*, unsigned, int); + +#endif diff --git a/lib/hackerlibultra/include/compiler/gcc/sgidefs.h b/lib/hackerlibultra/include/compiler/gcc/sgidefs.h new file mode 100644 index 00000000..a56d837b --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/sgidefs.h @@ -0,0 +1,44 @@ +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SGIDEFS_H +#define _SGIDEFS_H 1 + +/* + * Definitions for the ISA level + */ +#define _MIPS_ISA_MIPS1 1 +#define _MIPS_ISA_MIPS2 2 +#define _MIPS_ISA_MIPS3 3 +#define _MIPS_ISA_MIPS4 4 +#define _MIPS_ISA_MIPS5 5 + +/* + * Subprogram calling convention + * + * At the moment only _MIPS_SIM_ABI32 is in use. This will change rsn. + * Until GCC 2.8.0 is released don't rely on this definitions because the + * 64bit code is essentially using the 32bit interface model just with + * 64bit registers. + */ +#define _MIPS_SIM_ABI32 1 +#define _MIPS_SIM_NABI32 2 +#define _MIPS_SIM_ABI64 3 + +#endif /* sgidefs.h */ diff --git a/lib/hackerlibultra/include/compiler/gcc/stdarg.h b/lib/hackerlibultra/include/compiler/gcc/stdarg.h new file mode 100644 index 00000000..ebadc39d --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/stdarg.h @@ -0,0 +1,114 @@ +#ifndef _STDARG_H +#define _STDARG_H +/* ---------------------------------------- */ +/* VARARGS for MIPS/GNU CC */ +/* */ +/* */ +/* */ +/* */ +/* ---------------------------------------- */ + +/* These macros implement varargs for GNU C--either traditional or ANSU. */ + +/* Define __gnuc_va_list. */ + +#ifndef __GNUC_VA_LIST +#define __GNUC_VA_LIST +typedef char* __gnuc_va_list; +#endif /* not __GNUC_VA_LIST */ + +/* If this is for internal libc use, don't define anything but + __gnuc_va_list. */ +#if defined(_STDARG_H) || defined(_VARARGS_H) + +/* In GCC version 2, we want an ellipsis at the end of the declaration + of the argument list. GCC version 1 can't parse it. */ + +#if __GNUC__ > 1 +#define __va_ellipsis ... +#else +#define __va_ellipsis +#endif + +#if __mips >= 3 +#define __va_rounded_size(__TYPE) (((sizeof(__TYPE) + 8 - 1) / 8) * 8) +#else +#define __va_rounded_size(__TYPE) (((sizeof(__TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) +#endif + +/* Get definitions for _MIPS_SIM_ABI64 etc. */ +#ifdef _MIPS_SIM +#include +#endif + +#ifdef _STDARG_H +#if defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64) +#define va_start(__AP, __LASTARG) \ + (__AP = __builtin_next_arg(__LASTARG) - 64 + (__builtin_args_info(2) > 8 ? 64 : __builtin_args_info(2) * 8)) +#else +#define va_start(__AP, __LASTARG) (__AP = (__gnuc_va_list)__builtin_next_arg(__LASTARG)) +#endif + +#else +#define va_alist __builtin_va_alist +#if __mips >= 3 +/* This assumes that `long long int' is always a 64 bit type. */ +#define va_dcl \ + long long int __builtin_va_alist; \ + __va_ellipsis +#else +#define va_dcl \ + int __builtin_va_alist; \ + __va_ellipsis +#endif +/* Need alternate code for _MIPS_SIM_ABI64, but don't use that symbol + because it may not be defined. */ +#if defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64) +#define va_start(__AP) \ + (__AP = __builtin_next_arg() - 64 + (__builtin_args_info(2) > 8 ? 64 : __builtin_args_info(2) * 8)) +#else +#define va_start(__AP) __AP = (char*)&__builtin_va_alist +#endif +#endif + +#ifndef va_end +void va_end(__gnuc_va_list); /* Defined in libgcc.a */ +#endif +#define va_end(__AP) ((void)0) + +/* We cast to void * and then to TYPE * because this avoids + a warning about increasing the alignment requirement. */ +/* The __mips>=3 cases are reversed from the 32 bit cases, because the standard + 32 bit calling convention left-aligns all parameters smaller than a word, + whereas the __mips>=3 calling convention does not (and hence they are + right aligned). */ +#if __mips >= 3 +#ifdef __MIPSEB__ +#define va_arg(__AP, __type) \ + ((__type*)(void*)(__AP = (char*)((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) + __va_rounded_size(__type))))[-1] +#else +#define va_arg(__AP, __type) \ + ((__AP = (char*)((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) + __va_rounded_size(__type))), \ + *(__type*)(void*)(__AP - __va_rounded_size(__type))) +#endif + +#else /* not __mips>=3 */ + +#ifdef __MIPSEB__ +/* For big-endian machines. */ +#define va_arg(__AP, __type) \ + ((__AP = (char*)((__alignof__(__type) > 4 ? ((int)__AP + 8 - 1) & -8 : ((int)__AP + 4 - 1) & -4) \ + + __va_rounded_size(__type))), \ + *(__type*)(void*)(__AP - __va_rounded_size(__type))) +#else +/* For little-endian machines. */ +#define va_arg(__AP, __type) \ + ((__type*)(void*)(__AP = (char*)((__alignof__(__type) > 4 ? ((int)__AP + 8 - 1) & -8 : ((int)__AP + 4 - 1) & -4) \ + + __va_rounded_size(__type))))[-1] +#endif +#endif + +typedef __gnuc_va_list va_list; + +#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ +#endif diff --git a/lib/hackerlibultra/include/compiler/gcc/stdio.h b/lib/hackerlibultra/include/compiler/gcc/stdio.h new file mode 100644 index 00000000..3e93ceb1 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/hackerlibultra/include/compiler/gcc/stdlib.h b/lib/hackerlibultra/include/compiler/gcc/stdlib.h new file mode 100644 index 00000000..669efd6f --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/stdlib.h @@ -0,0 +1,80 @@ +#ifndef _STDLIB_H +#define _STDLIB_H +/* + stdlib.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#ifndef _DIV_T_DEF +#define _DIV_T_DEF +typedef struct DIV_T { + int quot; + int rem; +} div_t; +#endif + +#ifndef _LDIV_T_DEF +#define _LDIV_T_DEF +typedef struct LDIV_T { + long quot; + long rem; +} ldiv_t; +#endif + +#ifndef _LLDIV_T_DEF +#define _LLDIV_T_DEF +typedef struct lldiv_t { + long long quot; + long long rem; +} lldiv_t; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define _max(a, b) (((a) > (b)) ? (a) : (b)) +#define _min(a, b) (((a) < (b)) ? (a) : (b)) + +#define RAND_MAX 32767 + +int rand(void); +void srand(unsigned); + +int abs(int); +long labs(long); + +div_t div(int, int); +ldiv_t ldiv(long, long); +lldiv_t lldiv(long long, long long); + +int atoi(const char*); +long atol(const char*); + +long strtol(const char*, char**, int); +unsigned long strtoul(const char*, char**, int); + +char* itoa(int, char*, int); +char* ltoa(long, char*, int); +char* ultoa(unsigned long, char*, int); + +double atof(const char*); +double strtod(const char*, char**); + +void qsort(void*, size_t, size_t, int (*)(const void*, const void*)); +void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*)); + +void* malloc(size_t); +void* calloc(size_t, size_t); +void* realloc(void*, size_t); +void free(void*); + +void exit(int); + +void abort(void); + +#endif diff --git a/lib/hackerlibultra/include/compiler/gcc/string.h b/lib/hackerlibultra/include/compiler/gcc/string.h new file mode 100644 index 00000000..e2ddc92c --- /dev/null +++ b/lib/hackerlibultra/include/compiler/gcc/string.h @@ -0,0 +1,42 @@ +#ifndef _STRING_H +#define _STRING_H +/* + string.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#include "memory.h" + +char* stpcpy(char*, const char*); +char* strcat(char*, const char*); +char* strchr(const char*, int); +int strcmp(const char*, const char*); +char* strcpy(char*, const char*); +size_t strcspn(const char*, const char*); +char* strdup(const char*); +char* strerror(int); +int stricmp(const char*, const char*); +size_t strlen(const char*); +char* strlwr(char*); +char* strncat(char*, const char*, size_t); +int strncmp(const char*, const char*, size_t); +char* strncpy(char*, const char*, size_t); +int strnicmp(const char*, const char*, size_t); +char* strnset(char*, int, size_t); +char* strpbrk(const char*, const char*); +char* strrchr(const char*, int); +char* strrev(char*); +char* strset(char*, int); +size_t strspn(const char*, const char*); +char* strstr(const char*, const char*); +char* strtok(char*, const char*); +char* strupr(char*); + +#define strcmpi(s1, s2) stricmp(s1, s2) +#define strncmpi(s1, s2, n) strnicmp(s1, s2, n) + +#endif diff --git a/lib/hackerlibultra/include/compiler/ido/math.h b/lib/hackerlibultra/include/compiler/ido/math.h new file mode 100644 index 00000000..3e93ceb1 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/ido/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/hackerlibultra/include/compiler/ido/memory.h b/lib/hackerlibultra/include/compiler/ido/memory.h new file mode 100644 index 00000000..c2e4ef97 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/ido/memory.h @@ -0,0 +1,23 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +/* + memory.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +void* memccpy(void*, void*, int, size_t); +void* memchr(void*, int, size_t); +int memcmp(const void*, const void*, size_t); +void* memcpy(void*, const void*, size_t); +int memicmp(void*, void*, size_t); +void* memmove(void*, void*, size_t); +void* memset(void*, int, size_t); + +void movmem(void*, void*, unsigned); +void setmem(void*, unsigned, int); + +#endif diff --git a/lib/hackerlibultra/include/compiler/ido/stdarg.h b/lib/hackerlibultra/include/compiler/ido/stdarg.h new file mode 100644 index 00000000..d44996a8 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/ido/stdarg.h @@ -0,0 +1,30 @@ +#ifndef _STDARG_H +#define _STDARG_H + +typedef char* va_list; +#define _FP 1 +#define _INT 0 +#define _STRUCT 2 + +#define _VA_FP_SAVE_AREA 0x10 +#define _VA_ALIGN(p, a) (((unsigned int)(((char*)p) + ((a) > 4 ? (a) : 4) - 1)) & -((a) > 4 ? (a) : 4)) +#define va_start(vp, parmN) (vp = ((va_list) & parmN + sizeof(parmN))) + +#define __va_stack_arg(list, mode) \ + (((list) = (char*)_VA_ALIGN(list, __builtin_alignof(mode)) + _VA_ALIGN(sizeof(mode), 4)), \ + (((char*)list) - (_VA_ALIGN(sizeof(mode), 4) - sizeof(mode)))) + +#define __va_double_arg(list, mode) \ + ((((long)list & 0x1) /* 1 byte aligned? */ \ + ? (list = (char*)((long)list + 7), (char*)((long)list - 6 - _VA_FP_SAVE_AREA)) \ + : (((long)list & 0x2) /* 2 byte aligned? */ \ + ? (list = (char*)((long)list + 10), (char*)((long)list - 24 - _VA_FP_SAVE_AREA)) \ + : __va_stack_arg(list, mode)))) + +#define va_arg(list, mode) \ + ((mode*)(((__builtin_classof(mode) == _FP && __builtin_alignof(mode) == sizeof(double)) \ + ? __va_double_arg(list, mode) \ + : __va_stack_arg(list, mode))))[-1] +#define va_end(__list) + +#endif /* STDARG_H */ diff --git a/lib/hackerlibultra/include/compiler/ido/stdio.h b/lib/hackerlibultra/include/compiler/ido/stdio.h new file mode 100644 index 00000000..3e93ceb1 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/ido/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/hackerlibultra/include/compiler/ido/stdlib.h b/lib/hackerlibultra/include/compiler/ido/stdlib.h new file mode 100644 index 00000000..669efd6f --- /dev/null +++ b/lib/hackerlibultra/include/compiler/ido/stdlib.h @@ -0,0 +1,80 @@ +#ifndef _STDLIB_H +#define _STDLIB_H +/* + stdlib.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#ifndef _DIV_T_DEF +#define _DIV_T_DEF +typedef struct DIV_T { + int quot; + int rem; +} div_t; +#endif + +#ifndef _LDIV_T_DEF +#define _LDIV_T_DEF +typedef struct LDIV_T { + long quot; + long rem; +} ldiv_t; +#endif + +#ifndef _LLDIV_T_DEF +#define _LLDIV_T_DEF +typedef struct lldiv_t { + long long quot; + long long rem; +} lldiv_t; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define _max(a, b) (((a) > (b)) ? (a) : (b)) +#define _min(a, b) (((a) < (b)) ? (a) : (b)) + +#define RAND_MAX 32767 + +int rand(void); +void srand(unsigned); + +int abs(int); +long labs(long); + +div_t div(int, int); +ldiv_t ldiv(long, long); +lldiv_t lldiv(long long, long long); + +int atoi(const char*); +long atol(const char*); + +long strtol(const char*, char**, int); +unsigned long strtoul(const char*, char**, int); + +char* itoa(int, char*, int); +char* ltoa(long, char*, int); +char* ultoa(unsigned long, char*, int); + +double atof(const char*); +double strtod(const char*, char**); + +void qsort(void*, size_t, size_t, int (*)(const void*, const void*)); +void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*)); + +void* malloc(size_t); +void* calloc(size_t, size_t); +void* realloc(void*, size_t); +void free(void*); + +void exit(int); + +void abort(void); + +#endif diff --git a/lib/hackerlibultra/include/compiler/ido/string.h b/lib/hackerlibultra/include/compiler/ido/string.h new file mode 100644 index 00000000..e2ddc92c --- /dev/null +++ b/lib/hackerlibultra/include/compiler/ido/string.h @@ -0,0 +1,42 @@ +#ifndef _STRING_H +#define _STRING_H +/* + string.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#include "memory.h" + +char* stpcpy(char*, const char*); +char* strcat(char*, const char*); +char* strchr(const char*, int); +int strcmp(const char*, const char*); +char* strcpy(char*, const char*); +size_t strcspn(const char*, const char*); +char* strdup(const char*); +char* strerror(int); +int stricmp(const char*, const char*); +size_t strlen(const char*); +char* strlwr(char*); +char* strncat(char*, const char*, size_t); +int strncmp(const char*, const char*, size_t); +char* strncpy(char*, const char*, size_t); +int strnicmp(const char*, const char*, size_t); +char* strnset(char*, int, size_t); +char* strpbrk(const char*, const char*); +char* strrchr(const char*, int); +char* strrev(char*); +char* strset(char*, int); +size_t strspn(const char*, const char*); +char* strstr(const char*, const char*); +char* strtok(char*, const char*); +char* strupr(char*); + +#define strcmpi(s1, s2) stricmp(s1, s2) +#define strncmpi(s1, s2, n) strnicmp(s1, s2, n) + +#endif diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/math.h b/lib/hackerlibultra/include/compiler/modern_gcc/math.h new file mode 100644 index 00000000..3e93ceb1 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/memory.h b/lib/hackerlibultra/include/compiler/modern_gcc/memory.h new file mode 100644 index 00000000..c2e4ef97 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/memory.h @@ -0,0 +1,23 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +/* + memory.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +void* memccpy(void*, void*, int, size_t); +void* memchr(void*, int, size_t); +int memcmp(const void*, const void*, size_t); +void* memcpy(void*, const void*, size_t); +int memicmp(void*, void*, size_t); +void* memmove(void*, void*, size_t); +void* memset(void*, int, size_t); + +void movmem(void*, void*, unsigned); +void setmem(void*, unsigned, int); + +#endif diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/sgidefs.h b/lib/hackerlibultra/include/compiler/modern_gcc/sgidefs.h new file mode 100644 index 00000000..a56d837b --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/sgidefs.h @@ -0,0 +1,44 @@ +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SGIDEFS_H +#define _SGIDEFS_H 1 + +/* + * Definitions for the ISA level + */ +#define _MIPS_ISA_MIPS1 1 +#define _MIPS_ISA_MIPS2 2 +#define _MIPS_ISA_MIPS3 3 +#define _MIPS_ISA_MIPS4 4 +#define _MIPS_ISA_MIPS5 5 + +/* + * Subprogram calling convention + * + * At the moment only _MIPS_SIM_ABI32 is in use. This will change rsn. + * Until GCC 2.8.0 is released don't rely on this definitions because the + * 64bit code is essentially using the 32bit interface model just with + * 64bit registers. + */ +#define _MIPS_SIM_ABI32 1 +#define _MIPS_SIM_NABI32 2 +#define _MIPS_SIM_ABI64 3 + +#endif /* sgidefs.h */ diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/stdarg.h b/lib/hackerlibultra/include/compiler/modern_gcc/stdarg.h new file mode 100644 index 00000000..1f36b0a8 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/stdarg.h @@ -0,0 +1,9 @@ +#ifndef _STDARG_H +#define _STDARG_H + +#define va_list __builtin_va_list +#define va_start __builtin_va_start +#define va_arg __builtin_va_arg +#define va_end __builtin_va_end + +#endif diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/stdio.h b/lib/hackerlibultra/include/compiler/modern_gcc/stdio.h new file mode 100644 index 00000000..3e93ceb1 --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/stdlib.h b/lib/hackerlibultra/include/compiler/modern_gcc/stdlib.h new file mode 100644 index 00000000..669efd6f --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/stdlib.h @@ -0,0 +1,80 @@ +#ifndef _STDLIB_H +#define _STDLIB_H +/* + stdlib.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#ifndef _DIV_T_DEF +#define _DIV_T_DEF +typedef struct DIV_T { + int quot; + int rem; +} div_t; +#endif + +#ifndef _LDIV_T_DEF +#define _LDIV_T_DEF +typedef struct LDIV_T { + long quot; + long rem; +} ldiv_t; +#endif + +#ifndef _LLDIV_T_DEF +#define _LLDIV_T_DEF +typedef struct lldiv_t { + long long quot; + long long rem; +} lldiv_t; +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define _max(a, b) (((a) > (b)) ? (a) : (b)) +#define _min(a, b) (((a) < (b)) ? (a) : (b)) + +#define RAND_MAX 32767 + +int rand(void); +void srand(unsigned); + +int abs(int); +long labs(long); + +div_t div(int, int); +ldiv_t ldiv(long, long); +lldiv_t lldiv(long long, long long); + +int atoi(const char*); +long atol(const char*); + +long strtol(const char*, char**, int); +unsigned long strtoul(const char*, char**, int); + +char* itoa(int, char*, int); +char* ltoa(long, char*, int); +char* ultoa(unsigned long, char*, int); + +double atof(const char*); +double strtod(const char*, char**); + +void qsort(void*, size_t, size_t, int (*)(const void*, const void*)); +void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*)); + +void* malloc(size_t); +void* calloc(size_t, size_t); +void* realloc(void*, size_t); +void free(void*); + +void exit(int); + +void abort(void); + +#endif diff --git a/lib/hackerlibultra/include/compiler/modern_gcc/string.h b/lib/hackerlibultra/include/compiler/modern_gcc/string.h new file mode 100644 index 00000000..e2ddc92c --- /dev/null +++ b/lib/hackerlibultra/include/compiler/modern_gcc/string.h @@ -0,0 +1,42 @@ +#ifndef _STRING_H +#define _STRING_H +/* + string.h +*/ + +#ifndef _SIZE_T_DEF +#define _SIZE_T_DEF +typedef unsigned size_t; +#endif + +#include "memory.h" + +char* stpcpy(char*, const char*); +char* strcat(char*, const char*); +char* strchr(const char*, int); +int strcmp(const char*, const char*); +char* strcpy(char*, const char*); +size_t strcspn(const char*, const char*); +char* strdup(const char*); +char* strerror(int); +int stricmp(const char*, const char*); +size_t strlen(const char*); +char* strlwr(char*); +char* strncat(char*, const char*, size_t); +int strncmp(const char*, const char*, size_t); +char* strncpy(char*, const char*, size_t); +int strnicmp(const char*, const char*, size_t); +char* strnset(char*, int, size_t); +char* strpbrk(const char*, const char*); +char* strrchr(const char*, int); +char* strrev(char*); +char* strset(char*, int); +size_t strspn(const char*, const char*); +char* strstr(const char*, const char*); +char* strtok(char*, const char*); +char* strupr(char*); + +#define strcmpi(s1, s2) stricmp(s1, s2) +#define strncmpi(s1, s2, n) strnicmp(s1, s2, n) + +#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/py.typed b/lib/hackerlibultra/include/fpregdef.h similarity index 100% rename from tools/ido-static-recomp/tools/rabbitizer/rabbitizer/py.typed rename to lib/hackerlibultra/include/fpregdef.h diff --git a/lib/hackerlibultra/include/regdef.h b/lib/hackerlibultra/include/regdef.h new file mode 100644 index 00000000..c29cc699 --- /dev/null +++ b/lib/hackerlibultra/include/regdef.h @@ -0,0 +1,3 @@ +#include +#include +#include diff --git a/lib/hackerlibultra/include/sgidefs.h b/lib/hackerlibultra/include/sgidefs.h new file mode 100644 index 00000000..45b834d6 --- /dev/null +++ b/lib/hackerlibultra/include/sgidefs.h @@ -0,0 +1,3 @@ +#ifdef __GNUC__ +#include "compiler/modern_gcc/sgidefs.h" +#endif diff --git a/lib/hackerlibultra/include/sys/asm.h b/lib/hackerlibultra/include/sys/asm.h new file mode 100644 index 00000000..c9b1eb2a --- /dev/null +++ b/lib/hackerlibultra/include/sys/asm.h @@ -0,0 +1,115 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __ASM_H__ +#define __ASM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define _MIPS_ISA_MIPS1 1 /* R2/3K */ +#define _MIPS_ISA_MIPS2 2 /* R4K/6K */ +#define _MIPS_ISA_MIPS3 3 /* R4K */ +#define _MIPS_ISA_MIPS4 4 /* TFP */ + +#define _MIPS_SIM_ABI32 1 /* MIPS MSIG calling convention */ +#define _MIPS_SIM_NABI32 2 /* MIPS new 32-bit abi */ + /* NABI32 is 64bit calling convention but 32bit type sizes) */ +#define _MIPS_SIM_ABI64 3 /* MIPS 64 calling convention */ + +/* libgultra doesn't match with the .type directive but iQue sdk asm.h uses it */ +#ifdef BBPLAYER +#define ASM_TYPE_FUNC(x) .type x, @function +#else +#define ASM_TYPE_FUNC(x) +#endif + +#define LEAF(x) \ + .globl x; \ + .align 2; \ + ASM_TYPE_FUNC(x); \ + .ent x, 0; \ + x:; \ + .frame sp, 0, ra + +#if defined(BBPLAYER) || defined(__sgi) +#define XLEAF(x) \ + .globl x; \ + .aent x, 0; \ + x: +#else +#define XLEAF(x) .globl x +#endif + +#ifdef BBPLAYER +#define END(proc) \ + .end proc; \ + .size proc, .- proc +#else +#define END(proc) .end proc +#endif + +#define ABS(x, y) \ + .globl x; \ + x = y + +#define EXPORT(x) \ + .globl x; \ + x: + +#if defined(BBPLAYER) || defined(__sgi) +#define WEAK(x, y) .weakext x, y +#else +#define WEAK(x, y) +#endif + +#define NOP \ + .set noreorder; \ + nop; \ + .set reorder + +#define CACHE(op, reg) \ + .set noreorder; \ + cache op, reg; \ + .set reorder + +#define MFC0(reg, op) \ + .set noreorder; \ + mfc0 reg, op; \ + .set reorder + +#define MTC0(reg, op) \ + .set noreorder; \ + mtc0 reg, op; \ + .set reorder + +#define CFC1(reg, op) \ + .set noreorder; \ + cfc1 reg, op; \ + .set reorder + +#define CTC1(reg, op) \ + .set noreorder; \ + ctc1 reg, op; \ + .set reorder + +#ifdef __cplusplus +} +#endif + +#endif /* !__ASM_H__ */ diff --git a/lib/hackerlibultra/include/sys/fpregdef.h b/lib/hackerlibultra/include/sys/fpregdef.h new file mode 100644 index 00000000..e69de29b diff --git a/lib/hackerlibultra/include/sys/regdef.h b/lib/hackerlibultra/include/sys/regdef.h new file mode 100644 index 00000000..32b85c01 --- /dev/null +++ b/lib/hackerlibultra/include/sys/regdef.h @@ -0,0 +1,187 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __REGDEF_H__ +#define __REGDEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef mips + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define ta0 $12 +#define t5 $13 +#define ta1 $13 +#define t6 $14 +#define ta2 $14 +#define t7 $15 +#define ta3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define a4 $8 +#define ta0 $8 +#define a5 $9 +#define ta1 $9 +#define a6 $10 +#define ta2 $10 +#define a7 $11 +#define ta3 $11 +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define fv0 $f0 +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +#define fa0 $f12 +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +#define ft0 $f4 +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +#define fs0 $f20 +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define fv0 $f0 +#define fv1 $f2 +#define fa0 $f12 +#define fa1 $f13 +#define fa2 $f14 +#define fa3 $f15 +#define fa4 $f16 +#define fa5 $f17 +#define fa6 $f18 +#define fa7 $f19 +#define ft0 $f4 +#define ft1 $f5 +#define ft2 $f6 +#define ft3 $f7 +#define ft4 $f8 +#define ft5 $f9 +#define ft6 $f10 +#define ft7 $f11 +#define ft8 $f20 +#define ft9 $f21 +#define ft10 $f22 +#define ft11 $f23 +#define ft12 $f1 +#define ft13 $f3 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 +#endif + +#define fcr31 $31 + +#endif /* mips */ + +#ifdef __cplusplus +} +#endif + +#endif /* !__REGDEF_H__ */ diff --git a/lib/hackerlibultra/include/ultra64.h b/lib/hackerlibultra/include/ultra64.h new file mode 100644 index 00000000..053db38e --- /dev/null +++ b/lib/hackerlibultra/include/ultra64.h @@ -0,0 +1,40 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ + +/************************************************************************** + * + * $Revision: 1.10 $ + * $Date: 1997/02/11 08:37:33 $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ultra64.h,v $ + * + **************************************************************************/ + +#ifndef _ULTRA64_H_ +#define _ULTRA64_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/lib/hackerlibultra/include/ultrahost.h b/lib/hackerlibultra/include/ultrahost.h new file mode 100644 index 00000000..56c81d57 --- /dev/null +++ b/lib/hackerlibultra/include/ultrahost.h @@ -0,0 +1,59 @@ +/************************************************************************** + * + * $Revision: 1.1 $ + * $Date: 1999/07/05 02:16:07 $ + * + **************************************************************************/ + +#ifndef _ULTRAHOST_H_ +#define _ULTRAHOST_H_ + +#ifdef WIN32 /* { */ + +int __stdcall uhOpenGame(char*); +int __stdcall uhCloseGame(int); +int __stdcall uhReadGame(int hfd, void* buf, int count); +int __stdcall uhWriteGame(int hfd, void* buf, int count); +int __stdcall uhReadRamrom(int hfd, void* ramrom_adr, void* buf, int count); +int __stdcall uhWriteRamrom(int hfd, void* ramrom_adr, void* buf, int count); +int __stdcall uhPartnerInit(int hfd); +int __stdcall uhPartnerCmd(int hfd, char* ptcmd); +int __stdcall uhGload(int hfd, char* loadfile); + +#else /* }{ */ +#ifdef PTN64 /* { */ + +#define execl execl_pt + +#define uhOpenGame uhOpenGame_pt +#define uhCloseGame uhCloseGame_pt + +#define uhReadGame uhReadGame_pt +#define uhWriteGame uhWriteGame_pt +#define uhReadRamrom uhReadRamrom_pt +#define uhWriteRamrom uhWriteRamrom_pt +#define uhPartnerCmd uhPartnerCmd_pt +#define uhGload uhGload_pt + +int uhPartnerCmd(int, char*); +int uhGload(int, char*); + +#endif /* } */ + +#ifdef __cplusplus +extern "C" { +#endif +int uhOpenGame(const char*); +int uhCloseGame(int); + +int uhReadGame(int, void*, int); +int uhWriteGame(int, void*, int); +int uhWriteRamrom(int, void*, void*, int); +int uhReadRamrom(int, void*, void*, int); + +#ifdef __cplusplus +} +#endif +#endif /* } */ + +#endif /* ULTRAHOST */ diff --git a/lib/hackerlibultra/src/audio/Makefile b/lib/hackerlibultra/src/audio/Makefile new file mode 100644 index 00000000..d8fdce4e --- /dev/null +++ b/lib/hackerlibultra/src/audio/Makefile @@ -0,0 +1,120 @@ +#!smake +# +# Makefile for audio library subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = \ + drvrnew.c \ + load.c \ + auxbus.c \ + bnkf.c \ + env.c \ + event.c \ + filter.c \ + mainbus.c \ + resample.c \ + reverb.c \ + save.c \ + seq.c \ + sl.c \ + heapcheck.c \ + heapinit.c \ + heapalloc.c \ + copy.c \ + seqpdelete.c \ + seqpgetfxmix.c \ + seqpgetpan.c \ + seqpgetchlvol.c \ + seqpgetpriority.c \ + seqpgetprogram.c \ + seqpgetseq.c \ + seqpgettempo.c \ + seqpgetvol.c \ + seqpgetstate.c \ + seqploop.c \ + seqpplay.c \ + seqpsendmidi.c \ + seqpsetbank.c \ + seqpsetfxmix.c \ + seqpsetpan.c \ + seqpsetchlvol.c \ + seqpsetpriority.c \ + seqpsetprogram.c \ + seqpsetseq.c \ + seqpsettempo.c \ + seqpsetvol.c \ + seqpstop.c \ + seqplayer.c \ + cseq.c \ + cspdelete.c \ + cspgetfxmix.c \ + cspgetpan.c \ + cspgetchlvol.c \ + cspgetpriority.c \ + cspgetprogram.c \ + cspgetseq.c \ + cspgettempo.c \ + cspgetvol.c \ + cspgetstate.c \ + cspplay.c \ + cspsendmidi.c \ + cspsetbank.c \ + cspsetfxmix.c \ + cspsetpan.c \ + cspsetchlvol.c \ + cspsetpriority.c \ + cspsetprogram.c \ + cspsetseq.c \ + cspsettempo.c \ + cspsetvol.c \ + cspstop.c \ + csplayer.c \ + sndplayer.c \ + sndpdelete.c \ + sndpallocate.c \ + sndpdeallocate.c \ + sndpsetsound.c \ + sndpplay.c \ + sndpplayat.c \ + sndpgetsound.c \ + sndpstop.c \ + sndpgetstate.c \ + sndpsetpitch.c \ + sndpsetpriority.c \ + sndpsetvol.c \ + sndpsetpan.c \ + sndpsetfxmix.c \ + synthesizer.c \ + syndelete.c \ + synaddplayer.c \ + synremoveplayer.c \ + synfreevoice.c \ + synallocvoice.c \ + synstopvoice.c \ + synstartvoice.c \ + synstartvoiceparam.c \ + synsetpitch.c \ + synsetvol.c \ + synsetfxmix.c \ + synsetpan.c \ + syngetpriority.c \ + synsetpriority.c \ + synallocfx.c \ + synfreefx.c \ + syngetfxref.c \ + synsetfxparam.c \ + cents2ratio.c \ + parse_abi.c + +TARGETS = $(CFILES:.c=.o) + +default : $(TARGETS) + +include $(COMMONRULES) + + diff --git a/lib/hackerlibultra/src/audio/auxbus.c b/lib/hackerlibultra/src/audio/auxbus.c new file mode 100644 index 00000000..2ad99ce4 --- /dev/null +++ b/lib/hackerlibultra/src/audio/auxbus.c @@ -0,0 +1,59 @@ +/*==================================================================== + * auxbus.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "synthInternals.h" + +Acmd* alAuxBusPull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + ALAuxBus* m = (ALAuxBus*)filter; + ALFilter** sources = m->sources; + s32 i; + + /* + * clear the output buffers here + */ + aClearBuffer(ptr++, AL_AUX_L_OUT, outCount << 1); + aClearBuffer(ptr++, AL_AUX_R_OUT, outCount << 1); + + for (i = 0; i < m->sourceCount; i++) { + ptr = (sources[i]->handler)(sources[i], outp, outCount, sampleOffset, ptr); + } + + return ptr; +} + +s32 alAuxBusParam(void* filter, s32 paramID, void* param) { + ALAuxBus* m = (ALAuxBus*)filter; + ALFilter** sources = m->sources; + + switch (paramID) { + + case (AL_FILTER_ADD_SOURCE): + sources[m->sourceCount++] = (ALFilter*)param; + break; + + default: + /* ??? */ + break; + } + + return 0; +} diff --git a/lib/hackerlibultra/src/audio/bnkf.c b/lib/hackerlibultra/src/audio/bnkf.c new file mode 100644 index 00000000..3f8c7b73 --- /dev/null +++ b/lib/hackerlibultra/src/audio/bnkf.c @@ -0,0 +1,131 @@ +/*==================================================================== + * bnkf.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include + +/* + * ### when the file format settles down a little, I'll remove these + * ### for efficiency. + */ +static void _bnkfPatchBank(ALBank* bank, s32 offset, s32 table); +static void _bnkfPatchInst(ALInstrument* i, s32 offset, s32 table); +static void _bnkfPatchSound(ALSound* s, s32 offset, s32 table); +static void _bnkfPatchWaveTable(ALWaveTable* w, s32 offset, s32 table); + +void alSeqFileNew(ALSeqFile* file, u8* base) { + s32 offset = (s32)base; + s32 i; + + /* + * patch the file so that offsets are pointers + */ + for (i = 0; i < file->seqCount; i++) { + file->seqArray[i].offset = (u8*)((u8*)file->seqArray[i].offset + offset); + } +} + +void alBnkfNew(ALBankFile* file, u8* table) { + s32 offset = (s32)file; + s32 woffset = (s32)table; + + s32 i; + + /* + * check the file format revision in debug libraries + */ + ALFailIf(file->revision != AL_BANK_VERSION, ERR_ALBNKFNEW); + + /* + * patch the file so that offsets are pointers + */ + for (i = 0; i < file->bankCount; i++) { + file->bankArray[i] = (ALBank*)((u8*)file->bankArray[i] + offset); + if (file->bankArray[i]) + _bnkfPatchBank(file->bankArray[i], offset, woffset); + } +} + +void _bnkfPatchBank(ALBank* bank, s32 offset, s32 table) { + s32 i; + + if (bank->flags) + return; + + bank->flags = 1; + + if (bank->percussion) { + bank->percussion = (ALInstrument*)((u8*)bank->percussion + offset); + _bnkfPatchInst(bank->percussion, offset, table); + } + + for (i = 0; i < bank->instCount; i++) { + bank->instArray[i] = (ALInstrument*)((u8*)bank->instArray[i] + offset); + if (bank->instArray[i]) + _bnkfPatchInst(bank->instArray[i], offset, table); + } +} + +void _bnkfPatchInst(ALInstrument* inst, s32 offset, s32 table) { + s32 i; + + if (inst->flags) + return; + + inst->flags = 1; + + for (i = 0; i < inst->soundCount; i++) { + inst->soundArray[i] = (ALSound*)((u8*)inst->soundArray[i] + offset); + _bnkfPatchSound(inst->soundArray[i], offset, table); + } +} + +void _bnkfPatchSound(ALSound* s, s32 offset, s32 table) { + if (s->flags) + return; + + s->flags = 1; + + s->envelope = (ALEnvelope*)((u8*)s->envelope + offset); + s->keyMap = (ALKeyMap*)((u8*)s->keyMap + offset); + + s->wavetable = (ALWaveTable*)((u8*)s->wavetable + offset); + _bnkfPatchWaveTable(s->wavetable, offset, table); +} + +void _bnkfPatchWaveTable(ALWaveTable* w, s32 offset, s32 table) { + if (w->flags) + return; + + w->flags = 1; + + w->base += table; + + /* sct 2/14/96 - patch wavetable loop info based on type. */ + if (w->type == AL_ADPCM_WAVE) { + w->waveInfo.adpcmWave.book = (ALADPCMBook*)((u8*)w->waveInfo.adpcmWave.book + offset); + if (w->waveInfo.adpcmWave.loop) + w->waveInfo.adpcmWave.loop = (ALADPCMloop*)((u8*)w->waveInfo.adpcmWave.loop + offset); + } else if (w->type == AL_RAW16_WAVE) { + if (w->waveInfo.rawWave.loop) + w->waveInfo.rawWave.loop = (ALRawLoop*)((u8*)w->waveInfo.rawWave.loop + offset); + } +} diff --git a/lib/hackerlibultra/src/audio/cents2ratio.c b/lib/hackerlibultra/src/audio/cents2ratio.c new file mode 100644 index 00000000..b0593232 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cents2ratio.c @@ -0,0 +1,32 @@ +/* + * alCents2Ratio() + * + * Calculates the pitch shift ratio from the number of cents according to + * ratio = 2^(cents/1200) + * + * This is accurate to within one cent for ratios up and octave and down + * two ocataves. + */ + +#include + +f32 alCents2Ratio(s32 cents) { + f32 x; + f32 ratio = 1.0f; + + if (cents >= 0) { + x = 1.00057779f; /* 2^(1/1200) */ + } else { + x = 0.9994225441f; /* 2^(-1/1200) */ + cents = -cents; + } + + while (cents) { + if (cents & 1) + ratio *= x; + x *= x; + cents >>= 1; + } + + return ratio; +} diff --git a/lib/hackerlibultra/src/audio/copy.c b/lib/hackerlibultra/src/audio/copy.c new file mode 100644 index 00000000..9cf5d4d8 --- /dev/null +++ b/lib/hackerlibultra/src/audio/copy.c @@ -0,0 +1,33 @@ +/*==================================================================== + * copy.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCopy(void* src, void* dest, s32 len) { + s32 i; + u8* s = (u8*)src; + u8* d = (u8*)dest; + + for (i = 0; i < len; i++) { + *d++ = *s++; + } +} diff --git a/lib/hackerlibultra/src/audio/cseq.c b/lib/hackerlibultra/src/audio/cseq.c new file mode 100644 index 00000000..13f72eb4 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cseq.c @@ -0,0 +1,345 @@ +/*==================================================================== + * cseq.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include +#include "cseq.h" + +static u32 __readVarLen(ALCSeq* s, u32 track); +static u8 __getTrackByte(ALCSeq* s, u32 track); +static u32 __alCSeqGetTrackEvent(ALCSeq* seq, u32 track, ALEvent* event); + +void alCSeqNew(ALCSeq* seq, u8* ptr) { + u32 i, tmpOff, flagTmp; + + /* load the seqence pointed to by ptr */ + seq->base = (ALCMidiHdr*)ptr; + seq->validTracks = 0; + seq->lastDeltaTicks = 0; + seq->lastTicks = 0; + seq->deltaFlag = 1; + + for (i = 0; i < 16; i++) { + seq->lastStatus[i] = 0; + seq->curBUPtr[i] = 0; + seq->curBULen[i] = 0; + tmpOff = seq->base->trackOffset[i]; + if (tmpOff) /* if the track is valid */ + { + flagTmp = 1 << i; + seq->validTracks |= flagTmp; + seq->curLoc[i] = (u8*)((u32)ptr + tmpOff); + seq->evtDeltaTicks[i] = __readVarLen(seq, i); + /*__alCSeqGetTrackEvent(seq,i); prime the event buffers */ + } else + seq->curLoc[i] = 0; + } + + seq->qnpt = 1.0 / (f32)seq->base->division; +} + +void alCSeqNextEvent(ALCSeq* seq, ALEvent* evt) { + u32 i; + u32 firstTime = 0xFFFFFFFF; + u32 firstTrack; + u32 lastTicks = seq->lastDeltaTicks; + +#ifdef _DEBUG + /* sct 1/17/96 - Warn if we are beyond the end of sequence. */ + if (!seq->validTracks) + __osError(ERR_ALSEQOVERRUN, 0); +#endif + + for (i = 0; i < 16; i++) { + if ((seq->validTracks >> i) & 1) { + if (seq->deltaFlag) + seq->evtDeltaTicks[i] -= lastTicks; + if (seq->evtDeltaTicks[i] < firstTime) { + firstTime = seq->evtDeltaTicks[i]; + firstTrack = i; + } + } + } + + __alCSeqGetTrackEvent(seq, firstTrack, evt); + + evt->msg.midi.ticks = firstTime; + seq->lastTicks += firstTime; + seq->lastDeltaTicks = firstTime; + if (evt->type != AL_TRACK_END) + seq->evtDeltaTicks[firstTrack] += __readVarLen(seq, firstTrack); + seq->deltaFlag = 1; +} + +/* + Note: If there are no valid tracks (ie. all tracks have + reached the end of their data stream), then return FALSE + to indicate that there is no next event. +*/ +char __alCSeqNextDelta(ALCSeq* seq, s32* pDeltaTicks) { + u32 i; + u32 firstTime = 0xFFFFFFFF; + u32 lastTicks = seq->lastDeltaTicks; + + if (!seq->validTracks) + return FALSE; + + for (i = 0; i < 16; i++) { + if ((seq->validTracks >> i) & 1) { + if (seq->deltaFlag) + seq->evtDeltaTicks[i] -= lastTicks; + + if (seq->evtDeltaTicks[i] < firstTime) + firstTime = seq->evtDeltaTicks[i]; + } + } + + seq->deltaFlag = 0; + *pDeltaTicks = firstTime; + + return TRUE; +} + +/* only call alCSeqGetTrackEvent with a valid track !! */ +static u32 __alCSeqGetTrackEvent(ALCSeq* seq, u32 track, ALEvent* event) { + u32 offset; + u8 status, loopCt, curLpCt, *tmpPtr; + + status = __getTrackByte(seq, track); /* read the status byte */ + + if (status == AL_MIDI_Meta) /* running status not allowed on meta events!! */ + { + u8 type = __getTrackByte(seq, track); + + if (type == AL_MIDI_META_TEMPO) { + event->type = AL_TEMPO_EVT; + event->msg.tempo.status = status; + event->msg.tempo.type = type; + event->msg.tempo.byte1 = __getTrackByte(seq, track); + event->msg.tempo.byte2 = __getTrackByte(seq, track); + event->msg.tempo.byte3 = __getTrackByte(seq, track); + seq->lastStatus[track] = 0; /* lastStatus not supported after meta */ + } else if (type == AL_MIDI_META_EOT) { + u32 flagMask; + + flagMask = 0x01 << track; + seq->validTracks = seq->validTracks ^ flagMask; + + if (seq->validTracks) /* there is music left don't end */ + event->type = AL_TRACK_END; + else /* no more music send AL_SEQ_END_EVT msg */ + event->type = AL_SEQ_END_EVT; + } else if (type == AL_CMIDI_LOOPSTART_CODE) { + status = __getTrackByte(seq, track); /* get next two bytes, ignore them */ + status = __getTrackByte(seq, track); + seq->lastStatus[track] = 0; + event->type = AL_CSP_LOOPSTART; + } else if (type == AL_CMIDI_LOOPEND_CODE) { + tmpPtr = seq->curLoc[track]; + loopCt = *tmpPtr++; + curLpCt = *tmpPtr; + if (curLpCt == 0) /* done looping */ + { + *tmpPtr = loopCt; /* reset current loop count */ + seq->curLoc[track] = tmpPtr + 5; /* move pointer to end of event */ + } else { + if (curLpCt != 0xFF) /* not a loop forever */ + *tmpPtr = curLpCt - 1; /* decrement current loop count */ + tmpPtr++; /* get offset from end of event */ + offset = (*tmpPtr++) << 24; + offset += (*tmpPtr++) << 16; + offset += (*tmpPtr++) << 8; + offset += *tmpPtr++; + seq->curLoc[track] = tmpPtr - offset; + } + seq->lastStatus[track] = 0; + event->type = AL_CSP_LOOPEND; + } + +#ifdef _DEBUG + else + __osError(ERR_ALSEQMETA, 1, type); +#endif + + } else { + event->type = AL_SEQ_MIDI_EVT; + if (status & 0x80) /* if high bit is set, then new status */ + { + event->msg.midi.status = status; + event->msg.midi.byte1 = __getTrackByte(seq, track); + seq->lastStatus[track] = status; + } else /* running status */ + { +#ifdef _DEBUG + if (seq->lastStatus[track] == 0) + __osError(ERR_ALCSEQZEROSTATUS, 1, track); +#endif + event->msg.midi.status = seq->lastStatus[track]; + event->msg.midi.byte1 = status; + } + + if (((event->msg.midi.status & 0xf0) != AL_MIDI_ProgramChange) + && ((event->msg.midi.status & 0xf0) != AL_MIDI_ChannelPressure)) { + event->msg.midi.byte2 = __getTrackByte(seq, track); + if ((event->msg.midi.status & 0xf0) == AL_MIDI_NoteOn) { + event->msg.midi.duration = __readVarLen(seq, track); +#ifdef _DEBUG + if (event->msg.midi.byte2 == 0) + __osError(ERR_ALCSEQZEROVEL, 1, track); +#endif + } + } else + event->msg.midi.byte2 = 0; + } + return TRUE; +} + +f32 alCSeqTicksToSec(ALCSeq* seq, s32 ticks, u32 tempo) { + return ((f32)(((f32)(ticks) * (f32)(tempo)) / ((f32)(seq->base->division) * 1000000.0))); +} + +u32 alCSeqSecToTicks(ALCSeq* seq, f32 sec, u32 tempo) { + return (u32)(((sec * 1000000.0) * seq->base->division) / tempo); +} + +s32 alCSeqGetTicks(ALCSeq* seq) { + return seq->lastTicks; +} + +void alCSeqNewMarker(ALCSeq* seq, ALCSeqMarker* m, u32 ticks) { + ALEvent evt; + ALCSeq tempSeq; + s32 i; + + alCSeqNew(&tempSeq, (u8*)seq->base); + + do { + m->validTracks = tempSeq.validTracks; + m->lastTicks = tempSeq.lastTicks; + m->lastDeltaTicks = tempSeq.lastDeltaTicks; + + for (i = 0; i < 16; i++) { + m->curLoc[i] = tempSeq.curLoc[i]; + m->curBUPtr[i] = tempSeq.curBUPtr[i]; + m->curBULen[i] = tempSeq.curBULen[i]; + m->lastStatus[i] = tempSeq.lastStatus[i]; + m->evtDeltaTicks[i] = tempSeq.evtDeltaTicks[i]; + } + + alCSeqNextEvent(&tempSeq, &evt); + + if (evt.type == AL_SEQ_END_EVT) + break; + + } while (tempSeq.lastTicks < ticks); +} + +void alCSeqSetLoc(ALCSeq* seq, ALCSeqMarker* m) { + s32 i; + + seq->validTracks = m->validTracks; + seq->lastTicks = m->lastTicks; + seq->lastDeltaTicks = m->lastDeltaTicks; + + for (i = 0; i < 16; i++) { + seq->curLoc[i] = m->curLoc[i]; + seq->curBUPtr[i] = m->curBUPtr[i]; + seq->curBULen[i] = m->curBULen[i]; + seq->lastStatus[i] = m->lastStatus[i]; + seq->evtDeltaTicks[i] = m->evtDeltaTicks[i]; + } +} + +void alCSeqGetLoc(ALCSeq* seq, ALCSeqMarker* m) { + s32 i; + + m->validTracks = seq->validTracks; + m->lastTicks = seq->lastTicks; + m->lastDeltaTicks = seq->lastDeltaTicks; + + for (i = 0; i < 16; i++) { + m->curLoc[i] = seq->curLoc[i]; + m->curBUPtr[i] = seq->curBUPtr[i]; + m->curBULen[i] = seq->curBULen[i]; + m->lastStatus[i] = seq->lastStatus[i]; + m->evtDeltaTicks[i] = seq->evtDeltaTicks[i]; + } +} + +/* non-aligned byte reading routines */ +static u8 __getTrackByte(ALCSeq* seq, u32 track) { + u8 theByte; + + if (seq->curBULen[track]) { + theByte = *seq->curBUPtr[track]; + seq->curBUPtr[track]++; + seq->curBULen[track]--; + } else /* need to handle backup mode */ + { + theByte = *seq->curLoc[track]; + seq->curLoc[track]++; + if (theByte == AL_CMIDI_BLOCK_CODE) { + u8 loBackUp, hiBackUp, theLen, nextByte; + u32 backup; + + nextByte = *seq->curLoc[track]; + seq->curLoc[track]++; + if (nextByte != AL_CMIDI_BLOCK_CODE) { + /* if here, then got a backup section. get the amount of + backup, and the len of the section. Subtract the amount of + backup from the curLoc ptr, and subtract four more, since + curLoc has been advanced by four while reading the codes. */ + hiBackUp = nextByte; + loBackUp = *seq->curLoc[track]; + seq->curLoc[track]++; + theLen = *seq->curLoc[track]; + seq->curLoc[track]++; + backup = (u32)hiBackUp; + backup = backup << 8; + backup += loBackUp; + seq->curBUPtr[track] = seq->curLoc[track] - (backup + 4); + seq->curBULen[track] = (u32)theLen; + + /* now get the byte */ + theByte = *seq->curBUPtr[track]; + seq->curBUPtr[track]++; + seq->curBULen[track]--; + } + } + } + + return theByte; +} + +static u32 __readVarLen(ALCSeq* seq, u32 track) { + u32 value; + u32 c; + + value = (u32)__getTrackByte(seq, track); + if (value & 0x00000080) { + value &= 0x7f; + do { + c = (u32)__getTrackByte(seq, track); + value = (value << 7) + (c & 0x7f); + } while (c & 0x80); + } + return (value); +} diff --git a/lib/hackerlibultra/src/audio/cseq.h b/lib/hackerlibultra/src/audio/cseq.h new file mode 100644 index 00000000..cc26002b --- /dev/null +++ b/lib/hackerlibultra/src/audio/cseq.h @@ -0,0 +1,8 @@ + + +#ifndef __cseq__ +#define __cseq__ + +char __alCSeqNextDelta(ALCSeq* seq, s32* pDeltaTicks); + +#endif /* __cseq__ */ diff --git a/lib/hackerlibultra/src/audio/cseqp.h b/lib/hackerlibultra/src/audio/cseqp.h new file mode 100644 index 00000000..20db2ea0 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cseqp.h @@ -0,0 +1,8 @@ + + +#ifndef __cseqp__ +#define __cseqp__ + +void __CSPPostNextSeqEvent(ALCSPlayer* seqp); + +#endif /* __cseqp__ */ diff --git a/lib/hackerlibultra/src/audio/cspdelete.c b/lib/hackerlibultra/src/audio/cspdelete.c new file mode 100644 index 00000000..964603bd --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspdelete.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspdelete.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPDelete(ALCSPlayer* seqp) { + alSynRemovePlayer(seqp->drvr, &seqp->node); +} diff --git a/lib/hackerlibultra/src/audio/cspgetchlvol.c b/lib/hackerlibultra/src/audio/cspgetchlvol.c new file mode 100644 index 00000000..3f1f3054 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetchlvol.c @@ -0,0 +1,25 @@ +/*==================================================================== + * cspgetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alCSPGetChlVol(ALCSPlayer* seqp, u8 chan) { + return seqp->chanState[chan].vol; +} diff --git a/lib/hackerlibultra/src/audio/cspgetfxmix.c b/lib/hackerlibultra/src/audio/cspgetfxmix.c new file mode 100644 index 00000000..24e2f8e3 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetfxmix.c @@ -0,0 +1,25 @@ +/*==================================================================== + * cspgetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alCSPGetChlFXMix(ALCSPlayer* seqp, u8 chan) { + return seqp->chanState[chan].fxmix; +} diff --git a/lib/hackerlibultra/src/audio/cspgetpan.c b/lib/hackerlibultra/src/audio/cspgetpan.c new file mode 100644 index 00000000..ff4ea704 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetpan.c @@ -0,0 +1,25 @@ +/*==================================================================== + * cspgetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALPan alCSPGetChlPan(ALCSPlayer* seqp, u8 chan) { + return seqp->chanState[chan].pan; +} diff --git a/lib/hackerlibultra/src/audio/cspgetpriority.c b/lib/hackerlibultra/src/audio/cspgetpriority.c new file mode 100644 index 00000000..76f2a465 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetpriority.c @@ -0,0 +1,25 @@ +/*==================================================================== + * cspgetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alCSPGetChlPriority(ALCSPlayer* seqp, u8 chan) { + return seqp->chanState[chan].priority; +} diff --git a/lib/hackerlibultra/src/audio/cspgetprogram.c b/lib/hackerlibultra/src/audio/cspgetprogram.c new file mode 100644 index 00000000..f890567b --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetprogram.c @@ -0,0 +1,40 @@ +/*==================================================================== + * cspgetprogram.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alCSPGetChlProgram(ALCSPlayer* seqp, u8 chan) + +{ + s32 i; + ALBank* b = seqp->bank; + ALInstrument* inst; + ALChanState s; + + s = seqp->chanState[chan]; + for (i = 0; i < b->instCount; i++) { + inst = b->instArray[i]; + if (inst == s.instrument) + return i; + } + return (-1); +} diff --git a/lib/hackerlibultra/src/audio/cspgetseq.c b/lib/hackerlibultra/src/audio/cspgetseq.c new file mode 100644 index 00000000..af36f0f2 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetseq.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspgetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALCSeq* alCSPGetSeq(ALCSPlayer* seqp) { + return seqp->target; +} diff --git a/lib/hackerlibultra/src/audio/cspgetstate.c b/lib/hackerlibultra/src/audio/cspgetstate.c new file mode 100644 index 00000000..73735e6f --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetstate.c @@ -0,0 +1,27 @@ +/*==================================================================== + * cspgetstate.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alCSPGetState(ALCSPlayer* seqp) { + return seqp->state; +} diff --git a/lib/hackerlibultra/src/audio/cspgettempo.c b/lib/hackerlibultra/src/audio/cspgettempo.c new file mode 100644 index 00000000..9856cd08 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgettempo.c @@ -0,0 +1,29 @@ +/*==================================================================== + * cspgettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alCSPGetTempo(ALCSPlayer* seqp) { + /* sct 1/8/96 - If no target sequence has been set, just return zero (instead of crashing). */ + if (seqp->target == NULL) + return 0; + + return seqp->uspt / seqp->target->qnpt; +} diff --git a/lib/hackerlibultra/src/audio/cspgetvol.c b/lib/hackerlibultra/src/audio/cspgetvol.c new file mode 100644 index 00000000..72726aa1 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspgetvol.c @@ -0,0 +1,25 @@ +/*==================================================================== + * cspgetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s16 alCSPGetVol(ALCSPlayer* seqp) { + return seqp->vol; +} diff --git a/lib/hackerlibultra/src/audio/csplayer.c b/lib/hackerlibultra/src/audio/csplayer.c new file mode 100644 index 00000000..496de8da --- /dev/null +++ b/lib/hackerlibultra/src/audio/csplayer.c @@ -0,0 +1,805 @@ +/*==================================================================== + * csplayer.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +/* + * Notes: + * + * Controller Numbers: + * 1 Modulation + * 7 Volume + * 10 Pan + * 11 Expression + * 64 Sustain + * 121 Reset All Controllers + * 123 All Notes Off + * + * Registered Parameters + * 0 Pitch Bend Sensitivity + * 1 Fine Tuning + * 2 Coarse Tuning + */ + +#include +#include +#include +#include +#include "seqp.h" +#include "cseqp.h" +#include "cseq.h" +// TODO: this comes from a header +#ident "$Revision: 1.17 $" +static ALMicroTime __CSPVoiceHandler(void* node); +static void __CSPHandleNextSeqEvent(ALCSPlayer* seqp); +static void __CSPHandleMIDIMsg(ALCSPlayer* seqp, ALEvent* event); +static void __CSPHandleMetaMsg(ALCSPlayer* seqp, ALEvent* event); +static void __CSPRepostEvent(ALEventQueue* evtq, ALEventListItem* item); +static void __setUsptFromTempo(ALCSPlayer* seqp, f32 tempo); /* sct 1/8/96 */ + +/* + * Sequence Player public functions + */ +void alCSPNew(ALCSPlayer* seqp, ALSeqpConfig* c) { + s32 i; + ALEventListItem* items; + ALVoiceState* vs; + ALVoiceState* voices; + + ALHeap* hp = c->heap; + + /* + * initialize member variables + */ + seqp->bank = 0; + seqp->target = NULL; + seqp->drvr = &alGlobals->drvr; + seqp->chanMask = 0xff; + seqp->uspt = 488; + seqp->nextDelta = 0; + seqp->state = AL_STOPPED; + seqp->vol = 0x7FFF; /* full volume */ + seqp->frameTime = AL_USEC_PER_FRAME; /* should get this from driver */ + seqp->curTime = 0; + seqp->initOsc = c->initOsc; + seqp->updateOsc = c->updateOsc; + seqp->stopOsc = c->stopOsc; + + seqp->nextEvent.type = AL_SEQP_API_EVT; /* this will start the voice handler "spinning" */ + + /* + * init the channel state + */ + seqp->maxChannels = c->maxChannels; + seqp->chanState = alHeapAlloc(hp, c->maxChannels, sizeof(ALChanState)); + __initChanState((ALSeqPlayer*)seqp); /* sct 11/6/95 */ + + /* + * init the voice state array + */ + voices = alHeapAlloc(hp, c->maxVoices, sizeof(ALVoiceState)); + seqp->vFreeList = 0; + for (i = 0; i < c->maxVoices; i++) { + vs = &voices[i]; + vs->next = seqp->vFreeList; + seqp->vFreeList = vs; + } + + seqp->vAllocHead = 0; + seqp->vAllocTail = 0; +#if BUILD_VERSION < VERSION_J +#line 109 +#endif + // init the event queue + items = alHeapAlloc(hp, c->maxEvents, sizeof(ALEventListItem)); + alEvtqNew(&seqp->evtq, items, c->maxEvents); + + /* + * add ourselves to the driver + */ + seqp->node.next = NULL; + seqp->node.handler = __CSPVoiceHandler; + seqp->node.clientData = seqp; + alSynAddPlayer(&alGlobals->drvr, &seqp->node); +} + +/************************************************************* + * private routines or driver callback routines + *************************************************************/ +static ALMicroTime __CSPVoiceHandler(void* node) { + ALCSPlayer* seqp = (ALCSPlayer*)node; + ALEvent evt; + ALVoice* voice; + ALMicroTime delta; + ALVoiceState* vs; + void* oscState; + f32 oscValue; + u8 chan; + + do { + switch (seqp->nextEvent.type) { + case (AL_SEQ_REF_EVT): + __CSPHandleNextSeqEvent(seqp); + break; + + case (AL_SEQP_API_EVT): + evt.type = AL_SEQP_API_EVT; + alEvtqPostEvent(&seqp->evtq, (ALEvent*)&evt, seqp->frameTime); + break; + + case (AL_NOTE_END_EVT): + voice = seqp->nextEvent.msg.note.voice; + + alSynStopVoice(seqp->drvr, voice); + alSynFreeVoice(seqp->drvr, voice); + vs = (ALVoiceState*)voice->clientPrivate; + if (vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp, vs); + __unmapVoice((ALSeqPlayer*)seqp, voice); + break; + + case (AL_SEQP_ENV_EVT): + voice = seqp->nextEvent.msg.vol.voice; + vs = (ALVoiceState*)voice->clientPrivate; + + if (vs->envPhase == AL_PHASE_ATTACK) + vs->envPhase = AL_PHASE_DECAY; + + delta = seqp->nextEvent.msg.vol.delta; + vs->envEndTime = seqp->curTime + delta; + vs->envGain = seqp->nextEvent.msg.vol.vol; + alSynSetVol(seqp->drvr, voice, __vsVol(vs, (ALSeqPlayer*)seqp), delta); + break; + + case (AL_TREM_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + delta = (*seqp->updateOsc)(oscState, &oscValue); + vs->tremelo = (u8)oscValue; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, (ALSeqPlayer*)seqp), __vsDelta(vs, seqp->curTime)); + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_VIB_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + chan = seqp->nextEvent.msg.osc.chan; + delta = (*seqp->updateOsc)(oscState, &oscValue); + vs->vibrato = oscValue; + alSynSetPitch(seqp->drvr, &vs->voice, vs->pitch * vs->vibrato * seqp->chanState[chan].pitchBend); + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_SEQP_MIDI_EVT): + case (AL_CSP_NOTEOFF_EVT): /* nextEvent is a note off midi message */ + __CSPHandleMIDIMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_META_EVT): + __CSPHandleMetaMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_VOL_EVT): + seqp->vol = seqp->nextEvent.msg.spvol.vol; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, (ALSeqPlayer*)seqp), __vsDelta(vs, seqp->curTime)); + } + break; + + case (AL_SEQP_PLAY_EVT): + if (seqp->state != AL_PLAYING) { + seqp->state = AL_PLAYING; + __CSPPostNextSeqEvent(seqp); /* seqp must be AL_PLAYING before we call this routine. */ + } + break; + + case (AL_SEQP_STOP_EVT): + if (seqp->state == AL_STOPPING) { + for (vs = seqp->vAllocHead; vs != 0; vs = seqp->vAllocHead) { +#ifdef _DEBUG + __osError(ERR_ALCSPVNOTFREE, 2, vs->channel, vs->key); +#endif + alSynStopVoice(seqp->drvr, &vs->voice); + alSynFreeVoice(seqp->drvr, &vs->voice); + if (vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp, vs); + __unmapVoice((ALSeqPlayer*)seqp, &vs->voice); + } + seqp->state = AL_STOPPED; + + /* alEvtqFlush(&seqp->evtq); - Don't flush event queue + anymore. */ + /* sct 1/3/96 - Don't overwrite nextEvent with + AL_SEQP_API_EVT or set nextDelta to + AL_USEC_PER_FRAME since we're not stopping event + processing. */ + /* sct 1/3/96 - Don't return here since we keep + processing events as usual. */ + } + break; + + case (AL_SEQP_STOPPING_EVT): + if (seqp->state == AL_PLAYING) { + /* sct 12/29/95 - Remove events associated with the + * stopping sequence. For compact sequence player, + * also remove all queued note off events since they + * are not contained in a compact sequence but are + * generated in response to note ons. Note that + * flushing AL_SEQP_MIDI_EVTs may flush events that + * were posted after the call to alSeqpStop, so the + * application must queue these events either when + * the player is fully stopped, or when it is + * playing. */ + alEvtqFlushType(&seqp->evtq, AL_SEQ_REF_EVT); + alEvtqFlushType(&seqp->evtq, AL_CSP_NOTEOFF_EVT); + alEvtqFlushType(&seqp->evtq, AL_SEQP_MIDI_EVT); + + /* sct 1/3/96 - Check to see which voices need to be + killed and release them. */ + /* Unkilled voices should have note end events + occurring prior to KILL_TIME. */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (__voiceNeedsNoteKill((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME)) + __seqpReleaseVoice((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME); + } + + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + } + break; + + case (AL_SEQP_PRIORITY_EVT): + chan = seqp->nextEvent.msg.sppriority.chan; + seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority; + break; + + case (AL_SEQP_SEQ_EVT): +#if BUILD_VERSION < VERSION_J +#line 294 +#endif + assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */ + + seqp->target = seqp->nextEvent.msg.spseq.seq; + __setUsptFromTempo(seqp, 500000.0); + if (seqp->bank) + __initFromBank((ALSeqPlayer*)seqp, seqp->bank); + break; + + case (AL_SEQP_BANK_EVT): +#if BUILD_VERSION < VERSION_J +#line 303 +#endif + assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */ + + seqp->bank = seqp->nextEvent.msg.spbank.bank; + __initFromBank((ALSeqPlayer*)seqp, seqp->bank); + break; + + /* sct 11/6/95 - these events should now be handled by __CSPHandleNextSeqEvent */ + case (AL_SEQ_END_EVT): + case (AL_TEMPO_EVT): + case (AL_SEQ_MIDI_EVT): +#if BUILD_VERSION < VERSION_J +#line 313 +#endif + assert(FALSE); + + break; + } + seqp->nextDelta = alEvtqNextEvent(&seqp->evtq, &seqp->nextEvent); + + } while (seqp->nextDelta == 0); + + /* + * assume that next callback won't be more than half an + * hour away + */ + seqp->curTime += seqp->nextDelta; /* sct 11/7/95 */ + return seqp->nextDelta; +} + +/* + Calculates the delta time in ticks until the next sequence + event and posts a sequence reference event with the time in usecs. + Loops are handled automatically by the compact sequence. + + Does nothing if the sequence player is not playing or if there + is no target sequence. + + sct 11/7/95 +*/ +void __CSPPostNextSeqEvent(ALCSPlayer* seqp) { + ALEvent evt; + s32 deltaTicks; + + if (seqp->state != AL_PLAYING || seqp->target == NULL) + return; + + /* Get the next event time in ticks. */ + /* If false is returned, then there is no next delta (ie. end of sequence reached). */ + if (!__alCSeqNextDelta(seqp->target, &deltaTicks)) + return; + + evt.type = AL_SEQ_REF_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTicks * seqp->uspt); +} + +/* + Call this routine to handle the next event in the sequence. + Assumes that the next sequence event is scheduled to be processed + immediately since it does not check the event's tick time. + + sct 11/7/95 +*/ +static void __CSPHandleNextSeqEvent(ALCSPlayer* seqp) { + ALEvent evt; + + /* sct 1/5/96 - Do nothing if we don't have a target sequence. */ + if (seqp->target == NULL) + return; + + alCSeqNextEvent(seqp->target, &evt); + + switch (evt.type) { + case AL_SEQ_MIDI_EVT: + __CSPHandleMIDIMsg(seqp, &evt); + __CSPPostNextSeqEvent(seqp); + break; + + case AL_TEMPO_EVT: + __CSPHandleMetaMsg(seqp, &evt); + __CSPPostNextSeqEvent(seqp); + break; + + case AL_SEQ_END_EVT: + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + break; + + case AL_TRACK_END: + case AL_CSP_LOOPSTART: + case AL_CSP_LOOPEND: + __CSPPostNextSeqEvent(seqp); + break; + + default: +#if BUILD_VERSION < VERSION_J +#line 399 +#endif + assert(FALSE); /* Sequence event type not supported. */ +#if BUILD_VERSION >= VERSION_J + break; +#endif + } +} + +static void __CSPHandleMIDIMsg(ALCSPlayer* seqp, ALEvent* event) { + ALVoice* voice; + ALVoiceState* vs; + s32 status; + u8 chan; + u8 key; + u8 vel; + u8 byte1; + u8 byte2; + ALMIDIEvent* midi = &event->msg.midi; + s16 vol; + ALEvent evt; + ALMicroTime deltaTime; + ALVoiceState* vstate; + ALPan pan; + ALFxRef fxref; + + status = midi->status & AL_MIDI_StatusMask; + chan = midi->status & AL_MIDI_ChannelMask; + byte1 = key = midi->byte1; + byte2 = vel = midi->byte2; + + switch (status) { + case (AL_MIDI_NoteOn): + + if (vel != 0) /* a real note on */ + { + ALVoiceConfig config; + ALSound* sound; + s16 cents; + f32 pitch, oscValue; + u8 fxmix; + void* oscState; + ALInstrument* inst; + + /* If we're not playing, don't process note ons. */ + if (seqp->state != AL_PLAYING) + break; + + sound = __lookupSoundQuick((ALSeqPlayer*)seqp, key, vel, chan); + ALFlagFailIf(!sound, seqp->debugFlags & NO_SOUND_ERR_MASK, ERR_ALSEQP_NO_SOUND); + + config.priority = seqp->chanState[chan].priority; + config.fxBus = 0; + config.unityPitch = 0; + + vstate = __mapVoice((ALSeqPlayer*)seqp, key, vel, chan); + ALFlagFailIf(!vstate, seqp->debugFlags & NO_VOICE_ERR_MASK, ERR_ALSEQP_NO_VOICE); + + voice = &vstate->voice; + + alSynAllocVoice(seqp->drvr, voice, &config); + + /* + * set up the voice state structure + */ + vstate->sound = sound; + vstate->envPhase = AL_PHASE_ATTACK; + if (seqp->chanState[chan].sustain > AL_SUSTAIN) + vstate->phase = AL_PHASE_SUSTAIN; + else + vstate->phase = AL_PHASE_NOTEON; + + cents = (key - sound->keyMap->keyBase) * 100 + sound->keyMap->detune; + + vstate->pitch = alCents2Ratio(cents); + vstate->envGain = sound->envelope->attackVolume; + vstate->envEndTime = seqp->curTime + sound->envelope->attackTime; + + /* + * setup tremelo and vibrato if active + */ + vstate->flags = 0; + inst = seqp->chanState[chan].instrument; + + oscValue = (f32)AL_VOL_FULL; /* set this as a default */ + if (inst->tremType) { + if (seqp->initOsc) { + deltaTime = (*seqp->initOsc)(&oscState, &oscValue, inst->tremType, inst->tremRate, + inst->tremDepth, inst->tremDelay); + + if (deltaTime) /* a deltaTime of zero means don't run osc */ + { + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x01; /* set tremelo flag bit */ + } + } + } + vstate->tremelo = (u8)oscValue; /* will default if not changed by initOsc */ + + oscValue = 1.0f; /* set this as a default */ + if (inst->vibType) { + if (seqp->initOsc) { + deltaTime = (*seqp->initOsc)(&oscState, &oscValue, inst->vibType, inst->vibRate, inst->vibDepth, + inst->vibDelay); + + if (deltaTime) /* a deltaTime of zero means don't run osc. */ + { + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x02; /* set the vibrato flag bit */ + } + } + } + vstate->vibrato = oscValue; /* will default if not changed by initOsc */ + + /* + * calculate the note on parameters + */ + pitch = vstate->pitch * seqp->chanState[chan].pitchBend * vstate->vibrato; + fxmix = seqp->chanState[chan].fxmix; + pan = __vsPan(vstate, (ALSeqPlayer*)seqp); + vol = __vsVol(vstate, (ALSeqPlayer*)seqp); + deltaTime = sound->envelope->attackTime; + + alSynStartVoiceParams(seqp->drvr, voice, sound->wavetable, pitch, vol, pan, fxmix, deltaTime); + /* + * set up callbacks for envelope + */ + evt.type = AL_SEQP_ENV_EVT; + evt.msg.vol.voice = voice; + evt.msg.vol.vol = sound->envelope->decayVolume; + evt.msg.vol.delta = sound->envelope->decayTime; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + + if (midi->duration) { + /* + * set up note off evt. if no duration don't do this + */ + evt.type = AL_CSP_NOTEOFF_EVT; + evt.msg.midi.status = chan | AL_MIDI_NoteOff; + evt.msg.midi.byte1 = key; + evt.msg.midi.byte2 = 0; /* not needed ? */ + deltaTime = seqp->uspt * midi->duration; + + /* max time would be about one hour ten minutes */ + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + } + + break; + } + + /* + * NOTE: intentional fall-through for note on with zero + * velocity (Should never happen with compact midi sequence, + * but could happen with real time midi.) + */ + + case (AL_MIDI_NoteOff): + vstate = __lookupVoice((ALSeqPlayer*)seqp, key, chan); + ALFlagFailIf(!vstate, seqp->debugFlags & NOTE_OFF_ERR_MASK, ERR_ALSEQP_OFF_VOICE); + + if (vstate->phase == AL_PHASE_SUSTAIN) + vstate->phase = AL_PHASE_SUSTREL; + else { + vstate->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice((ALSeqPlayer*)seqp, &vstate->voice, vstate->sound->envelope->releaseTime); + } + + break; + + case (AL_MIDI_PolyKeyPressure): + /* + * Aftertouch per key (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + vstate = __lookupVoice((ALSeqPlayer*)seqp, key, chan); + ALFailIf(!vstate, ERR_ALSEQP_POLY_VOICE); + + vstate->velocity = byte2; + alSynSetVol(seqp->drvr, &vstate->voice, __vsVol(vstate, (ALSeqPlayer*)seqp), + __vsDelta(vstate, seqp->curTime)); + break; + + case (AL_MIDI_ChannelPressure): + /* + * Aftertouch per channel (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + vs->velocity = byte1; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, (ALSeqPlayer*)seqp), __vsDelta(vs, seqp->curTime)); + } + } + break; + + case (AL_MIDI_ControlChange): + switch (byte1) { + case (AL_MIDI_PAN_CTRL): + seqp->chanState[chan].pan = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + pan = __vsPan(vs, (ALSeqPlayer*)seqp); + alSynSetPan(seqp->drvr, &vs->voice, pan); + } + } + break; + case (AL_MIDI_VOLUME_CTRL): + seqp->chanState[chan].vol = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->channel == chan) && (vs->envPhase != AL_PHASE_RELEASE)) { + vol = __vsVol(vs, (ALSeqPlayer*)seqp); + alSynSetVol(seqp->drvr, &vs->voice, vol, __vsDelta(vs, seqp->curTime)); + } + } + break; + case (AL_MIDI_PRIORITY_CTRL): + /* leave current voices where they are */ + seqp->chanState[chan].priority = byte2; + break; + case (AL_MIDI_SUSTAIN_CTRL): + seqp->chanState[chan].sustain = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->channel == chan) && (vs->phase != AL_PHASE_RELEASE)) { + if (byte2 > AL_SUSTAIN) { + /* + * sustain pedal down + */ + if (vs->phase == AL_PHASE_NOTEON) + vs->phase = AL_PHASE_SUSTAIN; + } else { + /* + * sustain pedal up + */ + if (vs->phase == AL_PHASE_SUSTAIN) + vs->phase = AL_PHASE_NOTEON; + + else if (vs->phase == AL_PHASE_SUSTREL) { + vs->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice((ALSeqPlayer*)seqp, &vs->voice, + vs->sound->envelope->releaseTime); + } + } + } + } + break; + case (AL_MIDI_FX1_CTRL): + seqp->chanState[chan].fxmix = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) + alSynSetFXMix(seqp->drvr, &vs->voice, byte2); + } + break; + /* case (AL_MIDI_FX_CTRL_0): + case (AL_MIDI_FX_CTRL_1): + case (AL_MIDI_FX_CTRL_2): + case (AL_MIDI_FX_CTRL_3): + case (AL_MIDI_FX_CTRL_4): + case (AL_MIDI_FX_CTRL_5): + case (AL_MIDI_FX_CTRL_6): + case (AL_MIDI_FX_CTRL_7): + fxref = alSynGetFXRef(seqp->drvr, 0, 0); + if (fxref) + alSynSetFXParam(seqp->drvr, fxref, (s16)byte1, (void + *)byte2); break; case (AL_MIDI_FX3_CTRL): */ + default: + break; + } + break; + case (AL_MIDI_ProgramChange): + /* sct 1/16/96 - We must have a valid bank in order to process the program change. */ +#if BUILD_VERSION < VERSION_J +#line 710 +#endif + assert(seqp->bank != NULL); + + if (key < seqp->bank->instCount) { + ALInstrument* inst = seqp->bank->instArray[key]; + __setInstChanState((ALSeqPlayer*)seqp, inst, chan); /* sct 11/6/95 */ + } else { +#ifdef _DEBUG + __osError(ERR_ALSEQPINVALIDPROG, 2, key, seqp->bank->instCount); +#endif + } + break; + case (AL_MIDI_PitchBendChange): { + s32 bendVal; + f32 bendRatio; + s32 cents; + + /* get 14-bit unsigned midi value */ + bendVal = ((byte2 << 7) + byte1) - 8192; + + /* calculate pitch bend in cents */ + cents = (seqp->chanState[chan].bendRange * bendVal) / 8192; + + /* calculate the corresponding ratio */ + bendRatio = alCents2Ratio(cents); + seqp->chanState[chan].pitchBend = bendRatio; + + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) + if (vs->channel == chan) + alSynSetPitch(seqp->drvr, &vs->voice, vs->pitch * bendRatio * vs->vibrato); + + } break; + + default: +#ifdef _DEBUG + __osError(ERR_ALSEQPUNKNOWNMIDI, 1, status); +#endif + break; + } +} + +static void __CSPHandleMetaMsg(ALCSPlayer* seqp, ALEvent* event) { + ALTempoEvent* tevt = &event->msg.tempo; + ALEvent evt; + s32 tempo; + s32 oldUspt; + u32 ticks; + ALMicroTime tempDelta, curDelta = 0; + ALEventListItem *thisNode, *nextNode, *firstTemp = 0; + + if (event->msg.tempo.status == AL_MIDI_Meta) { + if (event->msg.tempo.type == AL_MIDI_META_TEMPO) { + oldUspt = seqp->uspt; + tempo = (tevt->byte1 << 16) | (tevt->byte2 << 8) | (tevt->byte3 << 0); + __setUsptFromTempo(seqp, (f32)tempo); /* sct 1/8/96 */ + + thisNode = (ALEventListItem*)seqp->evtq.allocList.next; + while (thisNode) { + curDelta += thisNode->delta; + nextNode = (ALEventListItem*)thisNode->node.next; + if (thisNode->evt.type == AL_CSP_NOTEOFF_EVT) { + alUnlink((ALLink*)thisNode); + + if (firstTemp) + alLink((ALLink*)thisNode, (ALLink*)firstTemp); + else { + thisNode->node.next = 0; + thisNode->node.prev = 0; + firstTemp = thisNode; + } + tempDelta = curDelta; /* record the current delta */ + if (nextNode) /* don't do this if no nextNode */ + { + curDelta -= thisNode->delta; /* subtract out this delta */ + nextNode->delta += thisNode->delta; /* add it to next event */ + } + thisNode->delta = tempDelta; /* set this event delta from current */ + } + thisNode = nextNode; + } + + thisNode = firstTemp; + while (thisNode) { + nextNode = (ALEventListItem*)thisNode->node.next; + ticks = thisNode->delta / oldUspt; + thisNode->delta = ticks * seqp->uspt; + __CSPRepostEvent(&seqp->evtq, thisNode); + thisNode = nextNode; + } + } + } +} + +static void __CSPRepostEvent(ALEventQueue* evtq, ALEventListItem* item) { + OSIntMask mask; + ALLink* node; + ALEventListItem* nextItem; + + mask = osSetIntMask(OS_IM_NONE); + + for (node = &evtq->allocList; node != 0; node = node->next) { + if (!node->next) /* end of the list */ + { + alLink((ALLink*)item, node); + break; + } else { + nextItem = (ALEventListItem*)node->next; + if (item->delta < nextItem->delta) { + nextItem->delta -= item->delta; + alLink((ALLink*)item, node); + break; + } + item->delta -= nextItem->delta; + } + } + osSetIntMask(mask); +} + +/* + This routine safely calculates the sequence player's + uspt value based on the given tempo. It does this safely + by making sure that the player has a target sequence and + therefore a qnpt value which is needed for the calculation. + + Compact sequence player needs its own version of this routine + since the ALCSeq's qnpt field is at a different offset. +*/ +static void __setUsptFromTempo(ALCSPlayer* seqp, f32 tempo) { + if (seqp->target) + seqp->uspt = (s32)((f32)tempo * seqp->target->qnpt); + else + seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */ +} diff --git a/lib/hackerlibultra/src/audio/cspplay.c b/lib/hackerlibultra/src/audio/cspplay.c new file mode 100644 index 00000000..38d0082c --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspplay.c @@ -0,0 +1,32 @@ +/*==================================================================== + * cspplay.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "cseqp.h" + +void alCSPPlay(ALCSPlayer* seqp) { + ALEvent evt; + + evt.type = AL_SEQP_PLAY_EVT; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsendmidi.c b/lib/hackerlibultra/src/audio/cspsendmidi.c new file mode 100644 index 00000000..628457d0 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsendmidi.c @@ -0,0 +1,37 @@ +/*==================================================================== + * cspsendmidi.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSendMidi(ALCSPlayer* seqp, s32 ticks, u8 status, u8 byte1, u8 byte2) { + ALEvent evt; + ALMicroTime deltaTime; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = status; + evt.msg.midi.byte1 = byte1; + evt.msg.midi.byte2 = byte2; + evt.msg.midi.duration = 0; + + deltaTime = ticks * seqp->uspt; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); +} diff --git a/lib/hackerlibultra/src/audio/cspsetbank.c b/lib/hackerlibultra/src/audio/cspsetbank.c new file mode 100644 index 00000000..11334edb --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetbank.c @@ -0,0 +1,30 @@ +/*==================================================================== + * cspsetbank.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetBank(ALCSPlayer* seqp, ALBank* b) { + ALEvent evt; + + evt.type = AL_SEQP_BANK_EVT; + evt.msg.spbank.bank = b; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetchlvol.c b/lib/hackerlibultra/src/audio/cspsetchlvol.c new file mode 100644 index 00000000..774b0e87 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetchlvol.c @@ -0,0 +1,33 @@ +/*==================================================================== + * cspsetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlVol(ALCSPlayer* seqp, u8 chan, u8 vol) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_VOLUME_CTRL; + evt.msg.midi.byte2 = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetfxmix.c b/lib/hackerlibultra/src/audio/cspsetfxmix.c new file mode 100644 index 00000000..c952e032 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetfxmix.c @@ -0,0 +1,33 @@ +/*==================================================================== + * cspsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlFXMix(ALCSPlayer* seqp, u8 chan, u8 fxmix) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_FX1_CTRL; + evt.msg.midi.byte2 = fxmix; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetpan.c b/lib/hackerlibultra/src/audio/cspsetpan.c new file mode 100644 index 00000000..cfe9cf88 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetpan.c @@ -0,0 +1,33 @@ +/*==================================================================== + * cspsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlPan(ALCSPlayer* seqp, u8 chan, ALPan pan) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_PAN_CTRL; + evt.msg.midi.byte2 = pan; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetpriority.c b/lib/hackerlibultra/src/audio/cspsetpriority.c new file mode 100644 index 00000000..dbb774c7 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetpriority.c @@ -0,0 +1,31 @@ +/*==================================================================== + * cspsetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlPriority(ALCSPlayer* seqp, u8 chan, u8 priority) { + ALEvent evt; + + evt.type = AL_SEQP_PRIORITY_EVT; + evt.msg.sppriority.chan = chan; + evt.msg.sppriority.priority = priority; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetprogram.c b/lib/hackerlibultra/src/audio/cspsetprogram.c new file mode 100644 index 00000000..717c13c4 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetprogram.c @@ -0,0 +1,33 @@ +/*==================================================================== + * cspsetprogram.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetChlProgram(ALCSPlayer* seqp, u8 chan, u8 prog) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ProgramChange | chan; + evt.msg.midi.byte1 = prog; + evt.msg.midi.byte2 = 0; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetseq.c b/lib/hackerlibultra/src/audio/cspsetseq.c new file mode 100644 index 00000000..b0bcaa2c --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetseq.c @@ -0,0 +1,32 @@ +/*==================================================================== + * cspsetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetSeq(ALCSPlayer* seqp, ALCSeq* seq) { + ALEvent evt; + + evt.type = AL_SEQP_SEQ_EVT; + evt.msg.spseq.seq = seq; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsettempo.c b/lib/hackerlibultra/src/audio/cspsettempo.c new file mode 100644 index 00000000..a589908c --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsettempo.c @@ -0,0 +1,34 @@ +/*==================================================================== + * cspsettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetTempo(ALCSPlayer* seqp, s32 tempo) { + ALEvent evt; + + evt.type = AL_SEQP_META_EVT; + evt.msg.tempo.status = AL_MIDI_Meta; + evt.msg.tempo.type = AL_MIDI_META_TEMPO; + evt.msg.tempo.byte1 = (tempo & 0xff0000) >> 16; + evt.msg.tempo.byte2 = (tempo & 0xff00) >> 8; + evt.msg.tempo.byte3 = tempo & 0xff; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspsetvol.c b/lib/hackerlibultra/src/audio/cspsetvol.c new file mode 100644 index 00000000..713e33ae --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspsetvol.c @@ -0,0 +1,30 @@ +/*==================================================================== + * cspsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPSetVol(ALCSPlayer* seqp, s16 vol) { + ALEvent evt; + + evt.type = AL_SEQP_VOL_EVT; + evt.msg.spvol.vol = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/cspstop.c b/lib/hackerlibultra/src/audio/cspstop.c new file mode 100644 index 00000000..7e399d32 --- /dev/null +++ b/lib/hackerlibultra/src/audio/cspstop.c @@ -0,0 +1,30 @@ +/*==================================================================== + * cspstop.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alCSPStop(ALCSPlayer* seqp) { + ALEvent evt; + + evt.type = AL_SEQP_STOPPING_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/drvrnew.c b/lib/hackerlibultra/src/audio/drvrnew.c new file mode 100644 index 00000000..ac251142 --- /dev/null +++ b/lib/hackerlibultra/src/audio/drvrnew.c @@ -0,0 +1,295 @@ +/*==================================================================== + * drvrNew.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include "synthInternals.h" +#include +#include +#include "initfx.h" +// TODO: this comes from a header +#ident "$Revision: 1.49 $" +/* + * WARNING: THE FOLLOWING CONSTANT MUST BE KEPT IN SYNC + * WITH SCALING IN MICROCODE!!! + */ +#define SCALE 16384 + +/* + * the following arrays contain default parameters for + * a few hopefully useful effects. + */ +#define ms *(((s32)((f32)44.1)) & ~0x7) + +static s32 SMALLROOM_PARAMS[26] = { + /* sections length */ + 3, 100 ms, + /* chorus chorus filter +input output fbcoef ffcoef gain rate depth coef */ + 0, 54 ms, 9830, -9830, 0, 0, 0, 0, 19 ms, 38 ms, 3276, -3276, 0x3fff, 0, 0, 0, 0, 60 ms, 5000, 0, 0, 0, 0, 0x5000 +}; + +static s32 BIGROOM_PARAMS[34] = { + /* sections length */ + 4, 100 ms, + /* chorus chorus filter +input output fbcoef ffcoef gain rate depth coef */ + 0, 66 ms, 9830, -9830, 0, 0, 0, 0, 22 ms, 54 ms, 3276, -3276, 0x3fff, 0, 0, 0, 66 ms, 91 ms, 3276, -3276, 0x3fff, 0, + 0, 0, 0, 94 ms, 8000, 0, 0, 0, 0, 0x5000 +}; + +static s32 ECHO_PARAMS[10] = { + /* sections length */ + 1, 200 ms, + /* chorus chorus filter +input output fbcoef ffcoef gain rate depth coef */ + 0, 179 ms, 12000, 0, 0x7fff, 0, 0, 0 +}; + +static s32 CHORUS_PARAMS[10] = { + /* sections length */ + 1, 20 ms, + /* chorus chorus filter +input output fbcoef ffcoef gain rate depth coef */ + 0, 5 ms, 0x4000, 0, 0x7fff, 7600, 700, 0 +}; + +static s32 FLANGE_PARAMS[10] = { + /* sections length */ + 1, 20 ms, + /* chorus chorus filter +input output fbcoef ffcoef gain rate depth coef */ + 0, 5 ms, 0, 0x5fff, 0x7fff, 380, 500, 0 +}; + +static s32 NULL_PARAMS[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +void _init_lpfilter(ALLowPass* lp) { + s32 i, temp; + s16 fc; + f64 ffc, fcoef; + + temp = lp->fc * SCALE; + fc = temp >> 15; + lp->fgain = SCALE - fc; + + lp->first = 1; + for (i = 0; i < 8; i++) + lp->fcvec.fccoef[i] = 0; + + lp->fcvec.fccoef[i++] = fc; + fcoef = ffc = (f64)fc / SCALE; + + for (; i < 16; i++) { + fcoef *= ffc; + lp->fcvec.fccoef[i] = (s16)(fcoef * SCALE); + } +} + +void alFxNew(ALFx* r, ALSynConfig* c, ALHeap* hp) { + u16 i, j, k; + s32* param = 0; + ALFilter* f = (ALFilter*)r; + ALDelay* d; + + alFilterNew(f, 0, alFxParam, AL_FX); + f->handler = alFxPull; + r->paramHdl = (ALSetFXParam)alFxParamHdl; + + switch (c->fxType) { + case AL_FX_SMALLROOM: + param = SMALLROOM_PARAMS; + break; + case AL_FX_BIGROOM: + param = BIGROOM_PARAMS; + break; + case AL_FX_ECHO: + param = ECHO_PARAMS; + break; + case AL_FX_CHORUS: + param = CHORUS_PARAMS; + break; + case AL_FX_FLANGE: + param = FLANGE_PARAMS; + break; + case AL_FX_CUSTOM: + param = c->params; + break; + default: + param = NULL_PARAMS; + break; + } + + j = 0; + + r->section_count = param[j++]; + r->length = param[j++]; + + r->delay = alHeapAlloc(hp, r->section_count, sizeof(ALDelay)); + r->base = alHeapAlloc(hp, r->length, sizeof(s16)); + r->input = r->base; + + for (k = 0; k < r->length; k++) + r->base[k] = 0; + + for (i = 0; i < r->section_count; i++) { + d = &r->delay[i]; + d->input = param[j++]; + d->output = param[j++]; + d->fbcoef = param[j++]; + d->ffcoef = param[j++]; + d->gain = param[j++]; + + if (param[j]) { +#define RANGE 2.0 + /* d->rsinc = ((f32) param[j++])/0xffffff; */ + d->rsinc = ((((f32)param[j++]) / 1000) * RANGE) / c->outputRate; + + /* + * the following constant is derived from: + * + * ratio = 2^(cents/1200) + * + * and therefore for hundredths of a cent + * x + * ln(ratio) = --------------- + * (120,000)/ln(2) + * where + * 120,000/ln(2) = 173123.40... + */ +#define CONVERT 173123.404906676 +#define LENGTH (d->output - d->input) + d->rsgain = (((f32)param[j++]) / CONVERT) * LENGTH; + d->rsval = 1.0; + d->rsdelta = 0.0; + d->rs = alHeapAlloc(hp, 1, sizeof(ALResampler)); + d->rs->state = alHeapAlloc(hp, 1, sizeof(RESAMPLE_STATE)); + d->rs->delta = 0.0; + d->rs->first = 1; + } else { + d->rs = 0; + j++; + j++; + } + + if (param[j]) { + d->lp = alHeapAlloc(hp, 1, sizeof(ALLowPass)); + d->lp->fstate = alHeapAlloc(hp, 1, sizeof(POLEF_STATE)); + d->lp->fc = param[j++]; + _init_lpfilter(d->lp); + } else { + d->lp = 0; + j++; + } + } +} + +void alEnvmixerNew(ALEnvMixer* e, ALHeap* hp) { + alFilterNew((ALFilter*)e, alEnvmixerPull, alEnvmixerParam, AL_ENVMIX); + + e->state = alHeapAlloc(hp, 1, sizeof(ENVMIX_STATE)); + + e->first = 1; + e->motion = AL_STOPPED; + e->volume = 1; + e->ltgt = 1; + e->rtgt = 1; + e->cvolL = 1; + e->cvolR = 1; + e->dryamt = 0; + e->wetamt = 0; + e->lratm = 1; + e->lratl = 0; + e->lratm = 1; + e->lratl = 0; + e->delta = 0; + e->segEnd = 0; + e->pan = 0; + e->ctrlList = 0; + e->ctrlTail = 0; + e->sources = 0; +} + +void alLoadNew(ALLoadFilter* f, ALDMANew dmaNew, ALHeap* hp) { + s32 i; + + /* + * init filter superclass + */ + + alFilterNew((ALFilter*)f, alAdpcmPull, alLoadParam, AL_ADPCM); + + f->state = alHeapAlloc(hp, 1, sizeof(ADPCM_STATE)); + f->lstate = alHeapAlloc(hp, 1, sizeof(ADPCM_STATE)); + + f->dma = dmaNew(&f->dmaState); + + /* + * init the adpcm state + */ + f->lastsam = 0; + f->first = 1; + f->memin = 0; +} + +void alResampleNew(ALResampler* r, ALHeap* hp) { + alFilterNew((ALFilter*)r, alResamplePull, alResampleParam, AL_RESAMPLE); + + /* + * Init resampler state + */ + r->state = alHeapAlloc(hp, 1, sizeof(RESAMPLE_STATE)); + r->delta = 0.0; + r->first = 1; + r->motion = AL_STOPPED; + r->ratio = 1.0; + r->upitch = 0; + r->ctrlList = 0; + r->ctrlTail = 0; + + /* state in the ucode is initialized by the A_INIT flag */ +} + +void alAuxBusNew(ALAuxBus* m, void* sources, s32 maxSources) { + alFilterNew((ALFilter*)m, alAuxBusPull, alAuxBusParam, AL_AUXBUS); + m->sourceCount = 0; + m->maxSources = maxSources; + m->sources = (ALFilter**)sources; +} + +void alMainBusNew(ALMainBus* m, void* sources, s32 maxSources) { + alFilterNew((ALFilter*)m, alMainBusPull, alMainBusParam, AL_MAINBUS); + m->sourceCount = 0; + m->maxSources = maxSources; + m->sources = (ALFilter**)sources; +} + +void alSaveNew(ALSave* f) { + /* + * init filter superclass + */ + + alFilterNew((ALFilter*)f, alSavePull, alSaveParam, AL_SAVE); + + /* + * init the save state, which is a virtual dram address + */ + + f->dramout = 0; + f->first = 1; +} diff --git a/lib/hackerlibultra/src/audio/env.c b/lib/hackerlibultra/src/audio/env.c new file mode 100644 index 00000000..9d513ba0 --- /dev/null +++ b/lib/hackerlibultra/src/audio/env.c @@ -0,0 +1,532 @@ +/*==================================================================== + * envmixer.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include "synthInternals.h" +#include +#include +#include +#include +// TODO: these come from headers +#ident "$Revision: 1.49 $" +#ident "$Revision: 1.17 $" +#ifdef AUD_PROFILE +extern u32 cnt_index, env_num, env_cnt, env_max, env_min, lastCnt[]; +extern u32 rate_num, rate_cnt, rate_max, rate_min; +extern u32 vol_num, vol_cnt, vol_max, vol_min; +#endif +#define EQPOWER_LENGTH 128 +static s16 eqpower[EQPOWER_LENGTH] = { + 32767, 32764, 32757, 32744, 32727, 32704, 32677, 32644, 32607, 32564, 32517, 32464, 32407, 32344, 32277, 32205, + 32127, 32045, 31958, 31866, 31770, 31668, 31561, 31450, 31334, 31213, 31087, 30957, 30822, 30682, 30537, 30388, + 30234, 30075, 29912, 29744, 29572, 29395, 29214, 29028, 28838, 28643, 28444, 28241, 28033, 27821, 27605, 27385, + 27160, 26931, 26698, 26461, 26220, 25975, 25726, 25473, 25216, 24956, 24691, 24423, 24151, 23875, 23596, 23313, + 23026, 22736, 22442, 22145, 21845, 21541, 21234, 20924, 20610, 20294, 19974, 19651, 19325, 18997, 18665, 18331, + 17993, 17653, 17310, 16965, 16617, 16266, 15913, 15558, 15200, 14840, 14477, 14113, 13746, 13377, 13006, 12633, + 12258, 11881, 11503, 11122, 10740, 10357, 9971, 9584, 9196, 8806, 8415, 8023, 7630, 7235, 6839, 6442, + 6044, 5646, 5246, 4845, 4444, 4042, 3640, 3237, 2833, 2429, 2025, 1620, 1216, 810, 405, 0 +}; + +extern f64 __pow(f64, f64); + +/* + * prototypes for private enveloper functions + */ +static Acmd* _pullSubFrame(void* filter, s16* inp, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p); +static s16 _getRate(f64 vol, f64 tgt, s32 count, u16* ratel); + +static f32 _getVol(f32 ivol, s32 samples, s16 ratem, u16 ratel); + +/*********************************************************************** + * Enveloper filter public interfaces + ***********************************************************************/ +Acmd* alEnvmixerPull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + ALEnvMixer* e = (ALEnvMixer*)filter; + s16 inp; + s32 lastOffset; + s32 thisOffset = sampleOffset; + s32 samples; + s16 loutp = 0; + s32 fVol; + ALParam* thisParam; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + /* + * Force the input to be the resampler output + */ + inp = AL_RESAMPLER_OUT; + + while (e->ctrlList != 0) { + lastOffset = thisOffset; + thisOffset = e->ctrlList->delta; + samples = thisOffset - lastOffset; + if (samples > outCount) + break; +#if BUILD_VERSION < VERSION_J +#line 103 +#endif + assert(samples >= 0); + assert(samples <= AL_MAX_RSP_SAMPLES); + + switch (e->ctrlList->type) { + case (AL_FILTER_START_VOICE_ALT): { + ALStartParamAlt* param = (ALStartParamAlt*)e->ctrlList; + ALFilter* f = (ALFilter*)e; + s32 tmp; + + if (param->unity) { + (*e->filter.setParam)(&e->filter, AL_FILTER_SET_UNITY_PITCH, 0); + } + + (*e->filter.setParam)(&e->filter, AL_FILTER_SET_WAVETABLE, param->wave); + (*e->filter.setParam)(&e->filter, AL_FILTER_START, 0); + + e->first = 1; + + e->delta = 0; + e->segEnd = param->samples; + + tmp = ((s32)param->volume * (s32)param->volume) >> 15; + e->volume = (s16)tmp; + e->pan = param->pan; + e->dryamt = eqpower[param->fxMix]; + e->wetamt = eqpower[EQPOWER_LENGTH - param->fxMix - 1]; + + if (param->samples) { + e->cvolL = 1; + e->cvolR = 1; + } else { + /* + * Attack time is zero. Simply set the + * volume. We don't want an attack segment. + */ + e->cvolL = (e->volume * eqpower[e->pan]) >> 15; + e->cvolR = (e->volume * eqpower[EQPOWER_LENGTH - e->pan - 1]) >> 15; + } + + if (f->source) { + union { + f32 f; + s32 i; + } data; + data.f = param->pitch; + (*f->source->setParam)(f->source, AL_FILTER_SET_PITCH, (void*)data.i); + } + + } + + break; + + case (AL_FILTER_SET_FXAMT): + case (AL_FILTER_SET_PAN): + case (AL_FILTER_SET_VOLUME): + ptr = _pullSubFrame(e, &inp, &loutp, samples, sampleOffset, ptr); + + if (e->delta >= e->segEnd) { + /* + * We should have reached our target, calculate + * target in case e->segEnd was 0 + */ + e->ltgt = (e->volume * eqpower[e->pan]) >> 15; + e->rtgt = (e->volume * eqpower[EQPOWER_LENGTH - e->pan - 1]) >> 15; + e->delta = e->segEnd; /* To prevent overflow */ + e->cvolL = e->ltgt; + e->cvolR = e->rtgt; + } else { + /* + * Estimate the current volume + */ + e->cvolL = _getVol(e->cvolL, e->delta, e->lratm, e->lratl); + e->cvolR = _getVol(e->cvolR, e->delta, e->rratm, e->rratl); + } + + /* + * We can't have volume of zero, because the envelope + * would never go anywhere from there + */ + if (e->cvolL == 0) + e->cvolL = 1; + if (e->cvolR == 0) + e->cvolR = 1; + + if (e->ctrlList->type == AL_FILTER_SET_PAN) + + /* + * This should result in a change to the current + * segment rate and target + */ + e->pan = (s16)e->ctrlList->data.i; + + if (e->ctrlList->type == AL_FILTER_SET_VOLUME) { + + /* + * Switching to a new segment + */ + e->delta = 0; + + /* + * Map volume non-linearly to give something close to + * loudness + */ + fVol = (e->ctrlList->data.i); + fVol = (fVol * fVol) >> 15; + e->volume = (s16)fVol; + + e->segEnd = e->ctrlList->moredata.i; + } + + if (e->ctrlList->type == AL_FILTER_SET_FXAMT) { + e->dryamt = eqpower[e->ctrlList->data.i]; + e->wetamt = eqpower[EQPOWER_LENGTH - e->ctrlList->data.i - 1]; + } + + /* + * Force a volume update + */ + e->first = 1; + break; + + case (AL_FILTER_START_VOICE): { + ALStartParam* p = (ALStartParam*)e->ctrlList; + + /* + * Changing to PLAYING (since the previous state was + * persumable STOPPED, we'll just bump the output + * pointer rather than pull a subframe of zeros). + */ + if (p->unity) { + (*e->filter.setParam)(&e->filter, AL_FILTER_SET_UNITY_PITCH, 0); + } + + (*e->filter.setParam)(&e->filter, AL_FILTER_SET_WAVETABLE, p->wave); + (*e->filter.setParam)(&e->filter, AL_FILTER_START, 0); + } break; + + case (AL_FILTER_STOP_VOICE): { + /* + * Changing to STOPPED and reset the filter + */ + ptr = _pullSubFrame(e, &inp, &loutp, samples, sampleOffset, ptr); + (*e->filter.setParam)(&e->filter, AL_FILTER_RESET, 0); + } break; + + case (AL_FILTER_FREE_VOICE): { + ALSynth* drvr = &alGlobals->drvr; + ALFreeParam* param = (ALFreeParam*)e->ctrlList; + param->pvoice->offset = 0; + _freePVoice(drvr, (PVoice*)param->pvoice); + } break; + + default: + /* + * Pull the reuired number of samples and then pass the message + * on down the chain + */ + ptr = _pullSubFrame(e, &inp, &loutp, samples, sampleOffset, ptr); + (*e->filter.setParam)(&e->filter, e->ctrlList->type, (void*)e->ctrlList->data.i); + break; + } + loutp += (samples << 1); + outCount -= samples; + + /* + * put the param record back on the free list + */ + thisParam = e->ctrlList; + e->ctrlList = e->ctrlList->next; + if (e->ctrlList == 0) + e->ctrlTail = 0; + + __freeParam(thisParam); + } + + ptr = _pullSubFrame(e, &inp, &loutp, outCount, sampleOffset, ptr); + + /* + * Prevent overflow in e->delta + */ + if (e->delta > e->segEnd) + e->delta = e->segEnd; + +#ifdef AUD_PROFILE + PROFILE_AUD(env_num, env_cnt, env_max, env_min); +#endif + return ptr; +} + +s32 alEnvmixerParam(void* filter, s32 paramID, void* param) { + ALFilter* f = (ALFilter*)filter; + ALEnvMixer* e = (ALEnvMixer*)filter; + + switch (paramID) { + + case (AL_FILTER_ADD_UPDATE): + if (e->ctrlTail) { + e->ctrlTail->next = (ALParam*)param; + } else { + e->ctrlList = (ALParam*)param; + } + e->ctrlTail = (ALParam*)param; + + break; + + case (AL_FILTER_RESET): + e->first = 1; + e->motion = AL_STOPPED; + e->volume = 1; + if (f->source) + (*f->source->setParam)(f->source, AL_FILTER_RESET, param); + break; + + case (AL_FILTER_START): + e->motion = AL_PLAYING; + if (f->source) + (*f->source->setParam)(f->source, AL_FILTER_START, param); + break; + + case (AL_FILTER_SET_SOURCE): + f->source = (ALFilter*)param; + break; + + default: + if (f->source) + (*f->source->setParam)(f->source, paramID, param); + } + return 0; +} +#if BUILD_VERSION < VERSION_J +#line 350 +#endif +static Acmd* _pullSubFrame(void* filter, s16* inp, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + ALEnvMixer* e = (ALEnvMixer*)filter; + ALFilter* source = e->filter.source; + + /* filter must be playing and request non-zero output samples to pull. */ + if (e->motion != AL_PLAYING || !outCount) + return ptr; + + /* + * ask all filters upstream from us to build their command + * lists. + */ + + assert(source); + + ptr = (*source->handler)(source, inp, outCount, sampleOffset, p); + + /* + * construct our portion of the command list + */ + aSetBuffer(ptr++, A_MAIN, *inp, AL_MAIN_L_OUT + *outp, outCount << 1); + aSetBuffer(ptr++, A_AUX, AL_MAIN_R_OUT + *outp, AL_AUX_L_OUT + *outp, AL_AUX_R_OUT + *outp); + + if (e->first) { + e->first = 0; + + /* + * Calculate derived parameters + */ + e->ltgt = (e->volume * eqpower[e->pan]) >> 15; + e->lratm = _getRate((f64)e->cvolL, (f64)e->ltgt, e->segEnd, &(e->lratl)); + e->rtgt = (e->volume * eqpower[EQPOWER_LENGTH - e->pan - 1]) >> 15; + e->rratm = _getRate((f64)e->cvolR, (f64)e->rtgt, e->segEnd, &(e->rratl)); + + aSetVolume(ptr++, A_LEFT | A_VOL, e->cvolL, 0, 0); + aSetVolume(ptr++, A_RIGHT | A_VOL, e->cvolR, 0, 0); + aSetVolume(ptr++, A_LEFT | A_RATE, e->ltgt, e->lratm, e->lratl); + aSetVolume(ptr++, A_RIGHT | A_RATE, e->rtgt, e->rratm, e->rratl); + aSetVolume(ptr++, A_AUX, e->dryamt, 0, e->wetamt); + aEnvMixer(ptr++, A_INIT | A_AUX, osVirtualToPhysical(e->state)); + } else + aEnvMixer(ptr++, A_CONTINUE | A_AUX, osVirtualToPhysical(e->state)); + + /* + * bump the input buffer pointer + */ + + *inp += (outCount << 1); + e->delta += outCount; + + return ptr; +} + +#define EXP_MASK 0x7f800000 +#define MANT_MASK 0x807fffff + +f64 _frexpf(f64 value, s32* eptr) { + f64 absvalue; + + *eptr = 0; + if (value == 0.0) /* nothing to do for zero */ + return (value); + absvalue = (value > 0.0) ? value : -value; + for (; absvalue >= 1.0; absvalue *= 0.5) + ++*eptr; + for (; absvalue < 0.5; absvalue += absvalue) + --*eptr; + return (value > 0.0 ? absvalue : -absvalue); +} + +f64 _ldexpf(f64 in, s32 ex) { + s32 exp; + + if (ex) { + exp = 1 << ex; + in *= (f64)exp; + } + + return (in); +} + +/* + _getRate() -- This function determines how to go from the + current volume level (vol) to the target + volume level (tgt) in some number of steps + (count). Two values are returned that are + used as multipliers to incrementally scale + the volume. Some tricky math is used and + is explained below. + RWW 28jun95 +*/ + +static s16 _getRate(f64 vol, f64 tgt, s32 count, u16* ratel) { + s16 s; + + f64 invn = 1.0 / count, eps, a, fs, mant; + s32 i_invn, ex, indx; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + if (count == 0) { + if (tgt >= vol) { + *ratel = 0xffff; + return 0x7fff; + } else { + *ratel = 0; + return 0; + } + } + + if (tgt < 1.0) + tgt = 1.0; + if (vol <= 0) + vol = 1; /* zero and neg values not allowed */ + +#define NBITS (3) +#define NPOS (1 << NBITS) +#define NFRACBITS (30) +#define M_LN2 0.69314718055994530942 + /* + * rww's parametric pow() + Goal: compute a = (tgt/vol)^(1/count) + + Approach: + (tgt/vol)^(1/count) = + ((tgt/vol)^(1/2^30))^(2^30*1/count) + + (tgt/vol)^(1/2^30) ~= 1 + eps + + where + + eps ~= ln(tgt/vol)/2^30 + + ln(tgt/vol) = ln2(tgt/vol) * ln(2) + + ln2(tgt/vol) = fp_exponent( tgt/vol ) + + ln2( fp_mantissa( tgt/vol ) ) + + fp_mantissa() and fp_exponent() are + calculated via tricky bit manipulations of + the floating point number. ln2() is + approximated by a look up table. + + Note that this final (1+eps) value needs + to be raised to the 2^30/count power. This + is done by operating on the binary representaion + of this number in the final while loop. + + Enjoy! + */ + { + f64 logtab[] = { -0.912537, -0.752072, -0.607683, -0.476438, -0.356144, -0.245112, -0.142019, -0.045804 }; + + i_invn = (s32)_ldexpf(invn, NFRACBITS); + mant = _frexpf(tgt / vol, &ex); + indx = (s32)(_ldexpf(mant, NBITS + 1)); /* NPOS <= indx < 2*NPOS */ + eps = (logtab[indx - NPOS] + ex) * M_LN2; + eps /= _ldexpf(1, NFRACBITS); /* eps / 2^NFRACBITS */ + fs = (1.0 + eps); + a = 1.0; + while (i_invn) { + if (i_invn & 1) + a = a * fs; + fs *= fs; + i_invn >>= 1; + } + } + + a *= (a *= (a *= a)); + s = (s16)a; + *ratel = (s16)(0xffff * (a - (f32)s)); + +#ifdef AUD_PROFILE + PROFILE_AUD(rate_num, rate_cnt, rate_max, rate_min); +#endif + return (s16)a; +} + +static f32 _getVol(f32 ivol, s32 samples, s16 ratem, u16 ratel) { + f32 r, a; + s32 i; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + /* + * Rate values are actually rate^8 + */ + samples >>= 3; + if (samples == 0) { + return ivol; + } + r = ((f32)(ratem << 16) + (f32)ratel) / 65536; + + a = 1.0; + for (i = 0; i < 32; i++) { + if (samples & 1) + a *= r; + samples >>= 1; + if (samples == 0) + break; + r *= r; + } + ivol *= a; +#ifdef AUD_PROFILE + PROFILE_AUD(vol_num, vol_cnt, vol_max, vol_min); +#endif + return ivol; +} diff --git a/lib/hackerlibultra/src/audio/event.c b/lib/hackerlibultra/src/audio/event.c new file mode 100644 index 00000000..ed8b0453 --- /dev/null +++ b/lib/hackerlibultra/src/audio/event.c @@ -0,0 +1,244 @@ +/*==================================================================== + * event.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include + +void alEvtqNew(ALEventQueue* evtq, ALEventListItem* items, s32 itemCount) { + s32 i; + + evtq->eventCount = 0; + evtq->allocList.next = 0; + evtq->allocList.prev = 0; + evtq->freeList.next = 0; + evtq->freeList.prev = 0; + + for (i = 0; i < itemCount; i++) { + alLink((ALLink*)&items[i], &evtq->freeList); + } +} + +ALMicroTime alEvtqNextEvent(ALEventQueue* evtq, ALEvent* evt) { + ALEventListItem* item; + ALMicroTime delta; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + item = (ALEventListItem*)evtq->allocList.next; + + if (item) { + alUnlink((ALLink*)item); + alCopy(&item->evt, evt, sizeof(*evt)); + alLink((ALLink*)item, &evtq->freeList); + delta = item->delta; + } else { + /* sct 11/28/95 - If we get here, most like we overflowed the event queue */ + /* with non-self-perpetuating events. Eg. if we filled the evtq with volume */ + /* events, then when the seqp is told to play it will handle all the events */ + /* at once completely emptying out the queue. At this point this problem */ + /* must be treated as an out of resource error and the evtq should be increased. */ + evt->type = -1; + delta = 0; + } + + osSetIntMask(mask); + + return delta; +} + +void alEvtqPostEvent(ALEventQueue* evtq, ALEvent* evt, ALMicroTime delta) { + ALEventListItem* item; + ALEventListItem* nextItem; + ALLink* node; + s32 postAtEnd = 0; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + item = (ALEventListItem*)evtq->freeList.next; + if (!item) { + osSetIntMask(mask); +#ifdef _DEBUG + __osError(ERR_ALEVENTNOFREE, 0); +#endif + return; + } + + alUnlink((ALLink*)item); + alCopy(evt, &item->evt, sizeof(*evt)); + + if (delta == AL_EVTQ_END) + postAtEnd = -1; + + for (node = &evtq->allocList; node != 0; node = node->next) { + if (!node->next) { /* end of the list */ + if (postAtEnd) + item->delta = 0; + else + item->delta = delta; + alLink((ALLink*)item, node); + break; + } else { + nextItem = (ALEventListItem*)node->next; + + if (delta < nextItem->delta) { + item->delta = delta; + nextItem->delta -= delta; + + alLink((ALLink*)item, node); + break; + } + + delta -= nextItem->delta; + } + } + + osSetIntMask(mask); +} + +void alEvtqFlush(ALEventQueue* evtq) { + ALLink* thisNode; + ALLink* nextNode; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while (thisNode != 0) { + nextNode = thisNode->next; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + thisNode = nextNode; + } + + osSetIntMask(mask); +} + +/* + This routine flushes events according their type. +*/ +void alEvtqFlushType(ALEventQueue* evtq, s16 type) { + ALLink* thisNode; + ALLink* nextNode; + ALEventListItem *thisItem, *nextItem; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while (thisNode != 0) { + nextNode = thisNode->next; + thisItem = (ALEventListItem*)thisNode; + nextItem = (ALEventListItem*)nextNode; + if (thisItem->evt.type == type) { + if (nextItem) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + } + thisNode = nextNode; + } + + osSetIntMask(mask); +} + +#ifdef _DEBUG_INTERNAL +void alEvtqPrintEvtQueue(ALEventQueue* evtq) { + s32 count1 = 0; + s32 count2 = 0; + ALLink* node; + ALEventListItem* item; + + /* count free events */ + for (node = evtq->freeList.next; node != 0; node = node->next) { + count1++; + } + + PRINTF("----- Allocated Events -----\n"); + for (node = evtq->allocList.next; node != 0; node = node->next) { + item = (ALEventListItem*)node; + + PRINTF("\tdelta: %d\ttype %d\n", item->delta, item->evt.type); + count2++; + } + PRINTF("\n"); + + PRINTF("free events\t %d\n", count1); + PRINTF("alloc events\t %d\n", count2); + PRINTF("total events\t %d\n", count1 + count2); +} + +char* MidiStatus2Str(char status, char* str); + +void alEvtqPrintAllocEvts(ALEventQueue* evtq) { + ALLink* node; + ALEventListItem* item; + ALMicroTime itemTime = 0; + char str[32]; + + PRINTF("----- Allocated Events -----\n"); + for (node = evtq->allocList.next; node != 0; node = node->next) { + item = (ALEventListItem*)node; + itemTime += item->delta; + + PRINTF("\tdelta: %d\tabs: %d\t", item->delta, itemTime); + + switch (item->evt.type) { + case AL_NOTE_END_EVT: + PRINTF("NOTE_END\tvox: %x\n", item->evt.msg.note.voice); + break; + + case AL_SEQP_MIDI_EVT: + PRINTF("SEQP_MIDI\t%s\n", MidiStatus2Str(item->evt.msg.midi.status & AL_MIDI_StatusMask, str)); + break; + + case AL_SEQP_PRIORITY_EVT: + PRINTF("SEQP_PRIORITY\n"); + break; + + default: + PRINTF("type: %d\n", item->evt.type); + break; + } + } + PRINTF("\n"); +} + +char* MidiStatus2Str(char status, char* str) { + switch (status) { + case AL_MIDI_NoteOn: + sprintf(str, "note on"); + break; + + case AL_MIDI_NoteOff: + sprintf(str, "note off"); + break; + + default: + sprintf(str, "status:%d", status); + break; + } + + return str; +} + +#endif /* _DEBUG_INTERNAL */ diff --git a/lib/hackerlibultra/src/audio/filter.c b/lib/hackerlibultra/src/audio/filter.c new file mode 100644 index 00000000..1dd41d86 --- /dev/null +++ b/lib/hackerlibultra/src/audio/filter.c @@ -0,0 +1,31 @@ +/*==================================================================== + * filter.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "synthInternals.h" + +void alFilterNew(ALFilter* f, ALCmdHandler h, ALSetParam s, s32 type) { + f->source = 0; + f->handler = h; + f->setParam = s; + f->inp = 0; + f->outp = 0; + f->type = type; +} diff --git a/lib/hackerlibultra/src/audio/heapalloc.c b/lib/hackerlibultra/src/audio/heapalloc.c new file mode 100644 index 00000000..096d4cd7 --- /dev/null +++ b/lib/hackerlibultra/src/audio/heapalloc.c @@ -0,0 +1,64 @@ +/*==================================================================== + * heapalloc.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include +#include + +void* alHeapDBAlloc(u8* file, s32 line, ALHeap* hp, s32 num, s32 size) { + s32 bytes; + u8* ptr = 0; + + bytes = (num * size + AL_CACHE_ALIGN) & ~AL_CACHE_ALIGN; + +#ifdef _DEBUG + hp->count++; + bytes += sizeof(HeapInfo); +#endif + + if ((hp->cur + bytes) <= (hp->base + hp->len)) { + + ptr = hp->cur; + hp->cur += bytes; + +#ifdef _DEBUG + ((HeapInfo*)ptr)->magic = AL_HEAP_MAGIC; + ((HeapInfo*)ptr)->size = bytes; + ((HeapInfo*)ptr)->count = hp->count; + if (file) { + ((HeapInfo*)ptr)->file = file; + ((HeapInfo*)ptr)->line = line; + } else { + ((HeapInfo*)ptr)->file = (u8*)"unknown"; + ((HeapInfo*)ptr)->line = 0; + } + + ptr += sizeof(HeapInfo); +#endif + + } else { +#ifdef _DEBUG + __osError(ERR_ALHEAPNOFREE, 1, size); +#endif + } + + return ptr; +} diff --git a/lib/hackerlibultra/src/audio/heapcheck.c b/lib/hackerlibultra/src/audio/heapcheck.c new file mode 100644 index 00000000..267ceae4 --- /dev/null +++ b/lib/hackerlibultra/src/audio/heapcheck.c @@ -0,0 +1,67 @@ +/*==================================================================== + * heapcheck.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include +#include + +#ifdef AUD_PROFILE +#include +extern u32 cnt_index, heap_num, heap_cnt, heap_max, heap_min, lastCnt[]; +#endif + +s32 alHeapCheck(ALHeap* hp) { + s32 rv = 0; + HeapInfo* hi; + HeapInfo* last = 0; + u8* ptr; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + +#ifdef _DEBUG + for (ptr = hp->base; ptr < hp->cur; ptr += hi->size) { + + hi = (HeapInfo*)ptr; + + if (hi->magic != AL_HEAP_MAGIC) { + if (last) { + __osError(ERR_ALHEAPCORRUPT, 0); + } else { + __osError(ERR_ALHEAPFIRSTBLOCK, 0); + } + + rv = 1; +#ifdef AUD_PROFILE + PROFILE_AUD(heap_num, heap_cnt, heap_max, heap_min); +#endif + return rv; + } + + last = hi; + } +#endif +#ifdef AUD_PROFILE + PROFILE_AUD(heap_num, heap_cnt, heap_max, heap_min); +#endif + return rv; +} diff --git a/lib/hackerlibultra/src/audio/heapinit.c b/lib/hackerlibultra/src/audio/heapinit.c new file mode 100644 index 00000000..03c5e628 --- /dev/null +++ b/lib/hackerlibultra/src/audio/heapinit.c @@ -0,0 +1,35 @@ +/*==================================================================== + * heapinit.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include + +void alHeapInit(ALHeap* hp, u8* base, s32 len) { + s32 extraAlign = (AL_CACHE_ALIGN + 1) - ((s32)base & AL_CACHE_ALIGN); + + if (extraAlign != AL_CACHE_ALIGN + 1) + hp->base = base + extraAlign; + else + hp->base = base; + + hp->len = len; + hp->cur = hp->base; + hp->count = 0; +} diff --git a/lib/hackerlibultra/src/audio/initfx.h b/lib/hackerlibultra/src/audio/initfx.h new file mode 100644 index 00000000..14221f73 --- /dev/null +++ b/lib/hackerlibultra/src/audio/initfx.h @@ -0,0 +1,59 @@ +/*==================================================================== + * initfx.h + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#ifndef __initfx__ +#define __initfx__ + +#define MAX_L0 AL_FX_BUFFER_SIZE / 4 +#define MAX_L1 AL_FX_BUFFER_SIZE / 4 +#define MAX_L2 AL_FX_BUFFER_SIZE / 2 + +#define L0_INC MAX_L0 / 128 +#define L1_INC MAX_L1 / 128 +#define L2_INC MAX_L2 / 128 + +#define SMALLROOM_SECT_CNT 3 +#define SMALLROOM_SIZE AL_FX_BUFFER_SIZE +#define SMALLROOM_L0 880 /* 22 ms */ +#define SMALLROOM_C0 9830 +#define SMALLROOM_L1 1400 /* 35 ms */ +#define SMALLROOM_C1 3276 +#define SMALLROOM_L2 2640 /* 66 ms */ +#define SMALLROOM_C2 10000 +#define SMALLROOM_FILT_CNT 1 +#define SMALLROOM_FC0 0x4000 /* .25 */ + +#define BIGROOM_SECT_CNT 3 +#define BIGROOM_SIZE AL_FX_BUFFER_SIZE +#define BIGROOM_L0 1408 /* 32 ms */ +#define BIGROOM_C0 9830 +#define BIGROOM_L1 1984 /* 45 ms */ +#define BIGROOM_C1 9830 +#define BIGROOM_L2 3792 /* 86 ms */ +#define BIGROOM_C2 12000 +#define BIGROOM_FILT_CNT 1 +#define BIGROOM_FC0 0x4000 /* .25 */ + +#define ECHO_SIZE AL_FX_BUFFER_SIZE +#define ECHO_SECT_CNT 1 +#define ECHO_L0 7936 /* 180 ms */ +#define ECHO_C0 0x6000 + +#endif diff --git a/lib/hackerlibultra/src/audio/load.c b/lib/hackerlibultra/src/audio/load.c new file mode 100644 index 00000000..9ae078e3 --- /dev/null +++ b/lib/hackerlibultra/src/audio/load.c @@ -0,0 +1,449 @@ +/*==================================================================== + * load.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "synthInternals.h" +#include +#include + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifdef AUD_PROFILE +extern u32 cnt_index, adpcm_num, adpcm_cnt, adpcm_max, adpcm_min, lastCnt[]; +#endif + +#define ADPCMFBYTES 9 +#define LFSAMPLES 4 + +static Acmd* _decodeChunk(Acmd* ptr, ALLoadFilter* f, s32 tsam, s32 nbytes, s16 outp, s16 inp, u32 flags); + +Acmd* alAdpcmPull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + s16 inp; + s32 tsam; + s32 nframes; + s32 nbytes; + s32 overFlow; + s32 startZero; + s32 nOver; + s32 nSam; + s32 op; + s32 nLeft; + s32 bEnd; + s32 decoded = 0; + s32 looped = 0; + + ALLoadFilter* f = (ALLoadFilter*)filter; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + if (outCount == 0) + return ptr; + + inp = AL_DECODER_IN; + aLoadADPCM(ptr++, f->bookSize, K0_TO_PHYS(f->table->waveInfo.adpcmWave.book->book)); + + looped = (outCount + f->sample > f->loop.end) && (f->loop.count != 0); + if (looped) + nSam = f->loop.end - f->sample; + else + nSam = outCount; + + if (f->lastsam) + nLeft = ADPCMFSIZE - f->lastsam; + else + nLeft = 0; + tsam = nSam - nLeft; + if (tsam < 0) + tsam = 0; + + nframes = (tsam + ADPCMFSIZE - 1) >> LFSAMPLES; + nbytes = nframes * ADPCMFBYTES; + + if (looped) { + + ptr = _decodeChunk(ptr, f, tsam, nbytes, *outp, inp, f->first); + + /* + * Fix up output pointer, which will be used as the input pointer + * by the following module. + */ + if (f->lastsam) + *outp += (f->lastsam << 1); + else + *outp += (ADPCMFSIZE << 1); + + /* + * Now fix up state info to reflect the loop start point + */ + f->lastsam = f->loop.start & 0xf; + f->memin = (s32)f->table->base + ADPCMFBYTES * ((s32)(f->loop.start >> LFSAMPLES) + 1); + f->sample = f->loop.start; + + bEnd = *outp; + while (outCount > nSam) { + + outCount -= nSam; + + /* + * Put next one after the end of the last lot - on the + * frame boundary (32 byte) after the end. + */ + op = (bEnd + ((nframes + 1) << (LFSAMPLES + 1))) & ~0x1f; + + /* + * The actual end of data + */ + bEnd += (nSam << 1); + + /* + * -1 is loop forever - the loop count is not exact now + * for small loops! + */ + if ((f->loop.count != -1) && (f->loop.count != 0)) + f->loop.count--; + + /* + * What's left to compute. + */ + nSam = MIN(outCount, f->loop.end - f->loop.start); + tsam = nSam - ADPCMFSIZE + f->lastsam; + if (tsam < 0) + tsam = 0; + nframes = (tsam + ADPCMFSIZE - 1) >> LFSAMPLES; + nbytes = nframes * ADPCMFBYTES; + ptr = _decodeChunk(ptr, f, tsam, nbytes, op, inp, f->first | A_LOOP); + /* + * Merge the two sections in DMEM. + */ + aDMEMMove(ptr++, op + (f->lastsam << 1), bEnd, nSam << 1); + } + + f->lastsam = (outCount + f->lastsam) & 0xf; + f->sample += outCount; + f->memin += ADPCMFBYTES * nframes; +#ifdef AUD_PROFILE + PROFILE_AUD(adpcm_num, adpcm_cnt, adpcm_max, adpcm_min); +#endif + return ptr; + } + + /* + * The unlooped case, which is executed most of the time + */ + + nSam = nframes << LFSAMPLES; + + /* + * overFlow is the number of bytes past the end + * of the bitstream I try to generate + */ + overFlow = f->memin + nbytes - ((s32)f->table->base + f->table->len); + if (overFlow < 0) + overFlow = 0; + nOver = (overFlow / ADPCMFBYTES) << LFSAMPLES; + if (nOver > nSam + nLeft) + nOver = nSam + nLeft; + + nbytes -= overFlow; + + if ((nOver - (nOver & 0xf)) < outCount) { + decoded = 1; + ptr = _decodeChunk(ptr, f, nSam - nOver, nbytes, *outp, inp, f->first); + + if (f->lastsam) + *outp += (f->lastsam << 1); + else + *outp += (ADPCMFSIZE << 1); + + f->lastsam = (outCount + f->lastsam) & 0xf; + f->sample += outCount; + f->memin += ADPCMFBYTES * nframes; + } else { + f->lastsam = 0; + f->memin += ADPCMFBYTES * nframes; + } + + /* + * Put zeros in if necessary + */ + if (nOver) { + f->lastsam = 0; + if (decoded) + startZero = (nLeft + nSam - nOver) << 1; + else + startZero = 0; + aClearBuffer(ptr++, startZero + *outp, nOver << 1); + } +#ifdef AUD_PROFILE + PROFILE_AUD(adpcm_num, adpcm_cnt, adpcm_max, adpcm_min); +#endif + + return ptr; +} + +Acmd* alRaw16Pull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + s32 nbytes; + s32 dramLoc; + s32 dramAlign; + s32 dmemAlign; + s32 overFlow; + s32 startZero; + s32 nSam; + s32 op; + + ALLoadFilter* f = (ALLoadFilter*)filter; + ALFilter* a = (ALFilter*)filter; + + if (outCount == 0) + return ptr; + + if ((outCount + f->sample > f->loop.end) && (f->loop.count != 0)) { + + nSam = f->loop.end - f->sample; + nbytes = nSam << 1; + if (nSam > 0) { + dramLoc = (f->dma)(f->memin, nbytes, f->dmaState); + + /* + * Make sure enough is loaded into DMEM to take care + * of 8 byte alignment + */ + dramAlign = dramLoc & 0x7; + nbytes += dramAlign; + aSetBuffer(ptr++, 0, *outp, 0, nbytes + 8 - (nbytes & 0x7)); + aLoadBuffer(ptr++, dramLoc - dramAlign); + } else + dramAlign = 0; + + /* + * Fix up output pointer to allow for dram alignment + */ + *outp += dramAlign; + + f->memin = (s32)f->table->base + (f->loop.start << 1); + f->sample = f->loop.start; + op = *outp; + + while (outCount > nSam) { + + op += (nSam << 1); + outCount -= nSam; + /* + * -1 is loop forever + */ + if ((f->loop.count != -1) && (f->loop.count != 0)) + f->loop.count--; + + /* + * What to compute. + */ + nSam = MIN(outCount, f->loop.end - f->loop.start); + nbytes = nSam << 1; + + /* + * Do the next section, same as last. + */ + dramLoc = (f->dma)(f->memin, nbytes, f->dmaState); + + /* + * Make sure enough is loaded into DMEM to take care + * of 8 byte alignment + */ + dramAlign = dramLoc & 0x7; + nbytes += dramAlign; + if (op & 0x7) + dmemAlign = 8 - (op & 0x7); + else + dmemAlign = 0; + + aSetBuffer(ptr++, 0, op + dmemAlign, 0, nbytes + 8 - (nbytes & 0x7)); + aLoadBuffer(ptr++, dramLoc - dramAlign); + + /* + * Merge the two sections in DMEM. + */ + if (dramAlign || dmemAlign) + aDMEMMove(ptr++, op + dramAlign + dmemAlign, op, nSam << 1); + } + + f->sample += outCount; + f->memin += (outCount << 1); + + return ptr; + } + + /* + * The unlooped case, which is executed most of the time + * + * overFlow is the number of bytes past the end + * of the bitstream I try to generate + */ + + nbytes = outCount << 1; + overFlow = f->memin + nbytes - ((s32)f->table->base + f->table->len); + if (overFlow < 0) + overFlow = 0; + if (overFlow > nbytes) + overFlow = nbytes; + + if (overFlow < nbytes) { + if (outCount > 0) { + nbytes -= overFlow; + dramLoc = (f->dma)(f->memin, nbytes, f->dmaState); + + /* + * Make sure enough is loaded into DMEM to take care + * of 8 byte alignment + */ + dramAlign = dramLoc & 0x7; + nbytes += dramAlign; + aSetBuffer(ptr++, 0, *outp, 0, nbytes + 8 - (nbytes & 0x7)); + aLoadBuffer(ptr++, dramLoc - dramAlign); + } else + dramAlign = 0; + *outp += dramAlign; + + f->sample += outCount; + f->memin += outCount << 1; + } else { + f->memin += outCount << 1; + } + + /* + * Put zeros in if necessary + */ + if (overFlow) { + startZero = (outCount << 1) - overFlow; + if (startZero < 0) + startZero = 0; + aClearBuffer(ptr++, startZero + *outp, overFlow); + } + return ptr; +} + +s32 alLoadParam(void* filter, s32 paramID, void* param) { + ALLoadFilter* a = (ALLoadFilter*)filter; + ALFilter* f = (ALFilter*)filter; + + switch (paramID) { + case (AL_FILTER_SET_WAVETABLE): + a->table = (ALWaveTable*)param; + a->memin = (s32)a->table->base; + a->sample = 0; + switch (a->table->type) { + case (AL_ADPCM_WAVE): + + /* + * Set up the correct handler + */ + f->handler = alAdpcmPull; + + /* + * Make sure the table length is an integer number of + * frames + */ + a->table->len = ADPCMFBYTES * ((s32)(a->table->len / ADPCMFBYTES)); + + a->bookSize = 2 * a->table->waveInfo.adpcmWave.book->order + * a->table->waveInfo.adpcmWave.book->npredictors * ADPCMVSIZE; + if (a->table->waveInfo.adpcmWave.loop) { + a->loop.start = a->table->waveInfo.adpcmWave.loop->start; + a->loop.end = a->table->waveInfo.adpcmWave.loop->end; + a->loop.count = a->table->waveInfo.adpcmWave.loop->count; + alCopy(a->table->waveInfo.adpcmWave.loop->state, a->lstate, sizeof(ADPCM_STATE)); + } else { + a->loop.start = a->loop.end = a->loop.count = 0; + } + break; + + case (AL_RAW16_WAVE): + f->handler = alRaw16Pull; + if (a->table->waveInfo.rawWave.loop) { + a->loop.start = a->table->waveInfo.rawWave.loop->start; + a->loop.end = a->table->waveInfo.rawWave.loop->end; + a->loop.count = a->table->waveInfo.rawWave.loop->count; + } else { + a->loop.start = a->loop.end = a->loop.count = 0; + } + break; + + default: + break; + } + break; + + case (AL_FILTER_RESET): + a->lastsam = 0; + a->first = 1; + a->sample = 0; + + /* sct 2/14/96 - Check table since it is initialized to null and */ + /* Get loop info according to table type. */ + if (a->table) { + a->memin = (s32)a->table->base; + if (a->table->type == AL_ADPCM_WAVE) { + if (a->table->waveInfo.adpcmWave.loop) + a->loop.count = a->table->waveInfo.adpcmWave.loop->count; + } else if (a->table->type == AL_RAW16_WAVE) { + if (a->table->waveInfo.rawWave.loop) + a->loop.count = a->table->waveInfo.rawWave.loop->count; + } + } + + break; + + default: + break; + } +} + +Acmd* _decodeChunk(Acmd* ptr, ALLoadFilter* f, s32 tsam, s32 nbytes, s16 outp, s16 inp, u32 flags) { + + s32 dramAlign, dramLoc; + + if (nbytes > 0) { + dramLoc = (f->dma)(f->memin, nbytes, f->dmaState); + /* + * Make sure enough is loaded into DMEM to take care + * of 8 byte alignment + */ + dramAlign = dramLoc & 0x7; + nbytes += dramAlign; + aSetBuffer(ptr++, 0, inp, 0, nbytes + 8 - (nbytes & 0x7)); + aLoadBuffer(ptr++, dramLoc - dramAlign); + } else + dramAlign = 0; + + if (flags & A_LOOP) { + aSetLoop(ptr++, K0_TO_PHYS(f->lstate)); + } + + aSetBuffer(ptr++, 0, inp + dramAlign, outp, tsam << 1); + aADPCMdec(ptr++, flags, K0_TO_PHYS(f->state)); + f->first = 0; + + return ptr; +} diff --git a/lib/hackerlibultra/src/audio/mainbus.c b/lib/hackerlibultra/src/audio/mainbus.c new file mode 100644 index 00000000..d1bf705b --- /dev/null +++ b/lib/hackerlibultra/src/audio/mainbus.c @@ -0,0 +1,62 @@ +/*==================================================================== + * mainbus.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "synthInternals.h" + +Acmd* alMainBusPull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + ALMainBus* m = (ALMainBus*)filter; + ALFilter** sources = m->sources; + s32 i; + + /* + * clear the output buffers here + */ + aClearBuffer(ptr++, AL_MAIN_L_OUT, outCount << 1); + aClearBuffer(ptr++, AL_MAIN_R_OUT, outCount << 1); + + for (i = 0; i < m->sourceCount; i++) { + ptr = (sources[i]->handler)(sources[i], outp, outCount, sampleOffset, ptr); + aSetBuffer(ptr++, 0, 0, 0, outCount << 1); + aMix(ptr++, 0, 0x7fff, AL_AUX_L_OUT, AL_MAIN_L_OUT); + aMix(ptr++, 0, 0x7fff, AL_AUX_R_OUT, AL_MAIN_R_OUT); + } + + return ptr; +} + +s32 alMainBusParam(void* filter, s32 paramID, void* param) { + ALMainBus* m = (ALMainBus*)filter; + ALFilter** sources = m->sources; + + switch (paramID) { + + case (AL_FILTER_ADD_SOURCE): + sources[m->sourceCount++] = (ALFilter*)param; + break; + + default: + /* ??? */ + break; + } + + return 0; +} diff --git a/lib/hackerlibultra/src/audio/parse_abi.c b/lib/hackerlibultra/src/audio/parse_abi.c new file mode 100644 index 00000000..0b67d7c4 --- /dev/null +++ b/lib/hackerlibultra/src/audio/parse_abi.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +#ifndef _FINALROM +void alParseAbiCL(Acmd* cmdList, u32 nbytes) { + guDLPrintCB cntlBlk; + + cntlBlk.dataSize = nbytes; + cntlBlk.flags = 0; + cntlBlk.dlType = GU_PARSE_ABI_TYPE; + cntlBlk.paddr = osVirtualToPhysical(cmdList); + + osWriteHost(&cntlBlk, sizeof(cntlBlk)); + osWriteHost(cmdList, nbytes); +} + +#endif diff --git a/lib/hackerlibultra/src/audio/resample.c b/lib/hackerlibultra/src/audio/resample.c new file mode 100644 index 00000000..9173315e --- /dev/null +++ b/lib/hackerlibultra/src/audio/resample.c @@ -0,0 +1,149 @@ +/*==================================================================== + * resample.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "synthInternals.h" +#include +#include + +// TODO: this comes from a header +#ident "$Revision: 1.49 $" + +#ifdef AUD_PROFILE +extern u32 cnt_index, resampler_num, resampler_cnt, resampler_max, resampler_min, lastCnt[]; +#endif + +/*********************************************************************** + * Resampler filter public interfaces + ***********************************************************************/ +Acmd* alResamplePull(void* filter, s16* outp, s32 outCnt, s32 sampleOffset, Acmd* p) { + ALResampler* f = (ALResampler*)filter; + Acmd* ptr = p; + s16 inp; + s32 inCount; + ALFilter* source = f->filter.source; + s32 incr; + f32 finCount; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + inp = AL_DECODER_OUT; + + if (!outCnt) + return ptr; + + /* + * check if resampler is required + */ + if (f->upitch) { + + ptr = (*source->handler)(source, &inp, outCnt, sampleOffset, p); + aDMEMMove(ptr++, inp, *outp, outCnt << 1); + + } else { + + /* + * clip to maximum allowable pitch + * FIXME: should we check for some minimum as well? + */ + if (f->ratio > MAX_RATIO) + f->ratio = MAX_RATIO; + + /* + * quantize the pitch + */ + f->ratio = (s32)(f->ratio * UNITY_PITCH); + f->ratio = f->ratio / UNITY_PITCH; + + /* + * determine how many samples to generate + */ + finCount = f->delta + (f->ratio * (f32)outCnt); + inCount = (s32)finCount; + f->delta = finCount - (f32)inCount; + + /* + * ask all filters upstream from us to build their command + * lists. + */ + ptr = (*source->handler)(source, &inp, inCount, sampleOffset, p); + + /* + * construct our portion of the command list + */ + incr = (s32)(f->ratio * UNITY_PITCH); + aSetBuffer(ptr++, 0, inp, *outp, outCnt << 1); + aResample(ptr++, f->first, incr, osVirtualToPhysical(f->state)); + f->first = 0; + } + +#ifdef AUD_PROFILE + PROFILE_AUD(resampler_num, resampler_cnt, resampler_max, resampler_min); +#endif + return ptr; +} + +s32 alResampleParam(void* filter, s32 paramID, void* param) { + ALFilter* f = (ALFilter*)filter; + ALResampler* r = (ALResampler*)filter; + union { + f32 f; + s32 i; + } data; + + switch (paramID) { + + case (AL_FILTER_SET_SOURCE): + f->source = (ALFilter*)param; + break; + + case (AL_FILTER_RESET): + r->delta = 0.0; + r->first = 1; + r->motion = AL_STOPPED; + r->upitch = 0; + if (f->source) + (*f->source->setParam)(f->source, AL_FILTER_RESET, 0); + break; + + case (AL_FILTER_START): + r->motion = AL_PLAYING; + if (f->source) + (*f->source->setParam)(f->source, AL_FILTER_START, 0); + break; + + case (AL_FILTER_SET_PITCH): + data.i = (s32)param; + r->ratio = data.f; + break; + + case (AL_FILTER_SET_UNITY_PITCH): + r->upitch = 1; + break; + + default: + if (f->source) + (*f->source->setParam)(f->source, paramID, param); + break; + } + return 0; +} diff --git a/lib/hackerlibultra/src/audio/reverb.c b/lib/hackerlibultra/src/audio/reverb.c new file mode 100644 index 00000000..054125d9 --- /dev/null +++ b/lib/hackerlibultra/src/audio/reverb.c @@ -0,0 +1,432 @@ +/*==================================================================== + * reverb.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include +#include "synthInternals.h" +#include +#include +#include +#include +#include "initfx.h" +// TODO: these come from headers +#ident "$Revision: 1.49 $" +#ident "$Revision: 1.17 $" +#define RANGE 2.0 +extern ALGlobals* alGlobals; + +#ifdef AUD_PROFILE +extern u32 cnt_index, reverb_num, reverb_cnt, reverb_max, reverb_min, lastCnt[]; +extern u32 load_num, load_cnt, load_max, load_min, save_num, save_cnt, save_max, save_min; +#endif + +/* + * macros + */ +#define SWAP(in, out) \ + { \ + s16 t = out; \ + out = in; \ + in = t; \ + } + +Acmd* _loadOutputBuffer(ALFx* r, ALDelay* d, s32 buff, s32 incount, Acmd* p); +Acmd* _loadBuffer(ALFx* r, s16* curr_ptr, s32 buff, s32 count, Acmd* p); +Acmd* _saveBuffer(ALFx* r, s16* curr_ptr, s32 buff, s32 count, Acmd* p); +Acmd* _filterBuffer(ALLowPass* lp, s32 buff, s32 count, Acmd* p); +f32 _doModFunc(ALDelay* d, s32 count); + +static s32 L_INC[] = { L0_INC, L1_INC, L2_INC }; + +/*********************************************************************** + * Reverb filter public interfaces + ***********************************************************************/ +Acmd* alFxPull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + ALFx* r = (ALFx*)filter; + ALFilter* source = r->filter.source; + s16 i, buff1, buff2, input, output; + s16 *in_ptr, *out_ptr, gain, *prev_out_ptr = 0; + ALDelay *d, *pd; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif +#if BUILD_VERSION < VERSION_J +#line 74 +#endif + assert(source); + + /* + * pull channels going into this effect first + */ + ptr = (*source->handler)(source, outp, outCount, sampleOffset, p); + + input = AL_AUX_L_OUT; + output = AL_AUX_R_OUT; + buff1 = AL_TEMP_0; + buff2 = AL_TEMP_1; + + aSetBuffer(ptr++, 0, 0, 0, outCount << 1); /* set the buffer size */ + aMix(ptr++, 0, 0xda83, AL_AUX_L_OUT, input); /* .707L = L - .293L */ + aMix(ptr++, 0, 0x5a82, AL_AUX_R_OUT, input); /* mix the AuxL and AuxR into the AuxL */ + /* and write the mixed value to the delay line at r->input */ + ptr = _saveBuffer(r, r->input, input, outCount, ptr); + + aClearBuffer(ptr++, output, outCount << 1); /* clear the AL_AUX_R_OUT */ + + for (i = 0; i < r->section_count; i++) { + d = &r->delay[i]; /* get the ALDelay structure */ + in_ptr = &r->input[-d->input]; + out_ptr = &r->input[-d->output]; + + if (in_ptr == prev_out_ptr) { + SWAP(buff1, buff2); + } else { /* load data at in_ptr into buff1 */ + ptr = _loadBuffer(r, in_ptr, buff1, outCount, ptr); + } + ptr = _loadOutputBuffer(r, d, buff2, outCount, ptr); + + if (d->ffcoef) { + aMix(ptr++, 0, (u16)d->ffcoef, buff1, buff2); + if (!d->rs && !d->lp) { + ptr = _saveBuffer(r, out_ptr, buff2, outCount, ptr); + } + } + + if (d->fbcoef) { + aMix(ptr++, 0, (u16)d->fbcoef, buff2, buff1); + ptr = _saveBuffer(r, in_ptr, buff1, outCount, ptr); + } + + if (d->lp) + ptr = _filterBuffer(d->lp, buff2, outCount, ptr); + + if (!d->rs) + ptr = _saveBuffer(r, out_ptr, buff2, outCount, ptr); + + if (d->gain) + aMix(ptr++, 0, (u16)d->gain, buff2, output); + + prev_out_ptr = &r->input[d->output]; + } + + /* + * bump the master delay line input pointer + * modulo the length + */ + r->input += outCount; + if (r->input > &r->base[r->length]) + r->input -= r->length; + + /* + * output already in AL_AUX_R_OUT + * just copy to AL_AUX_L_OUT + */ + aDMEMMove(ptr++, output, AL_AUX_L_OUT, outCount << 1); + +#ifdef AUD_PROFILE + PROFILE_AUD(reverb_num, reverb_cnt, reverb_max, reverb_min); +#endif + return ptr; +} + +s32 alFxParam(void* filter, s32 paramID, void* param) { + if (paramID == AL_FILTER_SET_SOURCE) { + ALFilter* f = (ALFilter*)filter; + f->source = (ALFilter*)param; + } + return 0; +} + +/* + * This routine gets called by alSynSetFXParam. No checking takes place to + * verify the validity of the paramID or the param value. input and output + * values must be 8 byte aligned, so round down any param passed. + */ +s32 alFxParamHdl(void* filter, s32 paramID, void* param) { + ALFx* f = (ALFx*)filter; + s32 p = (paramID - 2) % 8; + s32 s = (paramID - 2) / 8; + s32 val = *(s32*)param; + +#define INPUT_PARAM 0 +#define OUTPUT_PARAM 1 +#define FBCOEF_PARAM 2 +#define FFCOEF_PARAM 3 +#define GAIN_PARAM 4 +#define CHORUSRATE_PARAM 5 +#define CHORUSDEPTH_PARAM 6 +#define LPFILT_PARAM 7 + + switch (p) { + case INPUT_PARAM: + f->delay[s].input = (u32)val & 0xFFFFFFF8; + break; + case OUTPUT_PARAM: + f->delay[s].output = (u32)val & 0xFFFFFFF8; + break; + case FFCOEF_PARAM: + f->delay[s].ffcoef = (s16)val; + break; + case FBCOEF_PARAM: + f->delay[s].fbcoef = (s16)val; + break; + case GAIN_PARAM: + f->delay[s].gain = (s16)val; + break; + case CHORUSRATE_PARAM: + /* f->delay[s].rsinc = ((f32)val)/0xffffff; */ + f->delay[s].rsinc = ((((f32)val) / 1000) * RANGE) / alGlobals->drvr.outputRate; + break; + +/* + * the following constant is derived from: + * + * ratio = 2^(cents/1200) + * + * and therefore for hundredths of a cent + * x + * ln(ratio) = --------------- + * (120,000)/ln(2) + * where + * 120,000/ln(2) = 173123.40... + */ +#define CONVERT 173123.404906676 +#define LENGTH (f->delay[s].output - f->delay[s].input) + + case CHORUSDEPTH_PARAM: + /*f->delay[s].rsgain = (((f32)val) / CONVERT) * LENGTH; */ + f->delay[s].rsgain = (((f32)val) / CONVERT) * LENGTH; + break; + case LPFILT_PARAM: + if (f->delay[s].lp) { + f->delay[s].lp->fc = (s16)val; + _init_lpfilter(f->delay[s].lp); + } + break; + } + return 0; +} + +Acmd* _loadOutputBuffer(ALFx* r, ALDelay* d, s32 buff, s32 incount, Acmd* p) { + Acmd* ptr = p; + s32 ratio, count, rbuff = AL_TEMP_2; + s16* out_ptr; + f32 fincount, fratio, delta; + s32 ramalign = 0, length; + static f32 val = 0.0, lastval = -10.0; + static f32 blob = 0; + /* + * The following section implements the chorus resampling. Modulate where you pull + * the samples from, since you need varying amounts of samples. + */ + if (d->rs) { + length = d->output - d->input; + delta = _doModFunc(d, incount); /* get the number of samples to modulate by */ + /* + * find ratio of delta to delay length and quantize + * to same resolution as resampler + */ + delta /= length; /* convert delta from number of samples to a pitch ratio */ + delta = (s32)(delta * UNITY_PITCH); /* quantize to value microcode will use */ + delta = delta / UNITY_PITCH; + fratio = 1.0 - delta; /* pitch ratio needs to be centered around 1, not zero */ + + /* d->rs->delta is the difference between the fractional and integer value + * of the samples needed. fratio * incount + rs->delta gives the number of samples + * needed for this frame. + */ + fincount = d->rs->delta + (fratio * (f32)incount); + count = (s32)fincount; /* quantize to s32 */ + d->rs->delta = fincount - (f32)count; /* calculate the round off and store */ + + /* + * d->rsdelta is amount the out_ptr has deviated from its starting position. + * You calc the out_ptr by taking d->output - d->rsdelta, and then using the + * negative of that as an index into the delay buffer. loadBuffer that uses this + * value then bumps it up if it is below the delay buffer. + */ + out_ptr = &r->input[-(d->output - d->rsdelta)]; + ramalign = ((s32)out_ptr & 0x7) >> 1; /* calculate the number of samples needed + to align the buffer*/ +#ifdef _DEBUG +#if 0 + if(length > 0) { + if (length - d->rsdelta > (s32)r->length) { + __osError(ERR_ALMODDELAYOVERFLOW, 1, length - d->rsdelta - r->length); + } + } + else if(length < 0) { + if ((-length) - d->rsdelta > (s32)r->length) { + __osError(ERR_ALMODDELAYOVERFLOW, 1, (-length) - d->rsdelta - r->length); + } + } +#endif +#endif + /* load the rbuff with samples, note that there will be ramalign worth of + * samples at the begining which you don't care about. */ + ptr = _loadBuffer(r, out_ptr - ramalign, rbuff, count + ramalign, ptr); + + /* convert fratio to 16 bit fraction for microcode use */ + ratio = (s32)(fratio * UNITY_PITCH); + /* set the buffers, and do the resample */ + aSetBuffer(ptr++, 0, rbuff + (ramalign << 1), buff, incount << 1); + aResample(ptr++, d->rs->first, ratio, osVirtualToPhysical(d->rs->state)); + + d->rs->first = 0; /* turn off first time flag */ + d->rsdelta += count - incount; /* add the number of samples to d->rsdelta */ + } else { + out_ptr = &r->input[-d->output]; + ptr = _loadBuffer(r, out_ptr, buff, incount, ptr); + } + + return ptr; +} +/* + * This routine is for loading data from the delay line buff. If the + * address of curr_ptr < r->base, it will force it to be within r->base + * space, If the load goes past the end of r->base it will wrap around. + * Cause count bytes of data at curr_ptr (within the delay line) to be + * loaded into buff. (Buff is a dmem buffer) + */ +Acmd* _loadBuffer(ALFx* r, s16* curr_ptr, s32 buff, s32 count, Acmd* p) { + Acmd* ptr = p; + s32 after_end, before_end; + s16 *updated_ptr, *delay_end; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + delay_end = &r->base[r->length]; + +#ifdef _DEBUG + if (curr_ptr > delay_end) + __osError(ERR_ALMODDELAYOVERFLOW, 1, delay_end - curr_ptr); +#endif + + if (curr_ptr < r->base) + curr_ptr += r->length; + updated_ptr = curr_ptr + count; + + if (updated_ptr > delay_end) { + after_end = updated_ptr - delay_end; + before_end = delay_end - curr_ptr; + + aSetBuffer(ptr++, 0, buff, 0, before_end << 1); + aLoadBuffer(ptr++, osVirtualToPhysical(curr_ptr)); + aSetBuffer(ptr++, 0, buff + (before_end << 1), 0, after_end << 1); + aLoadBuffer(ptr++, osVirtualToPhysical(r->base)); + } else { + aSetBuffer(ptr++, 0, buff, 0, count << 1); + aLoadBuffer(ptr++, osVirtualToPhysical(curr_ptr)); + } + + aSetBuffer(ptr++, 0, 0, 0, count << 1); + +#ifdef AUD_PROFILE + PROFILE_AUD(load_num, load_cnt, load_max, load_min); +#endif + return ptr; +} + +/* + * This routine is for writing data to the delay line buff. If the + * address of curr_ptr < r->base, it will force it to be within r->base + * space. If the write goes past the end of r->base, it will wrap around + * Cause count bytes of data at buff to be written to delay line, curr_ptr. + */ +Acmd* _saveBuffer(ALFx* r, s16* curr_ptr, s32 buff, s32 count, Acmd* p) { + Acmd* ptr = p; + s32 after_end, before_end; + s16 *updated_ptr, *delay_end; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + delay_end = &r->base[r->length]; + if (curr_ptr < r->base) /* probably just security */ + curr_ptr += r->length; /* shouldn't occur */ + updated_ptr = curr_ptr + count; + + if (updated_ptr > delay_end) { /* if the data wraps past end of r->base */ + after_end = updated_ptr - delay_end; + before_end = delay_end - curr_ptr; + + aSetBuffer(ptr++, 0, 0, buff, before_end << 1); + aSaveBuffer(ptr++, osVirtualToPhysical(curr_ptr)); + aSetBuffer(ptr++, 0, 0, buff + (before_end << 1), after_end << 1); + aSaveBuffer(ptr++, osVirtualToPhysical(r->base)); + aSetBuffer(ptr++, 0, 0, 0, count << 1); + } else { + aSetBuffer(ptr++, 0, 0, buff, count << 1); + aSaveBuffer(ptr++, osVirtualToPhysical(curr_ptr)); + } + +#ifdef AUD_PROFILE + PROFILE_AUD(save_num, save_cnt, save_max, save_min); +#endif + return ptr; +} + +Acmd* _filterBuffer(ALLowPass* lp, s32 buff, s32 count, Acmd* p) { + Acmd* ptr = p; + + aSetBuffer(ptr++, 0, buff, buff, count << 1); + aLoadADPCM(ptr++, 32, osVirtualToPhysical(lp->fcvec.fccoef)); + aPoleFilter(ptr++, lp->first, lp->fgain, osVirtualToPhysical(lp->fstate)); + lp->first = 0; + + return ptr; +} + +/* + * Generate a triangle wave from -1 to 1, and find the current position + * in the wave. (Rate of the wave is controlled by d->rsinc, which is chorus + * rate) Multiply the current triangle wave value by d->rsgain, (chorus depth) + * which is expressed in number of samples back from output pointer the chorus + * should go at it's full chorus. In otherwords, this function returns a number + * of samples the output pointer should modulate backwards. + */ +f32 _doModFunc(ALDelay* d, s32 count) { + f32 val; + + /* + * generate bipolar sawtooth + * from -RANGE to +RANGE + */ + d->rsval += d->rsinc * count; + d->rsval = (d->rsval > RANGE) ? d->rsval - (RANGE * 2) : d->rsval; + + /* + * convert to monopolar triangle + * from 0 to RANGE + */ + val = d->rsval; + val = (val < 0) ? -val : val; + + /* + * convert to bipolar triangle + * from -1 to 1 + */ + val -= RANGE / 2; + + return (d->rsgain * val); +} diff --git a/lib/hackerlibultra/src/audio/save.c b/lib/hackerlibultra/src/audio/save.c new file mode 100644 index 00000000..5fda8724 --- /dev/null +++ b/lib/hackerlibultra/src/audio/save.c @@ -0,0 +1,62 @@ +/*==================================================================== + * save.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include "synthInternals.h" +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +Acmd* alSavePull(void* filter, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p) { + Acmd* ptr = p; + ALSave* f = (ALSave*)filter; + ALFilter* source = f->filter.source; +#if BUILD_VERSION < VERSION_J +#line 33 +#endif + assert(f->filter.source); + + ptr = (*source->handler)(source, outp, outCount, sampleOffset, ptr); + + aSetBuffer(ptr++, 0, 0, 0, outCount << 1); + aInterleave(ptr++, AL_MAIN_L_OUT, AL_MAIN_R_OUT); + aSetBuffer(ptr++, 0, 0, 0, outCount << 2); + aSaveBuffer(ptr++, f->dramout); + return ptr; +} + +s32 alSaveParam(void* filter, s32 paramID, void* param) { + ALSave* a = (ALSave*)filter; + ALFilter* f = (ALFilter*)filter; + s32 pp = (s32)param; + + switch (paramID) { + case (AL_FILTER_SET_SOURCE): + f->source = (ALFilter*)param; + break; + + case (AL_FILTER_SET_DRAM): + a->dramout = pp; + break; + + default: + break; + } + return 0; +} diff --git a/lib/hackerlibultra/src/audio/seq.c b/lib/hackerlibultra/src/audio/seq.c new file mode 100644 index 00000000..0e5b02fc --- /dev/null +++ b/lib/hackerlibultra/src/audio/seq.c @@ -0,0 +1,312 @@ +/*==================================================================== + * seq.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include +#include "seq.h" + +#define IFF_FILE_HDR 0x4d546864 /* 'MThd' */ +#define IFF_TRACK_HDR 0x4d54726b /* 'MTrk' */ + +static s32 readVarLen(ALSeq* s); +static u8 read8(ALSeq* s); +static s16 read16(ALSeq* s); +static s32 read32(ALSeq* s); + +void alSeqNew(ALSeq* seq, u8* ptr, s32 len) { + /* + * load the seqence pointed to by ptr + */ + seq->base = ptr; + seq->len = len; + seq->lastStatus = 0; + seq->lastTicks = 0; + seq->curPtr = ptr; + + if (read32(seq) != IFF_FILE_HDR) { +#ifdef _DEBUG + __osError(ERR_ALSEQNOTMIDI, 1, ptr); +#endif + return; + } + + read32(seq); /* skip the length field */ + + if (read16(seq) != 0) { +#ifdef _DEBUG + __osError(ERR_ALSEQNOTMIDI0, 1, ptr); +#endif + return; + } + + if (read16(seq) != 1) { +#ifdef _DEBUG + __osError(ERR_ALSEQNUMTRACKS, 1, ptr); +#endif + return; + } + + seq->division = read16(seq); + if (seq->division & 0x8000) { +#ifdef _DEBUG + __osError(ERR_ALSEQTIME, 1, ptr); +#endif + return; + } + + seq->qnpt = 1.0 / (f32)seq->division; + + if (read32(seq) != IFF_TRACK_HDR) { +#ifdef _DEBUG + __osError(ERR_ALSEQTRACKHDR, 1, ptr); +#endif + return; + } + + read32(seq); /* skip the length field */ + + seq->trackStart = seq->curPtr; +} + +void alSeqNextEvent(ALSeq* seq, ALEvent* event) { + u8 status; + s16 delta; + s32 len; + s32 deltaTicks; + s32 i; + +#ifdef _DEBUG + /* sct 1/17/96 - Warn if curPtr is beyond the end of sequence. */ + if (seq->curPtr >= seq->base + seq->len) + __osError(ERR_ALSEQOVERRUN, 0); +#endif + + deltaTicks = readVarLen(seq); /* read the delta time */ + seq->lastTicks += deltaTicks; + status = read8(seq); + +#if _DEBUG + /* + * System exclusives are not supported, so just skip them and read + * the next event + */ + if ((status == 0xf0) || (status == 0xf7)) { + __osError(ERR_ALSEQSYSEX, 0); + len = readVarLen(seq); + for (i = 0; i < len; i++) { + read8(seq); + } + alSeqNextEvent(seq, event); + return; + } +#endif + + if (status == AL_MIDI_Meta) { + u8 type = read8(seq); + + if (type == AL_MIDI_META_TEMPO) { + event->type = AL_TEMPO_EVT; + event->msg.tempo.ticks = deltaTicks; + event->msg.tempo.status = status; + event->msg.tempo.type = type; + event->msg.tempo.len = read8(seq); + event->msg.tempo.byte1 = read8(seq); + event->msg.tempo.byte2 = read8(seq); + event->msg.tempo.byte3 = read8(seq); + } else if (type == AL_MIDI_META_EOT) { + event->type = AL_SEQ_END_EVT; + event->msg.end.ticks = deltaTicks; + event->msg.end.status = status; + event->msg.end.type = type; + event->msg.end.len = read8(seq); + } else { +#ifdef _DEBUG + __osError(ERR_ALSEQMETA, 1, type); + len = readVarLen(seq); + for (i = 0; i < len; i++) { + read8(seq); + } + alSeqNextEvent(seq, event); + return; +#endif + } + + seq->lastStatus = 0; + + } else { + event->type = AL_SEQ_MIDI_EVT; + event->msg.midi.ticks = deltaTicks; + if (status & 0x80) { + event->msg.midi.status = status; + event->msg.midi.byte1 = read8(seq); + seq->lastStatus = status; + } else { + /* running status */ + event->msg.midi.status = seq->lastStatus; + event->msg.midi.byte1 = status; + } + + if (((event->msg.midi.status & 0xf0) != AL_MIDI_ProgramChange) + && ((event->msg.midi.status & 0xf0) != AL_MIDI_ChannelPressure)) { + event->msg.midi.byte2 = read8(seq); + } else { + event->msg.midi.byte2 = 0; + } + } +} + +/* + Returns the delta time in ticks for the next event in the sequence. + Assumes that the sequence data pointer is pointing to the delta time. + + If the curPtr is at or beyond the end of the sequence, then return FALSE + to indicate no next event. + + sct 11/6/95 +*/ +char __alSeqNextDelta(ALSeq* seq, s32* pDeltaTicks) { + u8* savedPtr; + + /* sct 1/16/96 - Put in safety check here to make sure we don't read past sequence data. */ + if (seq->curPtr >= seq->base + seq->len) + return FALSE; + + savedPtr = seq->curPtr; + *pDeltaTicks = readVarLen(seq); /* read the delta time */ + seq->curPtr = savedPtr; + + return TRUE; +} + +f32 alSeqTicksToSec(ALSeq* seq, s32 ticks, u32 tempo) { + return ((f32)(((f32)(ticks) * (f32)(tempo)) / ((f32)(seq->division) * 1000000.0))); +} + +u32 alSeqSecToTicks(ALSeq* seq, f32 sec, u32 tempo) { + return (u32)(((sec * 1000000.0) * seq->division) / tempo); +} + +void alSeqNewMarker(ALSeq* seq, ALSeqMarker* m, u32 ticks) { + ALEvent evt; + u8 *savePtr, *lastPtr; + s32 saveTicks, lastTicks; + s16 saveStatus, lastStatus; + + /* does not check that ticks is within bounds */ + + if (ticks == 0) { /* common case */ + m->curPtr = seq->trackStart; + m->lastStatus = 0; + m->lastTicks = 0; + m->curTicks = 0; + return; + } else { + savePtr = seq->curPtr; + saveStatus = seq->lastStatus; + saveTicks = seq->lastTicks; + + seq->curPtr = seq->trackStart; + seq->lastStatus = 0; + seq->lastTicks = 0; + + do { + lastPtr = seq->curPtr; + lastStatus = seq->lastStatus; + lastTicks = seq->lastTicks; + + alSeqNextEvent(seq, &evt); + + if (evt.type == AL_SEQ_END_EVT) { + lastPtr = seq->curPtr; + lastStatus = seq->lastStatus; + lastTicks = seq->lastTicks; + break; + } + + } while (seq->lastTicks < ticks); + + m->curPtr = lastPtr; + m->lastStatus = lastStatus; + m->lastTicks = lastTicks; + m->curTicks = seq->lastTicks; /* Used by test loop condition. */ + + seq->curPtr = savePtr; + seq->lastStatus = saveStatus; + seq->lastTicks = saveTicks; + } +} + +s32 alSeqGetTicks(ALSeq* seq) { + return seq->lastTicks; +} + +void alSeqSetLoc(ALSeq* seq, ALSeqMarker* m) { + seq->curPtr = m->curPtr; + seq->lastStatus = m->lastStatus; + seq->lastTicks = m->lastTicks; +} + +void alSeqGetLoc(ALSeq* seq, ALSeqMarker* m) { + m->curPtr = seq->curPtr; + m->lastStatus = seq->lastStatus; + m->lastTicks = seq->lastTicks; +} + +/* non-aligned byte reading routines */ +static u8 read8(ALSeq* seq) { + return *seq->curPtr++; +} + +static s16 read16(ALSeq* seq) { + s16 tmp; + + tmp = *seq->curPtr++ << 8; + tmp |= *seq->curPtr++; + + return tmp; +} + +static s32 read32(ALSeq* seq) { + s32 tmp; + + tmp = *seq->curPtr++ << 24; + tmp |= *seq->curPtr++ << 16; + tmp |= *seq->curPtr++ << 8; + tmp |= *seq->curPtr++; + + return tmp; +} + +static s32 readVarLen(ALSeq* seq) { + s32 value; + s32 c; + + c = *seq->curPtr++; + value = c; + if (c & 0x80) { + value &= 0x7f; + do { + c = *seq->curPtr++; + value = (value << 7) + (c & 0x7f); + } while (c & 0x80); + } + return (value); +} diff --git a/lib/hackerlibultra/src/audio/seq.h b/lib/hackerlibultra/src/audio/seq.h new file mode 100644 index 00000000..a93c829c --- /dev/null +++ b/lib/hackerlibultra/src/audio/seq.h @@ -0,0 +1,8 @@ + + +#ifndef __seq__ +#define __seq__ + +char __alSeqNextDelta(ALSeq* seq, s32* pDeltaTicks); + +#endif /* __seq__ */ diff --git a/lib/hackerlibultra/src/audio/seqp.h b/lib/hackerlibultra/src/audio/seqp.h new file mode 100644 index 00000000..6c6cdf03 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqp.h @@ -0,0 +1,35 @@ + + +#define KILL_TIME 50000 /* 50 ms */ + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +ALVoiceState* __mapVoice(ALSeqPlayer*, u8, u8, u8); +void __unmapVoice(ALSeqPlayer* seqp, ALVoice* voice); +char __voiceNeedsNoteKill(ALSeqPlayer* seqp, ALVoice* voice, ALMicroTime killTime); /* sct 1/5/96 */ + +ALVoiceState* __lookupVoice(ALSeqPlayer*, u8, u8); +ALSound* __lookupSound(ALSeqPlayer*, u8, u8, u8); +ALSound* __lookupSoundQuick(ALSeqPlayer*, u8, u8, u8); + +s16 __vsVol(ALVoiceState* voice, ALSeqPlayer* seqp); +ALMicroTime __vsDelta(ALVoiceState* voice, ALMicroTime t); +ALPan __vsPan(ALVoiceState* voice, ALSeqPlayer* seqp); + +void __initFromBank(ALSeqPlayer* seqp, ALBank* b); +void __initChanState(ALSeqPlayer* seqp); +void __resetPerfChanState(ALSeqPlayer* seqp, s32 chan); +void __setInstChanState(ALSeqPlayer* seqp, ALInstrument* inst, s32 chan); + +void __seqpPrintVoices(ALSeqPlayer*); +void __seqpReleaseVoice(ALSeqPlayer* seqp, ALVoice* voice, ALMicroTime deltaTime); + +void __seqpStopOsc(ALSeqPlayer* seqp, ALVoiceState* vs); + +void __postNextSeqEvent(ALSeqPlayer* seqp); /* sct 11/7/95 */ diff --git a/lib/hackerlibultra/src/audio/seqpdelete.c b/lib/hackerlibultra/src/audio/seqpdelete.c new file mode 100644 index 00000000..8f201cbf --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpdelete.c @@ -0,0 +1,36 @@ +/*==================================================================== + * seqpdelete.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void alSeqpDelete(ALSeqPlayer* seqp) { + /* sct 1/4/96 - If the sequence player isn't stopped, then you may end + up with stuck notes. Application should check state before calling + this routine to be sure. */ +#if BUILD_VERSION < VERSION_J +#line 31 +#endif + assert(seqp->state == AL_STOPPED); + + alSynRemovePlayer(seqp->drvr, &seqp->node); +} diff --git a/lib/hackerlibultra/src/audio/seqpgetchlvol.c b/lib/hackerlibultra/src/audio/seqpgetchlvol.c new file mode 100644 index 00000000..0096ec25 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetchlvol.c @@ -0,0 +1,25 @@ +/*==================================================================== + * seqpgetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alSeqpGetChlVol(ALSeqPlayer* seqp, u8 chan) { + return seqp->chanState[chan].vol; +} diff --git a/lib/hackerlibultra/src/audio/seqpgetfxmix.c b/lib/hackerlibultra/src/audio/seqpgetfxmix.c new file mode 100644 index 00000000..5ea563ae --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetfxmix.c @@ -0,0 +1,25 @@ +/*==================================================================== + * seqpgetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alSeqpGetChlFXMix(ALSeqPlayer* seqp, u8 chan) { + return seqp->chanState[chan].fxmix; +} diff --git a/lib/hackerlibultra/src/audio/seqpgetpan.c b/lib/hackerlibultra/src/audio/seqpgetpan.c new file mode 100644 index 00000000..f3e494e2 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetpan.c @@ -0,0 +1,25 @@ +/*==================================================================== + * seqpgetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALPan alSeqpGetChlPan(ALSeqPlayer* seqp, u8 chan) { + return seqp->chanState[chan].pan; +} diff --git a/lib/hackerlibultra/src/audio/seqpgetpriority.c b/lib/hackerlibultra/src/audio/seqpgetpriority.c new file mode 100644 index 00000000..6b59fe28 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetpriority.c @@ -0,0 +1,25 @@ +/*==================================================================== + * seqpgetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +u8 alSeqpGetChlPriority(ALSeqPlayer* seqp, u8 chan) { + return seqp->chanState[chan].priority; +} diff --git a/lib/hackerlibultra/src/audio/seqpgetprogram.c b/lib/hackerlibultra/src/audio/seqpgetprogram.c new file mode 100644 index 00000000..25a9003d --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetprogram.c @@ -0,0 +1,40 @@ +/*==================================================================== + * seqpgetprogram.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alSeqpGetChlProgram(ALSeqPlayer* seqp, u8 chan) + +{ + s32 i; + ALBank* b = seqp->bank; + ALInstrument* inst; + ALChanState s; + + s = seqp->chanState[chan]; + for (i = 0; i < b->instCount; i++) { + inst = b->instArray[i]; + if (inst == s.instrument) + return i; + } + return (-1); +} diff --git a/lib/hackerlibultra/src/audio/seqpgetseq.c b/lib/hackerlibultra/src/audio/seqpgetseq.c new file mode 100644 index 00000000..f86f7d91 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetseq.c @@ -0,0 +1,27 @@ +/*==================================================================== + * seqpgetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALSeq* alSeqpGetSeq(ALSeqPlayer* seqp) { + return seqp->target; +} diff --git a/lib/hackerlibultra/src/audio/seqpgetstate.c b/lib/hackerlibultra/src/audio/seqpgetstate.c new file mode 100644 index 00000000..87e1481d --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetstate.c @@ -0,0 +1,27 @@ +/*==================================================================== + * seqpgetstate.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alSeqpGetState(ALSeqPlayer* seqp) { + return seqp->state; +} diff --git a/lib/hackerlibultra/src/audio/seqpgettempo.c b/lib/hackerlibultra/src/audio/seqpgettempo.c new file mode 100644 index 00000000..dc2e22ff --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgettempo.c @@ -0,0 +1,29 @@ +/*==================================================================== + * seqpgettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s32 alSeqpGetTempo(ALSeqPlayer* seqp) { + /* sct 1/8/96 - If no target sequence has been set, just return zero (instead of crashing). */ + if (seqp->target == NULL) + return 0; + + return seqp->uspt / seqp->target->qnpt; +} diff --git a/lib/hackerlibultra/src/audio/seqpgetvol.c b/lib/hackerlibultra/src/audio/seqpgetvol.c new file mode 100644 index 00000000..54990749 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpgetvol.c @@ -0,0 +1,25 @@ +/*==================================================================== + * seqpgetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +s16 alSeqpGetVol(ALSeqPlayer* seqp) { + return seqp->vol; +} diff --git a/lib/hackerlibultra/src/audio/seqplayer.c b/lib/hackerlibultra/src/audio/seqplayer.c new file mode 100644 index 00000000..2d67ea83 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqplayer.c @@ -0,0 +1,1127 @@ +/*==================================================================== + * seqplayer.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +/* + * Notes: + * + * Controller Numbers: + * 1 Modulation + * 7 Volume + * 10 Pan + * 11 Expression + * 64 Sustain + * 121 Reset All Controllers + * 123 All Notes Off + * + * Registered Parameters + * 0 Pitch Bend Sensitivity + * 1 Fine Tuning + * 2 Coarse Tuning + */ + +#include +#include +#include +#include +#include "seqp.h" +#include "seq.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +static ALMicroTime __seqpVoiceHandler(void* node); +static void __handleMIDIMsg(ALSeqPlayer* seqp, ALEvent* event); +static void __handleMetaMsg(ALSeqPlayer* seqp, ALEvent* event); +static void __handleNextSeqEvent(ALSeqPlayer* seqp); +static void __setUsptFromTempo(ALSeqPlayer* seqp, f32 tempo); /* sct 1/8/96 */ + +/* + * Sequence Player public functions + */ +void alSeqpNew(ALSeqPlayer* seqp, ALSeqpConfig* c) { + s32 i; + ALEventListItem* items; + ALVoiceState* vs; + ALVoiceState* voices; + ALHeap* hp = c->heap; + + /* + * initialize member variables + */ + seqp->bank = 0; + seqp->target = NULL; + seqp->drvr = &alGlobals->drvr; + seqp->chanMask = 0xff; + seqp->uspt = 488; + seqp->nextDelta = 0; + seqp->state = AL_STOPPED; + seqp->vol = 0x7FFF; /* full volume */ + seqp->debugFlags = c->debugFlags; + seqp->frameTime = AL_USEC_PER_FRAME; /* should get this from driver */ + seqp->curTime = 0; + seqp->initOsc = c->initOsc; + seqp->updateOsc = c->updateOsc; + seqp->stopOsc = c->stopOsc; + seqp->loopStart = 0; + seqp->loopEnd = 0; + seqp->loopCount = 0; /* -1 = loop forever, 0 = no loop */ + + seqp->nextEvent.type = AL_SEQP_API_EVT; /* start the voice handler "spinning" */ + + /* + * init the channel state + */ + seqp->maxChannels = c->maxChannels; + seqp->chanState = alHeapAlloc(hp, c->maxChannels, sizeof(ALChanState)); + __initChanState(seqp); /* sct 11/6/95 */ + + /* + * init the voice state array + */ + voices = alHeapAlloc(hp, c->maxVoices, sizeof(ALVoiceState)); + seqp->vFreeList = 0; + for (i = 0; i < c->maxVoices; i++) { + vs = &voices[i]; + vs->next = seqp->vFreeList; + seqp->vFreeList = vs; + } + + seqp->vAllocHead = 0; + seqp->vAllocTail = 0; + + /* + * init the event queue + */ + items = alHeapAlloc(hp, c->maxEvents, sizeof(ALEventListItem)); + alEvtqNew(&seqp->evtq, items, c->maxEvents); + + /* + * add ourselves to the driver + */ + seqp->node.next = NULL; + seqp->node.handler = __seqpVoiceHandler; + seqp->node.clientData = seqp; + alSynAddPlayer(&alGlobals->drvr, &seqp->node); +} + +/************************************************************* + * private routines or driver callback routines + *************************************************************/ +ALMicroTime __seqpVoiceHandler(void* node) { + ALSeqPlayer* seqp = (ALSeqPlayer*)node; + ALEvent evt; + ALVoice* voice; + ALMicroTime delta; + ALVoiceState* vs; + void* oscState; + f32 oscValue; + u8 chan; + + do { + + switch (seqp->nextEvent.type) { + + case (AL_SEQ_REF_EVT): + __handleNextSeqEvent(seqp); + break; + + case (AL_SEQP_API_EVT): + evt.type = AL_SEQP_API_EVT; + alEvtqPostEvent(&seqp->evtq, (ALEvent*)&evt, seqp->frameTime); + break; + + case (AL_NOTE_END_EVT): + voice = seqp->nextEvent.msg.note.voice; + alSynStopVoice(seqp->drvr, voice); + alSynFreeVoice(seqp->drvr, voice); + vs = (ALVoiceState*)voice->clientPrivate; + if (vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp, vs); + __unmapVoice(seqp, voice); + break; + + case (AL_SEQP_ENV_EVT): + voice = seqp->nextEvent.msg.vol.voice; + vs = (ALVoiceState*)voice->clientPrivate; + + if (vs->envPhase == AL_PHASE_ATTACK) + vs->envPhase = AL_PHASE_DECAY; + + delta = seqp->nextEvent.msg.vol.delta; + vs->envGain = seqp->nextEvent.msg.vol.vol; + vs->envEndTime = seqp->curTime + delta; + alSynSetVol(seqp->drvr, voice, __vsVol(vs, seqp), delta); + break; + + case (AL_TREM_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + delta = (*seqp->updateOsc)(oscState, &oscValue); + vs->tremelo = (u8)oscValue; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, seqp), __vsDelta(vs, seqp->curTime)); + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_VIB_OSC_EVT): + vs = seqp->nextEvent.msg.osc.vs; + oscState = seqp->nextEvent.msg.osc.oscState; + chan = seqp->nextEvent.msg.osc.chan; + delta = (*seqp->updateOsc)(oscState, &oscValue); + vs->vibrato = oscValue; + alSynSetPitch(seqp->drvr, &vs->voice, vs->pitch * vs->vibrato * seqp->chanState[chan].pitchBend); + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vs; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, delta); + break; + + case (AL_SEQP_MIDI_EVT): + __handleMIDIMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_META_EVT): + __handleMetaMsg(seqp, &seqp->nextEvent); + break; + + case (AL_SEQP_PLAY_EVT): + if (seqp->state != AL_PLAYING) { + seqp->state = AL_PLAYING; + __postNextSeqEvent(seqp); /* seqp must be AL_PLAYING before we call this routine. */ + } + break; + + case (AL_SEQP_STOP_EVT): + if (seqp->state == AL_STOPPING) { + for (vs = seqp->vAllocHead; vs != 0; vs = seqp->vAllocHead) { + alSynStopVoice(seqp->drvr, &vs->voice); + alSynFreeVoice(seqp->drvr, &vs->voice); + if (vs->flags) + __seqpStopOsc((ALSeqPlayer*)seqp, vs); + __unmapVoice((ALSeqPlayer*)seqp, &vs->voice); + } + + seqp->curTime = 0; + seqp->state = AL_STOPPED; + + /* alEvtqFlush(&seqp->evtq); - Don't flush event + queue anymore. */ + /* sct 1/3/96 - Don't overwrite nextEvent with + AL_SEQP_API_EVT or set nextDelta to + AL_USEC_PER_FRAME since we're not stopping event + processing. */ + /* sct 1/3/96 - Don't return here since we keep + processing events as usual. */ + } + break; + + case (AL_SEQP_STOPPING_EVT): + if (seqp->state == AL_PLAYING) { + /* + * sct 12/29/95 - Remove events associated with the + * stopping sequence. Note that flushing + * AL_SEQP_MIDI_EVTs may flush events that were + * posted after the call to alSeqpStop, so the + * application must queue these events either when + * the player is fully stopped, or when it is + * playing. + */ + alEvtqFlushType(&seqp->evtq, AL_SEQ_REF_EVT); + alEvtqFlushType(&seqp->evtq, AL_SEQP_MIDI_EVT); + + /* + * sct 1/3/96 - Check to see which voices need to be + * killed and release them. Unkilled voices should + * have note end events occurring prior to + * KILL_TIME. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (__voiceNeedsNoteKill(seqp, &vs->voice, KILL_TIME)) + __seqpReleaseVoice(seqp, &vs->voice, KILL_TIME); + } + + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + } + break; + + case (AL_SEQP_VOL_EVT): + seqp->vol = seqp->nextEvent.msg.spvol.vol; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, seqp), __vsDelta(vs, seqp->curTime)); + } + break; + + case (AL_SEQP_LOOP_EVT): + seqp->loopStart = seqp->nextEvent.msg.loop.start; + seqp->loopEnd = seqp->nextEvent.msg.loop.end; + seqp->loopCount = seqp->nextEvent.msg.loop.count; + break; + + case (AL_SEQP_PRIORITY_EVT): + chan = seqp->nextEvent.msg.sppriority.chan; + seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority; + break; + case (AL_SEQP_SEQ_EVT): +#if BUILD_VERSION < VERSION_J // Adjust line numbers to match asserts +#line 295 +#endif + assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */ + + seqp->target = seqp->nextEvent.msg.spseq.seq; + __setUsptFromTempo(seqp, 500000.0); + if (seqp->bank) + __initFromBank(seqp, seqp->bank); + break; + case (AL_SEQP_BANK_EVT): +#if BUILD_VERSION < VERSION_J +#line 304 +#endif + assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */ + + seqp->bank = seqp->nextEvent.msg.spbank.bank; + __initFromBank(seqp, seqp->bank); + break; + + /* sct 11/6/95 - these events should now be handled by __handleNextSeqEvent */ + case (AL_SEQ_END_EVT): + case (AL_TEMPO_EVT): + case (AL_SEQ_MIDI_EVT): +#if BUILD_VERSION < VERSION_J +#line 314 +#endif + assert(FALSE); + + break; + } + + seqp->nextDelta = alEvtqNextEvent(&seqp->evtq, &seqp->nextEvent); + + } while (seqp->nextDelta == 0); + + /* + * assume that next callback won't be more than half an hour away + */ + seqp->curTime += seqp->nextDelta; /* Update the player's current time. */ + return seqp->nextDelta; +} + +/* + Calculates the delta time in ticks until the next sequence + event taking into account loop points, and posts a + sequence reference event with the time in usecs. + + Does nothing if the sequence player is not playing or there + is no target sequence. + + sct 11/7/95 +*/ +void __postNextSeqEvent(ALSeqPlayer* seqp) { + ALEvent evt; + s32 deltaTicks; + ALSeq* seq = seqp->target; + + /* sct 1/5/96 - Do nothing if we're not playing or don't have a target sequence. */ + if ((seqp->state != AL_PLAYING) || (seq == NULL)) + return; + + /* Get the next event time in ticks. */ + /* If false is returned, then there is no next delta (ie. end of sequence reached). */ + if (!__alSeqNextDelta(seq, &deltaTicks)) + return; + + /* Handle loops. */ + if (seqp->loopCount) { + /* Assume that the loop end falls on a MIDI event. Delta time + will be correct even if we loop */ + if (alSeqGetTicks(seq) + deltaTicks >= seqp->loopEnd->curTicks) { + alSeqSetLoc(seq, seqp->loopStart); + + if (seqp->loopCount != -1) + seqp->loopCount--; + } + } + + evt.type = AL_SEQ_REF_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTicks * seqp->uspt); +} + +/* + Call this routine to handle the next event in the sequence. + Assumes that the next sequence event is scheduled to be processed + immediately since it does not check the event's tick time. + + sct 11/7/95 +*/ +static void __handleNextSeqEvent(ALSeqPlayer* seqp) { + ALEvent evt; + + /* sct 1/5/96 - Do nothing if we don't have a target sequence. */ + if (seqp->target == NULL) + return; + + alSeqNextEvent(seqp->target, &evt); + + switch (evt.type) { + case AL_SEQ_MIDI_EVT: + __handleMIDIMsg(seqp, &evt); + __postNextSeqEvent(seqp); + break; + + case AL_TEMPO_EVT: + __handleMetaMsg(seqp, &evt); + __postNextSeqEvent(seqp); + break; + + case AL_SEQ_END_EVT: + seqp->state = AL_STOPPING; + evt.type = AL_SEQP_STOP_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END); + break; + + default: +#if BUILD_VERSION < VERSION_J +#line 411 +#endif + assert(FALSE); /* Sequence event type not supported. */ +#if BUILD_VERSION >= VERSION_J + break; +#endif + } +} + +void __handleMIDIMsg(ALSeqPlayer* seqp, ALEvent* event) { + ALVoice* voice; + ALVoiceState* vs; + s32 status; + u8 chan; + u8 key; + u8 vel; + u8 byte1; + u8 byte2; + ALMIDIEvent* midi = &event->msg.midi; + s16 vol; + ALEvent evt; + ALMicroTime deltaTime; + ALVoiceState* vstate; + ALPan pan; + ALFxRef fxref; +#if BUILD_VERSION < VERSION_J +#line 434 +#endif + /* sct 12/15/95 - Fixed assert to also allow seqp midi event types. */ + assert(event->type == AL_SEQ_MIDI_EVT || event->type == AL_SEQP_MIDI_EVT); + + status = midi->status & AL_MIDI_StatusMask; + chan = midi->status & AL_MIDI_ChannelMask; + byte1 = key = midi->byte1; + byte2 = vel = midi->byte2; + + switch (status) { + + case (AL_MIDI_NoteOn): + + if (vel != 0) { /* a real note on */ + ALVoiceConfig config; + ALSound* sound; + s16 cents; + f32 pitch, oscValue; + u8 fxmix; + void* oscState; + ALInstrument* inst; + + /* If we're not playing, don't process note ons. */ + if (seqp->state != AL_PLAYING) + break; + + sound = __lookupSoundQuick(seqp, key, vel, chan); + ALFlagFailIf(!sound, seqp->debugFlags & NO_SOUND_ERR_MASK, ERR_ALSEQP_NO_SOUND); + + config.priority = seqp->chanState[chan].priority; + config.fxBus = 0; + config.unityPitch = 0; + + vstate = __mapVoice(seqp, key, vel, chan); + ALFlagFailIf(!vstate, seqp->debugFlags & NO_VOICE_ERR_MASK, ERR_ALSEQP_NO_VOICE); + + voice = &vstate->voice; + + alSynAllocVoice(seqp->drvr, voice, &config); + + /* + * set up the voice state structure + */ + vstate->sound = sound; + vstate->envPhase = AL_PHASE_ATTACK; + if (seqp->chanState[chan].sustain > AL_SUSTAIN) + vstate->phase = AL_PHASE_SUSTAIN; + else + vstate->phase = AL_PHASE_NOTEON; + + cents = (key - sound->keyMap->keyBase) * 100 + sound->keyMap->detune; + + vstate->pitch = alCents2Ratio(cents); + vstate->envGain = sound->envelope->attackVolume; + vstate->envEndTime = seqp->curTime + sound->envelope->attackTime; + + /* + * setup tremelo and vibrato if active + */ + vstate->flags = 0; + inst = seqp->chanState[chan].instrument; + + oscValue = (f32)AL_VOL_FULL; /* set this as a default */ + + if (inst->tremType) { + if (seqp->initOsc) { + deltaTime = (*seqp->initOsc)(&oscState, &oscValue, inst->tremType, inst->tremRate, + inst->tremDepth, inst->tremDelay); + + if (deltaTime) /* if deltaTime = zero, don't run osc */ + { + evt.type = AL_TREM_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x01; /* set tremelo flag bit */ + } + } + } + /* will default if not changed by initOsc */ + vstate->tremelo = (u8)oscValue; + + oscValue = 1.0f; /* set this as a default */ + if (inst->vibType) { + if (seqp->initOsc) { + deltaTime = (*seqp->initOsc)(&oscState, &oscValue, inst->vibType, inst->vibRate, inst->vibDepth, + inst->vibDelay); + + if (deltaTime) /* if deltaTime = zero,don't run osc. */ + { + evt.type = AL_VIB_OSC_EVT; + evt.msg.osc.vs = vstate; + evt.msg.osc.oscState = oscState; + evt.msg.osc.chan = chan; + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + vstate->flags |= 0x02; /* set the vibrato flag bit */ + } + } + } + /* will default if not changed by initOsc */ + vstate->vibrato = oscValue; + + /* + * calculate the note on parameters + */ + pitch = vstate->pitch * seqp->chanState[chan].pitchBend * vstate->vibrato; + fxmix = seqp->chanState[chan].fxmix; + pan = __vsPan(vstate, seqp); + vol = __vsVol(vstate, seqp); + deltaTime = sound->envelope->attackTime; + + alSynStartVoiceParams(seqp->drvr, voice, sound->wavetable, pitch, vol, pan, fxmix, deltaTime); + /* + * set up callbacks for envelope + */ + evt.type = AL_SEQP_ENV_EVT; + evt.msg.vol.voice = voice; + evt.msg.vol.vol = sound->envelope->decayVolume; + evt.msg.vol.delta = sound->envelope->decayTime; + deltaTime = sound->envelope->attackTime; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); + + break; + } + + /* + * NOTE: intentional fall-through for note on with zero + * velocity + */ + + case (AL_MIDI_NoteOff): + vstate = __lookupVoice(seqp, key, chan); + ALFlagFailIf(!vstate, (seqp->debugFlags & NOTE_OFF_ERR_MASK), ERR_ALSEQP_OFF_VOICE); + + if (vstate->phase == AL_PHASE_SUSTAIN) + vstate->phase = AL_PHASE_SUSTREL; + else { + vstate->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice(seqp, &vstate->voice, vstate->sound->envelope->releaseTime); + } + + break; + + case (AL_MIDI_PolyKeyPressure): + /* + * Aftertouch per key (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + vstate = __lookupVoice(seqp, key, chan); + ALFailIf(!vstate, ERR_ALSEQP_POLY_VOICE); + + vstate->velocity = byte2; + alSynSetVol(seqp->drvr, &vstate->voice, __vsVol(vstate, seqp), __vsDelta(vstate, seqp->curTime)); + break; + + case (AL_MIDI_ChannelPressure): + /* + * Aftertouch per channel (hardwired to volume). Note that + * aftertouch affects only notes that are already + * sounding. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + vs->velocity = byte1; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs, seqp), __vsDelta(vs, seqp->curTime)); + } + } + break; + + case (AL_MIDI_ControlChange): + + switch (byte1) { + + case (AL_MIDI_PAN_CTRL): + seqp->chanState[chan].pan = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + pan = __vsPan(vs, seqp); + alSynSetPan(seqp->drvr, &vs->voice, pan); + } + } + break; + + case (AL_MIDI_VOLUME_CTRL): + seqp->chanState[chan].vol = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->channel == chan) && (vs->envPhase != AL_PHASE_RELEASE)) { + vol = __vsVol(vs, seqp); + alSynSetVol(seqp->drvr, &vs->voice, vol, __vsDelta(vs, seqp->curTime)); + } + } + break; + case (AL_MIDI_PRIORITY_CTRL): + /* leave current voices where they are */ + seqp->chanState[chan].priority = byte2; + break; + case (AL_MIDI_SUSTAIN_CTRL): + seqp->chanState[chan].sustain = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->channel == chan) && (vs->phase != AL_PHASE_RELEASE)) { + if (byte2 > AL_SUSTAIN) { + /* + * sustain pedal down + */ + if (vs->phase == AL_PHASE_NOTEON) + vs->phase = AL_PHASE_SUSTAIN; + } else { + /* + * sustain pedal up + */ + if (vs->phase == AL_PHASE_SUSTAIN) + vs->phase = AL_PHASE_NOTEON; + else if (vs->phase == AL_PHASE_SUSTREL) { + vs->phase = AL_PHASE_RELEASE; + __seqpReleaseVoice(seqp, &vs->voice, vs->sound->envelope->releaseTime); + } + } + } + } + break; + + case (AL_MIDI_FX1_CTRL): + seqp->chanState[chan].fxmix = byte2; + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + alSynSetFXMix(seqp->drvr, &vs->voice, byte2); + } + } + break; + + case (AL_MIDI_FX_CTRL_0): + case (AL_MIDI_FX_CTRL_1): + case (AL_MIDI_FX_CTRL_2): + case (AL_MIDI_FX_CTRL_3): + case (AL_MIDI_FX_CTRL_4): + case (AL_MIDI_FX_CTRL_5): + case (AL_MIDI_FX_CTRL_6): + case (AL_MIDI_FX_CTRL_7): +#if 0 /* fx control not implemented */ + fxref = alSynGetFXRef(seqp->drvr, 0, 0); + if (fxref) + alSynSetFXParam(seqp->drvr, fxref, (s16)byte1, (void *)byte2); + break; +#endif + case (AL_MIDI_FX3_CTRL): + default: + break; + } + break; + + case (AL_MIDI_ProgramChange): + /* sct 1/16/96 - We must have a valid bank in order to process the program change. */ +#if BUILD_VERSION < VERSION_J +#line 713 +#endif + assert(seqp->bank != NULL); + + if (key < seqp->bank->instCount) { + ALInstrument* inst = seqp->bank->instArray[key]; + __setInstChanState(seqp, inst, chan); /* sct 11/6/95 */ + } +#ifdef _DEBUG + else + __osError(ERR_ALSEQPINVALIDPROG, 2, key, seqp->bank->instCount); +#endif + break; + + case (AL_MIDI_PitchBendChange): { + s32 bendVal; + f32 bendRatio; + s32 cents; + + /* + * get 14-bit unsigned midi value + */ + bendVal = ((byte2 << 7) + byte1) - 8192; + + /* + * calculate pitch bend in cents + */ + cents = (seqp->chanState[chan].bendRange * bendVal) / 8192; + + /* + * calculate the corresponding ratio + */ + bendRatio = alCents2Ratio(cents); + seqp->chanState[chan].pitchBend = bendRatio; + + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (vs->channel == chan) { + alSynSetPitch(seqp->drvr, &vs->voice, vs->pitch * bendRatio * vs->vibrato); + } + } + } break; + + default: +#ifdef _DEBUG + __osError(ERR_ALSEQPUNKNOWNMIDI, 1, status); +#endif + break; + } +} + +void __handleMetaMsg(ALSeqPlayer* seqp, ALEvent* event) { + ALTempoEvent* tevt = &event->msg.tempo; + ALEvent evt; + s32 tempo; + + if (event->msg.tempo.status == AL_MIDI_Meta) { + if (event->msg.tempo.type == AL_MIDI_META_TEMPO) { + tempo = (tevt->byte1 << 16) | (tevt->byte2 << 8) | (tevt->byte3 << 0); + __setUsptFromTempo(seqp, (f32)tempo); /* sct 1/8/96 */ + } + } +} + +ALVoiceState* __mapVoice(ALSeqPlayer* seqp, u8 key, u8 vel, u8 channel) { + ALVoiceState* vs = seqp->vFreeList; + + if (vs) { + + seqp->vFreeList = vs->next; + + vs->next = 0; + + if (!seqp->vAllocHead) + seqp->vAllocHead = vs; + else + seqp->vAllocTail->next = vs; + + seqp->vAllocTail = vs; + + vs->channel = channel; + vs->key = key; + vs->velocity = vel; + vs->voice.clientPrivate = vs; + } + + return vs; +} + +void __unmapVoice(ALSeqPlayer* seqp, ALVoice* voice) { + ALVoiceState* prev = 0; + ALVoiceState* vs; + + /* + * we could use doubly linked lists here and save some code and + * execution time, but time spent here in negligible, so it won't + * make much difference. + */ + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if (&vs->voice == voice) { + + if (prev) + prev->next = vs->next; + else + seqp->vAllocHead = vs->next; + + if (vs == seqp->vAllocTail) { + seqp->vAllocTail = prev; + } + + vs->next = seqp->vFreeList; + seqp->vFreeList = vs; + return; + } + prev = vs; + } +#ifdef _DEBUG + __osError(ERR_ALSEQPUNMAP, 1, voice); +#endif +} + +ALVoiceState* __lookupVoice(ALSeqPlayer* seqp, u8 key, u8 channel) { + ALVoiceState* vs; + + for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { + if ((vs->key == key) && (vs->channel == channel) && (vs->phase != AL_PHASE_RELEASE) + && (vs->phase != AL_PHASE_SUSTREL)) + return vs; + } + + return 0; +} +#if 0 +ALSound *__lookupSound(ALSeqPlayer *seqp, u8 key, u8 vel, u8 chan) +{ + s32 i; + ALInstrument *inst = seqp->chanState[chan].instrument; + ALSound *snd = 0; + + for (i = 0; i < inst->soundCount; i++) { + ALSound *sound = inst->soundArray[i]; + ALKeyMap *keymap = sound->keyMap; + + if ((key >= keymap->keyMin) && (key <= keymap->keyMax) && + (vel >= keymap->velocityMin) && (vel <= keymap->velocityMax)) { + snd = sound; + break; + } + } + return snd; +} +#endif + +ALSound* __lookupSoundQuick(ALSeqPlayer* seqp, u8 key, u8 vel, u8 chan) { + ALInstrument* inst = seqp->chanState[chan].instrument; + s32 l = 1; + s32 r = inst->soundCount; + s32 i; + ALKeyMap* keymap; +#if BUILD_VERSION < VERSION_J +#line 885 +#endif + assert(inst != NULL); /* sct 10/31/95 - If inst is NULL, then the seqp probably wasn't setup correctly. */ + + while (r >= l) { + i = (l + r) / 2; + + keymap = inst->soundArray[i - 1]->keyMap; + + if ((key >= keymap->keyMin) && (key <= keymap->keyMax) && (vel >= keymap->velocityMin) + && (vel <= keymap->velocityMax)) { + return inst->soundArray[i - 1]; + } else if ((key < keymap->keyMin) || ((vel < keymap->velocityMin) && (key <= keymap->keyMax))) { + r = i - 1; + } else { + l = i + 1; + } + } + + return 0; +} + +/* + * __vsVol calculates the target volume for the voice based on the + * note on velocity, envelope, sampleVolume and controller. + */ +s16 __vsVol(ALVoiceState* vs, ALSeqPlayer* seqp) { + + u32 t1, t2; + + t1 = (vs->tremelo * vs->velocity * vs->envGain) >> 6; + t2 = (vs->sound->sampleVolume * seqp->vol * seqp->chanState[vs->channel].vol) >> 14; + + t1 *= t2; + t1 >>= 15; + + return ((s16)t1); +} + +ALMicroTime __vsDelta(ALVoiceState* vs, ALMicroTime t) { + /* + * If we are interrupting a previously set envelope segment, we + * need to recalculate the segment end time given the current + * time. Note: this routine assumes that the voice is currently + * playing. + */ + + s32 delta = vs->envEndTime - t; + + if (delta >= 0) { + return delta; + } else { + return AL_GAIN_CHANGE_TIME; + } +} + +ALPan __vsPan(ALVoiceState* vs, ALSeqPlayer* seqp) { + s32 tmp; + + tmp = seqp->chanState[vs->channel].pan - AL_PAN_CENTER + vs->sound->samplePan; + tmp = MAX(tmp, AL_PAN_LEFT); + tmp = MIN(tmp, AL_PAN_RIGHT); + + return (ALPan)tmp; +} + +#ifdef IMPLEMENTED + +s32 seqpGetVoices(SEQP* seqp); +s32 seqpSetVoices(SEQP* seqp, s32 numvoices); + +u16 seqpGetChannelMask(SEQP* seqp); +s32 seqpSetChannelMask(SEQP* seqp, u16 bitmask); + +#endif + +void __seqpReleaseVoice(ALSeqPlayer* seqp, ALVoice* voice, ALMicroTime deltaTime) { + ALEvent evt; + ALVoiceState* vs = (ALVoiceState*)voice->clientPrivate; + + /* + * if in attack phase, remove all pending volume + * events for this voice from the queue + */ + + if (vs->envPhase == AL_PHASE_ATTACK) { + ALLink* thisNode; + ALLink* nextNode; + ALEventListItem *thisItem, *nextItem; + + thisNode = seqp->evtq.allocList.next; + while (thisNode != 0) { + nextNode = thisNode->next; + thisItem = (ALEventListItem*)thisNode; + nextItem = (ALEventListItem*)nextNode; + if (thisItem->evt.type == AL_SEQP_ENV_EVT) { + if (thisItem->evt.msg.vol.voice == voice) { + if (nextItem) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &seqp->evtq.freeList); + } + } + thisNode = nextNode; + } + } + + vs->velocity = 0; + vs->envPhase = AL_PHASE_RELEASE; + vs->envGain = 0; + vs->envEndTime = seqp->curTime + deltaTime; + + alSynSetPriority(seqp->drvr, voice, 0); /* make candidate for stealing */ + alSynSetVol(seqp->drvr, voice, 0, deltaTime); + evt.type = AL_NOTE_END_EVT; + evt.msg.note.voice = voice; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); +} + +/* + This special purpose routine is called only when processing + a stopping event in order to properly kill all active voices. + + The routine searches through the seqp's event queue for an + AL_NOTE_END_EVT for the given voice. If the event's execution + time is greater than kill time, it removes the event from the + event queue and returns true that it needs to kill the voice. + Otherwise, if the event's time is less than the kill time, it + returns false that the voice needs to be killed. + + sct 1/3/96 +*/ + +#define VOICENEEDSNOTEKILL_DEBUG _DEBUG_INTERNAL && 0 /* For debugging voiceNeedsNoteKill routine. */ + +char __voiceNeedsNoteKill(ALSeqPlayer* seqp, ALVoice* voice, ALMicroTime killTime) { + ALLink* thisNode; + ALLink* nextNode; + ALEventListItem* thisItem; + ALMicroTime itemTime = 0; + char needsNoteKill = TRUE; + +#if VOICENEEDSNOTEKILL_DEBUG + alEvtqPrintAllocEvts(&seqp->evtq); +#endif + + thisNode = seqp->evtq.allocList.next; + while (thisNode != 0) { + nextNode = thisNode->next; + thisItem = (ALEventListItem*)thisNode; + itemTime += thisItem->delta; + + if (thisItem->evt.type == AL_NOTE_END_EVT) { + if (thisItem->evt.msg.note.voice == voice) { + if (itemTime > killTime) { + if ((ALEventListItem*)nextNode) + ((ALEventListItem*)nextNode)->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &seqp->evtq.freeList); + } else + needsNoteKill = FALSE; + break; + } + } + thisNode = nextNode; + } + +#if VOICENEEDSNOTEKILL_DEBUG + if (thisNode) + osSyncPrintf("vox 0x%0x: end time %d kill time %d\n\n", voice, itemTime, killTime); + else + osSyncPrintf("vox 0x%0x: not found\n\n", voice); + + alEvtqPrintAllocEvts(&seqp->evtq); +#endif + + return needsNoteKill; +} + +void __initFromBank(ALSeqPlayer* seqp, ALBank* b) { + /* + * init the chanState with the default instrument + */ + s32 i; + ALInstrument* inst = 0; + + /* set to the first available instrument. */ + for (i = 0; !inst; i++) + inst = b->instArray[i]; + + /* sct 11/6/95 - Setup the channel state for the given instrument. */ + /* There is some wasted effort here since both calls the same state vars */ + /* but it's safer. */ + for (i = 0; i < seqp->maxChannels; i++) { + __resetPerfChanState(seqp, i); + __setInstChanState(seqp, inst, i); + } + + if (b->percussion) { + __resetPerfChanState(seqp, i); + __setInstChanState(seqp, b->percussion, 9); + } +} + +/* + sct 11/6/95 - Call this whenever a new instrument gets assigned to a channel + such as when changing banks or in response to a MIDI program change event. + Currently also gets called when changing sequences. +*/ +void __setInstChanState(ALSeqPlayer* seqp, ALInstrument* inst, s32 chan) { + seqp->chanState[chan].instrument = inst; + seqp->chanState[chan].pan = inst->pan; + seqp->chanState[chan].vol = inst->volume; + seqp->chanState[chan].priority = inst->priority; + seqp->chanState[chan].bendRange = inst->bendRange; +} + +/* + sct 11/6/95 -- Call this whenever a new sequence is to be played or when + initializing a sequence player. +*/ +void __resetPerfChanState(ALSeqPlayer* seqp, s32 chan) { + seqp->chanState[chan].fxId = AL_FX_NONE; + seqp->chanState[chan].fxmix = AL_DEFAULT_FXMIX; + seqp->chanState[chan].pan = AL_PAN_CENTER; + seqp->chanState[chan].vol = AL_VOL_FULL; + seqp->chanState[chan].priority = AL_DEFAULT_PRIORITY; + seqp->chanState[chan].sustain = 0; + seqp->chanState[chan].bendRange = 200; + seqp->chanState[chan].pitchBend = 1.0f; +} + +/* + sct 11/6/95 - Called only when creating a new sequence player. +*/ +void __initChanState(ALSeqPlayer* seqp) { + int i; + + for (i = 0; i < seqp->maxChannels; i++) { + seqp->chanState[i].instrument = 0; + __resetPerfChanState(seqp, i); + } +} + +void __seqpStopOsc(ALSeqPlayer* seqp, ALVoiceState* vs) { + ALEventListItem *thisNode, *nextNode; + s16 evtType; + + thisNode = (ALEventListItem*)seqp->evtq.allocList.next; + while (thisNode) { + nextNode = (ALEventListItem*)thisNode->node.next; + evtType = thisNode->evt.type; + if (evtType == AL_TREM_OSC_EVT || evtType == AL_VIB_OSC_EVT) { + if (thisNode->evt.msg.osc.vs == vs) { + (*seqp->stopOsc)(thisNode->evt.msg.osc.oscState); + alUnlink((ALLink*)thisNode); + if (nextNode) + nextNode->delta += thisNode->delta; + alLink((ALLink*)thisNode, &seqp->evtq.freeList); + if (evtType == AL_TREM_OSC_EVT) + vs->flags = vs->flags & 0xFE; + else /* must be a AL_VIB_OSC_EVT */ + vs->flags = vs->flags & 0xFD; + if (!vs->flags) + return; /* there should be no more events */ + } + } + + thisNode = nextNode; + } +} + +/* + This routine safely calculates the sequence player's + uspt value based on the given tempo. It does this safely + by making sure that the player has a target sequence and + therefore a qnpt value which is needed for the calculation. +*/ +static void __setUsptFromTempo(ALSeqPlayer* seqp, f32 tempo) { + if (seqp->target) + seqp->uspt = (s32)((f32)tempo * seqp->target->qnpt); + else + seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */ +} diff --git a/lib/hackerlibultra/src/audio/seqploop.c b/lib/hackerlibultra/src/audio/seqploop.c new file mode 100644 index 00000000..83756308 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqploop.c @@ -0,0 +1,32 @@ +/*==================================================================== + * seqploop.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpLoop(ALSeqPlayer* seqp, ALSeqMarker* start, ALSeqMarker* end, s32 count) { + ALEvent evt; + + evt.type = AL_SEQP_LOOP_EVT; + evt.msg.loop.start = start; + evt.msg.loop.end = end; + evt.msg.loop.count = count; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpplay.c b/lib/hackerlibultra/src/audio/seqpplay.c new file mode 100644 index 00000000..23e1a756 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpplay.c @@ -0,0 +1,32 @@ +/*==================================================================== + * seqpplay.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include "seqp.h" + +void alSeqpPlay(ALSeqPlayer* seqp) { + ALEvent evt; + + evt.type = AL_SEQP_PLAY_EVT; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsendmidi.c b/lib/hackerlibultra/src/audio/seqpsendmidi.c new file mode 100644 index 00000000..d67edd69 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsendmidi.c @@ -0,0 +1,37 @@ +/*==================================================================== + * seqpsendmidi.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSendMidi(ALSeqPlayer* seqp, s32 ticks, u8 status, u8 byte1, u8 byte2) { + ALEvent evt; + ALMicroTime deltaTime; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = status; + evt.msg.midi.byte1 = byte1; + evt.msg.midi.byte2 = byte2; + evt.msg.midi.duration = 0; + + deltaTime = ticks * seqp->uspt; + + alEvtqPostEvent(&seqp->evtq, &evt, deltaTime); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetbank.c b/lib/hackerlibultra/src/audio/seqpsetbank.c new file mode 100644 index 00000000..069ac887 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetbank.c @@ -0,0 +1,30 @@ +/*==================================================================== + * seqpsetbank.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetBank(ALSeqPlayer* seqp, ALBank* b) { + ALEvent evt; + + evt.type = AL_SEQP_BANK_EVT; + evt.msg.spbank.bank = b; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetchlvol.c b/lib/hackerlibultra/src/audio/seqpsetchlvol.c new file mode 100644 index 00000000..32d1596f --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetchlvol.c @@ -0,0 +1,33 @@ +/*==================================================================== + * seqpsetchlvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlVol(ALSeqPlayer* seqp, u8 chan, u8 vol) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_VOLUME_CTRL; + evt.msg.midi.byte2 = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetfxmix.c b/lib/hackerlibultra/src/audio/seqpsetfxmix.c new file mode 100644 index 00000000..37c2baa3 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetfxmix.c @@ -0,0 +1,33 @@ +/*==================================================================== + * seqpsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlFXMix(ALSeqPlayer* seqp, u8 chan, u8 fxmix) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_FX1_CTRL; + evt.msg.midi.byte2 = fxmix; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetpan.c b/lib/hackerlibultra/src/audio/seqpsetpan.c new file mode 100644 index 00000000..5703e3d8 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetpan.c @@ -0,0 +1,33 @@ +/*==================================================================== + * seqpsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlPan(ALSeqPlayer* seqp, u8 chan, ALPan pan) { + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ControlChange | chan; + evt.msg.midi.byte1 = AL_MIDI_PAN_CTRL; + evt.msg.midi.byte2 = pan; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetpriority.c b/lib/hackerlibultra/src/audio/seqpsetpriority.c new file mode 100644 index 00000000..0a4d6a4a --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetpriority.c @@ -0,0 +1,31 @@ +/*==================================================================== + * seqpsetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlPriority(ALSeqPlayer* seqp, u8 chan, u8 priority) { + ALEvent evt; + + evt.type = AL_SEQP_PRIORITY_EVT; + evt.msg.sppriority.chan = chan; + evt.msg.sppriority.priority = priority; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetprogram.c b/lib/hackerlibultra/src/audio/seqpsetprogram.c new file mode 100644 index 00000000..27a8b664 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetprogram.c @@ -0,0 +1,35 @@ +/*==================================================================== + * seqpsetprogram.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetChlProgram(ALSeqPlayer* seqp, u8 chan, u8 prog) + +{ + ALEvent evt; + + evt.type = AL_SEQP_MIDI_EVT; + evt.msg.midi.ticks = 0; + evt.msg.midi.status = AL_MIDI_ProgramChange | chan; + evt.msg.midi.byte1 = prog; + evt.msg.midi.byte2 = 0; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetseq.c b/lib/hackerlibultra/src/audio/seqpsetseq.c new file mode 100644 index 00000000..1af1c962 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetseq.c @@ -0,0 +1,32 @@ +/*==================================================================== + * seqpsetseq.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetSeq(ALSeqPlayer* seqp, ALSeq* seq) { + ALEvent evt; + + evt.type = AL_SEQP_SEQ_EVT; + evt.msg.spseq.seq = seq; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsettempo.c b/lib/hackerlibultra/src/audio/seqpsettempo.c new file mode 100644 index 00000000..0c2d2fe8 --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsettempo.c @@ -0,0 +1,34 @@ +/*==================================================================== + * seqpsettempo.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetTempo(ALSeqPlayer* seqp, s32 tempo) { + ALEvent evt; + + evt.type = AL_SEQP_META_EVT; + evt.msg.tempo.status = AL_MIDI_Meta; + evt.msg.tempo.type = AL_MIDI_META_TEMPO; + evt.msg.tempo.byte1 = (tempo & 0xff0000) >> 16; + evt.msg.tempo.byte2 = (tempo & 0xff00) >> 8; + evt.msg.tempo.byte3 = tempo & 0xff; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpsetvol.c b/lib/hackerlibultra/src/audio/seqpsetvol.c new file mode 100644 index 00000000..17e64c2f --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpsetvol.c @@ -0,0 +1,30 @@ +/*==================================================================== + * seqpsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpSetVol(ALSeqPlayer* seqp, s16 vol) { + ALEvent evt; + + evt.type = AL_SEQP_VOL_EVT; + evt.msg.spvol.vol = vol; + + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/seqpstop.c b/lib/hackerlibultra/src/audio/seqpstop.c new file mode 100644 index 00000000..738a9d9e --- /dev/null +++ b/lib/hackerlibultra/src/audio/seqpstop.c @@ -0,0 +1,30 @@ +/*==================================================================== + * seqpstop.c + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSeqpStop(ALSeqPlayer* seqp) { + ALEvent evt; + + evt.type = AL_SEQP_STOPPING_EVT; + alEvtqPostEvent(&seqp->evtq, &evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/sl.c b/lib/hackerlibultra/src/audio/sl.c new file mode 100644 index 00000000..de08bb6d --- /dev/null +++ b/lib/hackerlibultra/src/audio/sl.c @@ -0,0 +1,56 @@ +/*==================================================================== + * sl.c + * + * Synopsis: + * Sound library global routines + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +ALGlobals* alGlobals = 0; + +void alInit(ALGlobals* g, ALSynConfig* c) { + if (!alGlobals) { /* already initialized? */ + alGlobals = g; + alSynNew(&alGlobals->drvr, c); + } +} + +void alClose(ALGlobals* glob) { + if (alGlobals) { + alSynDelete(&glob->drvr); + alGlobals = 0; + } +} + +/* might want to make these macros */ +void alLink(ALLink* ln, ALLink* to) { + ln->next = to->next; + ln->prev = to; + if (to->next) + to->next->prev = ln; + to->next = ln; +} + +void alUnlink(ALLink* ln) { + if (ln->next) + ln->next->prev = ln->prev; + if (ln->prev) + ln->prev->next = ln->next; +} diff --git a/lib/hackerlibultra/src/audio/sndp.h b/lib/hackerlibultra/src/audio/sndp.h new file mode 100644 index 00000000..17a89ad4 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndp.h @@ -0,0 +1,101 @@ +/*==================================================================== + * sndp.h + * + * Synopsis: + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#ifndef __SNDP__ +#define __SNDP__ + +#include + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#define MIN_RATIO 0.0001 + +typedef enum { + AL_SNDP_PLAY_EVT, + AL_SNDP_STOP_EVT, + AL_SNDP_PAN_EVT, + AL_SNDP_VOL_EVT, + AL_SNDP_PITCH_EVT, + AL_SNDP_API_EVT, + AL_SNDP_DECAY_EVT, + AL_SNDP_END_EVT, + AL_SNDP_FX_EVT +} ALSndpMsgType; + +typedef struct { + ALVoice voice; + ALSound* sound; /* sound referenced here */ + s16 priority; + f32 pitch; /* current playback pitch */ + s32 state; /* play state for this sound */ + s16 vol; /* volume - combined with volume from bank */ + ALPan pan; /* pan - 0 = left, 127 = right */ + u8 fxMix; /* wet/dry mix - 0 = dry, 127 = wet */ +} ALSoundState; + +typedef union { + + ALEvent msg; + + struct { + s16 type; + ALSoundState* state; + } common; + + struct { + s16 type; + ALSoundState* state; + s16 vol; + } vol; + + struct { + s16 type; + ALSoundState* state; + f32 pitch; + } pitch; + + struct { + s16 type; + ALSoundState* state; + ALPan pan; + } pan; + + struct { + s16 type; + ALSoundState* state; + u8 mix; + } fx; + +} ALSndpEvent; + +static ALMicroTime _sndpVoiceHandler(void* node); +static void _handleEvent(ALSndPlayer* sndp, ALSndpEvent* event); +static void _removeEvents(ALEventQueue* evtq, ALSoundState* state); +static s32 _DivS32ByF32(s32 i, f32 f); + +#endif diff --git a/lib/hackerlibultra/src/audio/sndpallocate.c b/lib/hackerlibultra/src/audio/sndpallocate.c new file mode 100644 index 00000000..5e73c51a --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpallocate.c @@ -0,0 +1,41 @@ +/*==================================================================== + * sndpallocate.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +ALSndId alSndpAllocate(ALSndPlayer* sndp, ALSound* sound) { + ALSndId i; + ALSoundState* sState = sndp->sndState; + + for (i = 0; i < sndp->maxSounds; i++) { + if (!sState[i].sound) { + sState[i].sound = sound; + sState[i].priority = AL_DEFAULT_PRIORITY; + sState[i].state = AL_STOPPED; + sState[i].pitch = 1.0; + sState[i].pan = AL_PAN_CENTER; + sState[i].fxMix = AL_DEFAULT_FXMIX; + sState[i].vol = 32767 * sound->sampleVolume / AL_VOL_FULL; + return i; + } + } + + return -1; +} diff --git a/lib/hackerlibultra/src/audio/sndpdeallocate.c b/lib/hackerlibultra/src/audio/sndpdeallocate.c new file mode 100644 index 00000000..36a14008 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpdeallocate.c @@ -0,0 +1,33 @@ +/*==================================================================== + * sndpdeallocate.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpDeallocate(ALSndPlayer* sndp, ALSndId id) { + ALSoundState* sState = sndp->sndState; + + ALFailIf((sState + id)->state != AL_STOPPED, ERR_ALSNDPDEALLOCATE); + + sState[id].sound = 0; + if (sndp->target == id) /* if we are deleting the target sound */ + sndp->target = -1; +} diff --git a/lib/hackerlibultra/src/audio/sndpdelete.c b/lib/hackerlibultra/src/audio/sndpdelete.c new file mode 100644 index 00000000..15666f40 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpdelete.c @@ -0,0 +1,42 @@ +/*==================================================================== + * sndpdelete.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpDelete(ALSndPlayer* sndp) { + /* + * Remove client from synthesizer. Note application is responsible + * for making sure all sounds have been stopped beforehand. + */ +#ifdef _DEBUG + { + int i, notStopped = 0; + ALSoundState* sState = sndp->sndState; + + for (i = 0; i < sndp->maxSounds; i++) + if ((sState + i)->state != AL_STOPPED) + notStopped = 1; + ALFailIf(notStopped, ERR_ALSNDPDELETE); + } +#endif + alSynRemovePlayer(&alGlobals->drvr, &sndp->node); +} diff --git a/lib/hackerlibultra/src/audio/sndpgetsound.c b/lib/hackerlibultra/src/audio/sndpgetsound.c new file mode 100644 index 00000000..dacb3300 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpgetsound.c @@ -0,0 +1,25 @@ +/*==================================================================== + * sndpgetsound.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +ALSndId alSndpGetSound(ALSndPlayer* sndp) { + return (ALSndId)sndp->target; +} diff --git a/lib/hackerlibultra/src/audio/sndpgetstate.c b/lib/hackerlibultra/src/audio/sndpgetstate.c new file mode 100644 index 00000000..ff0d89ce --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpgetstate.c @@ -0,0 +1,27 @@ +/*==================================================================== + * sndpgetstate.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +s32 alSndpGetState(ALSndPlayer* sndp) { + ALSoundState* sState = sndp->sndState; + + return (sState + sndp->target)->state; +} diff --git a/lib/hackerlibultra/src/audio/sndplayer.c b/lib/hackerlibultra/src/audio/sndplayer.c new file mode 100644 index 00000000..30dd9e29 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndplayer.c @@ -0,0 +1,289 @@ +/*==================================================================== + * Sndplayer.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include +#include + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void alSndpNew(ALSndPlayer* sndp, ALSndpConfig* c) { + u8* ptr; + ALEvent evt; + ALSoundState* sState; + u32 i; + + /* + * Init member variables + */ + sndp->maxSounds = c->maxSounds; + sndp->target = -1; + sndp->frameTime = AL_USEC_PER_FRAME; /* time between API events */ + sState = (ALSoundState*)alHeapAlloc(c->heap, 1, c->maxSounds * sizeof(ALSoundState)); + sndp->sndState = sState; + + for (i = 0; i < c->maxSounds; i++) + sState[i].sound = 0; + + /* + * init the event queue + */ + ptr = alHeapAlloc(c->heap, 1, c->maxEvents * sizeof(ALEventListItem)); + alEvtqNew(&sndp->evtq, (ALEventListItem*)ptr, c->maxEvents); + + /* + * add ourselves to the driver + */ + sndp->drvr = &alGlobals->drvr; + sndp->node.next = NULL; + sndp->node.handler = _sndpVoiceHandler; + sndp->node.clientData = sndp; + alSynAddPlayer(sndp->drvr, &sndp->node); + + /* + * Start responding to API events + */ + evt.type = AL_SNDP_API_EVT; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, sndp->frameTime); + sndp->nextDelta = alEvtqNextEvent(&sndp->evtq, &sndp->nextEvent); +} + +/************************************************************* + * Sound Player private routines + *************************************************************/ +ALMicroTime _sndpVoiceHandler(void* node) { + ALSndPlayer* sndp = (ALSndPlayer*)node; + ALSndpEvent evt; + + do { + switch (sndp->nextEvent.type) { + case (AL_SNDP_API_EVT): + evt.common.type = AL_SNDP_API_EVT; +#if BUILD_VERSION >= VERSION_K + evt.common.state = (ALSoundState*)-1; +#endif + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, sndp->frameTime); + break; + + default: + _handleEvent(sndp, (ALSndpEvent*)&sndp->nextEvent); + break; + } + sndp->nextDelta = alEvtqNextEvent(&sndp->evtq, &sndp->nextEvent); + + } while (sndp->nextDelta == 0); + sndp->curTime += sndp->nextDelta; + return sndp->nextDelta; +} + +void _handleEvent(ALSndPlayer* sndp, ALSndpEvent* event) { + ALVoiceConfig vc; + ALSound* snd; + ALVoice* voice; + ALPan pan; + f32 pitch; + ALSndpEvent evt; + ALMicroTime delta; + + s16 vol; + s16 tmp; + s32 vtmp; + ALSoundState* state; + + state = event->common.state; + snd = state->sound; + + switch (event->msg.type) { + case (AL_SNDP_PLAY_EVT): + if (state->state != AL_STOPPED || !snd) + return; + + vc.fxBus = 0; /* effect buss 0 */ + vc.priority = state->priority; + vc.unityPitch = 0; + + voice = &state->voice; + alSynAllocVoice(sndp->drvr, voice, &vc); + + vol = (s16)((s32)snd->envelope->attackVolume * state->vol / AL_VOL_FULL); + tmp = state->pan - AL_PAN_CENTER + snd->samplePan; + tmp = MAX(tmp, AL_PAN_LEFT); + pan = (ALPan)MIN(tmp, AL_PAN_RIGHT); + pitch = state->pitch; + delta = snd->envelope->attackTime; + + alSynStartVoice(sndp->drvr, voice, snd->wavetable); + state->state = AL_PLAYING; + + alSynSetPan(sndp->drvr, voice, pan); + alSynSetVol(sndp->drvr, voice, vol, delta); + alSynSetPitch(sndp->drvr, voice, pitch); + alSynSetFXMix(sndp->drvr, voice, state->fxMix); + + evt.common.type = AL_SNDP_DECAY_EVT; + evt.common.state = state; + delta = (ALMicroTime)_DivS32ByF32(snd->envelope->attackTime, state->pitch); + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, delta); + break; + + case (AL_SNDP_STOP_EVT): + if (state->state != AL_PLAYING || !snd) + return; + + delta = (ALMicroTime)_DivS32ByF32(snd->envelope->releaseTime, state->pitch); + alSynSetVol(sndp->drvr, &state->voice, 0, delta); + + if (delta) { + evt.common.type = AL_SNDP_END_EVT; + evt.common.state = state; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, delta); + state->state = AL_STOPPING; + } else { + /* note: this code is repeated in AL_SNDP_END_EVT */ + alSynStopVoice(sndp->drvr, &state->voice); + alSynFreeVoice(sndp->drvr, &state->voice); + _removeEvents(&sndp->evtq, state); + state->state = AL_STOPPED; + } + break; + + case (AL_SNDP_PAN_EVT): + state->pan = event->pan.pan; + if (state->state == AL_PLAYING && snd) { + tmp = state->pan - AL_PAN_CENTER + snd->samplePan; + tmp = MAX(tmp, AL_PAN_LEFT); + pan = (ALPan)MIN(tmp, AL_PAN_RIGHT); + alSynSetPan(sndp->drvr, &state->voice, pan); + } + break; + + case (AL_SNDP_PITCH_EVT): + /* Limit the pitch to a practical value even though we only need */ + /* to limit it to a non-zero number to avoid divide by zero. */ + if ((state->pitch = event->pitch.pitch) < MIN_RATIO) + state->pitch = MIN_RATIO; + + if (state->state == AL_PLAYING) { + alSynSetPitch(sndp->drvr, &state->voice, state->pitch); + } + break; + + case (AL_SNDP_FX_EVT): + state->fxMix = event->fx.mix; + if (state->state == AL_PLAYING) + alSynSetFXMix(sndp->drvr, &state->voice, state->fxMix); + break; + + case (AL_SNDP_VOL_EVT): + state->vol = event->vol.vol; + if (state->state == AL_PLAYING && snd) { + vtmp = snd->envelope->decayVolume * state->vol / AL_VOL_FULL; + alSynSetVol(sndp->drvr, &state->voice, (s16)vtmp, 1000); + } + break; + + case (AL_SNDP_DECAY_EVT): + /* + * The voice has theoretically reached its attack velocity, + * set up callback for release envelope - except for a looped sound + */ + if (snd->envelope->decayTime != -1) { + vtmp = snd->envelope->decayVolume * state->vol / AL_VOL_FULL; + delta = (ALMicroTime)_DivS32ByF32(snd->envelope->decayTime, state->pitch); + alSynSetVol(sndp->drvr, &state->voice, (s16)vtmp, delta); + evt.common.type = AL_SNDP_STOP_EVT; + evt.common.state = state; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, delta); + } + break; + + case (AL_SNDP_END_EVT): + /* note: this code is repeated in AL_SNDP_STOP_EVT */ + alSynStopVoice(sndp->drvr, &state->voice); + alSynFreeVoice(sndp->drvr, &state->voice); + _removeEvents(&sndp->evtq, state); + state->state = AL_STOPPED; + break; + + default: + break; + } +} +static void _removeEvents(ALEventQueue* evtq, ALSoundState* state) { + ALLink* thisNode; + ALLink* nextNode; + ALEventListItem* thisItem; + ALEventListItem* nextItem; + ALSndpEvent* thisEvent; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while (thisNode != 0) { + nextNode = thisNode->next; + thisItem = (ALEventListItem*)thisNode; + nextItem = (ALEventListItem*)nextNode; + thisEvent = (ALSndpEvent*)&thisItem->evt; + if (thisEvent->common.state == state) { + if (nextItem) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + } + thisNode = nextNode; + } + + osSetIntMask(mask); +} +/* + This routine safely divides a signed 32-bit integer + by a floating point value. It avoids overflow by using + a double to store the result and then before truncating + to an integer it compares the result to the limit and + limits it on overflow. Underflow is handled automatically + by the CPU which limits the value to zero. + + Presently this routine is used to divide a time in usecs + by a pitch ratio. Since the time could be a very large number, + very small pitch ratios can cause the reult to overflow, + causing a floating point exception. +*/ +#if BUILD_VERSION == VERSION_J // Adjust line numbers to match assert +#line 277 +#elif BUILD_VERSION < VERSION_J +#line 278 +#endif +static s32 _DivS32ByF32(s32 i, f32 f) { +#define INT_MAX 2147483647 /* Should be in a limits.h file. */ + f64 rd; + int ri; + + assert(f != 0); /* Caller must make sure we do not divide by zero! */ + + rd = i / f; /* Store result as a double to avoid overflow. */ + + if (rd > INT_MAX) /* Limit the value if necessary. */ + ri = INT_MAX; + else + ri = rd; + + return ri; +} diff --git a/lib/hackerlibultra/src/audio/sndpplay.c b/lib/hackerlibultra/src/audio/sndpplay.c new file mode 100644 index 00000000..77d263fe --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpplay.c @@ -0,0 +1,34 @@ +/*==================================================================== + * sndpplay.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpPlay(ALSndPlayer* sndp) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + + ALFailIf((sState + sndp->target)->state != AL_STOPPED, ERR_ALSNDPPLAY); + + evt.common.type = AL_SNDP_PLAY_EVT; + evt.common.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/sndpplayat.c b/lib/hackerlibultra/src/audio/sndpplayat.c new file mode 100644 index 00000000..57c6e06b --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpplayat.c @@ -0,0 +1,30 @@ +/*==================================================================== + * sndpplayat.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +void alSndpPlayAt(ALSndPlayer* sndp, ALMicroTime delta) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + + evt.common.type = AL_SNDP_PLAY_EVT; + evt.common.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, delta); +} diff --git a/lib/hackerlibultra/src/audio/sndpsetfxmix.c b/lib/hackerlibultra/src/audio/sndpsetfxmix.c new file mode 100644 index 00000000..4b44c911 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpsetfxmix.c @@ -0,0 +1,40 @@ +/*==================================================================== + * sndpsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetFXMix(ALSndPlayer* sndp, u8 mix) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)) { + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds - 1); + return; + } +#endif + + evt.fx.type = AL_SNDP_FX_EVT; + evt.fx.state = &sState[sndp->target]; + evt.fx.mix = mix; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/sndpsetpan.c b/lib/hackerlibultra/src/audio/sndpsetpan.c new file mode 100644 index 00000000..512e9832 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpsetpan.c @@ -0,0 +1,40 @@ +/*==================================================================== + * sndpsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetPan(ALSndPlayer* sndp, ALPan pan) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)) { + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds - 1); + return; + } +#endif + + evt.pan.type = AL_SNDP_PAN_EVT; + evt.pan.pan = pan; + evt.pan.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/sndpsetpitch.c b/lib/hackerlibultra/src/audio/sndpsetpitch.c new file mode 100644 index 00000000..4aba534b --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpsetpitch.c @@ -0,0 +1,46 @@ +/*==================================================================== + * sndpsetpitch.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetPitch(ALSndPlayer* sndp, f32 pitch) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + + /* + * If this is set during playback there will be + * a the envelope lengths won't be accurate - but you can still + * do it. + */ + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)) { + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds - 1); + return; + } +#endif + + evt.pitch.type = AL_SNDP_PITCH_EVT; + evt.pitch.state = &sState[sndp->target]; + evt.pitch.pitch = pitch; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/sndpsetpriority.c b/lib/hackerlibultra/src/audio/sndpsetpriority.c new file mode 100644 index 00000000..d4247a34 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpsetpriority.c @@ -0,0 +1,36 @@ +/*==================================================================== + * sndpsetsound.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetPriority(ALSndPlayer* sndp, ALSndId id, u8 priority) { + ALSoundState* sState = sndp->sndState; + +#ifdef _DEBUG + if ((id >= sndp->maxSounds) || (id < 0)) { + __osError(ERR_ALSNDPSETPRIORITY, 2, id, sndp->maxSounds - 1); + return; + } +#endif + + sState[id].priority = priority; +} diff --git a/lib/hackerlibultra/src/audio/sndpsetsound.c b/lib/hackerlibultra/src/audio/sndpsetsound.c new file mode 100644 index 00000000..d2f42a00 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpsetsound.c @@ -0,0 +1,34 @@ +/*==================================================================== + * sndpsetsound.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetSound(ALSndPlayer* sndp, ALSndId id) { +#ifdef _DEBUG + if ((id >= sndp->maxSounds) || (id < 0)) { + __osError(ERR_ALSNDPSETSOUND, 2, id, sndp->maxSounds - 1); + return; + } +#endif + + sndp->target = id; +} diff --git a/lib/hackerlibultra/src/audio/sndpsetvol.c b/lib/hackerlibultra/src/audio/sndpsetvol.c new file mode 100644 index 00000000..5fd7e102 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpsetvol.c @@ -0,0 +1,40 @@ +/*==================================================================== + * sndpsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" +#include +#include + +void alSndpSetVol(ALSndPlayer* sndp, s16 vol) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + +#ifdef _DEBUG + if ((sndp->target >= sndp->maxSounds) || (sndp->target < 0)) { + __osError(ERR_ALSNDPSETPAR, 2, sndp->target, sndp->maxSounds - 1); + return; + } +#endif + + evt.vol.type = AL_SNDP_VOL_EVT; + evt.vol.state = &sState[sndp->target]; + evt.vol.vol = vol; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/sndpstop.c b/lib/hackerlibultra/src/audio/sndpstop.c new file mode 100644 index 00000000..00c0c8e2 --- /dev/null +++ b/lib/hackerlibultra/src/audio/sndpstop.c @@ -0,0 +1,33 @@ +/*==================================================================== + * sndpstop.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "sndp.h" + +void alSndpStop(ALSndPlayer* sndp) { + ALSndpEvent evt; + ALSoundState* sState = sndp->sndState; + + /* + * Go immediately into the release phase + */ + evt.common.type = AL_SNDP_STOP_EVT; + evt.common.state = &sState[sndp->target]; + alEvtqPostEvent(&sndp->evtq, (ALEvent*)&evt, 0); +} diff --git a/lib/hackerlibultra/src/audio/synaddplayer.c b/lib/hackerlibultra/src/audio/synaddplayer.c new file mode 100644 index 00000000..ed77ac6a --- /dev/null +++ b/lib/hackerlibultra/src/audio/synaddplayer.c @@ -0,0 +1,32 @@ +/*==================================================================== + * synaddplayer.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include + +void alSynAddPlayer(ALSynth* drvr, ALPlayer* client) { + OSIntMask mask = osSetIntMask(OS_IM_NONE); + + client->samplesLeft = drvr->curSamples; + client->next = drvr->head; + drvr->head = client; + + osSetIntMask(mask); +} diff --git a/lib/hackerlibultra/src/audio/synallocfx.c b/lib/hackerlibultra/src/audio/synallocfx.c new file mode 100644 index 00000000..67b7c0bb --- /dev/null +++ b/lib/hackerlibultra/src/audio/synallocfx.c @@ -0,0 +1,29 @@ +/*==================================================================== + * synallocfx.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +ALFxRef* alSynAllocFX(ALSynth* s, s16 bus, ALSynConfig* c, ALHeap* hp) { + alFxNew(&s->auxBus[bus].fx[0], c, hp); + alFxParam(&s->auxBus[bus].fx[0], AL_FILTER_SET_SOURCE, &s->auxBus[bus]); + alMainBusParam(s->mainBus, AL_FILTER_ADD_SOURCE, &s->auxBus[bus].fx[0]); + + return (ALFxRef)(&s->auxBus[bus].fx[0]); +} diff --git a/lib/hackerlibultra/src/audio/synallocvoice.c b/lib/hackerlibultra/src/audio/synallocvoice.c new file mode 100644 index 00000000..b2d6c137 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synallocvoice.c @@ -0,0 +1,128 @@ +/*==================================================================== + * synallocvoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include "synthInternals.h" + +s32 _allocatePVoice(ALSynth* drvr, PVoice** pvoice, s16 priority); + +s32 alSynAllocVoice(ALSynth* drvr, ALVoice* voice, ALVoiceConfig* vc) { + PVoice* pvoice = 0; + ALFilter* f; + ALParam* update; + s32 stolen; + +#ifdef _DEBUG + /* need two updates if voice is stolen */ + if (drvr->paramList == 0) { + __osError(ERR_ALSYN_NO_UPDATE, 0); + return 0; + } else if (drvr->paramList->next == 0) { + __osError(ERR_ALSYN_NO_UPDATE, 0); + return 0; + } +#endif + + voice->priority = vc->priority; + voice->unityPitch = vc->unityPitch; + voice->table = 0; + voice->fxBus = vc->fxBus; + voice->state = AL_STOPPED; + voice->pvoice = 0; + + stolen = _allocatePVoice(drvr, &pvoice, vc->priority); + + if (pvoice) { /* if we were able to allocate a voice */ + + f = pvoice->channelKnob; + + if (stolen) { + + pvoice->offset = 512; + pvoice->vvoice->pvoice = 0; /* zero stolen voice */ + + /* + * ramp down stolen voice + */ + update = __allocParam(); + update->delta = drvr->paramSamples; + update->type = AL_FILTER_SET_VOLUME; + update->data.i = 0; + update->moredata.i = pvoice->offset - 64; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + + /* + * stop stolen voice + */ + update = __allocParam(); + if (update) { + update->delta = drvr->paramSamples + pvoice->offset; + update->type = AL_FILTER_STOP_VOICE; + update->next = 0; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } else { +#ifdef _DEBUG + __osError(ERR_ALSYN_NO_UPDATE, 0); +#endif + } + + } else { + pvoice->offset = 0; + } + + pvoice->vvoice = voice; /* assign new voice */ + voice->pvoice = pvoice; + } + + return (pvoice != 0); +} + +s32 _allocatePVoice(ALSynth* drvr, PVoice** pvoice, s16 priority) { + ALLink* dl; + PVoice* pv; + s32 stolen = 0; + + if ((dl = drvr->pLameList.next) != 0) { /* check the lame list first */ + *pvoice = (PVoice*)dl; + alUnlink(dl); + alLink(dl, &drvr->pAllocList); + } else if ((dl = drvr->pFreeList.next) != 0) { /* from the free list */ + *pvoice = (PVoice*)dl; + alUnlink(dl); + alLink(dl, &drvr->pAllocList); + } else { /* steal one */ + for (dl = drvr->pAllocList.next; dl != 0; dl = dl->next) { + pv = (PVoice*)dl; + + /* + * if it is lower priority and not already stolen, keep it + * as a candidate for stealing + */ + if ((pv->vvoice->priority <= priority) && (pv->offset == 0)) { + *pvoice = pv; + priority = pv->vvoice->priority; + stolen = 1; + } + } + } + + return stolen; +} diff --git a/lib/hackerlibultra/src/audio/syndelete.c b/lib/hackerlibultra/src/audio/syndelete.c new file mode 100644 index 00000000..6c92a5b7 --- /dev/null +++ b/lib/hackerlibultra/src/audio/syndelete.c @@ -0,0 +1,25 @@ +/*==================================================================== + * syndelete.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +void alSynDelete(ALSynth* drvr) { + drvr->head = 0; +} diff --git a/lib/hackerlibultra/src/audio/synfreefx.c b/lib/hackerlibultra/src/audio/synfreefx.c new file mode 100644 index 00000000..3e6e9fce --- /dev/null +++ b/lib/hackerlibultra/src/audio/synfreefx.c @@ -0,0 +1,24 @@ +/*==================================================================== + * synfreefx.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +void alSynFreeFX(ALSynth* s, ALFxRef* fx) { +} diff --git a/lib/hackerlibultra/src/audio/synfreevoice.c b/lib/hackerlibultra/src/audio/synfreevoice.c new file mode 100644 index 00000000..fc175cd9 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synfreevoice.c @@ -0,0 +1,52 @@ +/*==================================================================== + * synfreevoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include +#include +#include "synthInternals.h" + +#include + +void alSynFreeVoice(ALSynth* drvr, ALVoice* voice) { + ALFilter* f; + ALFreeParam* update; + + if (voice->pvoice) { + + if (voice->pvoice->offset) { /* if voice was stolen */ + update = (ALFreeParam*)__allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set voice data + */ + update->delta = drvr->paramSamples + voice->pvoice->offset; + update->type = AL_FILTER_FREE_VOICE; + update->pvoice = voice->pvoice; + + f = voice->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } else { + _freePVoice(drvr, voice->pvoice); + } + + voice->pvoice = 0; + } +} diff --git a/lib/hackerlibultra/src/audio/syngetfxref.c b/lib/hackerlibultra/src/audio/syngetfxref.c new file mode 100644 index 00000000..0f2e97e2 --- /dev/null +++ b/lib/hackerlibultra/src/audio/syngetfxref.c @@ -0,0 +1,31 @@ +/*==================================================================== + * syngetfxref.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +ALFxRef alSynGetFXRef(ALSynth* s, s16 bus, s16 index) { + ALMainBus* m = (ALMainBus*)s->mainBus; + ALFilter** sources = m->sources; + + if (sources[0]->type == AL_FX) + return (ALFxRef)(&s->auxBus[bus].fx[index]); + else + return 0; +} diff --git a/lib/hackerlibultra/src/audio/syngetpriority.c b/lib/hackerlibultra/src/audio/syngetpriority.c new file mode 100644 index 00000000..d1f302ef --- /dev/null +++ b/lib/hackerlibultra/src/audio/syngetpriority.c @@ -0,0 +1,25 @@ +/*==================================================================== + * syngetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +s16 alSynGetPriority(ALSynth* s, ALVoice* voice) { + return voice->priority; +} diff --git a/lib/hackerlibultra/src/audio/synremoveplayer.c b/lib/hackerlibultra/src/audio/synremoveplayer.c new file mode 100644 index 00000000..74545eb1 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synremoveplayer.c @@ -0,0 +1,46 @@ +/*==================================================================== + * synremoveplayer.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include + +void alSynRemovePlayer(ALSynth* drvr, ALPlayer* client) { + ALPlayer* thing; + ALPlayer* prev = 0; + + if (drvr->head != 0) { + OSIntMask mask = osSetIntMask(OS_IM_NONE); + + for (thing = drvr->head; thing != 0; thing = thing->next) { + if (thing == client) { + if (prev) + prev->next = thing->next; + else + drvr->head = thing->next; + + client->next = 0; + break; + } + prev = thing; + } + + osSetIntMask(mask); + } +} diff --git a/lib/hackerlibultra/src/audio/synsetfxmix.c b/lib/hackerlibultra/src/audio/synsetfxmix.c new file mode 100644 index 00000000..21138cd3 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synsetfxmix.c @@ -0,0 +1,58 @@ +/*==================================================================== + * synsetfxmix.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetFXMix(ALSynth* synth, ALVoice* v, u8 fxmix) { + ALParam* update; + ALFilter* f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and fxmix data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_FXAMT; +#if BUILD_VERSION >= VERSION_J + if (fxmix > 127) { + fxmix = 127; + } + update->data.i = fxmix; +#else + if (fxmix < 0) { // Not possible + update->data.i = -fxmix; + } else { + update->data.i = fxmix; + } +#endif + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synsetfxparam.c b/lib/hackerlibultra/src/audio/synsetfxparam.c new file mode 100644 index 00000000..73e54ae0 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synsetfxparam.c @@ -0,0 +1,27 @@ +/*==================================================================== + * synsetfxparam.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" + +void alSynSetFXParam(ALSynth* synth, ALFxRef fx, s16 paramID, void* param) { + ALFx* f = (ALFx*)fx; + + (*f->paramHdl)(f, (s32)paramID, param); +} diff --git a/lib/hackerlibultra/src/audio/synsetpan.c b/lib/hackerlibultra/src/audio/synsetpan.c new file mode 100644 index 00000000..1688e07b --- /dev/null +++ b/lib/hackerlibultra/src/audio/synsetpan.c @@ -0,0 +1,48 @@ +/*==================================================================== + * synsetpan.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetPan(ALSynth* synth, ALVoice* v, u8 pan) { + ALParam* update; + ALFilter* f; + + if (v->pvoice) { + + /* + * get new update struct from the free list + */ + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and pan data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_PAN; + update->data.i = pan; + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synsetpitch.c b/lib/hackerlibultra/src/audio/synsetpitch.c new file mode 100644 index 00000000..6eb4125d --- /dev/null +++ b/lib/hackerlibultra/src/audio/synsetpitch.c @@ -0,0 +1,48 @@ +/*==================================================================== + * synsetpitch.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetPitch(ALSynth* synth, ALVoice* v, f32 pitch) { + ALParam* update; + ALFilter* f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and pitch data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_PITCH; + update->data.f = pitch; + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synsetpriority.c b/lib/hackerlibultra/src/audio/synsetpriority.c new file mode 100644 index 00000000..334c1c3a --- /dev/null +++ b/lib/hackerlibultra/src/audio/synsetpriority.c @@ -0,0 +1,25 @@ +/*==================================================================== + * synsetpriority.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include + +void alSynSetPriority(ALSynth* s, ALVoice* voice, s16 priority) { + voice->priority = priority; +} diff --git a/lib/hackerlibultra/src/audio/synsetvol.c b/lib/hackerlibultra/src/audio/synsetvol.c new file mode 100644 index 00000000..ac951474 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synsetvol.c @@ -0,0 +1,48 @@ +/*==================================================================== + * synsetvol.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynSetVol(ALSynth* synth, ALVoice* v, s16 volume, ALMicroTime t) { + ALParam* update; + ALFilter* f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * set offset and volume data + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_SET_VOLUME; + update->data.i = volume; + update->moredata.i = _timeToSamples(synth, t); + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synstartvoice.c b/lib/hackerlibultra/src/audio/synstartvoice.c new file mode 100644 index 00000000..8e672992 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synstartvoice.c @@ -0,0 +1,46 @@ +/*==================================================================== + * synstartvoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynStartVoice(ALSynth* synth, ALVoice* v, ALWaveTable* table) { + ALStartParam* update; + ALFilter* f; + + if (v->pvoice) { + + update = (ALStartParam*)__allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + /* + * send the start message to the motion control filter + */ + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_START_VOICE; + update->wave = table; + update->next = 0; + update->unity = v->unityPitch; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synstartvoiceparam.c b/lib/hackerlibultra/src/audio/synstartvoiceparam.c new file mode 100644 index 00000000..198741aa --- /dev/null +++ b/lib/hackerlibultra/src/audio/synstartvoiceparam.c @@ -0,0 +1,70 @@ +/*==================================================================== + * synquickstartvoice + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include +#include + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 1.17 $" +#endif + +void alSynStartVoiceParams(ALSynth* s, ALVoice* v, ALWaveTable* w, f32 pitch, s16 vol, ALPan pan, u8 fxmix, + ALMicroTime t) { + ALStartParamAlt* update; + ALFilter* f; + + if (v->pvoice) { + /* + * get new update struct from the free list + */ + update = (ALStartParamAlt*)__allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + +#if BUILD_VERSION >= VERSION_J + if (fxmix > 127) { + fxmix = 127; + } +#else + if (fxmix < 0) { // Not possible + fxmix = -fxmix; + } +#endif + + /* + * set offset and fxmix data + */ + update->delta = s->paramSamples + v->pvoice->offset; + update->next = 0; + update->type = AL_FILTER_START_VOICE_ALT; + + update->unity = v->unityPitch; + update->pan = pan; + update->volume = vol; + update->fxMix = fxmix; + update->pitch = pitch; + update->samples = _timeToSamples(s, t); + update->wave = w; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synstopvoice.c b/lib/hackerlibultra/src/audio/synstopvoice.c new file mode 100644 index 00000000..4e8a2921 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synstopvoice.c @@ -0,0 +1,41 @@ +/*==================================================================== + * synstopvoice.c + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#include "synthInternals.h" +#include +#include + +void alSynStopVoice(ALSynth* synth, ALVoice* v) { + ALParam* update; + ALFilter* f; + + if (v->pvoice) { + + update = __allocParam(); + ALFailIf(update == 0, ERR_ALSYN_NO_UPDATE); + + update->delta = synth->paramSamples + v->pvoice->offset; + update->type = AL_FILTER_STOP_VOICE; + update->next = 0; + + f = v->pvoice->channelKnob; + (*f->setParam)(f, AL_FILTER_ADD_UPDATE, update); + } +} diff --git a/lib/hackerlibultra/src/audio/synthInternals.h b/lib/hackerlibultra/src/audio/synthInternals.h new file mode 100644 index 00000000..47961096 --- /dev/null +++ b/lib/hackerlibultra/src/audio/synthInternals.h @@ -0,0 +1,334 @@ +/*==================================================================== + * audioInternals.h + * + * Synopsis: + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ + +#ifndef __audioInternals__ +#define __audioInternals__ + +#include +#include + +/* + * filter message ids + */ +enum { + AL_FILTER_FREE_VOICE, + AL_FILTER_SET_SOURCE, + AL_FILTER_ADD_SOURCE, + AL_FILTER_ADD_UPDATE, + AL_FILTER_RESET, + AL_FILTER_SET_WAVETABLE, + /* AL_FILTER_SET_DMA_PROC,*/ + /* AL_FILTER_SKIP_LOOP,*/ + AL_FILTER_SET_DRAM, + AL_FILTER_SET_PITCH, + AL_FILTER_SET_UNITY_PITCH, + AL_FILTER_START, + /* AL_FILTER_SET_DECAY,*/ + /* AL_FILTER_SET_FC,*/ + AL_FILTER_SET_STATE, + AL_FILTER_SET_VOLUME, + AL_FILTER_SET_PAN, + AL_FILTER_START_VOICE_ALT, + AL_FILTER_START_VOICE, + AL_FILTER_STOP_VOICE, + AL_FILTER_SET_FXAMT +}; + +#define AL_MAX_RSP_SAMPLES 160 + +/* + * buffer locations based on AL_MAX_RSP_SAMPLES + */ +#define AL_DECODER_IN 0 +#define AL_RESAMPLER_OUT 0 +#define AL_TEMP_0 0 +#define AL_DECODER_OUT 320 +#define AL_TEMP_1 320 +#define AL_TEMP_2 640 +#define AL_MAIN_L_OUT 1088 +#define AL_MAIN_R_OUT 1408 +#define AL_AUX_L_OUT 1728 +#define AL_AUX_R_OUT 2048 + +/* + * filter types + */ +enum { AL_ADPCM, AL_RESAMPLE, AL_BUFFER, AL_SAVE, AL_ENVMIX, AL_FX, AL_AUXBUS, AL_MAINBUS }; + +typedef struct ALParam_s { + struct ALParam_s* next; + s32 delta; + s16 type; + union { + f32 f; + s32 i; + } data; + union { + f32 f; + s32 i; + } moredata; + union { + f32 f; + s32 i; + } stillmoredata; + union { + f32 f; + s32 i; + } yetstillmoredata; +} ALParam; + +typedef struct { + struct ALParam_s* next; + s32 delta; + s16 type; + s16 unity; /* disable resampler */ + f32 pitch; + s16 volume; + ALPan pan; + u8 fxMix; + s32 samples; + struct ALWaveTable_s* wave; +} ALStartParamAlt; + +typedef struct { + struct ALParam_s* next; + s32 delta; + s16 type; + s16 unity; /* disable resampler */ + struct ALWaveTable_s* wave; +} ALStartParam; + +typedef struct { + struct ALParam_s* next; + s32 delta; + s16 type; + struct PVoice_s* pvoice; +} ALFreeParam; + +typedef Acmd* (*ALCmdHandler)(void*, s16*, s32, s32, Acmd*); +typedef s32 (*ALSetParam)(void*, s32, void*); + +typedef struct ALFilter_s { + struct ALFilter_s* source; + ALCmdHandler handler; + ALSetParam setParam; + s16 inp; + s16 outp; + s32 type; +} ALFilter; + +void alFilterNew(ALFilter* f, ALCmdHandler h, ALSetParam s, s32 type); + +#define AL_MAX_ADPCM_STATES \ + 3 /* Depends on number of subframes \ + * per frame and loop length \ + */ +typedef struct { + ALFilter filter; + ADPCM_STATE* state; + ADPCM_STATE* lstate; + ALRawLoop loop; + struct ALWaveTable_s* table; + s32 bookSize; + ALDMAproc dma; + void* dmaState; + s32 sample; + s32 lastsam; + s32 first; + s32 memin; +} ALLoadFilter; + +void alLoadNew(ALLoadFilter* f, ALDMANew dma, ALHeap* hp); +Acmd* alAdpcmPull(void* f, s16* outp, s32 byteCount, s32 sampleOffset, Acmd* p); +Acmd* alRaw16Pull(void* f, s16* outp, s32 byteCount, s32 sampleOffset, Acmd* p); +s32 alLoadParam(void* filter, s32 paramID, void* param); + +typedef struct ALResampler_s { + ALFilter filter; + RESAMPLE_STATE* state; + f32 ratio; + s32 upitch; + f32 delta; + s32 first; + ALParam* ctrlList; + ALParam* ctrlTail; + s32 motion; +} ALResampler; + +typedef struct { + s16 fc; + s16 fgain; + union { + s16 fccoef[16]; + s64 force_aligned; + } fcvec; + POLEF_STATE* fstate; + s32 first; +} ALLowPass; + +typedef struct { + u32 input; + u32 output; + s16 ffcoef; + s16 fbcoef; + s16 gain; + f32 rsinc; + f32 rsval; + s32 rsdelta; + f32 rsgain; + ALLowPass* lp; + ALResampler* rs; +} ALDelay; + +typedef s32 (*ALSetFXParam)(void*, s32, void*); +typedef struct { + struct ALFilter_s filter; + s16* base; + s16* input; + u32 length; + ALDelay* delay; + u8 section_count; + ALSetFXParam paramHdl; +} ALFx; + +void alFxNew(ALFx* r, ALSynConfig* c, ALHeap* hp); +Acmd* alFxPull(void* f, s16* outp, s32 out, s32 sampleOffset, Acmd* p); +s32 alFxParam(void* filter, s32 paramID, void* param); +s32 alFxParamHdl(void* filter, s32 paramID, void* param); + +#define AL_MAX_MAIN_BUS_SOURCES 1 +typedef struct ALMainBus_s { + ALFilter filter; + s32 sourceCount; + s32 maxSources; + ALFilter** sources; +} ALMainBus; + +void alMainBusNew(ALMainBus* m, void* ptr, s32 len); +Acmd* alMainBusPull(void* f, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p); +s32 alMainBusParam(void* filter, s32 paramID, void* param); + +#define AL_MAX_AUX_BUS_SOURCES 8 +#define AL_MAX_AUX_BUS_FX 1 +typedef struct ALAuxBus_s { + ALFilter filter; + s32 sourceCount; + s32 maxSources; + ALFilter** sources; + ALFx fx[AL_MAX_AUX_BUS_FX]; +} ALAuxBus; + +void alAuxBusNew(ALAuxBus* m, void* ptr, s32 len); +Acmd* alAuxBusPull(void* f, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p); +s32 alAuxBusParam(void* filter, s32 paramID, void* param); + +void alResampleNew(ALResampler* r, ALHeap* hp); +Acmd* alResamplePull(void* f, s16* outp, s32 out, s32 sampleOffset, Acmd* p); +s32 alResampleParam(void* f, s32 paramID, void* param); + +typedef struct ALSave_s { + ALFilter filter; + s32 dramout; + s32 first; +} ALSave; + +void alSaveNew(ALSave* r); +Acmd* alSavePull(void* f, s16* outp, s32 outCount, s32 sampleOffset, Acmd* p); +s32 alSaveParam(void* f, s32 paramID, void* param); + +typedef struct ALEnvMixer_s { + ALFilter filter; + ENVMIX_STATE* state; + s16 pan; + s16 volume; + s16 cvolL; + s16 cvolR; + s16 dryamt; + s16 wetamt; + u16 lratl; + s16 lratm; + s16 ltgt; + u16 rratl; + s16 rratm; + s16 rtgt; + s32 delta; + s32 segEnd; + s32 first; + ALParam* ctrlList; + ALParam* ctrlTail; + ALFilter** sources; + s32 motion; +} ALEnvMixer; + +void alEnvmixerNew(ALEnvMixer* e, ALHeap* hp); +Acmd* alEnvmixerPull(void* f, s16* outp, s32 out, s32 sampleOffset, Acmd* p); +s32 alEnvmixerParam(void* filter, s32 paramID, void* param); + +/* + * heap stuff + */ +typedef struct { + s32 magic; /* check structure integrety */ + s32 size; /* size of this allocated block */ + u8* file; /* file that this alloc was called from */ + s32 line; /* line that it was called from */ + s32 count; /* heap call number */ + s32 pad0; + s32 pad1; + s32 pad2; /* Make it 32 bytes */ +} HeapInfo; + +#define AL_CACHE_ALIGN 15 + +/* + * synth stuff + */ + +typedef struct PVoice_s { + ALLink node; + struct ALVoice_s* vvoice; + ALFilter* channelKnob; + ALLoadFilter decoder; + ALResampler resampler; + ALEnvMixer envmixer; + s32 offset; +} PVoice; + +/* + * prototypes for private driver functions + */ +ALParam* __allocParam(void); +void __freeParam(ALParam* param); +void _freePVoice(ALSynth* drvr, PVoice* pvoice); +void _collectPVoices(ALSynth* drvr); + +s32 _timeToSamples(ALSynth* ALSynth, s32 micros); +ALMicroTime _samplesToTime(ALSynth* synth, s32 samples); + +// This was renamed to have a leading underscore in 2.0J +#if BUILD_VERSION < VERSION_J +#define _init_lpfilter init_lpfilter +#endif + +void _init_lpfilter(ALLowPass* lp); + +#endif diff --git a/lib/hackerlibultra/src/audio/synthesizer.c b/lib/hackerlibultra/src/audio/synthesizer.c new file mode 100644 index 00000000..8e18313b --- /dev/null +++ b/lib/hackerlibultra/src/audio/synthesizer.c @@ -0,0 +1,306 @@ +/*==================================================================== + * synthesizer.c + * + * Copyright 1993, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include "synthInternals.h" +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +#ifdef AUD_PROFILE +#include +extern u32 cnt_index, drvr_num, drvr_cnt, drvr_max, drvr_min, lastCnt[]; +extern u32 client_num, client_cnt, client_max, client_min; +#endif + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +static s32 __nextSampleTime(ALSynth* drvr, ALPlayer** client); +static s32 _timeToSamplesNoRound(ALSynth* ALSynth, s32 micros); + +/*********************************************************************** + * Synthesis driver public interfaces + ***********************************************************************/ +void alSynNew(ALSynth* drvr, ALSynConfig* c) { + s32 i; + ALVoice* vv; + PVoice* pv; + ALVoice* vvoices; + PVoice* pvoices; + ALHeap* hp = c->heap; + ALSave* save; + ALFilter* sources; + ALParam* params; + ALParam* paramPtr; + + drvr->head = NULL; + drvr->numPVoices = c->maxPVoices; + drvr->curSamples = 0; + drvr->paramSamples = 0; + drvr->outputRate = c->outputRate; + drvr->maxOutSamples = AL_MAX_RSP_SAMPLES; + drvr->dma = (ALDMANew)c->dmaproc; + + save = alHeapAlloc(hp, 1, sizeof(ALSave)); + alSaveNew(save); + drvr->outputFilter = (ALFilter*)save; + + /* + * allocate and initialize the auxilliary effects bus. at present + * we only support 1 effects bus. + */ + drvr->auxBus = alHeapAlloc(hp, 1, sizeof(ALAuxBus)); + drvr->maxAuxBusses = 1; + sources = alHeapAlloc(hp, c->maxPVoices, sizeof(ALFilter*)); + alAuxBusNew(drvr->auxBus, sources, c->maxPVoices); + + /* + * allocate and initialize the main bus. + */ + drvr->mainBus = alHeapAlloc(hp, 1, sizeof(ALMainBus)); + sources = alHeapAlloc(hp, c->maxPVoices, sizeof(ALFilter*)); + alMainBusNew(drvr->mainBus, sources, c->maxPVoices); + + if (c->fxType != AL_FX_NONE) { + /* + * Allocate an effect and set parameters + */ + alSynAllocFX(drvr, 0, c, hp); + } else + /* + * Connect the aux bus to the main bus + */ + alMainBusParam(drvr->mainBus, AL_FILTER_ADD_SOURCE, &drvr->auxBus[0]); + + /* + * Build the physical voice lists + */ + drvr->pFreeList.next = 0; + drvr->pFreeList.prev = 0; + drvr->pLameList.next = 0; + drvr->pLameList.prev = 0; + drvr->pAllocList.next = 0; + drvr->pAllocList.prev = 0; + + pvoices = alHeapAlloc(hp, c->maxPVoices, sizeof(PVoice)); + for (i = 0; i < c->maxPVoices; i++) { + pv = &pvoices[i]; + alLink((ALLink*)pv, &drvr->pFreeList); + pv->vvoice = 0; + + alLoadNew(&pv->decoder, drvr->dma, hp); + alLoadParam(&pv->decoder, AL_FILTER_SET_SOURCE, 0); + + alResampleNew(&pv->resampler, hp); + alResampleParam(&pv->resampler, AL_FILTER_SET_SOURCE, &pv->decoder); + + alEnvmixerNew(&pv->envmixer, hp); + alEnvmixerParam(&pv->envmixer, AL_FILTER_SET_SOURCE, &pv->resampler); + + alAuxBusParam(drvr->auxBus, AL_FILTER_ADD_SOURCE, &pv->envmixer); + + pv->channelKnob = (ALFilter*)&pv->envmixer; + } + + alSaveParam(save, AL_FILTER_SET_SOURCE, drvr->mainBus); + + /* + * build the parameter update list + */ + params = alHeapAlloc(hp, c->maxUpdates, sizeof(ALParam)); + drvr->paramList = 0; + for (i = 0; i < c->maxUpdates; i++) { + paramPtr = ¶ms[i]; + paramPtr->next = drvr->paramList; + drvr->paramList = paramPtr; + } + + drvr->heap = hp; +} + +/* + * slAudioFrame() is called every video frame, and is based on the video + * frame interrupt. It is assumed to be an accurate time source for the + * clients. + */ +Acmd* alAudioFrame(Acmd* cmdList, s32* cmdLen, s16* outBuf, s32 outLen) { + ALPlayer* client; + ALFilter* output; + ALSynth* drvr = &alGlobals->drvr; + s16 tmp = 0; /* Starting buffer in DMEM */ + Acmd* cmdlEnd = cmdList; + Acmd* cmdPtr; + s32 nOut; + s16* lOutBuf = outBuf; + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + if (drvr->head == 0) { + *cmdLen = 0; + return cmdList; /* nothing to do */ + } + + /* + * run down list of clients and execute callback if needed this + * subframe. Here we do all the work for the frame at the + * start. Time offsets that occur before the next frame are + * executed "early". + */ + +#ifdef AUD_PROFILE + lastCnt[++cnt_index] = osGetCount(); +#endif + + /* + * paramSamples = time of next parameter change. + * curSamples = current sample time. + * so paramSamples - curSamples is the time until the next parameter change. + * if the next parameter change occurs within this frame time (outLen), + * then call back the client that contains the parameter change. + * Note, paramSamples must be rounded down to 16 sample boundary for use + * during the client handler. + */ + + for (drvr->paramSamples = __nextSampleTime(drvr, &client); drvr->paramSamples - drvr->curSamples < outLen; + drvr->paramSamples = __nextSampleTime(drvr, &client)) { + drvr->paramSamples &= ~0xf; + client->samplesLeft += _timeToSamplesNoRound(drvr, (*client->handler)(client)); + } + + /* for safety's sake, always store paramSamples aligned to 16 sample boundary. + * this way, if an voice handler routine gets called outside the ALVoiceHandler + * routine (alSynAllocVoice) it will get timestamped with an aligned value and + * will be processed immediately next audio frame. + */ + drvr->paramSamples &= ~0xf; + +#ifdef AUD_PROFILE + PROFILE_AUD(client_num, client_cnt, client_max, client_min); +#endif + + /* + * Now build the command list in small chunks + */ + while (outLen > 0) { + nOut = MIN(drvr->maxOutSamples, outLen); + + /* + * construct the command list for each physical voice by calling + * the head of the filter chain. + */ + cmdPtr = cmdlEnd; + aSegment(cmdPtr++, 0, 0); + output = drvr->outputFilter; + (*output->setParam)(output, AL_FILTER_SET_DRAM, lOutBuf); + cmdlEnd = (*output->handler)(output, &tmp, nOut, drvr->curSamples, cmdPtr); + + outLen -= nOut; + lOutBuf += nOut << 1; /* For Stereo */ + drvr->curSamples += nOut; + } + *cmdLen = (s32)(cmdlEnd - cmdList); + + _collectPVoices(drvr); /* collect free physical voices */ + +#ifdef AUD_PROFILE + PROFILE_AUD(drvr_num, drvr_cnt, drvr_max, drvr_min); +#endif + return cmdlEnd; +} + +/*********************************************************************** + * Synthesis driver private interfaces + ***********************************************************************/ + +ALParam* __allocParam() { + ALParam* update = 0; + ALSynth* drvr = &alGlobals->drvr; + + if (drvr->paramList) { + update = drvr->paramList; + drvr->paramList = drvr->paramList->next; + update->next = 0; + } + return update; +} + +void __freeParam(ALParam* param) { + ALSynth* drvr = &alGlobals->drvr; + param->next = drvr->paramList; + drvr->paramList = param; +} + +void _collectPVoices(ALSynth* drvr) { + ALLink* dl; + PVoice* pv; + + while ((dl = drvr->pLameList.next) != 0) { + pv = (PVoice*)dl; + + /* ### remove from mixer */ + + alUnlink(dl); + alLink(dl, &drvr->pFreeList); + } +} + +void _freePVoice(ALSynth* drvr, PVoice* pvoice) { + /* + * move the voice from the allocated list to the lame list + */ + alUnlink((ALLink*)pvoice); + alLink((ALLink*)pvoice, &drvr->pLameList); +} + +/* + Add 0.5 to adjust the average affect of + the truncation error produced by casting + a float to an int. +*/ +s32 _timeToSamplesNoRound(ALSynth* synth, s32 micros) { + f32 tmp = ((f32)micros) * synth->outputRate / 1000000.0 + 0.5; + + return (s32)tmp; +} + +s32 _timeToSamples(ALSynth* synth, s32 micros) { + return _timeToSamplesNoRound(synth, micros) & ~0xf; +} + +static s32 __nextSampleTime(ALSynth* drvr, ALPlayer** client) { + ALMicroTime delta = 0x7fffffff; /* max delta for s32 */ + ALPlayer* cl; +#if BUILD_VERSION < VERSION_J // Adjust line numbers to match assert +#line 306 +#endif + assert(drvr->head); + + *client = 0; + + for (cl = drvr->head; cl != 0; cl = cl->next) { + if ((cl->samplesLeft - drvr->curSamples) < delta) { + *client = cl; + delta = cl->samplesLeft - drvr->curSamples; + } + } + + return (*client)->samplesLeft; +} diff --git a/lib/hackerlibultra/src/debug/assert.c b/lib/hackerlibultra/src/debug/assert.c new file mode 100644 index 00000000..ffdb5eee --- /dev/null +++ b/lib/hackerlibultra/src/debug/assert.c @@ -0,0 +1,12 @@ +#include "os.h" +#include "PRinternal/osint.h" +#include "osint_debug.h" + +void __assertBreak(void); + +void __assert(const char* exp, const char* filename, int line) { +#ifndef _FINALROM + osSyncPrintf("\nASSERTION FAULT: %s, %d: \"%s\"\n", filename, line, exp); + __assertBreak; // Doesn't actually do anything, but is needed for matching +#endif +} diff --git a/lib/hackerlibultra/src/debug/assertbreak.s b/lib/hackerlibultra/src/debug/assertbreak.s new file mode 100644 index 00000000..69de71d9 --- /dev/null +++ b/lib/hackerlibultra/src/debug/assertbreak.s @@ -0,0 +1,14 @@ +#include "PR/os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder + +LEAF(__assertBreak) + break 0 + j ra +END(__assertBreak) + +#endif diff --git a/lib/ultra/os/atomic.c b/lib/hackerlibultra/src/debug/atomic.c similarity index 69% rename from lib/ultra/os/atomic.c rename to lib/hackerlibultra/src/debug/atomic.c index 10949024..a0bd8fec 100644 --- a/lib/ultra/os/atomic.c +++ b/lib/hackerlibultra/src/debug/atomic.c @@ -1,11 +1,11 @@ #include "PR/os_internal.h" -s32 __osAtomicDec(u32 *p) { - s32 mask; - s32 result; +int __osAtomicDec(unsigned int* p) { + u32 mask; + int result; mask = __osDisableInt(); - if (*p != 0) { + if (*p) { (*p)--; result = 1; } else { diff --git a/lib/hackerlibultra/src/debug/kdebugserver.c b/lib/hackerlibultra/src/debug/kdebugserver.c new file mode 100644 index 00000000..7df4360c --- /dev/null +++ b/lib/hackerlibultra/src/debug/kdebugserver.c @@ -0,0 +1,96 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/rdb.h" + +// not included in final rom, but __osThreadSave is here for some reason +OSThread __osThreadSave; + +extern OSThread* __osRunningThread; +extern u32 __osRdb_IP6_Empty; + +#ifndef _FINALROM + +static u8 buffer[12]; +static u32 numChars = 0; + +static u32 string_to_u32(u8* s) { + u32 k; + + k = ((s[0] & 0xFF) << 0x18); + k |= ((s[1] & 0xFF) << 0x10); + k |= ((s[2] & 0xFF) << 0x8); + k |= (s[3] & 0xFF); + + return k; +} + +static void send_packet(u8* s, u32 n) { + rdbPacket packet; + u32 i; + + packet.type = 0xC; + packet.length = n; + + for (i = 0; i < n; i++) { + packet.buf[i] = s[i]; + } + *(vu32*)RDB_BASE_REG = *(u32*)&packet; +} + +static void clear_IP6(void) { + while (!(__osGetCause() & CAUSE_IP6)) { + ; + } + *(vu32*)RDB_READ_INTR_REG = 0; + + while (__osGetCause() & CAUSE_IP6) { + ; + } +} + +static void send(u8* s, u32 n) { + u32 ct; + u32 i = 0; + u32 getLastIP6; + + if (!__osRdb_IP6_Empty) { + clear_IP6(); + getLastIP6 = FALSE; + } else { + getLastIP6 = TRUE; + } + while (n != 0) { + ct = (n < 3) ? n : 3; + send_packet(s + i, ct); + n -= ct; + i += ct; + if (n != 0) { + clear_IP6(); + } + } + if (getLastIP6) { + clear_IP6(); + } +} + +void kdebugserver(rdbPacket packet) { + u32 i; + u32 length; + u8* addr; + + for (i = 0; i < 3; i++) { + buffer[numChars++] = packet.buf[i]; + } + + if (buffer[0] == 2) { + send((char*)&__osRunningThread->context, sizeof(__OSThreadContext)); + numChars = 0; + } else if (numChars >= 9 && buffer[0] == 1) { + addr = string_to_u32(&buffer[1]); + length = string_to_u32(&buffer[5]); + send(addr, length); + numChars = 0; + } +} + +#endif diff --git a/lib/hackerlibultra/src/debug/osint_debug.h b/lib/hackerlibultra/src/debug/osint_debug.h new file mode 100644 index 00000000..6d644f2f --- /dev/null +++ b/lib/hackerlibultra/src/debug/osint_debug.h @@ -0,0 +1,11 @@ +#include "PR/os_internal.h" + +extern s32 __osThprofFlag; +extern void (*__osThprofFunc)(OSThread*); +extern u32 __osThprofLastTimer; +extern u32 __osThprofCount; +extern __OSThreadprofile_s thprof[]; +extern u64 __osThprofHeap[]; +extern void* __osThprofStack; + +void osThreadProfileCallback(OSThread*); diff --git a/lib/hackerlibultra/src/debug/profile.c b/lib/hackerlibultra/src/debug/profile.c new file mode 100644 index 00000000..bdc47ae5 --- /dev/null +++ b/lib/hackerlibultra/src/debug/profile.c @@ -0,0 +1,176 @@ +#include "PR/rdb.h" +#include "PR/ultratypes.h" +#include "PR/os.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PR/sptask.h" +#include "PRinternal/osint.h" +#include "PRinternal/macros.h" +#include "osint_debug.h" + +#ifndef _FINALROM + +OSTimer __osProfTimer; +OSMesg __osProfTimerMsg; + +OSMesgQueue __osProfFlushMQ ALIGNED(0x8); +OSMesg __osProfFlushMesg; + +OSMesgQueue __osProfAckMQ ALIGNED(0x8); +OSMesg __osProfAckMesg; + +u32 __osProfTimerPeriod; + +u32 __osProfNumSections; + +static u32 __osProfileActive = FALSE; +static u32 __osProfileIOActive = FALSE; + +STACK(__osProfileIOStack, 0x960) ALIGNED(0x10); + +static OSThread __osProfileIOThread; + +void osProfSendWord(u32 word); + +void __osProfileIO(void* arg) { + s32 totalBytes; + u32 bytesThisBlock; + u32 ct; + u8* sendPtr; + OSProf* t; + + while (TRUE) { + osRecvMesg(&__osProfFlushMQ, NULL, OS_MESG_BLOCK); + osProfSendWord(__osProfNumSections); + osProfSendWord(__osProfTimerPeriod); + osProfSendWord(__osProfileOverflowBin); + + for (t = __osProfileList; t < __osProfileListEnd; t++) { + osProfSendWord(t->text_start); + osProfSendWord(t->histo_size); + osRecvMesg(&__osProfAckMQ, NULL, OS_MESG_BLOCK); + + totalBytes = t->histo_size * 2; + sendPtr = t->histo_base; + while (totalBytes > 0) { + bytesThisBlock = (totalBytes < 0x800U) ? totalBytes : 0x800U; + + ct = 0; + while (ct < bytesThisBlock) { + ct += __osRdbSend(sendPtr + ct, bytesThisBlock - ct, RDB_TYPE_GtoH_PROF_DATA); + } + + sendPtr += bytesThisBlock; + totalBytes -= bytesThisBlock; + osRecvMesg(&__osProfAckMQ, NULL, OS_MESG_BLOCK); + } + } + } +} + +void osProfSendWord(u32 word) { + u32 ct = 0; + u8* sendPtr = &word; + + while (ct < sizeof(word)) { + ct += __osRdbSend(sendPtr + ct, sizeof(word) - ct, RDB_TYPE_GtoH_PROF_DATA); + } +} + +void osProfileFlush(void) { + osSendMesg(&__osProfFlushMQ, NULL, OS_MESG_BLOCK); +} + +void osProfileInit(OSProf* profp, u32 profcnt) { + u32 i; + OSProf* t; + +#if !defined(NDEBUG) && BUILD_VERSION >= VERSION_K + if (__osProfileActive) { + __osError(ERR_OSPROFILEINIT_STR, 0); + return; + } + + if (profcnt == 0) { + __osError(ERR_OSPROFILEINIT_CNT, 1, profcnt); + return; + } +#endif + + for (t = profp; t < profp + profcnt; t++) { +#ifndef NDEBUG + if ((u32)t->histo_base & 1) { + __osError(ERR_OSPROFILEINIT_ALN, 1, t->histo_base); + return; + } + + if (t->text_start >= t->text_end) { + __osError(ERR_OSPROFILEINIT_ORD, 2, t->text_start, t->text_end); + return; + } + + if (((u32)(t->text_end - t->text_start) / 4) > t->histo_size) { + __osError(ERR_OSPROFILEINIT_SIZ, 1, t->histo_size); + return; + } +#endif + + for (i = 0; i < t->histo_size; i++) { + t->histo_base[i] = 0; + } + } + + __osProfileActive = FALSE; + __osProfileOverflowBin = 0; + __osProfileList = profp; + __osProfileListEnd = profp + profcnt; + __osProfNumSections = profcnt; + if (!__osProfileIOActive) { + osCreateMesgQueue(&__osProfFlushMQ, &__osProfFlushMesg, 1); + osSetEventMesg(OS_EVENT_RDB_FLUSH_PROF, &__osProfFlushMQ, 0); + osCreateMesgQueue(&__osProfAckMQ, &__osProfAckMesg, 1); + osSetEventMesg(OS_EVENT_RDB_ACK_PROF, &__osProfAckMQ, 0); + osCreateThread(&__osProfileIOThread, 0, __osProfileIO, NULL, STACK_START(__osProfileIOStack), 0x81); + osStartThread(&__osProfileIOThread); + __osProfileIOActive = TRUE; + } +} + +void osProfileStart(u32 microseconds) { +#ifndef NDEBUG + if (microseconds < 50) { + __osError(ERR_OSPROFILESTART_TIME, 1, microseconds); + return; + } + + if (__osProfileActive) { + __osError(ERR_OSPROFILESTART_FLAG, 0); + return; + } +#endif + + osCreateMesgQueue(&__osProfTimerQ, &__osProfTimerMsg, 1); + osSetTimer(&__osProfTimer, 0, OS_USEC_TO_CYCLES(microseconds), &__osProfTimerQ, NULL); + __osProfTimerPeriod = microseconds; + __osProfileActive = TRUE; +} + +void osProfileStop(void) { +#ifndef NDEBUG + if (!__osProfileActive) { + __osError(ERR_OSPROFILESTOP_FLAG, 0); + return; + } +#endif + + if (osStopTimer(&__osProfTimer) < 0) { +#ifndef NDEBUG + __osError(ERR_OSPROFILESTOP_TIMER, 0); + return; +#endif + } + + __osProfileActive = FALSE; +} + +#endif diff --git a/lib/hackerlibultra/src/debug/threadprofile.c b/lib/hackerlibultra/src/debug/threadprofile.c new file mode 100644 index 00000000..55f1353c --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofile.c @@ -0,0 +1,22 @@ +#include "osint_debug.h" + +#include "PRinternal/macros.h" + +s32 __osThprofFlag = 0; +void (*__osThprofFunc)(OSThread*) = NULL; + +u32 __osThprofLastTimer; +u32 __osThprofCount; +__OSThreadprofile_s thprof[THPROF_IDMAX] ALIGNED(0x10); +u64 __osThprofHeap[THPROF_STACKSIZE] ALIGNED(0x10); +void* __osThprofStack; + +void osThreadProfileCallback(OSThread* osthread) { + register u32 now_time = osGetCount(); + __OSThreadprofile_s* thprof = osthread->thprof; + + thprof->time += now_time - __osThprofLastTimer; + thprof->count++; + __osThprofCount++; + __osThprofLastTimer = now_time; +} diff --git a/lib/hackerlibultra/src/debug/threadprofileclear.c b/lib/hackerlibultra/src/debug/threadprofileclear.c new file mode 100644 index 00000000..42788f86 --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofileclear.c @@ -0,0 +1,11 @@ +#include "osint_debug.h" + +void osThreadProfileClear(OSId id) { + register OSIntMask saveMask = __osDisableInt(); + + thprof[id].flag = 0; + thprof[id].count = 0; + thprof[id].time = 0; + + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/debug/threadprofileinit.c b/lib/hackerlibultra/src/debug/threadprofileinit.c new file mode 100644 index 00000000..7fef229b --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofileinit.c @@ -0,0 +1,16 @@ +#include "osint_debug.h" + +void osThreadProfileInit(void) { + register u32 saveMask = __osDisableInt(); + OSId i; + + __osThprofFunc = NULL; + __osThprofFlag = 1; + __osThprofCount = 0; + __osThprofStack = &__osThprofHeap[(THPROF_STACKSIZE - 8) / sizeof(*__osThprofHeap)]; + __osRestoreInt(saveMask); + + for (i = 0; i < THPROF_IDMAX; i++) { + osThreadProfileClear(i); + } +} diff --git a/lib/hackerlibultra/src/debug/threadprofilereadcount.c b/lib/hackerlibultra/src/debug/threadprofilereadcount.c new file mode 100644 index 00000000..32379879 --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofilereadcount.c @@ -0,0 +1,39 @@ +#include "osint_debug.h" + +u32 osThreadProfileReadCount(OSId id) { +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(139, 0); + return 0; + } +#endif + + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(143, 1, id); +#endif + return 0; + } + return thprof[id].count; +} + +u32 osThreadProfileReadCountTh(OSThread* thread) { + OSId id; + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(141, 0); + return 0; + } +#endif + + id = osGetThreadId(thread); + + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(145, 1, id); +#endif + return 0; + } + return thprof[id].count; +} diff --git a/lib/hackerlibultra/src/debug/threadprofilereadtime.c b/lib/hackerlibultra/src/debug/threadprofilereadtime.c new file mode 100644 index 00000000..9930cacd --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofilereadtime.c @@ -0,0 +1,51 @@ +#include "osint_debug.h" + +OSTime osThreadProfileReadTime(OSId id) { + OSTime adjust = 0; + u32 now_time = osGetCount(); + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(140, 0); + return 0; + } +#endif + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(144, 1, id); +#endif + return 0; + } + + if (id == osGetThreadId(NULL) && __osThprofFunc != NULL) { + adjust = now_time - __osThprofLastTimer; + } + return thprof[id].time + adjust; +} + +OSTime osThreadProfileReadTimeTh(OSThread* thread) { + OSId id; + OSTime adjust = 0; + u32 now_time = osGetCount(); + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(142, 0); + return 0; + } +#endif + + id = osGetThreadId(thread); + + if (id >= THPROF_IDMAX) { +#ifndef NDEBUG + __osError(146, 1, id); +#endif + return 0; + } + + if (id == osGetThreadId(NULL) && __osThprofFunc != NULL) { + adjust = now_time - __osThprofLastTimer; + } + return thprof[id].time + adjust; +} diff --git a/lib/hackerlibultra/src/debug/threadprofilestart.c b/lib/hackerlibultra/src/debug/threadprofilestart.c new file mode 100644 index 00000000..3ef8fa76 --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofilestart.c @@ -0,0 +1,22 @@ +#include "osint_debug.h" + +void osThreadProfileStart(void) { + register u32 saveMask; + +#ifndef NDEBUG + if (!__osThprofFlag) { + __osError(136, 0); + return; + } + if (__osThprofFunc != NULL) { + __osError(137, 0); + return; + } +#endif + + saveMask = __osDisableInt(); + + __osThprofLastTimer = osGetCount(); + __osThprofFunc = osThreadProfileCallback; + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/debug/threadprofilestop.c b/lib/hackerlibultra/src/debug/threadprofilestop.c new file mode 100644 index 00000000..4803620b --- /dev/null +++ b/lib/hackerlibultra/src/debug/threadprofilestop.c @@ -0,0 +1,47 @@ +#include "osint_debug.h" + +void osThreadProfileStop(void) { + register u32 saveMask; + int i; + OSId id; + u32 now_time = osGetCount(); + + saveMask = __osDisableInt(); + +#ifndef NDEBUG + if (__osThprofFlag == 0) { +#if BUILD_VERSION >= VERSION_L + __osRestoreInt(saveMask); + __osError(138, 0); +#else + __osError(138, 0); + __osRestoreInt(saveMask); +#endif + return; + } +#endif + + if (__osThprofFunc != NULL) { + id = osGetThreadId(0); + + if (id < THPROF_IDMAX) { + thprof[id].time += now_time - __osThprofLastTimer; + } else { +#ifndef NDEBUG +#if BUILD_VERSION >= VERSION_L + __osRestoreInt(saveMask); +#endif + __osError(147, 1, id); +#if BUILD_VERSION >= VERSION_L + saveMask = __osDisableInt(); +#endif +#endif + } + } + __osThprofFunc = NULL; + + for (i = 0; i < THPROF_IDMAX; i++) { + thprof[i].flag = 0; + } + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/error/commonerror.c b/lib/hackerlibultra/src/error/commonerror.c new file mode 100644 index 00000000..3ed2de96 --- /dev/null +++ b/lib/hackerlibultra/src/error/commonerror.c @@ -0,0 +1,193 @@ +#include "PR/os.h" +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PRinternal/macros.h" +#include "stdarg.h" + +#ifndef _FINALROM + +void __osSyncVPrintf(const char* fmt, va_list args); + +static u32 errorLogData[19] ALIGNED(0x8); +static OSLog errorLog = { + OS_ERROR_MAGIC, // magic + sizeof(errorLogData), // len + errorLogData, // base + 0, // startCount + 0, // writeOffset +}; + +static void __commonErrorHandler(s16 code, s16 numArgs, ...); +OSErrorHandler __osCommonHandler = __commonErrorHandler; + +char NULSTR[] = ""; + +const char* __os_error_message[] = { + NULSTR, + "osCreateThread: stack pointer not aligned to 8 bytes (0x%x)", + "osCreateThread: priority not in range [0-255] (%d)", + "osStartThread: thread has bad state (running/runnable/other)", + "osSetThreadPri: priority not in range [0-255] (%d)", + "osCreateMesgQueue: message count not > 0 (%d)", + "osSendMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osJamMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osRecvMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osSetEventMesg: unknown event type (%d)", + "osMapTLB: index not in range [0-30] (%d)", + "osMapTLB: asid argument not -1 or in range [0-255] (%d)", + "osUnmapTLB: index not in range [0-30] (%d)", + "osSetTLBASID: asid not in range [0-255] (%d)", + "osAiSetFrequency: freq not in range [%d-%d] (%d)", + "osAiSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osAiSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osPiRawReadIo: address not aligned to 4 bytes (0x%x)", + "osPiRawWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiRawStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiRawStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiRawStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiRawStartDma: size not aligned to 2 bytes (%d)", + "osPiRawStartDma: size not in range [0,16777216] (%d)", + "osPiReadIo: address not aligned to 4 bytes (0x%x)", + "osPiWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiStartDma: PI Manager not yet begun by osCreatePiManager", + "osPiStartDma: priority not OS_MESG_PRI_[NORMAL|HIGH] (%d)", + "osPiStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiStartDma: size not aligned to 2 bytes (%d)", + "osPiStartDma: size not in range [0,16777216] (%d)", + "osCreatePiManager: priority not in range [0-255] (%d)", + "osViGetCurrentMode: VI Manager not yet begun", + "osViGetCurrentFramebuffer: VI Manager not yet begun", + "osViGetNextFramebuffer: VI Manager not yet begun", + "osViSetXScale: value not in range [0.25,1.0] (%f)", + "osViSetXScale: VI Manager not yet begun by osCreateViManager", + "osViSetYScale: value not in range [0.05,1.0] (%f)", + "osViSetYScale: VI Manager not yet begun by osCreateViManager", + "osViSetSpecialFeatures: not a known feature value (%d)", + "osViSetSpecialFeatures: VI Manager not yet begun", + "osViSetMode: VI Manager not yet begun by osCreateViManager", + "osViSetEvent: VI Manager not yet begun by osCreateViManager", + "osViSwapBuffer: frame buffer not aligned to 64 bytes (0x%x)", + "osViSwapBuffer: VI Manager not yet begun", + "osCreateViManager: priority not in range [0-255] (%d)", + "osCreateRegion: not a known alignment (%d)", + "osCreateRegion: length (%d) too small for buffer size (%d)", + "osMalloc: invalid or corrupt region (0x%x)", + "osFree: invalid or corrupt region (0x%x)", + "osFree: invalid address (0x%x) or\n corrupt region (0x%x)", + "osGetRegionBufCount: invalid or corrupt region (0x%x)", + "osGetRegionBufSize: invalid or corrupt region (0x%x)", + "osSpTaskLoad: dram_stack not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff_size not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: yield_data_ptr not aligned to 16 bytes (0x%x)", + "osProfileInit: profile counter is running, call osProfileStop before init", + "osProfileInit: profcnt is %d", + "osProfileInit: histo_base pointer must be 32-bit aligned (%x)", + "osProfileInit: text_start (%x) >= text_end (%x)", + "osProfileInit: histo_size is an illegal size (%d)", + "osProfileStart: microseconds is < PROF_MIN_INTERVAL (%d)", + "osProfileStart: profiling has already been started", + "osProfileStop: profiling has already been stopped", + "osProfileStop: no profile timer to stop", + "osReadHost: address not aligned to 8 bytes (0x%x)", + "osReadHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osWriteHost: address not aligned to 8 bytes (0x%x)", + "osWriteHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osGetTime: VI manager not yet begun by osCreateViManager", + "osSetTime: VI manager not yet begun by osCreateViManager", + "osSetTimer: VI manager not yet begun by osCreateViManager", + "osStopTimer: VI manager not yet begun by osCreateViManager", + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + "_handleMIDIMsg: no sound mapped", + "_handleMIDIMsg: no free voices", + "_handleMIDIMsg: couldn't map voice", + "_handleMIDIMsg: note off - couldn't find voice", + "_handleMIDIMsg: poly pressure - couldn't find voice", + "_handleEvent: no free voices", + "Synthesizer: no free updates", + "alSndPDeallocate: attempt to deallocate a sound which is playing", + "alSndpDelete: attempt to delete player with playing sounds", + "alSndpPlay: attempt to play a sound which is playing", + "alSndpSetSound: sound id (%d) out of range (0 - %d)", + "alSndpSetPriority: sound id (%d) out of range (0 - %d)", + "alSndpSet Parameter: target (%d) out of range (0 - %d)", + "alBnkfNew: bank file out of date", + "alSeqNew: 0x%x is not a midi file", + "alSeqNew: 0x%x is not a type 0 midi file", + "alSeqNew: 0x%x has more than 1 track", + "alSeqNew: SMPTE delta times not supported", + "alSeqNew: Error parsing file 0x%x (no track header)", + "alSeqNextEvent: Unsupported system exclusive", + "alSeqNextEvent: Unsupported midi meta event 0x%x", + "_handleMIDIMsg: Invalid program change to %d, max instruments %d", + "_handleMIDIMsg: Unknown midi message 0x%x", + "_unmapVoice: Couldn't unmap voice 0x%x", + "alEvtqPostEvent: Out of free events", + "alHeapAlloc: Can't allocate %d bytes", + "alHeapCheck: Heap corrupt", + "alHeapCheck: Heap corrupt - first block is bad", + "alCSeqGetTrackEvent: Running status of zero on track %d", + "alCSeqGetTrackEvent: Note on velocity of zero on track %d", + "alCSPVoiceHandler: Stopping sequence but voice not free chan %d, key %d", + "alSeqNextEvent: Read past end of sequence", + "osAiSetNextBuffer: DMA buffer location may cause audio clicks (0x%x)", + "_loadOutputBuffer: Modulated delay greater than total delay by %d samples", + "osViExtendVStart: VI Manager not yet begun by osCreateViManager", + "osViExtendVStart: value not in range [0-48] %d", + "osThreadProfileStart: thread profiler is not initialized", + "osThreadProfileStart: profiling has already been started", + "osThreadProfileStop: thread profiler is not initialized", + "osThreadProfileReadCount: thread profiler is not initialized", + "osThreadProfileReadCountTh: thread profiler is not initialized", + "osThreadProfileReadTime: thread profiler is not initialized", + "osThreadProfileReadTimeTh: thread profiler is not initialized", + "osThreadProfileReadCount: thread ID is too large(%d)", + "osThreadProfileReadTime: thread ID is too large(%d)", + "osThreadProfileReadCountTh: thread ID is too large(%d)", + "osThreadProfileReadTimeTh: thread ID is too large(%d)", + "osThreadProfileStop: current thread ID is too large(%d)", + NULSTR, +}; + +void __commonErrorHandler(s16 code, s16 numArgs, ...) { + va_list argPtr; + const char* fmt; + + fmt = __os_error_message[code]; + va_start(argPtr, numArgs); + + osSyncPrintf("0x%08X (%04d):", osGetCount(), code); + __osSyncVPrintf(fmt, argPtr); + osSyncPrintf("\n"); + + va_end(argPtr); +} + +#endif diff --git a/lib/hackerlibultra/src/error/error.c b/lib/hackerlibultra/src/error/error.c new file mode 100644 index 00000000..f4b5e8de --- /dev/null +++ b/lib/hackerlibultra/src/error/error.c @@ -0,0 +1,30 @@ +// This file was removed in 2.0J +#include "stdarg.h" +#include "PR/os_internal.h" +#include "PR/ultralog.h" +#include "PR/ultraerror.h" +#include "PRinternal/macros.h" + +void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr); +static void __osDefaultHandler(s16 code, s16 numArgs, ...); + +static u32 errorLogData[19] ALIGNED(0x8); +static OSLog errorLog ALIGNED(0x8) = { + OS_ERROR_MAGIC, // magic + sizeof(errorLogData), // len + errorLogData, // base + 0, // startCount + 0, // writeOffset +}; + +OSErrorHandler __osErrorHandler = __osDefaultHandler; + +static void __osDefaultHandler(s16 code, s16 numArgs, ...) { + va_list argPtr; + va_start(argPtr, numArgs); + + __osLogWrite(&errorLog, code, numArgs, argPtr); + osFlushLog(&errorLog); + + va_end(argPtr); +} diff --git a/lib/hackerlibultra/src/error/errorasm.s b/lib/hackerlibultra/src/error/errorasm.s new file mode 100644 index 00000000..c41cf6d4 --- /dev/null +++ b/lib/hackerlibultra/src/error/errorasm.s @@ -0,0 +1,33 @@ +#include "PR/os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/os_version.h" + +LEAF(__osError) +#if BUILD_VERSION < VERSION_J + lw t0, __osErrorHandler + beqz t0, 1f + jr t0 +#elif BUILD_VERSION < VERSION_K + lw t0, __kmc_pt_mode + bnez t0, _kmc_mode + + lw t0, __osErrorHandler + beqz t0, 1f + jr t0 +_kmc_mode: + lw t0, __kmcErrorHandler + beqz t0, 1f + jr t0 +#else + lw t0, __osCommonHandler + beqz t0, 1f + jr t0 +#endif +1: + j ra +END(__osError) + +#endif diff --git a/lib/hackerlibultra/src/error/kmcprintf.c b/lib/hackerlibultra/src/error/kmcprintf.c new file mode 100644 index 00000000..3d9f5364 --- /dev/null +++ b/lib/hackerlibultra/src/error/kmcprintf.c @@ -0,0 +1,246 @@ +// This file was added in 2.0J and removed in 2.0K +#include "stdarg.h" +#include "PR/os.h" +#include "PR/rcp.h" +#include "PR/rdb.h" +#include "ultraerror.h" +#include "../libc/xstdio.h" + +extern u32 __kmc_pt_mode; + +static void* proutSyncPrintf(void* str, const char* buf, size_t n) { + size_t sent = 0; + + while (sent < n) { + sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT); + } + return 1; +} + +static volatile unsigned int* stat = (unsigned*)0xbff08004; +static volatile unsigned int* wport = (unsigned*)0xbff08000; +static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG); + +static void rmonPutchar(char c) { + while (*piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + } + + while (!(*stat & 4)) { + } + + *wport = c; +} + +static void* kmc_proutSyncPrintf(void* str, const char* buf, int n) { + int i; + char c; + char* p; + char* q; + char xbuf[128]; + static int column = 0; + + p = &xbuf; + + for (i = 0; i < n; i++) { + c = *buf++; + + switch (c) { + case '\n': + *p++ = '\n'; + column = 0; + break; + case '\t': + do { + *p++ = ' '; + } while (++column % 8); + break; + default: + column++; + *p++ = c; + break; + } + + if (c == '\n' || (p - xbuf) > 100) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + p = xbuf; + } + } + if (p != xbuf) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + } + return (void*)1; +} + +char NULSTR[] = ""; + +const char* __os_error_message[] = { + NULSTR, + "osCreateThread: stack pointer not aligned to 8 bytes (0x%x)", + "osCreateThread: priority not in range [0-255] (%d)", + "osStartThread: thread has bad state (running/runnable/other)", + "osSetThreadPri: priority not in range [0-255] (%d)", + "osCreateMesgQueue: message count not > 0 (%d)", + "osSendMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osJamMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osRecvMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osSetEventMesg: unknown event type (%d)", + "osMapTLB: index not in range [0-30] (%d)", + "osMapTLB: asid argument not -1 or in range [0-255] (%d)", + "osUnmapTLB: index not in range [0-30] (%d)", + "osSetTLBASID: asid not in range [0-255] (%d)", + "osAiSetFrequency: freq not in range [%d-%d] (%d)", + "osAiSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osAiSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osPiRawReadIo: address not aligned to 4 bytes (0x%x)", + "osPiRawWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiRawStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiRawStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiRawStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiRawStartDma: size not aligned to 2 bytes (%d)", + "osPiRawStartDma: size not in range [0,16777216] (%d)", + "osPiReadIo: address not aligned to 4 bytes (0x%x)", + "osPiWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiStartDma: PI Manager not yet begun by osCreatePiManager", + "osPiStartDma: priority not OS_MESG_PRI_[NORMAL|HIGH] (%d)", + "osPiStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiStartDma: size not aligned to 2 bytes (%d)", + "osPiStartDma: size not in range [0,16777216] (%d)", + "osCreatePiManager: priority not in range [0-255] (%d)", + "osViGetCurrentMode: VI Manager not yet begun", + "osViGetCurrentFramebuffer: VI Manager not yet begun", + "osViGetNextFramebuffer: VI Manager not yet begun", + "osViSetXScale: value not in range [0.25,1.0] (%f)", + "osViSetXScale: VI Manager not yet begun by osCreateViManager", + "osViSetYScale: value not in range [0.05,1.0] (%f)", + "osViSetYScale: VI Manager not yet begun by osCreateViManager", + "osViSetSpecialFeatures: not a known feature value (%d)", + "osViSetSpecialFeatures: VI Manager not yet begun", + "osViSetMode: VI Manager not yet begun by osCreateViManager", + "osViSetEvent: VI Manager not yet begun by osCreateViManager", + "osViSwapBuffer: frame buffer not aligned to 64 bytes (0x%x)", + "osViSwapBuffer: VI Manager not yet begun", + "osCreateViManager: priority not in range [0-255] (%d)", + "osCreateRegion: not a known alignment (%d)", + "osCreateRegion: length (%d) too small for buffer size (%d)", + "osMalloc: invalid or corrupt region (0x%x)", + "osFree: invalid or corrupt region (0x%x)", + "osFree: invalid address (0x%x) or\n corrupt region (0x%x)", + "osGetRegionBufCount: invalid or corrupt region (0x%x)", + "osGetRegionBufSize: invalid or corrupt region (0x%x)", + "osSpTaskLoad: dram_stack not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff_size not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: yield_data_ptr not aligned to 16 bytes (0x%x)", + "osProfileInit: profile counter is running, call osProfileStop before init", + "osProfileInit: profcnt is %d", + "osProfileInit: histo_base pointer must be 32-bit aligned (%x)", + "osProfileInit: text_start (%x) >= text_end (%x)", + "osProfileInit: histo_size is an illegal size (%d)", + "osProfileStart: microseconds is < PROF_MIN_INTERVAL (%d)", + "osProfileStart: profiling has already been started", + "osProfileStop: profiling has already been stopped", + "osProfileStop: no profile timer to stop", + "osReadHost: address not aligned to 8 bytes (0x%x)", + "osReadHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osWriteHost: address not aligned to 8 bytes (0x%x)", + "osWriteHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osGetTime: VI manager not yet begun by osCreateViManager", + "osSetTime: VI manager not yet begun by osCreateViManager", + "osSetTimer: VI manager not yet begun by osCreateViManager", + "osStopTimer: VI manager not yet begun by osCreateViManager", + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + "_handleMIDIMsg: no sound mapped", + "_handleMIDIMsg: no free voices", + "_handleMIDIMsg: couldn't map voice", + "_handleMIDIMsg: note off - couldn't find voice", + "_handleMIDIMsg: poly pressure - couldn't find voice", + "_handleEvent: no free voices", + "Synthesizer: no free updates", + "alSndPDeallocate: attempt to deallocate a sound which is playing", + "alSndpDelete: attempt to delete player with playing sounds", + "alSndpPlay: attempt to play a sound which is playing", + "alSndpSetSound: sound id (%d) out of range (0 - %d)", + "alSndpSetPriority: sound id (%d) out of range (0 - %d)", + "alSndpSet Parameter: target (%d) out of range (0 - %d)", + "alBnkfNew: bank file out of date", + "alSeqNew: 0x%x is not a midi file", + "alSeqNew: 0x%x is not a type 0 midi file", + "alSeqNew: 0x%x has more than 1 track", + "alSeqNew: SMPTE delta times not supported", + "alSeqNew: Error parsing file 0x%x (no track header)", + "alSeqNextEvent: Unsupported system exclusive", + "alSeqNextEvent: Unsupported midi meta event 0x%x", + "_handleMIDIMsg: Invalid program change to %d, max instruments %d", + "_handleMIDIMsg: Unknown midi message 0x%x", + "_unmapVoice: Couldn't unmap voice 0x%x", + "alEvtqPostEvent: Out of free events", + "alHeapAlloc: Can't allocate %d bytes", + "alHeapCheck: Heap corrupt", + "alHeapCheck: Heap corrupt - first block is bad", + "alCSeqGetTrackEvent: Running status of zero on track %d", + "alCSeqGetTrackEvent: Note on velocity of zero on track %d", + "alCSPVoiceHandler: Stopping sequence but voice not free chan %d, key %d", + "alSeqNextEvent: Read past end of sequence", + "osAiSetNextBuffer: DMA buffer location may cause audio clicks (0x%x)", + "_loadOutputBuffer: Modulated delay greater than total delay by %d samples", + "osViExtendVStart: VI Manager not yet begun by osCreateViManager", + "osViExtendVStart: value not in range [0-48] %d", + NULSTR, +}; + +static void kmcErrorHandler(s16 code, s16 numArgs, ...); +OSErrorHandler __kmcErrorHandler = kmcErrorHandler; + +static void kmcErrorHandler(s16 code, s16 numArgs, ...) { + int ans; + va_list ap; + char* fmt; + + fmt = __os_error_message[code]; + va_start(ap, numArgs); + + if (__kmc_pt_mode) { + ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap); + } else { + ans = _Printf(proutSyncPrintf, NULL, fmt, ap); + } + + osSyncPrintf("\n"); + + va_end(ap); +} diff --git a/lib/hackerlibultra/src/flash/flashallerase.c b/lib/hackerlibultra/src/flash/flashallerase.c new file mode 100644 index 00000000..7fb88893 --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashallerase.c @@ -0,0 +1,32 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashAllErase(void) { + u32 status; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + OSMesg dummy; + + // start chip erase operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); + + // wait for completion by polling erase-busy flag + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + do { + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(15000), 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + } while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY); + + // check erase operation status, clear status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + osFlashClearStatus(); + + // check for success + if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) { + return FLASH_STATUS_ERASE_OK; + } else { + return FLASH_STATUS_ERASE_ERROR; + } +} diff --git a/lib/hackerlibultra/src/flash/flashallerasethrough.c b/lib/hackerlibultra/src/flash/flashallerasethrough.c new file mode 100644 index 00000000..1c3c1ddd --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashallerasethrough.c @@ -0,0 +1,8 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashAllEraseThrough(void) { + // start chip erase operation, no waiting for completion + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_CHIP_ERASE); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); +} diff --git a/lib/hackerlibultra/src/flash/flashchange.c b/lib/hackerlibultra/src/flash/flashchange.c new file mode 100644 index 00000000..d92ff7bf --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashchange.c @@ -0,0 +1,8 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashChange(u32 flash_num) { + __osFlashHandler.baseAddress = PHYS_TO_K1((FLASH_START_ADDR + flash_num * FLASH_SIZE)); + __osFlashHandler.type = DEVICE_TYPE_FLASH + flash_num; + return; +} diff --git a/lib/hackerlibultra/src/flash/flashcheckeraseend.c b/lib/hackerlibultra/src/flash/flashcheckeraseend.c new file mode 100644 index 00000000..c87876b0 --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashcheckeraseend.c @@ -0,0 +1,23 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashCheckEraseEnd(void) { + u8 status; + + osFlashReadStatus(&status); + + if ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY) { + return FLASH_STATUS_ERASE_BUSY; + } else { + // not busy, read and clear status + osFlashReadStatus(&status); + } + osFlashClearStatus(); + + // check for success + if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) { + return FLASH_STATUS_ERASE_OK; + } else { + return FLASH_STATUS_ERASE_ERROR; + } +} diff --git a/lib/hackerlibultra/src/flash/flashclearstatus.c b/lib/hackerlibultra/src/flash/flashclearstatus.c new file mode 100644 index 00000000..86165d66 --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashclearstatus.c @@ -0,0 +1,10 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashClearStatus(void) { + // select status mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS); + // clear status + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress, 0); + return; +} diff --git a/lib/hackerlibultra/src/flash/flashgetaddr.c b/lib/hackerlibultra/src/flash/flashgetaddr.c new file mode 100644 index 00000000..190f106a --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashgetaddr.c @@ -0,0 +1,16 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +u32 __osFlashGetAddr(u32 page_num) { + u32 devAddr; + + if (__osFlashVersion == OLD_FLASH) { + // Account for hardware bug in old flash where the address bits are shifted 1-off where they + // should be + devAddr = page_num * (FLASH_BLOCK_SIZE >> 1); + } else { + devAddr = page_num * FLASH_BLOCK_SIZE; + } + + return devAddr; +} diff --git a/lib/hackerlibultra/src/flash/flashinit.c b/lib/hackerlibultra/src/flash/flashinit.c new file mode 100644 index 00000000..3fe5bf20 --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashinit.c @@ -0,0 +1,44 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" +#include "PRinternal/macros.h" + +u32 __osFlashID[4] ALIGNED(0x8); +OSIoMesg __osFlashMsg ALIGNED(0x8); +OSMesgQueue __osFlashMessageQ ALIGNED(0x8); +OSPiHandle __osFlashHandler ALIGNED(0x8); +OSMesg __osFlashMsgBuf[1]; +s32 __osFlashVersion; + +OSPiHandle* osFlashInit(void) { + u32 flash_type; + u32 flash_maker; + + osCreateMesgQueue(&__osFlashMessageQ, __osFlashMsgBuf, ARRLEN(__osFlashMsgBuf)); + + if (__osFlashHandler.baseAddress == PHYS_TO_K1(FLASH_START_ADDR)) { + return &__osFlashHandler; + } + + __osFlashHandler.type = DEVICE_TYPE_FLASH; + __osFlashHandler.baseAddress = PHYS_TO_K1(FLASH_START_ADDR); + __osFlashHandler.latency = FLASH_LATENCY; + __osFlashHandler.pulse = FLASH_PULSE; + __osFlashHandler.pageSize = FLASH_PAGE_SIZE; + __osFlashHandler.relDuration = FLASH_REL_DURATION; + __osFlashHandler.domain = PI_DOMAIN2; + __osFlashHandler.speed = 0; + + bzero(&__osFlashHandler.transferInfo, sizeof(__OSTranxInfo)); + + osEPiLinkHandle(&__osFlashHandler); + osFlashReadId(&flash_type, &flash_maker); + + if (flash_maker == FLASH_VERSION_MX_C || flash_maker == FLASH_VERSION_MX_A + || flash_maker == FLASH_VERSION_MX_PROTO_A) { + __osFlashVersion = OLD_FLASH; + } else { + __osFlashVersion = NEW_FLASH; + } + + return &__osFlashHandler; +} diff --git a/lib/hackerlibultra/src/flash/flashreadarray.c b/lib/hackerlibultra/src/flash/flashreadarray.c new file mode 100644 index 00000000..e101143b --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashreadarray.c @@ -0,0 +1,50 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashReadArray(OSIoMesg* mb, s32 priority, u32 page_num, void* dramAddr, u32 n_pages, OSMesgQueue* mq) { + u32 ret; + u32 tmp; + u32 end_page; + u32 one_dma_pages; + + // select read array mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_READ_ARRAY); + // dummy read? + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &tmp); + + // DMA requested pages + mb->hdr.pri = priority; + mb->hdr.retQueue = mq; + mb->dramAddr = dramAddr; + + end_page = page_num + n_pages - 1; + + if ((end_page & 0xF00) != (page_num & 0xF00)) { + one_dma_pages = 256 - (page_num & 0xFF); + n_pages -= one_dma_pages; + mb->size = one_dma_pages * FLASH_BLOCK_SIZE; + mb->devAddr = __osFlashGetAddr(page_num); + osEPiStartDma(&__osFlashHandler, mb, OS_READ); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + page_num = (page_num + 256) & 0xF00; + mb->dramAddr = (u32)mb->dramAddr + mb->size; + } + + while (n_pages > 256) { + one_dma_pages = 256; + n_pages -= 256; + mb->size = one_dma_pages * FLASH_BLOCK_SIZE; + mb->devAddr = __osFlashGetAddr(page_num); + osEPiStartDma(&__osFlashHandler, mb, OS_READ); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + page_num += 256; + mb->dramAddr = (u32)mb->dramAddr + mb->size; + } + + mb->size = n_pages * FLASH_BLOCK_SIZE; + mb->devAddr = __osFlashGetAddr(page_num); + + ret = osEPiStartDma(&__osFlashHandler, mb, OS_READ); + + return ret; +} diff --git a/lib/hackerlibultra/src/flash/flashreadid.c b/lib/hackerlibultra/src/flash/flashreadid.c new file mode 100644 index 00000000..3112d746 --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashreadid.c @@ -0,0 +1,27 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashReadId(u32* flash_type, u32* flash_maker) { + u8 tmp; + + // why read status ? + osFlashReadStatus(&tmp); + + // select silicon id read mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_ID); + + // read silicon id using DMA + __osFlashMsg.hdr.pri = OS_MESG_PRI_NORMAL; + __osFlashMsg.hdr.retQueue = &__osFlashMessageQ; + __osFlashMsg.dramAddr = __osFlashID; + __osFlashMsg.devAddr = 0; + __osFlashMsg.size = 2 * sizeof(u32); + + osInvalDCache(__osFlashID, sizeof(__osFlashID)); + osEPiStartDma(&__osFlashHandler, &__osFlashMsg, OS_READ); + osRecvMesg(&__osFlashMessageQ, NULL, OS_MESG_BLOCK); + + *flash_type = __osFlashID[0]; + *flash_maker = __osFlashID[1]; + return; +} diff --git a/lib/hackerlibultra/src/flash/flashreadstatus.c b/lib/hackerlibultra/src/flash/flashreadstatus.c new file mode 100644 index 00000000..6ff5560b --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashreadstatus.c @@ -0,0 +1,17 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashReadStatus(u8* flash_status) { + u32 status; + + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS); + // read status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + + // why twice ? + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_STATUS); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + + *flash_status = status & 0xFF; + return; +} diff --git a/lib/hackerlibultra/src/flash/flashreinit.c b/lib/hackerlibultra/src/flash/flashreinit.c new file mode 100644 index 00000000..b2ab93da --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashreinit.c @@ -0,0 +1,14 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +OSPiHandle* osFlashReInit(u8 latency, u8 pulse, u8 page_size, u8 rel_duration, u32 start) { + __osFlashHandler.baseAddress = PHYS_TO_K1(start); + __osFlashHandler.type++; + __osFlashHandler.latency = latency; + __osFlashHandler.pulse = pulse; + __osFlashHandler.pageSize = page_size; + __osFlashHandler.relDuration = rel_duration; + __osFlashHandler.domain = PI_DOMAIN2; + + return &__osFlashHandler; +} diff --git a/lib/hackerlibultra/src/flash/flashsectorerase.c b/lib/hackerlibultra/src/flash/flashsectorerase.c new file mode 100644 index 00000000..14a0583b --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashsectorerase.c @@ -0,0 +1,32 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashSectorErase(u32 page_num) { + u32 status; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + OSMesg dummy; + + // start sector erase operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_SECTOR_ERASE | page_num); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); + + // wait for completion by polling erase-busy flag + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + + do { + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(12500), 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + } while ((status & FLASH_STATUS_ERASE_BUSY) == FLASH_STATUS_ERASE_BUSY); + + // check erase operation status, clear status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + osFlashClearStatus(); + + if (((status & 0xFF) == 8) || ((status & 0xFF) == 0x48) || ((status & 8) == 8)) { + return FLASH_STATUS_ERASE_OK; + } else { + return FLASH_STATUS_ERASE_ERROR; + } +} diff --git a/lib/hackerlibultra/src/flash/flashsectorerasethrough.c b/lib/hackerlibultra/src/flash/flashsectorerasethrough.c new file mode 100644 index 00000000..474ee96f --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashsectorerasethrough.c @@ -0,0 +1,8 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +void osFlashSectorEraseThrough(u32 page_num) { + // start sector erase operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_SECTOR_ERASE | page_num); + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_EXECUTE_ERASE); +} diff --git a/lib/hackerlibultra/src/flash/flashwritearray.c b/lib/hackerlibultra/src/flash/flashwritearray.c new file mode 100644 index 00000000..d5f56a0c --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashwritearray.c @@ -0,0 +1,34 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashWriteArray(u32 page_num) { + u32 status; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + OSMesg dummy; + + if ((u32)__osFlashVersion == NEW_FLASH) { + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PAGE_PROGRAM); + } + + // start program page operation + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PROGRAM_PAGE | page_num); + + // wait for completion by polling write-busy flag + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + do { + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(200), 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + } while ((status & FLASH_STATUS_WRITE_BUSY) == FLASH_STATUS_WRITE_BUSY); + + // check program operation status, clear status + osEPiReadIo(&__osFlashHandler, __osFlashHandler.baseAddress, &status); + osFlashClearStatus(); + + if (((status & 0xFF) == 4) || ((status & 0xFF) == 0x44) || ((status & 4) == 4)) { + return FLASH_STATUS_WRITE_OK; + } else { + return FLASH_STATUS_WRITE_ERROR; + } +} diff --git a/lib/hackerlibultra/src/flash/flashwritebuffer.c b/lib/hackerlibultra/src/flash/flashwritebuffer.c new file mode 100644 index 00000000..ad3f790a --- /dev/null +++ b/lib/hackerlibultra/src/flash/flashwritebuffer.c @@ -0,0 +1,20 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" + +s32 osFlashWriteBuffer(OSIoMesg* mb, s32 priority, void* dramAddr, OSMesgQueue* mq) { + s32 ret; + + // select page program mode + osEPiWriteIo(&__osFlashHandler, __osFlashHandler.baseAddress | FLASH_CMD_REG, FLASH_CMD_PAGE_PROGRAM); + + // DMA 128-byte page + mb->hdr.pri = priority; + mb->hdr.retQueue = mq; + mb->dramAddr = dramAddr; + mb->devAddr = 0; + mb->size = FLASH_BLOCK_SIZE; + + ret = osEPiStartDma(&__osFlashHandler, mb, OS_WRITE); + + return ret; +} diff --git a/lib/hackerlibultra/src/gio/giointerrupt.c b/lib/hackerlibultra/src/gio/giointerrupt.c new file mode 100644 index 00000000..121c5d8e --- /dev/null +++ b/lib/hackerlibultra/src/gio/giointerrupt.c @@ -0,0 +1,8 @@ +#include "PR/os_internal.h" +#include "PRinternal/piint.h" + +void __osGIOInterrupt(s32 value) { + __osPiGetAccess(); + __osGIORawInterrupt(value); + __osPiRelAccess(); +} diff --git a/lib/hackerlibultra/src/gio/giorawinterrupt.c b/lib/hackerlibultra/src/gio/giorawinterrupt.c new file mode 100644 index 00000000..e36f5ded --- /dev/null +++ b/lib/hackerlibultra/src/gio/giorawinterrupt.c @@ -0,0 +1,13 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/piint.h" + +void __osGIORawInterrupt(s32 value) { + register u32 stat; + + WAIT_ON_IOBUSY(stat); + + IO_WRITE(GIO_GIO_INTR_REG, value); + + WAIT_ON_IOBUSY(stat); +} diff --git a/lib/hackerlibultra/src/gt/Makefile b/lib/hackerlibultra/src/gt/Makefile new file mode 100644 index 00000000..b0868fdd --- /dev/null +++ b/lib/hackerlibultra/src/gt/Makefile @@ -0,0 +1,19 @@ +#!smake +# +# Makefile for the gt subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 + +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = dumpturbo.c gt.c + +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/hackerlibultra/src/gt/dumpturbo.c b/lib/hackerlibultra/src/gt/dumpturbo.c new file mode 100644 index 00000000..53c292d2 --- /dev/null +++ b/lib/hackerlibultra/src/gt/dumpturbo.c @@ -0,0 +1,226 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ + +/* + * Interpret & dump a turbo display list for RSPSIM debugging + * + */ + +#include +#include +#include "PRinternal/macros.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 1.4 $" +#endif + +#undef PRINTF +#define PRINTF rmonPrintf + +#define TX_MAX 100 +static u32 textures[TX_MAX] ALIGNED(0x8); +static u32 numtextures; + +#define UNSEG_ADDR(sa) \ + ((u32*)(((globp) ? (((int)(sa) & 0x00ffffff) + globp->sp.segBases[(int)(sa) >> 24]) : (int)(sa)) | 0x80000000)) +#define PHYS(a) ((int)((int)(a) & 0x7fffffff)) +#define UNPHYS(a) ((u32*)((int)(a) | 0x80000000)) + +#define DOPRINT(a, r) \ + rmonPrintf("UNSEG: %x ->(seg%x = %06x)-> %08x\n", (int)(a), (int)(a) >> 24, \ + ((globp) ? (globp->sp.segBases[(int)(a) >> 24]) : 0), (int)(r)) + +#define UCODE_SIZE_MAX (4096 * 1) +void gtDumpTurbo(OSTask* tp, u8 flags) { + int i; + gtGfx* gtlistp; + gtGlobState* globp = 0; + gtState* statep; + u32 dat, *datp, *addr; + + PRINTF("\nGBI_DUMP_START:\n"); + PRINTF("$ %08x\n", PHYS(tp)); + + for (i = (int)tp; i < (int)tp + sizeof(OSTask); i += 4) { + PRINTF("<%08x\n", (int)*((u32*)i)); + } + +#if 1 + PRINTF("? %08x\n", PHYS(tp->t.ucode_boot)); + for (i = (int)tp->t.ucode_boot; i < (int)tp->t.ucode_boot + tp->t.ucode_boot_size; i += 4) { + PRINTF("|%08x\n", (int)*((u32*)i)); + } + + PRINTF("? %08x\n", PHYS(tp->t.ucode)); + for (i = (int)tp->t.ucode; i < (int)tp->t.ucode + UCODE_SIZE_MAX; i += 4) { + PRINTF("|%08x\n", (int)*((u32*)i)); + } + + PRINTF("? %08x\n", PHYS(tp->t.ucode_data)); + for (i = (int)tp->t.ucode_data; i < (int)tp->t.ucode_data + tp->t.ucode_data_size; i += 4) { + PRINTF("|%08x\n", (int)*((u32*)i)); + } + +#endif + + gtlistp = (gtGfx*)tp->t.data_ptr; + PRINTF("@ %08x\n", PHYS(gtlistp)); + + /* + * Dump turbo display list + */ + while (gtlistp->obj.statep) { + PRINTF(">%08x\n", (int)gtlistp->obj.gstatep); + PRINTF("-%08x\n", (int)gtlistp->obj.statep); + PRINTF("-%08x\n", (int)gtlistp->obj.vtxp); + PRINTF("-%08x\n", (int)gtlistp->obj.trip); + gtlistp++; + } + PRINTF(">%08x\n", (int)gtlistp->obj.gstatep); + PRINTF("-%08x\n", (int)gtlistp->obj.statep); + PRINTF("-%08x\n", (int)gtlistp->obj.vtxp); + PRINTF("-%08x\n", (int)gtlistp->obj.trip); + + /* + * Dump infor pointed to by DL + */ + gtlistp = (gtGfx*)tp->t.data_ptr; + while (gtlistp->obj.statep) { + /*rmonPrintf("=============== DUMP A DL ENTRY (%x)\n",(int)gtlistp);*/ + + /* + * Dump global state + */ + if (gtlistp->obj.gstatep) { + addr = UNSEG_ADDR(gtlistp->obj.gstatep); + globp = (gtGlobState*)addr; + /*rmonPrintf("======= DUMP GlobalState (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = addr; (u8*)datp < (u8*)addr + sizeof(gtGlobState); datp++) { + PRINTF("+%08x\n", *datp); + } + if (globp->sp.rdpCmds) { + addr = UNSEG_ADDR(globp->sp.rdpCmds); + /*rmonPrintf("GlobalState RDP cmds (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = addr; *datp || *(datp + 1); datp += 2) { + PRINTF("+%08x\n", *datp); + PRINTF("+%08x\n", *(datp + 1)); + } + PRINTF("+%08x\n", *datp); + PRINTF("+%08x\n", *(datp + 1)); + } + } + + /* + * Dump state + */ + addr = UNSEG_ADDR(gtlistp->obj.statep); + statep = (gtState*)addr; + /*rmonPrintf("======= DUMP State (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = addr; (u8*)datp < (u8*)addr + sizeof(gtState); datp++) { + PRINTF("+%08x\n", *datp); + } + if (statep->sp.rdpCmds) { + addr = UNSEG_ADDR(statep->sp.rdpCmds); + /*rmonPrintf("DUMP State RDP cmds (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = addr; *datp || *(datp + 1); datp += 2) { + PRINTF("+%08x\n", *datp); + PRINTF("+%08x\n", *(datp + 1)); + } + PRINTF("+%08x\n", *datp); + PRINTF("+%08x\n", *(datp + 1)); + } + + /* + * Dump vertices + */ + if (gtlistp->obj.vtxp) { + addr = UNSEG_ADDR(gtlistp->obj.vtxp); + /*rmonPrintf("======= DUMP VTX (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = (u32*)addr; (u8*)datp < (u8*)addr + (statep->sp.vtxCount * sizeof(Vtx)); datp++) { + PRINTF("+%08x\n", *datp); + } + } + + /* + * Dump triangles + */ + if (gtlistp->obj.trip) { + addr = UNSEG_ADDR(gtlistp->obj.trip); + /*rmonPrintf("======= DUMP TRI (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = (u32*)addr; (u8*)datp < (u8*)addr + (statep->sp.triCount * sizeof(gtTriN)); datp++) { + PRINTF("+%08x\n", *datp); + } + } + + gtlistp++; + } + + /* + * Dump Last global state + */ + if (gtlistp->obj.gstatep) { + addr = UNSEG_ADDR(gtlistp->obj.gstatep); + globp = (gtGlobState*)addr; + /*rmonPrintf("======= DUMP GlobalState (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = addr; (u8*)datp < (u8*)addr + sizeof(gtGlobState); datp++) { + PRINTF("+%08x\n", *datp); + } + if (globp->sp.rdpCmds) { + addr = UNSEG_ADDR(globp->sp.rdpCmds); + /*rmonPrintf("GlobalState RDP cmds (%x)\n",(int)addr);*/ + PRINTF("& %08x\n", PHYS(addr)); + for (datp = addr; *datp || *(datp + 1); datp += 2) { + PRINTF("+%08x\n", *datp); + PRINTF("+%08x\n", *(datp + 1)); + } + PRINTF("+%08x\n", *datp); + PRINTF("+%08x\n", *(datp + 1)); + } + } + + PRINTF("^\nGBI_DUMP_END:\n"); + + if (flags & GT_DUMPTURBO_HANGAFTER) { + for (i = 0; i < 1000; i++) + rmonPrintf("=======================================\n"); + while (1) + ; + } + + /* + * Dumps stuff + * each line is either an address for data to follow or data itself + * 1st char on line indicates what it is: + * + * $ task header address + * @ display list address + * & dma data address + * % texture address + * ? code/code data address + * + * < task header data + * > 1st half of display list command + * - 2nd half of display list command + * + dma data + * * texture data + * | code/code data + * + */ +} diff --git a/lib/hackerlibultra/src/gt/gt.c b/lib/hackerlibultra/src/gt/gt.c new file mode 100644 index 00000000..fc32ae6a --- /dev/null +++ b/lib/hackerlibultra/src/gt/gt.c @@ -0,0 +1,150 @@ + +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: gt.c + * Creator: hsa@sgi.com + * Create Date: Fri Oct 13 14:23:48 PDT 1995 + * + */ + +#include "gtint.h" + +/* + * Set the cached RDP othermode word in the gt state structure. + */ +void gtStateSetOthermode(Gfx* om, gtStateOthermode_t mode, int data) { + int shift, length; + u32 mask; + + if (mode == GT_CLEAR) { /* special case */ + om->words.w0 = (G_RDPSETOTHERMODE << 24); + om->words.w1 = 0x0; + } + + if (mode <= GT_RENDERMODE) { + /* these are OTHERMODE_L */ + switch (mode) { + + case GT_ALPHACOMPARE: + shift = G_MDSFT_ALPHACOMPARE; + length = 2; + break; + + case GT_ZSRCSEL: + shift = G_MDSFT_ZSRCSEL; + length = 1; + break; + + case GT_RENDERMODE: + shift = G_MDSFT_RENDERMODE; + length = 29; + break; + + default: + break; + } + + mask = (0x01 << length); + mask = mask - 1; + mask = (mask << shift); + mask = mask ^ 0xffffffff; + om->words.w1 &= mask; + om->words.w1 |= data; + + } else { + /* these are OTHERMODE_H */ + switch (mode) { + case GT_ALPHADITHER: + shift = G_MDSFT_ALPHADITHER; + length = 2; + break; + + case GT_RGBDITHER: + shift = G_MDSFT_RGBDITHER; + length = 2; + break; + + case GT_COMBKEY: + shift = G_MDSFT_COMBKEY; + length = 1; + break; + + case GT_TEXTCONV: + shift = G_MDSFT_TEXTCONV; + length = 3; + break; + + case GT_TEXTFILT: + shift = G_MDSFT_TEXTFILT; + length = 2; + break; + + case GT_TEXTLUT: + shift = G_MDSFT_TEXTLUT; + length = 2; + break; + + case GT_TEXTLOD: + shift = G_MDSFT_TEXTLOD; + length = 1; + break; + + case GT_TEXTDETAIL: + shift = G_MDSFT_TEXTDETAIL; + length = 2; + break; + + case GT_TEXTPERSP: + shift = G_MDSFT_TEXTPERSP; + length = 1; + break; + + case GT_CYCLETYPE: + shift = G_MDSFT_CYCLETYPE; + length = 2; + break; + + case GT_PIPELINE: + shift = G_MDSFT_PIPELINE; + length = 1; + break; + + default: + break; + } + + mask = (0x01 << length); + mask = mask - 1; + mask = (mask << shift); + mask = mask ^ 0xffffffff; + om->words.w0 &= mask; + om->words.w0 |= data; + } + + /* force cached othermode word to have proper command id: */ + om->words.w0 &= 0x00ffffff; + om->words.w0 |= (G_RDPSETOTHERMODE << 24); +} diff --git a/lib/hackerlibultra/src/gt/gtint.h b/lib/hackerlibultra/src/gt/gtint.h new file mode 100644 index 00000000..4434395f --- /dev/null +++ b/lib/hackerlibultra/src/gt/gtint.h @@ -0,0 +1,35 @@ + +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: gtint.h + * Creator: hsa@sgi.com + * Create Date: Fri Oct 13 14:24:36 PDT 1995 + * + */ + +#include "mbi.h" +#include "gu.h" +#include "gt.h" diff --git a/lib/hackerlibultra/src/gu/Makefile b/lib/hackerlibultra/src/gu/Makefile new file mode 100644 index 00000000..ad6e2faf --- /dev/null +++ b/lib/hackerlibultra/src/gu/Makefile @@ -0,0 +1,52 @@ +#!smake +# +# Makefile for the gu subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include +LCOPTS = -G 0 -g -O + +CFILES = \ + align.c \ + cosf.c \ + coss.c \ + frustum.c \ + guloadtile_bug.c \ + loadtextureblockmipmap.c\ + lookat.c \ + lookathil.c \ + lookatref.c \ + lookatstereo.c \ + mtxcatf.c \ + mtxcatl.c \ + mtxutil.c \ + normalize.c \ + ortho.c \ + perspective.c \ + position.c \ + poslight.c \ + poslighthil.c \ + random.c \ + rotate.c \ + rotaterpy.c \ + scale.c \ + sinf.c \ + sins.c \ + translate.c \ + us2dex.c \ + us2dex_emu.c \ + us2dex2_emu.c \ + usprite.c + +ASFILES = \ + libm_vals.s \ + sqrtf.s +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/hackerlibultra/src/gu/align.c b/lib/hackerlibultra/src/gu/align.c new file mode 100644 index 00000000..29e369e1 --- /dev/null +++ b/lib/hackerlibultra/src/gu/align.c @@ -0,0 +1,73 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* + * S = sin (a) + * C = cos (a) + * H = sqrt (X*X + Z*Z) + * + * [ v ] [ C S ] [ 1 ] [ -Z/H X/H ] + * [ -S C ] [ H Y ] [ 1 ] + * [ 1 ] [ -Y H ] [ -X/H -Z/H ] + * [ 1 ] [ 1 ] [ 1 ] + * + */ + +void guAlignF(float mf[4][4], float a, float x, float y, float z) { + static float dtor = 3.1415926 / 180.0; + float s, c, h, hinv; + + guNormalize(&x, &y, &z); + + a *= dtor; + s = sinf(a); + c = cosf(a); + h = sqrtf(x * x + z * z); + + guMtxIdentF(mf); + + if (h != 0) { + hinv = 1 / h; + + mf[0][0] = (-z * c - s * y * x) * hinv; + mf[1][0] = (z * s - c * y * x) * hinv; + mf[2][0] = -x; + mf[3][0] = 0; + + mf[0][1] = s * h; + mf[1][1] = c * h; + mf[2][1] = -y; + mf[3][1] = 0; + + mf[0][2] = (c * x - s * y * z) * hinv; + mf[1][2] = (-s * x - c * y * z) * hinv; + mf[2][2] = -z; + mf[3][2] = 0; + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; + } else { + /* XXX: should do this right */ + } +} + +void guAlign(Mtx* m, float a, float x, float y, float z) { + Matrix mf; + + guAlignF(mf, a, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/ultra/gu/cosf.c b/lib/hackerlibultra/src/gu/cosf.c similarity index 55% rename from lib/ultra/gu/cosf.c rename to lib/hackerlibultra/src/gu/cosf.c index 2f21d535..2ee6ba48 100644 --- a/lib/ultra/gu/cosf.c +++ b/lib/hackerlibultra/src/gu/cosf.c @@ -1,14 +1,13 @@ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" @@ -25,55 +24,55 @@ * Revision history: * 09-Jun-93 - Original Version * - * Description: source code for fcos function + * Description: source code for fcos function * * ==================================================================== * ==================================================================== */ +#pragma weak fcos = __cosf +#pragma weak cosf = __cosf +#define fcos __cosf + /* coefficients for polynomial approximation of cos on +/- pi/2 */ -static const du P[] = { -{{0x3ff00000, 0x00000000}}, -{{0xbfc55554, 0xbc83656d}}, -{{0x3f8110ed, 0x3804c2a0}}, -{{0xbf29f6ff, 0xeea56814}}, -{{0x3ec5dbdf, 0x0e314bfe}}, +static const du P[] = { + { 0x3ff00000, 0x00000000 }, { 0xbfc55554, 0xbc83656d }, { 0x3f8110ed, 0x3804c2a0 }, + { 0xbf29f6ff, 0xeea56814 }, { 0x3ec5dbdf, 0x0e314bfe }, }; -static const du rpi = { -{0x3fd45f30, 0x6dc9c883} -}; +static const du rpi = { 0x3fd45f30, 0x6dc9c883 }; -static const du pihi = { -{0x400921fb, 0x50000000} -}; +static const du pihi = { 0x400921fb, 0x50000000 }; -static const du pilo = { -{0x3e6110b4, 0x611a6263} -}; +static const du pilo = { 0x3e6110b4, 0x611a6263 }; -static const fu zero = {0x00000000}; +static const fu zero = { 0x00000000 }; -float cosf(float x) -{ -float absx; -double dx, xsq, poly; -double dn; -int n; -double result; -int ix, xpt; +/* ==================================================================== + * + * FunctionName fcos + * + * Description computes cosine of arg + * + * ==================================================================== + */ +float fcos(float x) { + float absx; + double dx, xsq, poly; + double dn; + int n; + double result; + int ix, xpt; - ix = *(int *)&x; + ix = *(int*)&x; xpt = (ix >> 22); xpt &= 0x1ff; /* xpt is exponent(x) + 1 bit of mantissa */ - - if ( xpt < 0x136 ) - { + if (xpt < 0x136) { /* |x| < 2^28 */ /* use the standard algorithm from Cody and Waite, doing @@ -84,31 +83,30 @@ int ix, xpt; dx = absx; - dn = dx*rpi.d + 0.5; + dn = dx * rpi.d + 0.5; n = ROUND(dn); dn = n; dn -= 0.5; - dx = dx - dn*pihi.d; - dx = dx - dn*pilo.d; /* dx = x - (n - 0.5)*pi */ + dx = dx - dn * pihi.d; + dx = dx - dn * pilo.d; /* dx = x - (n - 0.5)*pi */ - xsq = dx*dx; + xsq = dx * dx; - poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + poly = ((P[4].d * xsq + P[3].d) * xsq + P[2].d) * xsq + P[1].d; - result = dx + (dx*xsq)*poly; + result = dx + (dx * xsq) * poly; /* negate result if n is odd */ - if ( (n & 1) == 0 ) - return ( (float)result ); + if ((n & 1) == 0) + return ((float)result); - return ( -(float)result ); + return (-(float)result); } - if ( x != x ) - { + if (x != x) { /* x is a NaN; return a quiet NaN */ #ifdef _IP_NAN_SETS_ERRNO @@ -116,10 +114,10 @@ int ix, xpt; *__errnoaddr = EDOM; #endif - return ( __libm_qnan.f ); + return (__libm_qnan_f); } /* just give up and return 0.0 */ - return ( zero.f ); + return (zero.f); } diff --git a/lib/hackerlibultra/src/gu/coss.c b/lib/hackerlibultra/src/gu/coss.c new file mode 100644 index 00000000..5bf40547 --- /dev/null +++ b/lib/hackerlibultra/src/gu/coss.c @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* ==================================================================== + * ==================================================================== + * + * Module: coss.c + * $Revision: 1.3 $ + * $Date: 1998/10/09 06:11:01 $ + * $Author: has $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/libultra/monegi/gu/coss.c,v $ + * + * ==================================================================== + * ==================================================================== + */ + +/* coefficients for polynomial approximation of sin on +/- pi/2 */ + +/* ==================================================================== + * + * FunctionName coss + * + * Description computes cosine of arg + * + * ==================================================================== + */ + +signed short coss(unsigned short x) { + /* 0 <= x < 0x10000 ==> 0 <= x < 2PI */ + + return sins((unsigned short)(x + 0x4000)); +} diff --git a/lib/hackerlibultra/src/gu/dump_gbi.c b/lib/hackerlibultra/src/gu/dump_gbi.c new file mode 100644 index 00000000..0121e9e6 --- /dev/null +++ b/lib/hackerlibultra/src/gu/dump_gbi.c @@ -0,0 +1,271 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ + +/* + * Interpret Task with GBI display list and dump it for debugging. + */ + +/************************************************** + * + * guDumpGbiDL no longer supported + * applications should use guParseGbiDL with the + * GU_PARSEGBI_DUMPONLY flag set. + * + **************************************************/ + +#if 0 + +#include "ultra64.h" +#include "bstring.h" + +#undef PRINTF +#define PRINTF osSyncPrintf + +#define DL_STACKSIZE 11 +static u32 *Gp[DL_STACKSIZE]; + +#define TX_MAX 100 +static u32 textures[TX_MAX]; +static u32 numtextures; + +static u32 segment_base[16]; +static u32 dotextures = TRUE; +static int dl_depth = 0; + + +/* + * dump a DMA-type display list command. + */ +static void +dump_dma(u32 *bufp) +{ + u32 addr, + *data; + u8 seg_id; + u16 len; + char op, + b0; + + op = ((*bufp & 0xff000000) >> 24); + + /* + * DMA op addressing is all the same: + */ + seg_id = (u8) ((bufp[1] & 0x0f000000) >> 24); + addr = segment_base[seg_id] + (bufp[1] & 0x00ffffff); + + + addr = (u32) osPhysicalToVirtual(addr); + + len = (u16) (bufp[0] & 0x0000ffff); + + PRINTF(">%08x\n-%08x\n", bufp[0], bufp[1]); + if (op == (char) G_DL) { + b0 = (char) ((bufp[0] & 0x00ff0000) >> 16); + ++dl_depth; + if (dl_depth > (DL_STACKSIZE - 1)) { + PRINTF("***** Error, max levels of display lists exceeded\n"); + return; + } + Gp[dl_depth] = (u32 *) addr; + PRINTF("@ %08x\n",(int)Gp[dl_depth]&0x7fffffff); + } else { + PRINTF("& %08x\n", (int)addr&0x7fffffff); + data = (u32 *) addr; + while(len>0) { + PRINTF("+%08x\n", *data); + data++; + len -= 4; + } + PRINTF("@ %08x\n",(int)(Gp[dl_depth] + (sizeof(Gfx) >> 2))&0x7fffffff); + } +} + +/* + * dump a IMM-type display list command. + */ +static void +dump_imm(u32 *bufp) +{ + char op, + b0; + + op = ((*bufp & 0xff000000) >> 24); + + PRINTF(">%08x\n-%08x\n", bufp[0], bufp[1]); + if (op == (char) G_ENDDL) { + dl_depth--; + if (dl_depth >= 0) { + PRINTF("@ %08x\n",(int)(Gp[dl_depth] + (sizeof(Gfx) >> 2))&0x7fffffff); + } + } + if (op == (char) G_MOVEWORD) { + if (((bufp[0] ) & 0xff) == G_MW_SEGMENT) { + b0 = (char) ((bufp[0] & 0xff00)>>10); + segment_base[b0] = bufp[1] & 0x00ffffff; + } + } +} + +/* + * dump a RDP-type display list command. + */ +static void +dump_rdp(u32 *bufp) +{ + u8 seg_id; + u32 addr; + int i0, + i1; + char op; + + op = ((*bufp & 0xff000000) >> 24); + + PRINTF(">%08x\n-%08x\n", bufp[0], bufp[1]); + if (op == (char) G_SETTIMG && dotextures) { + if (numtextures>=TX_MAX) { + PRINTF("GBI DUMP ERROR: too many textures (max=%d)\n",TX_MAX); + return; + } + seg_id = (u8) ((bufp[1] & 0x0f000000) >> 24); + addr = segment_base[seg_id] + (bufp[1] & 0x00ffffff); + addr = (u32) osPhysicalToVirtual(addr); + i1=1; + for (i0=0;i0= 0) && (dl_depth < (DL_STACKSIZE - 1))) { + + op = (u8) ((*Gp[dl_depth] & 0xff000000) >> 24); + bcopy((char *) Gp[dl_depth], (char *) &(readBuf[0]), sizeof(Gfx)); + + switch (op & 0xc0) { + + case (u8) 0x00: + dump_dma(readBuf); + break; + + case (u8) 0x80: + dump_imm(readBuf); + break; + + case (u8) 0xc0: + dump_rdp(readBuf); + break; + + default: + PRINTF("ERROR : display list is lost, op = %02x\n", op); + break; + + } + + if (op != (u8) G_DL) { + Gp[dl_depth] += (sizeof(Gfx) >> 2); + } + } + if (dotextures) { + u32 i,j; + for (i=0; it.ucode_boot & 0x7fffffff); + for (i=(int)tp->t.ucode_boot; i<(int)tp->t.ucode_boot+tp->t.ucode_boot_size; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + PRINTF("? %08x\n",(int) tp->t.ucode& 0x7fffffff); + for (i=(int)tp->t.ucode; i<(int)tp->t.ucode+UCODE_SIZE_MAX; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + PRINTF("? %08x\n",(int) tp->t.ucode_data & 0x7fffffff); + for (i=(int)tp->t.ucode_data; i<(int)tp->t.ucode_data+tp->t.ucode_data_size; i+=4) { + PRINTF("|%08x\n",(int) *((u32 *) i)); + } + + + guDumpGbi((u32 *) tp->t.data_ptr); + + + PRINTF("^\nGBI_DUMP_END:\n"); + + if (flags & GU_PARSEGBI_HANGAFTER) { + int i; + for (i=0; i<1000;i++) + PRINTF("=============================================================\n"); + while(1); + } + + +/* + * Dumps stuff + * each line is either an address for data to follow or data itself + * 1st char on line indicates what it is: + * + * $ task header address + * @ display list address + * & dma data address + * % texture address + * ? code/code data address + * + * < task header data + * > 1st half of display list command + * - 2nd half of display list command + * + dma data + * * texture data + * | code/code data + * + */ + +} + +#endif diff --git a/lib/hackerlibultra/src/gu/frustum.c b/lib/hackerlibultra/src/gu/frustum.c new file mode 100644 index 00000000..5a48523d --- /dev/null +++ b/lib/hackerlibultra/src/gu/frustum.c @@ -0,0 +1,40 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +void guFrustumF(float mf[4][4], float l, float r, float b, float t, float n, float f, float scale) { + int i, j; + + guMtxIdentF(mf); + + mf[0][0] = 2 * n / (r - l); + mf[1][1] = 2 * n / (t - b); + mf[2][0] = (r + l) / (r - l); + mf[2][1] = (t + b) / (t - b); + mf[2][2] = -(f + n) / (f - n); + mf[2][3] = -1; + mf[3][2] = -2 * f * n / (f - n); + mf[3][3] = 0; + + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + mf[i][j] *= scale; +} + +void guFrustum(Mtx* m, float l, float r, float b, float t, float n, float f, float scale) { + Matrix mf; + + guFrustumF(mf, l, r, b, t, n, f, scale); + + guMtxF2L(mf, m); +} diff --git a/lib/ultra/gu/guint.h b/lib/hackerlibultra/src/gu/guint.h similarity index 53% rename from lib/ultra/gu/guint.h rename to lib/hackerlibultra/src/gu/guint.h index ff819f17..7cc8801e 100644 --- a/lib/ultra/gu/guint.h +++ b/lib/hackerlibultra/src/gu/guint.h @@ -1,45 +1,39 @@ /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ -#include "PR/mbi.h" -#include "PR/gu.h" -#include "PR/os_version.h" +#include "mbi.h" +#include "gu.h" -typedef union -{ - struct - { +typedef union { + struct { unsigned int hi; unsigned int lo; } word; - double d; + double d; } du; -typedef union -{ - unsigned int i; - float f; +typedef union { + unsigned int i; + float f; } fu; #ifndef __GL_GL_H__ -typedef float Matrix[4][4]; +typedef float Matrix[4][4]; #endif -#define ROUND(d) (int)(((d) >= 0.0) ? ((d) + 0.5) : ((d) - 0.5)) -#ifndef ABS -#define ABS(d) ((d) > 0) ? (d) : -(d) -#endif +#define ROUND(d) (int)(((d) >= 0.0) ? ((d) + 0.5) : ((d) - 0.5)) +#define ABS(d) ((d) > 0) ? (d) : -(d) -extern const fu __libm_qnan; +extern float __libm_qnan_f; diff --git a/lib/hackerlibultra/src/gu/guloadtile_bug.c b/lib/hackerlibultra/src/gu/guloadtile_bug.c new file mode 100644 index 00000000..eb12375a --- /dev/null +++ b/lib/hackerlibultra/src/gu/guloadtile_bug.c @@ -0,0 +1,199 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "ultra64.h" + +/* + * Inidicates how many words will be added to display list + * by guDPLoadTextureTile function. + */ +int guGetDPLoadTextureTileSz(int ult, int lrt) { + return (((lrt - ult + 1) / 2) * 4 + 3); +} + +/* + * Workaround for load_tile bug on tapeout one hardware. Uses + * load blocks for each line. ~25% more dma traffic + memory for + * extra commands. + */ +void guDPLoadTextureTile(Gfx* temp, void* timg, int texl_fmt, int texl_size, int img_width, int img_height, int uls, + int ult, int lrs, int lrt, int palette, int cms, int cmt, int masks, int maskt, int shifts, + int shiftt) { + int line; + int tile_width, tile_height; /* + + * in texels + */ + int dxt; + int sizeb; + int lineb; + int line_size; /* + + * in 64-bit words + */ + int texel_num_pad; /* + + * in texels, pad to 64-bit word size + */ + int count; + int tmem; + int tile; + int s, t; + + tile_width = lrs - uls + 1; + tile_height = lrt - ult + 1; + + switch (texl_size) { + case G_IM_SIZ_8b: + sizeb = G_IM_SIZ_8b_BYTES; + lineb = G_IM_SIZ_8b_LINE_BYTES; + break; + case G_IM_SIZ_16b: + sizeb = G_IM_SIZ_16b_BYTES; + lineb = G_IM_SIZ_16b_LINE_BYTES; + break; + case G_IM_SIZ_32b: + sizeb = G_IM_SIZ_32b_BYTES; + lineb = G_IM_SIZ_32b_LINE_BYTES; + break; + } + + dxt = CALC_DXT(tile_width, sizeb); + line_size = ((tile_width * lineb) + 7) >> 3; + /* + * pad line to word boundary + */ + texel_num_pad = ((((tile_width * sizeb) + 7) >> 3) * 8) / sizeb; + + gDPSetTextureImage(temp++, texl_fmt, texl_size, img_width, timg); + + for (line = 0; line < tile_height; line += 2) { + t = (ult + line) & ~1; /* + * load from even line + */ + tmem = line * line_size; + + /* + * set for both loads, avoid sync by alternating tiles + */ + tile = (line % 4) ? 1 : 0; + + gDPSetTile(temp++, texl_fmt, texl_size, 0, tmem, G_TX_LOADTILE - tile, 0, cmt, maskt, shiftt, cms, masks, + shifts); + + /* + * do odd line first + */ + s = uls + img_width - texel_num_pad; + count = (texel_num_pad * 2) - 1; + + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + + /* + * do even line + */ + s = uls; + count = tile_width - 1; + + gDPLoadSync(temp++); + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + } + + /* + * set final tile + */ + gDPSetTile(temp++, texl_fmt, texl_size, line_size, 0, G_TX_RENDERTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); + + gDPSetTileSize(temp++, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); +} + +/* + * 4-BIT VERSION + */ + +/* + * Inidicates how many words will be added to display list + * by guDPLoadTextureTile function. + */ +int guGetDPLoadTextureTile_4bSz(int ult, int lrt) { + return (((lrt - ult + 1) / 2) * 4 + 3); +} + +/* + * Workaround for load_tile bug on version 1.0 hardware. Uses + * load blocks for each line. ~25% more dma traffic + memory for + * extra commands. + */ +void guDPLoadTextureTile_4b(Gfx* temp, void* timg, int texl_fmt, int img_width, int img_height, int uls, int ult, + int lrs, int lrt, int palette, int cms, int cmt, int masks, int maskt, int shifts, + int shiftt) { + int line; + int tile_width, tile_height; + int dxt; + int sizeb; + int lineb; + int line_size; + int count; + int tmem; + int tile; + int s, t; + + tile_width = (lrs - uls + 1) >> 1; + tile_height = lrt - ult + 1; + sizeb = G_IM_SIZ_8b_BYTES; + lineb = G_IM_SIZ_8b_LINE_BYTES; + line_size = ((tile_width * lineb) + 7) >> 3; + dxt = CALC_DXT_4b(tile_width); + + gDPSetTextureImage(temp++, texl_fmt, G_IM_SIZ_8b, ((img_width) >> 1), timg); + + for (line = 0; line < tile_height; line += 2) { + t = (ult + line) & ~1; /* + * load from even line + */ + tmem = line * line_size; + + /* + * set for both loads, avoid sync by alternating tiles + */ + tile = (line % 4) ? 1 : 0; + + gDPSetTile(temp++, texl_fmt, G_IM_SIZ_8b, 0, tmem, G_TX_LOADTILE - tile, 0, cmt, maskt, shiftt, cms, masks, + shifts); + + /* + * do odd line first + */ + s = uls + img_width - line_size * 8; + count = (line_size * 8 * 2) - 1; + + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + + /* + * do even line + */ + s = uls; + count = tile_width - 1; + + gDPLoadSync(temp++); + gDPLoadBlock(temp++, G_TX_LOADTILE - tile, s, t, s + count, dxt); + } + + /* + * set final tile + */ + gDPSetTile(temp++, texl_fmt, G_IM_SIZ_4b, line_size, 0, G_TX_RENDERTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); + + gDPSetTileSize(temp++, G_TX_RENDERTILE, (uls) << G_TEXTURE_IMAGE_FRAC, (ult) << G_TEXTURE_IMAGE_FRAC, + (lrs) << G_TEXTURE_IMAGE_FRAC, (lrt) << G_TEXTURE_IMAGE_FRAC); +} diff --git a/lib/hackerlibultra/src/gu/libm_vals.s b/lib/hackerlibultra/src/gu/libm_vals.s new file mode 100644 index 00000000..b88ad985 --- /dev/null +++ b/lib/hackerlibultra/src/gu/libm_vals.s @@ -0,0 +1,5 @@ + .rdata + .align 4 + .globl __libm_qnan_f +__libm_qnan_f: + .word 0x7F810000 diff --git a/lib/hackerlibultra/src/gu/loadtextureblockmipmap.c b/lib/hackerlibultra/src/gu/loadtextureblockmipmap.c new file mode 100644 index 00000000..c6215f38 --- /dev/null +++ b/lib/hackerlibultra/src/gu/loadtextureblockmipmap.c @@ -0,0 +1,630 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +/**************************************************************************** + * NOTE: To view this file correctly, set tabstop=3 + *****************************************************************************/ +#include "guint.h" +#include +#include "ultra64.h" +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#ident "$Revision: 1.49 $" + +#define TRAM_SIZE 4096 /* in bytes */ +#define TRAM_WSIZE 8 /* TRAM word size in bytes */ +#define TRAM_LSIZE 8 /* TRAM load word size in bytes */ +#define MM_MAX_LEVEL 7 /* number of mipmap levels 0 to MM_MAX_LEVEL */ +#define MM_MIN_SIZE 1 /* smallest mipmap tile */ + +struct texelSizeParams { + unsigned char gran; + unsigned char shift; + unsigned char tsize; + unsigned char shiftr; +}; + +/* texture ram tile */ +struct Tile { + int w; /* width of tile in texels, padded to tram line sz */ + int s, t; /* size of tile in texels */ + int addr; /* address in tram of tile */ +}; + +/* tram mipmaps */ +static struct Tile mipmap[MM_MAX_LEVEL + 1] ALIGNED(0x8); +static struct texelSizeParams sizeParams[4] = { 16, 3, 1, 0, 8, 2, 2, 1, 4, 1, 4, 2, 2, 0, 8, 3 }; + +static int max_mipmap; +static unsigned char* tram; +static int txlsize; +static int errNo = 0; +static int NA = 0; /* Not applicable */ +static unsigned int length; /* total texels in mipmap */ +static int level; /* total levels in mipmap */ + +static void get3x3(struct Tile* tile, int* s, int* t, int* texel, int shift, int size); +static void stuffDisplayList(Gfx** glistp, Image* im, char* tbuf, unsigned char startTile, unsigned char pal, + unsigned char cms, unsigned char cmt, unsigned char masks, unsigned char maskt, + unsigned char shifts, unsigned char shiftt); +static void kernel(int i, int r1, int g1, int b1, int a1, float* r2, float* g2, float* b2, float* a2); + +#define unpack_ia16(c, i, a) i = (c & 0xff00) >> 8, a = (c & 0xff) +#define pack_ia16(i, a) (i << 8) | a + +#define unpack_ia8(c, i, a) i = ((c & 0xf0) >> 4), a = (c & 0xf) +#define pack_ia8(i, a) (a & 0xf) | ((i & 0xf) << 4) + +#define unpack_ia4(c, i, a) i = ((c & 0xe) >> 1), a = (c & 0x1) +#define pack_ia4(i, a) ((i & 0x7) << 1) | ((a & 0x1)) + +#define unpack_i4(c, i) i = (c & 0xf) +#define pack_i4(i) (i) + +#define unpack_i8(c, i) i = (c & 0xff) +#define pack_i8(i) (i) + +#define unpack_ci8(c, ci) unpack_i8(c, ci) +#define pack_ci8(ci) pack_i8(ci) + +#define unpack_ci4(c, ci) unpack_i4(c, ci) +#define pack_ci4(ci) pack_i4(ci) + +#define unpack_rgba(c, r, g, b, a) \ + (r = (c & 0xf800) >> 11), g = ((c & 0x07c0) >> 6), b = ((c & 0x003e) >> 1), a = (c & 0x1) + +#define pack_rgba(r, g, b, a) ((r & 0x1f) << 11) | (g & 0x1f) << 6 | ((b & 0x1f) << 1) | (a) + +/************************************************************************* + * Generates all levels of a power-of-two mipmap from an input array. * + * Also stuffs display list with entries for loading and rendering the * + * texture. Filtering Color-Index maps makes sense only if the lookup * + * is a linear ramp. Billboards and trees cutout using alpha will change * + * shape as the level changes due to change in map resolution. Texel * + * formats with only one bit of alpha will not be filtered very well. * + ************************************************************************* + * ErrNo value error description * + *-----------------------------------------------------------------------* + * 1 Mipmap too big to load into tmem. Not Fatal, * + * will load as many levels as there is space for. * + * * + * 2 Texel format not supported, Fatal error * + ************************************************************************/ + +int guLoadTextureBlockMipMap(Gfx** glistp, unsigned char* tbuf, Image* im, unsigned char startTile, unsigned char pal, + unsigned char cms, unsigned char cmt, unsigned char masks, unsigned char maskt, + unsigned char shifts, unsigned char shiftt, unsigned char cfs, unsigned char cft) { + + unsigned char *iaddr, *taddr; + int im_bytes, tr_bytes; + int h, b; + int flip; + char startUnAligned; + char endUnAligned; + + txlsize = sizeParams[im->siz].tsize; /* texel size in nibbles */ + /* to next line size */ + + /* + * Do top level map, swizzle bytes on odd t's * + */ + /* base char address of tile to be loaded */ + iaddr = ((im->t * im->lsize) + ((im->s * txlsize) >> 1) + im->base); + + /*check tile line starting and ending alignments along 4bit bndries */ + startUnAligned = ((im->s & 0x1) && (im->siz == G_IM_SIZ_4b)); + endUnAligned = (((im->s + im->w) & 0x1) && (im->siz == G_IM_SIZ_4b)); + + im_bytes = ((im->w * txlsize + 1) >> 1); /* siz of 1 tile line in bytes */ + tr_bytes = im_bytes / TRAM_LSIZE; /* no of tram lines per tile line */ + tr_bytes = tr_bytes * TRAM_LSIZE; /* tile line size in bytes */ + if (im_bytes > tr_bytes) + tr_bytes += TRAM_LSIZE; + + taddr = &tbuf[im->addr]; /* why ? make this zero?*/ + + if (startUnAligned) { + for (h = 0; h < im->h; h++) { + flip = (h & 1) << 2; /*shift does not depend on txlsize*/ + for (b = 0; b < im_bytes; b++) { + *(taddr + (b ^ flip)) = ((*(iaddr + b) & 0x0f) << 4) | ((*(iaddr + b + 1) & 0xf0) >> 4); + } + /* add last aligned nibble */ + if (!endUnAligned) + *(taddr + ((b - 1) ^ flip)) &= (0xf0); + /* pickup trailing bytes */ + for (b = im_bytes; b < tr_bytes; b++) + *(taddr + (b ^ flip)) = 0; + iaddr += im->lsize; + taddr += tr_bytes; + } + } else /* if start aligned */ + { + for (h = 0; h < im->h; h++) { + flip = (h & 1) << 2; /*shift does not depend on txlsize*/ + for (b = 0; b < im_bytes; b++) + *(taddr + (b ^ flip)) = *(iaddr + b); + + /* zero out last extra nibble */ + if (endUnAligned) + *(taddr + ((b - 1) ^ flip)) &= (0xf0); + /* pad trailing bytes with zeroes */ + for (b = im_bytes; b < tr_bytes; b++) + *(taddr + (b ^ flip)) = 0; + + iaddr += im->lsize; + taddr += tr_bytes; + } + } + + tram = tbuf; + + /* save tile attributes in top mipmap */ + mipmap[0].s = im->w; /* tile width */ + mipmap[0].t = im->h; /* tile height */ + /* guaranteed no remainder ? */ + mipmap[0].w = ((tr_bytes / txlsize) << 1); /* tile line width in texels*/ + mipmap[0].addr = im->addr; + max_mipmap = MM_MAX_LEVEL; + length = mipmap[0].w * mipmap[0].t; /* total texels in level 0 */ + /** + rmonPrintf("level0 w,t,l = %d %d %d\n",mipmap[0].w, mipmap[0].t,length); + ***/ + + /****************************************************************************** + Generate other levels of mipmap using a box filter + ******************************************************************************/ + + { /* generate mip map for this tile */ + unsigned char *taddr, *saddr; + int shift = (int)sizeParams[im->siz].shift; + int s, t, si, ti, sii, tii; + int s4[9]; + int t4[9]; + int tex4[9]; + int r0, g0, b0, a0, r1, g1, b1, a1; + float r2, g2, b2, a2; + float dummy; + int i0, ci0, ia0, i1, ci1, ia1; + float i2, ci2, ia2; + int texel; + int i, trip; + unsigned int tempaddr; + int ntexels = ((TRAM_LSIZE / txlsize) << 1); /* texels per line */ + + level = 0; /* need to check for memory overflow */ + while ((mipmap[level].s > 1) || (mipmap[level].t > 1)) { + level++; + /* + * set new mipmap level address in bytes + */ + mipmap[level].addr = mipmap[level - 1].addr + (mipmap[level - 1].w * txlsize * mipmap[level - 1].t >> 1); + + /* + * grab location in tram pointing to the current level address + */ + taddr = &(tram[mipmap[level].addr]); + + /* + * downfilter by 2X, bump odd size + * compute parameters for new mipmap level + */ + mipmap[level].s = (mipmap[0].s) >> level; + mipmap[level].t = (mipmap[0].t) >> level; + + if (mipmap[level].s == 0) + mipmap[level].s = 1; + if (mipmap[level].t == 0) + mipmap[level].t = 1; + + /* + * width must be a multiple of 8 bytes (padding for tram line size) + */ + mipmap[level].w = ((mipmap[level].s + (ntexels - 1)) >> (shift + 1) << (shift + 1)); + + /* + * compute total no of texels to be loaded + */ + length += mipmap[level].w * mipmap[level].t; + /** + rmonPrintf("level, w,t,l = %d %d %d %d\n", level, mipmap[level].w, + mipmap[level].t,length); + **/ + if ((length * txlsize >> 1) >= TRAM_SIZE) { + errNo = 1; + length -= mipmap[level].w * mipmap[level].t; + break; + } + + /* + * for each scanline + */ + for (t = 0; t < mipmap[level - 1].t; t += 2) { + flip = 0; + trip = (t & 2) << 1; /* invert bit 4 on odd line */ + ti = t + 1; + tii = t - 1; + + /* + * check filtering clamp/wrap flag and do accordingly + */ + if (cft) { + if (ti >= mipmap[level - 1].t) + ti = t; + if (tii < 0) + tii = t; + } else { + if (ti >= mipmap[level - 1].t) + ti = 0; + if (tii < 0) + tii = mipmap[level - 1].t - 1; + } + + tempaddr = 0; + + for (s = 0; s < mipmap[level - 1].s; s += 2) { + si = s + 1; + sii = s - 1; + /* + * duplicate last texel for odd sizes for filtering + */ + if (cfs) { + if (si >= mipmap[level - 1].s) + si = s; + if (sii < 0) + sii = s; + } else { + if (si >= mipmap[level - 1].s) + si = 0; + if (sii < 0) + sii = mipmap[level - 1].s - 1; + } + + /*** + if (level == 6) + rmonPrintf("sts = %d %d %d %d %d %d\n", + s, si, sii, t, ti, tii); + ***/ + + /* + * grab the nine neighbours to apply kernel function + */ + s4[0] = s; + t4[0] = tii; + s4[1] = si; + t4[1] = tii; + s4[2] = si; + t4[2] = t; + s4[3] = si; + t4[3] = ti; + s4[4] = s; + t4[4] = ti; + s4[5] = sii; + t4[5] = ti; + s4[6] = sii; + t4[6] = t; + s4[7] = sii; + t4[7] = tii; + s4[8] = s; + t4[8] = t; + + get3x3(&mipmap[level - 1], s4, t4, tex4, shift, im->siz); + + saddr = taddr + ((tempaddr >> 1) ^ trip); + r1 = g1 = b1 = a1 = ci1 = i1 = 0; + r2 = g2 = b2 = a2 = ci2 = i2 = 0; + + /* + * Extract R,G and B components of the 9 texels and + * apply the filter kernel + */ + switch (im->fmt) { + case (G_IM_FMT_RGBA): + if (im->siz == G_IM_SIZ_16b) { + for (i = 0; i < 9; i++) { + unpack_rgba(tex4[i], r0, g0, b0, a0); + kernel(i, r0, g0, b0, a0, &r2, &g2, &b2, &a2); + /*** + if (level == 6) + rmonPrintf("r0, g0, b0, a0 = + %d %d %d %d\n", r0, g0, b0, a0); + **/ + } + r1 = (int)(r2 / 16.0 + 0.5); + g1 = (int)(g2 / 16.0 + 0.5); + b1 = (int)(b2 / 16.0 + 0.5); + a1 = (int)(a2 / 16.0 + 0.5); + } else { + /* + * RGBA32 is not supported + */ + errNo = 2; + return errNo; + } + break; + + case (G_IM_FMT_YUV): + errNo = 2; + return errNo; + break; + + case (G_IM_FMT_CI): + if (im->siz == G_IM_SIZ_4b) { + for (i = 0; i < 9; i++) { + unpack_ci4(tex4[i], ci0); + kernel(i, ci0, 0, 0, 0, &ci2, &dummy, &dummy, &dummy); + } + ci1 = (int)(ci2 / 16.0 + 0.5); + } else if (im->siz == G_IM_SIZ_8b) { + for (i = 0; i < 9; i++) { + unpack_ci8(tex4[i], ci0); + kernel(i, ci0, 0, 0, 0, &ci2, &dummy, &dummy, &dummy); + } + ci1 = (int)(ci2 / 16.0 + 0.5); + } else { + errNo = 2; + return errNo; + } + break; + + case (G_IM_FMT_IA): + if (im->siz == G_IM_SIZ_4b) { + for (i = 0; i < 9; i++) { + unpack_ia4(tex4[i], i0, a0); + kernel(i, i0, a0, 0, 0, &i2, &a2, &dummy, &dummy); + } + i1 = (int)(i2 / 16.0 + 0.5); + a1 = (int)(a2 / 16.0 + 0.5); + } else if (im->siz == G_IM_SIZ_8b) { + for (i = 0; i < 9; i++) { + unpack_ia8(tex4[i], i0, a0); + kernel(i, i0, a0, 0, 0, &i2, &a2, &dummy, &dummy); + } + i1 = (int)(i2 / 16.0 + 0.5); + a1 = (int)(a2 / 16.0 + 0.5); + } else if (im->siz == G_IM_SIZ_16b) { + for (i = 0; i < 9; i++) { + unpack_ia16(tex4[i], i0, a0); + kernel(i, i0, a0, 0, 0, &i2, &a2, &dummy, &dummy); + } + i1 = (int)(i2 / 16.0 + 0.5); + a1 = (int)(a2 / 16.0 + 0.5); + } else { + errNo = 2; + return errNo; + } + break; + + case (G_IM_FMT_I): + if (im->siz == G_IM_SIZ_4b) { + for (i = 0; i < 9; i++) { + unpack_i4(tex4[i], i0); + kernel(i, i0, 0, 0, 0, &i2, &dummy, &dummy, &dummy); + } + i1 = (int)(i2 / 16.0 + 0.5); + } else if (im->siz == G_IM_SIZ_8b) { + for (i = 0; i < 9; i++) { + unpack_i8(tex4[i], i0); + kernel(i, i0, 0, 0, 0, &i2, &dummy, &dummy, &dummy); + } + i1 = (int)(i2 / 16.0 + 0.5); + } else { + errNo = 2; + return errNo; + } + + default: + break; + } + + /* + * Pack fields into destination texel + */ + switch (im->fmt) { + + case (G_IM_FMT_RGBA): + texel = pack_rgba(r1, g1, b1, a1); + *(short*)((int)saddr ^ flip) = texel; + break; + + case (G_IM_FMT_YUV): + break; + + case (G_IM_FMT_CI): + + if (im->siz == G_IM_SIZ_4b) { + texel = pack_ci4(ci1); + *(char*)((int)saddr ^ flip) |= (s & 0x2) ? (texel) : (texel << 4); + } else if (im->siz == G_IM_SIZ_8b) { + texel = pack_ci8(ci1); + *(char*)((int)saddr ^ flip) = texel; + } + break; + + case (G_IM_FMT_IA): + if (im->siz == G_IM_SIZ_4b) { + texel = pack_ia4(i1, a1); + *(char*)((int)saddr ^ flip) |= (s & 0x2) ? (texel) : (texel << 4); + } else if (im->siz == G_IM_SIZ_8b) { + texel = pack_ia8(i1, a1); + *(char*)((int)saddr ^ flip) = texel; + } else if (im->siz == G_IM_SIZ_16b) { + texel = pack_ia16(i1, a1); + *(short*)((int)saddr ^ flip) = texel; + } + break; + + case (G_IM_FMT_I): + if (im->siz == G_IM_SIZ_4b) { + texel = pack_i4(i1); + *(char*)((int)saddr ^ flip) |= (s & 0x2) ? (texel) : (texel << 4); + } else if (im->siz == G_IM_SIZ_8b) { + texel = pack_i8(i1); + *(char*)((int)saddr ^ flip) = texel; + } + break; + } + + tempaddr += txlsize; + + } /* end s */ + + taddr += ((mipmap[level].w * txlsize) >> 1); + + } /* end t */ + + if (mipmap[level].s <= MM_MIN_SIZE && mipmap[level].t <= MM_MIN_SIZE) { + max_mipmap = level; + break; + } + } /* end level */ + + } /* end generate mipmap */ + /* + * Add entries for texture loading and rendering in DL + */ + stuffDisplayList(glistp, im, tbuf, startTile, pal, cms, cmt, masks, maskt, shifts, shiftt); + + return errNo; +} /* end guLoadTextureBlockMipMap */ + +/****************************************************************************** + * + * Apply Kernel : + * 1 2 1 + * 2 4 1 + * 1 2 1 + ******************************************************************************/ +static void kernel(int i, int r0, int g0, int b0, int a0, float* r2, float* g2, float* b2, float* a2) { + if (i == 8) { + *r2 += r0 * 4; + *g2 += g0 * 4; + *b2 += b0 * 4; + *a2 += a0 * 4; + } else if (i % 2 == 0) { + *r2 += r0 * 2; + *g2 += g0 * 2; + *b2 += b0 * 2; + *a2 += a0 * 2; + } else { + *r2 += r0; + *g2 += g0; + *b2 += b0; + *a2 += a0; + } +} + +/******************************************************************** + Add entries for loading and rendering textures into the display list +*********************************************************************/ +static void stuffDisplayList(Gfx** glistp, Image* im, char* tbuf, unsigned char startTile, unsigned char pal, + unsigned char cms, unsigned char cmt, unsigned char masks, unsigned char maskt, + unsigned char shifts, unsigned char shiftt) { + int tile; + int Smask, Tmask; + int Sshift, Tshift; + + /* + * set LOADTILE for loading texture + * 4-bit textures are loaded in 8-bit chunks + */ + if (im->siz == G_IM_SIZ_4b) { + gDPSetTextureImage((*glistp)++, im->fmt, G_IM_SIZ_8b, 1, osVirtualToPhysical((unsigned short*)tbuf)); + gDPSetTile((*glistp)++, im->fmt, G_IM_SIZ_8b, NA, 0, G_TX_LOADTILE, NA, NA, NA, NA, NA, NA, NA); + /* Wait until all primitives are done */ + gDPLoadSync((*glistp)++); + gDPLoadBlock((*glistp)++, G_TX_LOADTILE, 0, 0, length / 2, 0x0); + } else { + gDPSetTextureImage((*glistp)++, im->fmt, im->siz, 1, osVirtualToPhysical((unsigned short*)tbuf)); + gDPSetTile((*glistp)++, im->fmt, im->siz, NA, 0, G_TX_LOADTILE, NA, NA, NA, NA, NA, NA, NA); + /* Wait until all primitives are done */ + gDPLoadSync((*glistp)++); + gDPLoadBlock((*glistp)++, G_TX_LOADTILE, 0, 0, length, 0x0); + } + + for (tile = 0; tile <= level; tile++) { + Tmask = maskt - tile; + if (Tmask < 0) { + Tmask = 0; + } else { + Tshift = tile; + } + + Smask = masks - tile; + if (Smask < 0) { + Smask = 0; + } else { + Sshift = tile; + } + + /*** + rmonPrintf("tile, Tmask, Tshift, Smask, Sshift %d %d %d %d %d\n", + tile, Tmask, Tshift, Smask, Sshift); + rmonPrintf("%d\n",startTile); + ***/ + + gDPSetTile((*glistp)++, im->fmt, im->siz, (mipmap[tile].w * txlsize >> 4), (mipmap[tile].addr >> 3), + tile + startTile, pal, cmt, Tmask, Tshift, cms, Smask, Sshift); + + gDPSetTileSize((*glistp)++, tile + startTile, (0 << G_TEXTURE_IMAGE_FRAC), (0 << G_TEXTURE_IMAGE_FRAC), + (mipmap[tile].s - 1) << G_TEXTURE_IMAGE_FRAC, (mipmap[tile].t - 1) << G_TEXTURE_IMAGE_FRAC); + } +} + +/****************************************************************************** + Extract quad of texels for filtering. Compute bank and row addresses. +******************************************************************************/ +static void get3x3(struct Tile* tile, int* s, int* t, int* texel, int shift, int size) { + int i; + int bank, row; + unsigned int addr; + int overlap; + unsigned char r, g, b, a; + unsigned long tex; + struct Image* im; + unsigned int ss, tt; + + for (i = 0; i < 9; i++) { + ss = s[i]; + tt = t[i]; + /* bank and row indexing */ + bank = (((ss & (0x3 << (shift - 1))) >> (shift - 1)) ^ ((tt & 0x1) << 1)) << 1; + row = (((tt * tile->w + ss) * txlsize) >> 1) / TRAM_LSIZE; + addr = tile->addr + row * TRAM_WSIZE + bank; + + overlap = (i == 0) ? bank : overlap ^ bank; + + switch (size) { + case G_IM_SIZ_4b: + texel[i] = (tram[addr + ((ss & 0x2) >> 1)] & (0xf0 >> ((ss & 0x1) << 2))); + if (!(ss & 0x1)) + texel[i] = texel[i] >> 4; + break; + + case G_IM_SIZ_8b: + texel[i] = tram[addr + (ss & 0x1)]; + break; + + case G_IM_SIZ_16b: + texel[i] = (tram[addr] << 8) | tram[addr + 1]; + break; + + case G_IM_SIZ_32b: + errNo = 2; /* Format not supported */ + break; + + default: + break; + } + } +} diff --git a/lib/hackerlibultra/src/gu/lookat.c b/lib/hackerlibultra/src/gu/lookat.c new file mode 100644 index 00000000..f6b3fbb4 --- /dev/null +++ b/lib/hackerlibultra/src/gu/lookat.c @@ -0,0 +1,79 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +void guLookAtF(float mf[4][4], float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, + float yUp, float zUp) { + float len, xLook, yLook, zLook, xRight, yRight, zRight; + + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0 / sqrtf(xUp * xUp + yUp * yUp + zUp * zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} + +void guLookAt(Mtx* m, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, float yUp, + float zUp) { + Matrix mf; + + guLookAtF(mf, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp); + + guMtxF2L(mf, m); +} diff --git a/lib/hackerlibultra/src/gu/lookathil.c b/lib/hackerlibultra/src/gu/lookathil.c new file mode 100644 index 00000000..621d160f --- /dev/null +++ b/lib/hackerlibultra/src/gu/lookathil.c @@ -0,0 +1,164 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +void guLookAtHiliteF(float mf[4][4], LookAt* l, Hilite* h, float xEye, float yEye, float zEye, float xAt, float yAt, + float zAt, float xUp, float yUp, float zUp, float xl1, float yl1, + float zl1, /* light 1 direction */ + float xl2, float yl2, float zl2, /* light 2 direction */ + int twidth, int theight) /* highlight txtr size*/ +{ + float len, xLook, yLook, zLook, xRight, yRight, zRight; + float xHilite, yHilite, zHilite; + + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0 / sqrtf(xUp * xUp + yUp * yUp + zUp * zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + /* hilite vectors */ + + len = 1.0 / sqrtf(xl1 * xl1 + yl1 * yl1 + zl1 * zl1); + xl1 *= len; + yl1 *= len; + zl1 *= len; + +#define THRESH2 0.1 + xHilite = xl1 + xLook; + yHilite = yl1 + yLook; + zHilite = zl1 + zLook; + + len = sqrtf(xHilite * xHilite + yHilite * yHilite + zHilite * zHilite); + + if (len > THRESH2) { + len = 1.0 / len; + xHilite *= len; + yHilite *= len; + zHilite *= len; + + h->h.x1 = twidth * 4 + (xHilite * xRight + yHilite * yRight + zHilite * zRight) * twidth * 2; + + h->h.y1 = theight * 4 + (xHilite * xUp + yHilite * yUp + zHilite * zUp) * theight * 2; + } else { + h->h.x1 = twidth * 2; + h->h.y1 = theight * 2; + } + + len = 1.0 / sqrtf(xl2 * xl2 + yl2 * yl2 + zl2 * zl2); + xl2 *= len; + yl2 *= len; + zl2 *= len; + + xHilite = xl2 + xLook; + yHilite = yl2 + yLook; + zHilite = zl2 + zLook; + len = sqrtf(xHilite * xHilite + yHilite * yHilite + zHilite * zHilite); + if (len > THRESH2) { + len = 1.0 / len; + xHilite *= len; + yHilite *= len; + zHilite *= len; + + h->h.x2 = twidth * 4 + (xHilite * xRight + yHilite * yRight + zHilite * zRight) * twidth * 2; + + h->h.y2 = theight * 4 + (xHilite * xUp + yHilite * yUp + zHilite * zUp) * theight * 2; + } else { + h->h.x2 = twidth * 2; + h->h.y2 = theight * 2; + } + + /* reflectance vectors = Up and Right */ + + l->l[0].l.dir[0] = FTOFRAC8(xRight); + l->l[0].l.dir[1] = FTOFRAC8(yRight); + l->l[0].l.dir[2] = FTOFRAC8(zRight); + l->l[1].l.dir[0] = FTOFRAC8(xUp); + l->l[1].l.dir[1] = FTOFRAC8(yUp); + l->l[1].l.dir[2] = FTOFRAC8(zUp); + l->l[0].l.col[0] = 0x00; + l->l[0].l.col[1] = 0x00; + l->l[0].l.col[2] = 0x00; + l->l[0].l.pad1 = 0x00; + l->l[0].l.colc[0] = 0x00; + l->l[0].l.colc[1] = 0x00; + l->l[0].l.colc[2] = 0x00; + l->l[0].l.pad2 = 0x00; + l->l[1].l.col[0] = 0x00; + l->l[1].l.col[1] = 0x80; + l->l[1].l.col[2] = 0x00; + l->l[1].l.pad1 = 0x00; + l->l[1].l.colc[0] = 0x00; + l->l[1].l.colc[1] = 0x80; + l->l[1].l.colc[2] = 0x00; + l->l[1].l.pad2 = 0x00; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} + +void guLookAtHilite(Mtx* m, LookAt* l, Hilite* h, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp, float xl1, float yl1, float zl1, /* light 1 direction */ + float xl2, float yl2, float zl2, /* light 2 direction */ + int twidth, int theight) /* highlight txtr size*/ +{ + Matrix mf; + + guLookAtHiliteF(mf, l, h, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp, xl1, yl1, zl1, xl2, yl2, zl2, twidth, + theight); + + guMtxF2L(mf, m); +} diff --git a/lib/ultra/gu/lookatref.c b/lib/hackerlibultra/src/gu/lookatref.c similarity index 66% rename from lib/ultra/gu/lookatref.c rename to lib/hackerlibultra/src/gu/lookatref.c index 9dd964bf..cec29cbc 100644 --- a/lib/ultra/gu/lookatref.c +++ b/lib/hackerlibultra/src/gu/lookatref.c @@ -1,32 +1,20 @@ -/* - * This file originates from the standard Nintendo 64 SDK libultra src - * directory, and it used exclusively when building with the Fast3DEX2 - * microcode. Not using it breaks environment mapping. - * - * Apart from the modifications listed below, this file is unmodified. - */ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" - -void guLookAtReflectF(float mf[4][4], LookAt *l, - float xEye, float yEye, float zEye, - float xAt, float yAt, float zAt, - float xUp, float yUp, float zUp) -{ - float len, xLook, yLook, zLook, xRight, yRight, zRight; +void guLookAtReflectF(float mf[4][4], LookAt* l, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, + float xUp, float yUp, float zUp) { + float len, xLook, yLook, zLook, xRight, yRight, zRight; guMtxIdentF(mf); @@ -35,7 +23,7 @@ void guLookAtReflectF(float mf[4][4], LookAt *l, zLook = zAt - zEye; /* Negate because positive Z is behind us: */ - len = -1.0 / sqrtf (xLook*xLook + yLook*yLook + zLook*zLook); + len = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook); xLook *= len; yLook *= len; zLook *= len; @@ -45,7 +33,7 @@ void guLookAtReflectF(float mf[4][4], LookAt *l, xRight = yUp * zLook - zUp * yLook; yRight = zUp * xLook - xUp * zLook; zRight = xUp * yLook - yUp * xLook; - len = 1.0 / sqrtf (xRight*xRight + yRight*yRight + zRight*zRight); + len = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight); xRight *= len; yRight *= len; zRight *= len; @@ -55,7 +43,7 @@ void guLookAtReflectF(float mf[4][4], LookAt *l, xUp = yLook * zRight - zLook * yRight; yUp = zLook * xRight - xLook * zRight; zUp = xLook * yRight - yLook * xRight; - len = 1.0 / sqrtf (xUp*xUp + yUp*yUp + zUp*zUp); + len = 1.0 / sqrtf(xUp * xUp + yUp * yUp + zUp * zUp); xUp *= len; yUp *= len; zUp *= len; @@ -106,14 +94,11 @@ void guLookAtReflectF(float mf[4][4], LookAt *l, mf[3][3] = 1; } -void guLookAtReflect (Mtx *m, LookAt *l, float xEye, float yEye, float zEye, - float xAt, float yAt, float zAt, - float xUp, float yUp, float zUp) -{ - float mf[4][4]; +void guLookAtReflect(Mtx* m, LookAt* l, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, + float yUp, float zUp) { + float mf[4][4]; - guLookAtReflectF(mf, l, xEye, yEye, zEye, xAt, yAt, zAt, - xUp, yUp, zUp); + guLookAtReflectF(mf, l, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp); guMtxF2L(mf, m); } diff --git a/lib/hackerlibultra/src/gu/lookatstereo.c b/lib/hackerlibultra/src/gu/lookatstereo.c new file mode 100644 index 00000000..027677f4 --- /dev/null +++ b/lib/hackerlibultra/src/gu/lookatstereo.c @@ -0,0 +1,105 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +void guLookAtStereoF(float mf[4][4], float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, + float yUp, float zUp, float eyedist) { + float len, xLook, yLook, zLook, xRight, yRight, zRight; + + guMtxIdentF(mf); + + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Move eye for stereo */ + xEye += eyedist * xRight; + yEye += eyedist * yRight; + zEye += eyedist * zRight; + + /* recalculate using new eye */ + xLook = xAt - xEye; + yLook = yAt - yEye; + zLook = zAt - zEye; + + /* Negate because positive Z is behind us: */ + len = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook); + xLook *= len; + yLook *= len; + zLook *= len; + + /* Right = Up x Look */ + + xRight = yUp * zLook - zUp * yLook; + yRight = zUp * xLook - xUp * zLook; + zRight = xUp * yLook - yUp * xLook; + len = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight); + xRight *= len; + yRight *= len; + zRight *= len; + + /* Up = Look x Right */ + + xUp = yLook * zRight - zLook * yRight; + yUp = zLook * xRight - xLook * zRight; + zUp = xLook * yRight - yLook * xRight; + len = 1.0 / sqrtf(xUp * xUp + yUp * yUp + zUp * zUp); + xUp *= len; + yUp *= len; + zUp *= len; + + mf[0][0] = xRight; + mf[1][0] = yRight; + mf[2][0] = zRight; + mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); + + mf[0][1] = xUp; + mf[1][1] = yUp; + mf[2][1] = zUp; + mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); + + mf[0][2] = xLook; + mf[1][2] = yLook; + mf[2][2] = zLook; + mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); + + mf[0][3] = 0; + mf[1][3] = 0; + mf[2][3] = 0; + mf[3][3] = 1; +} + +void guLookAtStereo(Mtx* m, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, float yUp, + float zUp, float eyedist) { + Matrix mf; + + guLookAtStereoF(mf, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp, eyedist); + + guMtxF2L(mf, m); +} diff --git a/lib/hackerlibultra/src/gu/mtxcatf.c b/lib/hackerlibultra/src/gu/mtxcatf.c new file mode 100644 index 00000000..77acfba5 --- /dev/null +++ b/lib/hackerlibultra/src/gu/mtxcatf.c @@ -0,0 +1,60 @@ + +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: mtxcatf.c + * Creator: hsa@sgi.com + * Create Date: Thu Nov 2 13:03:02 PST 1995 + * + */ + +#include "guint.h" + +void guMtxCatF(float mf[4][4], float nf[4][4], float res[4][4]) { + int i, j, k; + float temp[4][4]; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + temp[i][j] = 0.0; + for (k = 0; k < 4; k++) { + temp[i][j] += mf[i][k] * nf[k][j]; + } + } + } + + /* make sure we handle case where result is an input */ + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + res[i][j] = temp[i][j]; + } + } +} + +void guMtxXFMF(float mf[4][4], float x, float y, float z, float* ox, float* oy, float* oz) { + *ox = mf[0][0] * x + mf[1][0] * y + mf[2][0] * z + mf[3][0]; + *oy = mf[0][1] * x + mf[1][1] * y + mf[2][1] * z + mf[3][1]; + *oz = mf[0][2] * x + mf[1][2] * y + mf[2][2] * z + mf[3][2]; +} diff --git a/lib/hackerlibultra/src/gu/mtxcatl.c b/lib/hackerlibultra/src/gu/mtxcatl.c new file mode 100644 index 00000000..42093397 --- /dev/null +++ b/lib/hackerlibultra/src/gu/mtxcatl.c @@ -0,0 +1,55 @@ + +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: mtxcatl.c + * Creator: hsa@sgi.com + * Create Date: Thu Nov 2 13:03:02 PST 1995 + * + */ + +#include "guint.h" +#include "os_version.h" + +void guMtxCatL(Mtx* m, Mtx* n, Mtx* res) { + float mf[4][4], nf[4][4], resf[4][4]; + + guMtxL2F(mf, m); + guMtxL2F(nf, n); + + guMtxCatF(mf, nf, resf); + + guMtxF2L(resf, res); +} + +#if BUILD_VERSION < VERSION_K +void guMtxXFML(Mtx* m, float x, float y, float z, float* ox, float* oy, float* oz) { + float mf[4][4]; + + guMtxL2F(mf, m); + + guMtxXFMF(mf, x, y, z, ox, oy, oz); +} +#endif diff --git a/lib/hackerlibultra/src/gu/mtxutil.c b/lib/hackerlibultra/src/gu/mtxutil.c new file mode 100644 index 00000000..68cd6933 --- /dev/null +++ b/lib/hackerlibultra/src/gu/mtxutil.c @@ -0,0 +1,70 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +void guMtxF2L(float mf[4][4], Mtx* m) { + int i, j; + int e1, e2; + int *ai, *af; + + ai = (int*)&m->m[0][0]; + af = (int*)&m->m[2][0]; + + for (i = 0; i < 4; i++) + for (j = 0; j < 2; j++) { + e1 = FTOFIX32(mf[i][j * 2]); + e2 = FTOFIX32(mf[i][j * 2 + 1]); + *(ai++) = (e1 & 0xffff0000) | ((e2 >> 16) & 0xffff); + *(af++) = ((e1 << 16) & 0xffff0000) | (e2 & 0xffff); + } +} + +void guMtxL2F(float mf[4][4], Mtx* m) { + int i, j; + unsigned int e1, e2; + unsigned int *ai, *af; + int q1, q2; + + ai = (unsigned int*)&m->m[0][0]; + af = (unsigned int*)&m->m[2][0]; + + for (i = 0; i < 4; i++) + for (j = 0; j < 2; j++) { + e1 = (*ai & 0xffff0000) | ((*af >> 16) & 0xffff); + e2 = ((*(ai++) << 16) & 0xffff0000) | (*(af++) & 0xffff); + q1 = *((int*)&e1); + q2 = *((int*)&e2); + + mf[i][j * 2] = FIX32TOF(q1); + mf[i][j * 2 + 1] = FIX32TOF(q2); + } +} + +void guMtxIdentF(float mf[4][4]) { + int i, j; + + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + if (i == j) + mf[i][j] = 1.0; + else + mf[i][j] = 0.0; +} + +void guMtxIdent(Mtx* m) { + float mf[4][4]; + + guMtxIdentF(mf); + + guMtxF2L(mf, m); +} diff --git a/lib/ultra/gu/libm_vals.c b/lib/hackerlibultra/src/gu/normalize.c similarity index 68% rename from lib/ultra/gu/libm_vals.c rename to lib/hackerlibultra/src/gu/normalize.c index d3d845e7..82185a74 100644 --- a/lib/ultra/gu/libm_vals.c +++ b/lib/hackerlibultra/src/gu/normalize.c @@ -1,15 +1,22 @@ /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" -const fu __libm_qnan = { 0x7f810000 }; +void guNormalize(float* x, float* y, float* z) { + float m; + + m = 1 / sqrtf((*x) * (*x) + (*y) * (*y) + (*z) * (*z)); + *x *= m; + *y *= m; + *z *= m; +} diff --git a/lib/ultra/gu/ortho.c b/lib/hackerlibultra/src/gu/ortho.c similarity index 55% rename from lib/ultra/gu/ortho.c rename to lib/hackerlibultra/src/gu/ortho.c index 15efbf42..7e260736 100644 --- a/lib/ultra/gu/ortho.c +++ b/lib/hackerlibultra/src/gu/ortho.c @@ -1,40 +1,37 @@ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" -void guOrthoF(float mf[4][4], float l, float r, float b, float t, float n, float f, float scale) -{ - int i, j; +void guOrthoF(float mf[4][4], float l, float r, float b, float t, float n, float f, float scale) { + int i, j; guMtxIdentF(mf); - mf[0][0] = 2/(r-l); - mf[1][1] = 2/(t-b); - mf[2][2] = -2/(f-n); - mf[3][0] = -(r+l)/(r-l); - mf[3][1] = -(t+b)/(t-b); - mf[3][2] = -(f+n)/(f-n); + mf[0][0] = 2 / (r - l); + mf[1][1] = 2 / (t - b); + mf[2][2] = -2 / (f - n); + mf[3][0] = -(r + l) / (r - l); + mf[3][1] = -(t + b) / (t - b); + mf[3][2] = -(f + n) / (f - n); mf[3][3] = 1; - for (i=0; i<4; i++) - for (j=0; j<4; j++) - mf[i][j] *= scale; + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + mf[i][j] *= scale; } -void guOrtho(Mtx *m, float l, float r, float b, float t, float n, float f, float scale) -{ - Matrix mf; +void guOrtho(Mtx* m, float l, float r, float b, float t, float n, float f, float scale) { + Matrix mf; guOrthoF(mf, l, r, b, t, n, f, scale); diff --git a/lib/hackerlibultra/src/gu/parse_gbi.c b/lib/hackerlibultra/src/gu/parse_gbi.c new file mode 100644 index 00000000..fde90223 --- /dev/null +++ b/lib/hackerlibultra/src/gu/parse_gbi.c @@ -0,0 +1,130 @@ + +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ +#include +#include +#include + +#ifndef _FINALROM + +/* + * guParseGbiDL works in conjunction with the dlprint tool. dlprint must be + * running on the host Indy. guParseGbiDL, sends a bunch of blocks of data, + * with a minimum of one display list, but typically, the principle display + * list with a bunch of branched or nested display lists, as well as all the + * vertex and matrix data that will be used. After all the blocks of data + * are sent, a GU_PARSE_READY command is sent, and dlprint parses out the + * data printing it to stdout. + * + * In order to know what data to send, guParseGbiDL must step through the + * display list, find all the gSPDisplayList and gSPBranchList calls, go + * to those lists, and also find and send info for all the matrix and vertex + * calls. + */ +void guParseGbiDL(u64* gbi_dl, u32 nbytes, u8 flags) { + guDLPrintCB cntlBlk; + Gfx* dlStk[11]; + s32 dlcount = 0; + Gfx *curGfx, *dlPtr, *vaddr; + s8 op; + u32* word0; + u32* word1; + u32 segments[16]; + u32 param, seg; + u32 paddr, len; + + cntlBlk.dataSize = nbytes; + cntlBlk.flags = flags; + cntlBlk.dlType = GU_PARSE_GBI_TYPE; + cntlBlk.paddr = osVirtualToPhysical(gbi_dl); + + osWriteHost(&cntlBlk, sizeof(cntlBlk)); + osWriteHost(gbi_dl, nbytes); + + dlStk[0] = (Gfx*)gbi_dl; + while ((dlcount >= 0) && (dlcount <= 10)) { + curGfx = dlStk[dlcount]; /* get the current graphics display list */ + op = *((s8*)curGfx); /* get the first byte */ + dlStk[dlcount]++; /* increment to next gfx command */ + switch (op) { + case G_MOVEWORD: + word0 = (u32*)curGfx; /* get ptr to first word */ + if (((*word0) & 0x000000ff) == G_MW_SEGMENT) { + u32 seg; + seg = (((*word0) & 0x00ffff00) >> 8) >> 2; + word1 = word0 + 1; + segments[seg] = *word1; + } + break; + case G_ENDDL: + dlcount--; + break; + case G_DL: + word0 = (u32*)curGfx; /* get ptr to first word */ + param = ((*word0) & 0x00ff0000) >> 16; /* get param */ + word1 = word0 + 1; /* get pointer to second word */ +#if BUILD_VERSION >= VERSION_J + seg = ((*word1) & 0x0f000000) >> 24; /* get the segment */ +#else + seg = ((*word1) & 0xff000000) >> 24; /* get the segment */ +#endif + paddr = segments[seg] + ((*word1) & 0x00ffffff); + vaddr = (Gfx*)osPhysicalToVirtual(paddr); + len = 1; + dlPtr = vaddr; + while ((*(s8*)dlPtr) != G_ENDDL) { + len++; + dlPtr++; + } + len *= sizeof(Gfx); + + cntlBlk.dataSize = len; + cntlBlk.dlType = GU_PARSE_GBI_TYPE; + cntlBlk.paddr = paddr; + + osWriteHost(&cntlBlk, sizeof(cntlBlk)); + osWriteHost((u8*)vaddr, len); + if (param == G_DL_PUSH) { + if (dlcount < 10) + dlcount++; + else + osSyncPrintf("Display lists nested too deep!!!\n"); + } + dlStk[dlcount] = (Gfx*)vaddr; + break; + case G_VTX: + case G_MOVEMEM: + case G_MTX: + word0 = (u32*)curGfx; /* get ptr to first word */ + word1 = word0 + 1; /* get pointer to second word */ +#if BUILD_VERSION >= VERSION_J + seg = ((*word1) & 0x0f000000) >> 24; /* get the segment */ +#else + seg = ((*word1) & 0xff000000) >> 24; /* get the segment */ +#endif + paddr = segments[seg] + ((*word1) & 0x00ffffff); + vaddr = (Gfx*)osPhysicalToVirtual(paddr); + len = (*word0) & 0x0000ffff; + cntlBlk.dataSize = len; /* always send 32 bytes, the most used */ + cntlBlk.dlType = GU_PARSE_MEM_BLOCK; + cntlBlk.paddr = paddr; + osWriteHost(&cntlBlk, sizeof(cntlBlk)); + osWriteHost((u8*)vaddr, len); + break; + } + } + + cntlBlk.dlType = GU_PARSE_READY; + osWriteHost(&cntlBlk, sizeof(cntlBlk)); +} + +#endif diff --git a/lib/hackerlibultra/src/gu/parse_rdp.c b/lib/hackerlibultra/src/gu/parse_rdp.c new file mode 100644 index 00000000..aef29a9d --- /dev/null +++ b/lib/hackerlibultra/src/gu/parse_rdp.c @@ -0,0 +1,34 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ +#include +#include +#include + +/* guParseRdpDL works in conjunction with dlprint which must be running on + * the host Indy. guParseRdpDL simple uses the hostio routines to send the + * display list to the Indy, and dlprint does all the parsing. + */ + +#ifndef _FINALROM +void guParseRdpDL(u64* rdp_dl, u64 nbytes, u8 flags) { + guDLPrintCB cntlBlk; + + cntlBlk.dataSize = nbytes; + cntlBlk.flags = flags; + cntlBlk.dlType = GU_PARSE_RDP_TYPE; + cntlBlk.paddr = osVirtualToPhysical(rdp_dl); + + osWriteHost(&cntlBlk, sizeof(cntlBlk)); + osWriteHost(rdp_dl, nbytes); +} + +#endif diff --git a/lib/hackerlibultra/src/gu/parse_string.c b/lib/hackerlibultra/src/gu/parse_string.c new file mode 100644 index 00000000..e64e45e6 --- /dev/null +++ b/lib/hackerlibultra/src/gu/parse_string.c @@ -0,0 +1,33 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + *************************************************************************/ +#include +#include +#include + +/* guParseString works in conjunction with dlprint which must be running on + * the host Indy. guParseString simply uses the hostio routines to send the + * string to the Indy, and dlprint does all the parsing. + */ + +#ifndef _FINALROM +void guParseString(char* StringPointer, u64 nbytes) { + guDLPrintCB cntlBlk; + + cntlBlk.dataSize = nbytes /* /8 + ((nbytes%8) != 0) */; + cntlBlk.dlType = GU_PARSE_STRING_TYPE; + cntlBlk.paddr = osVirtualToPhysical((u64*)StringPointer); + + osWriteHost(&cntlBlk, sizeof(cntlBlk)); + osWriteHost((u64*)StringPointer, nbytes); +} + +#endif diff --git a/lib/ultra/gu/perspective.c b/lib/hackerlibultra/src/gu/perspective.c similarity index 50% rename from lib/ultra/gu/perspective.c rename to lib/hackerlibultra/src/gu/perspective.c index f5f9fc84..1e7a274b 100644 --- a/lib/ultra/gu/perspective.c +++ b/lib/hackerlibultra/src/gu/perspective.c @@ -1,27 +1,27 @@ /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" +#include -void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, float near, float far, float scale) -{ - float cot; - int i, j; +void guPerspectiveF(float mf[4][4], u16* perspNorm, float fovy, float aspect, float near, float far, float scale) { + float cot; + int i, j; guMtxIdentF(mf); - fovy *= GU_PI / 180.0; - cot = cosf (fovy/2) / sinf (fovy/2); + fovy *= 3.1415926 / 180.0; + cot = cosf(fovy / 2) / sinf(fovy / 2); mf[0][0] = cot / aspect; mf[1][1] = cot; @@ -30,24 +30,23 @@ void guPerspectiveF(float mf[4][4], u16 *perspNorm, float fovy, float aspect, fl mf[3][2] = (2 * near * far) / (near - far); mf[3][3] = 0; - for (i=0; i<4; i++) - for (j=0; j<4; j++) - mf[i][j] *= scale; + for (i = 0; i < 4; i++) + for (j = 0; j < 4; j++) + mf[i][j] *= scale; - if (perspNorm != (u16 *) NULL) { - if (near+far<=2.0) { - *perspNorm = (u16) 0xFFFF; - } else { - *perspNorm = (u16) ((2.0*65536.0)/(near+far)); - if (*perspNorm<=0) - *perspNorm = (u16) 0x0001; + if (perspNorm != (u16*)NULL) { + if (near + far <= 2.0) { + *perspNorm = (u16)0xFFFF; + } else { + *perspNorm = (u16)((2.0 * 65536.0) / (near + far)); + if (*perspNorm <= 0) + *perspNorm = (u16)0x0001; } } } -void guPerspective(Mtx *m, u16 *perspNorm, float fovy, float aspect, float near, float far, float scale) -{ - Matrix mf; +void guPerspective(Mtx* m, u16* perspNorm, float fovy, float aspect, float near, float far, float scale) { + Matrix mf; guPerspectiveF(mf, perspNorm, fovy, aspect, near, far, scale); diff --git a/lib/hackerlibultra/src/gu/position.c b/lib/hackerlibultra/src/gu/position.c new file mode 100644 index 00000000..94bb2e83 --- /dev/null +++ b/lib/hackerlibultra/src/gu/position.c @@ -0,0 +1,69 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* + * Return position matrix given roll, pitch, and yaw in degrees + * plus scale and position. + * + * r = roll (degrees) + * p = pitch (degrees) + * h = yaw (degrees) + * s = scale + * x,y,z = position (world coordinates) + * + */ + +void guPositionF(float mf[4][4], float r, float p, float h, float s, float x, float y, float z) { + static float dtor = 3.1415926 / 180.0; + float sinr, sinp, sinh; + float cosr, cosp, cosh; + + r *= dtor; + p *= dtor; + h *= dtor; + sinr = sinf(r); + cosr = cosf(r); + sinp = sinf(p); + cosp = cosf(p); + sinh = sinf(h); + cosh = cosf(h); + + mf[0][0] = (cosp * cosh) * s; + mf[0][1] = (cosp * sinh) * s; + mf[0][2] = (-sinp) * s; + mf[0][3] = 0.0; + + mf[1][0] = (sinr * sinp * cosh - cosr * sinh) * s; + mf[1][1] = (sinr * sinp * sinh + cosr * cosh) * s; + mf[1][2] = (sinr * cosp) * s; + mf[1][3] = 0.0; + + mf[2][0] = (cosr * sinp * cosh + sinr * sinh) * s; + mf[2][1] = (cosr * sinp * sinh - sinr * cosh) * s; + mf[2][2] = (cosr * cosp) * s; + mf[2][3] = 0.0; + + mf[3][0] = x; + mf[3][1] = y; + mf[3][2] = z; + mf[3][3] = 1.0; +} + +void guPosition(Mtx* m, float r, float p, float h, float s, float x, float y, float z) { + float mf[4][4]; + + guPositionF(mf, r, p, h, s, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/hackerlibultra/src/gu/poslight.c b/lib/hackerlibultra/src/gu/poslight.c new file mode 100644 index 00000000..4d0948c3 --- /dev/null +++ b/lib/hackerlibultra/src/gu/poslight.c @@ -0,0 +1,64 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* + * define a positional light. + * this function must be called anytime the light or object moves. + * + * pl = (input) positional light description. + * l = (output) directiona light description for gSPLight or gSPSetLightsN. + * *Ob = position of (center of) object to be lit. + * + */ +#define THRESH1 0.01 +#define THRESH2 0.1 +void guPosLight(PositionalLight* pl, Light* l, float xOb, float yOb, float zOb) { + float x, y, z, d, a; + + x = pl->pos[0] - xOb; + y = pl->pos[1] - yOb; + z = pl->pos[2] - zOb; + d = sqrtf(x * x + y * y + z * z); + + a = d * pl->a1 + pl->a2; + if (a < THRESH1) + a = 100.0; + else + a = 1 / a; + + if (d < THRESH1) { + l->l.dir[0] = 0; + l->l.dir[1] = 0; + l->l.dir[2] = -120; + + l->l.col[0] = 0; + l->l.col[1] = 0; + l->l.col[2] = 0; + l->l.colc[0] = 0; + l->l.colc[1] = 0; + l->l.colc[2] = 0; + } else { + d = 1 / d; + l->l.dir[0] = 120.0 * x * d; + l->l.dir[1] = 120.0 * y * d; + l->l.dir[2] = 120.0 * z * d; + + l->l.col[0] = pl->col[0] * a; + l->l.col[1] = pl->col[1] * a; + l->l.col[2] = pl->col[2] * a; + l->l.colc[0] = pl->col[0] * a; + l->l.colc[1] = pl->col[1] * a; + l->l.colc[2] = pl->col[2] * a; + } +} diff --git a/lib/hackerlibultra/src/gu/poslighthil.c b/lib/hackerlibultra/src/gu/poslighthil.c new file mode 100644 index 00000000..e0119cca --- /dev/null +++ b/lib/hackerlibultra/src/gu/poslighthil.c @@ -0,0 +1,154 @@ +/************************************************************************** + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* + * define 2 positional lights with highlights. + * this function must be called anytime the viewpoint, light or object moves. + * + * pl1 = (input) positional light#1 description. + * pl2 = (input) positional light#2 description. + * l1 = (output) directional light desc. #1 for gSPLight or gSPSetLightsN. + * l2 = (output) directional light desc. #2 for gSPLight or gSPSetLightsN. + * *Eye = position of eye (viewpoint). (usually same as in LookAt command.) + * *Ob = position of (center of) object to be lit. + * *Ob = up vector (usually same as in LookAt command). + * twidth = width of texture map used for highlight. + * theight = height of texture map used for highlight. + * + */ +#define THRESH2 0.01 +#define THRESH3 0.1 +void guPosLightHilite(PositionalLight* pl1, PositionalLight* pl2, Light* l1, Light* l2, LookAt* l, Hilite* h, + float xEye, float yEye, float zEye, float xOb, float yOb, float zOb, float xUp, float yUp, + float zUp, int twidth, int theight) /* hilite txtr size*/ +{ + float x, y, z, d, a; + Mtx m; + + /* + * light 1, diffuse + */ + x = pl1->pos[0] - xOb; + y = pl1->pos[1] - yOb; + z = pl1->pos[2] - zOb; + d = sqrtf(x * x + y * y + z * z); + + a = d * pl1->a1 + pl1->a2; + if (a < THRESH2) + a = 100.0; + else + a = 1 / a; + + if (d < THRESH2) { + l1->l.dir[0] = 0; + l1->l.dir[1] = 0; + l1->l.dir[2] = -120; + + l1->l.col[0] = 0; + l1->l.col[1] = 0; + l1->l.col[2] = 0; + l1->l.colc[0] = 0; + l1->l.colc[1] = 0; + l1->l.colc[2] = 0; + } else { + d = 1 / d; + l1->l.dir[0] = 120.0 * x * d; + l1->l.dir[1] = 120.0 * y * d; + l1->l.dir[2] = 120.0 * z * d; + + l1->l.col[0] = pl1->col[0] * a; + l1->l.col[1] = pl1->col[1] * a; + l1->l.col[2] = pl1->col[2] * a; + l1->l.colc[0] = pl1->col[0] * a; + l1->l.colc[1] = pl1->col[1] * a; + l1->l.colc[2] = pl1->col[2] * a; + } + + /* + * light 2, diffuse + */ + x = pl2->pos[0] - xOb; + y = pl2->pos[1] - yOb; + z = pl2->pos[2] - zOb; + d = sqrtf(x * x + y * y + z * z); + + a = d * pl2->a1 + pl2->a2; + if (a < THRESH2) + a = 100.0; + else + a = 1 / a; + + if (d < THRESH2) { + l2->l.dir[0] = 0; + l2->l.dir[1] = 0; + l2->l.dir[2] = -120; + + l2->l.col[0] = 0; + l2->l.col[1] = 0; + l2->l.col[2] = 0; + l2->l.colc[0] = 0; + l2->l.colc[1] = 0; + l2->l.colc[2] = 0; + } else { + d = 1 / d; + l2->l.dir[0] = 120.0 * x * d; + l2->l.dir[1] = 120.0 * y * d; + l2->l.dir[2] = 120.0 * z * d; + + l2->l.col[0] = pl2->col[0] * a; + l2->l.col[1] = pl2->col[1] * a; + l2->l.col[2] = pl2->col[2] * a; + l2->l.colc[0] = pl2->col[0] * a; + l2->l.colc[1] = pl2->col[1] * a; + l2->l.colc[2] = pl2->col[2] * a; + } + + /* + * Hilight factors + */ + x = xOb - xEye; + y = yOb - yEye; + z = zOb - zEye; + if (sqrtf(x * x + y * y + z * z) < THRESH3) { + h->h.x1 = twidth * 2; + h->h.y1 = twidth * 2; + h->h.x2 = twidth * 2; + h->h.y2 = twidth * 2; + l->l[0].l.dir[0] = 0; + l->l[0].l.dir[1] = 0; + l->l[0].l.dir[2] = 0; + l->l[1].l.dir[0] = 0; + l->l[1].l.dir[1] = 0; + l->l[1].l.dir[2] = 0; + l->l[0].l.col[0] = 0x00; + l->l[0].l.col[1] = 0x00; + l->l[0].l.col[2] = 0x00; + l->l[0].l.pad1 = 0x00; + l->l[0].l.colc[0] = 0x00; + l->l[0].l.colc[1] = 0x00; + l->l[0].l.colc[2] = 0x00; + l->l[0].l.pad2 = 0x00; + l->l[1].l.col[0] = 0x00; + l->l[1].l.col[1] = 0x80; + l->l[1].l.col[2] = 0x00; + l->l[1].l.pad1 = 0x00; + l->l[1].l.colc[0] = 0x00; + l->l[1].l.colc[1] = 0x80; + l->l[1].l.colc[2] = 0x00; + l->l[1].l.pad2 = 0x00; + } else { + guLookAtHilite(&m, l, h, xEye, yEye, zEye, xOb, yOb, zOb, xUp, yUp, zUp, l1->l.dir[0], l1->l.dir[1], + l1->l.dir[2], l2->l.dir[0], l2->l.dir[1], l2->l.dir[2], twidth, theight); + } +} diff --git a/lib/ultra/gu/normalize.c b/lib/hackerlibultra/src/gu/random.c similarity index 57% rename from lib/ultra/gu/normalize.c rename to lib/hackerlibultra/src/gu/random.c index 27172b0a..0dad51b0 100644 --- a/lib/ultra/gu/normalize.c +++ b/lib/hackerlibultra/src/gu/random.c @@ -1,28 +1,32 @@ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1995, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" -#if LIBULTRA_VERSION < OS_VER_K || !defined(TARGET_N64) +/* + * Return a pseudorandom 32 bit number + * try the RAND macro too + * + */ +int guRandom(void) { + static unsigned int xseed = 174823885; + unsigned int x; -void guNormalize(float *x, float *y, float *z) -{ - float m; + x = (xseed << 2) + 2; - m = 1/sqrtf((*x)*(*x) + (*y)*(*y) + (*z)*(*z)); - *x *= m; - *y *= m; - *z *= m; + x *= (x + 1); + x = x >> 2; + + xseed = x; + + return (x); } - -#endif diff --git a/lib/hackerlibultra/src/gu/readme.txt b/lib/hackerlibultra/src/gu/readme.txt new file mode 100644 index 00000000..114174ed --- /dev/null +++ b/lib/hackerlibultra/src/gu/readme.txt @@ -0,0 +1,17 @@ +Among the gu Functions, the following were replaced with the newly +created high speed versions. With the current version OS they are +not being used. + +guMtxIdent +guMtxIdentF +guScale +guScaleF +guNormalize +guTranslate +guTranslateF +guMtxF2L +guRotateF +guMtxL2F +guMtxCatF + +The newly created functions are installed in the mgu directory. diff --git a/lib/ultra/gu/rotate.c b/lib/hackerlibultra/src/gu/rotate.c similarity index 51% rename from lib/ultra/gu/rotate.c rename to lib/hackerlibultra/src/gu/rotate.c index 901a1793..acf81bf1 100644 --- a/lib/ultra/gu/rotate.c +++ b/lib/hackerlibultra/src/gu/rotate.c @@ -1,24 +1,24 @@ /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" +#include "os_version.h" -void guRotateF(float mf[4][4], float a, float x, float y, float z) -{ - static float dtor = GU_PI / 180.0; - float sine; - float cosine; - float ab, bc, ca, t; -#if LIBULTRA_VERSION >= OS_VER_K +void guRotateF(float mf[4][4], float a, float x, float y, float z) { + static float dtor = 3.1415926 / 180.0; + float sine; + float cosine; + float ab, bc, ca, t; +#if BUILD_VERSION >= VERSION_K float xxsine; float yxsine; float zxsine; @@ -28,42 +28,41 @@ void guRotateF(float mf[4][4], float a, float x, float y, float z) a *= dtor; sine = sinf(a); cosine = cosf(a); - t = (1-cosine); - ab = x*y*t; - bc = y*z*t; - ca = z*x*t; + t = (1 - cosine); + ab = x * y * t; + bc = y * z * t; + ca = z * x * t; guMtxIdentF(mf); -#if LIBULTRA_VERSION >= OS_VER_K +#if BUILD_VERSION >= VERSION_K xxsine = x * sine; yxsine = y * sine; zxsine = z * sine; #else - #define xxsine (x * sine) - #define yxsine (y * sine) - #define zxsine (z * sine) +#define xxsine (x * sine) +#define yxsine (y * sine) +#define zxsine (z * sine) #endif - t = x*x; - mf[0][0] = t+cosine*(1-t); - mf[2][1] = bc-xxsine; - mf[1][2] = bc+xxsine; + t = x * x; + mf[0][0] = t + cosine * (1 - t); + mf[2][1] = bc - xxsine; + mf[1][2] = bc + xxsine; - t = y*y; - mf[1][1] = t+cosine*(1-t); - mf[2][0] = ca+yxsine; - mf[0][2] = ca-yxsine; + t = y * y; + mf[1][1] = t + cosine * (1 - t); + mf[2][0] = ca + yxsine; + mf[0][2] = ca - yxsine; - t = z*z; - mf[2][2] = t+cosine*(1-t); - mf[1][0] = ab-zxsine; - mf[0][1] = ab+zxsine; + t = z * z; + mf[2][2] = t + cosine * (1 - t); + mf[1][0] = ab - zxsine; + mf[0][1] = ab + zxsine; } -void guRotate(Mtx *m, float a, float x, float y, float z) -{ - Matrix mf; +void guRotate(Mtx* m, float a, float x, float y, float z) { + Matrix mf; guRotateF(mf, a, x, y, z); diff --git a/lib/hackerlibultra/src/gu/rotaterpy.c b/lib/hackerlibultra/src/gu/rotaterpy.c new file mode 100644 index 00000000..032a0711 --- /dev/null +++ b/lib/hackerlibultra/src/gu/rotaterpy.c @@ -0,0 +1,56 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* + * Return rotation matrix given roll, pitch, and yaw in degrees + * + */ + +void guRotateRPYF(float mf[4][4], float r, float p, float h) { + static float dtor = 3.1415926 / 180.0; + float sinr, sinp, sinh; + float cosr, cosp, cosh; + + r *= dtor; + p *= dtor; + h *= dtor; + sinr = sinf(r); + cosr = cosf(r); + sinp = sinf(p); + cosp = cosf(p); + sinh = sinf(h); + cosh = cosf(h); + + guMtxIdentF(mf); + + mf[0][0] = cosp * cosh; + mf[0][1] = cosp * sinh; + mf[0][2] = -sinp; + + mf[1][0] = sinr * sinp * cosh - cosr * sinh; + mf[1][1] = sinr * sinp * sinh + cosr * cosh; + mf[1][2] = sinr * cosp; + + mf[2][0] = cosr * sinp * cosh + sinr * sinh; + mf[2][1] = cosr * sinp * sinh - sinr * cosh; + mf[2][2] = cosr * cosp; +} + +void guRotateRPY(Mtx* m, float r, float p, float h) { + Matrix mf; + + guRotateRPYF(mf, r, p, h); + + guMtxF2L(mf, m); +} diff --git a/lib/ultra/gu/scale.c b/lib/hackerlibultra/src/gu/scale.c similarity index 64% rename from lib/ultra/gu/scale.c rename to lib/hackerlibultra/src/gu/scale.c index 1a202e37..594d043c 100644 --- a/lib/ultra/gu/scale.c +++ b/lib/hackerlibultra/src/gu/scale.c @@ -1,22 +1,18 @@ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" -#if LIBULTRA_VERSION < OS_VER_K || !defined(TARGET_N64) - -void guScaleF(float mf[4][4], float x, float y, float z) -{ +void guScaleF(float mf[4][4], float x, float y, float z) { guMtxIdentF(mf); mf[0][0] = x; @@ -25,13 +21,10 @@ void guScaleF(float mf[4][4], float x, float y, float z) mf[3][3] = 1; } -void guScale(Mtx *m, float x, float y, float z) -{ - Matrix mf; +void guScale(Mtx* m, float x, float y, float z) { + Matrix mf; guScaleF(mf, x, y, z); guMtxF2L(mf, m); } - -#endif diff --git a/lib/ultra/gu/sinf.c b/lib/hackerlibultra/src/gu/sinf.c similarity index 52% rename from lib/ultra/gu/sinf.c rename to lib/hackerlibultra/src/gu/sinf.c index 5a8f35ae..e1278211 100644 --- a/lib/ultra/gu/sinf.c +++ b/lib/hackerlibultra/src/gu/sinf.c @@ -1,14 +1,13 @@ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" @@ -25,109 +24,106 @@ * Revision history: * 09-Jun-93 - Original Version * - * Description: source code for fsin function + * Description: source code for fsin function * * ==================================================================== * ==================================================================== */ +#pragma weak fsin = __sinf +#pragma weak sinf = __sinf +#define fsin __sinf + /* coefficients for polynomial approximation of sin on +/- pi/2 */ -static const du P[] = { -{{0x3ff00000, 0x00000000}}, -{{0xbfc55554, 0xbc83656d}}, -{{0x3f8110ed, 0x3804c2a0}}, -{{0xbf29f6ff, 0xeea56814}}, -{{0x3ec5dbdf, 0x0e314bfe}}, +static const du P[] = { + { 0x3ff00000, 0x00000000 }, { 0xbfc55554, 0xbc83656d }, { 0x3f8110ed, 0x3804c2a0 }, + { 0xbf29f6ff, 0xeea56814 }, { 0x3ec5dbdf, 0x0e314bfe }, }; -static const du rpi = { -{0x3fd45f30, 0x6dc9c883} -}; +static const du rpi = { 0x3fd45f30, 0x6dc9c883 }; -static const du pihi = { -{0x400921fb, 0x50000000} -}; +static const du pihi = { 0x400921fb, 0x50000000 }; -static const du pilo = { -{0x3e6110b4, 0x611a6263} -}; +static const du pilo = { 0x3e6110b4, 0x611a6263 }; -static const fu zero = {0x00000000}; +static const fu zero = { 0x00000000 }; -float sinf(float x) -{ -double dx, xsq, poly; -double dn; -int n; -double result; -int ix, xpt; +/* ==================================================================== + * + * FunctionName fsin + * + * Description computes sine of arg + * + * ==================================================================== + */ +float fsin(float x) { + double dx, xsq, poly; + double dn; + int n; + double result; + int ix, xpt; - ix = *(int *)&x; + ix = *(int*)&x; xpt = (ix >> 22); xpt &= 0x1ff; /* xpt is exponent(x) + 1 bit of mantissa */ - if ( xpt < 0xff ) - { + if (xpt < 0xff) { /* |x| < 1.5 */ dx = x; - if ( xpt >= 0xe6 ) - { + if (xpt >= 0xe6) { /* |x| >= 2^(-12) */ /* compute sin(x) with a standard polynomial approximation */ - xsq = dx*dx; + xsq = dx * dx; - poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + poly = ((P[4].d * xsq + P[3].d) * xsq + P[2].d) * xsq + P[1].d; - result = dx + (dx*xsq)*poly; + result = dx + (dx * xsq) * poly; - return ( (float)result ); + return ((float)result); } - return ( x ); + return (x); } - if ( xpt < 0x136 ) - { + if (xpt < 0x136) { /* |x| < 2^28 */ dx = x; /* reduce argument to +/- pi/2 */ - dn = dx*rpi.d; + dn = dx * rpi.d; n = ROUND(dn); dn = n; - dx = dx - dn*pihi.d; - dx = dx - dn*pilo.d; /* dx = x - n*pi */ + dx = dx - dn * pihi.d; + dx = dx - dn * pilo.d; /* dx = x - n*pi */ /* compute sin(dx) as before, negating result if n is odd - */ + */ - xsq = dx*dx; + xsq = dx * dx; - poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + poly = ((P[4].d * xsq + P[3].d) * xsq + P[2].d) * xsq + P[1].d; - result = dx + (dx*xsq)*poly; + result = dx + (dx * xsq) * poly; + if ((n & 1) == 0) + return ((float)result); - if ( (n & 1) == 0 ) - return ( (float)result ); - - return ( -(float)result ); + return (-(float)result); } - if ( x != x ) - { + if (x != x) { /* x is a NaN; return a quiet NaN */ #ifdef _IP_NAN_SETS_ERRNO @@ -135,10 +131,10 @@ int ix, xpt; *__errnoaddr = EDOM; #endif - return ( __libm_qnan.f ); + return (__libm_qnan_f); } /* just give up and return 0.0 */ - return ( zero.f ); + return (zero.f); } diff --git a/lib/hackerlibultra/src/gu/sins.c b/lib/hackerlibultra/src/gu/sins.c new file mode 100644 index 00000000..28313bc0 --- /dev/null +++ b/lib/hackerlibultra/src/gu/sins.c @@ -0,0 +1,59 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "guint.h" + +/* ==================================================================== + * ==================================================================== + * + * Module: sins.c + * $Revision: 1.3 $ + * $Date: 1998/10/09 06:15:00 $ + * $Author: has $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/libultra/monegi/gu/sins.c,v $ + * + * ==================================================================== + * ==================================================================== + */ + +/* coefficients for polynomial approximation of sin on +/- pi/2 */ + +/* ==================================================================== + * + * FunctionName sins + * + * Description computes sine of arg + * + * ==================================================================== + */ + +#include "sintable.h" + +signed short sins(unsigned short x) { + /* 0 <= x < 0x10000 ==> 0 <= x < 2PI */ + + signed short val; + + x >>= 4; /* Now range 0 <= x < 0x1000 */ + + if (x & 0x400) { + val = sintable[0x3ff - (x & 0x3ff)]; + } else { + val = sintable[x & 0x3ff]; + } + + if (x & 0x800) { + return -val; + } else { + return val; + } +} diff --git a/lib/hackerlibultra/src/gu/sintable.h b/lib/hackerlibultra/src/gu/sintable.h new file mode 100644 index 00000000..00a7423f --- /dev/null +++ b/lib/hackerlibultra/src/gu/sintable.h @@ -0,0 +1,81 @@ + +/* + * Do not edit this file -- it was generated by "maketable". + */ + +static signed short sintable[0x400] = { + 0x0000, 0x0032, 0x0064, 0x0096, 0x00c9, 0x00fb, 0x012d, 0x0160, 0x0192, 0x01c4, 0x01f7, 0x0229, 0x025b, 0x028e, + 0x02c0, 0x02f2, 0x0324, 0x0357, 0x0389, 0x03bb, 0x03ee, 0x0420, 0x0452, 0x0484, 0x04b7, 0x04e9, 0x051b, 0x054e, + 0x0580, 0x05b2, 0x05e4, 0x0617, 0x0649, 0x067b, 0x06ad, 0x06e0, 0x0712, 0x0744, 0x0776, 0x07a9, 0x07db, 0x080d, + 0x083f, 0x0871, 0x08a4, 0x08d6, 0x0908, 0x093a, 0x096c, 0x099f, 0x09d1, 0x0a03, 0x0a35, 0x0a67, 0x0a99, 0x0acb, + 0x0afe, 0x0b30, 0x0b62, 0x0b94, 0x0bc6, 0x0bf8, 0x0c2a, 0x0c5c, 0x0c8e, 0x0cc0, 0x0cf2, 0x0d25, 0x0d57, 0x0d89, + 0x0dbb, 0x0ded, 0x0e1f, 0x0e51, 0x0e83, 0x0eb5, 0x0ee7, 0x0f19, 0x0f4b, 0x0f7c, 0x0fae, 0x0fe0, 0x1012, 0x1044, + 0x1076, 0x10a8, 0x10da, 0x110c, 0x113e, 0x116f, 0x11a1, 0x11d3, 0x1205, 0x1237, 0x1269, 0x129a, 0x12cc, 0x12fe, + 0x1330, 0x1361, 0x1393, 0x13c5, 0x13f6, 0x1428, 0x145a, 0x148c, 0x14bd, 0x14ef, 0x1520, 0x1552, 0x1584, 0x15b5, + 0x15e7, 0x1618, 0x164a, 0x167b, 0x16ad, 0x16df, 0x1710, 0x1741, 0x1773, 0x17a4, 0x17d6, 0x1807, 0x1839, 0x186a, + 0x189b, 0x18cd, 0x18fe, 0x1930, 0x1961, 0x1992, 0x19c3, 0x19f5, 0x1a26, 0x1a57, 0x1a88, 0x1aba, 0x1aeb, 0x1b1c, + 0x1b4d, 0x1b7e, 0x1baf, 0x1be1, 0x1c12, 0x1c43, 0x1c74, 0x1ca5, 0x1cd6, 0x1d07, 0x1d38, 0x1d69, 0x1d9a, 0x1dcb, + 0x1dfc, 0x1e2d, 0x1e5d, 0x1e8e, 0x1ebf, 0x1ef0, 0x1f21, 0x1f52, 0x1f82, 0x1fb3, 0x1fe4, 0x2015, 0x2045, 0x2076, + 0x20a7, 0x20d7, 0x2108, 0x2139, 0x2169, 0x219a, 0x21ca, 0x21fb, 0x222b, 0x225c, 0x228c, 0x22bd, 0x22ed, 0x231d, + 0x234e, 0x237e, 0x23ae, 0x23df, 0x240f, 0x243f, 0x2470, 0x24a0, 0x24d0, 0x2500, 0x2530, 0x2560, 0x2591, 0x25c1, + 0x25f1, 0x2621, 0x2651, 0x2681, 0x26b1, 0x26e1, 0x2711, 0x2740, 0x2770, 0x27a0, 0x27d0, 0x2800, 0x2830, 0x285f, + 0x288f, 0x28bf, 0x28ee, 0x291e, 0x294e, 0x297d, 0x29ad, 0x29dd, 0x2a0c, 0x2a3c, 0x2a6b, 0x2a9b, 0x2aca, 0x2af9, + 0x2b29, 0x2b58, 0x2b87, 0x2bb7, 0x2be6, 0x2c15, 0x2c44, 0x2c74, 0x2ca3, 0x2cd2, 0x2d01, 0x2d30, 0x2d5f, 0x2d8e, + 0x2dbd, 0x2dec, 0x2e1b, 0x2e4a, 0x2e79, 0x2ea8, 0x2ed7, 0x2f06, 0x2f34, 0x2f63, 0x2f92, 0x2fc0, 0x2fef, 0x301e, + 0x304c, 0x307b, 0x30a9, 0x30d8, 0x3107, 0x3135, 0x3163, 0x3192, 0x31c0, 0x31ef, 0x321d, 0x324b, 0x3279, 0x32a8, + 0x32d6, 0x3304, 0x3332, 0x3360, 0x338e, 0x33bc, 0x33ea, 0x3418, 0x3446, 0x3474, 0x34a2, 0x34d0, 0x34fe, 0x352b, + 0x3559, 0x3587, 0x35b5, 0x35e2, 0x3610, 0x363d, 0x366b, 0x3698, 0x36c6, 0x36f3, 0x3721, 0x374e, 0x377c, 0x37a9, + 0x37d6, 0x3803, 0x3831, 0x385e, 0x388b, 0x38b8, 0x38e5, 0x3912, 0x393f, 0x396c, 0x3999, 0x39c6, 0x39f3, 0x3a20, + 0x3a4d, 0x3a79, 0x3aa6, 0x3ad3, 0x3b00, 0x3b2c, 0x3b59, 0x3b85, 0x3bb2, 0x3bde, 0x3c0b, 0x3c37, 0x3c64, 0x3c90, + 0x3cbc, 0x3ce9, 0x3d15, 0x3d41, 0x3d6d, 0x3d99, 0x3dc5, 0x3df1, 0x3e1d, 0x3e49, 0x3e75, 0x3ea1, 0x3ecd, 0x3ef9, + 0x3f25, 0x3f50, 0x3f7c, 0x3fa8, 0x3fd3, 0x3fff, 0x402b, 0x4056, 0x4082, 0x40ad, 0x40d8, 0x4104, 0x412f, 0x415a, + 0x4186, 0x41b1, 0x41dc, 0x4207, 0x4232, 0x425d, 0x4288, 0x42b3, 0x42de, 0x4309, 0x4334, 0x435f, 0x4389, 0x43b4, + 0x43df, 0x4409, 0x4434, 0x445f, 0x4489, 0x44b4, 0x44de, 0x4508, 0x4533, 0x455d, 0x4587, 0x45b1, 0x45dc, 0x4606, + 0x4630, 0x465a, 0x4684, 0x46ae, 0x46d8, 0x4702, 0x472c, 0x4755, 0x477f, 0x47a9, 0x47d2, 0x47fc, 0x4826, 0x484f, + 0x4879, 0x48a2, 0x48cc, 0x48f5, 0x491e, 0x4948, 0x4971, 0x499a, 0x49c3, 0x49ec, 0x4a15, 0x4a3e, 0x4a67, 0x4a90, + 0x4ab9, 0x4ae2, 0x4b0b, 0x4b33, 0x4b5c, 0x4b85, 0x4bad, 0x4bd6, 0x4bfe, 0x4c27, 0x4c4f, 0x4c78, 0x4ca0, 0x4cc8, + 0x4cf0, 0x4d19, 0x4d41, 0x4d69, 0x4d91, 0x4db9, 0x4de1, 0x4e09, 0x4e31, 0x4e58, 0x4e80, 0x4ea8, 0x4ed0, 0x4ef7, + 0x4f1f, 0x4f46, 0x4f6e, 0x4f95, 0x4fbd, 0x4fe4, 0x500b, 0x5032, 0x505a, 0x5081, 0x50a8, 0x50cf, 0x50f6, 0x511d, + 0x5144, 0x516b, 0x5191, 0x51b8, 0x51df, 0x5205, 0x522c, 0x5253, 0x5279, 0x52a0, 0x52c6, 0x52ec, 0x5313, 0x5339, + 0x535f, 0x5385, 0x53ab, 0x53d1, 0x53f7, 0x541d, 0x5443, 0x5469, 0x548f, 0x54b5, 0x54da, 0x5500, 0x5525, 0x554b, + 0x5571, 0x5596, 0x55bb, 0x55e1, 0x5606, 0x562b, 0x5650, 0x5675, 0x569b, 0x56c0, 0x56e5, 0x5709, 0x572e, 0x5753, + 0x5778, 0x579d, 0x57c1, 0x57e6, 0x580a, 0x582f, 0x5853, 0x5878, 0x589c, 0x58c0, 0x58e5, 0x5909, 0x592d, 0x5951, + 0x5975, 0x5999, 0x59bd, 0x59e1, 0x5a04, 0x5a28, 0x5a4c, 0x5a6f, 0x5a93, 0x5ab7, 0x5ada, 0x5afd, 0x5b21, 0x5b44, + 0x5b67, 0x5b8b, 0x5bae, 0x5bd1, 0x5bf4, 0x5c17, 0x5c3a, 0x5c5d, 0x5c7f, 0x5ca2, 0x5cc5, 0x5ce7, 0x5d0a, 0x5d2d, + 0x5d4f, 0x5d71, 0x5d94, 0x5db6, 0x5dd8, 0x5dfa, 0x5e1d, 0x5e3f, 0x5e61, 0x5e83, 0x5ea5, 0x5ec6, 0x5ee8, 0x5f0a, + 0x5f2c, 0x5f4d, 0x5f6f, 0x5f90, 0x5fb2, 0x5fd3, 0x5ff4, 0x6016, 0x6037, 0x6058, 0x6079, 0x609a, 0x60bb, 0x60dc, + 0x60fd, 0x611e, 0x613e, 0x615f, 0x6180, 0x61a0, 0x61c1, 0x61e1, 0x6202, 0x6222, 0x6242, 0x6263, 0x6283, 0x62a3, + 0x62c3, 0x62e3, 0x6303, 0x6323, 0x6342, 0x6362, 0x6382, 0x63a1, 0x63c1, 0x63e0, 0x6400, 0x641f, 0x643f, 0x645e, + 0x647d, 0x649c, 0x64bb, 0x64da, 0x64f9, 0x6518, 0x6537, 0x6556, 0x6574, 0x6593, 0x65b2, 0x65d0, 0x65ef, 0x660d, + 0x662b, 0x664a, 0x6668, 0x6686, 0x66a4, 0x66c2, 0x66e0, 0x66fe, 0x671c, 0x673a, 0x6757, 0x6775, 0x6792, 0x67b0, + 0x67cd, 0x67eb, 0x6808, 0x6825, 0x6843, 0x6860, 0x687d, 0x689a, 0x68b7, 0x68d4, 0x68f1, 0x690d, 0x692a, 0x6947, + 0x6963, 0x6980, 0x699c, 0x69b9, 0x69d5, 0x69f1, 0x6a0e, 0x6a2a, 0x6a46, 0x6a62, 0x6a7e, 0x6a9a, 0x6ab5, 0x6ad1, + 0x6aed, 0x6b08, 0x6b24, 0x6b40, 0x6b5b, 0x6b76, 0x6b92, 0x6bad, 0x6bc8, 0x6be3, 0x6bfe, 0x6c19, 0x6c34, 0x6c4f, + 0x6c6a, 0x6c84, 0x6c9f, 0x6cba, 0x6cd4, 0x6cef, 0x6d09, 0x6d23, 0x6d3e, 0x6d58, 0x6d72, 0x6d8c, 0x6da6, 0x6dc0, + 0x6dda, 0x6df3, 0x6e0d, 0x6e27, 0x6e40, 0x6e5a, 0x6e73, 0x6e8d, 0x6ea6, 0x6ebf, 0x6ed9, 0x6ef2, 0x6f0b, 0x6f24, + 0x6f3d, 0x6f55, 0x6f6e, 0x6f87, 0x6fa0, 0x6fb8, 0x6fd1, 0x6fe9, 0x7002, 0x701a, 0x7032, 0x704a, 0x7062, 0x707a, + 0x7092, 0x70aa, 0x70c2, 0x70da, 0x70f2, 0x7109, 0x7121, 0x7138, 0x7150, 0x7167, 0x717e, 0x7196, 0x71ad, 0x71c4, + 0x71db, 0x71f2, 0x7209, 0x7220, 0x7236, 0x724d, 0x7264, 0x727a, 0x7291, 0x72a7, 0x72bd, 0x72d4, 0x72ea, 0x7300, + 0x7316, 0x732c, 0x7342, 0x7358, 0x736e, 0x7383, 0x7399, 0x73ae, 0x73c4, 0x73d9, 0x73ef, 0x7404, 0x7419, 0x742e, + 0x7443, 0x7458, 0x746d, 0x7482, 0x7497, 0x74ac, 0x74c0, 0x74d5, 0x74ea, 0x74fe, 0x7512, 0x7527, 0x753b, 0x754f, + 0x7563, 0x7577, 0x758b, 0x759f, 0x75b3, 0x75c7, 0x75da, 0x75ee, 0x7601, 0x7615, 0x7628, 0x763b, 0x764f, 0x7662, + 0x7675, 0x7688, 0x769b, 0x76ae, 0x76c1, 0x76d3, 0x76e6, 0x76f9, 0x770b, 0x771e, 0x7730, 0x7742, 0x7754, 0x7767, + 0x7779, 0x778b, 0x779d, 0x77af, 0x77c0, 0x77d2, 0x77e4, 0x77f5, 0x7807, 0x7818, 0x782a, 0x783b, 0x784c, 0x785d, + 0x786e, 0x787f, 0x7890, 0x78a1, 0x78b2, 0x78c3, 0x78d3, 0x78e4, 0x78f4, 0x7905, 0x7915, 0x7925, 0x7936, 0x7946, + 0x7956, 0x7966, 0x7976, 0x7985, 0x7995, 0x79a5, 0x79b5, 0x79c4, 0x79d4, 0x79e3, 0x79f2, 0x7a02, 0x7a11, 0x7a20, + 0x7a2f, 0x7a3e, 0x7a4d, 0x7a5b, 0x7a6a, 0x7a79, 0x7a87, 0x7a96, 0x7aa4, 0x7ab3, 0x7ac1, 0x7acf, 0x7add, 0x7aeb, + 0x7af9, 0x7b07, 0x7b15, 0x7b23, 0x7b31, 0x7b3e, 0x7b4c, 0x7b59, 0x7b67, 0x7b74, 0x7b81, 0x7b8e, 0x7b9b, 0x7ba8, + 0x7bb5, 0x7bc2, 0x7bcf, 0x7bdc, 0x7be8, 0x7bf5, 0x7c02, 0x7c0e, 0x7c1a, 0x7c27, 0x7c33, 0x7c3f, 0x7c4b, 0x7c57, + 0x7c63, 0x7c6f, 0x7c7a, 0x7c86, 0x7c92, 0x7c9d, 0x7ca9, 0x7cb4, 0x7cbf, 0x7ccb, 0x7cd6, 0x7ce1, 0x7cec, 0x7cf7, + 0x7d02, 0x7d0c, 0x7d17, 0x7d22, 0x7d2c, 0x7d37, 0x7d41, 0x7d4b, 0x7d56, 0x7d60, 0x7d6a, 0x7d74, 0x7d7e, 0x7d88, + 0x7d91, 0x7d9b, 0x7da5, 0x7dae, 0x7db8, 0x7dc1, 0x7dcb, 0x7dd4, 0x7ddd, 0x7de6, 0x7def, 0x7df8, 0x7e01, 0x7e0a, + 0x7e13, 0x7e1b, 0x7e24, 0x7e2c, 0x7e35, 0x7e3d, 0x7e45, 0x7e4d, 0x7e56, 0x7e5e, 0x7e66, 0x7e6d, 0x7e75, 0x7e7d, + 0x7e85, 0x7e8c, 0x7e94, 0x7e9b, 0x7ea3, 0x7eaa, 0x7eb1, 0x7eb8, 0x7ebf, 0x7ec6, 0x7ecd, 0x7ed4, 0x7edb, 0x7ee1, + 0x7ee8, 0x7eee, 0x7ef5, 0x7efb, 0x7f01, 0x7f08, 0x7f0e, 0x7f14, 0x7f1a, 0x7f20, 0x7f25, 0x7f2b, 0x7f31, 0x7f36, + 0x7f3c, 0x7f41, 0x7f47, 0x7f4c, 0x7f51, 0x7f56, 0x7f5b, 0x7f60, 0x7f65, 0x7f6a, 0x7f6f, 0x7f74, 0x7f78, 0x7f7d, + 0x7f81, 0x7f85, 0x7f8a, 0x7f8e, 0x7f92, 0x7f96, 0x7f9a, 0x7f9e, 0x7fa2, 0x7fa6, 0x7fa9, 0x7fad, 0x7fb0, 0x7fb4, + 0x7fb7, 0x7fba, 0x7fbe, 0x7fc1, 0x7fc4, 0x7fc7, 0x7fca, 0x7fcc, 0x7fcf, 0x7fd2, 0x7fd4, 0x7fd7, 0x7fd9, 0x7fdc, + 0x7fde, 0x7fe0, 0x7fe2, 0x7fe4, 0x7fe6, 0x7fe8, 0x7fea, 0x7fec, 0x7fed, 0x7fef, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff5, + 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffb, 0x7ffb, 0x7ffc, 0x7ffd, 0x7ffd, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, + 0x7ffe, 0x7fff, +}; diff --git a/lib/ultra/gu/sqrtf.s b/lib/hackerlibultra/src/gu/sqrtf.s similarity index 81% rename from lib/ultra/gu/sqrtf.s rename to lib/hackerlibultra/src/gu/sqrtf.s index d62ece09..475a827a 100644 --- a/lib/ultra/gu/sqrtf.s +++ b/lib/hackerlibultra/src/gu/sqrtf.s @@ -1,13 +1,13 @@ /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ /* diff --git a/lib/ultra/gu/translate.c b/lib/hackerlibultra/src/gu/translate.c similarity index 63% rename from lib/ultra/gu/translate.c rename to lib/hackerlibultra/src/gu/translate.c index e864d9d2..8ae25383 100644 --- a/lib/ultra/gu/translate.c +++ b/lib/hackerlibultra/src/gu/translate.c @@ -1,22 +1,18 @@ - /************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * - * * + * * **************************************************************************/ #include "guint.h" -#if LIBULTRA_VERSION < OS_VER_K || !defined(TARGET_N64) - -void guTranslateF(float mf[4][4], float x, float y, float z) -{ +void guTranslateF(float mf[4][4], float x, float y, float z) { guMtxIdentF(mf); mf[3][0] = x; @@ -24,13 +20,10 @@ void guTranslateF(float mf[4][4], float x, float y, float z) mf[3][2] = z; } -void guTranslate(Mtx *m, float x, float y, float z) -{ - Matrix mf; +void guTranslate(Mtx* m, float x, float y, float z) { + Matrix mf; guTranslateF(mf, x, y, z); guMtxF2L(mf, m); } - -#endif diff --git a/lib/hackerlibultra/src/gu/us2dex.c b/lib/hackerlibultra/src/gu/us2dex.c new file mode 100644 index 00000000..a9fef5c8 --- /dev/null +++ b/lib/hackerlibultra/src/gu/us2dex.c @@ -0,0 +1,74 @@ +/*--------------------------------------------------------------------- + $Id: us2dex.c,v 1.4 1998/10/09 06:15:30 has Exp $ + + File : us2dex.c + + Coded by Yoshitaka Yasumoto. Mar 19, 1997. + Copyright by Nintendo, Co., Ltd. 1997. + ---------------------------------------------------------------------*/ +#include +#include + +/* + * Routines that support processing of S2DEX microcode + */ + +/* + * guS2DInitBG + * Set BG screen draw parameters + * + * If called at time of initialization, then it only needs to be + * called again when changes made to imageFmt, imageSiz, imageLoad, * imageW, + *frameW. However, if imageLoad == G_BGLT_LOADBLOCK and * only frameW is changed, another + *call is unnecessary. + */ +void guS2DInitBg(uObjBg* bg) { + u16 tmemUse; + u16 shift; +#if BUILD_VERSION >= VERSION_J + u32 tsize; +#endif + + /* + * Get the useable volume for TMEM + * If imageFmt is CI then TLUT will use half. + */ + tmemUse = (bg->b.imageFmt == G_IM_FMT_CI) ? 256 : 512; + + /* + * Get shift volume for conversion to TMEM word. + */ + shift = 6 - bg->b.imageSiz; + + /* + * Set other parameters for Load Mode. + */ + if (bg->b.imageLoad == G_BGLT_LOADBLOCK) { + bg->b.tmemW = bg->b.imageW >> shift; + bg->b.tmemH = (tmemUse / bg->b.tmemW) << 2; + bg->b.tmemSizeW = bg->b.tmemW << 1; + bg->b.tmemSize = bg->b.tmemH * bg->b.tmemSizeW; + bg->b.tmemLoadSH = (bg->b.tmemSize >> 1) - 1; + bg->b.tmemLoadTH = GS_CALC_DXT(bg->b.tmemW); + } else { +#if BUILD_VERSION >= VERSION_J + bg->b.tmemW = (bg->b.frameW >> shift) + 3; + bg->b.tmemH = (tmemUse / bg->b.tmemW) << 2; + bg->b.tmemSizeW = (bg->b.imageW >> shift) * 2; + tsize = bg->b.tmemH * bg->b.tmemSizeW; + bg->b.tmemSize = tsize >> 16; + bg->b.tmemLoadSH = tsize & 0xffff; + bg->b.tmemLoadTH = bg->b.tmemH - 1; +#else + bg->b.tmemW = (bg->b.frameW >> shift) + 1; + bg->b.tmemH = (tmemUse / bg->b.tmemW) << 2; + bg->b.tmemSizeW = (bg->b.imageW >> shift) * 2; + bg->b.tmemSize = bg->b.tmemH * bg->b.tmemSizeW; + bg->b.tmemLoadSH = (bg->b.tmemW << 4) - 1; + bg->b.tmemLoadTH = bg->b.tmemH - 1; +#endif + } + return; +} + +/*======== End of us2dex.c ========*/ diff --git a/lib/hackerlibultra/src/gu/us2dex2_emu.c b/lib/hackerlibultra/src/gu/us2dex2_emu.c new file mode 100644 index 00000000..27ac78c6 --- /dev/null +++ b/lib/hackerlibultra/src/gu/us2dex2_emu.c @@ -0,0 +1,12 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998, Nintendo. + + File us2dex2_emu.c + Coded by Yoshitaka Yasumoto. Apr 10, 1998. + + $Id: us2dex2_emu.c,v 1.3 1998/10/09 06:15:40 has Exp $ + *---------------------------------------------------------------------*/ +#define F3DEX_GBI_2 +#include "us2dex_emu.c" + +/*======== End of us2dex2_emu.c ========*/ diff --git a/lib/hackerlibultra/src/gu/us2dex_emu.c b/lib/hackerlibultra/src/gu/us2dex_emu.c new file mode 100644 index 00000000..23c7de69 --- /dev/null +++ b/lib/hackerlibultra/src/gu/us2dex_emu.c @@ -0,0 +1,523 @@ +/*---------------------------------------------------------------------* + Copyright (C) 1998, Nintendo. + + File us2dex_emu.c + Coded by Yoshitaka Yasumoto. Apr 9, 1998. + + $Id: us2dex_emu.c,v 1.9 1999/07/08 05:02:04 yurugi Exp $ + *---------------------------------------------------------------------*/ +#define F3DEX_GBI +#include +#include + +#define RSP_DEBUG + +static u16 scissorX0 = 0; /* (s13.2) */ +static u16 scissorY0 = 0; /* (s13.2) */ +static u16 scissorX1 = 320 << 2; /* (s13.2) */ +static u16 scissorY1 = 240 << 2; /* (s13.2) */ +static u8 flagBilerp = 0; + +static u32 rdpSetTimg_w0, rdpSetTile_w0; +static u16 tmemSliceWmax; +static u16 imageSrcWsize; +static s16 flagSplit; +static u16 imagePtrX0; +static u32 imageTop; +static s16 tmemSrcLines; + +/* Addition 99/05/31(Y) */ +#if BUILD_VERSION >= VERSION_K +static s8 bgflg; +#endif + +/*----------------------------------------------------------------------------* + * Set scissoring parameters + * *---------------------------------------------------------------------------*/ +void guS2DEmuSetScissor(u32 ulx, u32 uly, u32 lrx, u32 lry, u8 flag) { + scissorX0 = (u16)ulx << 2; + scissorY0 = (u16)uly << 2; + scissorX1 = (u16)lrx << 2; + scissorY1 = (u16)lry << 2; + flagBilerp = (flag) ? 1 : 0; +} + +/*---------------------------------------------------------------------------* + * Create texture load RDP commands + *---------------------------------------------------------------------------*/ +static void tmemLoad_B(Gfx** pkt, u32 imagePtr, s16 loadLines, s16 tmemSH) { + /* + * Load 16-bit texture of tmemSH word width starting from imagePtr + * into the loadLines amount of lines of tmem. + */ + + /* [SetTImg] CMD=0x3d FMT=RGBA(0) SIZ=16b(2) */ + (*pkt)->words.w0 = rdpSetTimg_w0; + (*pkt)->words.w1 = imagePtr; + (*pkt)++; + + /* [LoadSync] Wait for completion of preceding primitive draw */ + (*pkt)->words.w0 = (G_RDPLOADSYNC << 24); + (*pkt)++; + + /* [LoadTile] CMD=0x34 TILE=7 SH=TMEMW*16-1 TMEMH*4-1 */ + (*pkt)->words.w0 = (G_LOADTILE << 24) | 0x000000; +/* addition 99/5/31(Y) */ +#if BUILD_VERSION >= VERSION_K + if (bgflg == 3) + (*pkt)->words.w1 = 0x07000000 | (tmemSH - 1) << 16; + else + (*pkt)->words.w1 = 0x07000000 | (tmemSH - 1) << 16 | (loadLines << 2) - 1; +#else + (*pkt)->words.w1 = 0x07000000 | (tmemSH - 1) << 16 | (loadLines << 2) - 1; +#endif + (*pkt)++; +} + +static void tmemLoad_A(Gfx** pkt, u32 imagePtr, s16 loadLines, s16 tmemAdrs, s16 tmemSH) { + /* + * Load 16-bit texture of tmemSH word width starting from imagePtr into + * the loadLines amount of lines of the tmemAdrs of tmem. + */ + + /* [TileSync] Wait for completion of Tile access of preceding command */ + (*pkt)->words.w0 = 0xe8000000; + (*pkt)++; + + /* [SetTile] */ + (*pkt)->words.w0 = rdpSetTile_w0 | tmemAdrs; + (*pkt)->words.w1 = 0x07000000; + (*pkt)++; + + tmemLoad_B(pkt, imagePtr, loadLines, tmemSH); +} + +static void tmemLoad(Gfx** pkt, u32* imagePtr, s16* imageRemain, s16 drawLines, s16 flagBilerp) { + s16 loadLines = drawLines + flagBilerp; + s16 iLoadable = (*imageRemain) - flagSplit; + + if (iLoadable >= loadLines) { /* If load can be done all at once */ + tmemLoad_B(pkt, *imagePtr, loadLines, tmemSliceWmax); + (*imagePtr) += imageSrcWsize * drawLines; + (*imageRemain) -= drawLines; + + } else { /* If load is to be partitioned */ + s16 SubSliceL2, SubSliceD2, SubSliceY2; + u32 imageTopSeg = imageTop & 0xff000000; + + SubSliceY2 = *imageRemain; + SubSliceL2 = loadLines - SubSliceY2; + SubSliceD2 = drawLines - SubSliceY2; + + if (SubSliceL2 > 0) { + u32 imagePtr2; + + imagePtr2 = imageTop + imagePtrX0; + if (SubSliceY2 & 1) { + imagePtr2 -= imageSrcWsize; + imagePtr2 = imageTopSeg | (imagePtr2 & 0x00ffffff); /*Segment counterm */ + SubSliceY2--; + SubSliceL2++; + } + tmemLoad_A(pkt, imagePtr2, SubSliceL2, SubSliceY2 * tmemSliceWmax, tmemSliceWmax); + } + if (flagSplit) { + u32 imagePtr1A, imagePtr1B; + s16 SubSliceY1, SubSliceL1; + s16 tmemSH_A, tmemSH_B; + + imagePtr1A = (*imagePtr) + iLoadable * imageSrcWsize; + imagePtr1B = imageTop; + SubSliceY1 = iLoadable; + if (SubSliceL1 = iLoadable & 1) { + imagePtr1A -= imageSrcWsize; + imagePtr1B -= imageSrcWsize; + imagePtr1B = imageTopSeg | (imagePtr1B & 0x00ffffff); /*Segment countermeasure */ + SubSliceY1--; + } + SubSliceL1++; + tmemSH_A = (imageSrcWsize - imagePtrX0) >> 3; + tmemSH_B = tmemSliceWmax - tmemSH_A; + tmemLoad_A(pkt, imagePtr1B, SubSliceL1, SubSliceY1 * tmemSliceWmax + tmemSH_A, tmemSH_B); + tmemLoad_A(pkt, imagePtr1A, SubSliceL1, SubSliceY1 * tmemSliceWmax, tmemSH_A); + } + if (iLoadable > 0) { + + tmemLoad_A(pkt, *imagePtr, iLoadable, 0, tmemSliceWmax); + + } else { + + /* [SetTile] */ + (*pkt)->words.w0 = rdpSetTile_w0; + (*pkt)->words.w1 = 0x07000000; + (*pkt)++; + } + + (*imageRemain) -= drawLines; + if ((*imageRemain) > 0) { + (*imagePtr) += imageSrcWsize * drawLines; + } else { + (*imageRemain) = tmemSrcLines - SubSliceD2; + (*imagePtr) = imageTop + SubSliceD2 * imageSrcWsize + imagePtrX0; + } + } +} + +/*---------------------------------------------------------------------------* + * Scalable BG serface draw process + *---------------------------------------------------------------------------*/ +void guS2DEmuBgRect1Cyc(Gfx** pkt, uObjBg* bg) { + s16 frameX0, frameX1, framePtrY0, frameRemain; + s16 imageX0, imageY0, imageSliceW, imageW; + s32 imageYorig; + s16 scaleW, scaleH; + + s16 imageSrcW, imageSrcH; + s16 tmemSliceLines, imageSliceLines; + s32 frameSliceLines, frameSliceCount; + u16 imageS, imageT; + u32 imagePtr; + + s16 imageISliceL0, imageIY0; + s32 frameLSliceL0; + + scaleW = bg->s.scaleW; + scaleH = bg->s.scaleH; + +/* addition 99/05/31(Y) */ +#if BUILD_VERSION >= VERSION_K + bgflg = bg->s.imageSiz; + if (scaleW == 0) + scaleW = 1; + if (scaleH == 0) + scaleH = 1; +#endif + + { + /*-------------------------------------------------* + Scissoring process + *-------------------------------------------------*/ + /* + / frameX0, frameX1, framePtrY0, frameRemain + / imageX0, imageY0, tmemSliceW + / imageSrcW, imageSrcH + */ + s16 pixX0, pixY0, pixX1, pixY1; /* (s13.2) */ + s16 frameY0, frameW, frameH; + s32 frameWmax, frameHmax; + + /* Determine maximum frame size from image and enlargement ratio */ + frameWmax = ((((s32)bg->s.imageW << 10) / scaleW) - 1) & ~3; + frameHmax = ((((s32)bg->s.imageH << 10) / scaleH) - 1) & ~3; + + /* Clamp the frame size */ + frameW = bg->s.frameW; + frameH = bg->s.frameH; + frameX0 = bg->s.frameX; + frameY0 = bg->s.frameY; + if ((frameWmax = bg->s.frameW - frameWmax) < 0) + frameWmax = 0; + if ((frameHmax = bg->s.frameH - frameHmax) < 0) + frameHmax = 0; + frameW -= frameWmax; + frameH -= frameHmax; + if (bg->s.imageFlip & G_BG_FLAG_FLIPS) { + frameX0 += frameWmax; + } + + /* Caluculate amount of projection from screen */ + pixX0 = scissorX0 - frameX0; /* (s13.2) */ + pixY0 = scissorY0 - frameY0; /* (s13.2) */ + pixX1 = frameW - scissorX1 + frameX0; /* (s13.2) */ + pixY1 = frameH - scissorY1 + frameY0; /* (s13.2) */ + + /* Clamp if no projection */ + if (pixX0 < 0) + pixX0 = 0; + if (pixY0 < 0) + pixY0 = 0; + if (pixX1 < 0) + pixX1 = 0; + if (pixY1 < 0) + pixY1 = 0; + + /* Cut the part that is projecting */ + frameW = frameW - (pixX0 + pixX1); /* (s13.2) */ + frameH = frameH - (pixY0 + pixY1); /* (s13.2) */ + frameX0 = frameX0 + pixX0; /* (s13.2) */ + frameY0 = frameY0 + pixY0; /* (s13.2) */ + + /* Terminate if no draw range remains */ + if (frameW <= 0 || frameH <= 0) + return; + + /* Caluculate frame */ + frameX1 = frameX0 + frameW; /* (s13.2) */ + framePtrY0 = frameY0 >> 2; /* (s15.0) */ + frameRemain = frameH >> 2; /* (s15.0) */ + + /* Join image columns */ + imageSrcW = bg->s.imageW << 3; /* (u11.5) */ + imageSrcH = bg->s.imageH << 3; /* (u11.5) */ + + /* Get image range (u14.2)*(u6.10)=(u20.12)->(u11.5) */ + imageSliceW = (imageW = frameW * scaleW >> 7) + flagBilerp * 32; + if (bg->s.imageFlip & G_BG_FLAG_FLIPS) { + imageX0 = bg->s.imageX + (pixX1 * scaleW >> 7); /* (s10.5) */ + } else { + imageX0 = bg->s.imageX + (pixX0 * scaleW >> 7); /* (s10.5) */ + } + imageY0 = bg->s.imageY + (pixY0 * scaleH >> 7); /* (s10.5) */ + imageYorig = bg->s.imageYorig; + + /* Loop one step down when left end of image area is greater than right end of image source */ + while (imageX0 >= imageSrcW) { + imageX0 -= imageSrcW; + imageY0 += 32; + imageYorig += 32; /* Add 1 to carrier */ + } + + /* Loop when top end of image area is greater than bottom end of image source */ + while (imageY0 >= imageSrcH) { + imageY0 -= imageSrcH; + imageYorig -= imageSrcH; + } + } + + { + /*-------------------------------------------------* + Check process connecting top and bottom of image + *-------------------------------------------------*/ + /* + // flagSplit + // tmemSrcLines + // imageSrcLines + */ + /* Top/bottom connection process necessary when image range straddles right + end */ + flagSplit = (imageX0 + imageSliceW >= imageSrcW); + + /* Number of image lines that can be loaded at once */ + tmemSrcLines = imageSrcH >> 5; + } + + { + /*-------------------------------------------------* + Get load data for TMEM + *-------------------------------------------------*/ + /* + //Calculate number of lines that can be loaded into TMEM. + // If the slice width changes due to scissoring and the linked + // load line number is changed, then the frame division line will + // change and the result will be the generation of unnatural wrinkles. + // To prevent this, the division region is set such that scissoring + // does not occur. + // + */ + s16 tmemSize, tmemMask, tmemShift; + s32 imageNumSlice; + s32 imageSliceWmax; + s32 imageLYoffset, frameLYoffset; + s32 imageLHidden, frameLHidden; + s32 frameLYslice; + + static s16 TMEMSIZE[] = { 512, 512, 256, 512, 512 }; + static s16 TMEMMASK[] = { 0x1ff, 0xff, 0x7f, 0x3f }; + static s16 TMEMSHIFT[] = { 0x200, 0x100, 0x80, 0x40 }; + tmemSize = TMEMSIZE[bg->s.imageFmt]; /* (s15.0) */ + tmemMask = TMEMMASK[bg->s.imageSiz]; /* (s10.5) */ + tmemShift = TMEMSHIFT[bg->s.imageSiz]; /* (s10.5)->(s15.0) */ + + /* Calculate tmem width to accommodate the slice image width */ + /* o Extra is needed at Bilerp time. + // o Clamp slice image width based on image source width. + // o Cut image width end number at TMEM Word boundary. + // o tmem width + 1 when start position not in agreement with Word boundary */ +/* addition 99/05/31(Y) */ +#if BUILD_VERSION >= VERSION_K + if (bgflg == 3) { + tmemSize = 480; + imageSliceWmax = 0x2800; + } else { + imageSliceWmax = (((s32)bg->s.frameW * (s32)scaleW) >> 7) + (flagBilerp << 5); + if (imageSliceWmax > imageSrcW) + imageSliceWmax = imageSrcW; + } +#else + imageSliceWmax = (((s32)bg->s.frameW * (s32)scaleW) >> 7) + (flagBilerp << 5); + if (imageSliceWmax > imageSrcW) + imageSliceWmax = imageSrcW; +#endif + + tmemSliceWmax = (imageSliceWmax + tmemMask) / tmemShift + 1; + + /* Get TMEM/image/frame line number that can be loaded at once */ + tmemSliceLines = tmemSize / tmemSliceWmax; /* (s15.0) */ + imageSliceLines = tmemSliceLines - flagBilerp; /* (s15.0) */ + frameSliceLines = (imageSliceLines << 20) / scaleH; /* (s21.10) */ + + /* Line up image Y coordinate offset value with frame image */ + imageLYoffset = ((s32)imageY0 - imageYorig) << 5; + if (imageLYoffset < 0) + imageLYoffset -= (scaleH - 1); + frameLYoffset = imageLYoffset / scaleH; + frameLYoffset <<= 10; + + /* Get slice number corresponding to image Y */ + if (frameLYoffset >= 0) { + imageNumSlice = frameLYoffset / frameSliceLines; + } else { + imageNumSlice = (frameLYoffset - frameSliceLines + 1) / frameSliceLines; + } + + /* Calculate extent to which first draw slice is hidden at top of frame */ + frameLYslice = (frameLSliceL0 = frameSliceLines * imageNumSlice) & ~1023; + frameLHidden = frameLYoffset - frameLYslice; + imageLHidden = (frameLHidden >> 10) * scaleH; + + /* Calculate fram size of first draw slice */ + frameLSliceL0 = (frameLSliceL0 & 1023) + frameSliceLines - frameLHidden; + + /* Calculate image parameters for draw in midst of slice */ + imageT = (imageLHidden >> 5) & 31; + imageLHidden >>= 10; + imageISliceL0 = imageSliceLines - imageLHidden; + imageIY0 = imageSliceLines * imageNumSlice + (imageYorig & ~31) / 32 + imageLHidden; + if (imageIY0 < 0) + imageIY0 += (bg->s.imageH >> 2); + if (imageIY0 >= (bg->s.imageH >> 2)) + imageIY0 -= (bg->s.imageH >> 2); + imageTop = (u32)bg->s.imagePtr; /* (u32.0) */ + imageSrcWsize = (imageSrcW / tmemShift) << 3; /* (u16.0) */ + imagePtrX0 = (imageX0 / tmemShift) << 3; /* (u16.0) */ + imagePtr = imageTop + imageSrcWsize * imageIY0 + imagePtrX0; + + /* S invert process */ + imageS = imageX0 & tmemMask; /* (u10.5) */ + if (bg->s.imageFlip & G_BG_FLAG_FLIPS) { + imageS = -(imageS + imageW); + } + } + + { + /*-------------------------------------------------* + Creating RDP command constant values + *-------------------------------------------------*/ + /* u32 rdpSetTimg_w0; + u32 rdpSetTile_w0; */ +/* Addition 99/05/31(Y) */ +#if BUILD_VERSION >= VERSION_K + if (bgflg == 3) { + rdpSetTimg_w0 = (G_SETTIMG << 24) + 0x180000 + (imageSrcWsize >> 1) - 1; + rdpSetTile_w0 = (G_SETTILE << 24) + 0x180000 + (tmemSliceWmax << 9); + } else { + rdpSetTimg_w0 = (G_SETTIMG << 24) + 0x100000 + (imageSrcWsize >> 1) - 1; + rdpSetTile_w0 = (G_SETTILE << 24) + 0x100000 + (tmemSliceWmax << 9); + } +#else + rdpSetTimg_w0 = (G_SETTIMG << 24) + 0x100000 + (imageSrcWsize >> 1) - 1; + rdpSetTile_w0 = (G_SETTILE << 24) + 0x100000 + (tmemSliceWmax << 9); +#endif + /* [SetTile:7] */ + (*pkt)->words.w0 = rdpSetTile_w0; + (*pkt)->words.w1 = 0x07000000; + (*pkt)++; + /* [SetTile:0] */ + (*pkt)->words.w0 = rdpSetTile_w0; + ((u8*)&((*pkt)->words.w0))[1] = (bg->s.imageFmt << 5) | (bg->s.imageSiz << 3); + (*pkt)->words.w1 = 0x0007c1f0 | (bg->s.imagePal << 20); + (*pkt)++; + /* [SetTileSize:7] */ + (*pkt)->words.w0 = (G_SETTILESIZE << 24) | 0x000000; + (*pkt)->words.w1 = 0x00000000; + (*pkt)++; + } + + { + s16 imageRemain; + s16 imageSliceH, frameSliceH; + + imageRemain = tmemSrcLines - imageIY0; + imageSliceH = imageISliceL0; + frameSliceCount = frameLSliceL0; + + while (1) { + + /* Calculate draw line number and determine whether to perform a draw */ + frameSliceH = frameSliceCount >> 10; + if (frameSliceH <= 0) { + /* If no draw to be performed */ + imageRemain -= imageSliceH; + if (imageRemain > 0) { + imagePtr += imageSrcWsize * imageSliceH; + } else { + imagePtr = imageTop - (imageRemain * imageSrcWsize) + imagePtrX0; + imageRemain += tmemSrcLines; + } + + } else { + /* If draw to be performed */ + s16 framePtrY1; + + frameSliceCount &= 1023; + if ((frameRemain -= frameSliceH) < 0) { + /* Determine final slice */ + frameSliceH += frameRemain; + imageSliceH += ((frameRemain * scaleH) >> 10) + 1; + if (imageSliceH > imageSliceLines) + imageSliceH = imageSliceLines; + } + tmemLoad(pkt, &imagePtr, &imageRemain, imageSliceH, flagBilerp); + + /* Get draw frame range */ + framePtrY1 = framePtrY0 + frameSliceH; /* (s15.0) */ + + /* [PipeSync] Wait for end of preceding LOADTILE command */ + (*pkt)->words.w0 = (G_RDPPIPESYNC << 24); + (*pkt)++; + + /* Rectangle draw */ + /* Here an RSP command is created. With ucode an RDP command is created */ +#if 1 + { + /* [TextureRectangle] */ + (*pkt)->words.w0 = (G_TEXRECT << 24) | (frameX1 << 12) | (framePtrY1 << 2); + (*pkt)->words.w1 = (frameX0 << 12) | (framePtrY0 << 2); + (*pkt)++; +#else + /* Code for checking slice division line */ + if (frameSliceH > 1) { + (*pkt)->words.w0 = (G_TEXRECT << 24) | (frameX1 << 12) | (framePtrY1 << 2) - 4; + (*pkt)->words.w1 = (frameX0 << 12) | (framePtrY0 << 2); + (*pkt)++; +#endif + +#if 0 /* At RDP command creation time */ + (*pkt)->words.w0 = (imageS<<16) | imageT; + (*pkt)->words.w1 = (scaleW<<16) | scaleH; +#else /* At RSP command creation time */ + (*pkt)->words.w0 = (G_RDPHALF_1 << 24); + (*pkt)->words.w1 = (imageS << 16) | imageT; + (*pkt)++; + (*pkt)->words.w0 = (G_RDPHALF_2 << 24); + (*pkt)->words.w1 = (scaleW << 16) | scaleH; +#endif + (*pkt)++; + } + + /* Update region */ + framePtrY0 = framePtrY1; + + /* End if no more undrawn line numbers for frame */ + if (frameRemain <= 0) { + return; + } + } + frameSliceCount += frameSliceLines; + imageSliceH = imageSliceLines; + imageT = 0; + } + } +} + +/*======== End of us2dex_emu.c ========*/ diff --git a/lib/hackerlibultra/src/gu/usprite.c b/lib/hackerlibultra/src/gu/usprite.c new file mode 100644 index 00000000..0d94be96 --- /dev/null +++ b/lib/hackerlibultra/src/gu/usprite.c @@ -0,0 +1,28 @@ + +/************************************************************************** + * * + * Copyright (C) 1996, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "gbi.h" + +void guSprite2DInit(uSprite* SpritePointer, void* SourceImagePointer, void* TlutPointer, short Stride, + short SubImageWidth, short SubImageHeight, char SourceImageType, char SourceImageBitSize, + short SourceImageOffsetS, short SourceImageOffsetT) { + SpritePointer->s.SourceImagePointer = SourceImagePointer; + SpritePointer->s.TlutPointer = TlutPointer; + SpritePointer->s.Stride = Stride; + SpritePointer->s.SubImageWidth = SubImageWidth; + SpritePointer->s.SubImageHeight = SubImageHeight; + SpritePointer->s.SourceImageType = SourceImageType; + SpritePointer->s.SourceImageBitSize = SourceImageBitSize; + SpritePointer->s.SourceImageOffsetS = SourceImageOffsetS; + SpritePointer->s.SourceImageOffsetT = SourceImageOffsetT; +} diff --git a/lib/hackerlibultra/src/host/host_ptn64.c b/lib/hackerlibultra/src/host/host_ptn64.c new file mode 100644 index 00000000..bdd092f5 --- /dev/null +++ b/lib/hackerlibultra/src/host/host_ptn64.c @@ -0,0 +1,209 @@ +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "PR/rcp.h" +#include "memory.h" + +#include "PRinternal/macros.h" + +#if BUILD_VERSION >= VERSION_J || !defined(_FINALROM) + +static volatile unsigned int* ptwtmode = (unsigned*)0xbff08014; +static volatile unsigned int* ptstat = (unsigned*)0xbff08004; +static volatile unsigned int* ptport = (unsigned*)0xbff08000; +static volatile unsigned int* n64piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG); + +static OSMesgQueue waitPtQueue ALIGNED(0x8); +static OSMesg waitPtQueueBuf; +static u32 isWaitPtQueueCreated = FALSE; + +void __osPiRelAccess(void); +void __osPiGetAccess(void); + +static void createWaitPtQueue(void) { + osCreateMesgQueue(&waitPtQueue, &waitPtQueueBuf, 1); + isWaitPtQueueCreated = TRUE; +} + +static u32 getPT_wait(void) { + OSTimer waitTimer; + u32 status UNUSED; + + for (;;) { + while (*n64piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + ; + } + + if (*ptstat & 2) { + return *ptport; + } + __osPiRelAccess(); + + osRecvMesg(&waitPtQueue, NULL, OS_MESG_NOBLOCK); + osSetTimer(&waitTimer, OS_USEC_TO_CYCLES(1000), 0, &waitPtQueue, NULL); + osRecvMesg(&waitPtQueue, NULL, OS_MESG_BLOCK); + + __osPiGetAccess(); + } +} + +static void putPT(u32 c) { + while (*n64piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + ; + } + while (!(*ptstat & 4)) { + ; + } + *ptport = c; +} + +static u32 getPT(void) { + while (*n64piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + ; + } + while (!(*ptstat & 2)) { + ; + } + return *ptport; +} + +void osReadHost_pt(void* dramAddr, u32 nbytes) { + u8* tPtr; + u32 buf[256]; + u32* bp; + u32 data; + u32 ct; + u32 ct1; + u32 ct1_bak; + u32 shift; + u32 cmd; + u32 size; + + if (nbytes == 0) { + return; + } + + if (!isWaitPtQueueCreated) { + createWaitPtQueue(); + } + + __osPiGetAccess(); + + putPT(0x82U); + + cmd = getPT_wait(); + + size = getPT(); + + if (cmd != 2) { + nbytes = -1U; + } + + putPT(nbytes); + + if (size != nbytes) { + goto osReadHost_ret; + } + + tPtr = dramAddr; + ct = nbytes / 4; + + while (ct != 0) { + if (ct > 0x100) { + ct1_bak = ct1 = 0x100; + ct -= 0x100; + } else { + ct1_bak = ct1 = ct; + ct = 0; + } + bp = (u32*)&buf; + + while (ct1 != 0) { + *(bp++) = getPT(); + ct1--; + } + + memcpy(tPtr, &buf, ct1_bak * 4); + tPtr += ct1_bak * 4; + } + + nbytes &= 3; + + if (nbytes != 0) { + data = getPT(); + shift = 0x18; + + do { + *(tPtr++) = (data >> shift); + nbytes--; + shift -= 8; + } while (nbytes != 0); + } + +osReadHost_ret: + __osPiRelAccess(); + return; +} + +void osWriteHost_pt(void* dramAddr, u32 nbytes) { + u8* tPtr; + u32 buf[256]; + u32* bp; + u32 ct; + u32 ct1; + u32 ct1_bak; + u32 cmd; + u32 size; + + if (nbytes == 0) { + return; + } + + if (!isWaitPtQueueCreated) { + createWaitPtQueue(); + } + + __osPiGetAccess(); + putPT(0x82); + + cmd = getPT_wait(); + + size = getPT(); + + if (cmd != 3) { + nbytes = -1; + } + + putPT(nbytes); + + if (size != nbytes) { + goto osWriteHost_ret; + } + + tPtr = dramAddr; + ct = (nbytes + 3) >> 2; + + while (ct != 0) { + if (ct > 0x100) { + ct1_bak = ct1 = 0x100; + ct -= 0x100; + } else { + ct1_bak = ct1 = ct; + ct = 0; + } + + memcpy(bp = buf, tPtr, ct1_bak * 4); + + while (ct1 != 0) { + putPT(*(bp++)); + ct1--; + } + + tPtr += ct1_bak * 4; + } + +osWriteHost_ret: + __osPiRelAccess(); + return; +} + +#endif diff --git a/lib/hackerlibultra/src/host/readhost.c b/lib/hackerlibultra/src/host/readhost.c new file mode 100644 index 00000000..9bc8d8af --- /dev/null +++ b/lib/hackerlibultra/src/host/readhost.c @@ -0,0 +1,36 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" + +#include "PRinternal/macros.h" + +static int readHostInitialized = FALSE; +static OSMesgQueue readHostMesgQueue ALIGNED(0x8); +static OSMesg readHostMesgBuf[1]; + +u32 __osRdb_Read_Data_Buf; +u32 __osRdb_Read_Data_Ct; + +void osReadHost(void* dramAddr, u32 nbytes) { + char tstr[4]; + u32 sent = 0; + + if (!readHostInitialized) { + osCreateMesgQueue(&readHostMesgQueue, readHostMesgBuf, ARRLEN(readHostMesgBuf)); + osSetEventMesg(OS_EVENT_RDB_READ_DONE, &readHostMesgQueue, NULL); + readHostInitialized = TRUE; + } + + __osRdb_Read_Data_Buf = dramAddr; + __osRdb_Read_Data_Ct = nbytes; + + while (sent == 0) { + sent += __osRdbSend(tstr, 1, RDB_TYPE_GtoH_READY_FOR_DATA); + } + + osRecvMesg(&readHostMesgQueue, NULL, OS_MESG_BLOCK); + return; +} + +#endif diff --git a/lib/hackerlibultra/src/host/writehost.c b/lib/hackerlibultra/src/host/writehost.c new file mode 100644 index 00000000..1d1baf46 --- /dev/null +++ b/lib/hackerlibultra/src/host/writehost.c @@ -0,0 +1,57 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/ultraerror.h" + +#include "PRinternal/macros.h" + +static int writeHostInitialized = FALSE; +static OSMesgQueue writeHostMesgQueue ALIGNED(0x8); +static OSMesg writeHostMesgBuf[1]; + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +void osWriteHost(void* dramAddr, u32 nbytes) { + u8* tPtr = dramAddr; + u32 sent; + u8 dCount[3]; + u32 count; + +#ifndef NDEBUG + if (nbytes == 0) { + __osError(ERR_OSWRITEHOST_SIZE, 1, nbytes); + return; + } +#endif + + if (writeHostInitialized == FALSE) { + osCreateMesgQueue(&writeHostMesgQueue, writeHostMesgBuf, ARRLEN(writeHostMesgBuf)); + osSetEventMesg(OS_EVENT_RDB_DATA_DONE, &writeHostMesgQueue, NULL); + writeHostInitialized = TRUE; + } + + while (nbytes != 0) { + count = MIN(nbytes, 0x8000); + + dCount[0] = (count & 0xFF0000) >> 0x10; + dCount[1] = (count & 0xFF00) >> 8; + dCount[2] = count & 0xFF; + + sent = 0; + while (sent < ARRLEN(dCount)) { + sent += __osRdbSend(dCount + sent, ARRLEN(dCount) - sent, RDB_TYPE_GtoH_DATA_CT); + } + + sent = 0; + while (sent < count) { + sent += __osRdbSend(tPtr + sent, count - sent, RDB_TYPE_GtoH_DATA); + } + + nbytes -= count; + tPtr += count; + osRecvMesg(&writeHostMesgQueue, NULL, OS_MESG_BLOCK); + } +} + +#endif diff --git a/lib/ultra/io/ai.c b/lib/hackerlibultra/src/io/ai.c similarity index 67% rename from lib/ultra/io/ai.c rename to lib/hackerlibultra/src/io/ai.c index a85bf372..4ece0f1a 100644 --- a/lib/ultra/io/ai.c +++ b/lib/hackerlibultra/src/io/ai.c @@ -1,12 +1,15 @@ #include "PR/os_internal.h" #include "PR/rcp.h" +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + s32 __osAiDeviceBusy(void) { register s32 status = IO_READ(AI_STATUS_REG); if (status & AI_STATUS_FIFO_FULL) { return TRUE; + } else { + return FALSE; } - - return FALSE; } diff --git a/lib/hackerlibultra/src/io/aigetlen.c b/lib/hackerlibultra/src/io/aigetlen.c new file mode 100644 index 00000000..10607305 --- /dev/null +++ b/lib/hackerlibultra/src/io/aigetlen.c @@ -0,0 +1,14 @@ +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/** + * Returns the number of bytes remaining in a currently ongoing audio DMA. + * + * Note that audio DMA is double-buffered, a DMA can be queued while another is in-progress. This only + * returns information about the currently in-progress DMA. + */ +u32 osAiGetLength(void) { + return IO_READ(AI_LEN_REG); +} diff --git a/lib/hackerlibultra/src/io/aigetstat.c b/lib/hackerlibultra/src/io/aigetstat.c new file mode 100644 index 00000000..270b66ed --- /dev/null +++ b/lib/hackerlibultra/src/io/aigetstat.c @@ -0,0 +1,8 @@ +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 osAiGetStatus(void) { + return IO_READ(AI_STATUS_REG); +} diff --git a/lib/hackerlibultra/src/io/aisetfreq.c b/lib/hackerlibultra/src/io/aisetfreq.c new file mode 100644 index 00000000..4b2c3137 --- /dev/null +++ b/lib/hackerlibultra/src/io/aisetfreq.c @@ -0,0 +1,68 @@ +#include "PR/rcp.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" +// TODO: not sure if this should be here +extern s32 osViClock; + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/** + * Programs the operating frequency of the Audio DAC. + * + * @param frequency Target Playback frequency. + * @return The actual playback frequency, or -1 if the supplied frequency cannot be used. + */ +s32 osAiSetFrequency(u32 frequency) { + register unsigned int dacRate; + register unsigned char bitRate; + register float f; + +#ifdef _DEBUG + if (osViClock == VI_PAL_CLOCK) { + if (frequency < AI_PAL_MIN_FREQ || frequency > AI_PAL_MAX_FREQ) { + __osError(ERR_OSAISETFREQUENCY, 3, AI_PAL_MIN_FREQ, AI_PAL_MAX_FREQ, frequency); + return -1; + } + } else if (osViClock == VI_MPAL_CLOCK) { + if (frequency < AI_MPAL_MIN_FREQ || frequency > AI_MPAL_MAX_FREQ) { + __osError(ERR_OSAISETFREQUENCY, 3, AI_MPAL_MIN_FREQ, AI_MPAL_MAX_FREQ, frequency); + return -1; + } + } else { + if (frequency < AI_NTSC_MIN_FREQ || frequency > AI_NTSC_MAX_FREQ) { + __osError(ERR_OSAISETFREQUENCY, 3, AI_NTSC_MIN_FREQ, AI_NTSC_MAX_FREQ, frequency); + return -1; + } + } +#endif + + // Calculate the DAC sample period ("dperiod") (dperiod + 1 = vid_clock / frequency) + f = osViClock / (float)frequency + .5f; + dacRate = f; + + // Upcoming division by 66. If dacRate is smaller than 2 * 66 = 132, bitrate will be 1 and + // AI_BITRATE_REG will be programmed with 0, which results in no audio output. Return -1 to indicate + // an unusable frequency. + if (dacRate < AI_MIN_DAC_RATE) { + return -1; + } + + // Calculate the largest "bitrate" (ABUS clock half period, "aclockhp") supported for this dacrate. + // These two quantities must satisfy (dperiod + 1) >= 66 * (aclockhp + 1), here this is taken as + // equality. + bitRate = dacRate / 66; + // Clamp to max value + if (bitRate > AI_MAX_BIT_RATE) { + bitRate = AI_MAX_BIT_RATE; + } + + IO_WRITE(AI_DACRATE_REG, dacRate - 1); + IO_WRITE(AI_BITRATE_REG, bitRate - 1); +#if BUILD_VERSION < VERSION_J + IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); +#endif + // Return the true playback frequency (frequency = vid_clock / (dperiod + 1)), which may differ from + // the target frequency. + return osViClock / (s32)dacRate; +} diff --git a/lib/hackerlibultra/src/io/aisetnextbuf.c b/lib/hackerlibultra/src/io/aisetnextbuf.c new file mode 100644 index 00000000..2961d306 --- /dev/null +++ b/lib/hackerlibultra/src/io/aisetnextbuf.c @@ -0,0 +1,67 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/** + * Submits an audio buffer to be consumed by the Audio DAC. The audio interface can queue a second DMA + * while another is in progress and automatically begin the next one as soon as the current DMA + * completes. If there is already a second DMA queued (DMA is full), -1 is returned to indicate the + * buffer could not be submitted. + * + * @param bufPtr Next audio buffer. Must be an 8-byte aligned KSEG0 (0x80XXXXXX) address. + * @param size Length of next audio buffer in bytes, maximum size 0x40000 bytes / 256 KiB. Should be a + * multiple of 8. + * @return 0 if the DMA was enqueued successfully, -1 if the DMA could not yet be queued. + */ +s32 osAiSetNextBuffer(void* bufPtr, u32 size) { + static u8 hdwrBugFlag = FALSE; + char* bptr; + +#if BUILD_VERSION >= VERSION_J + if (__osAiDeviceBusy()) { + return -1; + } +#endif + +#ifdef _DEBUG + if ((u32)bufPtr & (8 - 1)) { + __osError(ERR_OSAISETNEXTBUFFER_ADDR, 1, bufPtr); + return -1; + } + + if ((u32)size & (8 - 1)) { + __osError(ERR_OSAISETNEXTBUFFER_SIZE, 1, size); + return -1; + } +#endif + + bptr = bufPtr; + + if (hdwrBugFlag) { + bptr = (u8*)bufPtr - 0x2000; + } + + if ((((u32)bufPtr + size) & 0x1fff) == 0) { + hdwrBugFlag = TRUE; + } else { + hdwrBugFlag = FALSE; + } + +#if BUILD_VERSION < VERSION_J + //! @bug The __osAiDeviceBusy call should be above the hardware bug workaround to ensure that it was + //! only performed when a transfer was guaranteed to start. If this condition passes and this + //! function returns without submitting a buffer for DMA, the code above will lose track of when to + //! apply the workaround. + if (__osAiDeviceBusy()) { + return -1; + } +#endif + + IO_WRITE(AI_DRAM_ADDR_REG, osVirtualToPhysical(bptr)); + IO_WRITE(AI_LEN_REG, size); + return 0; +} diff --git a/lib/ultra/io/cartrominit.c b/lib/hackerlibultra/src/io/cartrominit.c similarity index 84% rename from lib/ultra/io/cartrominit.c rename to lib/hackerlibultra/src/io/cartrominit.c index 700d9171..7f2eb110 100644 --- a/lib/ultra/io/cartrominit.c +++ b/lib/hackerlibultra/src/io/cartrominit.c @@ -1,13 +1,12 @@ +#include "PRinternal/macros.h" +#include "PR/os_version.h" #include "PR/os_internal.h" #include "PR/R4300.h" #include "PR/rcp.h" -#include "PR/os.h" -#include "piint.h" -#include "macros.h" - -#if LIBULTRA_VERSION >= OS_VER_J -ALIGNED8 OSPiHandle __CartRomHandle; +#include "PRinternal/piint.h" +#if BUILD_VERSION >= VERSION_J +OSPiHandle __CartRomHandle ALIGNED(0x8); OSPiHandle* osCartRomInit(void) { u32 value = 0; u32 saveMask; @@ -28,11 +27,12 @@ OSPiHandle* osCartRomInit(void) { first = 0; __CartRomHandle.type = DEVICE_TYPE_CART; __CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); - __CartRomHandle.domain = 0; + __CartRomHandle.domain = PI_DOMAIN1; __CartRomHandle.speed = 0; + bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); - WAIT_ON_IO_BUSY(stat); + WAIT_ON_IOBUSY(stat); latency = IO_READ(PI_BSD_DOM1_LAT_REG); pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); @@ -63,29 +63,25 @@ OSPiHandle* osCartRomInit(void) { return &__CartRomHandle; } - #else -ALIGNED8 OSPiHandle CartRomHandle; -OSPiHandle *osCartRomInit(void) { +OSPiHandle CartRomHandle ALIGNED(0x8); +OSPiHandle* osCartRomInit(void) { u32 domain = 0; u32 saveMask; - if (CartRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR2)) { + if (CartRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR2)) return &CartRomHandle; - } CartRomHandle.type = DEVICE_TYPE_CART; CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); - osPiRawReadIo(0, &domain); + osPiRawReadIo(NULL, &domain); CartRomHandle.latency = domain & 0xff; CartRomHandle.pulse = (domain >> 8) & 0xff; CartRomHandle.pageSize = (domain >> 0x10) & 0xf; CartRomHandle.relDuration = (domain >> 0x14) & 0xf; CartRomHandle.domain = PI_DOMAIN1; -#if LIBULTRA_VERSION >= OS_VER_I CartRomHandle.speed = 0; -#endif bzero(&CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); @@ -96,5 +92,4 @@ OSPiHandle *osCartRomInit(void) { return &CartRomHandle; } - #endif diff --git a/lib/hackerlibultra/src/io/contchannelreset.c b/lib/hackerlibultra/src/io/contchannelreset.c new file mode 100644 index 00000000..108a594c --- /dev/null +++ b/lib/hackerlibultra/src/io/contchannelreset.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +s32 __osContChannelReset(OSMesgQueue* mq, int channel) { + s32 i; + s32 ret; + u8* ptr = (u8*)&__osPfsPifRam; + + __osSiGetAccess(); + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + *ptr++ = CONT_CMD_CHANNEL_RESET; + *ptr = CONT_CMD_END; + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osSiRelAccess(); + return ret; +} diff --git a/lib/hackerlibultra/src/io/conteeplongread.c b/lib/hackerlibultra/src/io/conteeplongread.c new file mode 100644 index 00000000..edebfc8d --- /dev/null +++ b/lib/hackerlibultra/src/io/conteeplongread.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osEepromLongRead(OSMesgQueue* mq, u8 address, u8* buffer, int length) { + s32 ret = 0; + + while (length > 0) { + ERRCK(osEepromRead(mq, address, buffer)); + length -= EEPROM_BLOCK_SIZE; + address++; + buffer += EEPROM_BLOCK_SIZE; + } + + return ret; +} diff --git a/lib/ultra/io/conteeplongwrite.c b/lib/hackerlibultra/src/io/conteeplongwrite.c similarity index 67% rename from lib/ultra/io/conteeplongwrite.c rename to lib/hackerlibultra/src/io/conteeplongwrite.c index acc3074d..8ecce254 100644 --- a/lib/ultra/io/conteeplongwrite.c +++ b/lib/hackerlibultra/src/io/conteeplongwrite.c @@ -1,13 +1,8 @@ #include "PR/os_internal.h" -#include "controller.h" +#include "PRinternal/controller.h" -s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, int length) { +s32 osEepromLongWrite(OSMesgQueue* mq, u8 address, u8* buffer, int length) { s32 ret = 0; -#if LIBULTRA_VERSION < OS_VER_I - if (address > EEPROM_MAXBLOCKS) { - return CONT_RANGE_ERROR; - } -#endif while (length > 0) { ERRCK(osEepromWrite(mq, address, buffer)); diff --git a/lib/hackerlibultra/src/io/conteepprobe.c b/lib/hackerlibultra/src/io/conteepprobe.c new file mode 100644 index 00000000..ca097900 --- /dev/null +++ b/lib/hackerlibultra/src/io/conteepprobe.c @@ -0,0 +1,34 @@ +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +s32 osEepromProbe(OSMesgQueue* mq) { + s32 ret = 0; + u16 type; + OSContStatus sdata; + + __osSiGetAccess(); + ret = __osEepStatus(mq, &sdata); + type = sdata.type & (CONT_EEPROM | CONT_EEP16K); + + if (ret != 0) { + ret = 0; + } else { + switch (type) { + case CONT_EEPROM: + ret = EEPROM_TYPE_4K; + break; + case CONT_EEPROM | CONT_EEP16K: + ret = EEPROM_TYPE_16K; + break; + default: + ret = 0; + break; + } + } + +#if BUILD_VERSION >= VERSION_L + __osEepromRead16K = 0; +#endif + __osSiRelAccess(); + return ret; +} diff --git a/lib/hackerlibultra/src/io/conteepread.c b/lib/hackerlibultra/src/io/conteepread.c new file mode 100644 index 00000000..a2f3839b --- /dev/null +++ b/lib/hackerlibultra/src/io/conteepread.c @@ -0,0 +1,138 @@ +#include "PRinternal/macros.h" +#include "PR/rcp.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +OSPifRam __osEepPifRam; +#if BUILD_VERSION >= VERSION_L +s32 __osEepromRead16K; +#endif +static void __osPackEepReadData(u8 address); + +s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) { + s32 ret = 0; + int i = 0; + u16 type; + u8* ptr; + OSContStatus sdata; + __OSContEepromFormat eepromformat; + + ptr = (u8*)&__osEepPifRam.ramarray; + __osSiGetAccess(); + ret = __osEepStatus(mq, &sdata); + type = sdata.type & (CONT_EEPROM | CONT_EEP16K); + +#if BUILD_VERSION >= VERSION_J + if (ret == 0) { + switch (type) { + case CONT_EEPROM: + if (address >= EEPROM_MAXBLOCKS) { + ret = CONT_RANGE_ERROR; + } + break; + case CONT_EEPROM | CONT_EEP16K: + if (address >= EEP16K_MAXBLOCKS) { + // not technically possible + ret = CONT_RANGE_ERROR; + } +#if BUILD_VERSION >= VERSION_L + else { + __osEepromRead16K = 1; + } +#endif + break; + default: + ret = CONT_NO_RESPONSE_ERROR; + } + } + + if (ret != 0) { + __osSiRelAccess(); + return ret; + } +#else + if (ret != 0) { + __osSiRelAccess(); + return CONT_NO_RESPONSE_ERROR; + } else { + switch (type) { + case CONT_EEPROM: + if (address > EEPROM_MAXBLOCKS) { + __osSiRelAccess(); + return CONT_RANGE_ERROR; + } + break; + case CONT_EEPROM | CONT_EEP16K: + if (address > EEP16K_MAXBLOCKS) { + // not technically possible + __osSiRelAccess(); + return CONT_RANGE_ERROR; + } + break; + default: + __osSiRelAccess(); + return CONT_NO_RESPONSE_ERROR; + } + } +#endif + + while (sdata.status & CONT_EEPROM_BUSY) { + __osEepStatus(mq, &sdata); + } + + __osPackEepReadData(address); + ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); // send command to pif + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); // recv response + __osContLastCmd = CONT_CMD_READ_EEPROM; + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + for (i = 0; i < MAXCONTROLLERS; i++) { + // skip the first 4 bytes + ptr++; + } + + eepromformat = *(__OSContEepromFormat*)ptr; + ret = CHNL_ERR(eepromformat); + + if (ret == 0) { + for (i = 0; i < ARRLEN(eepromformat.data); i++) { + *buffer++ = eepromformat.data[i]; + } + } + __osSiRelAccess(); + return ret; +} + +static void __osPackEepReadData(u8 address) { + u8* ptr = (u8*)&__osEepPifRam.ramarray; + __OSContEepromFormat eepromformat; + int i; + +#if BUILD_VERSION < VERSION_J + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray); i++) { + __osEepPifRam.ramarray[i] = CONT_CMD_NOP; + } +#endif + + __osEepPifRam.pifstatus = CONT_CMD_EXE; + + eepromformat.txsize = CONT_CMD_READ_EEPROM_TX; + eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX; + eepromformat.cmd = CONT_CMD_READ_EEPROM; + eepromformat.address = address; + +#if BUILD_VERSION < VERSION_J + for (i = 0; i < ARRLEN(eepromformat.data); i++) { + eepromformat.data[i] = 0; + } +#endif + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = 0; + } + + *(__OSContEepromFormat*)(ptr) = eepromformat; + ptr += sizeof(__OSContEepromFormat); + ptr[0] = CONT_CMD_END; +} diff --git a/lib/ultra/io/conteepwrite.c b/lib/hackerlibultra/src/io/conteepwrite.c similarity index 51% rename from lib/ultra/io/conteepwrite.c rename to lib/hackerlibultra/src/io/conteepwrite.c index f2d0f033..9ebda24c 100644 --- a/lib/ultra/io/conteepwrite.c +++ b/lib/hackerlibultra/src/io/conteepwrite.c @@ -1,86 +1,45 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif +#include "PR/rcp.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" -#if LIBULTRA_VERSION < OS_VER_I -ALIGNED16 OSPifRam __osEepPifRam; -#endif - -#ifdef BBPLAYER - -s32 osEepromWrite(UNUSED OSMesgQueue *mq, u8 address, u8 *buffer) { +static void __osPackEepWriteData(u8 address, u8* buffer); +s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) { s32 ret = 0; - s32 i; - - __osSiGetAccess(); - - if (__osBbEepromSize == EEPROM_SIZE) { - if (address >= EEPROM_MAXBLOCKS) { - ret = CONT_RANGE_ERROR; - } - } else if (__osBbEepromSize != EEP16K_SIZE) { - ret = CONT_NO_RESPONSE_ERROR; - } - - if (ret == 0) { - for (i = 0; i < EEPROM_BLOCK_SIZE; i++) { - (__osBbEepromAddress + address * EEPROM_BLOCK_SIZE)[i] = buffer[i]; - } - } - - __osSiRelAccess(); - return ret; -} - -#else -void __osPackEepWriteData(u8, u8 *); - -s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) { - s32 ret = 0; -#if LIBULTRA_VERSION < OS_VER_J - s32 i; +#if BUILD_VERSION < VERSION_J + int i; #endif -#if LIBULTRA_VERSION > OS_VER_H u16 type; -#endif - u8 *ptr = (u8 *) &__osEepPifRam.ramarray; + u8* ptr = (u8*)&__osEepPifRam.ramarray; __OSContEepromFormat eepromformat; OSContStatus sdata; -#if LIBULTRA_VERSION > OS_VER_K - u8 temp[EEPROM_BLOCK_SIZE]; -#endif - -#if LIBULTRA_VERSION < OS_VER_I - if (address > EEPROM_MAXBLOCKS) { - return CONT_RANGE_ERROR; - } +#if BUILD_VERSION >= VERSION_L + u8 temp[8]; #endif __osSiGetAccess(); ret = __osEepStatus(mq, &sdata); +#if BUILD_VERSION < VERSION_J + ret = __osEepStatus(mq, &sdata); // Duplicate that was removed in 2.0J +#endif -#if LIBULTRA_VERSION > OS_VER_H type = sdata.type & (CONT_EEPROM | CONT_EEP16K); -#if LIBULTRA_VERSION < OS_VER_J - if (ret != 0) { - __osSiRelAccess(); - return CONT_NO_RESPONSE_ERROR; - } -#else +#if BUILD_VERSION >= VERSION_J if (ret == 0) { -#endif switch (type) { case CONT_EEPROM: - CONT_CHECK_BLOCK(address, EEPROM_MAXBLOCKS, CONT_RANGE_ERROR); + if (address >= EEPROM_MAXBLOCKS) { + ret = CONT_RANGE_ERROR; + } break; case CONT_EEPROM | CONT_EEP16K: - // error not technically possible - CONT_CHECK_BLOCK(address, EEP16K_MAXBLOCKS, CONT_RANGE_ERROR) -#if LIBULTRA_VERSION >= OS_VER_L + if (address >= EEP16K_MAXBLOCKS) { + // not technically possible + ret = CONT_RANGE_ERROR; + } +#if BUILD_VERSION >= VERSION_L else if (__osEepromRead16K) { __osEepromRead16K = 0; __osSiRelAccess(); @@ -90,25 +49,38 @@ s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) { #endif break; default: -#if LIBULTRA_VERSION < OS_VER_J - __osSiRelAccess(); - return CONT_NO_RESPONSE_ERROR; -#else ret = CONT_NO_RESPONSE_ERROR; -#endif } -#if LIBULTRA_VERSION >= OS_VER_J } if (ret != 0) { __osSiRelAccess(); return ret; } -#endif - #else - if (ret != 0 || sdata.type != CONT_EEPROM) { + if (ret != 0) { + __osSiRelAccess(); return CONT_NO_RESPONSE_ERROR; + } else { + switch (type) { + case CONT_EEPROM: + if (address > EEPROM_MAXBLOCKS) { + __osSiRelAccess(); + return -1; + } + + break; + case CONT_EEPROM | CONT_EEP16K: + if (address > EEP16K_MAXBLOCKS) { + // not technically possible + __osSiRelAccess(); + return -1; + } + break; + default: + __osSiRelAccess(); + return CONT_NO_RESPONSE_ERROR; + } } #endif @@ -117,50 +89,47 @@ s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) { } __osPackEepWriteData(address, buffer); - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); // send command to pif osRecvMesg(mq, NULL, OS_MESG_BLOCK); - -#if LIBULTRA_VERSION < OS_VER_I - CONT_PIFRAM_SET(__osEepPifRam, CONT_CMD_NOP, 0); -#endif - - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); //recv response + ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); // recv response __osContLastCmd = CONT_CMD_WRITE_EEPROM; osRecvMesg(mq, NULL, OS_MESG_BLOCK); -#if LIBULTRA_VERSION >= OS_VER_J - ptr += MAXCONTROLLERS; + // skip the first 4 bytes +#if BUILD_VERSION >= VERSION_J + ptr += 4; #else - for (i = 0; i < MAXCONTROLLERS; i++) { + for (i = 0; i < 4; i++) { ptr++; } #endif - eepromformat = *(__OSContEepromFormat *) ptr; + eepromformat = *(__OSContEepromFormat*)ptr; + ret = CHNL_ERR(eepromformat); __osSiRelAccess(); return ret; } -void __osPackEepWriteData(u8 address, u8 *buffer) { - u8 *ptr = (u8 *) &__osEepPifRam.ramarray; +static void __osPackEepWriteData(u8 address, u8* buffer) { + u8* ptr = (u8*)&__osEepPifRam.ramarray; __OSContEepromFormat eepromformat; - s32 i; + int i; -#if LIBULTRA_VERSION >= OS_VER_J - __osEepPifRam.pifstatus = CONT_CMD_EXE; -#else - CONT_PIFRAM_SET(__osEepPifRam, CONT_CMD_NOP, CONT_CMD_EXE); +#if BUILD_VERSION < VERSION_J + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray); i++) { + __osEepPifRam.ramarray[i] = CONT_CMD_NOP; + } #endif + __osEepPifRam.pifstatus = CONT_CMD_EXE; eepromformat.txsize = CONT_CMD_WRITE_EEPROM_TX; eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX; eepromformat.cmd = CONT_CMD_WRITE_EEPROM; eepromformat.address = address; - for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) { + for (i = 0; i < ARRLEN(eepromformat.data); i++) { eepromformat.data[i] = *buffer++; } @@ -168,23 +137,26 @@ void __osPackEepWriteData(u8 address, u8 *buffer) { *ptr++ = 0; } - *(__OSContEepromFormat *) ptr = eepromformat; + *(__OSContEepromFormat*)(ptr) = eepromformat; ptr += sizeof(__OSContEepromFormat); - *ptr = CONT_CMD_END; + ptr[0] = CONT_CMD_END; } -s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) { - u32 ret = 0; - s32 i; - u8 *ptr = (u8 *) __osEepPifRam.ramarray; +s32 __osEepStatus(OSMesgQueue* mq, OSContStatus* data) { + s32 ret = 0; + int i; + u8* ptr = (u8*)__osEepPifRam.ramarray; __OSContRequesFormat requestformat; - CONT_PIFRAM_SET(__osEepPifRam, 0, CONT_CMD_EXE); + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { + __osEepPifRam.ramarray[i] = 0; + } - ptr = (u8 *) __osEepPifRam.ramarray; + __osEepPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osEepPifRam.ramarray; for (i = 0; i < MAXCONTROLLERS; i++) { - *ptr++ = 0; + *ptr++ = CONT_CMD_REQUEST_STATUS; } requestformat.dummy = CONT_CMD_NOP; @@ -195,22 +167,17 @@ s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) { requestformat.typel = CONT_CMD_NOP; requestformat.status = CONT_CMD_NOP; requestformat.dummy1 = CONT_CMD_NOP; - - *REQFORMAT(ptr) = requestformat; + *(__OSContRequesFormat*)ptr = requestformat; ptr += sizeof(__OSContRequesFormat); *ptr = CONT_CMD_END; ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); - -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J __osContLastCmd = CONT_CMD_END; -#elif LIBULTRA_VERSION >= OS_VER_I - __osContLastCmd = CONT_CMD_REQUEST_STATUS; #else - __osContLastCmd = CONT_CMD_WRITE_EEPROM; + __osContLastCmd = CONT_CMD_REQUEST_STATUS; #endif - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); @@ -218,23 +185,20 @@ s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) { return ret; } - ptr = (u8 *) &__osEepPifRam; + ptr = (u8*)&__osEepPifRam; for (i = 0; i < MAXCONTROLLERS; i++) { *ptr++ = 0; } - requestformat = *REQFORMAT(ptr); - - data->errnum = CHNL_ERR(requestformat); + requestformat = *(__OSContRequesFormat*)ptr; + data->errno = CHNL_ERR(requestformat); data->type = (requestformat.typel << 8) | requestformat.typeh; data->status = requestformat.status; - if (data->errnum != 0) { - return data->errnum; + if (data->errno != 0) { + return data->errno; } return 0; } - -#endif diff --git a/lib/hackerlibultra/src/io/contpfs.c b/lib/hackerlibultra/src/io/contpfs.c new file mode 100644 index 00000000..8bac6e31 --- /dev/null +++ b/lib/hackerlibultra/src/io/contpfs.c @@ -0,0 +1,392 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "PRinternal/controller.h" +#include "PR/rmon.h" + +#if BUILD_VERSION >= VERSION_J +__OSInode __osPfsInodeCache ALIGNED(0x8); +s32 __osPfsInodeCacheChannel = -1; +u8 __osPfsInodeCacheBank = 250; +#endif + +u16 __osSumcalc(u8* ptr, int length) { + int i; + u32 sum = 0; + u8* tmp = ptr; + + for (i = 0; i < length; i++) { + sum += *tmp++; +#if BUILD_VERSION < VERSION_J + sum = sum & 0xFFFF; +#endif + } + +#if BUILD_VERSION >= VERSION_J + return sum & 0xFFFF; +#else + return sum; +#endif +} + +s32 __osIdCheckSum(u16* ptr, u16* csum, u16* icsum) { + u16 data = 0; + u32 j; + + *csum = *icsum = 0; + + for (j = 0; j < ((sizeof(__OSPackId) - sizeof(u32)) / sizeof(u8)); j += 2) { + data = *(u16*)((u32)ptr + j); + *csum += data; + *icsum += ~data; + } + + return 0; +} + +s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) { + s32 ret = 0; + u8 temp[BLOCKSIZE]; + u8 comp[BLOCKSIZE]; + u8 mask = 0; + int i; + int j; + u16 index[4]; + +#if BUILD_VERSION >= VERSION_J + j = 0; +#else + SET_ACTIVEBANK_TO_ZERO(); +#endif + + newid->repaired = -1; + newid->random = osGetCount(); + newid->serial_mid = badid->serial_mid; + newid->serial_low = badid->serial_low; + +#if BUILD_VERSION >= VERSION_J + SET_ACTIVEBANK_TO_ZERO(); +#else + j = 0; +#endif + do { + ERRCK(SELECT_BANK(pfs, j)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, temp)); + + temp[0] = j | 0x80; + + for (i = 1; i < BLOCKSIZE; i++) { + temp[i] = ~temp[i]; + } + + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, 0, temp, FALSE)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, comp)); + + for (i = 0; i < BLOCKSIZE; i++) { + if (comp[i] != temp[i]) { + break; + } + } + + if (i != BLOCKSIZE) { + break; + } + + if (j > 0) { + ERRCK(SELECT_BANK(pfs, 0)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, (u8*)temp)); + + if (temp[0] != 0x80) { + break; + } + } + + j++; + } while (j < PFS_MAX_BANKS); + +#if BUILD_VERSION >= VERSION_J + SET_ACTIVEBANK_TO_ZERO(); +#else + ERRCK(SELECT_BANK(pfs, 0)); +#endif + + mask = (j > 0) ? 1 : 0; + + newid->deviceid = (badid->deviceid & (u16)~1) | mask; + newid->banks = j; + newid->version = badid->version; + __osIdCheckSum((u16*)newid, &newid->checksum, &newid->inverted_checksum); + index[0] = PFS_ID_0AREA; + index[1] = PFS_ID_1AREA; + index[2] = PFS_ID_2AREA; + index[3] = PFS_ID_3AREA; + + for (i = 0; i < ARRLEN(index); i++) { + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, index[i], (u8*)newid, TRUE)); + } + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp)); + + for (i = 0; i < BLOCKSIZE; i++) { + if (temp[i] != ((u8*)newid)[i]) { +#if BUILD_VERSION >= VERSION_J + return PFS_ERR_DEVICE; +#else + return PFS_ERR_ID_FATAL; +#endif + } + } + return 0; +} + +s32 __osCheckPackId(OSPfs* pfs, __OSPackId* temp) { + u16 index[4]; + s32 ret = 0; + u16 sum; + u16 isum; + int i; + int j; + + SET_ACTIVEBANK_TO_ZERO(); + index[0] = PFS_ID_0AREA; + index[1] = PFS_ID_1AREA; + index[2] = PFS_ID_2AREA; + index[3] = PFS_ID_3AREA; + for (i = 1; i < ARRLEN(index); i++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, index[i], (u8*)temp)); + __osIdCheckSum((u16*)temp, &sum, &isum); + if (temp->checksum == sum && temp->inverted_checksum == isum) { + break; + } + } + + if (i == ARRLEN(index)) { + return PFS_ERR_ID_FATAL; + } + + for (j = 0; j < ARRLEN(index); j++) { + if (j != i) { + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, index[j], (u8*)temp, TRUE)); + } + } + + return 0; +} + +s32 __osGetId(OSPfs* pfs) { +#if BUILD_VERSION < VERSION_J + int k; +#endif + u16 sum; + u16 isum; + u8 temp[BLOCKSIZE]; + __OSPackId newid; + s32 ret; + __OSPackId* id; + + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp)); + __osIdCheckSum((u16*)temp, &sum, &isum); + id = (__OSPackId*)temp; + + if (id->checksum != sum || id->inverted_checksum != isum) { + ret = __osCheckPackId(pfs, id); + + if (ret == PFS_ERR_ID_FATAL) { + ERRCK(__osRepairPackId(pfs, id, &newid)); + id = &newid; + } else if (ret != 0) { + return ret; + } + } + + if ((id->deviceid & 1) == 0) { + ERRCK(__osRepairPackId(pfs, id, &newid)); + id = &newid; + + if ((id->deviceid & 1) == 0) { + return PFS_ERR_DEVICE; + } + } + +#if BUILD_VERSION >= VERSION_J + bcopy(id, pfs->id, BLOCKSIZE); +#else + for (k = 0; k < ARRLEN(pfs->id); k++) { + pfs->id[k] = ((u8*)id)[k]; + } +#endif + pfs->version = id->version; + pfs->banks = id->banks; + pfs->inode_start_page = 1 + DEF_DIR_PAGES + (2 * pfs->banks); + pfs->dir_size = 16; + pfs->inode_table = PFS_ONE_PAGE; + pfs->minode_table = (1 + pfs->banks) * PFS_ONE_PAGE; + pfs->dir_table = pfs->minode_table + pfs->banks * PFS_ONE_PAGE; + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label)); + return 0; +} + +s32 __osCheckId(OSPfs* pfs) { +#if BUILD_VERSION < VERSION_J + int k; +#endif + u8 temp[BLOCKSIZE]; + s32 ret; + +#if BUILD_VERSION >= VERSION_J + if (pfs->activebank != 0) { + ret = __osPfsSelectBank(pfs, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = __osPfsSelectBank(pfs, 0); + } + + if (ret != 0) { + return ret; + } + } +#else + SET_ACTIVEBANK_TO_ZERO(); +#endif + + ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp); + + if (ret != 0) { + if (ret != PFS_ERR_NEW_PACK) { + return ret; + } + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, (u8*)temp)); + } + +#if BUILD_VERSION >= VERSION_J + if (bcmp(pfs->id, temp, BLOCKSIZE) != 0) { + return PFS_ERR_NEW_PACK; + } +#else + for (k = 0; k < ARRLEN(temp); k++) { + if (pfs->id[k] != temp[k]) + return PFS_ERR_NEW_PACK; + } +#endif + + return 0; +} + +s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) { + u8 sum; + int j; + s32 ret; + int offset; + u8* addr; + +#if BUILD_VERSION >= VERSION_J + if (flag == PFS_READ && bank == __osPfsInodeCacheBank && (pfs->channel == __osPfsInodeCacheChannel)) { + bcopy(&__osPfsInodeCache, inode, sizeof(__OSInode)); + return 0; + } +#endif + + SET_ACTIVEBANK_TO_ZERO(); + + offset = (bank > 0) ? 1 : pfs->inode_start_page; + + if (flag == PFS_WRITE) { + inode->inode_page[0].inode_t.page = + __osSumcalc((u8*)&inode->inode_page[offset], (PFS_INODE_SIZE_PER_PAGE - offset) * 2); + } + + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * BLOCKSIZE); + + if (flag == PFS_WRITE) { + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr, FALSE); + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr, FALSE); + } else { + ret = __osContRamRead(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr); + } + + if (ret != 0) { + return ret; + } + } + + if (flag == PFS_READ) { + sum = __osSumcalc((u8*)&inode->inode_page[offset], (PFS_INODE_SIZE_PER_PAGE - offset) * 2); + if (sum != inode->inode_page[0].inode_t.page) { + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * BLOCKSIZE); + ret = __osContRamRead(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr); + } + +#if BUILD_VERSION >= VERSION_J + sum = __osSumcalc((u8*)&inode->inode_page[offset], (PFS_INODE_SIZE_PER_PAGE - offset) * 2); +#endif + + if (sum != inode->inode_page[0].inode_t.page) { + return PFS_ERR_INCONSISTENT; + } + + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * BLOCKSIZE); + ret = + __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + bank * PFS_ONE_PAGE + j, addr, FALSE); + } + } +#if BUILD_VERSION < VERSION_J + else { + for (j = 0; j < PFS_ONE_PAGE; j++) { + addr = ((u8*)inode->inode_page + j * 32); + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + bank * PFS_ONE_PAGE + j, addr, + FALSE); + } + } +#endif + } + +#if BUILD_VERSION >= VERSION_J + __osPfsInodeCacheBank = bank; + bcopy(inode, &__osPfsInodeCache, sizeof(__OSInode)); + __osPfsInodeCacheChannel = pfs->channel; +#endif + + return 0; +} + +// This was moved into it's own file in 2.0J +#if BUILD_VERSION < VERSION_J +s32 __osPfsSelectBank(OSPfs* pfs) { + u8 temp[BLOCKSIZE]; + int i; + s32 ret = 0; + + for (i = 0; i < BLOCKSIZE; i++) { + temp[i] = pfs->activebank; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_DETECT, temp, FALSE); + return ret; +} +#endif + +#ifdef _DEBUG +s32 __osDumpId(OSPfs* pfs) { + u8 id[BLOCKSIZE]; + __OSPackId* temp; + s32 ret; + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, id)); + + temp = (__OSPackId*)id; + rmonPrintf("repaired %x\n", temp->repaired); + rmonPrintf("random %x\n", temp->random); + rmonPrintf("serial_mid %llu\n", temp->serial_mid); + rmonPrintf("serial_low %llu\n", temp->serial_low); + rmonPrintf("deviceid %x\n", temp->deviceid); + rmonPrintf("banks %x\n", temp->banks); + rmonPrintf("version %x\n", temp->version); + rmonPrintf("checksum %x\n", temp->checksum); + rmonPrintf("inverted_checksum %x\n", temp->inverted_checksum); + return 0; +} +#endif diff --git a/lib/hackerlibultra/src/io/contquery.c b/lib/hackerlibultra/src/io/contquery.c new file mode 100644 index 00000000..80dc788d --- /dev/null +++ b/lib/hackerlibultra/src/io/contquery.c @@ -0,0 +1,32 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +/** + * Starts to read the values for SI device status and type which are connected to the controller port + * and joyport connector. + */ +s32 osContStartQuery(OSMesgQueue* mq) { + s32 ret = 0; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_REQUEST_STATUS) { + __osPackRequestData(CONT_CMD_REQUEST_STATUS); + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + __osContLastCmd = CONT_CMD_REQUEST_STATUS; + __osSiRelAccess(); + return ret; +} + +/** + * Returns the values from osContStartQuery to status. Both functions must be paired for use. + */ +void osContGetQuery(OSContStatus* data) { + u8 pattern; + __osContGetInitData(&pattern, data); +} diff --git a/lib/ultra/io/contramread.c b/lib/hackerlibultra/src/io/contramread.c similarity index 66% rename from lib/ultra/io/contramread.c rename to lib/hackerlibultra/src/io/contramread.c index eba6d382..c3fcbff3 100644 --- a/lib/ultra/io/contramread.c +++ b/lib/hackerlibultra/src/io/contramread.c @@ -1,41 +1,16 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" #include "PR/rcp.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" -#ifdef BBPLAYER -s32 __osContRamRead(UNUSED OSMesgQueue* mq, int channel, u16 address, u8* buffer) { - s32 ret; +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) - __osSiGetAccess(); - - ret = 0; - if (__osBbPakAddress[channel] != 0) { - if (__osBbPakSize - 0x20 >= address * 0x20) { - int i; - - for (i = 0; i < 0x20; i++) { - buffer[i] = (__osBbPakAddress[channel] + address * 0x20)[i]; - } - } - } else { - ret = 1; - } - - __osSiRelAccess(); - - return ret; -} -#else - -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J s32 __osPfsLastChannel = -1; s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { - s32 ret; + s32 ret = 0; s32 i; u8* ptr; s32 retry = 2; @@ -45,7 +20,7 @@ s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { do { ptr = (u8*)&__osPfsPifRam; - if (__osContLastCmd != CONT_CMD_READ_PAK || __osPfsLastChannel != channel) { + if (__osContLastCmd != CONT_CMD_READ_PAK || (u32)__osPfsLastChannel != channel) { __osContLastCmd = CONT_CMD_READ_PAK; __osPfsLastChannel = channel; @@ -66,12 +41,17 @@ s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { ptr += channel; } - CONT_READFORMAT_ADDR(READFORMAT(ptr), address); +#if BUILD_VERSION >= VERSION_J + READFORMAT(ptr)->addrh = address >> 3; + READFORMAT(ptr)->addrl = (u8)((address << 5) | __osContAddressCrc(address)); +#else + READFORMAT(ptr)->address = (address << 0x5) | __osContAddressCrc(address); +#endif - __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); - __osSiRawStartDma(OS_READ, &__osPfsPifRam); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); ret = CHNL_ERR(*READFORMAT(ptr)); @@ -86,23 +66,23 @@ s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { ret = PFS_ERR_CONTRFAIL; } } else { - bcopy(&READFORMAT(ptr)->data, buffer, BLOCKSIZE); + bcopy(READFORMAT(ptr)->data, buffer, BLOCKSIZE); } } else { ret = PFS_ERR_NOPACK; } } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); __osSiRelAccess(); - return ret; } #else -void __osPackRamReadData(int channel, u16 address); -s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) { +static void __osPackRamReadData(int channel, u16 address); + +s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { s32 ret = 0; int i; - u8 *ptr = (u8 *)&__osPfsPifRam; + u8* ptr = (u8*)&__osPfsPifRam; __OSContRamReadFormat ramreadformat; int retry = 2; @@ -115,8 +95,8 @@ s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) { do { ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ptr = (u8*)&__osPfsPifRam; - ptr = (u8 *)&__osPfsPifRam; if (channel != 0) { for (i = 0; i < channel; i++) { ptr++; @@ -127,8 +107,7 @@ s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) { ret = CHNL_ERR(ramreadformat); if (ret == 0) { - u8 c; - c = __osContDataCrc((u8*)&ramreadformat.data); + u8 c = __osContDataCrc((u8*)&ramreadformat.data); if (c != ramreadformat.datacrc) { ret = __osPfsGetStatus(mq, channel); @@ -139,7 +118,7 @@ s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) { ret = PFS_ERR_CONTRFAIL; } else { - for (i = 0; i < ARRAY_COUNT(ramreadformat.data); i++) { + for (i = 0; i < ARRLEN(ramreadformat.data); i++) { *buffer++ = ramreadformat.data[i]; } } @@ -149,38 +128,37 @@ s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) { } while ((ret == PFS_ERR_CONTRFAIL) && retry-- >= 0); __osSiRelAccess(); + return ret; } -void __osPackRamReadData(int channel, u16 address) { - u8 *ptr; +static void __osPackRamReadData(int channel, u16 address) { + u8* ptr; __OSContRamReadFormat ramreadformat; int i; - ptr = (u8 *)__osPfsPifRam.ramarray; - - CONT_PIFRAM_SET(__osPfsPifRam, 0, CONT_CMD_EXE); - + ptr = (u8*)__osPfsPifRam.ramarray; + __osPfsPifRam.pifstatus = CONT_CMD_EXE; ramreadformat.dummy = CONT_CMD_NOP; ramreadformat.txsize = CONT_CMD_READ_PAK_TX; ramreadformat.rxsize = CONT_CMD_READ_PAK_RX; ramreadformat.cmd = CONT_CMD_READ_PAK; - CONT_READFORMAT_ADDR(ramreadformat, address); + ramreadformat.address = (address << 0x5) | __osContAddressCrc(address); ramreadformat.datacrc = CONT_CMD_NOP; - for (i = 0; i < ARRAY_COUNT(ramreadformat.data); i++) { + + for (i = 0; i < ARRLEN(ramreadformat.data); i++) { ramreadformat.data[i] = CONT_CMD_NOP; } if (channel != 0) { for (i = 0; i < channel; i++) { - *ptr++ = 0; + *ptr++ = CONT_CMD_REQUEST_STATUS; } } - *READFORMAT(ptr) = ramreadformat; + *(__OSContRamReadFormat*)ptr = ramreadformat; ptr += sizeof(__OSContRamReadFormat); ptr[0] = CONT_CMD_END; } -#endif #endif diff --git a/lib/ultra/io/contramwrite.c b/lib/hackerlibultra/src/io/contramwrite.c similarity index 70% rename from lib/ultra/io/contramwrite.c rename to lib/hackerlibultra/src/io/contramwrite.c index 987fc616..e8427798 100644 --- a/lib/ultra/io/contramwrite.c +++ b/lib/hackerlibultra/src/io/contramwrite.c @@ -1,39 +1,14 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" #include "PR/rcp.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" -#ifdef BBPLAYER -s32 __osContRamWrite(UNUSED OSMesgQueue *mq, int channel, u16 address, u8 *buffer, s32 force) { - s32 ret = 0; +extern s32 __osPfsLastChannel; - if ((force != TRUE) && (address < PFS_LABEL_AREA) && (address != 0)) { - return 0; - } +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) - __osSiGetAccess(); - - if (__osBbPakAddress[channel] != 0) { - if (__osBbPakSize - 0x20 >= address * 0x20) { - int i = 0; - - for (i = 0; i < 0x20; i++) { - (__osBbPakAddress[channel] + address * 0x20)[i] = buffer[i]; - } - } - } else { - ret = 1; - } - - __osSiRelAccess(); - return ret; -} -#else - -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) { s32 ret = 0; s32 i; @@ -48,9 +23,9 @@ s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int __osSiGetAccess(); do { - ptr = (u8 *) __osPfsPifRam.ramarray; + ptr = (u8*)__osPfsPifRam.ramarray; - if (__osContLastCmd != CONT_CMD_WRITE_PAK || __osPfsLastChannel != channel) { + if (__osContLastCmd != CONT_CMD_WRITE_PAK || (u32)__osPfsLastChannel != channel) { __osContLastCmd = CONT_CMD_WRITE_PAK; __osPfsLastChannel = channel; @@ -71,7 +46,12 @@ s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int ptr += channel; } - CONT_READFORMAT_ADDR(READFORMAT(ptr), address); +#if BUILD_VERSION >= VERSION_J + READFORMAT(ptr)->addrh = address >> 3; + READFORMAT(ptr)->addrl = ((address << 5) | __osContAddressCrc(address)); +#else + READFORMAT(ptr)->address = (address << 0x5) | __osContAddressCrc(address); +#endif bcopy(buffer, READFORMAT(ptr)->data, BLOCKSIZE); @@ -102,19 +82,21 @@ s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int return ret; } #else -extern s32 __osPfsGetStatus(OSMesgQueue *, s32); -void __osPackRamWriteData(s32 channel, u16 address, u8 *buffer); -s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, s32 force) { +static void __osPackRamWriteData(int channel, u16 address, u8* buffer); + +s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) { s32 ret = 0; s32 i; u8* ptr = (u8*)&__osPfsPifRam; __OSContRamReadFormat ramreadformat; s32 retry = 2; + u8 crc; - if (force != TRUE && address < PFS_LABEL_AREA && address != 0) { + if ((force != TRUE) && (address < PFS_LABEL_AREA) && (address != 0)) { return 0; } + __osSiGetAccess(); __osContLastCmd = CONT_CMD_WRITE_PAK; __osPackRamWriteData(channel, address, buffer); @@ -124,7 +106,7 @@ s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, s32 do { ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); - ptr = (u8 *)&__osPfsPifRam; + ptr = (u8*)&__osPfsPifRam; if (channel != 0) { for (i = 0; i < channel; i++) { @@ -152,38 +134,37 @@ s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, s32 } while ((ret == PFS_ERR_CONTRFAIL) && retry-- >= 0); __osSiRelAccess(); + return ret; } -void __osPackRamWriteData(int channel, u16 address, u8 *buffer) { - u8 *ptr; +static void __osPackRamWriteData(int channel, u16 address, u8* buffer) { + u8* ptr; __OSContRamReadFormat ramreadformat; int i; - ptr = (u8 *) __osPfsPifRam.ramarray; - - CONT_PIFRAM_SET(__osPfsPifRam, 0, CONT_CMD_EXE); - + ptr = (u8*)__osPfsPifRam.ramarray; + __osPfsPifRam.pifstatus = CONT_CMD_EXE; ramreadformat.dummy = CONT_CMD_NOP; ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX; ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX; ramreadformat.cmd = CONT_CMD_WRITE_PAK; - CONT_READFORMAT_ADDR(ramreadformat, address); + ramreadformat.address = (address << 0x5) | __osContAddressCrc(address); ramreadformat.datacrc = CONT_CMD_NOP; - for (i = 0; i < ARRAY_COUNT(ramreadformat.data); i++) { + + for (i = 0; i < ARRLEN(ramreadformat.data); i++) { ramreadformat.data[i] = *buffer++; } if (channel != 0) { for (i = 0; i < channel; i++) { - *ptr++ = 0; + *ptr++ = CONT_CMD_REQUEST_STATUS; } } - *READFORMAT(ptr) = ramreadformat; + *(__OSContRamReadFormat*)ptr = ramreadformat; ptr += sizeof(__OSContRamReadFormat); ptr[0] = CONT_CMD_END; } -#endif #endif diff --git a/lib/hackerlibultra/src/io/contreaddata.c b/lib/hackerlibultra/src/io/contreaddata.c new file mode 100644 index 00000000..a2b17302 --- /dev/null +++ b/lib/hackerlibultra/src/io/contreaddata.c @@ -0,0 +1,69 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +static void __osPackReadData(void); + +s32 osContStartReadData(OSMesgQueue* mq) { + s32 ret = 0; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_READ_BUTTON) { + __osPackReadData(); + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + __osContLastCmd = CONT_CMD_READ_BUTTON; + __osSiRelAccess(); + + return ret; +} + +void osContGetReadData(OSContPad* data) { + u8* ptr = (u8*)__osContPifRam.ramarray; + __OSContReadFormat readformat; + int i; + + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContReadFormat), data++) { + readformat = *(__OSContReadFormat*)ptr; + data->errno = CHNL_ERR(readformat); + + if (data->errno != 0) { + continue; + } + + data->button = readformat.button; + data->stick_x = readformat.stick_x; + data->stick_y = readformat.stick_y; + } +} + +static void __osPackReadData(void) { + u8* ptr = (u8*)__osContPifRam.ramarray; + __OSContReadFormat readformat; + int i; + + for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { + __osContPifRam.ramarray[i] = 0; + } + + __osContPifRam.pifstatus = CONT_CMD_EXE; + readformat.dummy = CONT_CMD_NOP; + readformat.txsize = CONT_CMD_READ_BUTTON_TX; + readformat.rxsize = CONT_CMD_READ_BUTTON_RX; + readformat.cmd = CONT_CMD_READ_BUTTON; + readformat.button = 0xFFFF; + readformat.stick_x = -1; + readformat.stick_y = -1; + + for (i = 0; i < __osMaxControllers; i++) { + *(__OSContReadFormat*)ptr = readformat; + ptr += sizeof(__OSContReadFormat); + } + + *ptr = CONT_CMD_END; +} diff --git a/lib/hackerlibultra/src/io/contreset.c b/lib/hackerlibultra/src/io/contreset.c new file mode 100644 index 00000000..c752f5b8 --- /dev/null +++ b/lib/hackerlibultra/src/io/contreset.c @@ -0,0 +1,51 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +void __osPackResetData(void); + +s32 osContReset(OSMesgQueue* mq, OSContStatus* data) { + u8 pattern; + s32 ret; + + __osSiGetAccess(); + + if (__osContLastCmd != CONT_CMD_RESET) { + __osPackResetData(); + + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osPackRequestData(CONT_CMD_RESET); + + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osContLastCmd = CONT_CMD_RESET; + } + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + __osContGetInitData(&pattern, data); + __osSiRelAccess(); + + return ret; +} + +void __osPackResetData(void) { + u8* ptr; + int i; + + __osContPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osContPifRam.ramarray; + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = CONT_CMD_CHANNEL_RESET; + } + + *ptr = CONT_CMD_END; +} diff --git a/lib/hackerlibultra/src/io/controller.c b/lib/hackerlibultra/src/io/controller.c new file mode 100644 index 00000000..fd87b163 --- /dev/null +++ b/lib/hackerlibultra/src/io/controller.c @@ -0,0 +1,101 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +OSPifRam __osContPifRam; +u8 __osContLastCmd; +u8 __osMaxControllers; + +OSTimer __osEepromTimer; +OSMesgQueue __osEepromTimerQ ALIGNED(0x8); +OSMesg __osEepromTimerMsg; + +s32 __osContinitialized = FALSE; + +s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) { + OSMesg dummy; + s32 ret = 0; + OSTime t; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + + if (__osContinitialized) { + return 0; + } + + __osContinitialized = TRUE; + + t = osGetTime(); + if (t < OS_USEC_TO_CYCLES(500000)) { + osCreateMesgQueue(&timerMesgQueue, &dummy, 1); + osSetTimer(&mytimer, OS_USEC_TO_CYCLES(500000) - t, 0, &timerMesgQueue, &dummy); + osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); + } + + __osMaxControllers = 4; + + __osPackRequestData(CONT_CMD_REQUEST_STATUS); + + ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); + osRecvMesg(mq, &dummy, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); + osRecvMesg(mq, &dummy, OS_MESG_BLOCK); + + __osContGetInitData(bitpattern, data); + __osContLastCmd = CONT_CMD_REQUEST_STATUS; + __osSiCreateAccessQueue(); + osCreateMesgQueue(&__osEepromTimerQ, &__osEepromTimerMsg, 1); + + return ret; +} + +void __osContGetInitData(u8* pattern, OSContStatus* data) { + u8* ptr; + __OSContRequesFormat requestHeader; + int i; + u8 bits = 0; + + ptr = (u8*)__osContPifRam.ramarray; + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestHeader), data++) { + requestHeader = *(__OSContRequesFormat*)ptr; + data->errno = CHNL_ERR(requestHeader); + + if (data->errno != 0) { + continue; + } + + data->type = requestHeader.typel << 8 | requestHeader.typeh; + data->status = requestHeader.status; + bits |= 1 << i; + } + *pattern = bits; +} + +void __osPackRequestData(u8 cmd) { + u8* ptr; + __OSContRequesFormat requestHeader; + s32 i; + + for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { + __osContPifRam.ramarray[i] = 0; + } + + __osContPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osContPifRam.ramarray; + requestHeader.dummy = CONT_CMD_NOP; + requestHeader.txsize = CONT_CMD_RESET_TX; + requestHeader.rxsize = CONT_CMD_RESET_RX; + requestHeader.cmd = cmd; + requestHeader.typeh = CONT_CMD_NOP; + requestHeader.typel = CONT_CMD_NOP; + requestHeader.status = CONT_CMD_NOP; + requestHeader.dummy1 = CONT_CMD_NOP; + + for (i = 0; i < __osMaxControllers; i++) { + *(__OSContRequesFormat*)ptr = requestHeader; + ptr += sizeof(requestHeader); + } + *ptr = CONT_CMD_END; +} diff --git a/lib/hackerlibultra/src/io/contsetch.c b/lib/hackerlibultra/src/io/contsetch.c new file mode 100644 index 00000000..2f7a33fe --- /dev/null +++ b/lib/hackerlibultra/src/io/contsetch.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +/* + * This function specifies the number of devices for the functions to access when those functions access + * to multiple direct SI devices. + */ +s32 osContSetCh(u8 ch) { + s32 ret = 0; + + __osSiGetAccess(); + + if (ch > MAXCONTROLLERS) { + __osMaxControllers = MAXCONTROLLERS; + } else { + __osMaxControllers = ch; + } + + __osContLastCmd = CONT_CMD_END; + __osSiRelAccess(); + return ret; +} diff --git a/lib/hackerlibultra/src/io/crc.c b/lib/hackerlibultra/src/io/crc.c new file mode 100644 index 00000000..207ffe45 --- /dev/null +++ b/lib/hackerlibultra/src/io/crc.c @@ -0,0 +1,221 @@ +/** + * File: crc.c + * Description: Functions to compute Cyclic Redundancy Check for specific addresses and data. + * + * CRC notes: + * + * General + * === + * - CRC (Cyclic Redundancy Check) is a way of verifying that no errors were introduced in transmitted + * data. + * - It reads the entire message and generates a check number that is appended to it. + * - A CRC is specified by the length `n` of the check number and a number (called the generator) + * smaller than `1 << n`. + * - Different generators have different error-checking capabilities. The choice of a generator is a + * sophisticated mathematical problem. + * + * Mathematical basis + * === + * - The algorithm is based on division of polynomials. The polynomials have coefficients in the field + * with two elements, 0 and 1, with addition given by XOR and multiplication by AND (it turns out this + * really is a field). Subtraction is the same as addition. + * - There is a one-to-one correspondence between binary polynomials and binary numbers: just evaluate + * the polynomial at 2, or write down an \f$ X^k \f$ corresponding to each `1 << k` the number is + * composed of. + * - The message bits `m{L}m{L-1}...m{1}m{0}` correspond to a polynomial \f$ m(X) = m_L X^L + m_{L-1} + * X^{L-1} + \dotsb + m_1 X^1 + m_0 X^0 \f$. We multiply this by \f$ X^n \f$ to make a space to insert + * the remainder at the end; this new polynomial will be the dividend. + * - The generator `p{n-1}p{n-2}...p{1}p{0}` corresponds to a polynomial \f$ p(X) = X^n + p_{n-1} + * X^{n-1} + \dotsb + p_1 X^1 + p_0 X^0 \f$: the leading term is omitted in the binary description + * because it is always \f$ X^n \f$. The generator polynomial is the divisor. + * - The usual division algorithm is followed: we look along the dividend until we see a nonzero + * coefficient, then subtract an appropriate multiple of the divisor to cancel it out. We repeat this + * until we reach the end of the number. + * - Arithmetic in the field with two elements is particularly simple: subtraction is identical to + * addition, so also given by XOR, and the only multipliers required for subtracting the divisor are \f$ + * X^k \f$. + * - After applying the algorithm, the output is a polynomial \f$ R(X) \f$ so that we have + * \f[ m(X) X^n = Q(X) p(X) + R(X) \f] + * (\f$ R(X) \f$ is the *remainder after dividing by \f$ p(X) \f$*). + * - Therefore, \f$ m(X) X^n - R(X) \f$ is divisible by the generator polynomial. This means that if we + * append the binary number corresponding to \f$ R(X) \f$ to the message and rerun the algorithm, we + * will get 0 if no errors have been introduced. + * + * + * Implementation + * === + * - We translate the binary polynomials to binary numbers by evaluating them at 2. The leading term in + * the generator polynomial is always \f$ X^n \f$, so we discard it to save space. In the binary field, + * subtraction is the same as addition, and given by XOR. Multiplication by \f$ X \f$ is given by + * shifting left. + * - Instead of fixing the message and moving the divisor polynomial right, we scan the message from the + * most significant digit, adding it to the end of the return value, (that is, for 1s, we shift and add + * 1, for 0s we just shift, effectively using the return value as a shift register). + * - When the return value has a 1 in the nth position (corresponding to the leading term in the + * generator polynomial), we binary-subtract (i.e. XOR) the return value with the generator polynomial's + * number. + * - This is repeated until we reach the end of the message. + * - Finally, to take into account the final multiplication by \f$ X^n \f$, we run another loop, which + * acts like we passed \f$ n \f$ more digits in the message that are all zero. Remember this gives us + * the extra space at the end for the check digits to be added. + * + * + * - To specify a CRC, at minimum we need the length of the check (i.e. the degree of the generator + * polynomial), \f$ n + * \f$, and the rest of the generator polynomial. This is usually expressed in the binary form, written + * as hex for compactness. Algorithms may also reverse or invert certain parts of the data or check to + * improve particular aspects of the algorithm, but the libultra functions use the simplest version. + * + * + * Resources + * === + * - Wikipedia: [Cyclic redundancy check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check), and + * more specifically [Computation of cyclic redundancy + * checks](https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks) + * - Ben Eater has two videos on CRCs, the last two linked on [Error Detection | Ben + * Eater](https://eater.net/crc) + * - A page that specifically describes the same shift-register-style algorithms as libultra uses: + * [Understanding and implementing CRC (Cyclic Redundancy Check) calculation + * ](http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html) + */ +#include "PR/os_internal.h" + +#if BUILD_VERSION >= VERSION_J + +#define ADDRESS_CRC_MESSAGE_LENGTH 10 +#define ADDRESS_CRC_LENGTH 5 +#define ADDRESS_CRC_GENERATOR 0x15 +#define ADDRESS_CRC_MASK ((1 << ADDRESS_CRC_LENGTH) - 1) + +/** + * CRC-5 with the generating polynomial \f$ x^5 + x^4 + x^2 + 1 \f$, AKA 0x15 = 0b(1)1 0101. + * It only works on the bits from 0x7FF = 11 11111111, i.e. 10 bits. + * + * Usually used as __osContAddressCrc(addr) | (addr << 5) to add the CRC to the end. The overall length + * of 10 + 5 bits allows the address + CRC to fit into one s16. + * + * `addr` is the address of a block in the mempak, only valid up to 0x7FF. + */ +u8 __osContAddressCrc(u16 addr) { + u32 temp = 0; + u32 i = (1 << ADDRESS_CRC_MESSAGE_LENGTH); + + do { + // temp is used as a shift register for the CRC + temp <<= 1; + + if ((u32)addr & i) { + if (temp & (1 << ADDRESS_CRC_LENGTH)) { + // Same as temp++; temp ^= 0x15 since last bit always 0 after the shift + temp ^= ADDRESS_CRC_GENERATOR - 1; + } else { + ++temp; + } + } else if (temp & (1 << ADDRESS_CRC_LENGTH)) { + temp ^= ADDRESS_CRC_GENERATOR; + } + + i >>= 1; + } while (i != 0); + + // Acts like 5 bits of 0s are appended to addr + i = ADDRESS_CRC_LENGTH; + do { + temp <<= 1; + if (temp & (1 << ADDRESS_CRC_LENGTH)) { + temp ^= ADDRESS_CRC_GENERATOR; + } + } while (--i != 0); + + // Discard the irrelevant bits above the actual remainder + return temp & ADDRESS_CRC_MASK; +} + +#define DATA_CRC_MESSAGE_BYTES 32 +#define DATA_CRC_LENGTH 8 +#define DATA_CRC_GENERATOR 0x85 + +/** + * CRC-8 with generating polynomial \f$ x^8 + x^7 + x^2 + 1 \f$, AKA 0x85 = 0b(1) 1000 0101. + * Expects exactly 0x20 = 32 bytes of data. + */ +u8 __osContDataCrc(u8* data) { + u32 temp = 0; + u32 i; + u32 j; + + for (i = DATA_CRC_MESSAGE_BYTES; i; --i) { + // Loop over each bit in the byte starting with most significant + for (j = (1 << (DATA_CRC_LENGTH - 1)); j; j >>= 1) { + temp <<= 1; + + if ((*data & j) != 0) { + if ((temp & (1 << DATA_CRC_LENGTH)) != 0) { + // Same as ret++; ret ^= 0x85 since last bit always 0 after the shift + temp ^= DATA_CRC_GENERATOR - 1; + } else { + ++temp; + } + } else if (temp & (1 << DATA_CRC_LENGTH)) { + temp ^= DATA_CRC_GENERATOR; + } + } + + data++; + } + do { + temp <<= 1; + + if (temp & (1 << DATA_CRC_LENGTH)) { + temp ^= DATA_CRC_GENERATOR; + } + } while (++i < DATA_CRC_LENGTH); + + return temp; +} + +#else + +u8 __osContAddressCrc(u16 addr) { + u8 temp = 0; + u8 temp2; + int i; + + for (i = 0; i < 16; i++) { + temp2 = (temp & 0x10) ? 0x15 : 0; + + temp <<= 1; + temp |= (u8)((addr & 0x400) ? 1 : 0); + addr <<= 1; + temp ^= temp2; + } + + return temp & 0x1f; +} + +u8 __osContDataCrc(u8* data) { + u8 temp = 0; + u8 temp2; + int i; + int j; + + for (i = 0; i <= 32; i++) { + for (j = 7; j > -1; j--) { + temp2 = (temp & 0x80) ? 0x85 : 0; + + temp <<= 1; + + if (i == 32) { + temp &= -1; + } else { + temp |= ((*data & (1 << j)) ? 1 : 0); + } + + temp ^= temp2; + } + data++; + } + return temp; +} + +#endif diff --git a/lib/hackerlibultra/src/io/devmgr.c b/lib/hackerlibultra/src/io/devmgr.c new file mode 100644 index 00000000..c0d78bb0 --- /dev/null +++ b/lib/hackerlibultra/src/io/devmgr.c @@ -0,0 +1,108 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/piint.h" + +void __osDevMgrMain(void* args) { + OSIoMesg* mb; + OSMesg em; + OSMesg dummy; + s32 ret; + OSDevMgr* dm; + s32 messageSend = 0; + + dm = (OSDevMgr*)args; + mb = NULL; + ret = 0; + + while (TRUE) { + osRecvMesg(dm->cmdQueue, (OSMesg)&mb, OS_MESG_BLOCK); + + if (mb->piHandle != NULL && mb->piHandle->type == DEVICE_TYPE_64DD + && (mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0 + || mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_1)) { + __OSBlockInfo* blockInfo; + __OSTranxInfo* info; + info = &mb->piHandle->transferInfo; + blockInfo = &info->block[info->blockNum]; + info->sectorNum = -1; + + if (info->transferMode != LEO_SECTOR_MODE) { + blockInfo->dramAddr = (void*)((u32)blockInfo->dramAddr - blockInfo->sectorSize); + } + + if (info->transferMode == LEO_TRACK_MODE && mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0) { + messageSend = 1; + } else { + messageSend = 0; + } + + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + __osResetGlobalIntMask(OS_IM_PI); + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, (info->bmCtlShadow | 0x80000000)); + + readblock1: + osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); + info = &mb->piHandle->transferInfo; + blockInfo = &info->block[info->blockNum]; + + if (blockInfo->errStatus == LEO_ERROR_29) { + u32 stat; + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow); + __osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat); + + if (stat & LEO_STATUS_MECHANIC_INTERRUPT) { + __osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); + } + + blockInfo->errStatus = LEO_ERROR_4; + IO_WRITE(PI_STATUS_REG, PI_CLR_INTR); + __osSetGlobalIntMask(OS_IM_PI | SR_IBIT4); + } + + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + + if (messageSend == 1 && mb->piHandle->transferInfo.block[0].errStatus == LEO_ERROR_GOOD) { + messageSend = 0; + goto readblock1; + } + + osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); + if (mb->piHandle->transferInfo.blockNum == 1) { + osYieldThread(); + } + } else { + switch (mb->hdr.type) { + case OS_MESG_TYPE_DMAREAD: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_DMAWRITE: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_EDMAREAD: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_EDMAWRITE: + osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); + ret = dm->edma(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); + break; + case OS_MESG_TYPE_LOOPBACK: + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + ret = -1; + break; + default: + ret = -1; + break; + } + + if (ret == 0) { + osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); + osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); + osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); + } + } + } +} diff --git a/lib/hackerlibultra/src/io/dp.c b/lib/hackerlibultra/src/io/dp.c new file mode 100644 index 00000000..e636217b --- /dev/null +++ b/lib/hackerlibultra/src/io/dp.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osDpDeviceBusy(void) { + register u32 stat = IO_READ(DPC_STATUS_REG); + + if (stat & DPC_STATUS_DMA_BUSY) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/lib/hackerlibultra/src/io/dpctr.c b/lib/hackerlibultra/src/io/dpctr.c new file mode 100644 index 00000000..a53b0305 --- /dev/null +++ b/lib/hackerlibultra/src/io/dpctr.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +void osDpGetCounters(u32* array) { + *array++ = IO_READ(DPC_CLOCK_REG); + *array++ = IO_READ(DPC_BUFBUSY_REG); + *array++ = IO_READ(DPC_PIPEBUSY_REG); + *array++ = IO_READ(DPC_TMEM_REG); +} diff --git a/lib/hackerlibultra/src/io/dpgetstat.c b/lib/hackerlibultra/src/io/dpgetstat.c new file mode 100644 index 00000000..54dd3acd --- /dev/null +++ b/lib/hackerlibultra/src/io/dpgetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 osDpGetStatus(void) { + return IO_READ(DPC_STATUS_REG); +} diff --git a/lib/hackerlibultra/src/io/dpsetnextbuf.c b/lib/hackerlibultra/src/io/dpsetnextbuf.c new file mode 100644 index 00000000..cbf3a6f2 --- /dev/null +++ b/lib/hackerlibultra/src/io/dpsetnextbuf.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osDpSetNextBuffer(void* bufPtr, u64 size) { + register u32 stat; + +#ifdef _DEBUG + if ((u32)bufPtr & 0x7) { + __osError(ERR_OSDPSETNEXTBUFFER_ADDR, 1, bufPtr); + return -1; + } + if (size & 0x7) { + __osError(ERR_OSDPSETNEXTBUFFER_SIZE, 1, size); + return -1; + } +#endif + + if (__osDpDeviceBusy()) { + return -1; + } + + IO_WRITE(DPC_STATUS_REG, DPC_CLR_XBUS_DMEM_DMA); + + while (TRUE) { + stat = IO_READ(DPC_STATUS_REG); + if ((stat & DPC_STATUS_XBUS_DMEM_DMA) == 0) { + break; + } + } + + IO_WRITE(DPC_START_REG, osVirtualToPhysical(bufPtr)); + IO_WRITE(DPC_END_REG, osVirtualToPhysical(bufPtr) + size); + return 0; +} diff --git a/lib/hackerlibultra/src/io/dpsetstat.c b/lib/hackerlibultra/src/io/dpsetstat.c new file mode 100644 index 00000000..5b538670 --- /dev/null +++ b/lib/hackerlibultra/src/io/dpsetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osDpSetStatus(u32 data) { + IO_WRITE(DPC_STATUS_REG, data); +} diff --git a/lib/hackerlibultra/src/io/driverominit.c b/lib/hackerlibultra/src/io/driverominit.c new file mode 100644 index 00000000..bfa9f76c --- /dev/null +++ b/lib/hackerlibultra/src/io/driverominit.c @@ -0,0 +1,31 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/macros.h" + +OSPiHandle DriveRomHandle ALIGNED(0x8); + +OSPiHandle* osDriveRomInit(void) { + u32 saveMask; + + if (DriveRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR1)) { + return &DriveRomHandle; + } + + DriveRomHandle.type = DEVICE_TYPE_BULK; + DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1); + DriveRomHandle.latency = 64; + DriveRomHandle.pulse = 7; + DriveRomHandle.pageSize = 7; + DriveRomHandle.relDuration = 2; + DriveRomHandle.domain = PI_DOMAIN1; + DriveRomHandle.speed = 0; + + bzero(&DriveRomHandle.transferInfo, sizeof(__OSTranxInfo)); + + saveMask = __osDisableInt(); + DriveRomHandle.next = __osPiTable; + __osPiTable = &DriveRomHandle; + __osRestoreInt(saveMask); + + return &DriveRomHandle; +} diff --git a/lib/hackerlibultra/src/io/epidma.c b/lib/hackerlibultra/src/io/epidma.c new file mode 100644 index 00000000..77c6be6d --- /dev/null +++ b/lib/hackerlibultra/src/io/epidma.c @@ -0,0 +1,61 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +s32 osEPiStartDma(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { + register s32 ret; + + if (!__osPiDevMgr.active) { +#ifdef _DEBUG + __osError(ERR_OSPISTARTDMA_PIMGR, 0); +#endif + return -1; + } + +#ifdef _DEBUG + if ((mb->hdr.pri != OS_MESG_PRI_NORMAL) && (mb->hdr.pri != OS_MESG_PRI_HIGH)) { + __osError(ERR_OSPISTARTDMA_PRI, 1, mb->hdr.pri); + return -1; + } + + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPISTARTDMA_DIR, 1, direction); + return -1; + } + + if (mb->devAddr & 0x1) { + __osError(ERR_OSPISTARTDMA_DEVADDR, 1, mb->devAddr); + return -1; + } + + if ((u32)mb->dramAddr & 0x7) { + __osError(ERR_OSPISTARTDMA_ADDR, 1, mb->dramAddr); + return -1; + } + + if (mb->size & 0x1) { + __osError(ERR_OSPISTARTDMA_SIZE, 1, mb->size); + return -1; + } + + if ((mb->size == 0) || (mb->size > (16 * 1024 * 1024))) { + __osError(ERR_OSPISTARTDMA_RANGE, 1, mb->size); + return -1; + } +#endif + + mb->piHandle = pihandle; + + if (direction == OS_READ) { + mb->hdr.type = OS_MESG_TYPE_EDMAREAD; + } else { + mb->hdr.type = OS_MESG_TYPE_EDMAWRITE; + } + + if (mb->hdr.pri == OS_MESG_PRI_HIGH) { + ret = osJamMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } else { + ret = osSendMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/epigettype.c b/lib/hackerlibultra/src/io/epigettype.c new file mode 100644 index 00000000..8487e682 --- /dev/null +++ b/lib/hackerlibultra/src/io/epigettype.c @@ -0,0 +1,7 @@ +#include "PRinternal/piint.h" + +s32 osEPiGetDeviceType(OSPiHandle* pihandle, OSPiInfo* info) { + info->type = pihandle->type; + info->address = pihandle->baseAddress; + return 0; +} diff --git a/lib/hackerlibultra/src/io/epilinkhandle.c b/lib/hackerlibultra/src/io/epilinkhandle.c new file mode 100644 index 00000000..2e9b1fac --- /dev/null +++ b/lib/hackerlibultra/src/io/epilinkhandle.c @@ -0,0 +1,11 @@ +#include "PRinternal/piint.h" + +s32 osEPiLinkHandle(OSPiHandle* EPiHandle) { + u32 saveMask = __osDisableInt(); + + EPiHandle->next = __osPiTable; + __osPiTable = EPiHandle; + + __osRestoreInt(saveMask); + return 0; +} diff --git a/lib/hackerlibultra/src/io/epirawdma.c b/lib/hackerlibultra/src/io/epirawdma.c new file mode 100644 index 00000000..b8623539 --- /dev/null +++ b/lib/hackerlibultra/src/io/epirawdma.c @@ -0,0 +1,53 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osEPiRawStartDma(OSPiHandle* pihandle, s32 direction, u32 devAddr, void* dramAddr, u32 size) { + u32 stat; + u32 domain; + +#ifdef _DEBUG + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPIRAWSTARTDMA_DIR, 1, direction); + return -1; + } + + if (devAddr & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_DEVADDR, 1, devAddr); + return -1; + } + + if ((u32)dramAddr & 0x7) { + __osError(ERR_OSPIRAWSTARTDMA_ADDR, 1, dramAddr); + return -1; + } + + if (size & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_SIZE, 1, size); + return -1; + } + + if ((size == 0) || (size > (16 * 1024 * 1024))) { + __osError(ERR_OSPIRAWSTARTDMA_RANGE, 1, size); + return -1; + } +#endif + + EPI_SYNC(pihandle, stat, domain); + IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS(pihandle->baseAddress | devAddr)); + + switch (direction) { + case OS_READ: + IO_WRITE(PI_WR_LEN_REG, size - 1); + break; + case OS_WRITE: + IO_WRITE(PI_RD_LEN_REG, size - 1); + break; + default: + return -1; + } + return 0; +} diff --git a/lib/hackerlibultra/src/io/epirawread.c b/lib/hackerlibultra/src/io/epirawread.c new file mode 100644 index 00000000..758da2d6 --- /dev/null +++ b/lib/hackerlibultra/src/io/epirawread.c @@ -0,0 +1,29 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" +#include "assert.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 28 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osEPiRawReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { + register u32 stat; + register u32 domain; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWREADIO, 1, devAddr); + return -1; + } +#endif + assert(data != NULL); + + EPI_SYNC(pihandle, stat, domain); + *data = IO_READ(pihandle->baseAddress | devAddr); + + return 0; +} diff --git a/lib/hackerlibultra/src/io/epirawwrite.c b/lib/hackerlibultra/src/io/epirawwrite.c new file mode 100644 index 00000000..9ab98a8f --- /dev/null +++ b/lib/hackerlibultra/src/io/epirawwrite.c @@ -0,0 +1,22 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osEPiRawWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) { + register u32 stat; + register u32 domain; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWWRITEIO, 1, devAddr); + return -1; + } +#endif + + EPI_SYNC(pihandle, stat, domain); + IO_WRITE(pihandle->baseAddress | devAddr, data); + + return 0; +} diff --git a/lib/hackerlibultra/src/io/epiread.c b/lib/hackerlibultra/src/io/epiread.c new file mode 100644 index 00000000..b2f346bf --- /dev/null +++ b/lib/hackerlibultra/src/io/epiread.c @@ -0,0 +1,19 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +s32 osEPiReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIREADIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osEPiRawReadIo(pihandle, devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/io/epiwrite.c b/lib/hackerlibultra/src/io/epiwrite.c new file mode 100644 index 00000000..767caf5e --- /dev/null +++ b/lib/hackerlibultra/src/io/epiwrite.c @@ -0,0 +1,19 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +s32 osEPiWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIWRITEIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osEPiRawWriteIo(pihandle, devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpakcheckconnector.c b/lib/hackerlibultra/src/io/gbpakcheckconnector.c new file mode 100644 index 00000000..1d542bc0 --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakcheckconnector.c @@ -0,0 +1,131 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osGbpakCheckConnector(OSPfs* pfs, u8* status) { + s32 ret; + s32 bufn = 1; + s32 oldbufn = 0; + u16 address = 0; + u16 oldaddr = 0; + u16 daddr = 0; + u16 num; + u8 buf[3][4][BLOCKSIZE]; + u8 buf_status[3][4]; + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = osGbpakGetStatus(pfs, status); + } + + if (ret == PFS_ERR_NEW_GBCART) { + return PFS_ERR_CONTRFAIL; + } else if (ret == 0) { + if (!(*status & OS_GBPAK_POWER)) { + ERRCK(osGbpakPower(pfs, OS_GBPAK_POWER_ON)); + } + + bzero(buf_status, sizeof(buf_status)); + + for (address = 0x80; address <= 0x4000; address <<= 1) { + num = 0; + daddr = 0; + + do { + ERRCK(osGbpakReadWrite(pfs, OS_READ, address + daddr, buf[bufn][num], BLOCKSIZE)); + buf_status[bufn][num] = 1; + + if (buf_status[oldbufn][num] == 0) { + ret = osGbpakReadWrite(pfs, OS_READ, oldaddr + daddr, buf[oldbufn][num], BLOCKSIZE); + + if (ret != 0) { + return ret; + } else { + buf_status[oldbufn][num] = 1; + } + } + + if (bcmp(buf[bufn][num], buf[oldbufn][num], BLOCKSIZE) != 0) { + num = 0; + break; + } + + daddr += BLOCKSIZE; + } while (num++ < ARRLEN(buf[0]) - 1); + + if (num != 0) { + return PFS_ERR_CONTRFAIL; + } + + if (oldbufn != 0) { + num = 0; + daddr = 0; + + do { + if (buf_status[bufn][num] == 0) { + ERRCK(osGbpakReadWrite(pfs, OS_READ, address + daddr, buf[bufn][num], BLOCKSIZE)); + buf_status[bufn][num] = 1; + } + + if (buf_status[0][num] == 0) { + ret = osGbpakReadWrite(pfs, OS_READ, daddr, buf[0][num], BLOCKSIZE); + if (ret != 0) { + return ret; + } else { + buf_status[0][num] = 1; + } + } + + if (bcmp(buf[bufn][num], buf[0][num], BLOCKSIZE)) { + num = 0; + break; + } + + daddr += BLOCKSIZE; + } while (num++ < ARRLEN(buf_status[0]) - 1); + } + + if (num != 0) { + return PFS_ERR_CONTRFAIL; + } + + if (oldbufn != 0) { + bzero(buf_status[oldbufn], ARRLEN(buf_status[oldbufn])); + } + + oldaddr = address; + oldbufn = bufn; + bufn ^= 3; + } + + if ((pfs->dir_size >= 2) || (pfs->version == 2)) { + num = 0; + daddr = 0; + + do { + ERRCK(osGbpakReadWrite(pfs, OS_READ, daddr + 0xA000, buf[bufn][num], BLOCKSIZE)); + ERRCK(osGbpakReadWrite(pfs, OS_READ, daddr + 0x2000, buf[oldbufn][num], BLOCKSIZE)); + + if (bcmp(buf[bufn][num], buf[oldbufn][num], BLOCKSIZE)) { + num = 0; + break; + } + + daddr += BLOCKSIZE; + } while (num++ < ARRLEN(buf[0]) - 1); + + if (num != 0) { + return PFS_ERR_CONTRFAIL; + } + } + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = PFS_ERR_CONTRFAIL; + } + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpakgetbank.c b/lib/hackerlibultra/src/io/gbpakgetbank.c new file mode 100644 index 00000000..e4486882 --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakgetbank.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 __osGbpakGetBank(OSPfs* pfs, u8* bank) { + s32 ret; + u32 temp[BLOCKSIZE / sizeof(u32)]; + + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, (u8*)temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = osGbpakInit(pfs->queue, pfs, pfs->channel); + + if (ret == 0) { + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, (u8*)temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + if (ret == 0) { + *bank = ((u8*)temp)[0]; + pfs->banks = *bank; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpakgetstatus.c b/lib/hackerlibultra/src/io/gbpakgetstatus.c new file mode 100644 index 00000000..76e78913 --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakgetstatus.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osGbpakGetStatus(OSPfs* pfs, u8* status) { + s32 ret; + s32 i; + u32 temp[BLOCKSIZE / sizeof(u32)]; + + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_POWER, (u8*)temp); + + if ((ret == PFS_ERR_NEW_PACK) || (((u8*)temp)[BLOCKSIZE - 1] != GB_POWER_ON)) { + ERRCK(osGbpakInit(pfs->queue, pfs, pfs->channel)); + } + + ret = __osContRamRead(pfs->queue, pfs->channel, CONT_BLOCK_GB_STATUS, (u8*)temp); + + if (ret == 0) { + ERRCK(__osPfsGetStatus(pfs->queue, pfs->channel)); + + *status = ((u8*)temp)[0]; + + for (i = 1; i < BLOCKSIZE; i++) { + *status |= ((u8*)temp)[i]; + } + + *status &= (OS_GBPAK_GBCART_PULL | OS_GBPAK_RSTB_DETECTION); + *status |= ((u8*)temp)[BLOCKSIZE - 1]; + + if (!(*status & OS_GBPAK_GBCART_ON)) { + ret = PFS_ERR_NO_GBCART; + } else if (*status & OS_GBPAK_GBCART_PULL) { + ret = PFS_ERR_NEW_GBCART; + } + } else if (ret == 2) { + ret = PFS_ERR_CONTRFAIL; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpakinit.c b/lib/hackerlibultra/src/io/gbpakinit.c new file mode 100644 index 00000000..e101c1e8 --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakinit.c @@ -0,0 +1,90 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/controller_gbpak.h" + +OSTimer __osGbpakTimer; +OSMesgQueue __osGbpakTimerQ ALIGNED(0x8); +OSMesg __osGbpakTimerMsg; + +s32 osGbpakInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { + int i; + s32 ret; + u8 temp[BLOCKSIZE]; + + pfs->status = 0; + + // Turn off the transfer pak + for (i = 0; i < BLOCKSIZE; temp[i++] = GB_POWER_OFF) { + ; + } + + ret = __osContRamWrite(mq, channel, CONT_BLOCK_GB_POWER, temp, FALSE); + if (ret == PFS_ERR_NEW_PACK) { + ret = __osContRamWrite(mq, channel, CONT_BLOCK_GB_POWER, temp, FALSE); + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(mq, channel, CONT_BLOCK_GB_POWER, temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } else { + // Check if the power is still off as set earlier + if (temp[BLOCKSIZE - 1] == GB_POWER_OFF) { + return PFS_ERR_DEVICE; + } + } + + // Turn on the transfer pak + for (i = 0; i < BLOCKSIZE; temp[i++] = GB_POWER_ON) { + ; + } + + ret = __osContRamWrite(mq, channel, CONT_BLOCK_GB_POWER, temp, FALSE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(mq, channel, CONT_BLOCK_GB_POWER, temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } else { + // Check if the power is still on as set earlier + if (temp[BLOCKSIZE - 1] != GB_POWER_ON) { + return PFS_ERR_DEVICE; + } + } + + ERRCK(__osPfsGetStatus(mq, channel)); + + osCreateMesgQueue(&__osGbpakTimerQ, &__osGbpakTimerMsg, 1); + osSetTimer(&__osGbpakTimer, OS_USEC_TO_CYCLES(192000), 0, &__osGbpakTimerQ, &__osGbpakTimerMsg); + osRecvMesg(&__osGbpakTimerQ, NULL, OS_MESG_BLOCK); + pfs->queue = mq; + pfs->status = PFS_GBPAK_INITIALIZED; + pfs->channel = channel; + pfs->activebank = 0x84; + pfs->banks = 0xFF; + pfs->version = 0xFF; + pfs->dir_size = 0xFF; + + return 0; +} diff --git a/lib/hackerlibultra/src/io/gbpakpower.c b/lib/hackerlibultra/src/io/gbpakpower.c new file mode 100644 index 00000000..e2aa6f78 --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakpower.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/controller_gbpak.h" + +s32 osGbpakPower(OSPfs* pfs, s32 flag) { + s32 i; + s32 ret; + u8 temp[BLOCKSIZE]; + + for (i = 0; i < BLOCKSIZE; temp[i++] = (u8)flag) { + ; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_STATUS, temp, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = osGbpakInit(pfs->queue, pfs, pfs->channel); + + if (ret == 0) { + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_STATUS, temp, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + if (flag != OS_GBPAK_POWER_OFF) { + osSetTimer(&__osGbpakTimer, OS_USEC_TO_CYCLES(120000), 0, &__osGbpakTimerQ, &__osGbpakTimerMsg); + osRecvMesg(&__osGbpakTimerQ, NULL, OS_MESG_BLOCK); + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpakreadid.c b/lib/hackerlibultra/src/io/gbpakreadid.c new file mode 100644 index 00000000..e88fc152 --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakreadid.c @@ -0,0 +1,97 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "os_version.h" + +s32 osGbpakReadId(OSPfs* pfs, OSGbpakId* id, u8* status) { + s32 i; + s32 ret; + u8 isum; + u8 buf[96]; +#if BUILD_VERSION >= VERSION_K + u8 temp[32]; +#endif + static u8 nintendo[] = { 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83, + 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E, + 0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99, 0xBB, 0xBB, 0x67, 0x63, + 0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E }; + static u8 mmc_type[] = { 0x00, 0x01, 0x01, 0x01, 0xFF, 0x02, 0x02, 0xFF, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03 }; + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = osGbpakGetStatus(pfs, status); + } + + if (ret == PFS_ERR_NEW_GBCART) { + return PFS_ERR_CONTRFAIL; + } else if (ret == 0) { + if (!(*status & OS_GBPAK_POWER)) { + ERRCK(osGbpakPower(pfs, OS_GBPAK_POWER_ON)); + } + + ERRCK(osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf))); + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + if (!(*status & OS_GBPAK_RSTB_STATUS)) { + return PFS_ERR_CONTRFAIL; + } + +#if BUILD_VERSION >= VERSION_K + if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) { + for (i = 0; i < ARRLEN(temp); temp[i++] = 0) { + ; + } + + ERRCK(osGbpakReadWrite(pfs, OS_WRITE, 0x6000U, temp, ARRLEN(temp))); + ret = osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf)); + ERRCK(osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf))); + + ret = osGbpakGetStatus(pfs, status); + + if (ret == PFS_ERR_NEW_GBCART) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) { + return 4; + } + } +#else + if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) { + return 4; + } +#endif + for (i = 0x34, isum = 0; i < 0x4E; i++) { + isum += buf[i]; + } + + if ((isum + 0x19) & 0xFF) { + return 4; + } + + bcopy(buf, id, 0x50); + + if (id->cart_type < 0x14) { + pfs->version = (int)mmc_type[id->cart_type]; + } + + pfs->dir_size = (int)id->ram_size; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpakreadwrite.c b/lib/hackerlibultra/src/io/gbpakreadwrite.c new file mode 100644 index 00000000..fe16ee2b --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpakreadwrite.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "os_version.h" + +s32 __osGbpakSetBank(OSPfs* pfs, u8 bank); + +s32 osGbpakReadWrite(OSPfs* pfs, u16 flag, u16 address, u8* buffer, u16 size) { + s32 i; + s32 ret; + u8 bank; + + bank = (u8)(address >> 0xE); + + if (bank != pfs->banks) { + ret = __osGbpakSetBank(pfs, bank); + + if (ret != 0) { + return ret; + } + } + +#if BUILD_VERSION >= VERSION_K + if (size == 0) { + return 0; + } +#endif + + size = (u16)(size >> 5); + address = (u16)((address | 0xC000) >> 5); + + if (flag == 1) { + for (i = 0; i < (s32)size; i++, buffer += BLOCKSIZE) { + ret = __osContRamWrite(pfs->queue, pfs->channel, address, buffer, 0); + + if (ret != 0) { + break; + } + + if ((++address >= 0x800) && (i < (s32)(size - 1))) { + ret = __osGbpakSetBank(pfs, ++bank); + + if (ret != 0) { + break; + } + + address = 0x600U; + } + } + } else { + for (i = 0; i < (s32)size; i++, buffer += BLOCKSIZE) { + ret = __osContRamRead(pfs->queue, pfs->channel, address, buffer); + + if (ret != 0) { + break; + } + + if (++address >= 0x800 && (i < (s32)(size - 1))) { + ret = __osGbpakSetBank(pfs, ++bank); + + if (ret != 0) { + break; + } + + address = 0x600U; + } + } + } + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/gbpaksetbank.c b/lib/hackerlibultra/src/io/gbpaksetbank.c new file mode 100644 index 00000000..efd2267a --- /dev/null +++ b/lib/hackerlibultra/src/io/gbpaksetbank.c @@ -0,0 +1,35 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 __osGbpakSetBank(OSPfs* pfs, u8 bank) { + int i; + s32 ret; + u8 temp[BLOCKSIZE]; + + if (bank > 2) { + return PFS_ERR_INVALID; + } + + for (i = 0; i < BLOCKSIZE; temp[i++] = bank) { + ; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, temp, FALSE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = osGbpakInit(pfs->queue, pfs, pfs->channel); + + if (ret == 0) { + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_GB_BANK, temp, FALSE); + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + if (ret == 0) { + pfs->banks = bank; + } + + return ret; +} diff --git a/lib/ultra/io/leodiskinit.c b/lib/hackerlibultra/src/io/leodiskinit.c similarity index 80% rename from lib/ultra/io/leodiskinit.c rename to lib/hackerlibultra/src/io/leodiskinit.c index 9c652367..81c67b9b 100644 --- a/lib/ultra/io/leodiskinit.c +++ b/lib/hackerlibultra/src/io/leodiskinit.c @@ -1,13 +1,13 @@ -#include "PR/os_internal.h" -#include "PR/os.h" -#include "PR/rcp.h" -#include "macros.h" - // This file was removed in 2.0J -ALIGNED8 OSPiHandle LeoDiskHandle; -OSPiHandle *__osDiskHandle; +#include "PR/os_internal.h" +#include "PR/os_libc.h" +#include "PR/rcp.h" +#include "PRinternal/macros.h" -OSPiHandle *osLeoDiskInit(void) { +OSPiHandle LeoDiskHandle ALIGNED(0x8); +OSPiHandle* __osDiskHandle; + +OSPiHandle* osLeoDiskInit(void) { u32 saveMask; LeoDiskHandle.type = DEVICE_TYPE_64DD; @@ -16,19 +16,16 @@ OSPiHandle *osLeoDiskInit(void) { LeoDiskHandle.pulse = 6; LeoDiskHandle.pageSize = 6; LeoDiskHandle.relDuration = 2; -#if LIBULTRA_VERSION >= OS_VER_H LeoDiskHandle.domain = PI_DOMAIN2; -#endif IO_WRITE(PI_BSD_DOM2_LAT_REG, LeoDiskHandle.latency); IO_WRITE(PI_BSD_DOM2_PWD_REG, LeoDiskHandle.pulse); IO_WRITE(PI_BSD_DOM2_PGS_REG, LeoDiskHandle.pageSize); IO_WRITE(PI_BSD_DOM2_RLS_REG, LeoDiskHandle.relDuration); -#if LIBULTRA_VERSION >= OS_VER_I LeoDiskHandle.speed = 0; -#endif bzero(&LeoDiskHandle.transferInfo, sizeof(__OSTranxInfo)); + saveMask = __osDisableInt(); LeoDiskHandle.next = __osPiTable; __osPiTable = &LeoDiskHandle; diff --git a/lib/hackerlibultra/src/io/leointerrupt.c b/lib/hackerlibultra/src/io/leointerrupt.c new file mode 100644 index 00000000..651607b4 --- /dev/null +++ b/lib/hackerlibultra/src/io/leointerrupt.c @@ -0,0 +1,195 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" +#include "PRinternal/piint.h" +#include "PRinternal/macros.h" + +extern OSPiHandle* __osDiskHandle; + +u8 leoDiskStack[OS_PIM_STACKSIZE] ALIGNED(0x10); + +static void __osLeoAbnormalResume(void); +static void __osLeoResume(void); + +s32 __osLeoInterrupt(void) { + u32 stat = 0; + volatile u32 pi_stat; + u32 bm_stat; + __OSTranxInfo* info = &__osDiskHandle->transferInfo; + __OSBlockInfo* blockInfo = &info->block[info->blockNum]; + + pi_stat = IO_READ(PI_STATUS_REG); + if (pi_stat & PI_STATUS_DMA_BUSY) { + __OSGlobalIntMask = __OSGlobalIntMask & ~SR_IBIT4; // cart interrupt + blockInfo->errStatus = LEO_ERROR_29; + __osLeoResume(); + return 1; + } + + WAIT_ON_IOBUSY(pi_stat); + stat = IO_READ(LEO_STATUS); + if (stat & LEO_STATUS_MECHANIC_INTERRUPT) { + WAIT_ON_IOBUSY(pi_stat); + IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); + blockInfo->errStatus = LEO_ERROR_GOOD; + return 0; + } + + if (info->cmdType == LEO_CMD_TYPE_2) { + return 1; + } + + if (stat & LEO_STATUS_BUFFER_MANAGER_ERROR) { + WAIT_ON_IOBUSY(pi_stat); + stat = IO_READ(LEO_STATUS); + blockInfo->errStatus = LEO_ERROR_22; + __osLeoResume(); + IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); + __OSGlobalIntMask |= OS_IM_PI; + return 1; + } + + if (info->cmdType == LEO_CMD_TYPE_1) { + if ((stat & LEO_STATUS_DATA_REQUEST) == 0) { + if (info->sectorNum + 1 != info->transferMode * 85) { + blockInfo->errStatus = LEO_ERROR_24; + __osLeoAbnormalResume(); + return 1; + } + + IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); + __OSGlobalIntMask |= OS_IM_PI; + blockInfo->errStatus = LEO_ERROR_GOOD; + __osLeoResume(); + return 1; + } else { + blockInfo->dramAddr = (void*)((u32)blockInfo->dramAddr + blockInfo->sectorSize); + info->sectorNum++; + __osEPiRawStartDma(__osDiskHandle, OS_WRITE, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize); + return 1; + } + } else if (info->cmdType == LEO_CMD_TYPE_0) { + if (info->transferMode == LEO_SECTOR_MODE) { + if (info->sectorNum > (s32)blockInfo->C1ErrNum + 17) { + blockInfo->errStatus = LEO_ERROR_GOOD; + __osLeoAbnormalResume(); + return 1; + } + + if ((stat & LEO_STATUS_DATA_REQUEST) == 0) { + blockInfo->errStatus = LEO_ERROR_23; + __osLeoAbnormalResume(); + return 1; + } + } else { + blockInfo->dramAddr = (void*)((u32)blockInfo->dramAddr + blockInfo->sectorSize); + } + + bm_stat = IO_READ(LEO_BM_STATUS); + if ((bm_stat & LEO_BM_STATUS_C1SINGLE && bm_stat & LEO_BM_STATUS_C1DOUBLE) || bm_stat & LEO_BM_STATUS_MICRO) { + if (blockInfo->C1ErrNum > 3) { + if (info->transferMode != LEO_SECTOR_MODE || info->sectorNum > 0x52) { + blockInfo->errStatus = LEO_ERROR_23; + __osLeoAbnormalResume(); + return 1; + } + } else { + int errNum = blockInfo->C1ErrNum; + blockInfo->C1ErrSector[errNum] = info->sectorNum + 1; + } + + blockInfo->C1ErrNum++; + } + + if (stat & LEO_STATUS_C2_TRANSFER) { + if (info->sectorNum + 1 != 88) { + blockInfo->errStatus = LEO_ERROR_24; + __osLeoAbnormalResume(); + } + + if (info->transferMode == LEO_TRACK_MODE && info->blockNum == 0) { + info->blockNum = 1; + info->sectorNum = -1; + info->block[1].dramAddr = (void*)((u32)info->block[1].dramAddr - info->block[1].sectorSize); + + blockInfo->errStatus = LEO_ERROR_22; + } else { + IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); + __OSGlobalIntMask |= OS_IM_PI; + info->cmdType = LEO_CMD_TYPE_2; + blockInfo->errStatus = LEO_ERROR_GOOD; + } + + __osEPiRawStartDma(__osDiskHandle, OS_READ, LEO_C2_BUFF, blockInfo->C2Addr, blockInfo->sectorSize * 4); + return 1; + } + + if (info->sectorNum == -1 && info->transferMode == LEO_TRACK_MODE && info->blockNum == 1) { + __OSBlockInfo* bptr = &info->block[0]; + if (bptr->C1ErrNum == 0) { + if (((u32*)bptr->C2Addr)[0] | ((u32*)bptr->C2Addr)[1] | ((u32*)bptr->C2Addr)[2] + | ((u32*)bptr->C2Addr)[3]) { + bptr->errStatus = LEO_ERROR_24; + __osLeoAbnormalResume(); + return 1; + } + } + + bptr->errStatus = 0; + __osLeoResume(); + } + info->sectorNum++; + if (stat & LEO_STATUS_DATA_REQUEST) { + if (info->sectorNum > 0x54) { + blockInfo->errStatus = LEO_ERROR_24; + __osLeoAbnormalResume(); + return 1; + } + + __osEPiRawStartDma(__osDiskHandle, 0, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize); + blockInfo->errStatus = LEO_ERROR_GOOD; + return 1; + } else if (info->sectorNum <= 0x54) { + blockInfo->errStatus = LEO_ERROR_24; + __osLeoAbnormalResume(); + return 1; + } + + return 1; + } else { + blockInfo->errStatus = LEO_ERROR_4; + __osLeoAbnormalResume(); + return 1; + } +} + +static void __osLeoAbnormalResume(void) { + __OSTranxInfo* info = &__osDiskHandle->transferInfo; + u32 pi_stat; + + WAIT_ON_IOBUSY(pi_stat); + IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); + WAIT_ON_IOBUSY(pi_stat); + IO_WRITE(LEO_BM_CTL, info->bmCtlShadow); + __osLeoResume(); + IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); + __OSGlobalIntMask |= OS_IM_PI; +} + +static void __osLeoResume(void) { + __OSEventState* es = &__osEventStateTab[OS_EVENT_PI]; + OSMesgQueue* mq = es->messageQueue; + s32 last; + + if (mq == NULL || MQ_IS_FULL(mq)) { + return; + } + + last = (mq->first + mq->validCount) % mq->msgCount; + mq->msg[last] = es->message; + mq->validCount++; + + if (mq->mtqueue->next != NULL) { + __osEnqueueThread(&__osRunQueue, __osPopThread(&mq->mtqueue)); + } +} diff --git a/lib/ultra/io/motor.c b/lib/hackerlibultra/src/io/motor.c similarity index 62% rename from lib/ultra/io/motor.c rename to lib/hackerlibultra/src/io/motor.c index 5437361f..61eadf96 100644 --- a/lib/ultra/io/motor.c +++ b/lib/hackerlibultra/src/io/motor.c @@ -1,31 +1,14 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" +#include "PR/os_version.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" -#ifdef BBPLAYER - -s32 __osMotorAccess(UNUSED OSPfs *pfs, UNUSED s32 action) { - return PFS_ERR_INVALID; -} - -s32 osMotorInit(UNUSED OSMesgQueue *mq, UNUSED OSPfs *pfs, UNUSED int channel) { - return PFS_ERR_DEVICE; -} - -#else - -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J static OSPifRam __MotorDataBuf[MAXCONTROLLERS]; -#else -void __osMakeMotorData(int channel, u16 address, u8 *buffer, OSPifRam *mdata); -u32 __osMotorinitialized[MAXCONTROLLERS] = { 0, 0, 0, 0 }; -OSPifRam _MotorStopData[MAXCONTROLLERS]; -OSPifRam _MotorStartData[MAXCONTROLLERS]; -ALIGNED8 u8 _motorstopbuf[32]; -ALIGNED8 u8 _motorstartbuf[32]; -#endif -#if LIBULTRA_VERSION >= OS_VER_J +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + s32 __osMotorAccess(OSPfs* pfs, s32 flag) { int i; s32 ret; @@ -46,7 +29,7 @@ s32 __osMotorAccess(OSPfs* pfs, s32 flag) { __osContLastCmd = CONT_CMD_END; __osSiRawStartDma(OS_WRITE, &__MotorDataBuf[pfs->channel]); osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); - __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]); + ret = __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]); osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); ret = READFORMAT(ptr)->rxsize & CHNL_ERR_MASK; @@ -67,118 +50,21 @@ s32 __osMotorAccess(OSPfs* pfs, s32 flag) { return ret; } -#else - -s32 osMotorStop(OSPfs *pfs) { - int i; - s32 ret; - u8 *ptr; - __OSContRamReadFormat ramreadformat; - ptr = (u8 *) &__osPfsPifRam; - - if (!__osMotorinitialized[pfs->channel]) { - return PFS_ERR_INVALID; - } - - __osSiGetAccess(); - - __osContLastCmd = CONT_CMD_WRITE_PAK; - __osSiRawStartDma(OS_WRITE, &_MotorStopData[pfs->channel]); - osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); - ptr = (u8 *) &__osPfsPifRam; - - if (pfs->channel != 0) { - for (i = 0; i < pfs->channel; i++) { - ptr++; - } - } - - ramreadformat = *READFORMAT(ptr); - ret = CHNL_ERR(ramreadformat); - if (ret == 0 && ramreadformat.datacrc != __osContDataCrc((u8 *) &_motorstopbuf)) { - ret = PFS_ERR_CONTRFAIL; - } - - __osSiRelAccess(); - return ret; -} - -s32 osMotorStart(OSPfs *pfs) { - int i; - s32 ret; - u8 *ptr; - __OSContRamReadFormat ramreadformat; - - ptr = (u8 *) &__osPfsPifRam; - - if (!__osMotorinitialized[pfs->channel]) { - return PFS_ERR_INVALID; - } - - __osSiGetAccess(); - - __osContLastCmd = CONT_CMD_WRITE_PAK; - __osSiRawStartDma(OS_WRITE, &_MotorStartData[pfs->channel]); - osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); - ptr = (u8 *) &__osPfsPifRam; - - if (pfs->channel != 0) { - for (i = 0; i < pfs->channel; i++) { - ptr++; - } - } - - ramreadformat = *READFORMAT(ptr); - ret = CHNL_ERR(ramreadformat); - if (ret == 0 && ramreadformat.datacrc != __osContDataCrc((u8 *) &_motorstartbuf)) { - ret = PFS_ERR_CONTRFAIL; - } - __osSiRelAccess(); - return ret; -} -#endif - -#if LIBULTRA_VERSION >= OS_VER_J -void __osMakeMotorData(int channel, OSPifRam* mdata) -#else // _MakeMotorData -void __osMakeMotorData(int channel, u16 address, u8 *buffer, OSPifRam *mdata) -#endif -{ - u8 *ptr = (u8 *) mdata->ramarray; +static void __osMakeMotorData(int channel, OSPifRam* mdata) { + u8* ptr = (u8*)mdata->ramarray; __OSContRamReadFormat ramreadformat; int i; -#if LIBULTRA_VERSION < OS_VER_J - for (i = 0; i < ARRAY_COUNT(mdata->ramarray); i++) { - mdata->ramarray[i] = 0; - } - mdata->pifstatus = CONT_CMD_EXE; -#endif - ramreadformat.dummy = CONT_CMD_NOP; ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX; ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX; ramreadformat.cmd = CONT_CMD_WRITE_PAK; - -#if LIBULTRA_VERSION >= OS_VER_J ramreadformat.addrh = CONT_BLOCK_RUMBLE >> 3; ramreadformat.addrl = (u8)(__osContAddressCrc(CONT_BLOCK_RUMBLE) | (CONT_BLOCK_RUMBLE << 5)); -#else - ramreadformat.address = (address << 0x5) | __osContAddressCrc(address); - ramreadformat.datacrc = CONT_CMD_NOP; - - for (i = 0; i < ARRAY_COUNT(ramreadformat.data); i++) { - ramreadformat.data[i] = *buffer++; - } -#endif if (channel != 0) { for (i = 0; i < channel; i++) { - *ptr++ = 0; + *ptr++ = CONT_CMD_REQUEST_STATUS; } } @@ -187,16 +73,12 @@ void __osMakeMotorData(int channel, u16 address, u8 *buffer, OSPifRam *mdata) ptr[0] = CONT_CMD_END; } -s32 osMotorInit(OSMesgQueue *mq, OSPfs *pfs, int channel) { -#if LIBULTRA_VERSION < OS_VER_J - int i; -#endif +s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { s32 ret; u8 temp[32]; pfs->queue = mq; pfs->channel = channel; -#if LIBULTRA_VERSION >= OS_VER_J pfs->activebank = 0xFF; pfs->status = 0; @@ -205,19 +87,27 @@ s32 osMotorInit(OSMesgQueue *mq, OSPfs *pfs, int channel) { if (ret == PFS_ERR_NEW_PACK) { ret = SELECT_BANK(pfs, 0x80); } -#else - pfs->status = 0; - pfs->activebank = 0x80; - for (i = 0; i < ARRAY_COUNT(temp); i++) { - temp[i] = 254; + if (ret != 0) { + return ret; } - ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE); + ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); + if (ret == PFS_ERR_NEW_PACK) { - ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE); + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } else if (temp[31] == 254) { + return PFS_ERR_DEVICE; + } + + ret = SELECT_BANK(pfs, 0x80); + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; } -#endif if (ret != 0) { return ret; @@ -230,23 +120,152 @@ s32 osMotorInit(OSMesgQueue *mq, OSPfs *pfs, int channel) { if (ret != 0) { return ret; - } - - if (temp[31] == 254) { + } else if (temp[31] != 0x80) { return PFS_ERR_DEVICE; } -#if LIBULTRA_VERSION >= OS_VER_J - ret = __osPfsSelectBank(pfs, 0x80); - if (ret == PFS_ERR_NEW_PACK) { + if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { + __osMakeMotorData(channel, &__MotorDataBuf[channel]); + } + + pfs->status = PFS_MOTOR_INITIALIZED; + return 0; +} + +#else + +OSPifRam _MotorStopData[MAXCONTROLLERS] ALIGNED(0x8); +OSPifRam _MotorStartData[MAXCONTROLLERS] ALIGNED(0x8); +u8 _motorstopbuf[32] ALIGNED(0x8); +u8 _motorstartbuf[32] ALIGNED(0x8); +u32 __osMotorinitialized[MAXCONTROLLERS] = { 0, 0, 0, 0 }; + +s32 osMotorStop(OSPfs* pfs) { + int i; + s32 ret; + u8* ptr; + __OSContRamReadFormat ramreadformat; + + ptr = (u8*)&__osPfsPifRam; + + if (!__osMotorinitialized[pfs->channel]) { + return PFS_ERR_INVALID; + } + + __osSiGetAccess(); + + __osContLastCmd = CONT_CMD_WRITE_PAK; + __osSiRawStartDma(OS_WRITE, &_MotorStopData[pfs->channel]); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + ptr = (u8*)&__osPfsPifRam; + + if (pfs->channel != 0) { + for (i = 0; i < pfs->channel; i++) { + ptr++; + } + } + + ramreadformat = *(__OSContRamReadFormat*)ptr; + ret = CHNL_ERR(ramreadformat); + + if (ret == 0 && __osContDataCrc((u8*)&_motorstopbuf) != ramreadformat.datacrc) { ret = PFS_ERR_CONTRFAIL; } -#else - for (i = 0; i < ARRAY_COUNT(temp); i++) { - temp[i] = 128; + + __osSiRelAccess(); + return ret; +} + +s32 osMotorStart(OSPfs* pfs) { + + int i; + s32 ret; + u8* ptr; + __OSContRamReadFormat ramreadformat; + + ptr = (u8*)&__osPfsPifRam; + + if (!__osMotorinitialized[pfs->channel]) { + return PFS_ERR_INVALID; + } + + __osSiGetAccess(); + + __osContLastCmd = CONT_CMD_WRITE_PAK; + __osSiRawStartDma(OS_WRITE, &_MotorStartData[pfs->channel]); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + ptr = (u8*)&__osPfsPifRam; + + if (pfs->channel != 0) { + for (i = 0; i < pfs->channel; i++) { + ptr++; + } + } + + ramreadformat = *(__OSContRamReadFormat*)ptr; + ret = CHNL_ERR(ramreadformat); + + if (ret == 0 && __osContDataCrc((u8*)&_motorstartbuf) != ramreadformat.datacrc) { + ret = PFS_ERR_CONTRFAIL; + } + + __osSiRelAccess(); + return ret; +} + +static void _MakeMotorData(int channel, u16 address, u8* buffer, OSPifRam* mdata) { + u8* ptr = (u8*)mdata->ramarray; + __OSContRamReadFormat ramreadformat; + int i; + + for (i = 0; i < ARRLEN(mdata->ramarray); i++) { + mdata->ramarray[i] = 0; + } + + mdata->pifstatus = CONT_CMD_EXE; + ramreadformat.dummy = CONT_CMD_NOP; + ramreadformat.txsize = CONT_CMD_WRITE_PAK_TX; + ramreadformat.rxsize = CONT_CMD_WRITE_PAK_RX; + ramreadformat.cmd = CONT_CMD_WRITE_PAK; + + ramreadformat.address = (address << 0x5) | __osContAddressCrc(address); + ramreadformat.datacrc = CONT_CMD_NOP; + + for (i = 0; i < ARRLEN(ramreadformat.data); i++) { + ramreadformat.data[i] = *buffer++; + } + + if (channel != 0) { + for (i = 0; i < channel; i++) { + *ptr++ = 0; + } + } + + *(__OSContRamReadFormat*)ptr = ramreadformat; + ptr += sizeof(__OSContRamReadFormat); + ptr[0] = CONT_CMD_END; +} + +s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { + int i; + s32 ret; + u8 temp[32]; + + pfs->queue = mq; + pfs->channel = channel; + pfs->status = 0; + pfs->activebank = 128; + + for (i = 0; i < ARRLEN(temp); i++) { + temp[i] = 254; } ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE); + if (ret == PFS_ERR_NEW_PACK) { ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE); } @@ -254,7 +273,35 @@ s32 osMotorInit(OSMesgQueue *mq, OSPfs *pfs, int channel) { if (ret != 0) { return ret; } -#endif + + ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + if (temp[31] == 254) { + return PFS_ERR_DEVICE; + } + + for (i = 0; i < ARRLEN(temp); i++) { + temp[i] = 128; + } + + ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = __osContRamWrite(mq, channel, CONT_BLOCK_DETECT, temp, FALSE); + } + + if (ret != 0) { + return ret; + } + ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); if (ret == PFS_ERR_NEW_PACK) { ret = PFS_ERR_CONTRFAIL; @@ -268,23 +315,15 @@ s32 osMotorInit(OSMesgQueue *mq, OSPfs *pfs, int channel) { return PFS_ERR_DEVICE; } -#if LIBULTRA_VERSION >= OS_VER_J - if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { - __osMakeMotorData(channel, &__MotorDataBuf[channel]); - } - - pfs->status = PFS_MOTOR_INITIALIZED; -#else if (!__osMotorinitialized[channel]) { - for (i = 0; i < ARRAY_COUNT(_motorstartbuf); i++) { + for (i = 0; i < ARRLEN(_motorstartbuf); i++) { _motorstartbuf[i] = 1; _motorstopbuf[i] = 0; } - __osMakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstartbuf, &_MotorStartData[channel]); - __osMakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstopbuf, &_MotorStopData[channel]); - __osMotorinitialized[channel] = TRUE; + _MakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstartbuf, &_MotorStartData[channel]); + _MakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstopbuf, &_MotorStopData[channel]); + __osMotorinitialized[channel] = 1; } -#endif return 0; } diff --git a/lib/hackerlibultra/src/io/pfsallocatefile.c b/lib/hackerlibultra/src/io/pfsallocatefile.c new file mode 100644 index 00000000..d84dd82a --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsallocatefile.c @@ -0,0 +1,371 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/rmon.h" + +#define ROUND_UP_DIVIDE(numerator, denominator) (((numerator) + (denominator) - 1) / (denominator)) + +#if BUILD_VERSION >= VERSION_J + +s32 osPfsAllocateFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, int file_size_in_bytes, + s32* file_no) { + int start_page; + int decleared; + int last_page; + int old_last_page = 0; + s32 ret = 0; + int file_size_in_pages; + __OSInode inode; + __OSInode backup_inode; + __OSDir dir; + u8 bank; + u8 old_bank = 0; + int firsttime = 0; + s32 bytes; + __OSInodeUnit fpage; + + if (company_code == 0 || game_code == 0) { + return PFS_ERR_INVALID; + } + + file_size_in_pages = ROUND_UP_DIVIDE(file_size_in_bytes, BLOCKSIZE * PFS_ONE_PAGE); + + if (((ret = osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, file_no)) != 0) + && ret != PFS_ERR_INVALID) { + return ret; + } + + if (*file_no != -1) { + return PFS_ERR_EXIST; + } + + ret = osPfsFreeBlocks(pfs, &bytes); + + if (file_size_in_bytes > bytes) { + return PFS_DATA_FULL; + } + + if (file_size_in_pages == 0) { + return PFS_ERR_INVALID; + } + + if (((ret = osPfsFindFile(pfs, 0, 0, NULL, NULL, file_no)) != 0) && ret != PFS_ERR_INVALID) { + return ret; + } + + if (*file_no == -1) { + return PFS_DIR_FULL; + } + + for (bank = 0; bank < pfs->banks; bank++) { + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); + ERRCK(__osPfsDeclearPage(pfs, &inode, file_size_in_pages, &start_page, bank, &decleared, &last_page)); + + if (start_page != -1) { + if (firsttime == 0) { + fpage.inode_t.page = start_page; + fpage.inode_t.bank = bank; + } else { + backup_inode.inode_page[old_last_page].inode_t.bank = bank; + backup_inode.inode_page[old_last_page].inode_t.page = start_page; + ERRCK(__osPfsRWInode(pfs, &backup_inode, PFS_WRITE, old_bank)); + } + + if (file_size_in_pages > decleared) { + bcopy(&inode, &backup_inode, sizeof(__OSInode)); + old_last_page = last_page; + old_bank = bank; + file_size_in_pages -= decleared; + firsttime++; + } else { + file_size_in_pages = 0; + ERRCK(__osPfsRWInode(pfs, &inode, PFS_WRITE, bank)); + break; + } + } + } + + if (file_size_in_pages > 0 || start_page == -1) { + return PFS_ERR_INCONSISTENT; + } + + dir.start_page = fpage; + dir.company_code = company_code; + dir.game_code = game_code; + dir.data_sum = 0; + + bcopy(game_name, dir.game_name, PFS_FILE_NAME_LEN); + bcopy(ext_name, dir.ext_name, PFS_FILE_EXT_LEN); + + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + *file_no, (u8*)&dir, FALSE); + return ret; +} + +s32 __osPfsDeclearPage(OSPfs* pfs, __OSInode* inode, int file_size_in_pages, int* first_page, u8 bank, int* decleared, + int* last_page) { + int j; + int spage; + int old_page; + s32 ret = 0; + int offset = bank > 0 ? 1 : pfs->inode_start_page; + + for (j = offset; j < ARRLEN(inode->inode_page); j++) { + if (inode->inode_page[j].ipage == 3) { + break; + } + } + + if (j == ARRLEN(inode->inode_page)) { + *first_page = -1; + return ret; + } + + spage = j; + *decleared = 1; + old_page = j; + j++; + + while (file_size_in_pages > *decleared && j < ARRLEN(inode->inode_page)) { + if (inode->inode_page[j].ipage == 3) { + inode->inode_page[old_page].inode_t.bank = bank; + inode->inode_page[old_page].inode_t.page = j; + old_page = j; + (*decleared)++; + } + j++; + } + + *first_page = spage; + + if (j == ARRLEN(inode->inode_page) && file_size_in_pages > *decleared) { + *last_page = old_page; + } else { + inode->inode_page[old_page].ipage = 1; + *last_page = 0; + } + + return ret; +} + +#else + +static s32 __osClearPage(OSPfs* pfs, int page_num, u8* data, u8 bank); + +s32 osPfsAllocateFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, int file_size_in_bytes, + s32* file_no) { + int start_page; + int decleared; + int last_page; + int old_last_page = 0; + int j; + s32 ret = 0; + int file_size_in_pages; + __OSInode inode; + __OSInode backup_inode; + __OSDir dir; + u8 bank; + u8 old_bank = 0; + int firsttime = 0; + s32 bytes; + __OSInodeUnit fpage; + + if (company_code == 0 || game_code == 0) { + return PFS_ERR_INVALID; + } + + file_size_in_pages = ROUND_UP_DIVIDE(file_size_in_bytes, BLOCKSIZE * PFS_ONE_PAGE); + + if ((pfs->status & PFS_INITIALIZED) == FALSE) { + return PFS_ERR_INVALID; + } + + PFS_CHECK_ID(); + + if (((ret = osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, file_no)) != 0) + && ret != PFS_ERR_INVALID) { + return ret; + } + + if (*file_no != -1) { + return PFS_ERR_EXIST; + } + + ret = osPfsFreeBlocks(pfs, &bytes); + + if (file_size_in_bytes > bytes) { + return PFS_DATA_FULL; + } + + if (file_size_in_pages != 0) { + + if (((ret = osPfsFindFile(pfs, 0, 0, NULL, NULL, file_no)) != 0) && ret != PFS_ERR_INVALID) { + return ret; + } + + if (*file_no == -1) { + return PFS_DIR_FULL; + } + + for (bank = 0; bank < pfs->banks; bank++) { + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); + ERRCK(__osPfsDeclearPage(pfs, &inode, file_size_in_pages, &start_page, bank, &decleared, &last_page)); + + if (start_page != -1) { + if (firsttime == 0) { + fpage.inode_t.page = start_page; + fpage.inode_t.bank = bank; + } else { + backup_inode.inode_page[old_last_page].inode_t.bank = bank; + backup_inode.inode_page[old_last_page].inode_t.page = start_page; + ERRCK(__osPfsRWInode(pfs, &backup_inode, PFS_WRITE, old_bank)); + } + + for (j = 0; j < ARRLEN(inode.inode_page); j++) { + backup_inode.inode_page[j].ipage = inode.inode_page[j].ipage; + } + old_last_page = last_page; + old_bank = bank; + firsttime++; + if (file_size_in_pages > decleared) { + file_size_in_pages = file_size_in_pages - decleared; + } else { + file_size_in_pages = 0; + break; + } + } + } + + if (file_size_in_pages > 0 || start_page == -1) { + return PFS_ERR_INCONSISTENT; + } + + backup_inode.inode_page[old_last_page].inode_t.bank = bank; + backup_inode.inode_page[old_last_page].inode_t.page = start_page; + ERRCK(__osPfsRWInode(pfs, &backup_inode, PFS_WRITE, old_bank)); + + dir.start_page = fpage; + dir.company_code = company_code; + dir.game_code = game_code; + dir.data_sum = 0; + + for (j = 0; j < ARRLEN(dir.game_name); j++) + dir.game_name[j] = *game_name++; + for (j = 0; j < ARRLEN(dir.ext_name); j++) + dir.ext_name[j] = *ext_name++; + + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + *file_no, (u8*)&dir, FALSE)); + return ret; + } else { + return PFS_ERR_INVALID; + } +} + +s32 __osPfsDeclearPage(OSPfs* pfs, __OSInode* inode, int file_size_in_pages, int* first_page, u8 bank, int* decleared, + int* last_page) { + int j; + int spage; + int old_page; + u8 tmp_data[BLOCKSIZE]; + int i; + s32 ret = 0; + int offset = bank > 0 ? 1 : pfs->inode_start_page; + + for (j = offset; j < ARRLEN(inode->inode_page); j++) { + if (inode->inode_page[j].ipage == 3) { + break; + } + } + + if (j == ARRLEN(inode->inode_page)) { + *first_page = -1; + return ret; + } + + for (i = 0; i < ARRLEN(tmp_data); i++) { + tmp_data[i] = 0; + } + + spage = j; + *decleared = 1; + old_page = j; + j++; + + while (file_size_in_pages > *decleared && j < ARRLEN(inode->inode_page)) { + if (inode->inode_page[j].ipage == 3) { + inode->inode_page[old_page].inode_t.bank = bank; + inode->inode_page[old_page].inode_t.page = j; + ERRCK(__osClearPage(pfs, old_page, (u8*)tmp_data, bank)); + old_page = j; + (*decleared)++; + } + j++; + } + + *first_page = spage; + + if (j == ARRLEN(inode->inode_page) && file_size_in_pages > *decleared) { + *last_page = old_page; + return ret; + } else { + inode->inode_page[old_page].ipage = 1; + ret = __osClearPage(pfs, old_page, (u8*)tmp_data, bank); + *last_page = 0; + return ret; + } +} + +static s32 __osClearPage(OSPfs* pfs, int page_no, u8* data, u8 bank) { + int i; + s32 ret; + ret = 0; + pfs->activebank = bank; + ERRCK(__osPfsSelectBank(pfs)); + for (i = 0; i < PFS_ONE_PAGE; i++) { + ret = __osContRamWrite(pfs->queue, pfs->channel, page_no * PFS_ONE_PAGE + i, data, FALSE); + if (ret != 0) { + break; + } + } + pfs->activebank = 0; + ret = __osPfsSelectBank(pfs); + return ret; +} + +#endif + +#ifdef _DEBUG +s32 __osDumpInode(OSPfs* pfs) { + int j; + __OSInode inode; + s32 ret = 0; + __OSDir dir; + u8 bank; +#if BUILD_VERSION >= VERSION_J + u8 startbank = PFS_ID_BANK_256K; +#endif + + rmonPrintf("INODE:\n"); + +#if BUILD_VERSION >= VERSION_J + for (bank = startbank; bank < pfs->banks; bank++) { +#else + for (bank = 0; bank < pfs->banks; bank++) { +#endif + rmonPrintf("\nBank %d:\n", bank); + ret = __osPfsRWInode(pfs, &inode, PFS_READ, bank); + for (j = 0; j < PFS_INODE_SIZE_PER_PAGE; j++) { + rmonPrintf("%x ", inode.inode_page[j].ipage); + } + } + + rmonPrintf("dir_size %d %d\n", pfs->dir_size, pfs->inode_start_page); + + for (j = 0; j < pfs->dir_size; j++) { + __osContRamRead(pfs->queue, pfs->channel, (u16)(pfs->dir_table + (int)j), (u8*)&dir); + rmonPrintf("file %d game_code %d page %x c_code %d sum %d\n", j, dir.game_code, dir.start_page.ipage, + dir.company_code, dir.data_sum); + } + rmonPrintf("End of Dump\n"); + return ret; +} +#endif diff --git a/lib/hackerlibultra/src/io/pfschecker.c b/lib/hackerlibultra/src/io/pfschecker.c new file mode 100644 index 00000000..d73b4e6c --- /dev/null +++ b/lib/hackerlibultra/src/io/pfschecker.c @@ -0,0 +1,258 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 corrupted_init(OSPfs* pfs, __OSInodeCache* cache); +s32 corrupted(OSPfs* pfs, __OSInodeUnit fpage, __OSInodeCache* cache); + +#define CHECK_IPAGE(p) \ + (((p).ipage >= pfs->inode_start_page) && ((p).inode_t.bank < pfs->banks) && ((p).inode_t.page >= 0x01) \ + && ((p).inode_t.page < 0x80)) + +s32 osPfsChecker(OSPfs* pfs) { + int j; + s32 ret; + __OSInodeUnit next_page; + __OSInode checked_inode; + __OSInode tmp_inode; + __OSDir tmp_dir; + __OSInodeUnit file_next_node[16]; + __OSInodeCache cache; + int fixed = 0; + u8 bank; +#if BUILD_VERSION >= VERSION_J + u8 oldbank = 254; +#endif + s32 cc; + s32 cl; + int offset; + + ret = __osCheckId(pfs); + + if (ret == PFS_ERR_NEW_PACK) { + ret = __osGetId(pfs); + } + + if (ret != 0) { + return ret; + } + + ERRCK(corrupted_init(pfs, &cache)); + + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir)); + +#if BUILD_VERSION >= VERSION_J + if (tmp_dir.company_code != 0 || tmp_dir.game_code != 0) { + if (tmp_dir.company_code == 0 || tmp_dir.game_code == 0) { + cc = -1; + } else { + next_page = tmp_dir.start_page; + cl = cc = 0; + bank = 255; + + while (CHECK_IPAGE(next_page)) { + if (bank != next_page.inode_t.bank) { + bank = next_page.inode_t.bank; + + if (oldbank != bank) { + ret = __osPfsRWInode(pfs, &tmp_inode, PFS_READ, bank); + oldbank = bank; + } + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + } + + if ((cc = corrupted(pfs, next_page, &cache) - cl) != 0) { + break; + } + + cl = 1; + next_page = tmp_inode.inode_page[next_page.inode_t.page]; + } + } + + if (cc != 0 || next_page.ipage != PFS_EOF) { + bzero(&tmp_dir, sizeof(__OSDir)); + + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir, FALSE)); + fixed++; + } + } +#else + if (tmp_dir.company_code != 0 && tmp_dir.game_code != 0) { + next_page = tmp_dir.start_page; + cl = cc = 0; + bank = 255; + + while (CHECK_IPAGE(next_page)) { + if (bank != next_page.inode_t.bank) { + bank = next_page.inode_t.bank; + ret = __osPfsRWInode(pfs, &tmp_inode, PFS_READ, bank); + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + } + + if ((cc = corrupted(pfs, next_page, &cache) - cl) != 0) { + break; + } + + cl = 1; + next_page = tmp_inode.inode_page[next_page.inode_t.page]; + } + + if (cc != 0 || next_page.ipage != PFS_EOF) { + tmp_dir.company_code = 0; + tmp_dir.game_code = 0; + tmp_dir.start_page.ipage = 0; + tmp_dir.status = DIR_STATUS_EMPTY; + tmp_dir.data_sum = 0; + + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir, FALSE)); + fixed++; + } + } else { + if (tmp_dir.company_code != 0 || tmp_dir.game_code != 0) { + tmp_dir.company_code = 0; + tmp_dir.game_code = 0; + tmp_dir.start_page.ipage = 0; + tmp_dir.status = DIR_STATUS_EMPTY; + tmp_dir.data_sum = 0; + + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir, FALSE)); + fixed++; + } + } +#endif + } + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&tmp_dir)); + + if (tmp_dir.company_code != 0 && tmp_dir.game_code != 0 + && tmp_dir.start_page.ipage >= (u16)pfs->inode_start_page) { + file_next_node[j].ipage = tmp_dir.start_page.ipage; + } else { + file_next_node[j].ipage = 0; + } + } + + for (bank = 0; bank < pfs->banks; bank++) { + ret = __osPfsRWInode(pfs, &tmp_inode, PFS_READ, bank); + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + + offset = (bank > 0) ? 1 : pfs->inode_start_page; + + for (j = 0; j < offset; j++) { + checked_inode.inode_page[j].ipage = tmp_inode.inode_page[j].ipage; + } + + for (; j < 128; j++) { + checked_inode.inode_page[j].ipage = PFS_PAGE_NOT_USED; + } + + for (j = 0; j < pfs->dir_size; j++) { + while (file_next_node[j].inode_t.bank == bank && file_next_node[j].ipage >= (u16)pfs->inode_start_page) { + u8 pp = file_next_node[j].inode_t.page; + file_next_node[j] = checked_inode.inode_page[pp] = tmp_inode.inode_page[pp]; + } + } + ERRCK(__osPfsRWInode(pfs, &checked_inode, PFS_WRITE, bank)); + } + + if (fixed) { + pfs->status |= PFS_CORRUPTED; + } else { + pfs->status &= ~PFS_CORRUPTED; + } + + return 0; +} + +s32 corrupted_init(OSPfs* pfs, __OSInodeCache* cache) { + int i; + int n; + int offset; + u8 bank; + __OSInodeUnit tpage; + __OSInode tmp_inode; + s32 ret; + + for (i = 0; i < PFS_INODE_DIST_MAP; i++) { + cache->map[i] = 0; + } + + cache->bank = -1; + for (bank = 0; bank < pfs->banks; bank++) { + offset = bank > 0 ? 1 : pfs->inode_start_page; + + ret = __osPfsRWInode(pfs, &tmp_inode, PFS_READ, bank); + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + + for (i = offset; i < ARRLEN(tmp_inode.inode_page); i++) { + tpage = tmp_inode.inode_page[i]; + + if (tpage.ipage >= pfs->inode_start_page && tpage.inode_t.bank != bank) { +#if BUILD_VERSION >= VERSION_J + n = ((tpage.inode_t.page & 0x7F) / PFS_SECTOR_SIZE) + + ((tpage.inode_t.bank % PFS_BANK_LAPPED_BY) * BLOCKSIZE); +#else + n = ((tpage.inode_t.page) / PFS_SECTOR_SIZE) + ((tpage.inode_t.bank % PFS_BANK_LAPPED_BY) * BLOCKSIZE); +#endif + cache->map[n] |= 1 << (bank % PFS_BANK_LAPPED_BY); + } + } + } + return 0; +} + +s32 corrupted(OSPfs* pfs, __OSInodeUnit fpage, __OSInodeCache* cache) { + int j; + int n; + int hit; + u8 bank; + int offset; + s32 ret; + + hit = 0; + ret = 0; + n = (fpage.inode_t.page / PFS_SECTOR_SIZE) + (fpage.inode_t.bank % PFS_BANK_LAPPED_BY) * BLOCKSIZE; + + for (bank = 0; bank < pfs->banks; bank++) { + offset = bank > 0 ? 1 : pfs->inode_start_page; + + if (bank == fpage.inode_t.bank || cache->map[n] & (1 << (bank % PFS_BANK_LAPPED_BY))) { + if (bank != cache->bank) { + ret = __osPfsRWInode(pfs, &cache->inode, PFS_READ, bank); + + if (ret != 0 && ret != PFS_ERR_INCONSISTENT) { + return ret; + } + + cache->bank = bank; + } + + for (j = offset; hit < 2 && (j < ARRLEN(cache->inode.inode_page)); j++) { + if (cache->inode.inode_page[j].ipage == fpage.ipage) { + hit++; + } + } + + if (hit >= 2) { + return PFS_ERR_NEW_PACK; + } + } + } + return hit; +} diff --git a/lib/hackerlibultra/src/io/pfsdeletefile.c b/lib/hackerlibultra/src/io/pfsdeletefile.c new file mode 100644 index 00000000..c91a1d59 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsdeletefile.c @@ -0,0 +1,176 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsDeleteFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name) { + s32 file_no; +#if BUILD_VERSION < VERSION_J + int k; +#endif + s32 ret; + __OSInode inode; + __OSDir dir; +#if BUILD_VERSION < VERSION_J + u16 sum = 0; +#endif + __OSInodeUnit last_page; + u8 startpage; + u8 bank; + + if (company_code == 0 || game_code == 0) { + return PFS_ERR_INVALID; + } + +#if BUILD_VERSION >= VERSION_J + ERRCK(osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, &file_no)); + SET_ACTIVEBANK_TO_ZERO(); +#else + PFS_CHECK_STATUS(); + PFS_CHECK_ID(); + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(osPfsFindFile(pfs, company_code, game_code, game_name, ext_name, &file_no)); + + if (file_no == -1) { + return PFS_ERR_INVALID; + } +#endif + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir)); + + startpage = dir.start_page.inode_t.page; + + for (bank = dir.start_page.inode_t.bank; bank < pfs->banks;) { + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osPfsReleasePages(pfs, &inode, startpage, bank, &last_page)); +#else + ERRCK(__osPfsReleasePages(pfs, &inode, startpage, &sum, bank, &last_page, TRUE)); +#endif + ERRCK(__osPfsRWInode(pfs, &inode, PFS_WRITE, bank)); + + if (last_page.ipage == PFS_EOF) { + break; + } + + bank = last_page.inode_t.bank; + startpage = last_page.inode_t.page; + } + + if (bank >= pfs->banks) { + return PFS_ERR_INCONSISTENT; + } + +#if BUILD_VERSION >= VERSION_J + bzero(&dir, sizeof(__OSDir)); +#else + dir.game_code = 0; + dir.company_code = 0; + dir.start_page.ipage = 0; + dir.data_sum = 0; + for (k = 0; k < ARRLEN(dir.game_name); k++) { + dir.game_name[k] = 0; + } + for (k = 0; k < ARRLEN(dir.ext_name); k++) { + dir.ext_name[k] = 0; + } + dir.status = DIR_STATUS_EMPTY; +#endif + + ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir, FALSE); + + return ret; +} + +#if BUILD_VERSION >= VERSION_J + +s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u8 bank, __OSInodeUnit* last_page) { + __OSInodeUnit next_page; + __OSInodeUnit old_page; + s32 ret = 0; + + next_page.ipage = (bank << 8) + start_page; + + do { + old_page = next_page; + next_page = inode->inode_page[next_page.inode_t.page]; + inode->inode_page[old_page.inode_t.page].ipage = PFS_PAGE_NOT_USED; + } while (next_page.ipage >= pfs->inode_start_page && next_page.inode_t.bank == bank); + + *last_page = next_page; + + return ret; +} + +#else + +s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 start_page, u16* sum, u8 bank, __OSInodeUnit* last_page, + int flag) { + __OSInodeUnit next_page; + __OSInodeUnit old_page; + s32 ret; + int offset; + ret = 0; + next_page = inode->inode_page[start_page]; + + if (next_page.ipage != 1) { + offset = (next_page.inode_t.bank > 0) ? 1 : pfs->inode_start_page; + } else { + offset = (bank > 0) ? 1 : pfs->inode_start_page; + } + + if (next_page.inode_t.page < offset && next_page.ipage != 1) { + return PFS_ERR_INCONSISTENT; + } + + *last_page = next_page; + + if (flag == TRUE) { + inode->inode_page[start_page].ipage = 3; + } + + ERRCK(__osBlockSum(pfs, start_page, sum, bank)); + + if (next_page.ipage == 1) { + return 0; + } + + while (next_page.ipage >= pfs->inode_start_page) { + old_page = next_page; + next_page = inode->inode_page[next_page.inode_t.page]; + inode->inode_page[old_page.inode_t.page].ipage = 3; + + ERRCK(__osBlockSum(pfs, old_page.inode_t.page, sum, bank)); + + if (next_page.inode_t.bank != bank) { + break; + } + } + + if (next_page.ipage >= pfs->inode_start_page && next_page.inode_t.bank == bank) { + inode->inode_page[next_page.inode_t.page].ipage = 3; + } + + *last_page = next_page; + return 0; +} +s32 __osBlockSum(OSPfs* pfs, u8 page_no, u16* sum, u8 bank) { + int i; + s32 ret; + u8 data[32]; + ret = 0; + pfs->activebank = bank; + ERRCK(__osPfsSelectBank(pfs)); + for (i = 0; i < PFS_ONE_PAGE; i++) { + ret = __osContRamRead(pfs->queue, pfs->channel, page_no * PFS_ONE_PAGE + i, data); + if (ret != 0) { + pfs->activebank = 0; + __osPfsSelectBank(pfs); + return ret; + } + *sum = *sum + __osSumcalc(data, sizeof(data)); + } + pfs->activebank = 0; + ret = __osPfsSelectBank(pfs); + return ret; +} + +#endif diff --git a/lib/hackerlibultra/src/io/pfsfilestate.c b/lib/hackerlibultra/src/io/pfsfilestate.c new file mode 100644 index 00000000..7a391017 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsfilestate.c @@ -0,0 +1,113 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsFileState(OSPfs* pfs, s32 file_no, OSPfsState* state) { + s32 ret; + int pages; + __OSInode inode; + __OSDir dir; + __OSInodeUnit next_page; +#if BUILD_VERSION < VERSION_J + int j; +#endif + u8 bank; +#if BUILD_VERSION < VERSION_J + u8 start_page; +#endif + + if (file_no >= pfs->dir_size || file_no < 0) { + return PFS_ERR_INVALID; + } + + PFS_CHECK_STATUS(); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osCheckId(pfs)); +#else + PFS_CHECK_ID(); +#endif + SET_ACTIVEBANK_TO_ZERO(); + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir)); + + if (dir.company_code == 0 || dir.game_code == 0) { + return PFS_ERR_INVALID; + } + +#if BUILD_VERSION >= VERSION_J + pages = 0; + next_page = dir.start_page; + bank = 0xFF; + + while (TRUE) { + if (next_page.ipage < pfs->inode_start_page) { + break; + } else if (next_page.inode_t.bank != bank) { + bank = next_page.inode_t.bank; + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); + } + + pages++; + next_page = inode.inode_page[next_page.inode_t.page]; + } + + if (next_page.ipage != PFS_EOF) { + return PFS_ERR_INCONSISTENT; + } + + state->file_size = pages * (PFS_ONE_PAGE * BLOCKSIZE); + state->company_code = dir.company_code; + state->game_code = dir.game_code; + bcopy(&dir.game_name, state->game_name, PFS_FILE_NAME_LEN); + bcopy(&dir.ext_name, state->ext_name, PFS_FILE_EXT_LEN); + + ret = __osPfsGetStatus(pfs->queue, pfs->channel); + return ret; +#else + if (dir.start_page.ipage < pfs->inode_start_page) { + return PFS_ERR_INCONSISTENT; + } + + pages = 0; + start_page = dir.start_page.inode_t.page; + bank = dir.start_page.inode_t.bank; + + while (bank < pfs->banks) { + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); + next_page = inode.inode_page[start_page]; + pages++; + + while (next_page.ipage >= pfs->inode_start_page) { + pages++; + next_page = inode.inode_page[next_page.inode_t.page]; + if (next_page.inode_t.bank != bank) { + bank = next_page.inode_t.bank; + start_page = next_page.inode_t.page; + break; + } + } + + if (next_page.ipage == PFS_EOF) { + break; + } + } + + if (next_page.ipage != PFS_EOF) { + return PFS_ERR_INCONSISTENT; + } + + state->file_size = pages * (PFS_ONE_PAGE * BLOCKSIZE); + state->company_code = dir.company_code; + state->game_code = dir.game_code; + + for (j = 0; j < ARRLEN(state->game_name); j++) { + state->game_name[j] = dir.game_name[j]; + } + + for (j = 0; j < ARRLEN(state->ext_name); j++) { + state->ext_name[j] = dir.ext_name[j]; + } + + return 0; +#endif +} diff --git a/lib/hackerlibultra/src/io/pfsfreeblocks.c b/lib/hackerlibultra/src/io/pfsfreeblocks.c new file mode 100644 index 00000000..78c07c80 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsfreeblocks.c @@ -0,0 +1,32 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsFreeBlocks(OSPfs* pfs, s32* bytes_not_used) { + int j; + int pages = 0; + __OSInode inode; + s32 ret = 0; + u8 bank; + int offset; + + PFS_CHECK_STATUS(); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osCheckId(pfs)); +#else + PFS_CHECK_ID(); +#endif + for (bank = 0; bank < pfs->banks; bank++) { + ERRCK(__osPfsRWInode(pfs, &inode, PFS_READ, bank)); + offset = ((bank > 0) ? 1 : pfs->inode_start_page); + + for (j = offset; j < ARRLEN(inode.inode_page); j++) { + if (inode.inode_page[j].ipage == PFS_PAGE_NOT_USED) { + pages++; + } + } + } + + *bytes_not_used = pages * PFS_ONE_PAGE * BLOCKSIZE; + return 0; +} diff --git a/lib/hackerlibultra/src/io/pfsgetlabel.c b/lib/hackerlibultra/src/io/pfsgetlabel.c new file mode 100644 index 00000000..adb1dcc5 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsgetlabel.c @@ -0,0 +1,26 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsGetLabel(OSPfs* pfs, u8* label, int* len) { + int i; + + if (label == NULL) { + return PFS_ERR_INVALID; + } + + if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) { + return PFS_ERR_NEW_PACK; + } + + for (i = 0; i < ARRLEN(pfs->label); i++) { + if (*(u8*)(u32)(i + pfs->label) == 0) { + break; + } + + *label++ = *(u8*)(u32)(i + pfs->label); + } + + *len = i; + return 0; +} diff --git a/lib/ultra/io/pfsgetstatus.c b/lib/hackerlibultra/src/io/pfsgetstatus.c similarity index 52% rename from lib/ultra/io/pfsgetstatus.c rename to lib/hackerlibultra/src/io/pfsgetstatus.c index 3840c3cc..fa736e3f 100644 --- a/lib/ultra/io/pfsgetstatus.c +++ b/lib/hackerlibultra/src/io/pfsgetstatus.c @@ -1,98 +1,67 @@ #include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" -#if LIBULTRA_VERSION > OS_VER_H - -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J void __osPfsRequestOneChannel(int channel, u8 cmd); #else void __osPfsRequestOneChannel(int channel); #endif - void __osPfsGetOneChannelData(int channel, OSContStatus* data); -#endif -#ifdef BBPLAYER -s32 __osPfsGetStatus(UNUSED OSMesgQueue *queue, s32 channel) { - if (__osBbPakAddress[channel] != 0) { - return 0; - } - return PFS_ERR_NOPACK; -} -#else -s32 __osPfsGetStatus(OSMesgQueue *queue, s32 channel) { +s32 __osPfsGetStatus(OSMesgQueue* queue, int channel) { s32 ret = 0; OSMesg dummy; -#if LIBULTRA_VERSION > OS_VER_H OSContStatus data; -#define DATA(c) data + +#if BUILD_VERSION >= VERSION_J + __osPfsInodeCacheBank = 250; + + __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); #else - u8 pattern; - OSContStatus data[MAXCONTROLLERS]; -#define DATA(c) data[c] + __osPfsRequestOneChannel(channel); #endif -#if LIBULTRA_VERSION >= OS_VER_J - __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); -#elif LIBULTRA_VERSION > OS_VER_H - __osPfsRequestOneChannel(channel); -#else - __osPfsRequestData(CONT_CMD_REQUEST_STATUS); -#endif ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); osRecvMesg(queue, &dummy, OS_MESG_BLOCK); -#if LIBULTRA_VERSION > OS_VER_H - __osPfsGetOneChannelData(channel, &data); -#else - __osPfsGetInitData(&pattern, data); -#endif - if (DATA(channel).status & CONT_CARD_ON && DATA(channel).status & CONT_CARD_PULL) { + __osPfsGetOneChannelData(channel, &data); + + if (((data.status & CONT_CARD_ON) != 0) && ((data.status & CONT_CARD_PULL) != 0)) { return PFS_ERR_NEW_PACK; - } else if (DATA(channel).errnum || !(DATA(channel).status & CONT_CARD_ON)) { + } else if ((data.errno != 0) || ((data.status & CONT_CARD_ON) == 0)) { return PFS_ERR_NOPACK; - } else if (DATA(channel).status & CONT_ADDR_CRC_ER) { + } else if ((data.status & CONT_ADDR_CRC_ER) != 0) { return PFS_ERR_CONTRFAIL; } return ret; } -#endif -#if LIBULTRA_VERSION > OS_VER_H - -#if LIBULTRA_VERSION >= OS_VER_J -void __osPfsRequestOneChannel(int channel, u8 cmd) +#if BUILD_VERSION >= VERSION_J +void __osPfsRequestOneChannel(int channel, u8 cmd) { #else -void __osPfsRequestOneChannel(int channel) +void __osPfsRequestOneChannel(int channel) { #endif -{ u8* ptr; - __OSContRequesFormat requestformat; + __OSContRequesFormatShort requestformat; int i; -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J __osContLastCmd = CONT_CMD_END; #else __osContLastCmd = CONT_CMD_REQUEST_STATUS; #endif -#if LIBULTRA_VERSION > OS_VER_H __osPfsPifRam.pifstatus = CONT_CMD_READ_BUTTON; -#else - __osPfsPifRam.pifstatus = CONT_CMD_EXE; -#endif ptr = (u8*)&__osPfsPifRam; requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J requestformat.cmd = cmd; #else requestformat.cmd = CONT_CMD_REQUEST_STATUS; @@ -105,28 +74,27 @@ void __osPfsRequestOneChannel(int channel) *ptr++ = CONT_CMD_REQUEST_STATUS; } - *REQFORMAT(ptr) = requestformat; - ptr += sizeof(requestformat); + *(__OSContRequesFormatShort*)ptr = requestformat; + ptr += sizeof(__OSContRequesFormatShort); *ptr = CONT_CMD_END; } void __osPfsGetOneChannelData(int channel, OSContStatus* data) { u8* ptr = (u8*)&__osPfsPifRam; - __OSContRequesFormat requestformat; + __OSContRequesFormatShort requestformat; int i; for (i = 0; i < channel; i++) { ptr++; } - requestformat = *REQFORMAT(ptr); - data->errnum = CHNL_ERR(requestformat); + requestformat = *(__OSContRequesFormatShort*)ptr; + data->errno = CHNL_ERR(requestformat); - if (data->errnum != 0) { + if (data->errno != 0) { return; } data->type = (requestformat.typel << 8) | (requestformat.typeh); data->status = requestformat.status; } -#endif diff --git a/lib/hackerlibultra/src/io/pfsinit.c b/lib/hackerlibultra/src/io/pfsinit.c new file mode 100644 index 00000000..581cefcb --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsinit.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +s32 osPfsInit(OSMesgQueue* queue, OSPfs* pfs, int channel) { + s32 ret = 0; + + __osSiGetAccess(); + ret = __osPfsGetStatus(queue, channel); + __osSiRelAccess(); + + if (ret != 0) { + return ret; + } + + pfs->queue = queue; + pfs->channel = channel; + pfs->status = 0; + pfs->activebank = -1; + ERRCK(__osGetId(pfs)); + + ret = osPfsChecker(pfs); + pfs->status |= PFS_INITIALIZED; + return ret; +} diff --git a/lib/hackerlibultra/src/io/pfsinitpak.c b/lib/hackerlibultra/src/io/pfsinitpak.c new file mode 100644 index 00000000..06f301c8 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsinitpak.c @@ -0,0 +1,130 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +#if BUILD_VERSION >= VERSION_J +static s32 __osPfsCheckRamArea(OSPfs* pfs); +#endif + +s32 osPfsInitPak(OSMesgQueue* queue, OSPfs* pfs, int channel) { +#if BUILD_VERSION < VERSION_J + int k; +#endif + s32 ret = 0; + u16 sum; + u16 isum; + u8 temp[BLOCKSIZE]; + __OSPackId* id; + __OSPackId newid; + + __osSiGetAccess(); + + ret = __osPfsGetStatus(queue, channel); + + __osSiRelAccess(); + + if (ret != 0) { + return ret; + } + + pfs->queue = queue; + pfs->channel = channel; + pfs->status = 0; + +#if BUILD_VERSION >= VERSION_J + ERRCK(__osPfsCheckRamArea(pfs)); +#endif + ERRCK(SELECT_BANK(pfs, 0)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)); + + __osIdCheckSum((u16*)temp, &sum, &isum); + id = (__OSPackId*)temp; + + if ((id->checksum != sum) || (id->inverted_checksum != isum)) { + ret = __osCheckPackId(pfs, id); + + if (ret != 0) { +#if BUILD_VERSION >= VERSION_J + pfs->status |= PFS_ID_BROKEN; +#endif + return ret; + } + +#if BUILD_VERSION < VERSION_J + // Duplicated check + else if (ret != 0) { + return ret; + } +#endif + } + + if (!(id->deviceid & 1)) { + ret = __osRepairPackId(pfs, id, &newid); + + if (ret != 0) { +#if BUILD_VERSION >= VERSION_J + if (ret == PFS_ERR_ID_FATAL) { + pfs->status |= PFS_ID_BROKEN; + } +#endif + return ret; + } + + id = &newid; + + if (!(id->deviceid & 1)) { + return PFS_ERR_DEVICE; + } + } + +#if BUILD_VERSION >= VERSION_J + bcopy(id, pfs->id, BLOCKSIZE); +#else + for (k = 0; k < ARRLEN(pfs->id); k++) { + pfs->id[k] = ((u8*)id)[k]; + } +#endif + + pfs->version = id->version; + pfs->banks = id->banks; + pfs->inode_start_page = 1 + DEF_DIR_PAGES + (2 * pfs->banks); + pfs->dir_size = DEF_DIR_PAGES * PFS_ONE_PAGE; + pfs->inode_table = 1 * PFS_ONE_PAGE; + pfs->minode_table = (1 + pfs->banks) * PFS_ONE_PAGE; + pfs->dir_table = pfs->minode_table + (pfs->banks * PFS_ONE_PAGE); + + ERRCK(__osContRamRead(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label)); + + ret = osPfsChecker(pfs); + pfs->status |= PFS_INITIALIZED; + + return ret; +} + +#if BUILD_VERSION >= VERSION_J +static s32 __osPfsCheckRamArea(OSPfs* pfs) { + s32 i; + s32 ret = 0; + u8 temp1[BLOCKSIZE]; + u8 temp2[BLOCKSIZE]; + u8 save[BLOCKSIZE]; + + ERRCK(SELECT_BANK(pfs, PFS_ID_BANK_256K)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, save)); + + for (i = 0; i < BLOCKSIZE; i++) { + temp1[i] = i; + } + + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, 0, temp1, FALSE)); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 0, temp2)); + + if (bcmp(temp1, temp2, BLOCKSIZE) != 0) { + return PFS_ERR_DEVICE; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, 0, save, FALSE); + return ret; +} +#endif diff --git a/lib/ultra/io/pfsisplug.c b/lib/hackerlibultra/src/io/pfsisplug.c similarity index 57% rename from lib/ultra/io/pfsisplug.c rename to lib/hackerlibultra/src/io/pfsisplug.c index 0d9743ad..01040305 100644 --- a/lib/ultra/io/pfsisplug.c +++ b/lib/hackerlibultra/src/io/pfsisplug.c @@ -1,18 +1,18 @@ -#include "PR/os_pi.h" +#include "PRinternal/macros.h" #include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" -ALIGNED16 OSPifRam __osPfsPifRam; +OSPifRam __osPfsPifRam; -s32 osPfsIsPlug(OSMesgQueue *mq, u8 *pattern) { +s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern) { s32 ret = 0; - OSMesg dummy; + OSMesg msg; u8 bitpattern; OSContStatus contData[MAXCONTROLLERS]; - int channel; + s32 channel; u8 bits = 0; - int crcErrorCount = 3; + s32 crcErrorCount = 3; __osSiGetAccess(); @@ -20,12 +20,13 @@ s32 osPfsIsPlug(OSMesgQueue *mq, u8 *pattern) { __osPfsRequestData(CONT_CMD_REQUEST_STATUS); ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + __osPfsGetInitData(&bitpattern, &contData[0]); - __osPfsGetInitData(&bitpattern, contData); for (channel = 0; channel < __osMaxControllers; channel++) { if ((contData[channel].status & CONT_ADDR_CRC_ER) == 0) { crcErrorCount--; @@ -33,14 +34,14 @@ s32 osPfsIsPlug(OSMesgQueue *mq, u8 *pattern) { } } - if (__osMaxControllers == channel) { + if (channel == __osMaxControllers) { crcErrorCount = 0; } } while (crcErrorCount > 0); for (channel = 0; channel < __osMaxControllers; channel++) { - if ((contData[channel].errnum == 0) && ((contData[channel].status & CONT_CARD_ON) != 0)) { - bits |= 1 << channel; + if ((contData[channel].errno == 0) && ((contData[channel].status & CONT_CARD_ON) != 0)) { + bits |= (1 << channel); } } __osSiRelAccess(); @@ -49,23 +50,12 @@ s32 osPfsIsPlug(OSMesgQueue *mq, u8 *pattern) { } void __osPfsRequestData(u8 cmd) { - u8 *ptr; + u8* ptr = (u8*)&__osPfsPifRam; __OSContRequesFormat requestformat; int i; -#if LIBULTRA_VERSION > OS_VER_H - ptr = (u8 *)&__osPfsPifRam; -#endif __osContLastCmd = cmd; -#if LIBULTRA_VERSION < OS_VER_I - CONT_PIFRAM_SET(__osPfsPifRam, 0, CONT_CMD_EXE); -#else __osPfsPifRam.pifstatus = CONT_CMD_EXE; -#endif -#if LIBULTRA_VERSION < OS_VER_I - ptr = (u8 *)&__osPfsPifRam; -#endif - requestformat.dummy = CONT_CMD_NOP; requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; @@ -76,32 +66,32 @@ void __osPfsRequestData(u8 cmd) { requestformat.dummy1 = CONT_CMD_NOP; for (i = 0; i < __osMaxControllers; i++) { - *REQFORMAT(ptr) = requestformat; - ptr += sizeof(requestformat); + *((__OSContRequesFormat*)ptr) = requestformat; + ptr += sizeof(__OSContRequesFormat); } *ptr = CONT_CMD_END; } -void __osPfsGetInitData(u8 *pattern, OSContStatus *data) { - u8 *ptr; +void __osPfsGetInitData(u8* pattern, OSContStatus* data) { + u8* ptr; __OSContRequesFormat requestformat; int i; u8 bits = 0; - ptr = (u8 *)&__osPfsPifRam; + ptr = (u8*)&__osPfsPifRam; for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestformat), data++) { - requestformat = *REQFORMAT(ptr); - data->errnum = CHNL_ERR(requestformat); + requestformat = *((__OSContRequesFormat*)ptr); + data->errno = CHNL_ERR(requestformat); - if (data->errnum != 0) { + if (data->errno != 0) { continue; } - data->type = (requestformat.typel << 8) | (requestformat.typeh); + data->type = ((requestformat.typel << 8) | requestformat.typeh); data->status = requestformat.status; - bits |= 1 << i; + bits |= (1 << i); } *pattern = bits; } diff --git a/lib/hackerlibultra/src/io/pfsnumfiles.c b/lib/hackerlibultra/src/io/pfsnumfiles.c new file mode 100644 index 00000000..d0af53b3 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsnumfiles.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsNumFiles(OSPfs* pfs, s32* max_files, s32* files_used) { + int j; + s32 ret; + __OSDir dir; + int files = 0; + + PFS_CHECK_STATUS(); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osCheckId(pfs)); +#else + PFS_CHECK_ID(); +#endif + SET_ACTIVEBANK_TO_ZERO(); + + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&dir)); + + if (dir.company_code != 0 && dir.game_code != 0) { + files++; + } + } + *files_used = files; + *max_files = pfs->dir_size; + +#if BUILD_VERSION >= VERSION_J + ret = __osPfsGetStatus(pfs->queue, pfs->channel); + return ret; +#else + return 0; +#endif +} diff --git a/lib/hackerlibultra/src/io/pfsreadwritefile.c b/lib/hackerlibultra/src/io/pfsreadwritefile.c new file mode 100644 index 00000000..5d1a16d9 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsreadwritefile.c @@ -0,0 +1,126 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +#define CHECK_IPAGE(p) \ + (((p).ipage >= pfs->inode_start_page) && ((p).inode_t.bank < pfs->banks) && ((p).inode_t.page >= 0x01) \ + && ((p).inode_t.page < 0x80)) + +static s32 __osPfsGetNextPage(OSPfs* pfs, u8* bank, __OSInode* inode, __OSInodeUnit* page) { + s32 ret; + + if (page->inode_t.bank != *bank) { + *bank = page->inode_t.bank; + ERRCK(__osPfsRWInode(pfs, inode, PFS_READ, *bank)); + } + + *page = inode->inode_page[page->inode_t.page]; + + if (!CHECK_IPAGE(*page)) { + if (page->ipage == PFS_EOF) { + return PFS_ERR_INVALID; + } + + return PFS_ERR_INCONSISTENT; + } + return 0; +} +s32 osPfsReadWriteFile(OSPfs* pfs, s32 file_no, u8 flag, int offset, int size_in_bytes, u8* data_buffer) { + s32 ret; + __OSDir dir; + __OSInode inode; + __OSInodeUnit cur_page; + int cur_block; + int siz_block; + u8* buffer; + u8 bank; + u16 blockno; + + if ((file_no >= (s32)pfs->dir_size) || (file_no < 0)) { + return PFS_ERR_INVALID; + } + + if ((size_in_bytes <= 0) || ((size_in_bytes % BLOCKSIZE) != 0)) { + return PFS_ERR_INVALID; + } + + if ((offset < 0) || ((offset % BLOCKSIZE) != 0)) { + return PFS_ERR_INVALID; + } + + PFS_CHECK_STATUS(); + PFS_CHECK_ID(); + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir)); + + if (dir.company_code == 0 || dir.game_code == 0) { + return PFS_ERR_INVALID; + } + + if (!CHECK_IPAGE(dir.start_page)) { + if ((dir.start_page.ipage == PFS_EOF)) { + return PFS_ERR_INVALID; + } + + return PFS_ERR_INCONSISTENT; + } + + if (flag == PFS_READ && (dir.status & DIR_STATUS_OCCUPIED) == 0) { + return PFS_ERR_BAD_DATA; + } + + bank = -1; + cur_block = offset / BLOCKSIZE; + cur_page = dir.start_page; + + while (cur_block >= PFS_ONE_PAGE) { + ERRCK(__osPfsGetNextPage(pfs, &bank, &inode, &cur_page)); + cur_block -= PFS_ONE_PAGE; + } + + siz_block = size_in_bytes / BLOCKSIZE; + buffer = data_buffer; + + while (siz_block > 0) { + if (cur_block == PFS_ONE_PAGE) { + ERRCK(__osPfsGetNextPage(pfs, &bank, &inode, &cur_page)); + cur_block = 0; + } + + if (pfs->activebank != cur_page.inode_t.bank) { + ERRCK(SELECT_BANK(pfs, cur_page.inode_t.bank)); + } + + blockno = cur_page.inode_t.page * PFS_ONE_PAGE + cur_block; + + if (flag == OS_READ) { + ret = __osContRamRead(pfs->queue, pfs->channel, blockno, buffer); + } else { + ret = __osContRamWrite(pfs->queue, pfs->channel, blockno, buffer, FALSE); + } + + if (ret != 0) { + return ret; + } + buffer += BLOCKSIZE; + cur_block++; + siz_block--; + } + + if (flag == PFS_WRITE && (dir.status & DIR_STATUS_OCCUPIED) == 0) { + dir.status |= DIR_STATUS_OCCUPIED; +#if BUILD_VERSION >= VERSION_J + SET_ACTIVEBANK_TO_ZERO(); +#else + ERRCK(SELECT_BANK(pfs, 0)); +#endif + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, pfs->dir_table + file_no, (u8*)&dir, FALSE)); + } + +#if BUILD_VERSION >= VERSION_J + ret = __osPfsGetStatus(pfs->queue, pfs->channel); + return ret; +#else + return 0; +#endif +} diff --git a/lib/hackerlibultra/src/io/pfsreformat.c b/lib/hackerlibultra/src/io/pfsreformat.c new file mode 100644 index 00000000..e1768cfd --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsreformat.c @@ -0,0 +1,72 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PRinternal/siint.h" + +s32 osPfsReFormat(OSPfs* pfs, OSMesgQueue* queue, int channel) { + int j; + int i; + __OSInode inode; + u8 tmp_data[32]; + u8* ptr; + s32 ret; + __osSiGetAccess(); + ret = __osPfsGetStatus(queue, channel); + + if (ret != 0) { + __osSiRelAccess(); + return ret; + } + + pfs->status ^= PFS_INITIALIZED; + pfs->queue = queue; + pfs->channel = channel; + __osSiRelAccess(); + ERRCK(__osGetId(pfs)); + + SET_ACTIVEBANK_TO_ZERO(); + + for (j = 0; j < ARRLEN(tmp_data); j++) { + tmp_data[j] = 0; + } + + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamWrite(queue, channel, pfs->dir_table + j, tmp_data, FALSE)); + } + + for (j = 0; j < pfs->inode_start_page; j++) { + inode.inode_page[j].ipage = 0; + } + + for (j = pfs->inode_start_page; j < ARRLEN(inode.inode_page); j++) { + inode.inode_page[j].ipage = 3; + } + + inode.inode_page[0].ipage = __osSumcalc((u8*)(inode.inode_page + pfs->inode_start_page), + (ARRLEN(inode.inode_page) - pfs->inode_start_page) * sizeof(__OSInodeUnit)); + ptr = (u8*)&inode; + + for (j = 0; j < PFS_ONE_PAGE; j++) { + ERRCK(__osContRamWrite(queue, channel, pfs->inode_table + j, ptr + j * BLOCKSIZE, FALSE)); + ERRCK(__osContRamWrite(queue, channel, pfs->minode_table + j, ptr + j * BLOCKSIZE, FALSE)); + } + + for (i = 1; i < pfs->banks; i++) { + for (j = 1; j < ARRLEN(inode.inode_page); j++) { + inode.inode_page[j].ipage = 3; + } + + inode.inode_page[0].ipage = + __osSumcalc((u8*)(inode.inode_page + 1), (ARRLEN(inode.inode_page) - 1) * sizeof(__OSInodeUnit)); + ptr = (u8*)&inode; + + for (j = 0; j < PFS_ONE_PAGE; j++) { + ERRCK( + __osContRamWrite(queue, channel, pfs->inode_table + i * PFS_ONE_PAGE + j, ptr + j * BLOCKSIZE, FALSE)); + ERRCK( + __osContRamWrite(queue, channel, pfs->minode_table + i * PFS_ONE_PAGE + j, ptr + j * BLOCKSIZE, FALSE)); + } + } + + return 0; +} diff --git a/lib/hackerlibultra/src/io/pfsrepairid.c b/lib/hackerlibultra/src/io/pfsrepairid.c new file mode 100644 index 00000000..f51804fd --- /dev/null +++ b/lib/hackerlibultra/src/io/pfsrepairid.c @@ -0,0 +1,74 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +#if BUILD_VERSION >= VERSION_J + +s32 osPfsRepairId(OSPfs* pfs) { + s32 ret = 0; + + if ((pfs->status & (PFS_INITIALIZED | PFS_ID_BROKEN))) { + ret = __osGetId(pfs); + + if (ret == 0) { + pfs->status &= ~(PFS_ID_BROKEN); + } + } else { + ret = PFS_ERR_INVALID; + } + + return ret; +} + +#else + +s32 osPfsRepairId(OSPfs* pfs) { + int k; + u16 sum; + u16 isum; + u8 temp[32]; + __OSPackId newid; + s32 ret; + __OSPackId* id; + + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 1, (u8*)&temp)); + __osIdCheckSum((u16*)&temp, &sum, &isum); + id = (__OSPackId*)&temp; + + if (id->checksum != sum || id->inverted_checksum != isum) { + ret = __osCheckPackId(pfs, id); + + if (ret == 10) { + ERRCK(__osRepairPackId(pfs, id, &newid)); + id = &newid; + } else if (ret != 0) { + return ret; + } + } + + if ((id->deviceid & 1) == 0) { + ERRCK(__osRepairPackId(pfs, id, &newid)); + id = &newid; + + if ((id->deviceid & 1) == 0) { + return PFS_ERR_DEVICE; + } + } + + for (k = 0; k < ARRLEN(pfs->id); k++) { + pfs->id[k] = ((u8*)id)[k]; + } + + pfs->version = id->version; + pfs->banks = id->banks; + pfs->inode_start_page = pfs->banks * 2 + 3; + pfs->dir_size = 16; + pfs->inode_table = 8; + pfs->minode_table = (pfs->banks + 1) * PFS_ONE_PAGE; + pfs->dir_table = pfs->minode_table + pfs->banks * PFS_ONE_PAGE; + ERRCK(__osContRamRead(pfs->queue, pfs->channel, 7, pfs->label)); + return 0; +} + +#endif diff --git a/lib/hackerlibultra/src/io/pfssearchfile.c b/lib/hackerlibultra/src/io/pfssearchfile.c new file mode 100644 index 00000000..ff76d167 --- /dev/null +++ b/lib/hackerlibultra/src/io/pfssearchfile.c @@ -0,0 +1,57 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsFindFile(OSPfs* pfs, u16 company_code, u32 game_code, u8* game_name, u8* ext_name, s32* file_no) { + s32 j; + int i; + __OSDir dir; + s32 ret = 0; + int fail; + +#if BUILD_VERSION >= VERSION_J + if (!(pfs->status & PFS_INITIALIZED)) { + return PFS_ERR_INVALID; + } + ERRCK(__osCheckId(pfs)); +#else + PFS_CHECK_ID(); +#endif + + for (j = 0; j < pfs->dir_size; j++) { + ERRCK(__osContRamRead(pfs->queue, pfs->channel, pfs->dir_table + j, (u8*)&dir)); +#if BUILD_VERSION >= VERSION_J + ERRCK(__osPfsGetStatus(pfs->queue, pfs->channel)); +#endif + + if ((dir.company_code == company_code) && dir.game_code == game_code) { + fail = FALSE; + + if (game_name != NULL) { + for (i = 0; i < ARRLEN(dir.game_name); i++) { + if (dir.game_name[i] != game_name[i]) { + fail = TRUE; + break; + } + } + } + + if (ext_name != NULL && !fail) { + for (i = 0; i < ARRLEN(dir.ext_name); i++) { + if (dir.ext_name[i] != ext_name[i]) { + fail = TRUE; + break; + } + } + } + + if (!fail) { + *file_no = j; + return ret; + } + } + } + + *file_no = -1; + return PFS_ERR_INVALID; +} diff --git a/lib/ultra/io/pfsselectbank.c b/lib/hackerlibultra/src/io/pfsselectbank.c similarity index 55% rename from lib/ultra/io/pfsselectbank.c rename to lib/hackerlibultra/src/io/pfsselectbank.c index ee3bcb54..70a88861 100644 --- a/lib/ultra/io/pfsselectbank.c +++ b/lib/hackerlibultra/src/io/pfsselectbank.c @@ -1,31 +1,22 @@ #include "PR/os_internal.h" -#include "controller.h" +#include "PRinternal/controller.h" -#if LIBULTRA_VERSION >= OS_VER_J -s32 __osPfsSelectBank(OSPfs* pfs, u8 bank) -#else -s32 __osPfsSelectBank(OSPfs *pfs) -#endif -{ +#if BUILD_VERSION >= VERSION_J +s32 __osPfsSelectBank(OSPfs* pfs, u8 bank) { u8 temp[BLOCKSIZE]; int i; s32 ret = 0; for (i = 0; i < BLOCKSIZE; i++) { -#if LIBULTRA_VERSION >= OS_VER_J temp[i] = bank; -#else - temp[i] = pfs->activebank; -#endif } ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_DETECT, temp, FALSE); -#if LIBULTRA_VERSION >= OS_VER_J if (ret == 0) { pfs->activebank = bank; } -#endif return ret; } +#endif diff --git a/lib/hackerlibultra/src/io/pfssetlabel.c b/lib/hackerlibultra/src/io/pfssetlabel.c new file mode 100644 index 00000000..ab6c6eaf --- /dev/null +++ b/lib/hackerlibultra/src/io/pfssetlabel.c @@ -0,0 +1,42 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" + +s32 osPfsSetLabel(OSPfs* pfs, u8* label) { + int i; + s32 ret; + +#if BUILD_VERSION >= VERSION_J + if (!(pfs->status & PFS_INITIALIZED)) { + return PFS_ERR_INVALID; + } + + ERRCK(__osCheckId(pfs)); +#else + PFS_CHECK_ID(); +#endif + + if (label != NULL) { + for (i = 0; i < ARRLEN(pfs->label); i++) { + if (*label == 0) { + break; + } + + *(pfs->label + i) = *label++; + } + } + +#if BUILD_VERSION >= VERSION_J + if (pfs->activebank != 0) { + ret = SELECT_BANK(pfs, 0); + if (ret == 0) { + ret = (__osContRamWrite(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label, FALSE)); + } + } + return ret; +#else + SET_ACTIVEBANK_TO_ZERO(); + ERRCK(__osContRamWrite(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label, FALSE)); + return 0; +#endif +} diff --git a/lib/hackerlibultra/src/io/pi.c b/lib/hackerlibultra/src/io/pi.c new file mode 100644 index 00000000..f2cc4b95 --- /dev/null +++ b/lib/hackerlibultra/src/io/pi.c @@ -0,0 +1,15 @@ + +#include "PR/os_internal.h" +#include "PRinternal/piint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osPiDeviceBusy(void) { + register u32 stat = IO_READ(PI_STATUS_REG); + if (stat & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/lib/ultra/io/piacs.c b/lib/hackerlibultra/src/io/piacs.c similarity index 59% rename from lib/ultra/io/piacs.c rename to lib/hackerlibultra/src/io/piacs.c index 21cb1ec3..78974ddf 100644 --- a/lib/ultra/io/piacs.c +++ b/lib/hackerlibultra/src/io/piacs.c @@ -1,13 +1,14 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" -#include "macros.h" -FORCE_BSS OSMesg osPiMesgBuff[1]; -ALIGNED8 OSMesgQueue __osPiAccessQueue; -u32 __osPiAccessQueueEnabled = FALSE; +#define PI_Q_BUF_LEN 1 +u32 __osPiAccessQueueEnabled = 0; +static OSMesg piAccessBuf[PI_Q_BUF_LEN]; +OSMesgQueue __osPiAccessQueue ALIGNED(0x8); void __osPiCreateAccessQueue(void) { - __osPiAccessQueueEnabled = TRUE; - osCreateMesgQueue(&__osPiAccessQueue, &osPiMesgBuff[0], 1); + __osPiAccessQueueEnabled = 1; + osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, PI_Q_BUF_LEN); osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); } diff --git a/lib/hackerlibultra/src/io/pidma.c b/lib/hackerlibultra/src/io/pidma.c new file mode 100644 index 00000000..2464a6d3 --- /dev/null +++ b/lib/hackerlibultra/src/io/pidma.c @@ -0,0 +1,66 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/piint.h" + +s32 osPiStartDma(OSIoMesg* mb, s32 priority, s32 direction, u32 devAddr, void* dramAddr, u32 size, OSMesgQueue* mq) { + register s32 ret; + if (!__osPiDevMgr.active) { +#ifdef _DEBUG + __osError(ERR_OSPISTARTDMA_PIMGR, 0); +#endif + return -1; + } + +#ifdef _DEBUG + if ((priority != OS_MESG_PRI_NORMAL) && (priority != OS_MESG_PRI_HIGH)) { + __osError(ERR_OSPISTARTDMA_PRI, 1, priority); + return -1; + } + + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPISTARTDMA_DIR, 1, direction); + return -1; + } + + if (devAddr & 0x1) { + __osError(ERR_OSPISTARTDMA_DEVADDR, 1, devAddr); + return -1; + } + + if ((u32)dramAddr & 0x7) { + __osError(ERR_OSPISTARTDMA_ADDR, 1, dramAddr); + return -1; + } + + if (size & 0x1) { + __osError(ERR_OSPISTARTDMA_SIZE, 1, size); + return -1; + } + + if ((size == 0) || (size > (16 * 1024 * 1024))) { + __osError(ERR_OSPISTARTDMA_RANGE, 1, size); + return -1; + } +#endif + + if (direction == OS_READ) { + mb->hdr.type = OS_MESG_TYPE_DMAREAD; + } else { + mb->hdr.type = OS_MESG_TYPE_DMAWRITE; + } + + mb->hdr.pri = priority; + mb->hdr.retQueue = mq; + mb->dramAddr = dramAddr; + mb->devAddr = devAddr; + mb->size = size; + mb->piHandle = NULL; + + if (priority == OS_MESG_PRI_HIGH) { + ret = osJamMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } else { + ret = osSendMesg(osPiGetCmdQueue(), (OSMesg)mb, OS_MESG_NOBLOCK); + } + + return ret; +} diff --git a/lib/hackerlibultra/src/io/pigetcmdq.c b/lib/hackerlibultra/src/io/pigetcmdq.c new file mode 100644 index 00000000..a4919d55 --- /dev/null +++ b/lib/hackerlibultra/src/io/pigetcmdq.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "PRinternal/piint.h" + +OSMesgQueue* osPiGetCmdQueue(void) { + if (!__osPiDevMgr.active) { + return NULL; + } else { + return __osPiDevMgr.cmdQueue; + } +} diff --git a/lib/hackerlibultra/src/io/pigetstat.c b/lib/hackerlibultra/src/io/pigetstat.c new file mode 100644 index 00000000..a5ba497c --- /dev/null +++ b/lib/hackerlibultra/src/io/pigetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PRinternal/piint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 osPiGetStatus(void) { + return IO_READ(PI_STATUS_REG); +} diff --git a/lib/hackerlibultra/src/io/pigettype.c b/lib/hackerlibultra/src/io/pigettype.c new file mode 100644 index 00000000..67fdc72a --- /dev/null +++ b/lib/hackerlibultra/src/io/pigettype.c @@ -0,0 +1,8 @@ +#include "PR/os_internal.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osPiGetDeviceType(void) { + return osRomType; +} diff --git a/lib/hackerlibultra/src/io/pimgr.c b/lib/hackerlibultra/src/io/pimgr.c new file mode 100644 index 00000000..e2c2bad4 --- /dev/null +++ b/lib/hackerlibultra/src/io/pimgr.c @@ -0,0 +1,114 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/piint.h" +#include "PR/rdb.h" + +static OSThread piThread ALIGNED(0x8); +static STACK(piThreadStack, OS_PIM_STACKSIZE) ALIGNED(0x10); + +#ifndef _FINALROM +static OSThread ramromThread ALIGNED(0x8); +static STACK(ramromThreadStack, 0x400) ALIGNED(0x10); +static OSMesgQueue getRamromQ ALIGNED(0x8); +static OSMesg getRamromBuf[1]; +static OSMesgQueue freeRamromQ ALIGNED(0x8); +static OSMesg freeRamromBuf[1]; +static void ramromMain(void*); +#endif + +static OSMesgQueue piEventQueue ALIGNED(0x8); +static OSMesg piEventBuf[1]; + +OSDevMgr __osPiDevMgr = { 0 }; +OSPiHandle* __osPiTable = NULL; +#if BUILD_VERSION >= VERSION_J +OSPiHandle __Dom1SpeedParam ALIGNED(0x8); +OSPiHandle __Dom2SpeedParam ALIGNED(0x8); +OSPiHandle* __osCurrentHandle[2] ALIGNED(0x8) = { &__Dom1SpeedParam, &__Dom2SpeedParam }; +#else +extern OSPiHandle CartRomHandle; +extern OSPiHandle LeoDiskHandle; +OSPiHandle* __osCurrentHandle[2] ALIGNED(0x8) = { &CartRomHandle, &LeoDiskHandle }; +#endif + +void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgCnt) { + u32 savedMask; + OSPri oldPri; + OSPri myPri; + +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATEPIMANAGER, 1, pri); + return; + } +#endif + + if (__osPiDevMgr.active) { + return; + } + osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt); + osCreateMesgQueue(&piEventQueue, (OSMesg*)piEventBuf, 1); + + if (!__osPiAccessQueueEnabled) { + __osPiCreateAccessQueue(); + } + + osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222); + oldPri = -1; + myPri = osGetThreadPri(NULL); + + if (myPri < pri) { + oldPri = myPri; + osSetThreadPri(NULL, pri); + } + + savedMask = __osDisableInt(); + __osPiDevMgr.active = 1; + __osPiDevMgr.thread = &piThread; + __osPiDevMgr.cmdQueue = cmdQ; + __osPiDevMgr.evtQueue = &piEventQueue; + __osPiDevMgr.acsQueue = &__osPiAccessQueue; + __osPiDevMgr.dma = __osPiRawStartDma; + __osPiDevMgr.edma = __osEPiRawStartDma; + osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, STACK_START(piThreadStack), pri); + osStartThread(&piThread); + +#ifndef _FINALROM + osCreateThread(&ramromThread, 0, ramromMain, NULL, STACK_START(ramromThreadStack), (OSPri)pri - 1); + osStartThread(&ramromThread); +#endif + __osRestoreInt(savedMask); + + if (oldPri != -1) { + osSetThreadPri(NULL, oldPri); + } +} + +#ifndef _FINALROM +static void ramromMain(void* arg) { + u32 sent; + u8 tmp[3]; + + osCreateMesgQueue(&getRamromQ, getRamromBuf, 1); + osCreateMesgQueue(&freeRamromQ, freeRamromBuf, 1); + osSetEventMesg(OS_EVENT_RDB_REQ_RAMROM, &getRamromQ, NULL); + osSetEventMesg(OS_EVENT_RDB_FREE_RAMROM, &freeRamromQ, NULL); + + while (TRUE) { + osRecvMesg(&getRamromQ, NULL, OS_MESG_BLOCK); + + __osPiGetAccess(); + + sent = 0; + + while (sent < 1) { + sent += __osRdbSend(tmp, 1, RDB_TYPE_GtoH_RAMROM); + } + + osRecvMesg(&freeRamromQ, NULL, OS_MESG_BLOCK); + + __osPiRelAccess(); + } +} +#endif diff --git a/lib/hackerlibultra/src/io/pirawdma.c b/lib/hackerlibultra/src/io/pirawdma.c new file mode 100644 index 00000000..db77829b --- /dev/null +++ b/lib/hackerlibultra/src/io/pirawdma.c @@ -0,0 +1,53 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osPiRawStartDma(s32 direction, u32 devAddr, void* dramAddr, u32 size) { + register u32 stat; + +#ifdef _DEBUG + if ((direction != OS_READ) && (direction != OS_WRITE)) { + __osError(ERR_OSPIRAWSTARTDMA_DIR, 1, direction); + return -1; + } + + if (devAddr & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_DEVADDR, 1, devAddr); + return -1; + } + + if ((u32)dramAddr & 0x7) { + __osError(ERR_OSPIRAWSTARTDMA_ADDR, 1, dramAddr); + return -1; + } + + if (size & 0x1) { + __osError(ERR_OSPIRAWSTARTDMA_SIZE, 1, size); + return -1; + } + + if ((size == 0) || (size > (16 * 1024 * 1024))) { + __osError(ERR_OSPIRAWSTARTDMA_RANGE, 1, size); + return -1; + } +#endif + + WAIT_ON_IOBUSY(stat); + + IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS((u32)osRomBase | devAddr)); + + switch (direction) { + case OS_READ: + IO_WRITE(PI_WR_LEN_REG, size - 1); + break; + case OS_WRITE: + IO_WRITE(PI_RD_LEN_REG, size - 1); + break; + default: + return -1; + } + return 0; +} diff --git a/lib/hackerlibultra/src/io/pirawread.c b/lib/hackerlibultra/src/io/pirawread.c new file mode 100644 index 00000000..7db0af22 --- /dev/null +++ b/lib/hackerlibultra/src/io/pirawread.c @@ -0,0 +1,29 @@ +#include "PRinternal/piint.h" +#include "assert.h" +#include "PR/ultraerror.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 46 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osPiRawReadIo(u32 devAddr, u32* data) { + register u32 stat; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWREADIO, 1, devAddr); + return -1; + } +#endif + + assert(data != NULL); + + WAIT_ON_IOBUSY(stat); + *data = IO_READ((u32)osRomBase | devAddr); + + return 0; +} diff --git a/lib/hackerlibultra/src/io/pirawwrite.c b/lib/hackerlibultra/src/io/pirawwrite.c new file mode 100644 index 00000000..190f6824 --- /dev/null +++ b/lib/hackerlibultra/src/io/pirawwrite.c @@ -0,0 +1,21 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osPiRawWriteIo(u32 devAddr, u32 data) { + register u32 stat; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIRAWWRITEIO, 1, devAddr); + return -1; + } +#endif + + WAIT_ON_IOBUSY(stat); + IO_WRITE((u32)osRomBase | devAddr, data); + + return 0; +} diff --git a/lib/hackerlibultra/src/io/piread.c b/lib/hackerlibultra/src/io/piread.c new file mode 100644 index 00000000..75503076 --- /dev/null +++ b/lib/hackerlibultra/src/io/piread.c @@ -0,0 +1,19 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +s32 osPiReadIo(u32 devAddr, u32* data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIREADIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osPiRawReadIo(devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/io/piwrite.c b/lib/hackerlibultra/src/io/piwrite.c new file mode 100644 index 00000000..7fe514f0 --- /dev/null +++ b/lib/hackerlibultra/src/io/piwrite.c @@ -0,0 +1,19 @@ +#include "PRinternal/piint.h" +#include "PR/ultraerror.h" + +s32 osPiWriteIo(u32 devAddr, u32 data) { + register s32 ret; + +#ifdef _DEBUG + if (devAddr & 0x3) { + __osError(ERR_OSPIWRITEIO, 1, devAddr); + return -1; + } +#endif + + __osPiGetAccess(); + ret = __osPiRawWriteIo(devAddr, data); + __osPiRelAccess(); + + return ret; +} diff --git a/lib/ultra/io/si.c b/lib/hackerlibultra/src/io/si.c similarity index 51% rename from lib/ultra/io/si.c rename to lib/hackerlibultra/src/io/si.c index 19edfafa..78794f56 100644 --- a/lib/ultra/io/si.c +++ b/lib/hackerlibultra/src/io/si.c @@ -1,12 +1,15 @@ #include "PR/os_internal.h" -#include "PR/rcp.h" +#include "PRinternal/siint.h" -s32 __osSiDeviceBusy() { +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osSiDeviceBusy(void) { register u32 stat = IO_READ(SI_STATUS_REG); if (stat & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) { return TRUE; + } else { + return FALSE; } - - return FALSE; } diff --git a/lib/ultra/io/siacs.c b/lib/hackerlibultra/src/io/siacs.c similarity index 53% rename from lib/ultra/io/siacs.c rename to lib/hackerlibultra/src/io/siacs.c index 2d401a97..7ff12f10 100644 --- a/lib/ultra/io/siacs.c +++ b/lib/hackerlibultra/src/io/siacs.c @@ -1,13 +1,14 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" -#include "macros.h" -FORCE_BSS OSMesg osSiMesgBuff[1]; -ALIGNED8 OSMesgQueue __osSiAccessQueue; -u32 __osSiAccessQueueEnabled = FALSE; +#define SI_Q_BUF_LEN 1 +static OSMesg siAccessBuf[SI_Q_BUF_LEN] ALIGNED(0x8); +OSMesgQueue __osSiAccessQueue ALIGNED(0x8); +u32 __osSiAccessQueueEnabled = 0; -void __osSiCreateAccessQueue() { - __osSiAccessQueueEnabled = TRUE; - osCreateMesgQueue(&__osSiAccessQueue, &osSiMesgBuff[0], 1); +void __osSiCreateAccessQueue(void) { + __osSiAccessQueueEnabled = 1; + osCreateMesgQueue(&__osSiAccessQueue, siAccessBuf, SI_Q_BUF_LEN); osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); } diff --git a/lib/hackerlibultra/src/io/sigetstat.c b/lib/hackerlibultra/src/io/sigetstat.c new file mode 100644 index 00000000..e21e50ae --- /dev/null +++ b/lib/hackerlibultra/src/io/sigetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PRinternal/siint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 __osSiGetStatus(void) { + return IO_READ(SI_STATUS_REG); +} diff --git a/lib/ultra/io/sirawdma.c b/lib/hackerlibultra/src/io/sirawdma.c similarity index 68% rename from lib/ultra/io/sirawdma.c rename to lib/hackerlibultra/src/io/sirawdma.c index 112a08e1..143aa7c3 100644 --- a/lib/ultra/io/sirawdma.c +++ b/lib/hackerlibultra/src/io/sirawdma.c @@ -1,13 +1,21 @@ #include "PR/os_internal.h" -#include "PR/rcp.h" -#ifdef BBPLAYER -#include "PR/bcp.h" +#include "assert.h" +#include "PRinternal/siint.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 47 #endif #define PIF_RAM_SIZE (PIF_RAM_END + 1 - PIF_RAM_START) -s32 __osSiRawStartDma(s32 direction, void *dramAddr) { -#if LIBULTRA_VERSION >= OS_VER_J +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSiRawStartDma(s32 direction, void* dramAddr) { + assert(((u32)dramAddr & 0x3) == 0); + +#if BUILD_VERSION >= VERSION_J if (IO_READ(SI_STATUS_REG) & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) { return -1; } @@ -24,15 +32,6 @@ s32 __osSiRawStartDma(s32 direction, void *dramAddr) { IO_WRITE(SI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); if (direction == OS_READ) { -#ifdef BBPLAYER - if (__osBbIsBb) { - register u32 mask = __osDisableInt(); - - skKeepAlive(); - - __osRestoreInt(mask); - } -#endif IO_WRITE(SI_PIF_ADDR_RD64B_REG, PIF_RAM_START); } else { IO_WRITE(SI_PIF_ADDR_WR64B_REG, PIF_RAM_START); @@ -41,5 +40,6 @@ s32 __osSiRawStartDma(s32 direction, void *dramAddr) { if (direction == OS_READ) { osInvalDCache(dramAddr, PIF_RAM_SIZE); } + return 0; } diff --git a/lib/hackerlibultra/src/io/sirawread.c b/lib/hackerlibultra/src/io/sirawread.c new file mode 100644 index 00000000..00bf043a --- /dev/null +++ b/lib/hackerlibultra/src/io/sirawread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "assert.h" +#include "PRinternal/siint.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 45 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSiRawReadIo(u32 devAddr, u32* data) { + assert((devAddr & 0x3) == 0); + assert(data != NULL); + + if (__osSiDeviceBusy()) { + return -1; + } + + *data = IO_READ(devAddr); + return 0; +} diff --git a/lib/hackerlibultra/src/io/sirawwrite.c b/lib/hackerlibultra/src/io/sirawwrite.c new file mode 100644 index 00000000..54cd2e92 --- /dev/null +++ b/lib/hackerlibultra/src/io/sirawwrite.c @@ -0,0 +1,22 @@ +#include "PR/os_internal.h" +#include "PRinternal/siint.h" +#include "assert.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 46 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSiRawWriteIo(u32 devAddr, u32 data) { + assert((devAddr & 0x3) == 0); + + if (__osSiDeviceBusy()) { + return -1; + } + + IO_WRITE(devAddr, data); + return 0; +} diff --git a/lib/ultra/io/sp.c b/lib/hackerlibultra/src/io/sp.c similarity index 59% rename from lib/ultra/io/sp.c rename to lib/hackerlibultra/src/io/sp.c index 73f81a80..98e7c406 100644 --- a/lib/ultra/io/sp.c +++ b/lib/hackerlibultra/src/io/sp.c @@ -1,14 +1,17 @@ #include "PR/os_internal.h" #include "PR/rcp.h" #include "PR/sptask.h" -#include "../os/osint.h" +#include "PRinternal/osint.h" -s32 __osSpDeviceBusy() { +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osSpDeviceBusy(void) { register u32 stat = IO_READ(SP_STATUS_REG); if (stat & (SP_STATUS_DMA_BUSY | SP_STATUS_DMA_FULL | SP_STATUS_IO_FULL)) { return TRUE; + } else { + return FALSE; } - - return FALSE; } diff --git a/lib/hackerlibultra/src/io/spgetstat.c b/lib/hackerlibultra/src/io/spgetstat.c new file mode 100644 index 00000000..8125b642 --- /dev/null +++ b/lib/hackerlibultra/src/io/spgetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 __osSpGetStatus(void) { + return IO_READ(SP_STATUS_REG); +} diff --git a/lib/hackerlibultra/src/io/sprawdma.c b/lib/hackerlibultra/src/io/sprawdma.c new file mode 100644 index 00000000..380b0b22 --- /dev/null +++ b/lib/hackerlibultra/src/io/sprawdma.c @@ -0,0 +1,33 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" +#include "assert.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 52 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSpRawStartDma(s32 direction, u32 devAddr, void* dramAddr, u32 size) { + assert(((u32)devAddr & 0x7) == 0); + assert(((u32)dramAddr & 0x7) == 0); + assert(((u32)size & 0x7) == 0); + + if (__osSpDeviceBusy()) { + return -1; + } + + IO_WRITE(SP_MEM_ADDR_REG, devAddr); + IO_WRITE(SP_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + + if (direction == OS_READ) { + IO_WRITE(SP_WR_LEN_REG, size - 1); + } else { + IO_WRITE(SP_RD_LEN_REG, size - 1); + } + + return 0; +} diff --git a/lib/hackerlibultra/src/io/sprawread.c b/lib/hackerlibultra/src/io/sprawread.c new file mode 100644 index 00000000..0f5dc82a --- /dev/null +++ b/lib/hackerlibultra/src/io/sprawread.c @@ -0,0 +1,24 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" +#include "assert.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 45 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSpRawReadIo(u32 devAddr, u32* data) { + assert((devAddr & 0x3) == 0); + assert(data != NULL); + + if (__osSpDeviceBusy()) { + return -1; + } + + *data = IO_READ(devAddr); + return 0; +} diff --git a/lib/hackerlibultra/src/io/sprawwrite.c b/lib/hackerlibultra/src/io/sprawwrite.c new file mode 100644 index 00000000..e55ad811 --- /dev/null +++ b/lib/hackerlibultra/src/io/sprawwrite.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" +#include "assert.h" + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 45 +#endif + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 __osSpRawWriteIo(u32 devAddr, u32 data) { + assert((devAddr & 0x3) == 0); + + if (__osSpDeviceBusy()) { + return -1; + } + + IO_WRITE(devAddr, data); + return 0; +} diff --git a/lib/ultra/io/spsetpc.c b/lib/hackerlibultra/src/io/spsetpc.c similarity index 76% rename from lib/ultra/io/spsetpc.c rename to lib/hackerlibultra/src/io/spsetpc.c index 7d23cd3d..dce0b5d2 100644 --- a/lib/ultra/io/spsetpc.c +++ b/lib/hackerlibultra/src/io/spsetpc.c @@ -1,6 +1,8 @@ -#include "PR/os_internal.h" #include "PR/rcp.h" +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + s32 __osSpSetPc(u32 pc) { register u32 status = IO_READ(SP_STATUS_REG); diff --git a/lib/ultra/io/spsetstat.c b/lib/hackerlibultra/src/io/spsetstat.c similarity index 65% rename from lib/ultra/io/spsetstat.c rename to lib/hackerlibultra/src/io/spsetstat.c index 8c8ecff8..2ab47e08 100644 --- a/lib/ultra/io/spsetstat.c +++ b/lib/hackerlibultra/src/io/spsetstat.c @@ -1,6 +1,9 @@ #include "PR/os_internal.h" #include "PR/rcp.h" +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + void __osSpSetStatus(u32 data) { IO_WRITE(SP_STATUS_REG, data); } diff --git a/lib/hackerlibultra/src/io/sptask.c b/lib/hackerlibultra/src/io/sptask.c new file mode 100644 index 00000000..710126aa --- /dev/null +++ b/lib/hackerlibultra/src/io/sptask.c @@ -0,0 +1,88 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/sptask.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 1.4 $" +#endif + +#define _osVirtualToPhysical(ptr) \ + if (ptr != NULL) { \ + ptr = (void*)osVirtualToPhysical(ptr); \ + } \ + (void)0 + +static OSTask tmp_task; + +static OSTask* _VirtualToPhysicalTask(OSTask* intp) { + OSTask* tp; + tp = &tmp_task; + bcopy(intp, tp, sizeof(OSTask)); + + _osVirtualToPhysical(tp->t.ucode); + _osVirtualToPhysical(tp->t.ucode_data); + _osVirtualToPhysical(tp->t.dram_stack); + _osVirtualToPhysical(tp->t.output_buff); + _osVirtualToPhysical(tp->t.output_buff_size); + _osVirtualToPhysical(tp->t.data_ptr); + _osVirtualToPhysical(tp->t.yield_data_ptr); + return tp; +} + +void osSpTaskLoad(OSTask* intp) { + OSTask* tp; + +#ifdef _DEBUG + if ((intp->t.dram_stack != 0x0) && ((u32)intp->t.dram_stack & 0xf)) { + __osError(ERR_OSSPTASKLOAD_DRAM, 1, intp->t.dram_stack); + return; + } + if ((intp->t.output_buff != 0x0) && ((u32)intp->t.output_buff & 0xf)) { + __osError(ERR_OSSPTASKLOAD_OUT, 1, intp->t.output_buff); + return; + } + if ((intp->t.output_buff_size != 0x0) && ((u32)intp->t.output_buff_size & 0xf)) { + __osError(ERR_OSSPTASKLOAD_OUTSIZE, 1, intp->t.output_buff_size); + return; + } + if ((intp->t.yield_data_ptr != 0x0) && ((u32)intp->t.yield_data_ptr & 0xf)) { + __osError(ERR_OSSPTASKLOAD_YIELD, 1, intp->t.yield_data_ptr); + return; + } +#endif + + tp = _VirtualToPhysicalTask(intp); + + if (tp->t.flags & OS_TASK_YIELDED) { + tp->t.ucode_data = tp->t.yield_data_ptr; + tp->t.ucode_data_size = tp->t.yield_data_size; + intp->t.flags &= ~OS_TASK_YIELDED; + if (tp->t.flags & OS_TASK_LOADABLE) { + tp->t.ucode = (u64*)IO_READ((u32)intp->t.yield_data_ptr + OS_YIELD_DATA_SIZE - 4); + } + } + + osWritebackDCache(tp, sizeof(OSTask)); + __osSpSetStatus(SP_CLR_YIELD | SP_CLR_YIELDED | SP_CLR_TASKDONE | SP_SET_INTR_BREAK); + + while (__osSpSetPc(SP_IMEM_START) == -1) { + } + + while (__osSpRawStartDma(1, (SP_IMEM_START - sizeof(*tp)), tp, sizeof(OSTask)) == -1) { + } + + while (__osSpDeviceBusy()) { + } + + while (__osSpRawStartDma(1, SP_IMEM_START, tp->t.ucode_boot, tp->t.ucode_boot_size) == -1) { + } +} + +void osSpTaskStartGo(OSTask* tp) { + while (__osSpDeviceBusy()) { + } + + __osSpSetStatus(SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT); +} diff --git a/lib/ultra/io/sptaskyield.c b/lib/hackerlibultra/src/io/sptaskyield.c similarity index 100% rename from lib/ultra/io/sptaskyield.c rename to lib/hackerlibultra/src/io/sptaskyield.c diff --git a/lib/ultra/io/sptaskyielded.c b/lib/hackerlibultra/src/io/sptaskyielded.c similarity index 78% rename from lib/ultra/io/sptaskyielded.c rename to lib/hackerlibultra/src/io/sptaskyielded.c index 38107059..3ecab556 100644 --- a/lib/ultra/io/sptaskyielded.c +++ b/lib/hackerlibultra/src/io/sptaskyielded.c @@ -2,9 +2,9 @@ #include "PR/sptask.h" #include "PR/rcp.h" -OSYieldResult osSpTaskYielded(OSTask *tp) { - s32 status; - u32 result; +OSYieldResult osSpTaskYielded(OSTask* tp) { + u32 status; + OSYieldResult result; status = __osSpGetStatus(); result = (status & SP_STATUS_YIELDED) ? OS_TASK_YIELDED : 0; diff --git a/lib/hackerlibultra/src/io/vi.c b/lib/hackerlibultra/src/io/vi.c new file mode 100644 index 00000000..7023b703 --- /dev/null +++ b/lib/hackerlibultra/src/io/vi.c @@ -0,0 +1,39 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +static __OSViContext vi[2] ALIGNED(0x8) = { 0 }; +__OSViContext* __osViCurr = &vi[0]; +__OSViContext* __osViNext = &vi[1]; + +void __osViInit(void) { + bzero(vi, sizeof(vi)); + __osViCurr = &vi[0]; + __osViNext = &vi[1]; + __osViNext->retraceCount = 1; + __osViCurr->retraceCount = 1; + __osViNext->framep = (void*)K0BASE; + __osViCurr->framep = (void*)K0BASE; + + if (osTvType == OS_TV_TYPE_PAL) { + __osViNext->modep = &osViModePalLan1; + } else if (osTvType == OS_TV_TYPE_MPAL) { + __osViNext->modep = &osViModeMpalLan1; + } else { + __osViNext->modep = &osViModeNtscLan1; + } + + __osViNext->state = VI_STATE_BLACK; + __osViNext->control = __osViNext->modep->comRegs.ctrl; + + while (IO_READ(VI_CURRENT_REG) > 10) { // wait for vsync? + } + + IO_WRITE(VI_CONTROL_REG, 0); // pixel size blank (no data, no sync) + __osViSwapContext(); +} diff --git a/lib/ultra/io/viblack.c b/lib/hackerlibultra/src/io/viblack.c similarity index 74% rename from lib/ultra/io/viblack.c rename to lib/hackerlibultra/src/io/viblack.c index 98efbb6f..f5fbf24f 100644 --- a/lib/ultra/io/viblack.c +++ b/lib/hackerlibultra/src/io/viblack.c @@ -1,4 +1,8 @@ #include "PR/os_internal.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" void osViBlack(u8 active) { register u32 saveMask = __osDisableInt(); diff --git a/lib/hackerlibultra/src/io/viextendvstart.c b/lib/hackerlibultra/src/io/viextendvstart.c new file mode 100644 index 00000000..16248485 --- /dev/null +++ b/lib/hackerlibultra/src/io/viextendvstart.c @@ -0,0 +1,19 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/viint.h" + +void osViExtendVStart(u32 value) { +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(134, 0); + return; + } + + if (value > 48) { + __osError(135, 1, value); + return; + } +#endif + __additional_scanline = value; + return; +} diff --git a/lib/hackerlibultra/src/io/vifade.c b/lib/hackerlibultra/src/io/vifade.c new file mode 100644 index 00000000..22be390d --- /dev/null +++ b/lib/hackerlibultra/src/io/vifade.c @@ -0,0 +1,18 @@ +#include "PR/os_internal.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViFade(u8 active, u16 factor) { + register u32 saveMask = __osDisableInt(); + + if (active) { + __osViNext->y.offset = factor & VI_2_10_FPART_MASK; + __osViNext->state |= VI_STATE_FADE; + } else { + __osViNext->state &= ~VI_STATE_FADE; + } + + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/vigetcurrcontext.c b/lib/hackerlibultra/src/io/vigetcurrcontext.c new file mode 100644 index 00000000..f33dc966 --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetcurrcontext.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +__OSViContext* __osViGetCurrentContext(void) { + return __osViCurr; +} diff --git a/lib/hackerlibultra/src/io/vigetcurrframebuf.c b/lib/hackerlibultra/src/io/vigetcurrframebuf.c new file mode 100644 index 00000000..6c21e408 --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetcurrframebuf.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/viint.h" + +void* osViGetCurrentFramebuffer(void) { + register u32 saveMask; + void* framep; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVIGETCURRENTFRAMEBUFFER, 0); + return NULL; + } +#endif + + saveMask = __osDisableInt(); + framep = __osViCurr->framep; + __osRestoreInt(saveMask); + return framep; +} diff --git a/lib/hackerlibultra/src/io/vigetfield.c b/lib/hackerlibultra/src/io/vigetfield.c new file mode 100644 index 00000000..9dcb7fc3 --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetfield.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +u32 osViGetCurrentField(void) { + return IO_READ(VI_CURRENT_REG) & 1; +} diff --git a/lib/hackerlibultra/src/io/vigetline.c b/lib/hackerlibultra/src/io/vigetline.c new file mode 100644 index 00000000..5667d61f --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetline.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +u32 osViGetCurrentLine(void) { + return IO_READ(VI_CURRENT_REG); +} diff --git a/lib/hackerlibultra/src/io/vigetmode.c b/lib/hackerlibultra/src/io/vigetmode.c new file mode 100644 index 00000000..3bb492bc --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetmode.c @@ -0,0 +1,21 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/viint.h" + +u32 osViGetCurrentMode(void) { + register u32 saveMask; + register u32 modeType; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVIGETCURRENTMODE, 0); + return -1; + } +#endif + + saveMask = __osDisableInt(); + modeType = (u32)__osViCurr->modep->type; + + __osRestoreInt(saveMask); + return modeType; +} diff --git a/lib/hackerlibultra/src/io/vigetnextcontext.c b/lib/hackerlibultra/src/io/vigetnextcontext.c new file mode 100644 index 00000000..5f1c2e2e --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetnextcontext.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PRinternal/viint.h" + +__OSViContext* __osViGetNextContext(void) { + return __osViNext; +} diff --git a/lib/hackerlibultra/src/io/vigetnextframebuf.c b/lib/hackerlibultra/src/io/vigetnextframebuf.c new file mode 100644 index 00000000..8d14809d --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetnextframebuf.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/viint.h" + +void* osViGetNextFramebuffer(void) { + register u32 saveMask; + void* framep; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVIGETNEXTFRAMEBUFFER, 0); + return NULL; + } +#endif + + saveMask = __osDisableInt(); + framep = __osViNext->framep; + __osRestoreInt(saveMask); + return framep; +} diff --git a/lib/hackerlibultra/src/io/vigetstat.c b/lib/hackerlibultra/src/io/vigetstat.c new file mode 100644 index 00000000..8fc6f38a --- /dev/null +++ b/lib/hackerlibultra/src/io/vigetstat.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +u32 osViGetStatus(void) { + return IO_READ(VI_STATUS_REG); +} diff --git a/lib/hackerlibultra/src/io/vimgr.c b/lib/hackerlibultra/src/io/vimgr.c new file mode 100644 index 00000000..3b434b85 --- /dev/null +++ b/lib/hackerlibultra/src/io/vimgr.c @@ -0,0 +1,126 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" +#include "PRinternal/osint.h" + +OSDevMgr __osViDevMgr = { 0 }; +#if BUILD_VERSION >= VERSION_J +u32 __additional_scanline = 0; +#endif +static OSThread viThread; +static STACK(viThreadStack, OS_VIM_STACKSIZE) ALIGNED(0x10); +static OSMesgQueue viEventQueue ALIGNED(0x8); +static OSMesg viEventBuf[5] ALIGNED(0x8); +static OSIoMesg viRetraceMsg ALIGNED(0x8); +static OSIoMesg viCounterMsg ALIGNED(0x8); + +static void viMgrMain(void* arg); +void osCreateViManager(OSPri pri) { + u32 savedMask; + OSPri oldPri; + OSPri myPri; + +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATEVIMANAGER, 1, pri); + return; + } +#endif + + if (__osViDevMgr.active) { + return; + } + __osTimerServicesInit(); +#if BUILD_VERSION >= VERSION_J + __additional_scanline = 0; +#endif + osCreateMesgQueue(&viEventQueue, viEventBuf, ARRLEN(viEventBuf)); + viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE; + viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL; + viRetraceMsg.hdr.retQueue = NULL; + viCounterMsg.hdr.type = OS_MESG_TYPE_COUNTER; + viCounterMsg.hdr.pri = OS_MESG_PRI_NORMAL; + viCounterMsg.hdr.retQueue = NULL; + osSetEventMesg(OS_EVENT_VI, &viEventQueue, &viRetraceMsg); + osSetEventMesg(OS_EVENT_COUNTER, &viEventQueue, &viCounterMsg); + oldPri = -1; + myPri = osGetThreadPri(NULL); + + if (myPri < pri) { + oldPri = myPri; + osSetThreadPri(NULL, pri); + } + + savedMask = __osDisableInt(); + __osViDevMgr.active = TRUE; + __osViDevMgr.thread = &viThread; + __osViDevMgr.cmdQueue = &viEventQueue; + __osViDevMgr.evtQueue = &viEventQueue; + __osViDevMgr.acsQueue = NULL; + __osViDevMgr.dma = NULL; + __osViDevMgr.edma = NULL; + osCreateThread(&viThread, 0, viMgrMain, &__osViDevMgr, STACK_START(viThreadStack), pri); + __osViInit(); + osStartThread(&viThread); + __osRestoreInt(savedMask); + + if (oldPri != -1) { + osSetThreadPri(NULL, oldPri); + } +} + +static void viMgrMain(void* arg) { + __OSViContext* vc; + OSDevMgr* dm; + OSIoMesg* mb; + static u16 retrace; + s32 first; + u32 count; + + mb = NULL; + first = 0; + vc = __osViGetCurrentContext(); + retrace = vc->retraceCount; + if (retrace == 0) { + retrace = 1; + } + dm = (OSDevMgr*)arg; + + while (TRUE) { + osRecvMesg(dm->evtQueue, (OSMesg)&mb, OS_MESG_BLOCK); + switch (mb->hdr.type) { + case OS_MESG_TYPE_VRETRACE: + __osViSwapContext(); + retrace--; + + if (retrace == 0) { + vc = __osViGetCurrentContext(); + if (vc->msgq != NULL) { + osSendMesg(vc->msgq, vc->msg, OS_MESG_NOBLOCK); + } + retrace = vc->retraceCount; + } + + __osViIntrCount++; + + if (first) { + count = osGetCount(); + __osCurrentTime = count; + first = 0; + } + + count = __osBaseCounter; + __osBaseCounter = osGetCount(); + count = __osBaseCounter - count; + __osCurrentTime = __osCurrentTime + count; + break; + case OS_MESG_TYPE_COUNTER: + __osTimerInterrupt(); + break; + default: + break; + } + } +} diff --git a/lib/hackerlibultra/src/io/virepeatline.c b/lib/hackerlibultra/src/io/virepeatline.c new file mode 100644 index 00000000..bc967733 --- /dev/null +++ b/lib/hackerlibultra/src/io/virepeatline.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViRepeatLine(u8 active) { + register u32 saveMask = __osDisableInt(); + + if (active) { + __osViNext->state |= VI_STATE_REPEATLINE; + } else { + __osViNext->state &= ~VI_STATE_REPEATLINE; + } + + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/visetevent.c b/lib/hackerlibultra/src/io/visetevent.c new file mode 100644 index 00000000..012a5e02 --- /dev/null +++ b/lib/hackerlibultra/src/io/visetevent.c @@ -0,0 +1,27 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetEvent(OSMesgQueue* mq, OSMesg m, u32 retraceCount) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETEVENT, 0); + return; + } + + assert(mq != NULL); +#endif + + saveMask = __osDisableInt(); + + __osViNext->msgq = mq; + __osViNext->msg = m; + __osViNext->retraceCount = retraceCount; + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/visetmode.c b/lib/hackerlibultra/src/io/visetmode.c new file mode 100644 index 00000000..a6d481a1 --- /dev/null +++ b/lib/hackerlibultra/src/io/visetmode.c @@ -0,0 +1,27 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetMode(OSViMode* modep) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETMODE, 0); + return; + } + + assert(modep != NULL); +#endif + + saveMask = __osDisableInt(); + + __osViNext->modep = modep; + __osViNext->state = VI_STATE_MODE_UPDATED; + __osViNext->control = __osViNext->modep->comRegs.ctrl; + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/visetspecial.c b/lib/hackerlibultra/src/io/visetspecial.c new file mode 100644 index 00000000..c5541078 --- /dev/null +++ b/lib/hackerlibultra/src/io/visetspecial.c @@ -0,0 +1,86 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +// This value was incorrectly calculated until being fixed in 2.0J +#if BUILD_VERSION >= VERSION_J +#define OS_VI_SPECIAL_MAX \ + (OS_VI_GAMMA_ON | OS_VI_GAMMA_OFF | OS_VI_GAMMA_DITHER_ON | OS_VI_GAMMA_DITHER_OFF | OS_VI_DIVOT_ON \ + | OS_VI_DIVOT_OFF | OS_VI_DITHER_FILTER_ON | OS_VI_DITHER_FILTER_OFF) +#else +#define OS_VI_SPECIAL_MAX OS_VI_DITHER_FILTER_OFF +#endif + +/** + * Configures VI "special features" to be applied on the next context swap. + * + * "Special features" refer to the mode bits in the Video Interface control register that enable effects + * such as gamma correction, gamma dither, dither filtering, anti-aliasing filtering and divot + * filtering. Configuring the same setting ON and OFF in the same call will result in OFF taking + * precedence. + * + * Any unrecognized bits will be ignored. Note that this is very intentional as in early revisions of + * retail N64 hardware setting bit 5 in the `features` field of OSViContext may cause physical damage to + * the console once it is fed to VI_CONTROL_REG on next context swap. + * + * @param func OS_VI_*_ON / OS_VI_*_OFF bits to enable or disable a setting. + */ +void osViSetSpecialFeatures(u32 func) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETSPECIAL_VIMGR, 0); + return; + } + + if ((func < OS_VI_GAMMA_ON) || (func > OS_VI_SPECIAL_MAX)) { + __osError(ERR_OSVISETSPECIAL_VALUE, 1, func); + return; + } +#endif + + saveMask = __osDisableInt(); + + if ((func & OS_VI_GAMMA_ON) != 0) { + __osViNext->control |= VI_CTRL_GAMMA_ON; + } + + if ((func & OS_VI_GAMMA_OFF) != 0) { + __osViNext->control &= ~VI_CTRL_GAMMA_ON; + } + + if ((func & OS_VI_GAMMA_DITHER_ON) != 0) { + __osViNext->control |= VI_CTRL_GAMMA_DITHER_ON; + } + + if ((func & OS_VI_GAMMA_DITHER_OFF) != 0) { + __osViNext->control &= ~VI_CTRL_GAMMA_DITHER_ON; + } + + if ((func & OS_VI_DIVOT_ON) != 0) { + __osViNext->control |= VI_CTRL_DIVOT_ON; + } + + if ((func & OS_VI_DIVOT_OFF) != 0) { + __osViNext->control &= ~VI_CTRL_DIVOT_ON; + } + + if ((func & OS_VI_DITHER_FILTER_ON) != 0) { + __osViNext->control |= VI_CTRL_DITHER_FILTER_ON; + __osViNext->control &= ~VI_CTRL_ANTIALIAS_MASK; + } + + if ((func & OS_VI_DITHER_FILTER_OFF) != 0) { + __osViNext->control &= ~VI_CTRL_DITHER_FILTER_ON; + __osViNext->control |= __osViNext->modep->comRegs.ctrl & VI_CTRL_ANTIALIAS_MASK; + } + + __osViNext->state |= VI_STATE_CTRL_UPDATED; + + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/visetxscale.c b/lib/hackerlibultra/src/io/visetxscale.c new file mode 100644 index 00000000..1baab295 --- /dev/null +++ b/lib/hackerlibultra/src/io/visetxscale.c @@ -0,0 +1,37 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetXScale(f32 value) { + register u32 nomValue; + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETXSCALE_VIMGR, 0); + return; + } + + if ((value < 0.25f) || (value > 1.0f)) { + __osError(ERR_OSVISETXSCALE_VALUE, 1, OS_LOG_FLOAT(value)); + + if (value < 0.25f) { + value = 0.25f; + } else { + value = 1.0f; + } + } +#endif + + saveMask = __osDisableInt(); + + __osViNext->x.factor = value; + __osViNext->state |= VI_STATE_XSCALE_UPDATED; + nomValue = __osViNext->modep->comRegs.xScale & VI_SCALE_MASK; + __osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & VI_SCALE_MASK; + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/visetyscale.c b/lib/hackerlibultra/src/io/visetyscale.c new file mode 100644 index 00000000..12024789 --- /dev/null +++ b/lib/hackerlibultra/src/io/visetyscale.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSetYScale(f32 value) { + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISETYSCALE_VIMGR, 0); + return; + } + + if ((value < 0.05f) || (value > 1.0f)) { + __osError(ERR_OSVISETYSCALE_VALUE, 1, OS_LOG_FLOAT(value)); + + if (value < 0.05f) { + value = 0.05f; + } else { + value = 1.0f; + } + } +#endif + + saveMask = __osDisableInt(); + + __osViNext->y.factor = value; + __osViNext->state |= VI_STATE_YSCALE_UPDATED; + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/io/viswapbuf.c b/lib/hackerlibultra/src/io/viswapbuf.c new file mode 100644 index 00000000..e0f1c556 --- /dev/null +++ b/lib/hackerlibultra/src/io/viswapbuf.c @@ -0,0 +1,31 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "PRinternal/viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViSwapBuffer(void* frameBufPtr) { + u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSVISWAPBUFFER_VIMGR, 0); + return; + } + + assert(frameBufPtr != NULL); + + if ((u32)frameBufPtr & 0x3f) { + __osError(ERR_OSVISWAPBUFFER_ADDR, 1, frameBufPtr); + return; + } +#endif + + saveMask = __osDisableInt(); + + __osViNext->framep = frameBufPtr; + __osViNext->state |= VI_STATE_BUFFER_UPDATED; + __osRestoreInt(saveMask); +} diff --git a/lib/ultra/io/viswapcontext.c b/lib/hackerlibultra/src/io/viswapcontext.c similarity index 83% rename from lib/ultra/io/viswapcontext.c rename to lib/hackerlibultra/src/io/viswapcontext.c index 9bd3570b..a19fd401 100644 --- a/lib/ultra/io/viswapcontext.c +++ b/lib/hackerlibultra/src/io/viswapcontext.c @@ -1,12 +1,16 @@ #include "PR/os_internal.h" #include "PR/rcp.h" +#include "PRinternal/viint.h" -void __osViSwapContext() { - register OSViMode *vm; - register __OSViContext *vc; +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void __osViSwapContext(void) { + register OSViMode* vm; + register __OSViContext* vc; u32 origin; u32 hStart; -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J u32 vStart; #endif u32 nomValue; @@ -16,7 +20,7 @@ void __osViSwapContext() { vc = __osViNext; vm = vc->modep; - field = IO_READ(VI_CURRENT_REG) & 1; //field num + field = IO_READ(VI_CURRENT_REG) & 1; // field num origin = osVirtualToPhysical(vc->framep) + (vm->fldRegs[field].origin); if (vc->state & VI_STATE_XSCALE_UPDATED) { @@ -33,8 +37,8 @@ void __osViSwapContext() { vc->y.scale = vm->fldRegs[field].yScale; } -#if LIBULTRA_VERSION >= OS_VER_J - vStart = (vm->fldRegs[field].vStart - (__additional_scanline << 0x10)) + __additional_scanline; +#if BUILD_VERSION >= VERSION_J + vStart = (vm->fldRegs[field].vStart - (__additional_scanline << VI_SUBPIXEL_SH)) + __additional_scanline; #endif hStart = vm->comRegs.hStart; @@ -59,7 +63,7 @@ void __osViSwapContext() { IO_WRITE(VI_H_SYNC_REG, vm->comRegs.hSync); IO_WRITE(VI_LEAP_REG, vm->comRegs.leap); IO_WRITE(VI_H_START_REG, hStart); -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J IO_WRITE(VI_V_START_REG, vStart); #else IO_WRITE(VI_V_START_REG, vm->fldRegs[field].vStart); diff --git a/lib/hackerlibultra/src/io/vitbl.c b/lib/hackerlibultra/src/io/vitbl.c new file mode 100644 index 00000000..058df522 --- /dev/null +++ b/lib/hackerlibultra/src/io/vitbl.c @@ -0,0 +1,1744 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeTable[] = { + { OS_VI_NTSC_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_NTSC_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_PAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + //[0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_MPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } } }, +#if BUILD_VERSION >= VERSION_J + { OS_VI_FPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, + { OS_VI_FPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } } }, +#endif +}; diff --git a/lib/hackerlibultra/src/libc/bcmp.s b/lib/hackerlibultra/src/libc/bcmp.s new file mode 100644 index 00000000..def32355 --- /dev/null +++ b/lib/hackerlibultra/src/libc/bcmp.s @@ -0,0 +1,96 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +#ifdef __sgi +WEAK(bcmp, _bcmp) +#else +#define _bcmp bcmp +#endif +LEAF(_bcmp) + xor v0, a0, a1 + blt a2, 16, bytecmp + + andi v0, v0, 0x3 + negu t8, a0 + bnez v0, unalgncmp + + andi t8, t8, 0x3 + subu a2, a2, t8 + beqz t8, wordcmp + + move v0, v1 + lwl v0, 0(a0) + lwl v1, 0(a1) + addu a0, a0, t8 + addu a1, a1, t8 + bne v0, v1, cmpne + +wordcmp: + and a3, a2, ~3 + subu a2, a2, a3 + beqz a3, bytecmp + + addu a3, a3, a0 +1: + lw v0, 0(a0) + lw v1, 0(a1) + addiu a0, a0, 4 + addiu a1, a1, 4 + bne v0, v1, cmpne + bne a0, a3, 1b + + b bytecmp +unalgncmp: + negu a3, a1 + andi a3, a3, 0x3 + subu a2, a2, a3 + beqz a3, partaligncmp + + addu a3, a3, a0 + +1: + lbu v0, 0(a0) + lbu v1, 0(a1) + addiu a0, a0, 1 + addiu a1, a1, 1 + bne v0, v1, cmpne + bne a0, a3, 1b + +partaligncmp: + and a3, a2, ~3 + subu a2, a2, a3 + beqz a3, bytecmp + + addu a3, a3, a0 + +1: + lwl v0, 0(a0) + lwr v0, 3(a0) + lw v1, 0(a1) + addiu a0, a0, 4 + addiu a1, a1, 4 + bne v0, v1, cmpne + bne a0, a3, 1b + +bytecmp: + addu a3, a2, a0 + blez a2, cmpdone + +1: + lbu v0, 0(a0) + lbu v1, 0(a1) + addiu a0, a0, 1 + addiu a1, a1, 1 + bne v0, v1, cmpne + bne a0, a3, 1b + +cmpdone: + move v0, zero + jr ra +cmpne: + li v0, 1 + jr ra + +.end _bcmp diff --git a/lib/hackerlibultra/src/libc/bcopy.s b/lib/hackerlibultra/src/libc/bcopy.s new file mode 100644 index 00000000..08757413 --- /dev/null +++ b/lib/hackerlibultra/src/libc/bcopy.s @@ -0,0 +1,220 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +#ifdef __sgi +WEAK(bcopy, _bcopy) +#else +#define _bcopy bcopy +#endif +LEAF(_bcopy) + move a3, a1 + beqz a2, ret + beq a0, a1, ret + blt a1, a0, goforwards + + add v0, a0, a2 + bge a1, v0, goforwards + b gobackwards + +goforwards: + + blt a2, 16, forwards_bytecopy + + andi v0, a0, 0x3 + andi v1, a1, 0x3 + beq v0, v1, forwalignable + + +forwards_bytecopy: + beqz a2, ret + addu v1, a0, a2 +99: + lb v0, 0(a0) + addiu a0, a0, 1 + sb v0, 0(a1) + addiu a1, a1, 1 + bne a0, v1, 99b +ret: + move v0, a3 + jr ra + +forwalignable: + beqz v0, forwards + beq v0, 1, forw_copy3 + beq v0, 2, forw_copy2 + + lb v0, 0(a0) + addiu a0, a0, 1 + sb v0, 0(a1) + addiu a1, a1, 1 + addiu a2, a2, -1 + b forwards + +forw_copy2: + lh v0, 0(a0) + addiu a0, a0, 2 + sh v0, 0(a1) + addiu a1, a1, 2 + addiu a2, a2, -2 + b forwards + +forw_copy3: + lb v0, 0(a0) + lh v1, 1(a0) + addiu a0, a0, 3 + sb v0, 0(a1) + sh v1, 1(a1) + addiu a1, a1, 3 + addiu a2, a2, -3 + +forwards: +forwards_32: + blt a2, 32, forwards_16 + lw v0, 0(a0) + lw v1, 4(a0) + lw t0, 8(a0) + lw t1, 12(a0) + lw t2, 16(a0) + lw t3, 20(a0) + lw ta0, 24(a0) + lw ta1, 28(a0) + addiu a0, a0, 32 + sw v0, 0(a1) + sw v1, 4(a1) + sw t0, 8(a1) + sw t1, 12(a1) + sw t2, 16(a1) + sw t3, 20(a1) + sw ta0, 24(a1) + sw ta1, 28(a1) + addiu a1, a1, 32 + addiu a2, a2, -32 + b forwards_32 + +forwards_16: + blt a2, 16, forwards_4 + lw v0, 0(a0) + lw v1, 4(a0) + lw t0, 8(a0) + lw t1, 12(a0) + addiu a0, a0, 16 + sw v0, 0(a1) + sw v1, 4(a1) + sw t0, 8(a1) + sw t1, 12(a1) + addiu a1, a1, 16 + addiu a2, a2, -16 + b forwards_16 + +forwards_4: + blt a2, 4, forwards_bytecopy + + lw v0, 0(a0) + addiu a0, a0, 4 + sw v0, 0(a1) + addiu a1, a1, 4 + addiu a2, a2, -4 + b forwards_4 + +gobackwards: + add a0, a0, a2 + add a1, a1, a2 + blt a2, 16, backwards_bytecopy + + andi v0, a0, 0x3 + andi v1, a1, 0x3 + beq v0, v1, backalignable + +backwards_bytecopy: + beqz a2, ret + addiu a0, a0, -1 + addiu a1, a1, -1 + subu v1, a0, a2 +99: + lb v0, 0(a0) + addiu a0, a0, -1 + sb v0, 0(a1) + addiu a1, a1, -1 + bne a0, v1, 99b + + move v0, a3 + jr ra +backalignable: + beqz v0, backwards + beq v0, 3, back_copy3 + beq v0, 2, back_copy2 + lb v0, -1(a0) + addiu a0, a0, -1 + sb v0, -1(a1) + addiu a1, a1, -1 + addiu a2, a2, -1 + b backwards + +back_copy2: + lh v0, -2(a0) + addiu a0, a0, -2 + sh v0, -2(a1) + addiu a1, a1, -2 + addiu a2, a2, -2 + b backwards + +back_copy3: + lb v0, -1(a0) + lh v1, -3(a0) + addiu a0, a0, -3 + sb v0, -1(a1) + sh v1, -3(a1) + addiu a1, a1, -3 + addiu a2, a2, -3 + +backwards: +backwards_32: + blt a2, 32, backwards_16 + lw v0, -4(a0) + lw v1, -8(a0) + lw t0, -12(a0) + lw t1, -16(a0) + lw t2, -20(a0) + lw t3, -24(a0) + lw ta0, -28(a0) + lw ta1, -32(a0) + addiu a0, a0, -32 + sw v0, -4(a1) + sw v1, -8(a1) + sw t0, -12(a1) + sw t1, -16(a1) + sw t2, -20(a1) + sw t3, -24(a1) + sw ta0, -28(a1) + sw ta1, -32(a1) + addiu a1, a1, -32 + addiu a2, a2, -32 + b backwards_32 + +backwards_16: + blt a2, 16, backwards_4 + lw v0, -4(a0) + lw v1, -8(a0) + lw t0, -12(a0) + lw t1, -16(a0) + addiu a0, a0, -16 + sw v0, -4(a1) + sw v1, -8(a1) + sw t0, -12(a1) + sw t1, -16(a1) + addiu a1, a1, -16 + addiu a2, a2, -16 + b backwards_16 + +backwards_4: + blt a2, 4, backwards_bytecopy + lw v0, -4(a0) + addiu a0, a0, -4 + sw v0, -4(a1) + addiu a1, a1, -4 + addiu a2, a2, -4 + b backwards_4 + +.end _bcopy diff --git a/lib/hackerlibultra/src/libc/bzero.s b/lib/hackerlibultra/src/libc/bzero.s new file mode 100644 index 00000000..c3deec0a --- /dev/null +++ b/lib/hackerlibultra/src/libc/bzero.s @@ -0,0 +1,72 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +#ifdef __sgi +WEAK(bzero, _bzero) +WEAK(blkclr, _blkclr) +#else +#define _bzero bzero +#define _blkclr blkclr +#endif +LEAF(_bzero) +XLEAF(_blkclr) + negu v1, a0 + blt a1, 12, bytezero + + andi v1, v1, 0x3 + subu a1, a1, v1 + + beqz v1, blkzero + swl zero, 0(a0) + addu a0, a0, v1 +blkzero: + /* align backwards to 0x20 */ + and a3, a1, ~31 + subu a1, a1, a3 + /* If the result is zero, the amount to zero is less than 0x20 bytes */ + beqz a3, wordzero + + /* zero in blocks of 0x20 at a time */ + addu a3, a3, a0 +1: + sw zero, 0(a0) + sw zero, 4(a0) + sw zero, 8(a0) + sw zero, 12(a0) + addiu a0, a0, 32 + sw zero, -16(a0) + sw zero, -12(a0) + sw zero, -8(a0) + sw zero, -4(a0) + bne a0, a3, 1b + +wordzero: + /* align backwards to 0x4 */ + and a3, a1, ~3 + subu a1, a1, a3 + /* If the result is zero, the amount to zero is less than 0x4 bytes */ + beqz a3, bytezero + + /* zero one word at a time */ + addu a3, a3, a0 +1: + addiu a0, a0, 4 + sw zero, -4(a0) + bne a0, a3, 1b + +bytezero: + /* test if nothing left to zero */ + blez a1, zerodone + + /* zero one byte at a time */ + addu a1, a1, a0 +1: + addiu a0, a0, 1 + sb zero, -1(a0) + bne a0, a1, 1b +zerodone: + jr ra + +.end _bzero diff --git a/lib/ultra/libc/ldiv.c b/lib/hackerlibultra/src/libc/ldiv.c similarity index 52% rename from lib/ultra/libc/ldiv.c rename to lib/hackerlibultra/src/libc/ldiv.c index fe133bdf..92388d31 100644 --- a/lib/ultra/libc/ldiv.c +++ b/lib/hackerlibultra/src/libc/ldiv.c @@ -1,8 +1,10 @@ -#include "PR/os_version.h" +#include "os_version.h" #include "stdlib.h" -// Function swapped from 2.0I onwards -#if LIBULTRA_VERSION >= OS_VER_I +// TODO: these come from headers +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" + ldiv_t ldiv(long num, long denom) { ldiv_t ret; @@ -10,13 +12,12 @@ ldiv_t ldiv(long num, long denom) { ret.rem = num - denom * ret.quot; if (ret.quot < 0 && ret.rem > 0) { - ret.quot++; + ret.quot += 1; ret.rem -= denom; } return ret; } -#endif lldiv_t lldiv(long long num, long long denom) { lldiv_t ret; @@ -25,25 +26,9 @@ lldiv_t lldiv(long long num, long long denom) { ret.rem = num - denom * ret.quot; if (ret.quot < 0 && ret.rem > 0) { - ret.quot++; + ret.quot += 1; ret.rem -= denom; } return ret; } - -#if LIBULTRA_VERSION < OS_VER_I -ldiv_t ldiv(long num, long denom) { - ldiv_t ret; - - ret.quot = num / denom; - ret.rem = num - denom * ret.quot; - - if (ret.quot < 0 && ret.rem > 0) { - ret.quot++; - ret.rem -= denom; - } - - return ret; -} -#endif diff --git a/lib/ultra/libc/ll.c b/lib/hackerlibultra/src/libc/ll.c similarity index 94% rename from lib/ultra/libc/ll.c rename to lib/hackerlibultra/src/libc/ll.c index 94549968..512a998d 100644 --- a/lib/ultra/libc/ll.c +++ b/lib/hackerlibultra/src/libc/ll.c @@ -26,7 +26,7 @@ unsigned long long __ll_mul(unsigned long long a0, unsigned long long a1) { return a0 * a1; } -void __ull_divremi(unsigned long long *div, unsigned long long *rem, unsigned long long a2, unsigned short a3) { +void __ull_divremi(unsigned long long* div, unsigned long long* rem, unsigned long long a2, unsigned short a3) { *div = a2 / a3; *rem = a2 % a3; } diff --git a/lib/hackerlibultra/src/libc/llbit.c b/lib/hackerlibultra/src/libc/llbit.c new file mode 100644 index 00000000..3e7e03b5 --- /dev/null +++ b/lib/hackerlibultra/src/libc/llbit.c @@ -0,0 +1,51 @@ +#include "PR/ultratypes.h" + +s64 __ll_bit_extract(u64* addr, unsigned int start_bit, unsigned int length) { + unsigned int words; + unsigned int lbits; + unsigned int rbits; + u64 mask; + + words = start_bit / 64; + lbits = start_bit & (64 - 1); + rbits = 64 - (lbits + length); + + addr += words; + mask = ((u64)1 << length) - 1; + mask = mask << rbits; + return (s64)((*addr & mask) >> rbits); +} + +u64 __ull_bit_extract(u64* addr, unsigned int start_bit, unsigned int length) { + unsigned int words; + unsigned int lbits; + unsigned int rbits; + u64 mask; + + words = start_bit / 64; + lbits = start_bit & (64 - 1); + rbits = 64 - (lbits + length); + addr += words; + mask = ((u64)1 << length) - 1; + mask = mask << rbits; + return (u64)((*addr & mask) >> rbits); +} + +u64 __ll_bit_insert(u64* addr, unsigned int start_bit, unsigned int length, u64 val) { + unsigned int words; + unsigned int lbits; + unsigned int rbits; + unsigned long long llval; + unsigned long long mask; + + words = start_bit / 64; + lbits = start_bit & 0x3f; + rbits = 64 - (lbits + length); + addr += words; + mask = ((u64)1 << length) - 1; + mask <<= rbits; + llval = (val << (64 - length)) >> lbits; + *addr = (*addr & ~mask) | llval; + llval = llval >> rbits; + return llval; +} diff --git a/lib/ultra/libc/llcvt.c b/lib/hackerlibultra/src/libc/llcvt.c similarity index 73% rename from lib/ultra/libc/llcvt.c rename to lib/hackerlibultra/src/libc/llcvt.c index 2c423dd8..74d244be 100644 --- a/lib/ultra/libc/llcvt.c +++ b/lib/hackerlibultra/src/libc/llcvt.c @@ -1,31 +1,31 @@ long long __d_to_ll(double d) { - return d; + return d; } long long __f_to_ll(float f) { - return f; + return f; } unsigned long long __d_to_ull(double d) { - return d; + return d; } unsigned long long __f_to_ull(float f) { - return f; + return f; } double __ll_to_d(long long s) { - return s; + return s; } float __ll_to_f(long long s) { - return s; + return s; } double __ull_to_d(unsigned long long u) { - return u; + return u; } float __ull_to_f(unsigned long long u) { - return u; + return u; } diff --git a/lib/hackerlibultra/src/libc/sprintf.c b/lib/hackerlibultra/src/libc/sprintf.c new file mode 100644 index 00000000..a65fddeb --- /dev/null +++ b/lib/hackerlibultra/src/libc/sprintf.c @@ -0,0 +1,22 @@ +#include "xstdio.h" +#include "string.h" +#include "os.h" + +// TODO: this comes from a header +#ident "$Revision: 1.23 $" + +static void* proutSprintf(void* s, const char* buf, size_t n); + +int sprintf(char* s, const char* fmt, ...) { + int ans; + va_list ap; + va_start(ap, fmt); + ans = _Printf(proutSprintf, s, fmt, ap); + if (ans >= 0) { + s[ans] = 0; + } + return ans; +} +static void* proutSprintf(void* s, const char* buf, size_t n) { + return (char*)memcpy(s, buf, n) + n; +} diff --git a/lib/hackerlibultra/src/libc/string.c b/lib/hackerlibultra/src/libc/string.c new file mode 100644 index 00000000..0f01d1f4 --- /dev/null +++ b/lib/hackerlibultra/src/libc/string.c @@ -0,0 +1,36 @@ +#include "PR/ultratypes.h" +#include "string.h" + +// TODO: this comes from a header +#ident "$Revision: 1.23 $" + +char* strchr(const char* s, int c) { + const char ch = c; + while (*s != ch) { + if (*s == 0) { + return NULL; + } + s++; + } + return (char*)s; +} + +size_t strlen(const char* s) { + const char* sc = s; + while (*sc != 0) { + sc++; + } + return sc - s; +} + +void* memcpy(void* s1, const void* s2, size_t n) { + char* su1 = (char*)s1; + const char* su2 = (const char*)s2; + while (n > 0) { + *su1 = *su2; + su1++; + su2++; + n--; + } + return (void*)s1; +} diff --git a/lib/hackerlibultra/src/libc/syncprintf.c b/lib/hackerlibultra/src/libc/syncprintf.c new file mode 100644 index 00000000..f0d088d4 --- /dev/null +++ b/lib/hackerlibultra/src/libc/syncprintf.c @@ -0,0 +1,153 @@ +#include "stdarg.h" +#include "PR/os.h" +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "xstdio.h" +#include "PR/rcp.h" + +extern void* __printfunc; + +#if BUILD_VERSION <= VERSION_J + +#ifndef _FINALROM +extern u32 __kmc_pt_mode; + +static void* proutSyncPrintf(void* str, const char* buf, size_t n) { + u32 sent = 0; + + while (sent < n) { + sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT); + } + return 1; +} + +static volatile unsigned int* stat = (unsigned*)0xbff08004; +static volatile unsigned int* wport = (unsigned*)0xbff08000; +static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG); + +static void rmonPutchar(char c) { + while (*piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + } + + while (!(*stat & 4)) { + } + + *wport = c; +} + +static void* kmc_proutSyncPrintf(void* str, const char* buf, int n) { + int i; + char c; + char* p; + char* q; + char xbuf[128]; + static int column = 0; + + p = xbuf; + + for (i = 0; i < n; i++) { + c = *buf++; + + switch (c) { + case '\n': + *p++ = '\n'; + column = 0; + break; + case '\t': + do { + *p++ = ' '; + } while (++column % 8); + break; + default: + column++; + *p++ = c; + break; + } + + if (c == '\n' || (p - xbuf) > 100) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + p = xbuf; + } + } + if (p != xbuf) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + } + return (void*)1; +} +#endif + +void osSyncPrintf(const char* fmt, ...) { + int ans; + va_list ap; + +#ifndef _FINALROM + va_start(ap, fmt); + if (__kmc_pt_mode) { + ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap); + } else { + ans = _Printf(proutSyncPrintf, NULL, fmt, ap); + } + va_end(ap); +#endif +} + +void rmonPrintf(const char* fmt, ...) { + int ans; + va_list ap; + +#ifndef _FINALROM + va_start(ap, fmt); + if (__kmc_pt_mode) { + ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap); + } + va_end(ap); +#endif +} + +#else + +void __osSyncVPrintf(const char* fmt, va_list ap) { + + int ans; +#ifndef _FINALROM + if (__printfunc != NULL) { + ans = _Printf(__printfunc, NULL, fmt, ap); + } +#endif +} + +void osSyncPrintf(const char* fmt, ...) { + int ans; + va_list ap; + +#ifndef _FINALROM + va_start(ap, fmt); + __osSyncVPrintf(fmt, ap); + va_end(ap); +#endif +} + +void rmonPrintf(const char* fmt, ...) { + int ans; + va_list ap; + +#ifndef _FINALROM + va_start(ap, fmt); + if (__printfunc != NULL) { + ans = _Printf(__printfunc, NULL, fmt, ap); + } + va_end(ap); +#endif +} + +#endif diff --git a/lib/ultra/libc/xldtob.c b/lib/hackerlibultra/src/libc/xldtob.c similarity index 65% rename from lib/ultra/libc/xldtob.c rename to lib/hackerlibultra/src/libc/xldtob.c index 3afc36fb..c2703db8 100644 --- a/lib/ultra/libc/xldtob.c +++ b/lib/hackerlibultra/src/libc/xldtob.c @@ -1,50 +1,55 @@ -#include -#include +#include "stdlib.h" +#include "string.h" #include "xstdio.h" +// TODO: these come from headers +#ident "$Revision: 1.23 $" +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" + #define BUFF_LEN 0x20 -static s16 _Ldunscale(s16* pex, _Pft* px); -static void _Genld(_Pft* px, char_x code, u8* p, s16 nsig, s16 xexp); +static short _Ldunscale(short* pex, ldouble* px); +static void _Genld(_Pft* px, char code, unsigned char* p, short nsig, short xexp); -static const double pows[] = {10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L}; +static const ldouble pows[] = { 10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L }; // float properties -#define _D0 0 +#define _D0 0 #define _DBIAS 0x3ff #define _DLONG 1 -#define _DOFF 4 +#define _DOFF 4 #define _FBIAS 0x7e -#define _FOFF 7 -#define _FRND 1 +#define _FOFF 7 +#define _FRND 1 #define _LBIAS 0x3ffe -#define _LOFF 15 +#define _LOFF 15 // integer properties -#define _C2 1 +#define _C2 1 #define _CSIGN 1 #define _ILONG 0 #define _MBMAX 8 -#define NAN 2 -#define INF 1 +#define NAN 2 +#define INF 1 #define FINITE -1 #define _DFRAC ((1 << _DOFF) - 1) #define _DMASK (0x7fff & ~_DFRAC) -#define _DMAX ((1 << (15 - _DOFF)) - 1) -#define _DNAN (0x8000 | _DMAX << _DOFF | 1 << (_DOFF - 1)) +#define _DMAX ((1 << (15 - _DOFF)) - 1) +#define _DNAN (0x8000 | _DMAX << _DOFF | 1 << (_DOFF - 1)) #define _DSIGN 0x8000 -#define _D1 1 // big-endian order -#define _D2 2 -#define _D3 3 +#define _D1 1 // big-endian order +#define _D2 2 +#define _D3 3 -#define ALIGN(s, align) (((u32)(s) + ((align)-1)) & ~((align)-1)) +#define ALIGN(s, align) (((unsigned int)(s) + ((align) - 1)) & ~((align) - 1)) -void _Ldtob(_Pft* px, char_x code) { - char_x buff[BUFF_LEN]; - char_x *p; - f64 ldval; - s16 err; - s16 nsig; - s16 xexp; +void _Ldtob(_Pft* px, char code) { + char buff[BUFF_LEN]; + char* p; + ldouble ldval; + short err; + short nsig; + short xexp; p = buff; ldval = px->v.ld; @@ -55,7 +60,7 @@ void _Ldtob(_Pft* px, char_x code) { px->prec = 1; } - err = _Ldunscale(&xexp, px); + err = _Ldunscale(&xexp, &px->v.ld); if (err > 0) { memcpy(px->s, err == 2 ? "NaN" : "Inf", px->n1 = 3); return; @@ -63,34 +68,36 @@ void _Ldtob(_Pft* px, char_x code) { nsig = 0; xexp = 0; } else { - int i; - int n; + { + int i; + int n; - if (ldval < 0) { - ldval = -ldval; - } - - // what - if ((xexp = xexp * 30103 / 100000 - 4) < 0) { - n = ALIGN(-xexp, 4), xexp = -n; - - for (i = 0; n > 0; n >>= 1, i++) { - if (n & 1) { - ldval *= pows[i]; - } - } - } else if (xexp > 0) { - f64 factor = 1; - - xexp &= ~3; - - for (n = xexp, i = 0; n > 0; n >>= 1, i++) { - if (n & 1) { - factor *= pows[i]; - } + if (ldval < 0) { + ldval = -ldval; } - ldval /= factor; + // what + if ((xexp = xexp * 30103 / 100000 - 4) < 0) { + n = ALIGN(-xexp, 4), xexp = -n; + + for (i = 0; n > 0; n >>= 1, i++) { + if (n & 1) { + ldval *= pows[i]; + } + } + } else if (xexp > 0) { + ldouble factor = 1; + + xexp &= ~3; + + for (n = xexp, i = 0; n > 0; n >>= 1, i++) { + if (n & 1) { + factor *= pows[i]; + } + } + + ldval /= factor; + } } { int gen = px->prec + ((code == 'f') ? 10 + xexp : 6); @@ -101,14 +108,15 @@ void _Ldtob(_Pft* px, char_x code) { for (*p++ = '0'; gen > 0 && 0 < ldval; p += 8) { int j; - int lo = ldval; + long lo = ldval; if ((gen -= 8) > 0) { ldval = (ldval - lo) * 1e8; } for (p += 8, j = 8; lo > 0 && --j >= 0;) { - ldiv_t qr = ldiv(lo, 10); + ldiv_t qr; + qr = ldiv(lo, 10); *--p = qr.rem + '0', lo = qr.quot; } @@ -130,7 +138,7 @@ void _Ldtob(_Pft* px, char_x code) { } if (nsig > 0) { - char_x drop = nsig < gen && '5' <= p[nsig] ? '9' : '0'; + const char drop = nsig < gen && '5' <= p[nsig] ? '9' : '0'; int n; for (n = nsig; p[--n] == drop;) { @@ -148,13 +156,12 @@ void _Ldtob(_Pft* px, char_x code) { } } - _Genld(px, code, (u8*) p, nsig, xexp); + _Genld(px, code, p, nsig, xexp); } -s16 _Ldunscale(s16* pex, _Pft* px) { - u16* ps = (u16*) px; - s16 xchar = (ps[_D0] & _DMASK) >> _DOFF; - +short _Ldunscale(short* pex, ldouble* px) { + unsigned short* ps = (unsigned short*)px; + short xchar = (ps[_D0] & _DMASK) >> _DOFF; if (xchar == _DMAX) { *pex = 0; @@ -172,22 +179,21 @@ s16 _Ldunscale(s16* pex, _Pft* px) { } } -void _Genld(_Pft* px, char_x code, u8* p, s16 nsig, s16 xexp) { +void _Genld(_Pft* px, char code, unsigned char* p, short nsig, short xexp) { const unsigned char point = '.'; if (nsig <= 0) { - nsig = 1, p = (u8*) "0"; // memes + nsig = 1, p = "0"; } - if (code == 'f' || ((code == 'g' || code == 'G') && (xexp >= -4 && xexp < px->prec))) { - xexp += 1; + if (code == 'f' || (code == 'g' || code == 'G') && xexp >= -4 && xexp < px->prec) { + xexp++; if (code != 'f') { if (((px->flags & 8) == 0) && nsig < px->prec) { px->prec = nsig; } - px->prec -= xexp; - if (px->prec < 0) { + if ((px->prec -= xexp) < 0) { px->prec = 0; } } @@ -210,7 +216,7 @@ void _Genld(_Pft* px, char_x code, u8* p, s16 nsig, s16 xexp) { nsig = px->prec; } - memcpy(&px->s[px->n1], p, px->n2 = nsig); // , memes (this one is insane) + memcpy(&px->s[px->n1], p, px->n2 = nsig); px->nz2 = px->prec - nsig; } else if (nsig < xexp) { memcpy(&px->s[px->n1], p, nsig); @@ -218,7 +224,7 @@ void _Genld(_Pft* px, char_x code, u8* p, s16 nsig, s16 xexp) { px->nz1 = xexp - nsig; if (px->prec > 0 || (px->flags & 8)) { px->s[px->n1] = point; - px->n2 += 1; + px->n2++; } px->nz2 = px->prec; @@ -280,18 +286,18 @@ void _Genld(_Pft* px, char_x code, u8* p, s16 nsig, s16 xexp) { if (xexp >= 100) { if (xexp >= 1000) { - *p++ = (xexp / 1000) + '0', xexp %= 1000; // , memes + *p++ = (xexp / 1000) + '0', xexp %= 1000; } - *p++ = (xexp / 100) + '0', xexp %= 100; // , memes + *p++ = (xexp / 100) + '0', xexp %= 100; } - *p++ = (xexp / 10) + '0', xexp %= 10; // , memes + *p++ = (xexp / 10) + '0', xexp %= 10; *p++ = xexp + '0'; px->n2 = (size_t)p - ((size_t)px->s + px->n1); } if ((px->flags & 0x14) == 0x10) { - s32 n = px->n0 + px->n1 + px->nz1 + px->n2 + px->nz2; + int n = px->n0 + px->n1 + px->nz1 + px->n2 + px->nz2; if (n < px->width) { px->nz0 = px->width - n; diff --git a/lib/hackerlibultra/src/libc/xlitob.c b/lib/hackerlibultra/src/libc/xlitob.c new file mode 100644 index 00000000..e3ac06f4 --- /dev/null +++ b/lib/hackerlibultra/src/libc/xlitob.c @@ -0,0 +1,58 @@ +#include "stdlib.h" +#include "string.h" +#include "xstdio.h" + +// TODO: these come from headers +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.23 $" + +#define BUFF_LEN 0x18 + +static char ldigs[] = "0123456789abcdef"; +static char udigs[] = "0123456789ABCDEF"; + +void _Litob(_Pft* px, char code) { + char buff[BUFF_LEN]; + const char* digs; + int base; + int i; + unsigned long long ullval; + + digs = (code == 'X') ? udigs : ldigs; + + base = (code == 'o') ? 8 : ((code != 'x' && code != 'X') ? 10 : 16); + i = BUFF_LEN; + ullval = px->v.ll; + + if ((code == 'd' || code == 'i') && px->v.ll < 0) { + ullval = -ullval; + } + + if (ullval != 0 || px->prec != 0) { + buff[--i] = digs[ullval % base]; + } + + px->v.ll = ullval / base; + + while (px->v.ll > 0 && i > 0) { + lldiv_t qr = lldiv(px->v.ll, base); + + px->v.ll = qr.quot; + buff[--i] = digs[qr.rem]; + } + + px->n1 = BUFF_LEN - i; + + memcpy(px->s, buff + i, px->n1); + + if (px->n1 < px->prec) { + px->nz0 = px->prec - px->n1; + } + + if (px->prec < 0 && (px->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { + if ((i = px->width - px->n0 - px->nz0 - px->n1) > 0) { + px->nz0 += i; + } + } +} diff --git a/lib/hackerlibultra/src/libc/xprintf.c b/lib/hackerlibultra/src/libc/xprintf.c new file mode 100644 index 00000000..219fc68e --- /dev/null +++ b/lib/hackerlibultra/src/libc/xprintf.c @@ -0,0 +1,247 @@ +#include "PRinternal/macros.h" +#include "string.h" +#include "stdarg.h" +#include "xstdio.h" + +// TODO: these come from headers +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.23 $" + +#define isdigit(x) ((x >= '0' && x <= '9')) +#define LDSIGN(x) (((unsigned short*)&(x))[0] & 0x8000) + +#define ATOI(dst, src) \ + for (dst = 0; isdigit(*src); ++src) { \ + if (dst < 999) \ + dst = dst * 10 + *src - '0'; \ + } + +#define MAX_PAD ((sizeof(spaces) - 1)) +#define PAD(s, n) \ + if (0 < (n)) { \ + int i, j = (n); \ + for (; 0 < j; j -= i) { \ + i = MAX_PAD < (unsigned int)j ? (int)MAX_PAD : j; \ + PUT(s, i); \ + } \ + } +#define PUT(s, n) \ + if (0 < (n)) { \ + if ((arg = (*pfn)(arg, s, n)) != NULL) \ + x.nchar += (n); \ + else \ + return x.nchar; \ + } +static char spaces[] = " "; +static char zeroes[] = "00000000000000000000000000000000"; + +static void _Putfld(_Pft* px, va_list* pap, char code, char* ac); + +int _Printf(void* pfn(void*, const char*, size_t), void* arg, const char* fmt, va_list ap) { + _Pft x; + + x.nchar = 0; + + while (1) { + const char* s; + char c; + const char* t; + static const char fchar[] = { ' ', '+', '-', '#', '0', '\0' }; + static const unsigned int fbit[] = { FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAGS_ZERO, 0 }; + char ac[32]; + s = fmt; + + for (c = *s; c != 0 && c != '%';) { + c = *++s; + } + + PUT(fmt, s - fmt); + + if (c == 0) { + return x.nchar; + } + + fmt = ++s; + + for (x.flags = 0; (t = strchr(fchar, *s)) != NULL; s++) { + x.flags |= fbit[t - fchar]; + } + + if (*s == '*') { + x.width = va_arg(ap, int); + + if (x.width < 0) { + x.width = -x.width; + x.flags |= FLAGS_MINUS; + } + s++; + } else + ATOI(x.width, s); + + if (*s != '.') { + x.prec = -1; + } else if (*++s == '*') { + x.prec = va_arg(ap, int); + ++s; + } else + for (x.prec = 0; isdigit(*s); s++) { + if (x.prec < 999) + x.prec = x.prec * 10 + *s - '0'; + } + + x.qual = strchr("hlL", *s) ? *s++ : '\0'; + + if (x.qual == 'l' && *s == 'l') { + x.qual = 'L'; + ++s; + } + + _Putfld(&x, &ap, *s, ac); + x.width -= x.n0 + x.nz0 + x.n1 + x.nz1 + x.n2 + x.nz2; + + { + + if (!(x.flags & FLAGS_MINUS)) { + int i, j; + if (0 < (x.width)) { + i, j = x.width; + for (; 0 < j; j -= i) { + i = MAX_PAD < (unsigned int)j ? (int)MAX_PAD : j; + PUT(spaces, i); + } + } + } + + PUT(ac, x.n0); + PAD(zeroes, x.nz0) + + PUT(x.s, x.n1); + PAD(zeroes, x.nz1); + + PUT(x.s + x.n1, x.n2); + PAD(zeroes, x.nz2); + + if (x.flags & FLAGS_MINUS) { + PAD(spaces, x.width); + } + } + fmt = s + 1; + } + return 0; +} + +static void _Putfld(_Pft* px, va_list* pap, char code, char* ac) { + px->n0 = px->nz0 = px->n1 = px->nz1 = px->n2 = px->nz2 = 0; + + switch (code) { + case 'c': + ac[px->n0++] = va_arg(*pap, int); + break; + case 'd': + case 'i': + if (px->qual == 'l') { + px->v.ll = va_arg(*pap, long); + } else if (px->qual == 'L') { + px->v.ll = va_arg(*pap, long long); + } else { + px->v.ll = va_arg(*pap, int); + } + + if (px->qual == 'h') { + px->v.ll = (short)px->v.ll; + } + + if (px->v.ll < 0) { + ac[px->n0++] = '-'; + } else if (px->flags & FLAGS_PLUS) { + ac[px->n0++] = '+'; + } else if (px->flags & FLAGS_SPACE) { + ac[px->n0++] = ' '; + } + + px->s = (char*)&ac[px->n0]; + + _Litob(px, code); + break; + case 'x': + case 'X': + case 'u': + case 'o': + if (px->qual == 'l') { + px->v.ll = va_arg(*pap, long); + } else if (px->qual == 'L') { + px->v.ll = va_arg(*pap, long long); + } else { + px->v.ll = va_arg(*pap, int); + } + + if (px->qual == 'h') { + px->v.ll = (unsigned short)px->v.ll; + } else if (px->qual == 0) { + px->v.ll = (unsigned int)px->v.ll; + } + + if (px->flags & FLAGS_HASH) { + ac[px->n0++] = '0'; + + if (code == 'x' || code == 'X') { + ac[px->n0++] = code; + } + } + + px->s = (char*)&ac[px->n0]; + _Litob(px, code); + break; + case 'e': + case 'f': + case 'g': + case 'E': + case 'G': + px->v.ld = px->qual == 'L' ? va_arg(*pap, ldouble) : va_arg(*pap, double); + + if (LDSIGN(px->v.ld)) + ac[px->n0++] = '-'; + else if (px->flags & FLAGS_PLUS) + ac[px->n0++] = '+'; + else if (px->flags & FLAGS_SPACE) + ac[px->n0++] = ' '; + + px->s = (char*)&ac[px->n0]; + _Ldtob(px, code); + break; + + case 'n': + if (px->qual == 'h') { + *va_arg(*pap, unsigned short*) = px->nchar; + } else if (px->qual == 'l') { + *va_arg(*pap, unsigned long*) = px->nchar; + } else if (px->qual == 'L') { + *va_arg(*pap, unsigned long long*) = px->nchar; + } else { + *va_arg(*pap, unsigned int*) = px->nchar; + } + + break; + case 'p': + px->v.ll = (long)va_arg(*pap, void*); + px->s = (char*)&ac[px->n0]; + _Litob(px, 'x'); + break; + case 's': + px->s = va_arg(*pap, char*); + px->n1 = strlen(px->s); + + if (px->prec >= 0 && px->prec < px->n1) { + px->n1 = px->prec; + } + + break; + case '%': + ac[px->n0++] = '%'; + break; + default: + ac[px->n0++] = code; + break; + } +} diff --git a/lib/ultra/libc/xstdio.h b/lib/hackerlibultra/src/libc/xstdio.h similarity index 50% rename from lib/ultra/libc/xstdio.h rename to lib/hackerlibultra/src/libc/xstdio.h index 9dfd4917..b9f5e833 100644 --- a/lib/ultra/libc/xstdio.h +++ b/lib/hackerlibultra/src/libc/xstdio.h @@ -1,19 +1,19 @@ #ifndef _XSTDIO_H #define _XSTDIO_H -#include "PR/os_version.h" -#include -#include -#if LIBULTRA_VERSION >= OS_VER_I -typedef char char_x; +#include "stdlib.h" +#include "stdarg.h" + +#ifdef __sgi +typedef double ldouble; // IDO does not support long doubles #else -typedef unsigned char char_x; +typedef long double ldouble; #endif typedef struct { /* 0x0 */ union { /* 0x0 */ long long ll; - /* 0x0 */ double ld; + /* 0x0 */ ldouble ld; } v; /* 0x8 */ unsigned char* s; /* 0xC */ int n0; @@ -26,18 +26,17 @@ typedef struct { /* 0x28 */ int width; /* 0x2C */ size_t nchar; /* 0x30 */ unsigned int flags; - /* 0x34 */ char_x qual; + /* 0x34 */ char qual; } _Pft; #define FLAGS_SPACE 1 -#define FLAGS_PLUS 2 +#define FLAGS_PLUS 2 #define FLAGS_MINUS 4 -#define FLAGS_HASH 8 -#define FLAGS_ZERO 16 -typedef char *outfun(char*,const char*,size_t); +#define FLAGS_HASH 8 +#define FLAGS_ZERO 16 -int _Printf(outfun prout, char *arg, const char *fmt, va_list args); -void _Litob(_Pft *args, char_x type); -void _Ldtob(_Pft* args, char_x type); +int _Printf(void* pfn(void*, const char*, size_t), void* arg, const char* fmt, va_list ap); +void _Litob(_Pft* px, char code); +void _Ldtob(_Pft* px, char code); #endif diff --git a/lib/hackerlibultra/src/log/delay.s b/lib/hackerlibultra/src/log/delay.s new file mode 100644 index 00000000..70782f68 --- /dev/null +++ b/lib/hackerlibultra/src/log/delay.s @@ -0,0 +1,24 @@ +#include "PR/os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J +#include "sys/asm.h" +#include "sys/regdef.h" + +LEAF(osDelay) + sll t0, a0, 2 + addu t0, a0 + sll t0, t0, 2 + beqz a0, 2f + +1: + subu t0, 1 + NOP + NOP + bnez t0, 1b + +2: + j ra + +END(osDelay) + +#endif diff --git a/lib/hackerlibultra/src/log/log.c b/lib/hackerlibultra/src/log/log.c new file mode 100644 index 00000000..1519c3b3 --- /dev/null +++ b/lib/hackerlibultra/src/log/log.c @@ -0,0 +1,124 @@ +#include "stdarg.h" +#include "PR/rdb.h" +#include "PR/os.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PRinternal/macros.h" + +#ifndef _FINALROM + +static u32 __osLogOKtoWrite = TRUE; +static u32 __osLogInitialized = FALSE; + +static OSMesgQueue __osLogDoneMsgQ ALIGNED(0x8); +static OSMesg __osLogMsgBuf; + +void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr); + +void osCreateLog(OSLog* log, u32* base, s32 byteLen) { + log->magic = OS_LOG_MAGIC; + log->base = base; + log->len = byteLen; + log->startCount = osGetCount(); + log->writeOffset = 0; +} + +void osLogEvent(OSLog* log, s16 code, s16 numArgs, ...) { + va_list argPtr; + + if (numArgs > 16) { + return; + } + + va_start(argPtr, numArgs); + __osLogWrite(log, code, numArgs, argPtr); + va_end(argPtr); +} + +void osFlushLog(OSLog* log) { + s32 mask; + u32 sent; + u32 count; + u32 subcount; + u8* base; + u8 dCount[3]; + + if (!__osLogInitialized) { + osCreateMesgQueue(&__osLogDoneMsgQ, &__osLogMsgBuf, 1); + osSetEventMesg(OS_EVENT_RDB_LOG_DONE, &__osLogDoneMsgQ, 0); + __osLogInitialized = 1; + } + + mask = __osDisableInt(); + __osLogOKtoWrite = 0; + base = log->base; + count = log->writeOffset * 4; + __osRestoreInt(mask); + + while (count != 0) { + subcount = (count < 0x8000) ? count : 0x8000; + dCount[0] = (subcount & 0xFF0000) >> 0x10; + dCount[1] = (subcount & 0xFF00) >> 8; + dCount[2] = subcount & 0xFF; + + sent = 0; + while (sent < 3) { + sent += __osRdbSend(dCount + sent, 3 - sent, RDB_TYPE_GtoH_LOG_CT); + } + + sent = 0; + while (sent < subcount) { + sent += __osRdbSend(base + sent, subcount - sent, RDB_TYPE_GtoH_LOG); + } + + count -= subcount; + base += subcount; + osRecvMesg(&__osLogDoneMsgQ, NULL, OS_MESG_BLOCK); + } + mask = __osDisableInt(); + log->writeOffset = 0; + __osLogOKtoWrite = 1; + __osRestoreInt(mask); +} + +void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr) { + int i; + u32 saveEnable; + u32 buf[19]; + u32* bufp; + OSLogItem* hdr; + s32* args; + s32* dest; + int numLongs; + + bufp = buf; + hdr = buf; + args = buf + 3; + numLongs = numArgs + 3; + saveEnable = __osDisableInt(); + + hdr->magic = log->magic; + hdr->timeStamp = osGetCount() - log->startCount; + hdr->argCount = numArgs; + hdr->eventID = code; + + for (i = 0; i < numArgs; i++) { + *args++ = va_arg(argPtr, int); + } + + if (__osLogOKtoWrite) { + if ((log->writeOffset + numLongs) < (log->len >> 2)) { + dest = log->base + log->writeOffset; + for (i = 0; i < numLongs; i++) { + *dest++ = *bufp++; + } + log->writeOffset += numLongs; + } else { + __osLogOKtoWrite = FALSE; + } + } + __osRestoreInt(saveEnable); +} + +#endif diff --git a/lib/hackerlibultra/src/log/logfloat.c b/lib/hackerlibultra/src/log/logfloat.c new file mode 100644 index 00000000..17db7391 --- /dev/null +++ b/lib/hackerlibultra/src/log/logfloat.c @@ -0,0 +1,11 @@ +#include "os_version.h" + +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "ultralog.h" + +u32 osLogFloat(f32 f) { + return OS_LOG_FLOAT(f); +} + +#endif diff --git a/lib/hackerlibultra/src/mgu/Makefile b/lib/hackerlibultra/src/mgu/Makefile new file mode 100644 index 00000000..52c29f69 --- /dev/null +++ b/lib/hackerlibultra/src/mgu/Makefile @@ -0,0 +1,36 @@ +# +# Makefile for the gu subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + +LCINCS = -I. -I../gu -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include +LASINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/include +LCOPTS = -G 0 -g -O + +CFILES = mtxcatl.c \ + mtxxfml.c \ + mtxxfmf.c \ + rotate.c + +ASFILES = mtxident.s \ + mtxidentf.s \ + mtxf2l.s \ + mtxl2f.s \ + mtxcatf.s \ + scale.s \ + scalef.s \ + normalize.s \ + translate.s \ + translatef.s + +OBJECTS = $(CFILES:.c=.o) $(ASFILES:.s=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) + +.s.o: + cpp $(F_ROM) -DLANG_JAPANESE -E -DMIPSEB -DLANGUAGE_ASSEMBLY -D_MIPS_SIM=1 -D_ULTRA64 -I. -I$(LIBDEPTH)\include $*.s $*.ss2 + as -mips3 -G0 -o $*.o $*.ss2 + del $*.ss? diff --git a/lib/hackerlibultra/src/mgu/asm.h b/lib/hackerlibultra/src/mgu/asm.h new file mode 100644 index 00000000..54feda6e --- /dev/null +++ b/lib/hackerlibultra/src/mgu/asm.h @@ -0,0 +1,47 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __ASM_H__ +#define __ASM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define _MIPS_ISA_MIPS1 1 /* R2/3K */ +#define _MIPS_ISA_MIPS2 2 /* R4K/6K */ +#define _MIPS_ISA_MIPS3 3 /* R4K */ +#define _MIPS_ISA_MIPS4 4 /* TFP */ + +#define _MIPS_SIM_ABI32 1 /* MIPS MSIG calling convention */ +#define _MIPS_SIM_NABI32 2 /* MIPS new 32-bit abi */ + /* NABI32 is 64bit calling convention but 32bit type sizes) */ +#define _MIPS_SIM_ABI64 3 /* MIPS 64 calling convention */ + +#define LEAF(x) \ + .globl x; \ + .ent x, 0; \ + x:; \ + .frame sp, 0, ra + +#define END(proc) .end proc + +#ifdef __cplusplus +} +#endif + +#endif /* !__ASM_H__ */ diff --git a/lib/hackerlibultra/src/mgu/mtxcatf.s b/lib/hackerlibultra/src/mgu/mtxcatf.s new file mode 100644 index 00000000..4b96124b --- /dev/null +++ b/lib/hackerlibultra/src/mgu/mtxcatf.s @@ -0,0 +1,103 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:37 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include + +/* + * void guMtxCatF(float mf[4][4], float nf[4][4], float res[4][4]) + * res = mf * nf + */ +#define FRAME_SIZE 64 + .text + .align 5 + .globl guMtxCatF + .ent guMtxCatF, 0 +guMtxCatF: + .set reorder + subu sp, FRAME_SIZE + .frame sp, FRAME_SIZE, ra + + addu v0, a0, 64 + addu v1, a1, 16 + move t2, sp +label_loop_i: + move a3, a1 +label_loop_j: + l.s ft0, 0(a0) /* mf[i][0] * nf[0][j] */ + l.s ft1, 0(a3) + mul.s ft2, ft0, ft1 + l.s ft3, 4(a0) /* + mf[i][1] * nf[1][j] */ + l.s ft4, 16(a3) + mul.s ft5, ft3, ft4 + add.s ft2, ft2, ft5 + l.s ft0, 8(a0) /* + mf[i][2] * nf[2][j] */ + l.s ft1, 32(a3) + mul.s ft5, ft0, ft1 + add.s ft2, ft2, ft5 + l.s ft3, 12(a0) /* + mf[i][3] * nf[3][j] */ + l.s ft4, 48(a3) + mul.s ft5, ft3, ft4 + add.s ft2, ft2, ft5 + + s.s ft2, 0(t2) + addu a3, a3, 4 + addu t2, t2, 4 + bne a3, v1, label_loop_j +/* loop_j_end */ + addu a0, a0, 16 + bne a0, v0, label_loop_i +/* loop_i_end */ + s.s ft2, 60(a2) + lw t0, 0(sp) + lw t1, 4(sp) + lw t2, 8(sp) + lw t3, 12(sp) + lw ta0, 16(sp) + lw ta1, 20(sp) + lw ta2, 24(sp) + lw ta3, 28(sp) + lw t8, 32(sp) + lw t9, 36(sp) + lw v0, 40(sp) + lw v1, 44(sp) + lw a0, 48(sp) + lw a1, 52(sp) + lw a3, 56(sp) + + sw t0, 0(a2) + sw t1, 4(a2) + sw t2, 8(a2) + sw t3, 12(a2) + sw ta0, 16(a2) + sw ta1, 20(a2) + sw ta2, 24(a2) + sw ta3, 28(a2) + sw t8, 32(a2) + sw t9, 36(a2) + sw v0, 40(a2) + sw v1, 44(a2) + sw a0, 48(a2) + sw a1, 52(a2) + sw a3, 56(a2) + + addu sp , FRAME_SIZE + j ra + + .end guMtxCatF + +/* end of file */ diff --git a/lib/ultra/mgu/guasm.h b/lib/hackerlibultra/src/mgu/mtxcatl.c similarity index 57% rename from lib/ultra/mgu/guasm.h rename to lib/hackerlibultra/src/mgu/mtxcatl.c index 4e1d6786..504fa11e 100644 --- a/lib/ultra/mgu/guasm.h +++ b/lib/hackerlibultra/src/mgu/mtxcatl.c @@ -1,7 +1,7 @@ /************************************************************************ Copyright (C) 1998,1999 NINTENDO CO,Ltd, Copyright (C) 1998,1999 MONEGI CORPORATION, - All Rights Reserved + All Rights Reserved This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. and it is not to be reproduced, published, disclosed to others, copied, adapted, distributed, or displayed without the prior authorization of @@ -10,28 +10,33 @@ this Notice on all copies of the program, including partial copies or modified versions thereof. *************************************************************************/ /************************************************************************ - $Date: 1999/06/16 09:15:38 $ + $Date: 1999/06/16 09:15:37 $ $Revision: 1.1 $ $Author: doseki $ ************************************************************************/ -#include "PR/os_version.h" -#include "sys/asm.h" -#include "sys/regdef.h" +#include +#include "../gu/guint.h" +#include "gu.h" -#define HALF_SIZE_MTX 32 -#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ -#define FLOAT_0x10000 6.5536e+04 /* (float)0x00010000) */ +void guMtxCatL(Mtx* m, Mtx* n, Mtx* res) { + float mf[4][4], nf[4][4], resf[4][4]; -/* - * FTOFIX32 (float to fix32) - * a: input - * t: output - * ft0 : (float)0x00010000 - * ft1, ft2, ft3, t0 : work reg - */ -#define FTOFIX32(a, t) \ - mtc1 a, ft1 ; \ - mul.s ft2, ft1, ft0 ; \ - trunc.w.s ft3, ft2, t0 ; \ - mfc1 t, ft3 ; + guMtxL2F(mf, m); + guMtxL2F(nf, n); + + guMtxCatF(mf, nf, resf); + + guMtxF2L(resf, res); +} + +#if BUILD_VERSION < VERSION_K +void guMtxXFML(Mtx* m, float x, float y, float z, float* ox, float* oy, float* oz) { + float mf[4][4]; + + guMtxL2F(mf, m); + + guMtxXFMF(mf, x, y, z, ox, oy, oz); +} +#endif +/* End of file */ diff --git a/lib/hackerlibultra/src/mgu/mtxf2l.s b/lib/hackerlibultra/src/mgu/mtxf2l.s new file mode 100644 index 00000000..43bbe7eb --- /dev/null +++ b/lib/hackerlibultra/src/mgu/mtxf2l.s @@ -0,0 +1,80 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include + +/* + * void guMtxF2L(float mf[4][4], Mtx *m) + * + * Input + * float mf[4][4] + * Output + * Mtx *m + */ + +#define HALF_SIZE_MTX 32 +#define MASK_LOW 0x0000FFFF +#define MASK_HIGH 0xFFFF0000 +#define MAGNIFICANT 65536.0 /* = 0x10000 */ + +#define ptr_fl a0 /* argument */ +#define ptr_mtx a1 /* argument */ +#define end_mtx t8 +#define mask_hi t9 +#define magni fv0 + + .text + .align 5 +LEAF( guMtxF2L ) + .set reorder + + li.s magni, MAGNIFICANT + li mask_hi, MASK_HIGH + addu end_mtx, ptr_mtx, HALF_SIZE_MTX +label_loop: + l.s ft0, 0(ptr_fl) /* FTOFIX32( ) */ + mul.s ft1, ft0, magni + trunc.w.s ft2, ft1 + + l.s ft3, 4(ptr_fl) /* FTOFIX32( ) */ + mul.s ft4, ft3, magni + trunc.w.s ft5, ft4 + + mfc1 t0, ft2 /* t0 <- FIXED */ + mfc1 t1, ft5 /* t1 <- FIXED */ + + and t2, t0, mask_hi /* integral part */ + srl t3, t1, 16 + or ta0, t2, t3 + sw ta0, 0(ptr_mtx) + + sll ta1, t0, 16 /* decimal part */ + and ta2, t1, MASK_LOW + or ta3, ta1, ta2 + sw ta3, HALF_SIZE_MTX(ptr_mtx) + + addu ptr_mtx, ptr_mtx, 4 + addu ptr_fl, ptr_fl, 8 + + bne ptr_mtx, end_mtx, label_loop +/* loop-end */ + + j ra + END( guMtxF2L ) + +/* End of file */ diff --git a/lib/hackerlibultra/src/mgu/mtxident.s b/lib/hackerlibultra/src/mgu/mtxident.s new file mode 100644 index 00000000..a9ec4913 --- /dev/null +++ b/lib/hackerlibultra/src/mgu/mtxident.s @@ -0,0 +1,60 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guMtxIdent( Mtx * matrix ) + * Substitute unit matrix for matrix + * Correspond only when alignment is 4 byte boundary + * Input + * a0 = matrix + * Output + * *matrix unit matrix + */ + +#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ + .text + .align 5 +LEAF(guMtxIdent) + .set reorder + + addi t0, zero, 1 /* t0 = 0x00000001 */ + sll t1, t0, 16 /* t1 = 0x00010000 */ + + sw t1, 0(a0) /* Substitution of integers */ + sw zero, 4(a0) + sw t0, 8(a0) + sw zero, 12(a0) + sw zero, 16(a0) + sw t1, 20(a0) + sw zero, 24(a0) + sw t0, 28(a0) + + sw zero, 32(a0) /* Substitution of fractions */ + sw zero, 36(a0) + sw zero, 40(a0) + sw zero, 44(a0) + sw zero, 48(a0) + sw zero, 52(a0) + sw zero, 56(a0) + sw zero, 60(a0) + j ra + + END(guMtxIdent) + +/* End of file */ diff --git a/lib/ultra/mgu/mtxidentf.s b/lib/hackerlibultra/src/mgu/mtxidentf.s similarity index 51% rename from lib/ultra/mgu/mtxidentf.s rename to lib/hackerlibultra/src/mgu/mtxidentf.s index 7e740f17..a6aa7793 100644 --- a/lib/ultra/mgu/mtxidentf.s +++ b/lib/hackerlibultra/src/mgu/mtxidentf.s @@ -1,12 +1,12 @@ /************************************************************************ Copyright (C) 1998,1999 NINTENDO CO,Ltd, Copyright (C) 1998,1999 MONEGI CORPORATION, - All Rights Reserved -This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. and it is not to be reproduced, published, disclosed to others, copied, -adapted, distributed, or displayed without the prior authorization of -NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed -this Notice on all copies of the program, including partial copies or +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or modified versions thereof. *************************************************************************/ /************************************************************************ @@ -14,51 +14,47 @@ modified versions thereof. $Revision: 1.1 $ $Author: doseki $ ************************************************************************/ - -#include "guasm.h" - -#if LIBULTRA_VERSION >= OS_VER_K && defined(TARGET_N64) +#include +#include /* * guMtxIdentF( float matrix[4][4] ) - * substitute unit matrix for floating point matrix - * correspond only when alignment is four byte boundary + * substitute unit matrix for floating point matrix + * correspond only when alignment is four byte boundary * Input - * a0 = matrix + * a0 = matrix * Output - * *matrix unti matix + * *matrix unti matix */ - .text - .align 5 + .text + .align 5 LEAF( guMtxIdentF ) - .set reorder + .set reorder - li t0, 0x3f800000 /* t0 = 1.0 */ + li t0, 0x3f800000 /* t0 = 1.0 */ - sw t0, 0(a0) - sw zero, 4(a0) /* line 1 */ - sw zero, 8(a0) - sw zero, 12(a0) + sw t0, 0(a0) + sw zero, 4(a0) /* line 1 */ + sw zero, 8(a0) + sw zero, 12(a0) - sw zero, 16(a0) /* line 2 */ - sw t0, 20(a0) - sw zero, 24(a0) - sw zero, 28(a0) + sw zero, 16(a0) /* line 2 */ + sw t0, 20(a0) + sw zero, 24(a0) + sw zero, 28(a0) - sw zero, 32(a0) /* line 3 */ - sw zero, 36(a0) - sw t0, 40(a0) - sw zero, 44(a0) + sw zero, 32(a0) /* line 3 */ + sw zero, 36(a0) + sw t0, 40(a0) + sw zero, 44(a0) - sw zero, 48(a0) /* line 4 */ - sw zero, 52(a0) - sw zero, 56(a0) - sw t0, 60(a0) + sw zero, 48(a0) /* line 4 */ + sw zero, 52(a0) + sw zero, 56(a0) + sw t0, 60(a0) - j ra + j ra - END( guMtxIdentF ) + END( guMtxIdentF ) -/* End of file */ - -#endif +/* End of file */ \ No newline at end of file diff --git a/lib/hackerlibultra/src/mgu/mtxl2f.s b/lib/hackerlibultra/src/mgu/mtxl2f.s new file mode 100644 index 00000000..897acfbe --- /dev/null +++ b/lib/hackerlibultra/src/mgu/mtxl2f.s @@ -0,0 +1,80 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:38 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#include +#include + +/* + * void guMtxF2L(float mf[4][4], Mtx *m) + * + * Input + * float mf[4][4] + * Output + * Mtx *m + */ + +#define HALF_SIZE_MTX 32 +#define MASK_LOW 0x0000FFFF +#define MASK_HIGH 0xFFFF0000 +#define MAGNIFICANT 1.5258789062500000e-05 /* ~ 1 / 0x10000 */ + +#define ptr_fl a0 /* argument */ +#define ptr_mtx a1 /* argument */ +#define end_mtx t8 +#define mask_hi t9 +#define magni fv0 + + .text + .align 5 +LEAF( guMtxL2F ) + .set reorder + li.s magni, MAGNIFICANT + li mask_hi, MASK_HIGH + addu end_mtx, ptr_mtx, HALF_SIZE_MTX +label_loop: + lw t0, 0(ptr_mtx) + lw t1, 32(ptr_mtx) + + and t2, t0, mask_hi + srl t3, t1, 16 + or ta0, t2, t3 + + sll ta1, t0, 16 + and ta2, t1, MASK_LOW + or ta3, ta1, ta2 + + mtc1 ta0, ft0 /* FIX32TOF( ) */ + cvt.s.w ft1, ft0 + mul.s ft2, ft1, magni + + mtc1 ta3, ft3 /* FIX32TOF( ) */ + cvt.s.w ft4, ft3 + mul.s ft5, ft4, magni + + s.s ft2, 0(ptr_fl) + s.s ft5, 4(ptr_fl) + + addu ptr_mtx, ptr_mtx, 4 + addu ptr_fl, ptr_fl, 8 + + bne ptr_mtx, end_mtx, label_loop +/* loop-end */ + + j ra + END( guMtxL2F ) + +/* End of file */ diff --git a/lib/hackerlibultra/src/mgu/mtxxfmf.c b/lib/hackerlibultra/src/mgu/mtxxfmf.c new file mode 100644 index 00000000..f846a8bd --- /dev/null +++ b/lib/hackerlibultra/src/mgu/mtxxfmf.c @@ -0,0 +1,38 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: mtxcatf.c + * Creator: hsa@sgi.com + * Create Date: Thu Nov 2 13:03:02 PST 1995 + * + */ + +#include "../gu/guint.h" + +void guMtxXFMF(float mf[4][4], float x, float y, float z, float* ox, float* oy, float* oz) { + *ox = mf[0][0] * x + mf[1][0] * y + mf[2][0] * z + mf[3][0]; + *oy = mf[0][1] * x + mf[1][1] * y + mf[2][1] * z + mf[3][1]; + *oz = mf[0][2] * x + mf[1][2] * y + mf[2][2] * z + mf[3][2]; +} diff --git a/lib/hackerlibultra/src/mgu/mtxxfml.c b/lib/hackerlibultra/src/mgu/mtxxfml.c new file mode 100644 index 00000000..d209b5ea --- /dev/null +++ b/lib/hackerlibultra/src/mgu/mtxxfml.c @@ -0,0 +1,40 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + * + */ + +/* + * File: mtxcatl.c + * Creator: hsa@sgi.com + * Create Date: Thu Nov 2 13:03:02 PST 1995 + * + */ + +#include "../gu/guint.h" + +void guMtxXFML(Mtx* m, float x, float y, float z, float* ox, float* oy, float* oz) { + float mf[4][4]; + + guMtxL2F(mf, m); + + guMtxXFMF(mf, x, y, z, ox, oy, oz); +} diff --git a/lib/hackerlibultra/src/mgu/normalize.s b/lib/hackerlibultra/src/mgu/normalize.s new file mode 100644 index 00000000..58b90931 --- /dev/null +++ b/lib/hackerlibultra/src/mgu/normalize.s @@ -0,0 +1,56 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:39 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guNormalize(float *x, float *y, float *z) + */ + .text + .align 5 +LEAF( guNormalize ) + .set noreorder + + l.s ft0, 0(a0) /* ft0 = x */ + l.s ft1, 0(a1) /* ft1 = y */ + l.s ft2, 0(a2) /* ft2 = z */ + + mul.s ft3, ft0, ft0 /* ft3 = x*x */ + lui t0, 0x3f80 /* t0 = 1.0f */ + mul.s ft4, ft1, ft1 /* ft4 = y*y */ + add.s ft5, ft3, ft4 + mul.s ft4, ft2, ft2 /* ft4 = z*z */ + + add.s ft3, ft4, ft5 /* ft3 = x*x + y*y + z*z */ + mtc1 t0, ft5 + sqrt.s ft4, ft3 /* ft4 = sqrt(x*x + y*y + z*z) */ + + div.s ft3, ft5, ft4 /* ft3 = 1/sqrt(x*x + y*y + z*z) */ + + mul.s ft4, ft0, ft3 /* ft4 = x * 1/sqrt(x*x + y*y + z*z) */ + nop + mul.s ft5, ft1, ft3 /* ft5 = y * 1/sqrt(x*x + y*y + z*z) */ + nop + mul.s ft0, ft2, ft3 /* ft0 = z * 1/sqrt(x*x + y*y + z*z) */ + + s.s ft4, 0(a0) /* x = ft4 */ + s.s ft5, 0(a1) /* y = ft5 */ + j ra + s.s ft0, 0(a2) /* z = ft0 */ /* Use delayed slot */ + + END( guNormalize ) +/* end of file */ diff --git a/lib/hackerlibultra/src/mgu/regdef.h b/lib/hackerlibultra/src/mgu/regdef.h new file mode 100644 index 00000000..32b85c01 --- /dev/null +++ b/lib/hackerlibultra/src/mgu/regdef.h @@ -0,0 +1,187 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO Co,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO Co,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO Co,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/07/06 13:21:13 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ + +#ifndef __REGDEF_H__ +#define __REGDEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef mips + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define ta0 $12 +#define t5 $13 +#define ta1 $13 +#define t6 $14 +#define ta2 $14 +#define t7 $15 +#define ta3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define a4 $8 +#define ta0 $8 +#define a5 $9 +#define ta1 $9 +#define a6 $10 +#define ta2 $10 +#define a7 $11 +#define ta3 $11 +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +#define s8 $30 +#define ra $31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI32) +#define fv0 $f0 +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +#define fa0 $f12 +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +#define ft0 $f4 +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +#define fs0 $f20 +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 +#endif + +#if (_MIPS_SIM == _MIPS_SIM_ABI64) +#define fv0 $f0 +#define fv1 $f2 +#define fa0 $f12 +#define fa1 $f13 +#define fa2 $f14 +#define fa3 $f15 +#define fa4 $f16 +#define fa5 $f17 +#define fa6 $f18 +#define fa7 $f19 +#define ft0 $f4 +#define ft1 $f5 +#define ft2 $f6 +#define ft3 $f7 +#define ft4 $f8 +#define ft5 $f9 +#define ft6 $f10 +#define ft7 $f11 +#define ft8 $f20 +#define ft9 $f21 +#define ft10 $f22 +#define ft11 $f23 +#define ft12 $f1 +#define ft13 $f3 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 +#endif + +#define fcr31 $31 + +#endif /* mips */ + +#ifdef __cplusplus +} +#endif + +#endif /* !__REGDEF_H__ */ diff --git a/lib/hackerlibultra/src/mgu/rotate.c b/lib/hackerlibultra/src/mgu/rotate.c new file mode 100644 index 00000000..9666284a --- /dev/null +++ b/lib/hackerlibultra/src/mgu/rotate.c @@ -0,0 +1,71 @@ +/************************************************************************** + * * + * Copyright (C) 1994, Silicon Graphics, Inc. * + * * + * These coded instructions, statements, and computer programs contain * + * unpublished proprietary information of Silicon Graphics, Inc., and * + * are protected by Federal copyright law. They may not be disclosed * + * to third parties or copied or duplicated in any form, in whole or * + * in part, without the prior written consent of Silicon Graphics, Inc. * + * * + **************************************************************************/ + +#include "../gu/guint.h" +#include "gu.h" +#include "os_version.h" + +void guRotateF(float mf[4][4], float a, float x, float y, float z) { + static float dtor = 3.1415926 / 180.0; + float sine; + float cosine; + float ab, bc, ca, t; +#if BUILD_VERSION >= VERSION_K + float xxsine; + float yxsine; + float zxsine; +#endif + + guNormalize(&x, &y, &z); + a *= dtor; + sine = sinf(a); + cosine = cosf(a); + t = (1 - cosine); + ab = x * y * t; + bc = y * z * t; + ca = z * x * t; + + guMtxIdentF(mf); + +#if BUILD_VERSION >= VERSION_K + xxsine = x * sine; + yxsine = y * sine; + zxsine = z * sine; +#else +#define xxsine (x * sine) +#define yxsine (y * sine) +#define zxsine (z * sine) +#endif + + t = x * x; + mf[0][0] = t + cosine * (1 - t); + mf[2][1] = bc - xxsine; + mf[1][2] = bc + xxsine; + + t = y * y; + mf[1][1] = t + cosine * (1 - t); + mf[2][0] = ca + yxsine; + mf[0][2] = ca - yxsine; + + t = z * z; + mf[2][2] = t + cosine * (1 - t); + mf[1][0] = ab - zxsine; + mf[0][1] = ab + zxsine; +} + +void guRotate(Mtx* m, float a, float x, float y, float z) { + Matrix mf; + + guRotateF(mf, a, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/hackerlibultra/src/mgu/scale.s b/lib/hackerlibultra/src/mgu/scale.s new file mode 100644 index 00000000..01bc290b --- /dev/null +++ b/lib/hackerlibultra/src/mgu/scale.s @@ -0,0 +1,85 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:40 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * FTOFIX32 (float to fix32) + * a: input + * t: output + * ft0 : (float)0x00010000 + * ft1, ft2, ft3, t0 : work reg + */ +#define FTOFIX32(a, t) \ + mtc1 a, ft1 ; \ + mul.s ft2, ft1, ft0 ; \ + trunc.w.s ft3, ft2, t0 ; \ + mfc1 t, ft3 ; + +/* + void guScale(Mtx *m, float x, float y, float z) + m: a0 + x: a1 + y: a2 + z a3 + */ +#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ +#define FLOAT_0x10000 6.5536e+04 /* (float)0x00010000) */ + + .text + .align 5 +LEAF( guScale ) + .set reorder + + li.s ft0, FLOAT_0x10000 /* (float)0x00010000 */ + + FTOFIX32(a1, t1) /* t1 = FTOFIX32(x) */ + srl t2, t1, 16 + sll t0, t2, 16 + sw t0, 0(a0) /* t0 = x integral part */ + sll t2, t1, 16 + sw t2, 32(a0) /* t2 = x decimal part */ + + FTOFIX32(a2, t1) /* t1 = FTOFIX32(y) */ + srl t0, t1, 16 + sw t0, 8(a0) /* t0 = y integral part */ + andi t2, t1, 0xffff + sw t2, 40(a0) /* t2 = y decimal part */ + + FTOFIX32(a3, t1) /* t1 = FTOFIX32(z) */ + srl t2, t1, 16 + sll t0, t2, 16 + sw t0, 20(a0) /* t0 = z integral part */ + sll t2, t1, 16 + sw t2, 52(a0) /* t2 = z decimal part */ + + li t0, 1 /* t0 = 1.0 integral part */ + sw t0, 28(a0) + + sw zero, 4(a0) + sw zero, 12(a0) + sw zero, 16(a0) + sw zero, 24(a0) + sw zero, 36(a0) + sw zero, 44(a0) + sw zero, 48(a0) + sw zero, 56(a0) + sw zero, 60(a0) + j ra + + END( guScale ) +/* end of file */ diff --git a/lib/hackerlibultra/src/mgu/scalef.s b/lib/hackerlibultra/src/mgu/scalef.s new file mode 100644 index 00000000..b27d1e33 --- /dev/null +++ b/lib/hackerlibultra/src/mgu/scalef.s @@ -0,0 +1,57 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:40 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guScaleF(float m[4][4], float x, float y, float z) + * m: a0 + * x: a1 + * y: a2 + * z: a3 + */ + .text + .align 5 +LEAF( guScaleF ) + .set reorder + + sw a1, 0(a0) + sw zero, 4(a0) /* line 1 */ + sw zero, 8(a0) + sw zero, 12(a0) + + sw zero, 16(a0) /* line 2 */ + sw a2, 20(a0) + sw zero, 24(a0) + sw zero, 28(a0) + + sw zero, 32(a0) /* line 3 */ + sw zero, 36(a0) + sw a3, 40(a0) + sw zero, 44(a0) + + li t0, 0x3f800000 /* t0 = 1.0 */ + sw zero, 48(a0) /* line 4 */ + sw zero, 52(a0) + sw zero, 56(a0) + sw t0, 60(a0) + + j ra + + END( guScaleF ) + +/* End of file */ diff --git a/lib/hackerlibultra/src/mgu/translate.s b/lib/hackerlibultra/src/mgu/translate.s new file mode 100644 index 00000000..472fd8cf --- /dev/null +++ b/lib/hackerlibultra/src/mgu/translate.s @@ -0,0 +1,101 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:40 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + void guTranslate(Mtx *m, float x, float y, float z) + m: a0 + x: a1 + y: a2 + z a3 + */ + +#define SIZE_OF_MTX 64 /* sizeof( Mtx ) */ +#define FLOAT_0x10000 6.5536e+04 /* (float)0x00010000) */ + + .text + .align 5 +LEAF( guTranslate ) + .set reorder + + li.s ft0, FLOAT_0x10000 /* (float)0x00010000 */ + + mtc1 a1, ft1 + mul.s ft2, ft1, ft0 + trunc.w.s ft3, ft2 + mfc1 t1, ft3 /* t1 = FTOFIX32(x) */ + + mtc1 a2, ft1 + mul.s ft2, ft1, ft0 + trunc.w.s ft3, ft2 + mfc1 t3, ft3 /* t3 = FTOFIX32(y) */ + + /* Save t1 and t3 values until fraction process is finished! */ + + srl t2, t1, 16 /* x integeral part for t0 interger */ + sll t0, t2, 16 + srl t2, t3, 16 /* y integral part for t2 fraction */ + or t0, t0, t2 /* Compose in t0 */ + sw t0, 24(a0) + + sll t0,t1,16 /* x fraction part for t0 interger */ + sll t2,t3,16 + srl t2,t2,16 /* y fraction part for t2 fraction */ + or t0,t0,t2 /* Compose in t0 */ + sw t0,24+32(a0) + + + mtc1 a3, ft1 + mul.s ft2, ft1, ft0 + trunc.w.s ft3, ft2 + mfc1 t1, ft3 /* t1 = FTOFIX32(z) */ + + srl t2,t1,16 + sll t0,t2,16 /* z integral part for t0 integer */ + addiu t0,t0,1 /* enter 0x0001 in t0 fraction */ + sw t0,28(a0) + + sll t2,t1,16 /* z fraction part for t2 integer */ + sw t2,28+32(a0) + + sw zero, 0(a0) + sw zero, 4(a0) + sw zero, 8(a0) + sw zero, 12(a0) + sw zero, 16(a0) + sw zero, 20(a0) + sw zero, 0+32(a0) + sw zero, 4+32(a0) + sw zero, 8+32(a0) + sw zero, 12+32(a0) + sw zero, 16+32(a0) + sw zero, 20+32(a0) + + lui t0,0x0001 + ori t0,0x0000 + sw t0,0(a0) + sw t0,20(a0) + + lui t0,0x0000 + ori t0,0x0001 + sw t0,8(a0) + + j ra + + END( guTranslate ) +/* end of file */ diff --git a/lib/hackerlibultra/src/mgu/translatef.s b/lib/hackerlibultra/src/mgu/translatef.s new file mode 100644 index 00000000..47d14bd6 --- /dev/null +++ b/lib/hackerlibultra/src/mgu/translatef.s @@ -0,0 +1,58 @@ +/************************************************************************ + Copyright (C) 1998,1999 NINTENDO CO,Ltd, + Copyright (C) 1998,1999 MONEGI CORPORATION, + All Rights Reserved +This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. +and it is not to be reproduced, published, disclosed to others, copied, +adapted, distributed, or displayed without the prior authorization of +NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed +this Notice on all copies of the program, including partial copies or +modified versions thereof. +*************************************************************************/ +/************************************************************************ + $Date: 1999/06/16 09:15:41 $ + $Revision: 1.1 $ + $Author: doseki $ +************************************************************************/ +#include +#include + +/* + * void guTranslateF(float m[4][4], float x, float y, float z) + * m: a0 + * x: a1 + * y: a2 + * z: a3 + */ + .text + .align 5 +LEAF( guTranslateF ) + .set reorder + + li t0,0x3f800000 /* t0 = 1.0 */ + + sw t0, 0(a0) + sw zero, 4(a0) /* line 1 */ + sw zero, 8(a0) + sw zero, 12(a0) + + sw zero, 16(a0) /* line 2 */ + sw t0, 20(a0) + sw zero, 24(a0) + sw zero, 28(a0) + + sw zero, 32(a0) /* line 3 */ + sw zero, 36(a0) + sw t0, 40(a0) + sw zero, 44(a0) + + sw a1, 48(a0) /* line 4 */ + sw a2, 52(a0) + sw a3, 56(a0) + sw t0, 60(a0) + + j ra + + END( guTranslateF ) + +/* End of file */ diff --git a/lib/hackerlibultra/src/monutil.s b/lib/hackerlibultra/src/monutil.s new file mode 100644 index 00000000..e5974bd8 --- /dev/null +++ b/lib/hackerlibultra/src/monutil.s @@ -0,0 +1,188 @@ +#ifndef _FINALROM +#include "asm.h" +#include "sgidefs.h" +#include "regdef.h" +#include "sgidefs.h" +#include "PR/R4300.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#define EXC(code) (EXC_##code >> CAUSE_EXCSHIFT) + +.text + +LEAF(__isExpJP); .set noreorder + j __isExp + nop + sw k0, -0x10(sp) + la k0, __isExp + jr k0 + nop +.set reorder +END(__isExpJP) + +LEAF(__isExp); .set noreorder + sw k0, -0x10(sp) + sw k1, -8(sp) + + mfc0 k0, C0_CAUSE + nop + andi k0, k0, CAUSE_EXCMASK + bnez k0, non_stop + + nop + mfc0 k0, C0_CAUSE + nop + andi k0, k0, CAUSE_IP7 + beqz k0, throw_os_exception + nop + j go_monitor + nop +non_stop: + sra k0, k0, CAUSE_EXCSHIFT + li k1, EXC(BREAK) + bne k0, k1, non_bp + nop + j go_monitor + nop + +non_bp: + li k1, EXC(RADE) + bne k0, k1, non_adrs_store_exp + nop + j go_monitor + nop +non_adrs_store_exp: + li k1, EXC(WADE) + bne k0, k1, non_adrs_load_exp + nop + j go_monitor + nop +non_adrs_load_exp: + li k1, EXC(IBE) + bne k0, k1, non_bus_code_exp + nop + j go_monitor + nop +non_bus_code_exp: + li k1, EXC(DBE) + bne k0, k1, non_bus_data_exp + nop + j go_monitor + nop +non_bus_data_exp: + li k1, EXC(MOD) + bne k0, k1, non_tlb_mod + nop + j go_monitor + nop +non_tlb_mod: + li k1, EXC(RMISS) + bne k0, k1, non_tlb_load + nop + j go_monitor + nop +non_tlb_load: + li k1, EXC(WMISS) + bne k0, k1, non_tlb_store + nop + j go_monitor + nop +non_tlb_store: + li k1, EXC(II) + bne k0, k1, non_resv + nop + j go_monitor + nop + +non_resv: + lw k1, -8(sp) + +throw_os_exception: + j ramOldVector + nop + + + + + + + + + +go_monitor: + move k0, sp + addiu sp, sp, -0x200 + sw k0, 0x78(sp) + lw k1, -8(k0) + sw k1, 0x70(sp) + lw k1, -0x10(k0) + sw k1, 0x6c(sp) + nop +w: + lui k0, (0xA4600010 >> 16) + lw k0, (0xA4600010 & 0xFFFF)(k0) /* PI_STATUS_REG */ + nop + andi k0, k0, 3 /* (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY) */ + bnez k0, w + nop + la k0, 0xBFF00050 + jr k0 + nop +.set reorder +END(__isExp) + + +LEAF(MonitorInitBreak); .set noreorder + nop + nop +INIT_BREAK_POSITION: + break 4 + nop + nop + nop + jr ra + nop +.set reorder +END(MonitorInitBreak) + +#endif diff --git a/lib/hackerlibultra/src/os/ackramromread.c b/lib/hackerlibultra/src/os/ackramromread.c new file mode 100644 index 00000000..992a4f7b --- /dev/null +++ b/lib/hackerlibultra/src/os/ackramromread.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" +#include "PR/os_version.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +void osAckRamromRead(void) { +} diff --git a/lib/hackerlibultra/src/os/ackramromwrite.c b/lib/hackerlibultra/src/os/ackramromwrite.c new file mode 100644 index 00000000..32301ab8 --- /dev/null +++ b/lib/hackerlibultra/src/os/ackramromwrite.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +void osAckRamromWrite(void) { +} diff --git a/lib/hackerlibultra/src/os/afterprenmi.c b/lib/hackerlibultra/src/os/afterprenmi.c new file mode 100644 index 00000000..75682512 --- /dev/null +++ b/lib/hackerlibultra/src/os/afterprenmi.c @@ -0,0 +1,5 @@ +#include "PR/os_internal.h" + +s32 osAfterPreNMI(void) { + return __osSpSetPc(0); +} diff --git a/lib/hackerlibultra/src/os/atomic.c b/lib/hackerlibultra/src/os/atomic.c new file mode 100644 index 00000000..a0bd8fec --- /dev/null +++ b/lib/hackerlibultra/src/os/atomic.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" + +int __osAtomicDec(unsigned int* p) { + u32 mask; + int result; + + mask = __osDisableInt(); + if (*p) { + (*p)--; + result = 1; + } else { + result = 0; + } + __osRestoreInt(mask); + return result; +} diff --git a/lib/hackerlibultra/src/os/createmesgqueue.c b/lib/hackerlibultra/src/os/createmesgqueue.c new file mode 100644 index 00000000..72209b9c --- /dev/null +++ b/lib/hackerlibultra/src/os/createmesgqueue.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" + +void osCreateMesgQueue(OSMesgQueue* mq, OSMesg* msg, s32 msgCount) { + +#ifdef _DEBUG + if (msgCount <= 0) { + __osError(ERR_OSCREATEMESGQUEUE, 1, msgCount); + return; + } +#endif + + mq->mtqueue = (OSThread*)&__osThreadTail.next; + mq->fullqueue = (OSThread*)&__osThreadTail.next; + mq->validCount = 0; + mq->first = 0; + mq->msgCount = msgCount; + mq->msg = msg; +} diff --git a/lib/hackerlibultra/src/os/createthread.c b/lib/hackerlibultra/src/os/createthread.c new file mode 100644 index 00000000..927ef0e3 --- /dev/null +++ b/lib/hackerlibultra/src/os/createthread.c @@ -0,0 +1,54 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" + +extern __OSThreadprofile_s thprof[]; + +void osCreateThread(OSThread* t, OSId id, void (*entry)(void*), void* arg, void* sp, OSPri p) { + register u32 saveMask; + OSIntMask mask; + +#ifdef _DEBUG + if ((u32)sp & 0x7) { + __osError(ERR_OSCREATETHREAD_SP, 1, sp); + return; + } + + if ((p < OS_PRIORITY_IDLE) || (p > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATETHREAD_PRI, 1, p); + return; + } +#endif + + t->id = id; + t->priority = p; + t->next = NULL; + t->queue = NULL; + t->context.pc = (u32)entry; + t->context.a0 = (s64)(s32)arg; // Double cast gets rid of compiler warning + t->context.sp = (s64)(s32)sp - 16; + t->context.ra = (s64)(s32)__osCleanupThread; + mask = OS_IM_ALL; + t->context.sr = (mask & (SR_IMASK | SR_IE)) | SR_EXL; + t->context.rcp = (mask & RCP_IMASK) >> RCP_IMASKSHIFT; + t->context.fpcsr = FPCSR_FS | FPCSR_EV | FPCSR_RM_RN; + t->fp = 0; + t->state = OS_STATE_STOPPED; + t->flags = 0; + +#if BUILD_VERSION >= VERSION_K +#ifndef _FINALROM + if (id < THPROF_IDMAX) { + t->thprof = &thprof[id]; + } else { + t->thprof = &thprof[THPROF_IDMAX - 1]; + } +#endif +#endif + + saveMask = __osDisableInt(); + t->tlnext = __osActiveQueue; + __osActiveQueue = t; + __osRestoreInt(saveMask); +} diff --git a/lib/ultra/os/destroythread.c b/lib/hackerlibultra/src/os/destroythread.c similarity index 79% rename from lib/ultra/os/destroythread.c rename to lib/hackerlibultra/src/os/destroythread.c index 255242d4..5442e861 100644 --- a/lib/ultra/os/destroythread.c +++ b/lib/hackerlibultra/src/os/destroythread.c @@ -1,10 +1,10 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PRinternal/osint.h" -void osDestroyThread(OSThread *t) { - register s32 saveMask; - register OSThread *pred; - register OSThread *succ; +void osDestroyThread(OSThread* t) { + register u32 saveMask; + register OSThread* pred; + register OSThread* succ; saveMask = __osDisableInt(); @@ -17,8 +17,8 @@ void osDestroyThread(OSThread *t) { if (__osActiveQueue == t) { __osActiveQueue = __osActiveQueue->tlnext; } else { +#if BUILD_VERSION >= VERSION_J || !defined(__GNUC__) pred = __osActiveQueue; -#if LIBULTRA_VERSION >= OS_VER_J while (pred->priority != -1) { succ = pred->tlnext; if (succ == t) { @@ -28,6 +28,7 @@ void osDestroyThread(OSThread *t) { pred = succ; } #else + pred = __osActiveQueue; succ = pred->tlnext; while (succ != NULL) { if (succ == t) { diff --git a/lib/ultra/os/exceptasm.h b/lib/hackerlibultra/src/os/exceptasm.h similarity index 51% rename from lib/ultra/os/exceptasm.h rename to lib/hackerlibultra/src/os/exceptasm.h index c060bed9..f74630d5 100644 --- a/lib/ultra/os/exceptasm.h +++ b/lib/hackerlibultra/src/os/exceptasm.h @@ -1,27 +1,29 @@ #ifndef _EXCEPTASM_H #define _EXCEPTASM_H +#include "PR/os_version.h" + #define MESG(type) (type << 3) -#define MQ_MTQUEUE 0 -#define MQ_FULLQUEUE 4 +#define MQ_MTQUEUE 0 +#define MQ_FULLQUEUE 4 #define MQ_VALIDCOUNT 8 -#define MQ_FIRST 12 -#define MQ_MSGCOUNT 16 -#define MQ_MSG 20 +#define MQ_FIRST 12 +#define MQ_MSGCOUNT 16 +#define MQ_MSG 20 #define OS_EVENTSTATE_MESSAGE_QUEUE 0 -#define OS_EVENTSTATE_MESSAGE 4 +#define OS_EVENTSTATE_MESSAGE 4 /* __osHwInt struct member offsets */ #define HWINTR_CALLBACK 0x00 #define HWINTR_SP 0x04 /* __osHwInt struct size */ -#if LIBULTRA_VERSION >= OS_VER_J -#define HWINTR_SIZE 0x8 +#if BUILD_VERSION >= VERSION_J +#define HWINTR_SIZE 0x8 #else -#define HWINTR_SIZE 0x4 +#define HWINTR_SIZE 0x4 #endif #endif diff --git a/lib/hackerlibultra/src/os/exceptasm.s b/lib/hackerlibultra/src/os/exceptasm.s new file mode 100644 index 00000000..919482e7 --- /dev/null +++ b/lib/hackerlibultra/src/os/exceptasm.s @@ -0,0 +1,1343 @@ +#ifdef MODERN_CC +.set gp=64 +#endif + +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/os.h" +#include "PR/rcp.h" +#include "PR/rdb.h" +#include "exceptasm.h" +#include "threadasm.h" +#include "PR/os_version.h" + +#define KMC_CODE_ENTRY 0xBFF00014 +#define KMC_WPORT 0xBFF08000 +#define KMC_STAT 0xBFF08004 + +.rdata + +#define REDISPATCH 0x00 +#define SW1 0x04 +#define SW2 0x08 +#define RCP 0x0c +#define CART 0x10 +#define PRENMI 0x14 +#define IP6_HDLR 0x18 +#define IP7_HDLR 0x1c +#define COUNTER 0x20 + +__osIntOffTable: + .byte REDISPATCH + .byte PRENMI + .byte IP6_HDLR + .byte IP6_HDLR + .byte IP7_HDLR + .byte IP7_HDLR + .byte IP7_HDLR + .byte IP7_HDLR + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte COUNTER + .byte REDISPATCH + .byte SW1 + .byte SW2 + .byte SW2 + .byte RCP + .byte RCP + .byte RCP + .byte RCP + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + .byte CART + +__osIntTable: + .word redispatch, sw1, sw2, rcp, cart, prenmi, IP6_Hdlr, IP7_Hdlr, counter + +#ifndef _FINALROM +EXPORT(__osCauseTable_pt) + .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 + .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 +#endif + +.data + +#if BUILD_VERSION >= VERSION_J +EXPORT(__osHwIntTable) + .word 0, 0 + .word 0, 0 + .word 0, 0 + .word 0, 0 + .word 0, 0 + +EXPORT(__osPiIntTable) + .word 0, 0 +#else +EXPORT(__osHwIntTable) + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 +#endif + +#ifndef _FINALROM +__osRdb_DbgRead_Ct: + .word 0 + +__osRdb_Mesg: + .word 0 + +__os_Kdebug_Pkt: + .word 0 + +#if BUILD_VERSION >= VERSION_K +__osPreviousThread: + .word 0 +#endif +#endif + +.text + +/** + * The exception preamble is copied to the exception vectors at + * UT_VEC, XUT_VEC, ECC_VEC, E_VEC, to direct execution to __osException + */ +LEAF(__osExceptionPreamble) + la k0, __osException + jr k0 +END(__osExceptionPreamble) + +#ifndef _FINALROM +LEAF(__ptExceptionPreamble) +.set noreorder + sw k0, -0x10(sp) + b pt_next + lui k0, %hi(__ptException) + nop + nop +pt_next: + addiu k0, k0, %lo(__ptException) + jr k0 + nop +.set reorder +END(__ptExceptionPreamble) + +LEAF(__ptException) +.set noreorder + mfc0 k0, C0_CAUSE + andi k0, k0, 0x7c + bnez k0, pt_not_Int + srl k0, k0, 2 + mfc0 k0, C0_CAUSE + nop + andi k0, k0, CAUSE_IP7 + beqz k0, __osException + nop + j pt_break + nop +pt_not_Int: + sw k1, -8(sp) + /* determine if the pt exception handler should deal with this cause */ + la k1, __osCauseTable_pt + add k1, k1, k0 + lbu k0, (k1) + beqz k0, __osException + nop +pt_break: +pi_ok_loop: + lw k0, PHYS_TO_K1(PI_STATUS_REG) + nop + andi k0, k0, (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY) + bnez k0, pi_ok_loop + nop + lw k0, KMC_STAT + nop + andi k0, k0, 8 + bnez k0, pt_prof + li k0, KMC_CODE_ENTRY + lw k1, -8(sp) + jr k0 + addiu sp, sp, -0x60 +pt_prof: + mfc0 k0, C0_EPC + /* the following two ways is a (necessarily) messy way to write "sw k0, KMC_WPORT" without using at */ + lui k1, (KMC_WPORT >> 16 + 1) + sw k0, -(KMC_WPORT & 0xFFFF)(k1) + lw k1, -8(sp) + lw k0, -0x10(sp) + eret + nop +.set reorder +END(__ptException) +#endif + +LEAF(__osException) + /* Load scratch space for thread saving */ + la k0, __osThreadSave + /* Save AT */ +.set noat + sd $1, THREAD_GP1(k0); +.set at + /* Save SR */ + MFC0( k1, C0_SR) + sw k1, THREAD_SR(k0) + /* Disable interrupts */ + and k1, k1, ~(SR_IE | SR_EXL) + MTC0( k1, C0_SR) + /* Save some temp registers for use in the following */ + sd $8, THREAD_GP8(k0) + sd $9, THREAD_GP9(k0) + sd $10, THREAD_GP10(k0) + /* Mark FPU as unused */ + sw zero, THREAD_FP(k0) + /* This instruction is useless, leftover because of bad placement of an ifdef for the debug version */ + MFC0( t0, C0_CAUSE) +#ifndef _FINALROM + lw t2, __kmc_pt_mode + bnez t2, skip_kmc_mode + andi t1, t0, 0x7c + li t2, 0 + bne t1, t2, savecontext + and t1, k1, t0 + andi t2, t1, CAUSE_IP7 + beqz t2, notIP7 + /* clear rdb write interrupt */ + la t1, RDB_WRITE_INTR_REG + sw zero, (t1) +IP7check: + MFC0( t0, C0_CAUSE) + andi t0, t0, CAUSE_IP7 + bne zero, t0, IP7check + la t2, RDB_BASE_REG + lw t0, (t2) + srl t1, t0, 0x1a + andi t1, t1, 0x3f + li t2, RDB_TYPE_HtoG_DATA + beq t1, t2, HandData + li t2, RDB_TYPE_HtoG_DEBUG + beq t1, t2, HandDbg + li t2, RDB_TYPE_HtoG_KDEBUG + beq t1, t2, HandKDebug + li t2, RDB_TYPE_HtoG_DEBUG_CT + beq t1, t2, DbgCnt + li t2, RDB_TYPE_HtoG_DATA_DONE + beq t1, t2, DataRead + li t2, RDB_TYPE_HtoG_LOG_DONE + beq t1, t2, LogRead + li t2, RDB_TYPE_HtoG_REQ_RAMROM + beq t1, t2, ReqRamrom + li t2, RDB_TYPE_HtoG_FREE_RAMROM + beq t1, t2, FreeRamrom + li t2, RDB_TYPE_HtoG_PROF_SIGNAL + beq t1, t2, SignalProf + b rdbout +SignalProf: + li t2, 1 + srl t1, t0, 0x10 + andi t1, t1, 0xff + beq t1, t2, AckProf + li t2, 0xa8 + sw t2, __osRdb_Mesg + b savecontext +AckProf: + li t2, 0xb0 + sw t2, __osRdb_Mesg + b savecontext +HandKDebug: + sw t0, __os_Kdebug_Pkt + b savecontext +DbgCnt: + li t2, 0xffffff + and t1, t0, t2 + sw t1, __osRdb_DbgRead_Ct + b rdbout +DataRead: + li t2, 0x88 + sw t2, __osRdb_Mesg + b savecontext +LogRead: + li t2, 0x80 + sw t2, __osRdb_Mesg + b savecontext +ReqRamrom: + li t2, 0x90 + sw t2, __osRdb_Mesg + b savecontext +FreeRamrom: + li t2, 0x98 + sw t2, __osRdb_Mesg + b savecontext +HandData: + srl t1, t0, 0x18 + andi t1, t1, 3 + beq zero, t1, rdbout + lw t2, __osRdb_Read_Data_Ct + subu t2, t2, t1 + sw t2, __osRdb_Read_Data_Ct + sd t3, THREAD_GP11(k0) + lw t3, __osRdb_Read_Data_Buf + srl t2, t0, 0x10 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneData + srl t2, t0, 8 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneData + andi t0, t0, 0xff + sb t0, (t3) + addi t3, t3, 1 +doneData: + sw t3, __osRdb_Read_Data_Buf + ld t3, THREAD_GP11(k0) + lw t2, __osRdb_Read_Data_Ct + bne zero, t2, rdbout + li t2, 0x78 + sw t2, __osRdb_Mesg + b savecontext +HandDbg: + srl t1, t0, 0x18 + andi t1, t1, 3 + beq zero, t1, rdbout + lw t2, __osRdb_DbgRead_Ct + subu t2, t2, t1 + sw t2, __osRdb_DbgRead_Ct + sd t3, THREAD_GP11(k0) + lw t3, __osRdb_DbgRead_Buf + bne zero, t3, 1f + ld t3, THREAD_GP11(k0) + b rdbout +1: + srl t2, t0, 0x10 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneDbg + srl t2, t0, 8 + andi t2, t2, 0xff + sb t2, (t3) + addi t3, t3, 1 + addi t1, t1, -1 + beq zero, t1, doneDbg + andi t0, t0, 0xff + sb t0, (t3) + addi t3, t3, 1 +doneDbg: + sw t3, __osRdb_DbgRead_Buf + ld t3, THREAD_GP11(k0) + lw t2, __osRdb_DbgRead_Ct + bne zero, t2, rdbout + li t2, 0xa0 + sw t2, __osRdb_Mesg + b savecontext +notIP7: + andi t2, t1, CAUSE_IP6 + beqz t2, savecontext + /* clear rdb read interrupt */ + la t1, RDB_READ_INTR_REG + sw zero, (t1) + lw t2, __osRdb_IP6_Ct + bnez t2, 2f + li t2, 1 + sw t2, __osRdb_IP6_Empty + b rdbout +2: + addi t2, t2, -1 + sw t2, __osRdb_IP6_Ct + lw t0, __osRdb_IP6_Data + lw t1, __osRdb_IP6_CurSend + sll t2, t1, 2 + add t0, t2, t0 + lw t2, (t0) + addi t1, t1, 1 + lw t0, __osRdb_IP6_Size + sub t0, t0, t1 + bgtz t0, 5f + li t1, 0 +5: + sw t1, __osRdb_IP6_CurSend +checkIP6: + MFC0( t0, C0_CAUSE) + andi t0, t0, CAUSE_IP6 + bne zero, t0, checkIP6 + la t0, RDB_BASE_REG + sw t2, (t0) +rdbout: + ld t0, THREAD_GP8(k0) + ld t1, THREAD_GP9(k0) + ld t2, THREAD_GP10(k0) +.set noat + ld $1, THREAD_GP1(k0) +.set at + lw k1, THREAD_SR(k0) + MTC0( k1, C0_SR) +.set noreorder + nop + nop + nop + nop + eret +.set reorder + +skip_kmc_mode: +#endif + +savecontext: + /* Save the context of the previously running thread to be restored when it resumes */ + move t0, k0 + lw k0, __osRunningThread +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + sw k0, __osPreviousThread +#endif + ld t1, THREAD_GP1(t0) + sd t1, THREAD_GP1(k0) + ld t1, THREAD_SR(t0) + sd t1, THREAD_SR(k0) + ld t1, THREAD_GP8(t0) + sd t1, THREAD_GP8(k0) + ld t1, THREAD_GP9(t0) + sd t1, THREAD_GP9(k0) + ld t1, THREAD_GP10(t0) + sd t1, THREAD_GP10(k0) +3: + sd $2, THREAD_GP2(k0) + sd $3, THREAD_GP3(k0) + sd $4, THREAD_GP4(k0) + sd $5, THREAD_GP5(k0) + sd $6, THREAD_GP6(k0) + sd $7, THREAD_GP7(k0) + sd $11, THREAD_GP11(k0) + sd $12, THREAD_GP12(k0) + sd $13, THREAD_GP13(k0) + sd $14, THREAD_GP14(k0) + sd $15, THREAD_GP15(k0) + sd $16, THREAD_GP16(k0) + sd $17, THREAD_GP17(k0) + sd $18, THREAD_GP18(k0) + sd $19, THREAD_GP19(k0) + sd $20, THREAD_GP20(k0) + sd $21, THREAD_GP21(k0) + sd $22, THREAD_GP22(k0) + sd $23, THREAD_GP23(k0) + sd $24, THREAD_GP24(k0) + sd $25, THREAD_GP25(k0) + sd $28, THREAD_GP28(k0) + sd $29, THREAD_GP29(k0) + sd $30, THREAD_GP30(k0) + sd $31, THREAD_GP31(k0) + + mflo t0 + sd t0, THREAD_LO(k0) + mfhi t0 + sd t0, THREAD_HI(k0) + + lw k1, THREAD_SR(k0) + andi t1, k1, SR_IMASK + beqz t1, savercp + + /* + * If any CPU interrupts are enabled in the SR of the previous thread, bitwise-OR in the + * disabled CPU interrupts from the global interrupt mask. + * This is an attempt at reverting the effect of masking the SR of the thread with the + * global interrupt mask. This is however broken, see comments for osSetIntMask. + */ + la t0, __OSGlobalIntMask + lw t0, 0(t0) + xor t2, t0, ~0 /* not except not using not */ + andi t2, t2, SR_IMASK + or ta0, t1, t2 + and t3, k1, ~SR_IMASK + or t3, t3, ta0 + sw t3, THREAD_SR(k0) + andi t0, t0, SR_IMASK + and t1, t1, t0 + and k1, k1, ~SR_IMASK + or k1, k1, t1 +savercp: + + /* Save the currently masked RCP interrupts. */ + lw t1, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz t1, endrcp + + /* + * Similar to the above comment, but for RCP interrupt enable bits rather than CPU. + * This suffers from the same problem as above. + */ + la t0, __OSGlobalIntMask + lw t0, 0(t0) + + srl t0, t0, 0x10 + xor t0, t0, ~0 + andi t0, t0, 0x3f + lw ta0, THREAD_RCP(k0) + and t0, t0, ta0 + or t1, t1, t0 +endrcp: + sw t1, THREAD_RCP(k0) + MFC0( t0, C0_EPC) + sw t0, THREAD_PC(k0) + lw t0, THREAD_FP(k0) + beqz t0, 1f + /* Save FP Registers if FPU was used by the thread */ + CFC1( t0, fcr31) + NOP + sw t0, THREAD_FPCSR(k0) + sdc1 $f0, THREAD_FP0(k0) + sdc1 $f2, THREAD_FP2(k0) + sdc1 $f4, THREAD_FP4(k0) + sdc1 $f6, THREAD_FP6(k0) + sdc1 $f8, THREAD_FP8(k0) + sdc1 $f10, THREAD_FP10(k0) + sdc1 $f12, THREAD_FP12(k0) + sdc1 $f14, THREAD_FP14(k0) + sdc1 $f16, THREAD_FP16(k0) + sdc1 $f18, THREAD_FP18(k0) + sdc1 $f20, THREAD_FP20(k0) + sdc1 $f22, THREAD_FP22(k0) + sdc1 $f24, THREAD_FP24(k0) + sdc1 $f26, THREAD_FP26(k0) + sdc1 $f28, THREAD_FP28(k0) + sdc1 $f30, THREAD_FP30(k0) +1: + /* + * Determine the cause of the exception or interrupt and + * enter appropriate handling routine + */ + MFC0( t0, C0_CAUSE) + sw t0, THREAD_CAUSE(k0) + +.set noreorder + li t1, OS_STATE_RUNNABLE + sh t1, THREAD_STATE(k0) +.set reorder + +#ifndef _FINALROM + lw a0, __os_Kdebug_Pkt + beqz a0, no_kdebug + sw zero, __os_Kdebug_Pkt + jal kdebugserver + b __osDispatchThreadSave +no_kdebug: + lw a0, __osRdb_Mesg + beqz a0, no_rdb_mesg + sw zero, __osRdb_Mesg + jal send_mesg + lw t0, 0x120(k0) +no_rdb_mesg: +#endif + + andi t1, t0, CAUSE_EXCMASK + /* Test for break exception */ + li t2, EXC_BREAK + beq t1, t2, handle_break + + /* Test for CpU (coprocessor unusable) exception */ + li t2, EXC_CPU + beq t1, t2, handle_CpU + + /* Test for interrupt, if it is not an interrupt, panic */ + li t2, EXC_INT + bne t1, t2, panic +handle_interrupt: + and s0, k1, t0 +next_interrupt: + /* + * Handle external interrupt causes, using a jump table + * to enter into the appropriate handler + */ + andi t1, s0, SR_IMASK + srl t2, t1, 0xc + bnez t2, 1f + + srl t2, t1, SR_IMASKSHIFT + addi t2, t2, 16 +1: + + lbu t2, __osIntOffTable(t2) + + lw t2, __osIntTable(t2) + jr t2 + +/** + * IP6 Interrupt + * Only signalled by development hardware + */ +IP6_Hdlr: + /* Mask out interrupt and continue */ + and s0, s0, ~CAUSE_IP6 + b next_interrupt + +/** + * IP7 Interrupt + * Only signalled by development hardware + */ +IP7_Hdlr: + /* Mask out interrupt and continue */ + and s0, s0, ~CAUSE_IP7 + b next_interrupt + +/** + * IP8/Counter Interrupt + * Once the cop0 count register reaches the value of the + * cop0 compare register, this interrupt is triggered + */ +counter: + MFC0( t1, C0_COMPARE) + MTC0( t1, C0_COMPARE) + li a0, MESG(OS_EVENT_COUNTER) + /* Post counter message */ + jal send_mesg + /* Mask out interrupt and continue */ + and s0, s0, ~CAUSE_IP8 + b next_interrupt + +/** + * IP4/Cartridge Interrupt + * Signalled by the N64 Disk Drive + */ +cart: +#if BUILD_VERSION >= VERSION_J + /* Mask out interrupt */ + and s0, s0, ~CAUSE_IP4 + /* Load cart callback set by __osSetHWIntrRoutine */ + la t1, __osHwIntTable + add t1, HWINTR_SIZE + lw t2, HWINTR_CALLBACK(t1) + + /* If the callback is NULL, handling is done */ + beqz t2, 1f + + /* Set up a stack and run the callback */ + lw sp, HWINTR_SP(t1) + jalr t2 + + beqz v0, 1f + /* Redispatch immediately if the callback returned nonzero */ + b redispatch + +1: + /* Post a cart event message */ + li a0, MESG(OS_EVENT_CART) + jal send_mesg + /* Continue */ + b next_interrupt +#else + li a0, MESG(OS_EVENT_CART) + /* Mask out interrupt */ + and s0, s0, ~CAUSE_IP4 + la sp, leoDiskStack + addiu sp, 0x1000 - 0x10 # Stack size minus initial frame + /* Load cart callback set by __osSetHWIntrRoutine */ + li t2, HWINTR_SIZE + lw t2, __osHwIntTable(t2) + + /* If the callback is NULL, handling is done */ + beqz t2, 1f + + /* Set up a stack and run the callback */ + jalr t2 + li a0, MESG(OS_EVENT_CART) + + beqz v0, 1f + /* Redispatch immediately if the callback returned nonzero */ + b redispatch + +1: + /* Post a cart event message */ + jal send_mesg + /* Continue */ + b next_interrupt +#endif + +/** + * IP3/RCP Interrupt + * Signalled by the RCP for various reasons, described below + */ +rcp: + /* + * Load the MI interrupts and mask with the RCP bits in the global interrupt mask + * + * @bug this clobbers the t0 register which is expected to hold the value of the + * C0_CAUSE register in the sw1 and sw2 handlers. If the sw1 or sw2 handler runs + * after this, the interrupt will not be cleared properly. + */ + lw s1, PHYS_TO_K1(MI_INTR_REG) + la t0, __OSGlobalIntMask + lw t0, (t0) + + srl t0, t0, 0x10 + and s1, s1, t0 + +/** + * Signal Processor (SP) Interrupt + */ + /* Test for sp interrupt */ + andi t1, s1, MI_INTR_SP + beqz t1, vi + + /* Test for yielded or done signals in particular */ + + /* Mask out SP interrupt */ + andi s1, s1, (MI_INTR_SI | MI_INTR_AI | MI_INTR_VI | MI_INTR_PI | MI_INTR_DP) + lw ta0, PHYS_TO_K1(SP_STATUS_REG) + li t1, (SP_CLR_INTR | SP_CLR_SIG3) + + /* Clear interrupt and signal 3 */ + sw t1, PHYS_TO_K1(SP_STATUS_REG) + andi ta0, ta0, (SP_STATUS_YIELDED | SP_STATUS_TASKDONE) + beqz ta0, sp_other_break + + /* Post an SP event message */ + li a0, MESG(OS_EVENT_SP) + jal send_mesg + + beqz s1, NoMoreRcpInts + + /* Step over sp_other_break handler */ + b vi + +sp_other_break: + /* + * An sp signal that is not due to yielding or task completion, such as + * an sp breakpoint. Post a different event message + */ + li a0, MESG(OS_EVENT_SP_BREAK) + jal send_mesg + + beqz s1, NoMoreRcpInts + +/** + * Video Interface (VI) Interrupt + */ +vi: + /* Test for vi interrupt */ + andi t1, s1, MI_INTR_VI + beqz t1, ai + + /* Mask out vi interrupt */ + andi s1, s1, (MI_INTR_SP | MI_INTR_SI | MI_INTR_AI | MI_INTR_PI | MI_INTR_DP) + + /* Clear interrupt */ + sw zero, PHYS_TO_K1(VI_CURRENT_REG) + + /* Post vi event message */ + li a0, MESG(OS_EVENT_VI) + jal send_mesg + beqz s1, NoMoreRcpInts + +/** + * Audio Interface (AI) Interrupt + */ +ai: + /* Test for ai interrupt */ + andi t1, s1, MI_INTR_AI + beqz t1, si + + /* Mask out ai interrupt */ + andi s1, s1, (MI_INTR_SP | MI_INTR_SI | MI_INTR_VI | MI_INTR_PI | MI_INTR_DP) + + li t1, 1 + /* Clear interrupt */ + sw t1, PHYS_TO_K1(AI_STATUS_REG) + + /* Post ai event message */ + li a0, MESG(OS_EVENT_AI) + jal send_mesg + beqz s1, NoMoreRcpInts + +/** + * Serial Interface (SI) Interrupt + */ +si: + /* Test for si interrupt */ + andi t1, s1, MI_INTR_SI + beqz t1, pi + + /* Mask out si interrupt */ + andi s1, s1, (MI_INTR_SP | MI_INTR_AI | MI_INTR_VI | MI_INTR_PI | MI_INTR_DP) + /* Clear interrupt */ + sw zero, PHYS_TO_K1(SI_STATUS_REG) + + /* Post si event message */ + li a0, MESG(OS_EVENT_SI) + jal send_mesg + beqz s1, NoMoreRcpInts + +/** + * Parallel Interface (PI) Interrupt + */ +pi: + /* Test for pi interrupt */ + andi t1, s1, MI_INTR_PI + beqz t1, dp + + /* Mask out pi interrupt */ + andi s1, s1, (MI_INTR_SP | MI_INTR_SI | MI_INTR_AI | MI_INTR_VI | MI_INTR_DP) + + /* Clear interrupt */ + li t1, PI_STATUS_CLR_INTR + sw t1, PHYS_TO_K1(PI_STATUS_REG) + +#if BUILD_VERSION >= VERSION_J + /* Load pi callback */ + la t1, __osPiIntTable + lw t2, (t1) + /* Skip callback if NULL */ + beqz t2, 1f + + /* Set up a stack and run the callback */ + lw sp, 4(t1) + move a0, v0 + jalr t2 + + /* If the callback returns non-zero, do not post a pi event message */ + bnez v0, 2f +1: +#endif + /* Post pi event message */ + li a0, MESG(OS_EVENT_PI) + jal send_mesg +#if BUILD_VERSION >= VERSION_J +2: +#endif + beqz s1, NoMoreRcpInts + +/** + * Display Processor (DP) Interrupt + */ +dp: + /* Test for dp interrupt */ + andi t1, s1, MI_INTR_DP + beqz t1, NoMoreRcpInts + + /* Mask out dp interrupt */ + andi s1, s1, (MI_INTR_SP | MI_INTR_SI | MI_INTR_AI | MI_INTR_VI | MI_INTR_PI) + + /* Clear dp interrupt */ + li t1, MI_CLR_DP_INTR + sw t1, PHYS_TO_K1(MI_INIT_MODE_REG) + + /* Post dp event message */ + li a0, MESG(OS_EVENT_DP) + jal send_mesg + +NoMoreRcpInts: + /* Mask out interrupt and continue */ + and s0, s0, ~CAUSE_IP3 + b next_interrupt + +/** + * IP5/PreNMI Interrupt + * Reset button has been pressed + */ +prenmi: + /* Disable IP5/PreNMI interrupt for the previously running thread */ + lw k1, THREAD_SR(k0) + + and k1, k1, ~CAUSE_IP5 + sw k1, THREAD_SR(k0) + /* Test __osShutdown for first PreNMI event */ + la t1, __osShutdown + lw t2, 0(t1) + beqz t2, firstnmi + + /* Mask out interrupt and redispatch immediately */ + and s0, s0, ~CAUSE_IP5 + b redispatch + +firstnmi: + /* Set __osShutdown */ + li t2, 1 + sw t2, (t1) + /* Post a PreNMI event message */ + li a0, MESG(OS_EVENT_PRENMI) + jal send_mesg + + /* Mask out and disable IP5/PreNMI interrupt for the highest priority thread */ + and s0, s0, ~CAUSE_IP5 + lw t2, __osRunQueue + lw k1, THREAD_SR(t2) + and k1, k1, ~CAUSE_IP5 + sw k1, THREAD_SR(t2) + /* Redispatch immediately */ + b redispatch + +sw2: + /* Mask out interrupt */ + and t0, t0, ~CAUSE_SW2 + MTC0( t0, C0_CAUSE) + + /* Post sw2 event message */ + li a0, MESG(OS_EVENT_SW2) + jal send_mesg + + /* Mask out interrupt and continue */ + and s0, s0, ~CAUSE_SW2 + b next_interrupt + +sw1: + /* Mask out interrupt */ + and t0, t0, ~CAUSE_SW1 + MTC0( t0, C0_CAUSE) + + /* Post sw1 event message */ + li a0, MESG(OS_EVENT_SW1) + jal send_mesg + + /* Mask out interrupt and continue */ + and s0, s0, ~CAUSE_SW1 + b next_interrupt + +handle_break: + /* Set last thread as having hit a break exception */ + li t1, OS_FLAG_CPU_BREAK + sh t1, THREAD_FLAGS(k0) + /* Post a cpu break event message */ + li a0, MESG(OS_EVENT_CPU_BREAK) + jal send_mesg + + /* Redispatch */ + b redispatch + +redispatch: + /* Get priority of previously running thread */ + lw t1, THREAD_PRI(k0) + lw t2, __osRunQueue + /* Get highest priority from waiting threads */ + lw t3, THREAD_PRI(t2) + + bge t1, t3, enqueueRunning + + /* + * The previously running thread is no longer the highest priority, + * enqueue it to the run queue to wait its turn again + */ + move a1, k0 + la a0, __osRunQueue + + jal __osEnqueueThread + + j __osDispatchThread + +/** + * Resume the previously running thread by placing it at the top of + * the run queue and dispatching it + */ +enqueueRunning: + la t1, __osRunQueue + lw t2, MQ_MTQUEUE(t1) + sw t2, THREAD_NEXT(k0) + sw k0, MQ_MTQUEUE(t1) + j __osDispatchThread + +/** + * Unhandled exceptions & interrupts end up here, + * trap to software by posting a fault message + */ +panic: + /* Mark the thread as having faulted */ + sw k0, __osFaultedThread + li t1, OS_STATE_STOPPED + sh t1, THREAD_STATE(k0) + li t1, OS_FLAG_FAULT + sh t1, THREAD_FLAGS(k0) + + /* Save C0_BADVADDR */ + MFC0( t2, C0_BADVADDR) + + sw t2, THREAD_BADVADDR(k0) + + /* Post the fault message */ + li a0, MESG(OS_EVENT_FAULT) + jal send_mesg + + /* Dispatch next thread */ + j __osDispatchThread +END(__osException) + +/** + * Handles posting event messages to the listening message queue, if there is one + */ +LEAF(send_mesg) + /* Save return address */ + move s2, ra + + /* Load pointer to listening message queue */ + la t2, __osEventStateTab + addu t2, t2, a0 + lw t1, OS_EVENTSTATE_MESSAGE_QUEUE(t2) + + /* If there is no listening message queue, done */ + beqz t1, send_done + + /* Test if the message queue is full, if so do not post the message */ + lw t3, MQ_VALIDCOUNT(t1) + lw ta0, MQ_MSGCOUNT(t1) + + bge t3, ta0, send_done + + /* Add validcount to first and modulo with msgcount */ + lw ta1, MQ_FIRST(t1) + addu ta1, ta1, t3 + + rem ta1, ta1, ta0 + lw ta0, MQ_MSG(t1) + mul ta1, ta1, 4 + addu ta0, ta0, ta1 + + /* Fetch the message to post */ + lw ta1, OS_EVENTSTATE_MESSAGE(t2) + /* Post the message to the message queue */ + sw ta1, 0(ta0) + /* Increment the validCount */ + addiu t2, t3, 1 + sw t2, MQ_VALIDCOUNT(t1) + /* + * If there was a thread blocked on this message queue, + * wake it up + */ + lw t2, MQ_MTQUEUE(t1) + lw t3, THREAD_NEXT(t2) + beqz t3, send_done + + move a0, t1 + jal __osPopThread + + move t2, v0 + + move a1, t2 + la a0, __osRunQueue + jal __osEnqueueThread +send_done: + jr s2 +END(send_mesg) + +/** + * Handle coprocessor unusable exception + */ +LEAF(handle_CpU) + and t1, t0, CAUSE_CEMASK + srl t1, t1, CAUSE_CESHIFT + /* if not coprocessor 1, panic */ + li t2, 1 + bne t1, t2, panic + + /* Mark cop1 as usable for previous thread */ + li t1, 1 + sw t1, THREAD_FP(k0) + lw k1, THREAD_SR(k0) + or k1, k1, SR_CU1 + sw k1, THREAD_SR(k0) + b enqueueRunning +END(handle_CpU) + +/** + * void __osEnqueueAndYield(OSThread** threadQueue); + * + * Voluntary thread yielding. + * Enqueues the currently running thread to the top of the + * thread queue `threadQueue` and yields to the highest priority + * unblocked runnable thread. + */ +LEAF(__osEnqueueAndYield) + lw a1, __osRunningThread +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + sw a1, __osPreviousThread +#endif + /* Save SR */ + MFC0( t0, C0_SR) + ori t0, t0, SR_EXL + sw t0, THREAD_SR(a1) + + /* Save callee-saved registers */ + sd s0, THREAD_GP16(a1) + sd s1, THREAD_GP17(a1) + sd s2, THREAD_GP18(a1) + sd s3, THREAD_GP19(a1) + sd s4, THREAD_GP20(a1) + sd s5, THREAD_GP21(a1) + sd s6, THREAD_GP22(a1) + sd s7, THREAD_GP23(a1) + sd gp, THREAD_GP28(a1) + sd sp, THREAD_GP29(a1) + sd s8, THREAD_GP30(a1) + sd ra, THREAD_GP31(a1) + sw ra, THREAD_PC(a1) + + /* Save FPU callee-saved registers if the current thread has used the FPU */ + lw k1, THREAD_FP(a1) + beqz k1, 1f + cfc1 k1, fcr31 + sw k1, THREAD_FPCSR(a1) + sdc1 $f20, THREAD_FP20(a1) + sdc1 $f22, THREAD_FP22(a1) + sdc1 $f24, THREAD_FP24(a1) + sdc1 $f26, THREAD_FP26(a1) + sdc1 $f28, THREAD_FP28(a1) + sdc1 $f30, THREAD_FP30(a1) +1: + lw k1, THREAD_SR(a1) + andi t1, k1, SR_IMASK + beqz t1, 2f + + /* + * This code does the same thing as the block just above the `savercp` label. + * See the comment there for more about this. + */ + la t0, __OSGlobalIntMask + lw t0, 0(t0) + xor t0, t0, ~0 + andi t0, t0, SR_IMASK + or t1, t1, t0 + and k1, k1, ~SR_IMASK + or k1, k1, t1 + sw k1, THREAD_SR(a1) +2: + lw k1, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz k1, 3f + + /* + * This code does the same thing as the block just below the `savercp` label. + * See the comment there for more about this. + */ + la k0, __OSGlobalIntMask + lw k0, 0(k0) + + srl k0, k0, RCP_IMASKSHIFT + xor k0, k0, ~0 + andi k0, k0, (RCP_IMASK >> RCP_IMASKSHIFT) + lw t0, THREAD_RCP(a1) + and k0, k0, t0 + or k1, k1, k0 +3: + /* + * If the specified thread queue is null, skip + * straight to dispatching + */ + sw k1, THREAD_RCP(a1) + beqz a0, noEnqueue + jal __osEnqueueThread +noEnqueue: + j __osDispatchThread +END(__osEnqueueAndYield) + +/** + * void __osEnqueueThread(OSThread** threadQueue, OSThread* thread); + * + * Enqueues `thread` to the thread queue `threadQueue`, inserted by priority + */ +LEAF(__osEnqueueThread) + move t9, a0 + lw t8, 0(a0) + lw ta3, THREAD_PRI(a1) + lw ta2, THREAD_PRI(t8) + /* + * If the current highest priority thread is a lower priority than + * the new thread, skip searching the queue + */ + blt ta2, ta3, 2f +1: + /* + * Search the queue for the position to insert the thread to maintain + * ordering by priority + */ + move t9, t8 + lw t8, THREAD_NEXT(t8) + lw ta2, THREAD_PRI(t8) + bge ta2, ta3, 1b +2: + /* Insert the thread into the queue */ + lw t8, THREAD_NEXT(t9) + sw t8, THREAD_NEXT(a1) + sw a1, THREAD_NEXT(t9) + sw a0, THREAD_QUEUE(a1) + jr ra +END(__osEnqueueThread) + +/** + * OSThread* __osPopThread(OSThread** threadQueue); + * + * Pops the highest priority thread from the top of the + * thread queue `threadQueue` and returns it + */ +LEAF(__osPopThread) + lw v0, 0(a0) /* a0 is OSThread** */ + lw t9, THREAD_NEXT(v0) + sw t9, 0(a0) + jr ra +END(__osPopThread) + +#if BUILD_VERSION >= VERSION_K +LEAF(__osNop) + jr ra +END(__osNop) +#endif + +/** + * void __osDispatchThread(void); + * + * Dispatches the next thread to run after restoring the context + */ +LEAF(__osDispatchThread) + /* Obtain highest priority thread from the active run queue */ + la a0, __osRunQueue + jal __osPopThread + /* Set thread as running */ + sw v0, __osRunningThread + li t0, OS_STATE_RUNNING + sh t0, THREAD_STATE(v0) + /* + * Restore SR, masking out any interrupts that are not also + * enabled in the global interrupt mask + */ + move k0, v0 + +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + la t0, __osThprofFunc + lw t0, (t0) + beqz t0, __osDispatchThreadSave +1: + lw a0, __osPreviousThread + lw sp, __osThprofStack + jalr t0 +#endif + +/* There is another 1: label somewhere around here in version J and below */ +#if BUILD_VERSION < VERSION_K +1: +#endif + +__osDispatchThreadSave: + lw k1, THREAD_SR(k0) + la t0, __OSGlobalIntMask + lw t0, 0(t0) + andi t0, t0, SR_IMASK + andi t1, k1, SR_IMASK + and t1, t1, t0 + and k1, k1, ~SR_IMASK + or k1, k1, t1 + MTC0( k1, C0_SR) +/* Restore GPRs */ +.set noat + ld $1, THREAD_GP1(k0) +.set at + ld $2, THREAD_GP2(k0) + ld $3, THREAD_GP3(k0) + ld $4, THREAD_GP4(k0) + ld $5, THREAD_GP5(k0) + ld $6, THREAD_GP6(k0) + ld $7, THREAD_GP7(k0) + ld $8, THREAD_GP8(k0) + ld $9, THREAD_GP9(k0) + ld $10, THREAD_GP10(k0) + ld $11, THREAD_GP11(k0) + ld $12, THREAD_GP12(k0) + ld $13, THREAD_GP13(k0) + ld $14, THREAD_GP14(k0) + ld $15, THREAD_GP15(k0) + ld $16, THREAD_GP16(k0) + ld $17, THREAD_GP17(k0) + ld $18, THREAD_GP18(k0) + ld $19, THREAD_GP19(k0) + ld $20, THREAD_GP20(k0) + ld $21, THREAD_GP21(k0) + ld $22, THREAD_GP22(k0) + ld $23, THREAD_GP23(k0) + ld $24, THREAD_GP24(k0) + ld $25, THREAD_GP25(k0) + ld $28, THREAD_GP28(k0) + ld $29, THREAD_GP29(k0) + ld $30, THREAD_GP30(k0) + ld $31, THREAD_GP31(k0) + ld k1, THREAD_LO(k0) + mtlo k1 + ld k1, THREAD_HI(k0) + mthi k1 + /* Move thread pc to EPC so that eret will return execution to where the thread left off */ + lw k1, THREAD_PC(k0) + MTC0( k1, C0_EPC) + + /* Check if the FPU was used by this thread and if so also restore the FPU registers */ + lw k1, THREAD_FP(k0) + beqz k1, 1f + + lw k1, THREAD_FPCSR(k0) + CTC1( k1, fcr31) + ldc1 $f0, THREAD_FP0(k0) + ldc1 $f2, THREAD_FP2(k0) + ldc1 $f4, THREAD_FP4(k0) + ldc1 $f6, THREAD_FP6(k0) + ldc1 $f8, THREAD_FP8(k0) + ldc1 $f10, THREAD_FP10(k0) + ldc1 $f12, THREAD_FP12(k0) + ldc1 $f14, THREAD_FP14(k0) + ldc1 $f16, THREAD_FP16(k0) + ldc1 $f18, THREAD_FP18(k0) + ldc1 $f20, THREAD_FP20(k0) + ldc1 $f22, THREAD_FP22(k0) + ldc1 $f24, THREAD_FP24(k0) + ldc1 $f26, THREAD_FP26(k0) + ldc1 $f28, THREAD_FP28(k0) + ldc1 $f30, THREAD_FP30(k0) + +1: + /* + * Restore RCP interrupt mask, masking out any RCP interrupts that + * are not also enabled in the global interrupt mask + */ +.set noreorder + lw k1, THREAD_RCP(k0) + la k0, __OSGlobalIntMask + lw k0, 0(k0) + srl k0, k0, 0x10 + and k1, k1, k0 + sll k1, k1, 0x1 + la k0, __osRcpImTable + addu k1, k1, k0 + lhu k1, 0(k1) + la k0, PHYS_TO_K1(MI_INTR_MASK_REG) + sw k1, 0(k0) + + /* Empty pipeline */ + nop + nop + nop + nop + + /* Resume thread execution */ + eret +.set reorder +END(__osDispatchThread) + +/** + * void __osCleanupThread(void); + * + * When a thread entrypoint function returns, it returns to this function. + * This function is responsible for cleaning up the thread, signalling for the + * current thread to be destroyed. + */ +LEAF(__osCleanupThread) + move a0, zero +#if !defined(BBPLAYER) && !defined(__sgi) + nop +#endif + /* Despite being a jal, this function does not return as the thread will have been destroyed */ + jal osDestroyThread +END(__osCleanupThread) diff --git a/lib/hackerlibultra/src/os/exit.c b/lib/hackerlibultra/src/os/exit.c new file mode 100644 index 00000000..05582c5d --- /dev/null +++ b/lib/hackerlibultra/src/os/exit.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" + +void osExit(void) { + __osGIOInterrupt(16); + + for (;;) { + ; + } +} diff --git a/lib/hackerlibultra/src/os/getactivequeue.c b/lib/hackerlibultra/src/os/getactivequeue.c new file mode 100644 index 00000000..f2fdf5fb --- /dev/null +++ b/lib/hackerlibultra/src/os/getactivequeue.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PRinternal/osint.h" + +OSThread* __osGetActiveQueue(void) { + return __osActiveQueue; +} diff --git a/lib/ultra/os/getcause.s b/lib/hackerlibultra/src/os/getcause.s similarity index 73% rename from lib/ultra/os/getcause.s rename to lib/hackerlibultra/src/os/getcause.s index 873464f0..2c8c503a 100644 --- a/lib/ultra/os/getcause.s +++ b/lib/hackerlibultra/src/os/getcause.s @@ -4,6 +4,6 @@ .text LEAF(__osGetCause) - STAY2(mfc0 v0, C0_CAUSE) - jr ra + MFC0( v0, C0_CAUSE) + jr ra END(__osGetCause) diff --git a/lib/hackerlibultra/src/os/getcompare.s b/lib/hackerlibultra/src/os/getcompare.s new file mode 100644 index 00000000..897c793b --- /dev/null +++ b/lib/hackerlibultra/src/os/getcompare.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetCompare) + MFC0( v0, C0_COMPARE) + jr ra +END(__osGetCompare) diff --git a/lib/hackerlibultra/src/os/getconfig.s b/lib/hackerlibultra/src/os/getconfig.s new file mode 100644 index 00000000..9027a267 --- /dev/null +++ b/lib/hackerlibultra/src/os/getconfig.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetConfig) + MFC0( v0, C0_CONFIG) + jr ra +END(__osGetConfig) diff --git a/lib/ultra/os/getcount.s b/lib/hackerlibultra/src/os/getcount.s similarity index 61% rename from lib/ultra/os/getcount.s rename to lib/hackerlibultra/src/os/getcount.s index a848c428..9ce72c65 100644 --- a/lib/ultra/os/getcount.s +++ b/lib/hackerlibultra/src/os/getcount.s @@ -3,12 +3,7 @@ #include "sys/regdef.h" .text - -#ifndef BBPLAYER - LEAF(osGetCount) - STAY2(mfc0 v0, C0_COUNT) - jr ra + MFC0( v0, C0_COUNT) + jr ra END(osGetCount) - -#endif diff --git a/lib/hackerlibultra/src/os/getcurrfaultthread.c b/lib/hackerlibultra/src/os/getcurrfaultthread.c new file mode 100644 index 00000000..f8bea0e4 --- /dev/null +++ b/lib/hackerlibultra/src/os/getcurrfaultthread.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PRinternal/osint.h" + +OSThread* __osGetCurrFaultedThread(void) { + return __osFaultedThread; +} diff --git a/lib/hackerlibultra/src/os/getfpccsr.s b/lib/hackerlibultra/src/os/getfpccsr.s new file mode 100644 index 00000000..f51b1d0f --- /dev/null +++ b/lib/hackerlibultra/src/os/getfpccsr.s @@ -0,0 +1,13 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetFpcCsr) + CFC1( v0, fcr31) + jr ra +#ifndef MODERN_CC +END(__osGetSR) # @bug: Should be __osGetFpcCsr +#else +END(__osGetFpcCsr) +#endif diff --git a/lib/hackerlibultra/src/os/gethwinterrupt.c b/lib/hackerlibultra/src/os/gethwinterrupt.c new file mode 100644 index 00000000..46dc3666 --- /dev/null +++ b/lib/hackerlibultra/src/os/gethwinterrupt.c @@ -0,0 +1,21 @@ +#include "PR/os_internal.h" + +struct __osHwInt { + s32 (*handler)(void); +#if BUILD_VERSION >= VERSION_J + void* stackEnd; +#endif +}; + +extern struct __osHwInt __osHwIntTable[]; + +#if BUILD_VERSION >= VERSION_J +void __osGetHWIntrRoutine(OSHWIntr interrupt, s32 (**handler)(void), void** stackEnd) { +#else +void __osGetHWIntrRoutine(OSHWIntr interrupt, s32 (**handler)(void)) { +#endif + *handler = __osHwIntTable[interrupt].handler; +#if BUILD_VERSION >= VERSION_J + *stackEnd = __osHwIntTable[interrupt].stackEnd; +#endif +} diff --git a/lib/hackerlibultra/src/os/getintmask.s b/lib/hackerlibultra/src/os/getintmask.s new file mode 100644 index 00000000..293a57ca --- /dev/null +++ b/lib/hackerlibultra/src/os/getintmask.s @@ -0,0 +1,32 @@ +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "PR/os.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osGetIntMask) + mfc0 v0, C0_SR + andi v0, v0, OS_IM_CPU + la t0, __OSGlobalIntMask + lw t1, 0(t0) + xor t0, t1, -1 + andi t0, t0, SR_IMASK + or v0, v0, t0 + + lw t1, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz t1, 1f + la t0, __OSGlobalIntMask # this is intentionally a macro in the branch delay slot + + lw t0, 0(t0) + srl t0, t0, 0x10 + xor t0, t0, -1 + andi t0, t0, 0x3f + or t1, t1, t0 +1: + sll t2, t1, 0x10 + or v0, v0, t2 + jr ra + nop +END(osGetIntMask) diff --git a/lib/hackerlibultra/src/os/getmemsize.c b/lib/hackerlibultra/src/os/getmemsize.c new file mode 100644 index 00000000..7bae7866 --- /dev/null +++ b/lib/hackerlibultra/src/os/getmemsize.c @@ -0,0 +1,53 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/R4300.h" + +#define STEP 0x100000 +#define SIZE_4MB 0x400000 +#define SIZE_8MB 0x800000 + +#if BUILD_VERSION >= VERSION_J + +u32 osGetMemSize(void) { + vu32* ptr; + u32 size = SIZE_4MB; + u32 data0; + u32 data1; + + while (size < SIZE_8MB) { + ptr = (vu32*)(K1BASE + size); + + data0 = *ptr; + data1 = ptr[STEP / 4 - 1]; + + *ptr ^= ~0; + ptr[STEP / 4 - 1] ^= ~0; + + if ((*ptr != (data0 ^ ~0)) || (ptr[STEP / 4 - 1] != (data1 ^ ~0))) { + return size; + } + + *ptr = data0; + ptr[STEP / 4 - 1] = data1; + + size += STEP; + } + + return size; +} + +#else + +u32 osGetMemSize(void) { + u32* memory; + u32 memsize = SIZE_4MB - STEP; + do { + memsize += STEP; + memory = (u32*)(memsize + K1BASE); + memory[0] = 0x12345678; + memory[STEP / 4 - 1] = 0x87654321; + } while (memory[0] == 0x12345678 && memory[STEP / 4 - 1] == 0x87654321); + return memsize; +} + +#endif diff --git a/lib/hackerlibultra/src/os/getnextfaultthread.c b/lib/hackerlibultra/src/os/getnextfaultthread.c new file mode 100644 index 00000000..74c7bdca --- /dev/null +++ b/lib/hackerlibultra/src/os/getnextfaultthread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "PRinternal/osint.h" + +OSThread* __osGetNextFaultedThread(OSThread* lastFault) { + register int saveMask = __osDisableInt(); + register OSThread* fault; + + fault = lastFault == NULL ? __osActiveQueue : lastFault; + + while (fault->priority != -1) { + if ((fault->flags & OS_FLAG_FAULT) != 0 && fault != lastFault) { + break; + } + fault = fault->tlnext; + } + + if (fault->priority == -1) { + fault = NULL; + } + + __osRestoreInt(saveMask); + return fault; +} diff --git a/lib/ultra/os/getsr.s b/lib/hackerlibultra/src/os/getsr.s similarity index 73% rename from lib/ultra/os/getsr.s rename to lib/hackerlibultra/src/os/getsr.s index bc9c767c..2db98999 100644 --- a/lib/ultra/os/getsr.s +++ b/lib/hackerlibultra/src/os/getsr.s @@ -4,6 +4,6 @@ .text LEAF(__osGetSR) - STAY2(mfc0 v0, C0_SR) - jr ra + MFC0( v0, C0_SR) + jr ra END(__osGetSR) diff --git a/lib/hackerlibultra/src/os/getthreadid.c b/lib/hackerlibultra/src/os/getthreadid.c new file mode 100644 index 00000000..c2f39c9d --- /dev/null +++ b/lib/hackerlibultra/src/os/getthreadid.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "PRinternal/osint.h" + +OSId osGetThreadId(OSThread* thread) { + if (thread == NULL) { + thread = __osRunningThread; + } + + return thread->id; +} diff --git a/lib/ultra/os/getthreadpri.c b/lib/hackerlibultra/src/os/getthreadpri.c similarity index 64% rename from lib/ultra/os/getthreadpri.c rename to lib/hackerlibultra/src/os/getthreadpri.c index b41c039f..4e842a19 100644 --- a/lib/ultra/os/getthreadpri.c +++ b/lib/hackerlibultra/src/os/getthreadpri.c @@ -1,7 +1,7 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PRinternal/osint.h" -OSPri osGetThreadPri(OSThread *thread) { +OSPri osGetThreadPri(OSThread* thread) { if (thread == NULL) { thread = __osRunningThread; } diff --git a/lib/hackerlibultra/src/os/gettime.c b/lib/hackerlibultra/src/os/gettime.c new file mode 100644 index 00000000..38839ba9 --- /dev/null +++ b/lib/hackerlibultra/src/os/gettime.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" +#include "PRinternal/viint.h" + +OSTime osGetTime(void) { + u32 tmptime; + u32 elapseCount; + OSTime currentCount; + register u32 saveMask; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSGETTIME, 0); + return 0; + } +#endif + + saveMask = __osDisableInt(); + tmptime = osGetCount(); + elapseCount = tmptime - __osBaseCounter; + currentCount = __osCurrentTime; + __osRestoreInt(saveMask); + return currentCount + elapseCount; +} diff --git a/lib/hackerlibultra/src/os/gettlbasid.s b/lib/hackerlibultra/src/os/gettlbasid.s new file mode 100644 index 00000000..a831c0de --- /dev/null +++ b/lib/hackerlibultra/src/os/gettlbasid.s @@ -0,0 +1,11 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBASID) + mfc0 v0, C0_ENTRYHI + jr ra + nop +END(__osGetTLBASID) diff --git a/lib/hackerlibultra/src/os/gettlbhi.s b/lib/hackerlibultra/src/os/gettlbhi.s new file mode 100644 index 00000000..1d5b1d53 --- /dev/null +++ b/lib/hackerlibultra/src/os/gettlbhi.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBHi) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_ENTRYHI + jr ra + nop +END(__osGetTLBHi) diff --git a/lib/hackerlibultra/src/os/gettlblo0.s b/lib/hackerlibultra/src/os/gettlblo0.s new file mode 100644 index 00000000..2833a4e1 --- /dev/null +++ b/lib/hackerlibultra/src/os/gettlblo0.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBLo0) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_ENTRYLO0 + jr ra + nop +END(__osGetTLBLo0) diff --git a/lib/hackerlibultra/src/os/gettlblo1.s b/lib/hackerlibultra/src/os/gettlblo1.s new file mode 100644 index 00000000..31fdd760 --- /dev/null +++ b/lib/hackerlibultra/src/os/gettlblo1.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBLo1) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_ENTRYLO1 + jr ra + nop +END(__osGetTLBLo1) diff --git a/lib/hackerlibultra/src/os/gettlbpagemask.s b/lib/hackerlibultra/src/os/gettlbpagemask.s new file mode 100644 index 00000000..77611770 --- /dev/null +++ b/lib/hackerlibultra/src/os/gettlbpagemask.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.set noreorder +.text +LEAF(__osGetTLBPageMask) + mtc0 a0, C0_INX + nop + tlbr + nop + nop + nop + mfc0 v0, C0_PAGEMASK + jr ra + nop +END(__osGetTLBPageMask) diff --git a/lib/hackerlibultra/src/os/getwatchlo.s b/lib/hackerlibultra/src/os/getwatchlo.s new file mode 100644 index 00000000..e1460d2c --- /dev/null +++ b/lib/hackerlibultra/src/os/getwatchlo.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetWatchLo) + MFC0( v0, C0_WATCHLO) + jr ra +END(__osGetWatchLo) diff --git a/lib/hackerlibultra/src/os/initialize.c b/lib/hackerlibultra/src/os/initialize.c new file mode 100644 index 00000000..b40ccd9b --- /dev/null +++ b/lib/hackerlibultra/src/os/initialize.c @@ -0,0 +1,221 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/os_version.h" +#include "PRinternal/piint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; +extern __osExceptionVector __osExceptionPreamble[]; + +extern OSPiHandle __Dom1SpeedParam; +extern OSPiHandle __Dom2SpeedParam; + +OSTime osClockRate = OS_CLOCK_RATE; +s32 osViClock = VI_NTSC_CLOCK; +u32 __osShutdown = 0; +u32 __OSGlobalIntMask = OS_IM_ALL; +#ifdef _FINALROM +u32 __osFinalrom; +#else +u32 __kmc_pt_mode; +#if BUILD_VERSION >= VERSION_K +void* __printfunc = NULL; +#endif +#endif + +#if BUILD_VERSION >= VERSION_K + +#define INITIALIZE_FUNC __osInitialize_common +#define SPEED_PARAM_FUNC __createSpeedParam +#else + +#define INITIALIZE_FUNC osInitialize +#define SPEED_PARAM_FUNC createSpeedParam +#if BUILD_VERSION >= VERSION_J +static void ptstart(void); +static void SPEED_PARAM_FUNC(void); +#endif +extern __osExceptionVector __ptExceptionPreamble[]; + +#endif + +#if BUILD_VERSION >= VERSION_K +void SPEED_PARAM_FUNC(void) { + __Dom1SpeedParam.type = DEVICE_TYPE_INIT; + __Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG); + __Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG); + __Dom1SpeedParam.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); + __Dom1SpeedParam.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); + + __Dom2SpeedParam.type = DEVICE_TYPE_INIT; + __Dom2SpeedParam.latency = IO_READ(PI_BSD_DOM2_LAT_REG); + __Dom2SpeedParam.pulse = IO_READ(PI_BSD_DOM2_PWD_REG); + __Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG); + __Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG); +} +#endif + +void INITIALIZE_FUNC() { + u32 pifdata; +#if BUILD_VERSION < VERSION_K + u32 clock = 0; +#endif + +#ifdef _FINALROM + __osFinalrom = TRUE; +#endif + + __osSetSR(__osGetSR() | SR_CU1); // enable fpu + __osSetFpcCsr(FPCSR_FS | FPCSR_EV | FPCSR_RM_RN); // flush denorm to zero, enable invalid operation +#if BUILD_VERSION >= VERSION_K + __osSetWatchLo(0x4900000); +#endif + + while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)) { // last byte of joychannel ram + ; + } + while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8)) { + ; // todo: magic contant + } + *(__osExceptionVector*)UT_VEC = *__osExceptionPreamble; + *(__osExceptionVector*)XUT_VEC = *__osExceptionPreamble; + *(__osExceptionVector*)ECC_VEC = *__osExceptionPreamble; + *(__osExceptionVector*)E_VEC = *__osExceptionPreamble; + osWritebackDCache((void*)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); + osInvalICache((void*)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); +#if BUILD_VERSION >= VERSION_J + SPEED_PARAM_FUNC(); + osUnmapTLBAll(); + osMapTLBRdb(); +#else + osMapTLBRdb(); + osPiRawReadIo(4, &clock); // Read clock rate from the ROM header + clock &= ~0xf; + if (clock != 0) { + osClockRate = clock; + } +#endif + osClockRate = osClockRate * 3 / 4; + + if (osResetType == 0) { // cold reset + bzero(osAppNMIBuffer, OS_APP_NMI_BUFSIZE); + } + + if (osTvType == OS_TV_PAL) { + osViClock = VI_PAL_CLOCK; + } else if (osTvType == OS_TV_MPAL) { + osViClock = VI_MPAL_CLOCK; + } else { + osViClock = VI_NTSC_CLOCK; + } + +#if BUILD_VERSION >= VERSION_J + // Wait until there are no RCP interrupts + if (__osGetCause() & CAUSE_IP5) { + while (TRUE) { + ; + } + } + + IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); + IO_WRITE(AI_DACRATE_REG, AI_MAX_DAC_RATE - 1); + IO_WRITE(AI_BITRATE_REG, AI_MAX_BIT_RATE - 1); +#endif + +#if BUILD_VERSION < VERSION_K && !defined(_FINALROM) + if (!__kmc_pt_mode) { + int (*fnc)(); +#if BUILD_VERSION < VERSION_J + unsigned int c; + unsigned int c1; +#endif + unsigned int* src; + unsigned int* dst; + unsigned int monadr; + volatile unsigned int* mon; + volatile unsigned int* stat; + + stat = (unsigned*)0xbff08004; + mon = (unsigned*)0xBFF00000; + if (*mon != 0x4B4D4300) { + return; + } + + src = (unsigned*)__ptExceptionPreamble; + dst = (unsigned*)E_VEC; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + src += 2; + dst += 2; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + + osWritebackDCache(E_VEC, 0x24); + osInvalICache(E_VEC, 0x24); + + __kmc_pt_mode = TRUE; + + if ((*stat & 0x10) == 0) { + monadr = *(mon + 1); + if (monadr != 0xBFF00000) { + unsigned int* src; + unsigned int* dst = monadr | 0x20000000; + unsigned int ct = 0x2000 / 4; + + src = 0xBFF00000; + + while (ct != 0) { + *dst++ = *src++; + ct--; + } + } + fnc = monadr + 8; + fnc(0x4B4D4300, 0); + } + } +#endif +} + +#if !defined(_FINALROM) && BUILD_VERSION < VERSION_J +void ptstart(void) { +} +#elif !defined(_FINALROM) && BUILD_VERSION < VERSION_K +static void ptstart(void) { +} +#endif + +#if BUILD_VERSION >= VERSION_K +void __osInitialize_autodetect(void) { +#ifndef _FINALROM + if (__checkHardware_msp()) { + __osInitialize_msp(); + } else if (__checkHardware_kmc()) { + __osInitialize_kmc(); + } else if (__checkHardware_isv()) { + __osInitialize_isv(); + } else { + __osInitialize_emu(); + } +#endif +} +#elif BUILD_VERSION == VERSION_J +static void SPEED_PARAM_FUNC(void) { + __Dom1SpeedParam.type = DEVICE_TYPE_INIT; + __Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG); + __Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG); + __Dom1SpeedParam.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); + __Dom1SpeedParam.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); + + __Dom2SpeedParam.type = DEVICE_TYPE_INIT; + __Dom2SpeedParam.latency = IO_READ(PI_BSD_DOM2_LAT_REG); + __Dom2SpeedParam.pulse = IO_READ(PI_BSD_DOM2_PWD_REG); + __Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG); + __Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG); +} +#endif diff --git a/lib/hackerlibultra/src/os/initialize_emu.c b/lib/hackerlibultra/src/os/initialize_emu.c new file mode 100644 index 00000000..1f0e5f30 --- /dev/null +++ b/lib/hackerlibultra/src/os/initialize_emu.c @@ -0,0 +1,28 @@ +#ifndef _FINALROM + +#include "stdlib.h" +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PRinternal/osint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +static void* proutSyncPrintf(void* str, const char* buf, size_t n) { + size_t sent = 0; + + while (sent < n) { + sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT); + } + return 1; +} + +void __osInitialize_emu(void) { + __printfunc = proutSyncPrintf; +} + +#endif diff --git a/lib/hackerlibultra/src/os/initialize_isv.c b/lib/hackerlibultra/src/os/initialize_isv.c new file mode 100644 index 00000000..d8d85d23 --- /dev/null +++ b/lib/hackerlibultra/src/os/initialize_isv.c @@ -0,0 +1,175 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" + +#include "PRinternal/macros.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __isExpJP; + +void MonitorInitBreak(void); + +#define ISV_BASE gISVDbgPrnAdrs +#define ISV_MAGIC_ADDR (ISV_BASE + 0x00) +#define ISV_GET_ADDR (ISV_BASE + 0x04) +#define ISV_PUT_ADDR (ISV_BASE + 0x14) +#define ISV_BUFFER (ISV_BASE + 0x20) + +#define ISV_BUFFER_LEN (0x10000 - 0x20) + +#define IS64_MAGIC 'IS64' + +__osExceptionVector ramOldVector ALIGNED(0x8); +u32 gISVFlag; +u16 gISVChk; +u32 gISVDbgPrnAdrs; +u32 leoComuBuffAdd; + +static OSPiHandle* is_Handle; + +void isPrintfInit(void) { + is_Handle = osCartRomInit(); + + osEPiWriteIo(is_Handle, ISV_PUT_ADDR, 0); + osEPiWriteIo(is_Handle, ISV_GET_ADDR, 0); + osEPiWriteIo(is_Handle, ISV_MAGIC_ADDR, IS64_MAGIC); +} + +static void* is_proutSyncPrintf(void* arg, const u8* str, u32 count) { + u32 data; + s32 p; + s32 start; + s32 end; + + if (gISVDbgPrnAdrs == 0) { + return 0; + } + + osEPiReadIo(is_Handle, ISV_MAGIC_ADDR, &data); + if (data != IS64_MAGIC) { + return 1; + } + osEPiReadIo(is_Handle, ISV_GET_ADDR, &data); + p = data; + osEPiReadIo(is_Handle, ISV_PUT_ADDR, &data); + + start = data; + end = start + count; + + if (end >= ISV_BUFFER_LEN) { + end -= ISV_BUFFER_LEN; + if (p < end || start < p) { + return 1; + } + } else { + if (start < p && p < end) { + return 1; + } + } + while (count) { + if (*str != '\0') { + s32 shift = start & 3; + u32 addr = ISV_BUFFER + (start & 0xFFFFFFC); + + shift = (3 - shift) * 8; + + osEPiReadIo(is_Handle, addr, &data); + osEPiWriteIo(is_Handle, addr, (data & ~(0xff << shift)) | (*str << shift)); + + start++; + if (start >= ISV_BUFFER_LEN) { + start -= ISV_BUFFER_LEN; + } + } + count--; + str++; + } + osEPiWriteIo(is_Handle, ISV_PUT_ADDR, start); + + return 1; +} + +int __checkHardware_isv(void) { + u32 i = 0; + u32 data; + u32 save[4]; + OSPiHandle* hnd = osCartRomInit(); + + gISVDbgPrnAdrs = 0; + leoComuBuffAdd = 0; + gISVFlag = IS64_MAGIC; + gISVChk = 0; + + for (i = 0; i < 4; i++) { + osEPiReadIo(hnd, 0xB0000100 + i * 4, &save[i]); + } + +#ifndef __GNU__ // BUG: data is used uninitialized for GCC + data = 0; +#endif + osEPiWriteIo(hnd, 0xB000010C, data); + data = IS64_MAGIC; + osEPiWriteIo(hnd, 0xB0000100, IS64_MAGIC); + + for (i = 0; i < 0x20000; i++) { + osEPiReadIo(hnd, 0xB000010C, &data); + if (data == IS64_MAGIC) { + data = 0; + osEPiWriteIo(hnd, 0xB0000100, data); + gISVChk |= 1; + osEPiReadIo(hnd, 0xB0000104, &gISVDbgPrnAdrs); + osEPiReadIo(hnd, 0xB0000108, &leoComuBuffAdd); + break; + } + } + + for (i = 0; i < 4; i++) { + osEPiWriteIo(hnd, 0xB0000100 + i * 4, save[i]); + } + + osEPiReadIo(hnd, 0xBFF00000, &data); + + gISVChk |= ((data == IS64_MAGIC) ? 2 : 0); + + return (gISVChk != 0) ? TRUE : FALSE; +} + +void __osInitialize_isv(void) { + void (*fn)(void); + OSPiHandle* hnd; + s32 pad; + s32 pad2; + + if (gISVFlag == IS64_MAGIC || __checkHardware_isv()) { + if (gISVDbgPrnAdrs != 0) { + __printfunc = is_proutSyncPrintf; + isPrintfInit(); + } + if (gISVChk & 2) { + hnd = osCartRomInit(); + + ramOldVector = *(__osExceptionVector*)E_VEC; + *(__osExceptionVector*)E_VEC = __isExpJP; + + osWritebackDCache(&ramOldVector, 0x10); + osInvalICache(&ramOldVector, 0x10); + osWritebackDCache(0x80000000, 0x190); + osInvalICache(0x80000000, 0x190); + osEPiReadIo(hnd, 0xBFF00010, (u32*)&fn); + fn(); + } + if (gISVChk & 2) { + MonitorInitBreak(); + } + } +} + +#endif diff --git a/lib/hackerlibultra/src/os/initialize_kmc.c b/lib/hackerlibultra/src/os/initialize_kmc.c new file mode 100644 index 00000000..4328da9d --- /dev/null +++ b/lib/hackerlibultra/src/os/initialize_kmc.c @@ -0,0 +1,152 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __ptExceptionPreamble[]; + +static volatile unsigned int* stat = (unsigned*)0xbff08004; +static volatile unsigned int* wport = (unsigned*)0xbff08000; +static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG); + +static void rmonPutchar(char c) { + u32 data; + + while (TRUE) { + osPiReadIo(stat, &data); + if (data & 4) { + osPiWriteIo(wport, c); + break; + } + } +} + +static void* kmc_proutSyncPrintf(void* str, const char* buf, int n) { + int i; + char c; + char* p; + char* q; + char xbuf[128]; + static int column = 0; + + p = &xbuf; + + for (i = 0; i < n; i++) { + c = *buf++; + + switch (c) { + case '\n': + *p++ = '\n'; + column = 0; + break; + case '\t': + do { + *p++ = ' '; + } while (++column % 8); + break; + default: + column++; + *p++ = c; + break; + } + + if (c == '\n' || (p - xbuf) > 100) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + p = xbuf; + } + } + if (p != xbuf) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + } + return (void*)1; +} + +extern u32 __kmc_pt_mode; + +void __osInitialize_kmc(void) { + if (!__kmc_pt_mode) { + int (*fnc)(); + unsigned int* src; + unsigned int* dst; + unsigned int monadr; + volatile unsigned int* mon; + volatile unsigned int* stat; + + stat = (unsigned*)0xbff08004; + mon = (unsigned*)0xBFF00000; + if (*mon != 0x4B4D4300) { + return; + } + + src = (unsigned*)__ptExceptionPreamble; + dst = (unsigned*)E_VEC; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + src += 2; + dst += 2; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + + osWritebackDCache(E_VEC, 0x24); + osInvalICache(E_VEC, 0x24); + + __kmc_pt_mode = TRUE; + + if ((*stat & 0x10) == 0) { + monadr = *(mon + 1); + if (monadr != 0xBFF00000) { + unsigned int* src; + unsigned int* dst = monadr | 0x20000000; + unsigned int ct = 0x2000 / 4; + + src = 0xBFF00000; + + while (ct != 0) { + *dst++ = *src++; + ct--; + } + } + fnc = monadr + 8; + fnc(0x4B4D4300, 0); + } + __printfunc = kmc_proutSyncPrintf; + } +} + +int __checkHardware_kmc(void) { + volatile unsigned int* mon = (unsigned*)0xBFF00000; + + if (*mon == 0x4B4D4300) { + mon = (unsigned*)0xBFF00010; + + if (*mon == 0xB0FFB000) { + return TRUE; + } else { + return FALSE; + } + } else { + return FALSE; + } +} + +#endif diff --git a/lib/hackerlibultra/src/os/initialize_msp.c b/lib/hackerlibultra/src/os/initialize_msp.c new file mode 100644 index 00000000..c86d7e8f --- /dev/null +++ b/lib/hackerlibultra/src/os/initialize_msp.c @@ -0,0 +1,152 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PRinternal/osint.h" + +typedef struct { + /* 0x0 */ unsigned int inst1; + /* 0x4 */ unsigned int inst2; + /* 0x8 */ unsigned int inst3; + /* 0xC */ unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __ptExceptionPreamble[]; + +static volatile unsigned int* stat = (unsigned*)0xbff08004; +static volatile unsigned int* wport = (unsigned*)0xbff08000; +static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG); + +static void rmonPutchar(char c) { + u32 data; + + while (TRUE) { + osPiReadIo(stat, &data); + if (data & 4) { + osPiWriteIo(wport, c); + break; + } + } +} + +static void* msp_proutSyncPrintf(void* str, const char* buf, int n) { + int i; + char c; + char* p; + char* q; + char xbuf[128]; + static int column = 0; + + p = &xbuf; + + for (i = 0; i < n; i++) { + c = *buf++; + + switch (c) { + case '\n': + *p++ = '\n'; + column = 0; + break; + case '\t': + do { + *p++ = ' '; + } while (++column % 8); + break; + default: + column++; + *p++ = c; + break; + } + + if (c == '\n' || (p - xbuf) > 100) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + p = xbuf; + } + } + if (p != xbuf) { + rmonPutchar((p - xbuf) - 1); + + q = xbuf; + while (q != p) { + rmonPutchar(*q++); + } + } + return (void*)1; +} + +extern u32 __kmc_pt_mode; + +void __osInitialize_msp(void) { + if (!__kmc_pt_mode) { + int (*fnc)(); + unsigned int* src; + unsigned int* dst; + unsigned int monadr; + volatile unsigned int* mon; + volatile unsigned int* stat; + + stat = (unsigned*)0xbff08004; + mon = (unsigned*)0xBFF00000; + if (*mon != 0x4B4D4300) { + return; + } + + src = (unsigned*)__ptExceptionPreamble; + dst = (unsigned*)E_VEC; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + src += 2; + dst += 2; + *dst++ = *src++; + *dst++ = *src++; + *dst++ = *src++; + + osWritebackDCache(E_VEC, 0x24); + osInvalICache(E_VEC, 0x24); + + __kmc_pt_mode = TRUE; + + if ((*stat & 0x10) == 0) { + monadr = *(mon + 1); + if (monadr != 0xBFF00000) { + unsigned int* src; + unsigned int* dst = monadr | 0x20000000; + unsigned int ct = 0x2000 / 4; + + src = 0xBFF00000; + + while (ct != 0) { + *dst++ = *src++; + ct--; + } + } + fnc = monadr + 8; + fnc(0x4B4D4300, 0); + } + __printfunc = msp_proutSyncPrintf; + } +} + +int __checkHardware_msp(void) { + volatile unsigned int* mon = (unsigned*)0xBFF00000; + + if (*mon == 0x4B4D4300) { + mon = (unsigned*)0xBFF00010; + + if (*mon == 0) { + return TRUE; + } else { + return FALSE; + } + } else { + return FALSE; + } +} + +#endif diff --git a/lib/hackerlibultra/src/os/initrdb.c b/lib/hackerlibultra/src/os/initrdb.c new file mode 100644 index 00000000..5537eb14 --- /dev/null +++ b/lib/hackerlibultra/src/os/initrdb.c @@ -0,0 +1,31 @@ +#ifndef _FINALROM +#include "PR/rdb.h" +#include "PR/os_internal.h" + +rdbPacket* __osRdb_IP6_Data; +u32 __osRdb_IP6_Size; +u32 __osRdb_IP6_Ct; +u32 __osRdb_IP6_CurWrite; +u32 __osRdb_IP6_CurSend; + +void osInitRdb(u8* sendBuf, u32 sendSize) { + u32 mask; + + sendSize /= 4; + + if (((u32)sendBuf & 3) != 0) { + sendBuf = ((u32)sendBuf & 3) + 4; + sendSize--; + } + mask = __osDisableInt(); + + __osRdb_IP6_Data = sendBuf; + __osRdb_IP6_Size = sendSize; + __osRdb_IP6_Ct = 0; + __osRdb_IP6_CurWrite = 0; + __osRdb_IP6_CurSend = 0; + + __osRestoreInt(mask); +} + +#endif diff --git a/lib/hackerlibultra/src/os/interrupt.s b/lib/hackerlibultra/src/os/interrupt.s new file mode 100644 index 00000000..1f4305b1 --- /dev/null +++ b/lib/hackerlibultra/src/os/interrupt.s @@ -0,0 +1,55 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/os_version.h" +#include "threadasm.h" + +.text +.set noreorder +LEAF(__osDisableInt) +#if BUILD_VERSION >= VERSION_J + la t2, __OSGlobalIntMask + lw t3, (t2) + andi t3, SR_IMASK + mfc0 t0, C0_SR + and t1, t0, ~SR_IE + mtc0 t1, C0_SR + andi v0, t0, SR_IE + lw t0, (t2) + andi t0, SR_IMASK + beq t0, t3, No_Change_Global_Int + # @bug this la should be lw, it may never come up in practice as to reach this code + # the CPU bits of __OSGlobalIntMask must have changed while this function is running. + la t2, __osRunningThread # this is intentionally a macro in the branch delay slot + lw t1, THREAD_SR(t2) + andi t2, t1, SR_IMASK + and t2, t0 + and t1, ~SR_IMASK + or t1, t2 + and t1, ~SR_IE + mtc0 t1, C0_SR + nop + nop +No_Change_Global_Int: + jr ra + nop +#else + mfc0 t0, C0_SR + and t1, t0, ~SR_IE + mtc0 t1, C0_SR + andi v0, t0, SR_IE + nop + jr ra + nop +#endif +END(__osDisableInt) + +LEAF(__osRestoreInt) + mfc0 t0, C0_SR + or t0, t0, a0 + mtc0 t0, C0_SR + nop + nop + jr ra + nop +END(__osRestoreInt) diff --git a/lib/hackerlibultra/src/os/invaldcache.s b/lib/hackerlibultra/src/os/invaldcache.s new file mode 100644 index 00000000..cabad5b4 --- /dev/null +++ b/lib/hackerlibultra/src/os/invaldcache.s @@ -0,0 +1,91 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +/** + * void osInvalDCache(void* vaddr, s32 nbytes); + * + * Invalidates the CPU Data Cache for `nbytes` at `vaddr`. + * The cache is not automatically synced with physical memory, so cache + * lines must be invalidated to ensure old data is not used in place of + * newly available data supplied by an external agent in a DMA operation. + * + * If `vaddr` is not aligned to a cache line boundary, or nbytes is not a + * multiple of the data cache line size (16 bytes) a larger region is + * invalidated. + * + * If the amount to invalidate is at least the data cache size (DCACHE_SIZE), + * the entire data cache is invalidated. + */ +LEAF(osInvalDCache) + /* If the amount to invalidate is less than or equal to 0, return immediately */ + blez a1, 3f + /* + * If the amount to invalidate is as large as or larger than + * the data cache size, invalidate all + */ + li t3, DCACHE_SIZE + bgeu a1, t3, 4f + + /* + * Ensure end address does not wrap around and end up smaller + * than the start address + */ + move t0, a0 + addu t1, a0, a1 + bgeu t0, t1, 3f + + /* Mask start with cache line */ + addiu t1, t1, -DCACHE_LINESIZE + andi t2, t0, DCACHE_LINEMASK + /* If mask is not zero, the start is not cache aligned */ + beqz t2, 1f + + /* Subtract mask result to align to cache line */ + subu t0, t0, t2 + /* Hit-Writeback-Invalidate unaligned part */ + CACHE( (C_HWBINV | CACH_PD), (t0)) + /* If that is all there is to do, return early */ + bgeu t0, t1, 3f + + + addiu t0, t0, DCACHE_LINESIZE +1: + /* Mask end with cache line */ + andi t2, t1, DCACHE_LINEMASK + /* If mask is not zero, the end is not cache aligned */ + beqz t2, 2f + + /* Subtract mask result to align to cache line */ + subu t1, t1, t2 + + /* Hit-Writeback-Invalidate unaligned part */ + CACHE( (C_HWBINV | CACH_PD), DCACHE_LINESIZE(t1)) + bltu t1, t0, 3f + +2: + /* Hit-Invalidate */ + CACHE( (C_HINV | CACH_PD), (t0)) + .set noreorder + bltu t0, t1, 2b + addiu t0, t0, DCACHE_LINESIZE + .set reorder +3: + jr ra + +4: + li t0, K0BASE + addu t1, t0, t3 + addiu t1, t1, -DCACHE_LINESIZE +5: + /* Index-Writeback-Invalidate */ + CACHE( (C_IINV | CACH_PD), (t0)) + .set noreorder + bltu t0, t1, 5b + addiu t0, t0, DCACHE_LINESIZE + .set reorder + + jr ra + +END(osInvalDCache) diff --git a/lib/hackerlibultra/src/os/invalicache.s b/lib/hackerlibultra/src/os/invalicache.s new file mode 100644 index 00000000..541b3872 --- /dev/null +++ b/lib/hackerlibultra/src/os/invalicache.s @@ -0,0 +1,51 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osInvalICache) + /* If the amount to invalidate is less than or equal to 0, return immediately */ + blez a1, 2f + + /* + * If the amount to invalidate is as large as or larger than + * the instruction cache size, invalidate all + */ + li t3, ICACHE_SIZE + bgeu a1, t3, 3f + + /* + * ensure end address does not wrap around and end up smaller + * than the start address + */ + move t0, a0 + addu t1, a0, a1 + bgeu t0, t1, 2f + + /* Mask and subtract to align to cache line */ + addiu t1, t1, -ICACHE_LINESIZE + andi t2, t0, ICACHE_LINEMASK + subu t0, t0, t2 +1: + CACHE( (C_HINV | CACH_PI), (t0)) + .set noreorder + bltu t0, t1, 1b + addiu t0, t0, ICACHE_LINESIZE + .set reorder +2: + jr ra + +3: + li t0, K0BASE + addu t1, t0, t3 + addiu t1, t1, -ICACHE_LINESIZE +4: + CACHE( (C_IINV | CACH_PI), (t0)) + .set noreorder + bltu t0, t1, 4b + addiu t0, t0, ICACHE_LINESIZE + .set reorder + + jr ra + +END(osInvalICache) diff --git a/lib/ultra/os/jammesg.c b/lib/hackerlibultra/src/os/jammesg.c similarity index 54% rename from lib/ultra/os/jammesg.c rename to lib/hackerlibultra/src/os/jammesg.c index f9442d33..4c509e3c 100644 --- a/lib/ultra/os/jammesg.c +++ b/lib/hackerlibultra/src/os/jammesg.c @@ -1,11 +1,21 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" -s32 osJamMesg(OSMesgQueue *mq, OSMesg msg, s32 flags) { - register s32 saveMask = __osDisableInt(); +s32 osJamMesg(OSMesgQueue* mq, OSMesg msg, s32 flag) { + register u32 saveMask; - while (MQ_IS_FULL(mq)) { - if (flags == OS_MESG_BLOCK) { +#ifdef _DEBUG + if ((flag != OS_MESG_NOBLOCK) && (flag != OS_MESG_BLOCK)) { + __osError(ERR_OSJAMMESG, 1, flag); + return -1; + } +#endif + + saveMask = __osDisableInt(); + + while (mq->validCount >= mq->msgCount) { + if (flag == OS_MESG_BLOCK) { __osRunningThread->state = OS_STATE_WAITING; __osEnqueueAndYield(&mq->fullqueue); } else { diff --git a/lib/hackerlibultra/src/os/maptlb.s b/lib/hackerlibultra/src/os/maptlb.s new file mode 100644 index 00000000..be8b7841 --- /dev/null +++ b/lib/hackerlibultra/src/os/maptlb.s @@ -0,0 +1,110 @@ +#include "PR/ultraerror.h" +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +#define index a0 +#define pm a1 +#define vaddr a2 +#define evenpaddr a3 +#define oddpaddr 16(sp) +#define asid 20(sp) +.text +.set noreorder +LEAF(osMapTLB) +#if defined (_DEBUG) && defined (__sgi) + bgez index, 1f + nop + b 2f + nop +1: + li t0, 0x1F +.set noat + slt AT, index, t0 + bnez AT, 3f + nop +.set at +2: + move a2, a0 + li a0, ERR_OSMAPTLB_INDEX + li a1, 1 + j __osError + nop + +3: + lw t0, asid + li t1, -1 +.set noat + slt AT, t0, t1 + beqz AT, 4f + nop +.set at + b 5f + nop +4: + li t1, 0xFF +.set noat + slt AT, t1, t0 + beqz AT, 6f + nop +.set at +5: + move a2, t0 + li a0, ERR_OSMAPTLB_ASID + li a1, 1 + j __osError + nop +6: +.set reorder +#endif + MFC0( t0, C0_ENTRYHI) + MTC0( index, C0_INX) + MTC0( pm, C0_PAGEMASK) +.set noreorder + lw t1, asid + beq t1, -1, 7f + li ta0, TLBLO_G + li t2, (TLBLO_NONCOHRNT | TLBLO_D | TLBLO_V) + b 8f + or vaddr, vaddr, t1 +.set reorder + +7: + li t2, (TLBLO_NONCOHRNT | TLBLO_D | TLBLO_V | TLBLO_G) +8: + MTC0( vaddr, C0_ENTRYHI) + beq evenpaddr, -1, 9f + + srl t3, evenpaddr, TLBLO_PFNSHIFT + or t3, t3, t2 + MTC0( t3, C0_ENTRYLO0) + b 10f + +9: + MTC0( ta0, C0_ENTRYLO0) +10: + lw t3, oddpaddr + beq t3, -1, 11f + + srl t3, t3, TLBLO_PFNSHIFT + or t3, t3, t2 + MTC0( t3, C0_ENTRYLO1) + b 12f + +11: + MTC0( ta0, C0_ENTRYLO1) + bne evenpaddr, -1, 12f + + li t3, K0BASE + MTC0( t3, C0_ENTRYHI) +12: + .set noreorder + nop + tlbwi + nop + nop + nop + nop + MTC0( t0, C0_ENTRYHI) + jr ra +END(osMapTLB) diff --git a/lib/hackerlibultra/src/os/maptlbrdb.s b/lib/hackerlibultra/src/os/maptlbrdb.s new file mode 100644 index 00000000..1714304d --- /dev/null +++ b/lib/hackerlibultra/src/os/maptlbrdb.s @@ -0,0 +1,31 @@ +#include "PR/R4300.h" +#include "PR/rdb.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osMapTLBRdb) + mfc0 t0, C0_ENTRYHI + li t1, NTLBENTRIES + mtc0 t1, C0_INX + mtc0 zero, C0_PAGEMASK /* 4k */ + li t2, (TLBLO_UNCACHED | TLBLO_D | TLBLO_V | TLBLO_G) + li t1, K2BASE + mtc0 t1, C0_ENTRYHI + li t1, RDB_BASE_VIRTUAL_ADDR + srl t3, t1, TLBLO_PFNSHIFT + or t3, t3, t2 + mtc0 t3, C0_ENTRYLO0 + li t1, TLBLO_G + mtc0 t1, C0_ENTRYLO1 + nop + tlbwi + nop + nop + nop + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osMapTLBRdb) diff --git a/lib/hackerlibultra/src/os/parameters.s b/lib/hackerlibultra/src/os/parameters.s new file mode 100644 index 00000000..450af31b --- /dev/null +++ b/lib/hackerlibultra/src/os/parameters.s @@ -0,0 +1,17 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +ABS(leoBootID, 0x800001a0) +ABS(osTvType, 0x80000300) +ABS(osRomType, 0x80000304) +ABS(osRomBase, 0x80000308) +ABS(osResetType, 0x8000030c) +ABS(osCicId, 0x80000310) +ABS(osVersion, 0x80000314) +ABS(osMemSize, 0x80000318) +ABS(osAppNMIBuffer, 0x8000031c) + +.space 0x60 +/* padded to 0x60 in the object file */ diff --git a/lib/hackerlibultra/src/os/physicaltovirtual.c b/lib/hackerlibultra/src/os/physicaltovirtual.c new file mode 100644 index 00000000..6fbb9c3d --- /dev/null +++ b/lib/hackerlibultra/src/os/physicaltovirtual.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" + +void* osPhysicalToVirtual(u32 addr) { + return (void*)PHYS_TO_K0(addr); +} diff --git a/lib/hackerlibultra/src/os/probetlb.s b/lib/hackerlibultra/src/os/probetlb.s new file mode 100644 index 00000000..5bd4981d --- /dev/null +++ b/lib/hackerlibultra/src/os/probetlb.s @@ -0,0 +1,85 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +/** + * u32 __osProbeTLB(void* vaddr); + * + * Searches the TLB for the physical address associated with + * the virtual address `vaddr`. + * + * Returns the physical address if found, or -1 if not found. + */ +LEAF(__osProbeTLB) + /* Set C0_ENTRYHI based on supplied vaddr */ + mfc0 t0, C0_ENTRYHI + andi t1, t0, TLBHI_PIDMASK + and t2, a0, (TLBHI_VPN2MASK << 32) >> 32 + or t1, t1, t2 + mtc0 t1, C0_ENTRYHI + nop + nop + nop + /* + * TLB probe, sets C0_INX to a value matching C0_ENTRYHI. + * If no match is found the TLBINX_PROBE bit is set to indicate this. + */ + tlbp + nop + nop + /* Read result */ + mfc0 t3, C0_INX + and t3, t3, TLBINX_PROBE + /* Branch if no match was found */ + bnez t3, 3f + nop + /* + * Read TLB, sets C0_ENTRYHI, C0_ENTRYLO0, C0_ENTRYLO1 and C0_PAGEMASK for the TLB + * entry indicated by C0_INX + */ + tlbr + nop + nop + nop + /* Calculate page size = (page mask + 0x2000) >> 1 */ + mfc0 t3, C0_PAGEMASK + addi t3, t3, 0x2000 + srl t3, t3, 0x1 + /* & with vaddr */ + and ta0, t3, a0 + /* Select C0_ENTRYLO0 or C0_ENTRYLO1 */ + bnez ta0, 1f + /* make bitmask out of page size */ + addi t3, t3, -1 + mfc0 v0, C0_ENTRYLO0 + b 2f + nop +1: + mfc0 v0, C0_ENTRYLO1 +2: + /* Check valid bit and branch if not valid */ + andi ta1, v0, TLBLO_V + beqz ta1, 3f + nop + /* Extract the Page Frame Number from the entry */ + and v0, v0, TLBLO_PFNMASK + sll v0, v0, TLBLO_PFNSHIFT + /* Mask vaddr with page size mask */ + and ta1, a0, t3 + /* Add masked vaddr to pfn to obtain the physical address */ + add v0, v0, ta1 + b 4f + nop +3: + /* + * No physical address for the supplied virtual address was found, + * return -1 + */ + li v0, -1 +4: + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(__osProbeTLB) diff --git a/lib/hackerlibultra/src/os/rdbsend.c b/lib/hackerlibultra/src/os/rdbsend.c new file mode 100644 index 00000000..0dc111e3 --- /dev/null +++ b/lib/hackerlibultra/src/os/rdbsend.c @@ -0,0 +1,76 @@ +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/R4300.h" + +#ifndef _FINALROM +extern rdbPacket* __osRdb_IP6_Data; +extern u32 __osRdb_IP6_Size; +extern u32 __osRdb_IP6_Ct; +extern u32 __osRdb_IP6_CurWrite; + +u32 __osRdb_IP6_Empty = 1; + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +u32 __osRdbSend(u8* buf, u32 size, u32 type) { + rdbPacket* pPtr; + rdbPacket pkt; + u32 len; + u32 c; + u32 inCt = 0; + u32 needFirst = 0; + u32 mask; + u32 sent = 0; + + mask = __osDisableInt(); + + if (__osRdb_IP6_Empty != 0) { + __osRdb_IP6_Empty = 0; + pkt.type = type; + + len = MIN(size, sizeof(pkt.buf)); + + pkt.length = len; + + c = 0; + while (c < len) { + pkt.buf[c++] = buf[inCt++]; + } + + size -= len; + sent = len; + needFirst = 1; + } + + while (size != 0 && __osRdb_IP6_Ct < __osRdb_IP6_Size) { + len = MIN(size, sizeof(pPtr->buf)); + + pPtr = &__osRdb_IP6_Data[__osRdb_IP6_CurWrite]; + + pPtr->type = type; + pPtr->length = len; + + c = 0; + while (c < len) { + pPtr->buf[c++] = buf[inCt++]; + } + + __osRdb_IP6_CurWrite++; + if (__osRdb_IP6_CurWrite >= __osRdb_IP6_Size) { + __osRdb_IP6_CurWrite = 0; + } + + __osRdb_IP6_Ct++; + size -= len; + sent += len; + } + + if (needFirst) { + *(u32*)RDB_BASE_REG = *(u32*)&pkt; + } + __osRestoreInt(mask); + + return sent; +} + +#endif diff --git a/lib/ultra/os/recvmesg.c b/lib/hackerlibultra/src/os/recvmesg.c similarity index 63% rename from lib/ultra/os/recvmesg.c rename to lib/hackerlibultra/src/os/recvmesg.c index 722e76ba..e8a03f7b 100644 --- a/lib/ultra/os/recvmesg.c +++ b/lib/hackerlibultra/src/os/recvmesg.c @@ -1,8 +1,18 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" -s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32 flags) { - register u32 saveMask = __osDisableInt(); +s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flags) { + register u32 saveMask; + +#ifdef _DEBUG + if ((flags != OS_MESG_NOBLOCK) && (flags != OS_MESG_BLOCK)) { + __osError(ERR_OSRECVMESG, 1, flags); + return -1; + } +#endif + + saveMask = __osDisableInt(); while (MQ_IS_EMPTY(mq)) { if (flags == OS_MESG_NOBLOCK) { diff --git a/lib/ultra/os/resetglobalintmask.c b/lib/hackerlibultra/src/os/resetglobalintmask.c similarity index 100% rename from lib/ultra/os/resetglobalintmask.c rename to lib/hackerlibultra/src/os/resetglobalintmask.c diff --git a/lib/ultra/os/sendmesg.c b/lib/hackerlibultra/src/os/sendmesg.c similarity index 69% rename from lib/ultra/os/sendmesg.c rename to lib/hackerlibultra/src/os/sendmesg.c index 0ddf2654..8b1a4686 100644 --- a/lib/ultra/os/sendmesg.c +++ b/lib/hackerlibultra/src/os/sendmesg.c @@ -1,9 +1,18 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" -s32 osSendMesg(OSMesgQueue *mq, OSMesg msg, s32 flags) { +s32 osSendMesg(OSMesgQueue* mq, OSMesg msg, s32 flags) { register u32 saveMask; register s32 last; + +#ifdef _DEBUG + if ((flags != OS_MESG_NOBLOCK) && (flags != OS_MESG_BLOCK)) { + __osError(ERR_OSSENDMESG, 1, flags); + return -1; + } +#endif + saveMask = __osDisableInt(); while (MQ_IS_FULL(mq)) { diff --git a/lib/hackerlibultra/src/os/setcause.s b/lib/hackerlibultra/src/os/setcause.s new file mode 100644 index 00000000..02419183 --- /dev/null +++ b/lib/hackerlibultra/src/os/setcause.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCause) + MTC0( a0, C0_CAUSE) + jr ra +END(__osSetCause) diff --git a/lib/ultra/os/setcompare.s b/lib/hackerlibultra/src/os/setcompare.s similarity index 62% rename from lib/ultra/os/setcompare.s rename to lib/hackerlibultra/src/os/setcompare.s index 9e7f0e47..7f8969c7 100644 --- a/lib/ultra/os/setcompare.s +++ b/lib/hackerlibultra/src/os/setcompare.s @@ -3,12 +3,7 @@ #include "sys/regdef.h" .text - -#ifndef BBPLAYER - LEAF(__osSetCompare) - STAY2(mtc0 a0, C0_COMPARE) - jr ra + MTC0( a0, C0_COMPARE) + jr ra END(__osSetCompare) - -#endif diff --git a/lib/hackerlibultra/src/os/setconfig.s b/lib/hackerlibultra/src/os/setconfig.s new file mode 100644 index 00000000..8a291ee6 --- /dev/null +++ b/lib/hackerlibultra/src/os/setconfig.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetConfig) + MTC0( a0, C0_CONFIG) + jr ra +END(__osSetConfig) diff --git a/lib/hackerlibultra/src/os/setcount.s b/lib/hackerlibultra/src/os/setcount.s new file mode 100644 index 00000000..1e5bdb0c --- /dev/null +++ b/lib/hackerlibultra/src/os/setcount.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCount) + MTC0( a0, C0_COUNT) + jr ra +END(__osSetCount) diff --git a/lib/hackerlibultra/src/os/seterrorhandler.c b/lib/hackerlibultra/src/os/seterrorhandler.c new file mode 100644 index 00000000..4e839e88 --- /dev/null +++ b/lib/hackerlibultra/src/os/seterrorhandler.c @@ -0,0 +1,10 @@ +#include "PR/ultraerror.h" + +extern OSErrorHandler __osErrorHandler; + +OSErrorHandler osSetErrorHandler(OSErrorHandler handler) { + OSErrorHandler oldHandler = __osErrorHandler; + + __osErrorHandler = handler; + return oldHandler; +} diff --git a/lib/hackerlibultra/src/os/seteventmesg.c b/lib/hackerlibultra/src/os/seteventmesg.c new file mode 100644 index 00000000..aa5f6690 --- /dev/null +++ b/lib/hackerlibultra/src/os/seteventmesg.c @@ -0,0 +1,39 @@ +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" + +__OSEventState __osEventStateTab[OS_NUM_EVENTS] ALIGNED(0x8); +#if BUILD_VERSION >= VERSION_J +u32 __osPreNMI = FALSE; +#endif + +void osSetEventMesg(OSEvent event, OSMesgQueue* mq, OSMesg msg) { + register u32 saveMask; + __OSEventState* es; + +#ifdef _DEBUG + if (event >= OS_NUM_EVENTS) { + __osError(ERR_OSSETEVENTMESG, 1, event); + return; + } +#endif + + saveMask = __osDisableInt(); + + es = &__osEventStateTab[event]; + + es->messageQueue = mq; + es->message = msg; + +#if BUILD_VERSION >= VERSION_J + if (event == OS_EVENT_PRENMI) { + if (__osShutdown && !__osPreNMI) { + osSendMesg(mq, msg, OS_MESG_NOBLOCK); + } + __osPreNMI = TRUE; + } +#endif + + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/os/setfpccsr.s b/lib/hackerlibultra/src/os/setfpccsr.s new file mode 100644 index 00000000..f36e5b8c --- /dev/null +++ b/lib/hackerlibultra/src/os/setfpccsr.s @@ -0,0 +1,14 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetFpcCsr) + CFC1( v0, fcr31) + CTC1( a0, fcr31) + jr ra +#ifndef MODERN_CC +END(__osSetSR) # @bug: Should be __osSetFpcCsr +#else +END(__osSetFpcCsr) +#endif diff --git a/lib/ultra/os/setglobalintmask.c b/lib/hackerlibultra/src/os/setglobalintmask.c similarity index 100% rename from lib/ultra/os/setglobalintmask.c rename to lib/hackerlibultra/src/os/setglobalintmask.c diff --git a/lib/ultra/os/sethwinterrupt.c b/lib/hackerlibultra/src/os/sethwinterrupt.c similarity index 75% rename from lib/ultra/os/sethwinterrupt.c rename to lib/hackerlibultra/src/os/sethwinterrupt.c index 15ddea96..9aafe1b8 100644 --- a/lib/ultra/os/sethwinterrupt.c +++ b/lib/hackerlibultra/src/os/sethwinterrupt.c @@ -1,30 +1,32 @@ #include "PR/os_internal.h" // A stack frame was added to hardware interrupt handlers in 2.0J -#if LIBULTRA_VERSION >= OS_VER_J +#if BUILD_VERSION >= VERSION_J + struct __osHwInt { s32 (*handler)(void); void* stackEnd; }; extern struct __osHwInt __osHwIntTable[]; -#else -extern s32 (*__osHwIntTable[])(void); -#endif -#if LIBULTRA_VERSION >= OS_VER_J -void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void* stackEnd) -#else -void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void)) -#endif -{ +void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void* stackEnd) { register u32 saveMask = __osDisableInt(); -#if LIBULTRA_VERSION >= OS_VER_J __osHwIntTable[interrupt].handler = handler; __osHwIntTable[interrupt].stackEnd = stackEnd; -#else - __osHwIntTable[interrupt] = handler; -#endif __osRestoreInt(saveMask); } + +#else + +extern struct s32 (*__osHwIntTable[])(void); + +void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void)) { + register u32 saveMask = __osDisableInt(); + + __osHwIntTable[interrupt] = handler; + __osRestoreInt(saveMask); +} + +#endif diff --git a/lib/ultra/os/setintmask.s b/lib/hackerlibultra/src/os/setintmask.s similarity index 75% rename from lib/ultra/os/setintmask.s rename to lib/hackerlibultra/src/os/setintmask.s index f5c95bae..b9f93b0a 100644 --- a/lib/ultra/os/setintmask.s +++ b/lib/hackerlibultra/src/os/setintmask.s @@ -6,71 +6,89 @@ #define MI_INTR_MASK ((1 << 6) - 1) -#ifdef BBPLAYER -#define XOR_VALUE 0xFFFFFFFF -#else -#define XOR_VALUE ~0 -#endif - -#if LIBULTRA_VERSION > OS_VER_D -#define RO_MOVE ta0 -#else -#define RO_MOVE t1 -#endif - -#ifdef BBPLAYER -.set mips2 -#endif - .globl __osRcpImTable .text .set noreorder +/** + * OSIntMask osSetIntMask(OSIntMask); + * + * Sets the interrupt enable mask for the current thread. External interrupts + * originating either in the CPU or the RCP may be "masked out" so that they + * are not handled. This is sometimes important for critical code sections + * that must not be interrupted. + * Interrupts that are not enabled in the global interrupt mask __OSGlobalIntMask + * cannot be set here. The global interrupt mask is OS-internal and is not + * expected to change during runtime. + * The returned value is the previous interrupt enable mask so that it can be + * restored later. + * + * @bug Some usage of the global interrupt mask is broken both in here and in the + * exception handler routines. + * While a thread is running, the C0_SR interrupt enable bits contain the + * interrupt enable bits for the current thread masked by the global + * interrupt mask. There is an attempt to recover only the original interrupt + * enable bits belonging to the thread itself using the operation + * (SR | ~__OSGlobalIntMask). + * However, this does not work as intended and can cause interrupts to end + * up enabled when not intended to be. The same issue is present for the + * RCP interrupt enable bits in MI_INTR_MASK_REG. + * This does not cause issues in practice as __OSGlobalIntMask is almost always + * OS_IM_ALL, so the operation is usually simply (SR | 0). + */ LEAF(osSetIntMask) - mfc0 RO_MOVE, C0_SR + /* Extract interrupt enable bits from current SR */ + mfc0 ta0, C0_SR - andi v0, RO_MOVE, OS_IM_CPU -#if LIBULTRA_VERSION > OS_VER_D - la t0, __OSGlobalIntMask - lw t3, 0(t0) + andi v0, ta0, OS_IM_CPU - xor t0, t3, XOR_VALUE - andi t0, t0,(SR_IMASK) - or v0, v0,t0 -#endif - lw t2, PHYS_TO_K1(MI_INTR_MASK_REG) -#if LIBULTRA_VERSION > OS_VER_D - beqz t2, 1f - srl t1, t3,0x10 - xor t1, t1, XOR_VALUE - andi t1, t1, MI_INTR_MASK - or t2, t2,t1 + /* Get value of __OSGlobalIntMask */ + la t0, __OSGlobalIntMask + lw t3, 0(t0) + + /* Bitwise-OR in the disabled CPU bits of __OSGlobalIntMask */ + xor t0, t3, ~0 + andi t0, t0, SR_IMASK + or v0, v0, t0 + + /* Fetch MI_INTR_MASK_REG */ + lw t2, PHYS_TO_K1(MI_INTR_MASK_REG) + /* If there are RCP interrupts masked */ + beqz t2, 1f + srl t1, t3, 0x10 + + /* Bitwise-OR in the disabled RCP bits of __OSGlobalIntMask */ + xor t1, t1, ~0 + andi t1, t1, (RCP_IMASK >> RCP_IMASKSHIFT) + or t2, t2, t1 1: -#endif - sll t2, t2,0x10 - or v0, v0,t2 + /* Shift the RCP bits to not conflict with the CPU bits */ + sll t2, t2, RCP_IMASKSHIFT + /* OR the CPU and RCP bits together */ + or v0, v0, t2 - and t0, a0, MI_INTR_MASK<<0x10 -#if LIBULTRA_VERSION > OS_VER_D - and t0, t0,t3 -#endif - srl t0, t0,0xf - lhu t2, __osRcpImTable(t0) - sw t2, PHYS_TO_K1(MI_INTR_MASK_REG) + /* Extract RCP interrupt enable bits from requested mask and mask with __OSGlobalIntMask */ + and t0, a0, RCP_IMASK + and t0, t0, t3 + /* Convert to a value for MI_INTR_MASK_REG and set it */ + srl t0, t0, (RCP_IMASKSHIFT - 1) + lhu t2, __osRcpImTable(t0) + sw t2, PHYS_TO_K1(MI_INTR_MASK_REG) - andi t0, a0, OS_IM_CPU -#if LIBULTRA_VERSION > OS_VER_D - andi t1, t3, SR_IMASK - and t0, t0,t1 -#endif - and RO_MOVE, RO_MOVE, ~SR_IMASK - or RO_MOVE, RO_MOVE,t0 + /* Extract CPU interrupt enable bits from requested mask and mask with __OSGlobalIntMask */ + andi t0, a0, OS_IM_CPU + andi t1, t3, SR_IMASK + and t0, t0, t1 - mtc0 RO_MOVE, C0_SR + and ta0, ta0, ~SR_IMASK + /* Bitwise OR in the remaining bits of SR and set new SR */ + or ta0, ta0, t0 + + mtc0 ta0, C0_SR nop nop - jr ra - nop + jr ra + nop END(osSetIntMask) .rdata diff --git a/lib/hackerlibultra/src/os/setpiinterrupt.c b/lib/hackerlibultra/src/os/setpiinterrupt.c new file mode 100644 index 00000000..1af72b5a --- /dev/null +++ b/lib/hackerlibultra/src/os/setpiinterrupt.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" + +struct __osHwInt { + s32 (*handler)(void); + void* stackEnd; +}; + +extern struct __osHwInt __osPiIntTable; + +void __osSetPIIntrRoutine(struct __osHwInt* ir) { + register u32 saveMask = __osDisableInt(); + + __osPiIntTable.handler = ir->handler; + __osPiIntTable.stackEnd = ir->stackEnd; + __osRestoreInt(saveMask); +} diff --git a/lib/ultra/os/setsr.s b/lib/hackerlibultra/src/os/setsr.s similarity index 67% rename from lib/ultra/os/setsr.s rename to lib/hackerlibultra/src/os/setsr.s index 0efa9154..37540fcb 100644 --- a/lib/ultra/os/setsr.s +++ b/lib/hackerlibultra/src/os/setsr.s @@ -4,7 +4,7 @@ .text LEAF(__osSetSR) - STAY2(mtc0 a0, C0_SR) - STAY1(nop) - jr ra + MTC0( a0, C0_SR) + NOP + jr ra END(__osSetSR) diff --git a/lib/ultra/os/setthreadpri.c b/lib/hackerlibultra/src/os/setthreadpri.c similarity index 62% rename from lib/ultra/os/setthreadpri.c rename to lib/hackerlibultra/src/os/setthreadpri.c index caaa4611..66c6039e 100644 --- a/lib/ultra/os/setthreadpri.c +++ b/lib/hackerlibultra/src/os/setthreadpri.c @@ -1,8 +1,18 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" -void osSetThreadPri(OSThread *t, OSPri pri) { - register u32 saveMask = __osDisableInt(); +void osSetThreadPri(OSThread* t, OSPri pri) { + register u32 saveMask; + +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSSETTHREADPRI, 1, pri); + return; + } +#endif + + saveMask = __osDisableInt(); if (t == NULL) { t = __osRunningThread; @@ -10,6 +20,7 @@ void osSetThreadPri(OSThread *t, OSPri pri) { if (t->priority != pri) { t->priority = pri; + if (t != __osRunningThread && t->state != OS_STATE_STOPPED) { __osDequeueThread(t->queue, t); __osEnqueueThread(t->queue, t); diff --git a/lib/hackerlibultra/src/os/settime.c b/lib/hackerlibultra/src/os/settime.c new file mode 100644 index 00000000..5a974d39 --- /dev/null +++ b/lib/hackerlibultra/src/os/settime.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" +#include "PRinternal/viint.h" + +void osSetTime(OSTime time) { + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSETTIME, 0); + return; + } +#endif + + __osCurrentTime = time; +} diff --git a/lib/ultra/os/settimer.c b/lib/hackerlibultra/src/os/settimer.c similarity index 69% rename from lib/ultra/os/settimer.c rename to lib/hackerlibultra/src/os/settimer.c index 02259645..4d2a651a 100644 --- a/lib/ultra/os/settimer.c +++ b/lib/hackerlibultra/src/os/settimer.c @@ -1,16 +1,22 @@ #include "PR/os_internal.h" -#include "osint.h" -#include "macros.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" +#include "PRinternal/viint.h" -u32 osSetTimer(OSTimer *t, OSTime countdown, OSTime interval, OSMesgQueue *mq, OSMesg msg) { -#if LIBULTRA_VERSION >= OS_VER_K - UNUSED OSTime time; - OSTimer *next; +int osSetTimer(OSTimer* t, OSTime countdown, OSTime interval, OSMesgQueue* mq, OSMesg msg) { + OSTime time; +#if BUILD_VERSION >= VERSION_K + OSTimer* next; u32 count; u32 value; u32 saveMask; -#else - OSTime time; +#endif + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSETTIMER, 0); + return 0; + } #endif t->next = NULL; @@ -20,9 +26,10 @@ u32 osSetTimer(OSTimer *t, OSTime countdown, OSTime interval, OSMesgQueue *mq, O t->mq = mq; t->msg = msg; -#if LIBULTRA_VERSION >= OS_VER_K +#if BUILD_VERSION >= VERSION_K saveMask = __osDisableInt(); if (__osTimerList->next == __osTimerList) { + } else { next = __osTimerList->next; count = osGetCount(); @@ -37,7 +44,6 @@ u32 osSetTimer(OSTimer *t, OSTime countdown, OSTime interval, OSMesgQueue *mq, O time = __osInsertTimer(t); __osSetTimerIntr(__osTimerList->next->value); - __osRestoreInt(saveMask); #else time = __osInsertTimer(t); diff --git a/lib/hackerlibultra/src/os/settlbasid.s b/lib/hackerlibultra/src/os/settlbasid.s new file mode 100644 index 00000000..e7f31fbe --- /dev/null +++ b/lib/hackerlibultra/src/os/settlbasid.s @@ -0,0 +1,32 @@ +#include "PR/ultraerror.h" +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osSetTLBASID) +#if defined (_DEBUG) && defined (__sgi) +.set noreorder + bgez a0, 1f + nop + b 2f + nop +1: + li t1, 0xFF +.set noat + slt AT, t1, a0 + beqz AT, 3f + nop +.set at +2: + move a2, a0 + li a0, ERR_OSSETTLBASID + li a1, 1 + j __osError + nop +3: +.set reorder +#endif + MTC0( a0, C0_ENTRYHI) + jr ra +END(osSetTLBASID) diff --git a/lib/ultra/os/setwatchlo.s b/lib/hackerlibultra/src/os/setwatchlo.s similarity index 67% rename from lib/ultra/os/setwatchlo.s rename to lib/hackerlibultra/src/os/setwatchlo.s index b72cfd2a..4d54a51b 100644 --- a/lib/ultra/os/setwatchlo.s +++ b/lib/hackerlibultra/src/os/setwatchlo.s @@ -4,7 +4,7 @@ .text LEAF(__osSetWatchLo) - STAY2(mtc0 a0, C0_WATCHLO) - STAY1(nop) - jr ra + MTC0( a0, C0_WATCHLO) + NOP + jr ra END(__osSetWatchLo) diff --git a/lib/ultra/os/startthread.c b/lib/hackerlibultra/src/os/startthread.c similarity index 80% rename from lib/ultra/os/startthread.c rename to lib/hackerlibultra/src/os/startthread.c index dc1dcee7..f4ecaaac 100644 --- a/lib/ultra/os/startthread.c +++ b/lib/hackerlibultra/src/os/startthread.c @@ -1,7 +1,8 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" -void osStartThread(OSThread *t) { +void osStartThread(OSThread* t) { register u32 saveMask = __osDisableInt(); switch (t->state) { @@ -19,6 +20,12 @@ void osStartThread(OSThread *t) { __osEnqueueThread(&__osRunQueue, __osPopThread(t->queue)); } break; +#ifdef _DEBUG + default: + __osError(ERR_OSSTARTTHREAD, 0); + __osRestoreInt(saveMask); + return; +#endif } if (__osRunningThread == NULL) { diff --git a/lib/hackerlibultra/src/os/stopthread.c b/lib/hackerlibultra/src/os/stopthread.c new file mode 100644 index 00000000..399fe2f4 --- /dev/null +++ b/lib/hackerlibultra/src/os/stopthread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "PRinternal/osint.h" + +void osStopThread(OSThread* t) { + register u32 saveMask = __osDisableInt(); + register u16 state; + + state = (t == NULL) ? OS_STATE_RUNNING : t->state; + + switch (state) { + case OS_STATE_RUNNING: + __osRunningThread->state = OS_STATE_STOPPED; + __osEnqueueAndYield(NULL); + break; + case OS_STATE_RUNNABLE: + case OS_STATE_WAITING: + t->state = OS_STATE_STOPPED; + __osDequeueThread(t->queue, t); + break; + } + + __osRestoreInt(saveMask); +} diff --git a/lib/hackerlibultra/src/os/stoptimer.c b/lib/hackerlibultra/src/os/stoptimer.c new file mode 100644 index 00000000..8688d6f3 --- /dev/null +++ b/lib/hackerlibultra/src/os/stoptimer.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PRinternal/osint.h" +#include "PRinternal/viint.h" + +int osStopTimer(OSTimer* t) { + register u32 savedMask; + OSTimer* timep; + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSTOPTIMER, 0); + return 0; + } +#endif + + if (t->next == NULL) { + return -1; + } + + savedMask = __osDisableInt(); + timep = t->next; + + if (timep != __osTimerList) { + timep->value += t->value; + } + + t->prev->next = t->next; + t->next->prev = t->prev; + t->next = NULL; + t->prev = NULL; + + if (__osTimerList->next == __osTimerList) { + __osSetCompare(0); + } + + __osRestoreInt(savedMask); + return 0; +} diff --git a/lib/ultra/os/syncputchars.c b/lib/hackerlibultra/src/os/syncputchars.c similarity index 61% rename from lib/ultra/os/syncputchars.c rename to lib/hackerlibultra/src/os/syncputchars.c index 017b7310..d2d53328 100644 --- a/lib/ultra/os/syncputchars.c +++ b/lib/hackerlibultra/src/os/syncputchars.c @@ -1,14 +1,16 @@ #include "PR/os_internal.h" #include "PR/rdb.h" +#include "PR/rcp.h" #include "PR/R4300.h" -u32 __osRdbSendMessage = 0; -u32 __osRdbWriteOK = 1; +unsigned int __osRdbSendMessage = 0; +unsigned int __osRdbWriteOK = 1; -void __osSyncPutChars(s32 type, s32 length, u8 *buf) { +void __osSyncPutChars(int type, int length, const char* buf) { rdbPacket packet; - s32 i; + int i; u32 mask; + packet.type = type; packet.length = length; @@ -17,15 +19,17 @@ void __osSyncPutChars(s32 type, s32 length, u8 *buf) { } while (!__osAtomicDec(&__osRdbWriteOK)) { + ; } mask = __osDisableInt(); - *(u32 *) RDB_BASE_REG = *(u32 *) &packet; + *(vu32*)RDB_BASE_REG = *(vu32*)&packet; while (!(__osGetCause() & CAUSE_IP6)) { + ; } - *(u32 *) RDB_READ_INTR_REG = 0; + *(vu32*)RDB_READ_INTR_REG = 0; __osRdbWriteOK++; __osRestoreInt(mask); } diff --git a/lib/hackerlibultra/src/os/testhost.c b/lib/hackerlibultra/src/os/testhost.c new file mode 100644 index 00000000..c1343175 --- /dev/null +++ b/lib/hackerlibultra/src/os/testhost.c @@ -0,0 +1,12 @@ +#include "PR/os_internal.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif diff --git a/lib/hackerlibultra/src/os/thread.c b/lib/hackerlibultra/src/os/thread.c new file mode 100644 index 00000000..5a15a61d --- /dev/null +++ b/lib/hackerlibultra/src/os/thread.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "PRinternal/osint.h" + +struct __osThreadTail __osThreadTail = { NULL, -1 }; +OSThread* __osRunQueue = (OSThread*)&__osThreadTail; +OSThread* __osActiveQueue = (OSThread*)&__osThreadTail; +OSThread* __osRunningThread = NULL; +OSThread* __osFaultedThread = NULL; + +void __osDequeueThread(register OSThread** queue, register OSThread* t) { + register OSThread* pred; + register OSThread* succ; + + pred = (OSThread*)queue; + succ = pred->next; + + while (succ != NULL) { + if (succ == t) { + pred->next = t->next; +#ifdef _DEBUG + t->next = NULL; +#endif + return; + } + pred = succ; + succ = pred->next; + } +} diff --git a/lib/hackerlibultra/src/os/threadasm.h b/lib/hackerlibultra/src/os/threadasm.h new file mode 100644 index 00000000..852a7a3a --- /dev/null +++ b/lib/hackerlibultra/src/os/threadasm.h @@ -0,0 +1,68 @@ +#ifndef _THREADASM_H_ +#define _THREADASM_H_ + +/* Offsets of members in the OSThread struct */ +#define THREAD_NEXT 0 +#define THREAD_PRI 4 +#define THREAD_QUEUE 8 +#define THREAD_TLNEXT 12 +#define THREAD_STATE 16 +#define THREAD_FLAGS 18 +#define THREAD_ID 20 +#define THREAD_FP 24 +#define THREAD_GP1 32 +#define THREAD_GP2 40 +#define THREAD_GP3 48 +#define THREAD_GP4 56 +#define THREAD_GP5 64 +#define THREAD_GP6 72 +#define THREAD_GP7 80 +#define THREAD_GP8 88 +#define THREAD_GP9 96 +#define THREAD_GP10 104 +#define THREAD_GP11 112 +#define THREAD_GP12 120 +#define THREAD_GP13 128 +#define THREAD_GP14 136 +#define THREAD_GP15 144 +#define THREAD_GP16 152 +#define THREAD_GP17 160 +#define THREAD_GP18 168 +#define THREAD_GP19 176 +#define THREAD_GP20 184 +#define THREAD_GP21 192 +#define THREAD_GP22 200 +#define THREAD_GP23 208 +#define THREAD_GP24 216 +#define THREAD_GP25 224 +/* k0 and k1 are reserved for the kernel */ +#define THREAD_GP28 232 +#define THREAD_GP29 240 +#define THREAD_GP30 248 +#define THREAD_GP31 256 +#define THREAD_LO 264 +#define THREAD_HI 272 +#define THREAD_SR 280 +#define THREAD_PC 284 +#define THREAD_CAUSE 288 +#define THREAD_BADVADDR 292 +#define THREAD_RCP 296 +#define THREAD_FPCSR 300 +#define THREAD_FP0 304 +#define THREAD_FP2 312 +#define THREAD_FP4 320 +#define THREAD_FP6 328 +#define THREAD_FP8 336 +#define THREAD_FP10 344 +#define THREAD_FP12 352 +#define THREAD_FP14 360 +#define THREAD_FP16 368 +#define THREAD_FP18 376 +#define THREAD_FP20 384 +#define THREAD_FP22 392 +#define THREAD_FP24 400 +#define THREAD_FP26 408 +#define THREAD_FP28 416 +#define THREAD_FP30 424 + +#endif diff --git a/lib/ultra/os/timerintr.c b/lib/hackerlibultra/src/os/timerintr.c similarity index 57% rename from lib/ultra/os/timerintr.c rename to lib/hackerlibultra/src/os/timerintr.c index 8a590743..fe926025 100644 --- a/lib/ultra/os/timerintr.c +++ b/lib/hackerlibultra/src/os/timerintr.c @@ -1,12 +1,20 @@ +#include "PRinternal/macros.h" #include "PR/os_internal.h" -#include "osint.h" +#include "PRinternal/osint.h" -OSTimer __osBaseTimer; OSTime __osCurrentTime; u32 __osBaseCounter; u32 __osViIntrCount; u32 __osTimerCounter; -OSTimer *__osTimerList = &__osBaseTimer; +OSTimer __osBaseTimer; +OSTimer* __osTimerList = &__osBaseTimer; + +#ifndef _FINALROM +OSMesgQueue __osProfTimerQ ALIGNED(0x8); +OSProf* __osProfileList; +OSProf* __osProfileListEnd; +u32 __osProfileOverflowBin; +#endif void __osTimerServicesInit(void) { __osCurrentTime = 0; @@ -19,14 +27,19 @@ void __osTimerServicesInit(void) { } void __osTimerInterrupt(void) { - OSTimer *t; + OSTimer* t; u32 count; - u32 elapsedCycles; + u32 elapsed_cycles; + +#ifndef _FINALROM + u32 pc; + s32 offset; + OSProf* prof = __osProfileList; +#endif if (__osTimerList->next == __osTimerList) { return; } - for (;;) { t = __osTimerList->next; @@ -37,11 +50,11 @@ void __osTimerInterrupt(void) { } count = osGetCount(); - elapsedCycles = count - __osTimerCounter; + elapsed_cycles = count - __osTimerCounter; __osTimerCounter = count; - if (elapsedCycles < t->value) { - t->value -= elapsedCycles; + if (elapsed_cycles < t->value) { + t->value -= elapsed_cycles; __osSetTimerIntr(t->value); break; } @@ -52,8 +65,31 @@ void __osTimerInterrupt(void) { t->prev = NULL; if (t->mq != NULL) { +#ifdef _FINALROM osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK); } +#else + if (t->mq != &__osProfTimerQ) { + osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK); + } else { + pc = __osRunQueue->context.pc; + for (prof = __osProfileList; prof < __osProfileListEnd; prof++) { + offset = pc - (u32)prof->text_start; + + if (offset >= 0) { + if ((s32)prof->text_end - (s32)pc > 0) { + (*(u16*)(u32)((offset >> 2) + prof->histo_base))++; + goto __ProfDone; + } + } + } + + __osProfileOverflowBin++; + } + } +#endif + + __ProfDone: if (t->interval != 0) { t->value = t->interval; @@ -63,10 +99,10 @@ void __osTimerInterrupt(void) { } void __osSetTimerIntr(OSTime tim) { - OSTime newTime; + OSTime NewTime; u32 savedMask; -#if LIBULTRA_VERSION >= OS_VER_K +#if BUILD_VERSION >= VERSION_K if (tim < 468) { tim = 468; } @@ -74,13 +110,13 @@ void __osSetTimerIntr(OSTime tim) { savedMask = __osDisableInt(); __osTimerCounter = osGetCount(); - newTime = __osTimerCounter + tim; - __osSetCompare(newTime); + NewTime = __osTimerCounter + tim; + __osSetCompare(NewTime); __osRestoreInt(savedMask); } -OSTime __osInsertTimer(OSTimer *t) { - OSTimer *timep; +OSTime __osInsertTimer(OSTimer* t) { + OSTimer* timep; OSTime tim; u32 savedMask = __osDisableInt(); diff --git a/lib/hackerlibultra/src/os/unmaptlb.s b/lib/hackerlibultra/src/os/unmaptlb.s new file mode 100644 index 00000000..db7606af --- /dev/null +++ b/lib/hackerlibultra/src/os/unmaptlb.s @@ -0,0 +1,45 @@ +#include "PR/ultraerror.h" +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osUnmapTLB) +#if defined (_DEBUG) && defined (__sgi) + bgez a0, 1f + nop + b 2f + nop +1: + li t0, 0x1F +.set noat + slt AT, a0, t0 + bnez AT, 3f + nop +.set at +2: + move a2, a0 + li a0, ERR_OSUNMAPTLB + li a1, 1 + j __osError + nop +3: +#endif + mfc0 t0, C0_ENTRYHI + mtc0 a0, C0_INX + li t1, K0BASE + mtc0 t1, C0_ENTRYHI + mtc0 zero, C0_ENTRYLO0 + mtc0 zero, C0_ENTRYLO1 + nop + tlbwi + nop + nop + nop + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osUnmapTLB) + diff --git a/lib/hackerlibultra/src/os/unmaptlball.s b/lib/hackerlibultra/src/os/unmaptlball.s new file mode 100644 index 00000000..0e09aa3e --- /dev/null +++ b/lib/hackerlibultra/src/os/unmaptlball.s @@ -0,0 +1,26 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +.set noreorder +LEAF(osUnmapTLBAll) + mfc0 t0, C0_ENTRYHI + li t1, NTLBENTRIES-1 /* last reserved for rdb */ + li t2, (K0BASE & TLBHI_VPN2MASK) + mtc0 t2, C0_ENTRYHI + mtc0 zero, C0_ENTRYLO0 + mtc0 zero, C0_ENTRYLO1 +1: + mtc0 t1, C0_INX + nop + tlbwi + nop + nop + addi t1, t1, -1 + bgez t1, 1b + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osUnmapTLBAll) diff --git a/lib/ultra/os/virtualtophysical.c b/lib/hackerlibultra/src/os/virtualtophysical.c similarity index 66% rename from lib/ultra/os/virtualtophysical.c rename to lib/hackerlibultra/src/os/virtualtophysical.c index 829f734e..a275c547 100644 --- a/lib/ultra/os/virtualtophysical.c +++ b/lib/hackerlibultra/src/os/virtualtophysical.c @@ -1,12 +1,12 @@ #include "PR/os_internal.h" #include "PR/R4300.h" -#include "osint.h" +#include "PRinternal/osint.h" -uintptr_t osVirtualToPhysical(void *addr) { +u32 osVirtualToPhysical(void* addr) { if (IS_KSEG0(addr)) { return K0_TO_PHYS(addr); } else if (IS_KSEG1(addr)) { - return (K1_TO_PHYS(addr)); + return K1_TO_PHYS(addr); } else { return __osProbeTLB(addr); } diff --git a/lib/hackerlibultra/src/os/writebackdcache.s b/lib/hackerlibultra/src/os/writebackdcache.s new file mode 100644 index 00000000..95d7c6fc --- /dev/null +++ b/lib/hackerlibultra/src/os/writebackdcache.s @@ -0,0 +1,54 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +/** + * void osWritebackDCache(void* vaddr, s32 nbytes); + * + * Writes back the contents of the data cache to main memory for `nbytes` at `vaddr`. + * If `nbytes` is as large as or larger than the data cache size, the entire cache is + * written back. + */ +LEAF(osWritebackDCache) + /* If the amount to write back is less than or equal to 0, return immediately */ + blez a1, 2f + /* + * If the amount to write back is as large as or larger than + * the data cache size, write back all + */ + li t3, DCACHE_SIZE + bgeu a1, t3, 3f + /* + * ensure end address does not wrap around and end up smaller + * than the start address + */ + move t0, a0 + addu t1, a0, a1 + bgeu t0, t1, 2f + /* Mask and subtract to align to cache line */ + addiu t1, t1, -DCACHE_LINESIZE + andi t2, t0, DCACHE_LINEMASK + subu t0, t0, t2 +1: + .set noreorder + cache (C_HWB | CACH_PD), (t0) + bltu t0, t1, 1b + addiu t0, t0, DCACHE_LINESIZE + .set reorder +2: + jr ra + +/* same as osWritebackDCacheAll in operation */ +3: + li t0, K0BASE + addu t1, t0, t3 + addiu t1, t1, -DCACHE_LINESIZE +4: + .set noreorder + cache (C_IWBINV | CACH_PD), (t0) + bltu t0, t1, 4b + addiu t0, t0, DCACHE_LINESIZE + .set reorder + jr ra +END(osWritebackDCache) diff --git a/lib/ultra/os/writebackdcacheall.s b/lib/hackerlibultra/src/os/writebackdcacheall.s similarity index 74% rename from lib/ultra/os/writebackdcacheall.s rename to lib/hackerlibultra/src/os/writebackdcacheall.s index 7b05cdc1..d792be87 100644 --- a/lib/ultra/os/writebackdcacheall.s +++ b/lib/hackerlibultra/src/os/writebackdcacheall.s @@ -4,15 +4,15 @@ .text LEAF(osWritebackDCacheAll) - li t0, KUSIZE + li t0, K0BASE li t2, DCACHE_SIZE addu t1, t0, t2 addiu t1, t1, -DCACHE_LINESIZE 1: - CACHE( (C_IWBINV | CACH_PD), (t0)) .set noreorder + cache (C_IWBINV | CACH_PD), (t0) bltu t0, t1, 1b - addiu t0, t0, DCACHE_LINESIZE + addiu t0, t0, DCACHE_LINESIZE .set reorder jr ra END(osWritebackDCacheAll) diff --git a/lib/ultra/os/yieldthread.c b/lib/hackerlibultra/src/os/yieldthread.c similarity index 88% rename from lib/ultra/os/yieldthread.c rename to lib/hackerlibultra/src/os/yieldthread.c index 9a4dafb8..976662b1 100644 --- a/lib/ultra/os/yieldthread.c +++ b/lib/hackerlibultra/src/os/yieldthread.c @@ -1,5 +1,5 @@ #include "PR/os_internal.h" -#include "osint.h" +#include "PRinternal/osint.h" void osYieldThread(void) { register u32 saveMask = __osDisableInt(); diff --git a/lib/hackerlibultra/src/rg/free.c b/lib/hackerlibultra/src/rg/free.c new file mode 100644 index 00000000..23fa3977 --- /dev/null +++ b/lib/hackerlibultra/src/rg/free.c @@ -0,0 +1,37 @@ +#include "PR/region.h" +#include "PR/R4300.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osFree(void* region, void* addr) { + register OSRegion* rp = region; + int i; + +#ifdef _DEBUG + assert((region != NULL) && (addr != NULL)); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSFREE_REGION, 1, region); + return; + } +#endif + + i = ((u8*)addr - rp->r_startBufferAddress) / rp->r_bufferSize; + +#ifdef _DEBUG + if ((i < 0) || (i >= rp->r_bufferCount)) { + __osError(ERR_OSFREE_ADDR, 2, addr, region); + return; + } + + if (((unsigned char*)addr - rp->r_startBufferAddress) % (rp->r_bufferSize) != 0) { + __osError(ERR_OSFREE_ADDR, 2, addr, region); + return; + } +#endif + *(u16*)(&rp->r_startBufferAddress[i * rp->r_bufferSize]) = rp->r_freeList; + rp->r_freeList = i; +} diff --git a/lib/hackerlibultra/src/rg/getbufcount.c b/lib/hackerlibultra/src/rg/getbufcount.c new file mode 100644 index 00000000..7b4dd96d --- /dev/null +++ b/lib/hackerlibultra/src/rg/getbufcount.c @@ -0,0 +1,20 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osGetRegionBufCount(void* region) { + register OSRegion* rp = region; + +#ifdef _DEBUG + assert(rp != NULL); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSGETREGIONBUFCOUNT, 1, region); + return 0; + } +#endif + return rp->r_bufferCount; +} diff --git a/lib/hackerlibultra/src/rg/getsize.c b/lib/hackerlibultra/src/rg/getsize.c new file mode 100644 index 00000000..1cbc5bed --- /dev/null +++ b/lib/hackerlibultra/src/rg/getsize.c @@ -0,0 +1,21 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +s32 osGetRegionBufSize(void* region) { + register OSRegion* rp = region; + +#ifdef _DEBUG + assert(rp != NULL); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSGETREGIONBUFSIZE, 1, region); + return 0; + } +#endif + + return rp->r_bufferSize; +} diff --git a/lib/hackerlibultra/src/rg/malloc.c b/lib/hackerlibultra/src/rg/malloc.c new file mode 100644 index 00000000..e3974207 --- /dev/null +++ b/lib/hackerlibultra/src/rg/malloc.c @@ -0,0 +1,28 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "PR/os_internal.h" +#include "assert.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void* osMalloc(void* region) { + register OSRegion* rp = region; + char* addr; + +#ifdef _DEBUG + assert(rp != NULL); + if (((char*)rp + ALIGN(sizeof(OSRegion), rp->r_alignSize)) != rp->r_startBufferAddress) { + __osError(ERR_OSMALLOC, 1, region); + return NULL; + } +#endif + + if (rp->r_freeList == MAX_BUFCOUNT) { + return NULL; + } + + addr = &rp->r_startBufferAddress[rp->r_freeList * rp->r_bufferSize]; + rp->r_freeList = *(u16*)addr; + return addr; +} diff --git a/lib/hackerlibultra/src/rg/printregion.c b/lib/hackerlibultra/src/rg/printregion.c new file mode 100644 index 00000000..947e61c5 --- /dev/null +++ b/lib/hackerlibultra/src/rg/printregion.c @@ -0,0 +1,27 @@ +#include "os_version.h" +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "PRinternal/osint.h" +#include "PR/rmon.h" +#include "PR/region.h" + +void __osPrintRegion(void* region) { + register OSRegion* rp = region; + int i; + + rmonPrintf("Region = 0x%x\n", rp); + rmonPrintf("\tstartBufferAddress = 0x%x\n", RP(startBufferAddress)); + rmonPrintf("\tendAddress = 0x%x\n", RP(endAddress)); + rmonPrintf("\tbufferSize = %d\n", RP(bufferSize)); + rmonPrintf("\tbufferCount = %d\n", RP(bufferCount)); + rmonPrintf("\tfreeList = %d\n", RP(freeList)); + rmonPrintf("\talignSize = %d\n", RP(alignSize)); + rmonPrintf("\tMemory Header Layout:\n"); + + for (i = 0; i < RP(bufferCount); i++) { + rmonPrintf("\tBuf[%d]:\tAddress: 0x%x Value: 0x%x\n", i, RP(startBufferAddress) + i * RP(bufferSize), + *(u16*)(RP(startBufferAddress) + i * RP(bufferSize))); + } +} + +#endif diff --git a/lib/hackerlibultra/src/rg/region.c b/lib/hackerlibultra/src/rg/region.c new file mode 100644 index 00000000..7d08c8d9 --- /dev/null +++ b/lib/hackerlibultra/src/rg/region.c @@ -0,0 +1,56 @@ +#include "PR/region.h" +#include "PR/ultraerror.h" +#include "os_internal_error.h" +#include "assert.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void* osCreateRegion(void* startAddress, u32 length, u32 bufferSize, u32 alignSize) { + register OSRegion* rp; + register int i; + register char* addr; + + assert(startAddress != NULL); + +#ifdef _DEBUG + if ((alignSize != 0) && (alignSize != OS_RG_ALIGN_2B) && (alignSize != OS_RG_ALIGN_4B) + && (alignSize != OS_RG_ALIGN_8B) && (alignSize != OS_RG_ALIGN_16B)) { + __osError(ERR_OSCREATEREGION_ALIGN, 1, alignSize); + return 0; + } +#endif + + if (alignSize == 0) { + alignSize = OS_RG_ALIGN_DEFAULT; + } + + rp = (OSRegion*)ALIGN(startAddress, alignSize); + length = length - ((s32)rp - (s32)startAddress); + rp->r_bufferSize = ALIGN(bufferSize, alignSize); + rp->r_bufferCount = (s32)(length - ALIGN(sizeof(OSRegion), alignSize)) / rp->r_bufferSize; + +#ifdef _DEBUG + if (rp->r_bufferCount <= 0) { + __osError(ERR_OSCREATEREGION_SIZE, 2, length, bufferSize); + return 0; + } +#endif + + if (rp->r_bufferCount > MAX_BUFCOUNT) { + rp->r_bufferCount = MAX_BUFCOUNT; + } + + rp->r_startBufferAddress = (u8*)rp + ALIGN(sizeof(OSRegion), alignSize); + rp->r_endAddress = (u8*)rp + length; + addr = rp->r_startBufferAddress; + + for (i = 0; i < rp->r_bufferCount - 1; i++) { + *((s16*)(&addr[i * rp->r_bufferSize])) = i + 1; + } + + *((u16*)(&addr[i * rp->r_bufferSize])) = BUF_FREE_WO_NEXT; + rp->r_alignSize = alignSize; + rp->r_freeList = 0; + return rp; +} diff --git a/lib/hackerlibultra/src/rmon/rmonbrk.c b/lib/hackerlibultra/src/rmon/rmonbrk.c new file mode 100644 index 00000000..27f0f96e --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonbrk.c @@ -0,0 +1,432 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PRinternal/dbgproto.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "PRinternal/rmonint.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +#define TMP_BP 0 +#define NUM_BREAKPOINTS 16 + +typedef struct { + TVushort type; + TVushort response; + TVid threadID; + void* pc; +} TVExceptionReplyMsg; + +typedef struct { + u32* breakAddress; + u32 oldInstruction; +} BREAKINFO; + +/* first breakpoint is reserved for implementing single-stepping */ +static BREAKINFO breakpoints[NUM_BREAKPOINTS] ALIGNED(0x8); +/* breakpoint for alternate branch target */ +static BREAKINFO altBreak; + +static BREAKINFO RCPbreakpoints[NUM_BREAKPOINTS] ALIGNED(0x8); + +u8 __rmonRcpAtBreak; + +static void rmonFindFaultedThreads(void); + +static void SetTempBreakpoint(u32* addr1, u32* addr2) { + STUBBED_PRINTF(("Set temp BP at %08x", addr1)); + if (addr2 != NULL) { + STUBBED_PRINTF((" and %08x", addr2)); + } + STUBBED_PRINTF(("\n")); + + /* Save the word at the target address to be restored later */ + breakpoints[TMP_BP].oldInstruction = *addr1; + /* Install a break instruction at the target address */ + *addr1 = MIPS_BREAK(16); + osWritebackDCache(addr1, sizeof(*addr1)); + osInvalICache(addr1, sizeof(*addr1)); + breakpoints[TMP_BP].breakAddress = addr1; + + /* Also do so for an alt address if required */ + if (addr2 != NULL) { + altBreak.oldInstruction = *addr2; + *addr2 = MIPS_BREAK(16); + osWritebackDCache(addr2, sizeof(*addr2)); + osInvalICache(addr2, sizeof(*addr2)); + altBreak.breakAddress = addr2; + } +} + +static void ClearTempBreakpoint(void) { + u32 inst; + + if (breakpoints[TMP_BP].breakAddress != NULL) { + inst = *breakpoints[TMP_BP].breakAddress; + + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + STUBBED_PRINTF(("ClearTempBreak @ %08x\n", breakpoints[TMP_BP].breakAddress)); + + /* After confirming that there is a break instruction with code at the target + address, restore the original contents of the word at the target address */ + *breakpoints[TMP_BP].breakAddress = breakpoints[TMP_BP].oldInstruction; + osWritebackDCache(breakpoints[TMP_BP].breakAddress, sizeof(*breakpoints[TMP_BP].breakAddress)); + osInvalICache(breakpoints[TMP_BP].breakAddress, sizeof(*breakpoints[TMP_BP].breakAddress)); + } + breakpoints[TMP_BP].breakAddress = NULL; + } + + /* Same as above for the alt breakpoint */ + if (altBreak.breakAddress != NULL) { + inst = *altBreak.breakAddress; + + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + STUBBED_PRINTF(("ClearTempBreak @ %08x\n", altBreak.breakAddress)); + + *altBreak.breakAddress = altBreak.oldInstruction; + osWritebackDCache(altBreak.breakAddress, sizeof(*altBreak.breakAddress)); + osInvalICache(altBreak.breakAddress, sizeof(*altBreak.breakAddress)); + } + altBreak.breakAddress = NULL; + } +} + +int __rmonSetBreak(KKHeader* req) { + register KKSetBkptRequest* request = (KKSetBkptRequest*)req; + register BREAKINFO* breakBase; + register BREAKINFO* whichBreak; + register BREAKINFO* lastBreak; + KKBkptEvent reply; + + STUBBED_PRINTF(("SetBreak at %08x, method %d\n", request->addr, req->method)); + + /* Select breakpoint list */ + if (req->method == RMON_RSP) { + breakBase = RCPbreakpoints; + whichBreak = &RCPbreakpoints[1]; + lastBreak = &RCPbreakpoints[NUM_BREAKPOINTS]; + } else { + breakBase = breakpoints; + whichBreak = &breakpoints[1]; + lastBreak = &breakpoints[NUM_BREAKPOINTS]; + } + + /* Find breakpoint slot */ + for (; whichBreak < lastBreak; whichBreak++) { + if (whichBreak->breakAddress != NULL) { + if (whichBreak->breakAddress == (u32*)request->addr) { + /* Breakpoint already set here */ + break; + } + continue; + } else { + /* Empty slot */ + break; + } + } + + /* No breakpoints available */ + if (whichBreak == lastBreak) { + return TV_ERROR_NO_MORE_IDS; + } + + /* Set breakpoint if not already set */ + if (whichBreak->breakAddress == NULL) { + if (req->method == RMON_RSP) { + whichBreak->oldInstruction = __rmonReadWordAt((u32*)request->addr); + __rmonWriteWordTo((u32*)request->addr, MIPS_BREAK((whichBreak - breakBase) + NUM_BREAKPOINTS)); + } else { + whichBreak->oldInstruction = *(u32*)request->addr; + *(u32*)request->addr = MIPS_BREAK((whichBreak - breakBase) + NUM_BREAKPOINTS); + osWritebackDCache((void*)request->addr, sizeof(whichBreak->oldInstruction)); + osInvalICache((void*)request->addr, sizeof(whichBreak->oldInstruction)); + } + whichBreak->breakAddress = (u32*)request->addr; + STUBBED_PRINTF(("* (%08x) = %08x (was %08x)\n", whichBreak->breakAddress, *whichBreak->breakAddress, + whichBreak->oldInstruction)); + } + + /* Send reply */ + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->object; + reply.bp = whichBreak - breakBase; + reply.instruction = whichBreak->oldInstruction; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonListBreak(KKHeader* request UNUSED) { + STUBBED_PRINTF(("ListBreak\n")); + + return TV_ERROR_ILLEGAL_CALL; +} + +int __rmonClearBreak(KKHeader* req) { + register KKClrBkptRequest* request = (KKClrBkptRequest*)req; + register BREAKINFO* whichBreak; + KKBkptEvent reply; + u32 inst; + + STUBBED_PRINTF(("ClearBreak\n")); + + /* Check valid breakpoint index */ + if (request->bp >= NUM_BREAKPOINTS) { + return TV_ERROR_INVALID_ID; + } + + /* Clear the breakpoint, restore whatever was there before */ + if (req->method == RMON_RSP) { + whichBreak = &RCPbreakpoints[request->bp]; + + if (whichBreak->breakAddress == NULL) { + return TV_ERROR_INVALID_ID; + } + + inst = __rmonReadWordAt(whichBreak->breakAddress); + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + __rmonWriteWordTo(whichBreak->breakAddress, whichBreak->oldInstruction); + } + } else { + whichBreak = &breakpoints[request->bp]; + + if (whichBreak->breakAddress == NULL) { + return TV_ERROR_INVALID_ID; + } + + inst = *whichBreak->breakAddress; + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + *whichBreak->breakAddress = whichBreak->oldInstruction; + osWritebackDCache(whichBreak->breakAddress, sizeof(*whichBreak->breakAddress)); + osInvalICache(whichBreak->breakAddress, sizeof(*whichBreak->breakAddress)); + } + } + whichBreak->breakAddress = NULL; + + /* Send reply */ + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->object; + reply.bp = request->bp; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +u32 __rmonGetBranchTarget(int method, int thread, char* addr) { + int inst; + + if (method == RMON_RSP) { + inst = __rmonReadWordAt((u32*)addr); + } else { + inst = *(u32*)addr; + } + + switch ((inst >> 26) & 0x3F) { + case 0: /* SPECIAL */ + if (((inst >> 5) & 0x7FFF) == 0 && (inst & 0x3F) == 8) { + /* JR */ + return __rmonGetRegisterContents(method, thread, (inst >> 21) & 0x1F); + } + if (((inst >> 16) & 0x1F) == 0 && (inst & 0x7FF) == 9) { + /* JALR */ + return __rmonGetRegisterContents(method, thread, (inst >> 21) & 0x1F); + } + break; + case 1: /* REGIMM */ + switch ((inst >> 16) & 0x1F) { + case 0: /* BLTZ */ + case 1: /* BGEZ */ + case 2: /* BLTZL */ + case 3: /* BGEZL */ + case 16: /* BLTZAL */ + case 17: /* BGEZAL */ + case 18: /* BLTZALL */ + case 19: /* BGEZALL */ + return (((inst << 0x10) >> 0xE) + addr + 4); + } + break; + case 2: /* J */ + case 3: /* JAL */ + return (((u32)inst << 6) >> 4) + (((s32)((u32)addr + 4) >> 0x1C) << 0x1C); + case 4: /* BEQ */ + case 5: /* BNE */ + case 20: /* BEQL */ + case 21: /* BNEL */ + return (((inst << 0x10) >> 0xE) + addr + 4); + case 6: /* BLEZ */ + case 7: /* BGTZ */ + case 22: /* BLEZL */ + case 23: /* BGTZL */ + if (((inst >> 16) & 0x1F) == 0) { + return (((inst << 0x10) >> 0xE) + addr + 4); + } + break; + case 16: /* COP0 */ + case 17: /* COP1 */ + case 18: /* COP2 */ + case 19: /* COP3 */ + if (((inst >> 21) & 0x1F) == 8) { + switch ((inst >> 16) & 0x1F) { + case 0: /* BCzF */ + case 1: /* BCzT */ + case 2: /* BCzFL */ + case 3: /* BCzTL */ + return (((inst << 0x10) >> 0xE) + addr + 4); + } + } + break; + } + return -1; +} + +static int IsJump(u32 inst) { + switch ((inst >> 26) & 0x3F) { + case 0: /* SPECIAL */ + if (((inst >> 5) & 0x7FFF) == 0 && (inst & 0x3F) == 8) { + /* JR */ + return TRUE; + } + if (((inst >> 16) & 0x1F) == 0 && (inst & 0x7FF) == 9) { + /* JALR */ + return TRUE; + } + break; + case 2: /* J */ + case 3: /* JAL */ + return TRUE; + } + return FALSE; +} + +int __rmonSetSingleStep(int thread, u32* instptr) { + u32 branchTarget = __rmonGetBranchTarget(RMON_CPU, thread, (void*)instptr); + + STUBBED_PRINTF(("SingleStep\n")); + + if ((branchTarget & 3) != 0) { + /* no branch target, set breakpoint at next pc */ + SetTempBreakpoint(instptr + 1, NULL); + } else if (branchTarget == (u32)instptr) { + /* branch target is this instruction, can't single step here */ + return FALSE; + } else if (IsJump(*instptr) || branchTarget == (u32)(instptr + 2)) { + /* unconditional branch, set at branch target */ + SetTempBreakpoint((u32*)branchTarget, NULL); + } else { + /* set two breakpoints for handling conditional branches */ + SetTempBreakpoint((u32*)branchTarget, instptr + 2); + } + return TRUE; +} + +void __rmonGetExceptionStatus(KKStatusEvent* reply) { + reply->status.flags = OS_STATE_STOPPED; + reply->status.why = 2; + reply->status.what = 0; + reply->status.rv = 0; + reply->status.info.major = 2; + reply->status.info.minor = 4; + reply->header.code = KK_CODE_THREAD_STATUS; + reply->header.error = TV_ERROR_NO_ERROR; + reply->header.length = sizeof(*reply); +} + +#define FAULT_BREAKNUM (NUM_BREAKPOINTS - 1) + +static void rmonSendBreakMessage(s32 whichThread, int breakNumber) { + KKStatusEvent reply; + + STUBBED_PRINTF(("Break %d in thread %d\n", breakNumber, whichThread)); + + /* Build thread exception status */ + __rmonGetThreadStatus(RMON_CPU, (whichThread != 0) ? whichThread : RMON_TID_NOTHREAD, &reply); + __rmonGetExceptionStatus(&reply); + + if (breakNumber == FAULT_BREAKNUM) { + /* Hit fault */ + reply.status.info.major = 1; + reply.status.info.minor = 2; + } + if (breakNumber < NUM_BREAKPOINTS) { + breakNumber = 0; + } else { + breakNumber -= NUM_BREAKPOINTS; + } + if (breakNumber != 0) { + /* Break not set by debugger, or set during single-step */ + reply.status.instr = MIPS_BREAK_OPCODE; + } + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_EXCEPTION); +} + +void __rmonHitBreak(void) { + STUBBED_PRINTF(("HitBreak\n")); + + /* Stop all user threads and report faulted threads */ + ClearTempBreakpoint(); + __rmonStopUserThreads(0); + rmonFindFaultedThreads(); +} + +void __rmonHitSpBreak(void) { + KKStatusEvent exceptionReply; + + STUBBED_PRINTF(("Hit SP Break\n")); + + /* Rewind RSP PC by one instruction to return to the location of the break instruction */ + __rmonWriteWordTo((u32*)SP_PC_REG, __rmonReadWordAt((u32*)SP_PC_REG) - 4); + + /* Report RSP break event */ + __rmonGetThreadStatus(RMON_RSP, RMON_TID_RSP, &exceptionReply); + __rmonGetExceptionStatus(&exceptionReply); + __rmonSendReply(&exceptionReply.header, sizeof(exceptionReply), KK_TYPE_EXCEPTION); + __rmonRcpAtBreak = TRUE; +} + +void __rmonHitCpuFault(void) { + STUBBED_PRINTF(("HitCpuFault\n")); + + /* Stop all user threads and report faulted threads */ + __rmonMaskIdleThreadInts(); + __rmonStopUserThreads(0); + rmonFindFaultedThreads(); +} + +static void rmonFindFaultedThreads(void) { + register OSThread* tptr = __osGetActiveQueue(); + + while (tptr->priority != -1) { + if (tptr->priority > OS_PRIORITY_IDLE && tptr->priority <= OS_PRIORITY_APPMAX) { + if (tptr->flags & OS_FLAG_CPU_BREAK) { + int inst = *(u32*)tptr->context.pc; + + STUBBED_PRINTF(("Brk in thread %d @ %08x, inst %08x\r\n", tptr->id, tptr->context.pc, inst)); + + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + rmonSendBreakMessage(tptr->id, inst >> 6); + } else { + rmonSendBreakMessage(tptr->id, 0); + } + } + if (tptr->flags & OS_FLAG_FAULT) { + __rmonSendFault(tptr); + rmonSendBreakMessage(tptr->id, FAULT_BREAKNUM); + } + } + tptr = tptr->tlnext; + } +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmoncmds.c b/lib/hackerlibultra/src/rmon/rmoncmds.c new file mode 100644 index 00000000..d35b853c --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmoncmds.c @@ -0,0 +1,54 @@ +#ifndef _FINALROM + +#include "PRinternal/dbgproto.h" +#include "PRinternal/rmonint.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +static int NotImplemented(KKHeader* dummy UNUSED) { + return TV_ERROR_ILLEGAL_CALL; +} + +static FUNPTR dispatchTable[] = { + __rmonLoadProgram, __rmonListProcesses, __rmonGetExeName, __rmonListThreads, __rmonThreadStatus, + NotImplemented, __rmonStopThread, __rmonRunThread, NotImplemented, NotImplemented, + __rmonSetFault, NotImplemented, __rmonGetRegionCount, __rmonGetRegions, __rmonGetGRegisters, + __rmonSetGRegisters, __rmonGetFRegisters, __rmonSetFRegisters, __rmonReadMem, __rmonWriteMem, + __rmonSetBreak, __rmonClearBreak, __rmonListBreak, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + __rmonSetComm, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, NotImplemented, + NotImplemented, NotImplemented, NotImplemented, NotImplemented, __rmonGetSRegs, + __rmonSetSRegs, __rmonGetVRegs, __rmonSetVRegs, NotImplemented, +}; + +int __rmonExecute(KKHeader* request) { + int retval; + KKHeader reply; + + if (request->code >= ARRLEN(dispatchTable) - 1) { + return TV_ERROR_ILLEGAL_CALL; + } + + retval = dispatchTable[(int)request->code](request); + if (retval < TV_ERROR_NO_ERROR) { + reply.code = request->code; + reply.error = retval; + __rmonSendReply(&reply, sizeof(reply), KK_TYPE_REPLY); + } + return retval; +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmonmain.c b/lib/hackerlibultra/src/rmon/rmonmain.c new file mode 100644 index 00000000..7ac70497 --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonmain.c @@ -0,0 +1,137 @@ +#include "PR/os_version.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +#ifndef _FINALROM + +#include "PRinternal/dbgproto.h" +#include "PR/os_internal.h" +#include "PRinternal/rmonint.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "PR/rdb.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +int __rmonActive = FALSE; + +static vu32 somethingToDo; +static u32 inbuffer[280] ALIGNED(0x10); +static u8 cmdinptr; +static u8 cmdoutptr; +static int state; +static char* inPointer; + +void __rmonSendHeader(KKHeader* const block, u32 blockSize, u32 type) { + int sent; + char* cPtr = (char*)block; + + block->rev = KK_REV; + block->type = type; + + sent = 0; + while (sent < blockSize) { + sent += __osRdbSend(cPtr + sent, blockSize - sent, RDB_TYPE_GtoH_DEBUG); + } +} + +void __rmonSendReply(KKHeader* const block, u32 blockSize, u32 replyType) { + char* cPtr; + int sent = 0; + + block->length = blockSize; + cPtr = (char*)&blockSize; + + /* send size */ + while (sent < (signed)sizeof(blockSize)) { + sent += __osRdbSend(cPtr + sent, sizeof(blockSize) - sent, RDB_TYPE_GtoH_DEBUG); + } + + /* send data */ + __rmonSendHeader(block, blockSize, replyType); + __rmonIOflush(); +} + +void __rmonSendData(char* const block, unsigned int blockSize) { + int* blockPointer = (int*)block; + unsigned int wordCount = (u32)(blockSize + 3) / 4; + u32 data; + union { + char bufBytes[4]; + u32 bufWord; + } buffer; + + if (((u32)block & 3) == 0) { + while (wordCount--) { + if ((u32)blockPointer >= SP_DMEM_START && (u32)blockPointer < 0x05000000) { + __osSpRawReadIo((u32)blockPointer++, &data); + __rmonIOputw(data); + } else { + __rmonIOputw(*(blockPointer++)); + } + } + } else + while (wordCount--) { + __rmonMemcpy((u8*)buffer.bufBytes, (u8*)blockPointer, sizeof(buffer)); + __rmonIOputw(buffer.bufWord); + blockPointer++; + } + __rmonIOflush(); +} + +void rmonMain(void) { + register int newChars UNUSED; + + STUBBED_PRINTF(("rmon: Thread %d created\n")); + STUBBED_PRINTF(("rmon: Thread %d destroyed\n")); + + somethingToDo = 0; + cmdoutptr = 0; + cmdinptr = 0; + + __rmonInit(); + __rmonActive = TRUE; + + state = 0, newChars = 0, inPointer = (void*)&inbuffer; + for (;;) { + OSMesg work; + + osRecvMesg(&__rmonMQ, &work, OS_MESG_BLOCK); + + somethingToDo |= (u32)work; + + if (somethingToDo & RMON_MESG_CPU_BREAK) { + somethingToDo &= ~RMON_MESG_CPU_BREAK; + __rmonHitBreak(); + } + if (somethingToDo & RMON_MESG_SP_BREAK) { + somethingToDo &= ~RMON_MESG_SP_BREAK; + __rmonHitSpBreak(); + } + if (somethingToDo & RMON_MESG_FAULT) { + somethingToDo &= ~RMON_MESG_FAULT; + __rmonHitCpuFault(); + } + if (somethingToDo & 0x10) { + somethingToDo; + somethingToDo &= (u8)~0x10; + } + if (somethingToDo & 0x20) { + somethingToDo; + somethingToDo &= (u8)~0x20; + } + } +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmonmem.c b/lib/hackerlibultra/src/rmon/rmonmem.c new file mode 100644 index 00000000..8616576b --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonmem.c @@ -0,0 +1,285 @@ +#include "PR/os_version.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +#ifndef _FINALROM + +#include "PRinternal/dbgproto.h" +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "PRinternal/rmonint.h" +#include "PR/rdb.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +u8 __rmonUtilityBuffer[256] ALIGNED(0x8); + +void __rmonWriteWordTo(u32* addr, u32 val) { + while (__osSpRawWriteIo((u32)addr, val) != 0) { + ; + } +} + +u32 __rmonReadWordAt(u32* addr) { + u32 data; + + if ((u32)addr >= SP_DMEM_START && (u32)addr < 0x05000000) { + __osSpRawReadIo((u32)addr, &data); + return data; + } + return 0; +} + +void __rmonMemcpy(u8* dest, u8* srce, u32 count) { + while (count--) { + *dest++ = *srce++; + } +} + +void __rmonCopyWords(u32* dest, u32* srce, u32 count) { + while (count--) { + *dest++ = *srce++; + } +} + +static void strcpy(char* dest, char* srce) { + while ((*dest++ = *srce++)) { + ; + } +} + +int __rmonReadMem(KKHeader* req) { + char* cPtr; + int sent; + int dataSize; + KKReadRequest* request = (KKReadRequest*)req; + KKBufferEvent* reply = (KKBufferEvent*)__rmonUtilityBuffer; + u8* blockStart; + + STUBBED_PRINTF(("ReadMem @ %08x for %d\n", request->addr, request->nbytes)); + + reply->header.code = request->header.code; + reply->object = request->object; + reply->header.error = TV_ERROR_NO_ERROR; + + if (request->addr == (u32)-1) { + return TV_ERROR_INVALID_ADDRESS; + } + if (request->nbytes > RMON_MAX_XFER_SIZE) { + return TV_ERROR_INVALID_CAPABILITY; + } + + if (req->method == RMON_RSP) { + if (!((request->addr < SP_IMEM_START || (request->addr + request->nbytes) > SP_IMEM_END) ? FALSE : TRUE) + && !((request->addr < SP_DMEM_START || (request->addr + request->nbytes) > SP_DMEM_END) ? FALSE : TRUE)) { + return TV_ERROR_INVALID_ADDRESS; + } + } else if (osVirtualToPhysical((void*)request->addr) == (u32)-1) { + return TV_ERROR_INVALID_ADDRESS; + } + + blockStart = (u8*)request->addr; + reply->header.length = request->nbytes + sizeof(reply->header) + sizeof(reply->object); + dataSize = request->nbytes + sizeof(reply->header) + sizeof(reply->object); + + cPtr = (char*)&dataSize; + sent = 0; + while (sent < (signed)sizeof(dataSize)) { + sent += __osRdbSend(cPtr + sent, sizeof(dataSize) - sent, RDB_TYPE_GtoH_DEBUG); + } + + __rmonSendHeader(&reply->header, sizeof(reply->header) + sizeof(reply->object), KK_TYPE_REPLY); + __rmonSendData(blockStart, request->nbytes); + return TV_ERROR_NO_ERROR; +} + +int __rmonWriteMem(KKHeader* req) { + register KKWriteRequest* request = (KKWriteRequest*)req; + KKObjectEvent reply; + + STUBBED_PRINTF(("WriteMem\n")); + + /* Bad virtual address, abort */ + if (req->method == RMON_CPU && osVirtualToPhysical((u32*)request->writeHeader.addr) == (u32)-1) { + return TV_ERROR_INVALID_ADDRESS; + } + + /* Transfer size too large, abort */ + if (request->writeHeader.nbytes > RMON_MAX_XFER_SIZE) { + return TV_ERROR_INVALID_CAPABILITY; + } + + if (((request->writeHeader.addr < SP_DMEM_START + || (request->writeHeader.addr + request->writeHeader.nbytes) > 0x04FFFFFF) + ? FALSE + : TRUE)) { + int align; + u32 word; + + if ((align = request->writeHeader.addr & 3) != 0) { + STUBBED_PRINTF(("Long unaligned write...\n")); + + if (request->writeHeader.nbytes != 1) { + return TV_ERROR_INVALID_ADDRESS; + } + + /* Unaligned write; read the word, substitute in the written byte, write it back */ + word = __rmonReadWordAt((u32*)(request->writeHeader.addr & ~3)); + if (align == 1) { + word = (word & ~0xFF0000) | (request->buffer[0] << 0x10); + } else if (align == 2) { + word = (word & ~0xFF00) | (request->buffer[0] << 8); + } else { + word = (word & ~0xFF) | (request->buffer[0] << 0); + } + __rmonWriteWordTo((u32*)(request->writeHeader.addr & ~3), word); + } else { + int wordCount = request->writeHeader.nbytes / sizeof(u32); + u32* wordPointer = (u32*)request->buffer; + + if (request->writeHeader.nbytes % sizeof(u32) != 0) { + STUBBED_PRINTF(("RCP write not an integral number of words\n")); + return TV_ERROR_INVALID_ADDRESS; + } + + while (wordCount--) { + __rmonWriteWordTo((u32*)request->writeHeader.addr, *(wordPointer++)); + request->writeHeader.addr += sizeof(*wordPointer); + } + } + } else { + __rmonMemcpy((u8*)request->writeHeader.addr, (u8*)request->buffer, request->writeHeader.nbytes); + } + + reply.header.code = request->writeHeader.header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->writeHeader.object; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +int __rmonListProcesses(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKObjsEvent reply; + + STUBBED_PRINTF(("ListProcesses\n")); + + reply.object = 0; + reply.objs.number = 1; + reply.objs.objects[0] = (req->method == RMON_RSP) ? RMON_PID_RSP : RMON_PID_CPU; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonLoadProgram(KKHeader* request UNUSED) { + STUBBED_PRINTF(("LoadProgram\n")); + + return TV_ERROR_ILLEGAL_CALL; +} + +int __rmonGetExeName(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKBufferEvent* reply = (KKBufferEvent*)__rmonUtilityBuffer; + + STUBBED_PRINTF(("GetExeName\n")); + + reply->header.code = request->header.code; + reply->header.error = TV_ERROR_NO_ERROR; + reply->object = request->object; + + if (req->method == RMON_RSP) { + strcpy(reply->buffer, "imem"); + } else { + strcpy(reply->buffer, "rmon"); + } + __rmonSendReply(&reply->header, sizeof(reply->header) + sizeof(reply->object) + 8, KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +int __rmonGetRegionCount(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKNumberEvent reply; + + STUBBED_PRINTF(("GetRegionCount\n")); + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->object; + + reply.number = (req->method == RMON_RSP) ? 2 : 5; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +int __rmonGetRegions(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKRegionEvent* reply = (KKRegionEvent*)__rmonUtilityBuffer; + int numRegions; + + STUBBED_PRINTF(("GetRegions\n")); + + numRegions = (req->method == RMON_RSP) ? 2 : 6; + + reply->header.length = numRegions * sizeof(reply->regions[0]) + sizeof(*reply); + reply->header.code = request->header.code; + reply->header.error = TV_ERROR_NO_ERROR; + reply->object = request->object; + reply->number = numRegions; + + reply->regions[1].vaddr = SP_IMEM_START; + reply->regions[1].size = SP_IMEM_END + 1 - SP_IMEM_START; + reply->regions[1].flags = 1 | 2 | 4; + reply->regions[1].paddr = SP_IMEM_START; + + reply->regions[0].vaddr = SP_DMEM_START; + reply->regions[0].size = SP_DMEM_END + 1 - SP_DMEM_START; + reply->regions[0].flags = 1 | 2; + reply->regions[0].paddr = SP_DMEM_START; + + if (numRegions > 2) { + reply->regions[2].vaddr = 0x88200000; + reply->regions[2].size = 0x6130; + reply->regions[2].flags = 1 | 4; + reply->regions[2].paddr = 0; + + reply->regions[3].vaddr = 4; + reply->regions[3].size = 0x200000; + reply->regions[3].flags = 1 | 2; + reply->regions[3].paddr = 0; + + reply->regions[4].vaddr = 0x4002000; + reply->regions[4].size = 0x800000; + reply->regions[4].flags = 1 | 2; + reply->regions[4].paddr = 0; + + reply->regions[5].vaddr = 0x88206130; + reply->regions[5].size = 0x9000; + reply->regions[5].flags = 1 | 2; + reply->regions[5].paddr = 0; + } + + __rmonSendReply(&reply->header, reply->header.length, KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmonmisc.c b/lib/hackerlibultra/src/rmon/rmonmisc.c new file mode 100644 index 00000000..f13d8dc8 --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonmisc.c @@ -0,0 +1,75 @@ +#ifndef _FINALROM + +#include "PRinternal/dbgproto.h" +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "PRinternal/rmonint.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +int __rmonSetFault(KKHeader* req) { + KKFaultRequest* request = (KKFaultRequest*)req; + KKObjectEvent reply; + + STUBBED_PRINTF(("SetFault\n")); + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->tid; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +OSMesgQueue __rmonMQ ALIGNED(0x8); +static OSThread rmonIOThread ALIGNED(0x8); +static OSMesg rmonMsgs[8] ALIGNED(0x8); +static STACK(rmonIOStack, 0x4000) ALIGNED(0x10); +static OSMesg rmonPiMsgs[8] ALIGNED(0x8); +static OSMesgQueue rmonPiMQ ALIGNED(0x8); + +void __rmonInit(void) { + osCreateMesgQueue(&__rmonMQ, rmonMsgs, ARRLEN(rmonMsgs)); + osSetEventMesg(OS_EVENT_CPU_BREAK, &__rmonMQ, (OSMesg)RMON_MESG_CPU_BREAK); + osSetEventMesg(OS_EVENT_SP_BREAK, &__rmonMQ, (OSMesg)RMON_MESG_SP_BREAK); + osSetEventMesg(OS_EVENT_FAULT, &__rmonMQ, (OSMesg)RMON_MESG_FAULT); + osSetEventMesg(OS_EVENT_THREADSTATUS, &__rmonMQ, NULL); + osCreateThread(&rmonIOThread, 0, (void (*)(void*))__rmonIOhandler, NULL, STACK_START(rmonIOStack), OS_PRIORITY_MAX); + osCreatePiManager(OS_PRIORITY_PIMGR, &rmonPiMQ, rmonPiMsgs, ARRLEN(rmonPiMsgs)); + osStartThread(&rmonIOThread); +} + +void __rmonPanic(void) { + STUBBED_PRINTF(("PANIC!!\n")); + + for (;;) { + ; + } +} + +int __rmonSetComm(KKHeader* req) { + KKObjectEvent reply; + + STUBBED_PRINTF(("SetComm\n")); + + reply.header.code = req->code; + reply.object = 0; + reply.header.error = TV_ERROR_NO_ERROR; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + return TV_ERROR_NO_ERROR; +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmonprint.c b/lib/hackerlibultra/src/rmon/rmonprint.c new file mode 100644 index 00000000..8ac91a5f --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonprint.c @@ -0,0 +1 @@ +/* Empty file */ diff --git a/lib/hackerlibultra/src/rmon/rmonrcp.s b/lib/hackerlibultra/src/rmon/rmonrcp.s new file mode 100644 index 00000000..bddc1725 --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonrcp.s @@ -0,0 +1,60 @@ +#include "PR/os_version.h" +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/rcp.h" +#include "PR/R4300.h" + +.text + +/* check if the rsp is currently running by polling HALT or BROKE bits in SP_STATUS */ +LEAF(__rmonRCPrunning) + move v0, zero + lw t0, PHYS_TO_K1(SP_STATUS_REG) + and t0, (SP_STATUS_HALT | SP_STATUS_BROKE) + bnez t0, isHalted + ori v0, 1 +isHalted: + jr ra +END(__rmonRCPrunning) + +/* stop the rsp, first wait for any ongoing dma to complete before setting HALT in SP_STATUS */ +LEAF(__rmonIdleRCP) + li a0, PHYS_TO_K1(SP_DMA_BUSY_REG) +wait4dma: + lw v0, (a0) + bnez v0, wait4dma + li a1, SP_CLR_INTR_BREAK | SP_SET_HALT + li a0, PHYS_TO_K1(SP_STATUS_REG) + sw a1, (a0) + +/* wait for the rsp to stop */ +awaitIdle: + li a0, PHYS_TO_K1(SP_STATUS_REG) + lw v0, (a0) + and v0, (SP_STATUS_HALT | SP_STATUS_BROKE) + beqz v0, awaitIdle + jr ra +END(__rmonIdleRCP) + +/* run the rsp in single-step mode to step one instruction */ +LEAF(__rmonStepRCP) + li a0, PHYS_TO_K1(SP_STATUS_REG) + li a1, (SP_CLR_INTR_BREAK | SP_SET_SSTEP | SP_CLR_BROKE | SP_CLR_HALT) + sw a1, (a0) + b awaitIdle +END(__rmonStepRCP) + +/* run the rsp normally */ +LEAF(__rmonRunRCP) + li a0, PHYS_TO_K1(MI_INTR_MASK_REG) + li a1, MI_INTR_MASK_SET_SP + sw a1, (a0) + li a0, PHYS_TO_K1(SP_STATUS_REG) + li a1, (SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT) + sw a1, (a0) + jr ra +END(__rmonRunRCP) + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmonregs.c b/lib/hackerlibultra/src/rmon/rmonregs.c new file mode 100644 index 00000000..fdece90c --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonregs.c @@ -0,0 +1,417 @@ +#ifndef _FINALROM + +#include "PRinternal/dbgproto.h" +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "PRinternal/rmonint.h" +#include "PR/rdb.h" +#include "PR/os_version.h" + +#include "PRinternal/macros.h" + +// TODO: these come from headers +#if BUILD_VERSION >= VERSION_K +#ident "$Revision: 1.4 $" +// This revision was bumped down at K for some reason +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#elif BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#ident "$Revision: 3.71 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +static u32 RCPpc; +static u32 oldIMEMvalue; +static u32 DMEMbuffer[4] ALIGNED(0x8); + +typedef union { + u32 everything; + struct { + int opcode : 6; + int base : 5; + int rt : 5; + int offset : 16; + } scalarop; + struct { + int opcode : 6; + int base : 5; + int rt : 5; + int size : 5; + int element : 4; + int offset : 7; + } vectorop; +} INSTRUCTION; + +static void LoadStoreSU(int opcode, int regno) { + INSTRUCTION inst; + + /* Prepare a scalar load or store instruction at DMEM address 0 */ + inst.everything = 0; + inst.scalarop.opcode = opcode; + inst.scalarop.rt = regno; + __rmonWriteWordTo((u32*)SP_IMEM_START, inst.everything); + __rmonWriteWordTo((u32*)SP_PC_REG, 0); +} + +static void LoadStoreVU(int opcode, int regno) { + INSTRUCTION inst; + + /* Prepare a vector 128-bit load or store instruction at DMEM address 0 */ + inst.everything = 0; + inst.vectorop.opcode = opcode; + inst.vectorop.rt = regno; + inst.vectorop.size = 4; /* LQV / SQV */ + __rmonWriteWordTo((u32*)SP_IMEM_START, inst.everything); + __rmonWriteWordTo((u32*)SP_PC_REG, 0); +} + +static void SetUpForRCPop(int isVector) { + /* Save RSP data that would be overwritten when reading or writing registers */ + RCPpc = __rmonReadWordAt((u32*)SP_PC_REG); + oldIMEMvalue = __rmonReadWordAt((u32*)SP_IMEM_START); + DMEMbuffer[0] = __rmonReadWordAt((u32*)SP_DMEM_START); + if (isVector) { + DMEMbuffer[1] = __rmonReadWordAt((u32*)(SP_DMEM_START + 0x4)); + DMEMbuffer[2] = __rmonReadWordAt((u32*)(SP_DMEM_START + 0x8)); + DMEMbuffer[3] = __rmonReadWordAt((u32*)(SP_DMEM_START + 0xC)); + } +} + +static void CleanupFromRCPop(int isVector) { + /* Restore RSP data that was saved to read or write registers */ + __rmonWriteWordTo((u32*)SP_DMEM_START, DMEMbuffer[0]); + if (isVector) { + __rmonWriteWordTo((u32*)(SP_DMEM_START + 0x4), DMEMbuffer[1]); + __rmonWriteWordTo((u32*)(SP_DMEM_START + 0x8), DMEMbuffer[2]); + /* BUG: the last word is not restored properly */ + __rmonWriteWordTo((u32*)(SP_DMEM_START + 0xC), DMEMbuffer[2]); + } + __rmonWriteWordTo((u32*)SP_IMEM_START, oldIMEMvalue); + __rmonWriteWordTo((u32*)SP_PC_REG, RCPpc); +} + +int __rmonGetGRegisters(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKGregEvent reply; + + STUBBED_PRINTF(("GetGRegisters\n")); + + reply.tid = request->object; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + + if (request->header.method == RMON_CPU) { + OSThread* tptr = __rmonGetTCB(request->object); + u64* tcbregptr; + register s32 i; + + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + for (i = GREG_IDX_AT, tcbregptr = &tptr->context.at; i < GREG_IDX_K0; i++, tcbregptr++) { + reply.registers.gregs[i] = *tcbregptr; + } + for (i = GREG_IDX_GP, tcbregptr = &tptr->context.gp; i < GREG_IDX_CAUSE; i++, tcbregptr++) { + reply.registers.gregs[i] = *tcbregptr; + } + + reply.registers.gregs[GREG_IDX_CAUSE] = tptr->context.cause; + reply.registers.gregs[GREG_IDX_PC] = tptr->context.pc; + reply.registers.gregs[GREG_IDX_SR] = tptr->context.sr; + reply.registers.gregs[GREG_IDX_ZERO] = 0; + } else { + return TV_ERROR_INVALID_ID; + } + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonSetGRegisters(KKHeader* req) { + register KKGRegsetRequest* request = (KKGRegsetRequest*)req; + KKObjectEvent reply; + + STUBBED_PRINTF(("SetGRegisters\n")); + + if (request->header.method == RMON_CPU) { + OSThread* tptr = __rmonGetTCB(request->tid); + u64* tcbregptr; + register int i; + + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + for (i = GREG_IDX_AT, tcbregptr = &tptr->context.at; i < GREG_IDX_K0; i++, tcbregptr++) { + *tcbregptr = (s32)request->registers.gregs[i]; + } + + for (i = GREG_IDX_GP, tcbregptr = &tptr->context.gp; i < GREG_IDX_CAUSE; i++, tcbregptr++) { + *tcbregptr = (s32)request->registers.gregs[i]; + } + + tptr->context.cause = request->registers.gregs[GREG_IDX_CAUSE]; + tptr->context.pc = request->registers.gregs[GREG_IDX_PC]; + tptr->context.sr = request->registers.gregs[GREG_IDX_SR]; + } else { + return TV_ERROR_INVALID_ID; + } + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonGetFRegisters(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKFPregEvent reply; + OSThread* tptr; + volatile float f UNUSED; + + STUBBED_PRINTF(("GetFRegisters\n")); + + if (req->method != RMON_CPU) { + return TV_ERROR_INVALID_ID; + } + + /* touch fpu to ensure registers are saved to the context structure */ + f = 0.0f; + + tptr = __rmonGetTCB(request->object); + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + __rmonCopyWords((u32*)reply.registers.fpregs.regs, (u32*)&tptr->context.fp0, ARRLEN(reply.registers.fpregs.regs)); + + reply.registers.fpcsr = tptr->context.fpcsr; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.tid = request->object; + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonSetFRegisters(KKHeader* req) { + register KKFPRegsetRequest* request = (KKFPRegsetRequest*)req; + KKObjectEvent reply; + OSThread* tptr; + volatile float f UNUSED; + + STUBBED_PRINTF(("SetFRegisters\n")); + + if (req->method != RMON_CPU) { + return TV_ERROR_INVALID_ID; + } + + /* touch fpu to ensure registers are saved to the context structure */ + f = 0.0f; + + tptr = __rmonGetTCB(request->tid); + if (tptr == NULL) { + return TV_ERROR_INVALID_ID; + } + + __rmonCopyWords((u32*)&tptr->context.fp0, (u32*)request->registers.fpregs.regs, + ARRLEN(request->registers.fpregs.regs)); + tptr->context.fpcsr = request->registers.fpcsr; + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +static u32 rmonGetRcpRegister(int regNumber) { + u32 contents; + + if (__rmonRCPrunning()) { + return 0; + } + + SetUpForRCPop(FALSE); + LoadStoreSU(MIPS_SW_OPCODE, regNumber); + __rmonStepRCP(); + contents = __rmonReadWordAt((u32*)SP_DMEM_START); + CleanupFromRCPop(FALSE); + + return contents; +} + +int __rmonGetSRegs(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKCpSregEvent reply; + register int i; + + STUBBED_PRINTF(("GetSRegisters\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + reply.tid = request->object; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + + SetUpForRCPop(FALSE); + for (i = SREG_IDX_ZERO; i <= SREG_IDX_RA; i++) { + LoadStoreSU(MIPS_SW_OPCODE, i); + __rmonStepRCP(); + reply.registers.sregs[i] = __rmonReadWordAt((u32*)SP_DMEM_START); + } + CleanupFromRCPop(FALSE); + + reply.registers.sregs[SREG_IDX_DRAM_ADDR] = __rmonReadWordAt((u32*)SP_DRAM_ADDR_REG); + reply.registers.sregs[SREG_IDX_MEM_ADDR] = __rmonReadWordAt((u32*)SP_MEM_ADDR_REG); + reply.registers.sregs[SREG_IDX_RD_LEN] = __rmonReadWordAt((u32*)SP_RD_LEN_REG); + reply.registers.sregs[SREG_IDX_PC] = __rmonReadWordAt((u32*)SP_PC_REG) + SP_IMEM_START; + reply.registers.sregs[SREG_IDX_WR_LEN] = __rmonReadWordAt((u32*)SP_WR_LEN_REG); + reply.registers.sregs[SREG_IDX_STATUS] = __rmonReadWordAt((u32*)SP_STATUS_REG); + reply.registers.sregs[SREG_IDX_DMA_FULL] = __rmonReadWordAt((u32*)SP_DMA_FULL_REG); + reply.registers.sregs[SREG_IDX_DMA_BUSY] = __rmonReadWordAt((u32*)SP_DMA_BUSY_REG); + + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonSetSRegs(KKHeader* req) { + register KKCpScalarRegsetRequest* request = (KKCpScalarRegsetRequest*)req; + KKObjectEvent reply; + register int i; + + STUBBED_PRINTF(("SetSRegisters\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + SetUpForRCPop(FALSE); + for (i = SREG_IDX_ZERO; i <= SREG_IDX_RA; i++) { + __rmonWriteWordTo((u32*)SP_DMEM_START, request->registers.sregs[i]); + LoadStoreSU(MIPS_LW_OPCODE, i); + __rmonStepRCP(); + } + CleanupFromRCPop(FALSE); + + __rmonWriteWordTo((u32*)SP_DRAM_ADDR_REG, request->registers.sregs[SREG_IDX_DRAM_ADDR]); + __rmonWriteWordTo((u32*)SP_MEM_ADDR_REG, request->registers.sregs[SREG_IDX_MEM_ADDR]); + __rmonWriteWordTo((u32*)SP_PC_REG, request->registers.sregs[SREG_IDX_PC] & 0xFFF); + __rmonWriteWordTo((u32*)SP_WR_LEN_REG, request->registers.sregs[SREG_IDX_WR_LEN]); + __rmonWriteWordTo((u32*)SP_STATUS_REG, request->registers.sregs[SREG_IDX_STATUS]); + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonGetVRegs(KKHeader* req) { + char* cPtr; + int sent; + int dataSize; + register KKObjectRequest* request = (KKObjectRequest*)req; + KKCpVregEvent reply; + register int i; + + STUBBED_PRINTF(("GetVRegisters\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + reply.tid = request->object; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.header.length = sizeof(reply); + + dataSize = sizeof(reply); + cPtr = (char*)&dataSize; + sent = 0; + while (sent < (signed)sizeof(dataSize)) { + sent += __osRdbSend(cPtr + sent, sizeof(dataSize) - sent, RDB_TYPE_GtoH_DEBUG); + } + + __rmonSendHeader(&reply.header, VREG_SIZE, KK_TYPE_REPLY); + + SetUpForRCPop(TRUE); + for (i = 0; i < VREG_NUM; i++) { + LoadStoreVU(MIPS_SWC2_OPCODE, i); + __rmonStepRCP(); + __rmonSendData((void*)SP_DMEM_START, VREG_SIZE); + } + CleanupFromRCPop(TRUE); + + return TV_ERROR_NO_ERROR; +} + +int __rmonSetVRegs(KKHeader* req) { + register KKCpVectorRegsetRequest* request = (KKCpVectorRegsetRequest*)req; + KKObjectEvent reply; + register int i; + + STUBBED_PRINTF(("SetVRegs\n")); + + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + + SetUpForRCPop(TRUE); + for (i = 0; i < VREG_NUM; i++) { + __rmonCopyWords((u32*)SP_DMEM_START, (u32*)&request->registers.vregs[i], VREG_SIZE / sizeof(u32)); + LoadStoreVU(MIPS_LWC2_OPCODE, i); + __rmonStepRCP(); + } + CleanupFromRCPop(TRUE); + + reply.object = request->tid; + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +u32 __rmonGetRegisterContents(int method, int threadNumber, int regNumber) { + if (method == RMON_CPU) { + /* CPU register */ + u32* regPointer; + OSThread* tptr; + + if (regNumber >= GREG_IDX_AT && regNumber < GREG_IDX_K0) { + regNumber -= GREG_IDX_AT - GREG_IDX_ZERO; + } else if (regNumber >= GREG_IDX_GP && regNumber < GREG_IDX_LO) { + regNumber -= GREG_IDX_GP - GREG_IDX_T9; + } else { + return 0; + } + tptr = __rmonGetTCB(threadNumber); + if (tptr == NULL) { + return 0; + } + regPointer = (u32*)&tptr->context; + regPointer += regNumber; + return *regPointer; + } else { + /* RSP register */ + return rmonGetRcpRegister(regNumber); + } +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmonsio.c b/lib/hackerlibultra/src/rmon/rmonsio.c new file mode 100644 index 00000000..8b7c3fbc --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmonsio.c @@ -0,0 +1,89 @@ +#include "PR/os_version.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "PR/sptask.h" +#include "PRinternal/dbgproto.h" +#include "PRinternal/rmonint.h" +#include "PR/ramrom.h" +#include "PR/rdb.h" +#include "PR/rmon.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +static OSMesgQueue IOmq ALIGNED(0x8); +static OSMesg IOmsgs; + +void* __osRdb_DbgRead_Buf; +u8 rmonRdbReadBuf[RMON_DBG_BUF_SIZE] ALIGNED(0x10); + +void __rmonSendFault(OSThread* thread) { + volatile float f UNUSED; + u8* tPtr; + u32 sent = 0; + + /* touch fpu to ensure registers are saved to the context structure */ + f = 0.0f; + + tPtr = (u8*)thread; + while (sent < sizeof(OSThread)) { + sent += __osRdbSend(tPtr + sent, sizeof(OSThread) - sent, RDB_TYPE_GtoH_FAULT); + } +} + +void __rmonIOflush(void) { + int sent = 0; + char tstr[4]; + + while (sent <= 0) { + sent += __osRdbSend(tstr, 1, RDB_TYPE_GtoH_DEBUG_DONE); + } +} + +void __rmonIOputw(u32 word) { + int sent = 0; + char* cPtr = (char*)&word; + + while (sent < 4) { + sent += __osRdbSend(cPtr + sent, sizeof(word) - sent, RDB_TYPE_GtoH_DEBUG); + } +} + +void __rmonIOhandler(void) { + int sent; + char tstr[4]; + + osCreateMesgQueue(&IOmq, &IOmsgs, 1); + osSetEventMesg(OS_EVENT_RDB_DBG_DONE, &IOmq, NULL); + __osRdb_DbgRead_Buf = rmonRdbReadBuf; + + while (TRUE) { + osRecvMesg(&IOmq, NULL, OS_MESG_BLOCK); + + __rmonExecute((KKHeader*)&rmonRdbReadBuf); + __osRdb_DbgRead_Buf = rmonRdbReadBuf; + + sent = 0; + while (sent <= 0) { + sent += __osRdbSend(tstr, 1, RDB_TYPE_GtoH_DEBUG_READY); + } + } +} + +#endif diff --git a/lib/hackerlibultra/src/rmon/rmontask.c b/lib/hackerlibultra/src/rmon/rmontask.c new file mode 100644 index 00000000..b74e5623 --- /dev/null +++ b/lib/hackerlibultra/src/rmon/rmontask.c @@ -0,0 +1,345 @@ +#ifndef _FINALROM + +#include "PRinternal/dbgproto.h" +#include "PR/os_internal.h" +#include "PRinternal/rmonint.h" +#include "PR/rcp.h" +#include "PR/sptask.h" + +#include "PRinternal/macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#else +#ident "$Revision: 3.70 $" +#ident "$Revision: 1.5 $" +#ident "$Revision: 1.2 $" +#ident "$Revision: 1.4 $" +#ident "$Revision: 1.3 $" +#endif + +void __rmonMaskIdleThreadInts(void) { + register OSThread* tptr = __osGetActiveQueue(); + + while (tptr->priority != -1) { + if (tptr->priority == OS_PRIORITY_IDLE) { + tptr->context.sr &= ~OS_IM_CPU; + tptr->context.sr |= (OS_IM_RDBREAD | OS_IM_RDBWRITE | OS_IM_CART); + break; + } + tptr = tptr->tlnext; + } +} + +OSThread* __rmonGetTCB(int threadNumber) { + register OSThread* tptr = __osGetActiveQueue(); + + if (threadNumber < 1) { + return NULL; + } + + while (tptr->priority != -1) { + if (tptr->id == threadNumber) { + return tptr; + } + tptr = tptr->tlnext; + } + + return NULL; +} + +int __rmonStopUserThreads(int whichThread) { + register int whichOne = 0; + register OSThread* tptr = __osGetActiveQueue(); + + STUBBED_PRINTF(("StopThreads %d\n", whichThread)); + + if (whichThread != 0) { + /* Stop specified thread */ + + while (tptr->priority != -1) { + if (tptr->id == whichThread) { + break; + } + tptr = tptr->tlnext; + } + + if (tptr->priority == -1) { + return 0; + } + + if (tptr->priority > OS_PRIORITY_IDLE && tptr->priority <= OS_PRIORITY_APPMAX) { + osStopThread(tptr); + if (tptr->state != OS_STATE_STOPPED) { + STUBBED_PRINTF(("Couldn't stop thread %d\n", tptr->id)); + } + whichOne = whichThread; + } + } else { + /* Stop all threads */ + + while (tptr->priority != -1) { + if (tptr->priority > OS_PRIORITY_IDLE && tptr->priority <= OS_PRIORITY_APPMAX) { + osStopThread(tptr); + if (tptr->state != OS_STATE_STOPPED) { + STUBBED_PRINTF(("Couldn\'t stop thread %d\n", tptr->id)); + } + whichOne = -1; + } + tptr = tptr->tlnext; + } + } + return whichOne; +} + +int __rmonListThreads(KKHeader* req) { + register KKObjectRequest* request = (KKObjectRequest*)req; + KKObjsEvent* reply = (KKObjsEvent*)__rmonUtilityBuffer; + + STUBBED_PRINTF(("ListThreads\n")); + + reply->object = (request->object == -1) ? RMON_PID_CPU : request->object; + + if (req->method == RMON_RSP) { + reply->objs.number = 1; + reply->objs.objects[0] = RMON_TID_RSP; + } else { + register OSThread* tptr = __osGetActiveQueue(); + + reply->objs.number = 0; + + while (tptr->priority != -1) { + if (tptr->id != 0) { + reply->objs.objects[reply->objs.number] = tptr->id; + reply->objs.number++; + } + tptr = tptr->tlnext; + } + } + reply->header.code = request->header.code; + reply->header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply->header, sizeof(*reply) + sizeof(reply->objs.objects[0]) * (reply->objs.number - 1), + KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonGetThreadStatus(int method, int id, KKStatusEvent* reply) { + u32 inst; + + STUBBED_PRINTF(("ThreadStatus %d method %d\n", id, method)); + + reply->status.tid = id; + reply->status.pid = (method == RMON_RSP) ? RMON_PID_RSP : RMON_PID_CPU; + reply->status.why = 1; + reply->status.what = 0; + reply->status.info.major = 0; + reply->status.info.minor = 0; + reply->status.rv = 0; + + if (method == RMON_RSP) { + reply->status.start = SP_IMEM_START; + reply->status.priority = RMON_PRI_RSP; + + if (__rmonRCPrunning()) { + reply->status.flags = OS_STATE_RUNNING; + /* Cannot read RSP PC or current instruction while the RSP is running */ + reply->status.info.addr = 0; + reply->status.instr = 0; + } else { + reply->status.flags = OS_STATE_STOPPED; + reply->status.info.addr = __rmonReadWordAt((u32*)SP_PC_REG) + SP_IMEM_START; + inst = __rmonReadWordAt((u32*)reply->status.info.addr); + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + inst = MIPS_BREAK_OPCODE; + } + if (__rmonRcpAtBreak) { + /* Report RSP break */ + reply->status.why = 2; + reply->status.info.major = 2; + reply->status.info.minor = 4; + } + reply->status.instr = inst; + } + } else { + OSThread* tptr = __osGetActiveQueue(); + + while (tptr->priority != -1) { + if (tptr->id == id) { + break; + } + tptr = tptr->tlnext; + } + if (tptr->priority == -1) { + return TV_ERROR_INVALID_ID; + } + + reply->status.priority = tptr->priority; + reply->status.flags = (tptr->state != 0) ? tptr->state : OS_STATE_STOPPED; + reply->status.info.addr = tptr->context.pc; + + inst = *(u32*)(tptr->context.pc); + if ((inst & MIPS_BREAK_MASK) == MIPS_BREAK_OPCODE) { + inst = MIPS_BREAK_OPCODE; + } + + reply->status.instr = inst; + reply->status.start = (int)tptr; + + if (tptr->flags & OS_FLAG_CPU_BREAK) { + /* Report break */ + reply->status.why = 2; + reply->status.info.major = 2; + reply->status.info.minor = 4; + } else if (tptr->flags & OS_FLAG_FAULT) { + /* Report fault */ + reply->status.why = 2; + reply->status.info.major = 1; + reply->status.info.minor = 2; + } + } + + return TV_ERROR_NO_ERROR; +} + +int __rmonThreadStatus(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKStatusEvent reply; + + if (__rmonGetThreadStatus(req->method, request->object, &reply) != TV_ERROR_NO_ERROR) { + return TV_ERROR_INVALID_ID; + } + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + return TV_ERROR_NO_ERROR; +} + +int __rmonStopThread(KKHeader* req) { + KKObjectRequest* request = (KKObjectRequest*)req; + KKStatusEvent reply; + u32* pc; + + STUBBED_PRINTF(("StopThread %d\n", request->object)); + + switch (req->method) { + case RMON_CPU: + __rmonStopUserThreads(request->object); + break; + case RMON_RSP: + if (__rmonRCPrunning()) { + /* Stop the rsp */ + __rmonIdleRCP(); + pc = (u32*)__rmonReadWordAt((u32*)SP_PC_REG); + if (pc == NULL) { + break; + } + pc--; + /* Check if the RSP is stopped in a branch delay slot, if it is step out of it. The RSP + would otherwise lose information about whether the branch should or should not be + taken when reading registers. */ + if (__rmonGetBranchTarget(RMON_RSP, RMON_TID_RSP, (void*)((u32)pc + SP_IMEM_START)) % 4 == 0) { + __rmonStepRCP(); + } + } + break; + default: + return TV_ERROR_OPERATIONS_PROTECTED; + } + + if (__rmonGetThreadStatus(req->method, request->object, &reply) != TV_ERROR_NO_ERROR) { + return TV_ERROR_INVALID_ID; + } + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + if (reply.status.flags == OS_STATE_STOPPED) { + reply.header.code = KK_CODE_THREAD_STATUS; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_EXCEPTION); + } + return TV_ERROR_NO_ERROR; +} + +int __rmonRunThread(KKHeader* req) { + KKRunThreadRequest* request = (KKRunThreadRequest*)req; + KKObjectEvent reply; + KKStatusEvent exceptionReply; + register OSThread* tptr; + register int runNeeded = FALSE; + + STUBBED_PRINTF(("RunThread %d\n", request->tid)); + + switch (req->method) { + case RMON_CPU: + tptr = __osGetActiveQueue(); + while (tptr->priority != -1) { + if (tptr->id == request->tid) { + break; + } + tptr = tptr->tlnext; + } + + if (tptr->priority == -1) { + return TV_ERROR_INVALID_ID; + } + if (tptr->state != OS_STATE_STOPPED) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + tptr->flags &= ~(OS_FLAG_CPU_BREAK | OS_FLAG_FAULT); + if (request->actions.flags & KK_RUN_SETPC) { + tptr->context.pc = request->actions.vaddr; + } + if ((request->actions.flags & KK_RUN_SSTEP) && !__rmonSetSingleStep(request->tid, (u32*)tptr->context.pc)) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + runNeeded = TRUE; + break; + case RMON_RSP: + if (__rmonRCPrunning()) { + return TV_ERROR_OPERATIONS_PROTECTED; + } + if (request->actions.flags & KK_RUN_SETPC) { + __rmonWriteWordTo((u32*)SP_PC_REG, request->actions.vaddr - SP_IMEM_START); + } + if (request->actions.flags & KK_RUN_SSTEP) { + /* If the RSP is stopped at a branch step twice so as to not stop in a branch delay + * slot. */ + if (__rmonGetBranchTarget(RMON_RSP, RMON_TID_RSP, + (void*)(__rmonReadWordAt((u32*)SP_PC_REG) + SP_IMEM_START)) + % 4 + == 0) { + __rmonStepRCP(); + } + __rmonStepRCP(); + __rmonRcpAtBreak = TRUE; + } else { + __rmonRcpAtBreak = FALSE; + __rmonRunRCP(); + } + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->tid; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + if (request->actions.flags & KK_RUN_SSTEP) { + __rmonGetThreadStatus(RMON_RSP, RMON_TID_RSP, &exceptionReply); + __rmonGetExceptionStatus(&exceptionReply); + __rmonSendReply(&exceptionReply.header, sizeof(exceptionReply), KK_TYPE_EXCEPTION); + } + return TV_ERROR_NO_ERROR; + default: + return TV_ERROR_OPERATIONS_PROTECTED; + } + + reply.header.code = request->header.code; + reply.header.error = TV_ERROR_NO_ERROR; + reply.object = request->tid; + __rmonSendReply(&reply.header, sizeof(reply), KK_TYPE_REPLY); + + if (runNeeded) { + osStartThread(tptr); + } + return 1; +} + +#endif diff --git a/lib/hackerlibultra/src/sched/Makefile b/lib/hackerlibultra/src/sched/Makefile new file mode 100644 index 00000000..d4cd6590 --- /dev/null +++ b/lib/hackerlibultra/src/sched/Makefile @@ -0,0 +1,19 @@ +#!smake +# +# Makefile for the scheduler subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = \ + sched.c + +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/hackerlibultra/src/sched/sched.c b/lib/hackerlibultra/src/sched/sched.c new file mode 100644 index 00000000..53b3032f --- /dev/null +++ b/lib/hackerlibultra/src/sched/sched.c @@ -0,0 +1,593 @@ +/*==================================================================== + * + * Copyright 1995, Silicon Graphics, Inc. + * All Rights Reserved. + * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, + * Inc.; the contents of this file may not be disclosed to third + * parties, copied or duplicated in any form, in whole or in part, + * without the prior written permission of Silicon Graphics, Inc. + * + * RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to + * restrictions as set forth in subdivision (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS + * 252.227-7013, and/or in similar or successor clauses in the FAR, + * DOD or NASA FAR Supplement. Unpublished - rights reserved under the + * Copyright Laws of the United States. + *====================================================================*/ +#include +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/* + * private typedefs and defines + */ +#define VIDEO_MSG 666 +#define RSP_DONE_MSG 667 +#define RDP_DONE_MSG 668 +#define PRE_NMI_MSG 669 + +/* + * OSScTask state + */ +#define OS_SC_DP 0x0001 /* set if still needs dp */ +#define OS_SC_SP 0x0002 /* set if still needs sp */ +#define OS_SC_YIELD 0x0010 /* set if yield requested */ +#define OS_SC_YIELDED 0x0020 /* set if yield completed */ + +/* + * OSScTask->flags type identifier + */ +#define OS_SC_XBUS (OS_SC_SP | OS_SC_DP) +#define OS_SC_DRAM (OS_SC_SP | OS_SC_DP | OS_SC_DRAM_DLIST) +#define OS_SC_DP_XBUS (OS_SC_SP) +#define OS_SC_DP_DRAM (OS_SC_SP | OS_SC_DRAM_DLIST) +#define OS_SC_SP_XBUS (OS_SC_DP) +#define OS_SC_SP_DRAM (OS_SC_DP | OS_SC_DRAM_DLIST) + +/* + * private functions + */ +static void __scMain(void* arg); +static void __scHandleRetrace(OSSched* s); +static void __scHandleRSP(OSSched* s); +static void __scHandleRDP(OSSched* s); + +static void __scAppendList(OSSched* s, OSScTask* t); +OSScTask* __scTaskReady(OSScTask* t); +static s32 __scTaskComplete(OSSched* s, OSScTask* t); +static void __scExec(OSSched* sc, OSScTask* sp, OSScTask* dp); +static void __scYield(OSSched* s); +static s32 __scSchedule(OSSched* sc, OSScTask** sp, OSScTask** dp, s32 availRCP); + +/* +#define SC_LOGGING 1 +*/ + +#ifdef SC_LOGGING +#define SC_LOG_LEN 32 * 1024 +static OSLog scLog; +static OSLog* l = &scLog; +static u32 logArray[SC_LOG_LEN / sizeof(u32)]; +#endif + +/*********************************************************************** + * Scheduler API + **********************************************************************/ +void osCreateScheduler(OSSched* sc, void* stack, OSPri priority, u8 mode, u8 numFields) { + sc->curRSPTask = 0; + sc->curRDPTask = 0; + sc->clientList = 0; + sc->frameCount = 0; + sc->audioListHead = 0; + sc->gfxListHead = 0; + sc->audioListTail = 0; + sc->gfxListTail = 0; + sc->retraceMsg.type = OS_SC_RETRACE_MSG; /* sent to apps */ + sc->prenmiMsg.type = OS_SC_PRE_NMI_MSG; + + osCreateMesgQueue(&sc->interruptQ, sc->intBuf, OS_SC_MAX_MESGS); + osCreateMesgQueue(&sc->cmdQ, sc->cmdMsgBuf, OS_SC_MAX_MESGS); + + /* + * Set up video manager, listen for Video, RSP, and RDP interrupts + */ + osCreateViManager(OS_PRIORITY_VIMGR); + osViSetMode(&osViModeTable[mode]); + osViBlack(TRUE); + osSetEventMesg(OS_EVENT_SP, &sc->interruptQ, (OSMesg)RSP_DONE_MSG); + osSetEventMesg(OS_EVENT_DP, &sc->interruptQ, (OSMesg)RDP_DONE_MSG); + osSetEventMesg(OS_EVENT_PRENMI, &sc->interruptQ, (OSMesg)PRE_NMI_MSG); + + osViSetEvent(&sc->interruptQ, (OSMesg)VIDEO_MSG, numFields); + +#ifdef SC_LOGGING + osCreateLog(l, logArray, sizeof(logArray)); +#endif + + osCreateThread(&sc->thread, 4, __scMain, (void*)sc, stack, priority); + osStartThread(&sc->thread); +} + +/* + * Add a client to the scheduler. Clients receive messages at retrace time + */ +void osScAddClient(OSSched* sc, OSScClient* c, OSMesgQueue* msgQ) { + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + c->msgQ = msgQ; + c->next = sc->clientList; + sc->clientList = c; + + osSetIntMask(mask); +} + +void osScRemoveClient(OSSched* sc, OSScClient* c) { + OSScClient* client = sc->clientList; + OSScClient* prev = 0; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + while (client != 0) { + if (client == c) { + if (prev) + prev->next = c->next; + else + sc->clientList = c->next; + break; + } + prev = client; + client = client->next; + } + + osSetIntMask(mask); +} + +OSMesgQueue* osScGetCmdQ(OSSched* sc) { + return &sc->cmdQ; +} + +/*********************************************************************** + * Scheduler implementation + **********************************************************************/ +static void __scMain(void* arg) { + OSMesg msg; + OSSched* sc = (OSSched*)arg; + OSScClient* client; + static int count = 0; + + while (1) { + + osRecvMesg(&sc->interruptQ, (OSMesg*)&msg, OS_MESG_BLOCK); + +#ifdef SC_LOGGING + if (++count % 1024 == 0) + osFlushLog(l); +#endif + + switch ((int)msg) { + case (VIDEO_MSG): + __scHandleRetrace(sc); + break; + + case (RSP_DONE_MSG): + __scHandleRSP(sc); + break; + + case (RDP_DONE_MSG): + __scHandleRDP(sc); + break; + + case (PRE_NMI_MSG): + /* + * notify audio and graphics threads to fade out + */ + for (client = sc->clientList; client != 0; client = client->next) { + osSendMesg(client->msgQ, (OSMesg)&sc->prenmiMsg, OS_MESG_NOBLOCK); + } + break; + } + } +} + +/* + * scHandleRetrace() + */ +static int dp_busy = 0; +static int dpCount = 0; + +void __scHandleRetrace(OSSched* sc) { + OSScTask* rspTask; + OSScClient* client; + s32 i; + s32 state; + OSScTask* sp = 0; + OSScTask* dp = 0; + + sc->frameCount++; + +#ifdef SC_LOGGING + osLogEvent(l, 500, 4, sc->frameCount, sc->curRSPTask, sc->curRDPTask); +#endif + + /* + * Read the task command queue and schedule tasks + */ + while (osRecvMesg(&sc->cmdQ, (OSMesg*)&rspTask, OS_MESG_NOBLOCK) != -1) { + __scAppendList(sc, rspTask); + } + + if (sc->doAudio && sc->curRSPTask) { + /* + * Preempt the running gfx task. Note: if the RSP + * component of the graphics task has finished, but the + * RDP component is still running, we can start an audio + * task which will freeze the RDP (and save the RDP cmd + * FIFO) while the audio RSP code is running. + */ + __scYield(sc); + } else { + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if (__scSchedule(sc, &sp, &dp, state) != state) + __scExec(sc, sp, dp); + } + + /* + * notify audio and graphics threads to start building the command + * lists for the next frame (client threads may choose not to + * build the list in overrun case) + */ + for (client = sc->clientList; client != 0; client = client->next) { + osSendMesg(client->msgQ, (OSMesg)&sc->retraceMsg, OS_MESG_NOBLOCK); + } +} + +/* + * __scHandleRSP is called when an RSP task signals that it has + * finished or yielded (at the hosts request) + */ +void __scHandleRSP(OSSched* sc) { + OSScTask *t, *sp = 0, *dp = 0; + s32 state; + + assert(sc->curRSPTask); + + t = sc->curRSPTask; + sc->curRSPTask = 0; + +#ifdef SC_LOGGING + osLogEvent(l, 510, 3, t, t->state, t->flags); +#endif + + if ((t->state & OS_SC_YIELD) && osSpTaskYielded(&t->list)) { + t->state |= OS_SC_YIELDED; +#ifndef _FINALROM + t->totalTime += osGetTime() - t->startTime; +#endif + if ((t->flags & OS_SC_TYPE_MASK) == OS_SC_XBUS) { + /* push the task back on the list */ + t->next = sc->gfxListHead; + sc->gfxListHead = t; + if (sc->gfxListTail == 0) + sc->gfxListTail = t; + } + +#ifdef SC_LOGGING + osLogEvent(l, 521, 1, t); +#endif + + } else { + t->state &= ~OS_SC_NEEDS_RSP; + __scTaskComplete(sc, t); + } + + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if ((__scSchedule(sc, &sp, &dp, state)) != state) + __scExec(sc, sp, dp); +} + +/* + * __scHandleRDP is called when an RDP task signals that it has + * finished + */ +void __scHandleRDP(OSSched* sc) { + OSScTask *t, *sp = 0, *dp = 0; + s32 state; + + assert(sc->curRDPTask); + assert(sc->curRDPTask->list.t.type == M_GFXTASK); + + t = sc->curRDPTask; + sc->curRDPTask = 0; + +#ifdef SC_LOGGING + osLogEvent(l, 515, 3, t, t->state, t->flags); +#endif + + t->state &= ~OS_SC_NEEDS_RDP; + + __scTaskComplete(sc, t); + + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if ((__scSchedule(sc, &sp, &dp, state)) != state) + __scExec(sc, sp, dp); +} + +/* + * __scTaskReady checks to see if the graphics task is able to run + * based on the current state of the RCP. + */ +OSScTask* __scTaskReady(OSScTask* t) { + int rv = 0; + void* a; + void* b; + + if (t) { + /* + * If there is a pending swap bail out til later (next + * retrace). + */ + if ((a = osViGetCurrentFramebuffer()) != (b = osViGetNextFramebuffer())) { +#ifdef SC_LOGGING + osLogEvent(l, 513, 2, a, b); +#endif + return 0; + } + + return t; + } + + return 0; +} + +/* + * __scTaskComplete checks to see if the task is complete (all RCP + * operations have been performed) and sends the done message to the + * client if it is. + */ +s32 __scTaskComplete(OSSched* sc, OSScTask* t) { + int rv; + static int firsttime = 1; + + if ((t->state & OS_SC_RCP_MASK) == 0) { /* none of the needs bits set */ + + assert(t->msgQ); + +#ifndef _FINALROM + t->totalTime += osGetTime() - t->startTime; +#endif + +#ifdef SC_LOGGING + osLogEvent(l, 504, 1, t); +#endif + rv = osSendMesg(t->msgQ, t->msg, OS_MESG_BLOCK); + + if (t->list.t.type == M_GFXTASK) { + if ((t->flags & OS_SC_SWAPBUFFER) && (t->flags & OS_SC_LAST_TASK)) { + if (firsttime) { + osViBlack(FALSE); + firsttime = 0; + } + osViSwapBuffer(t->framebuffer); +#ifdef SC_LOGGING + osLogEvent(l, 525, 1, t->framebuffer); +#endif + } + } + return 1; + } + + return 0; +} + +/* + * Place task on either the audio or graphics queue + */ +void __scAppendList(OSSched* sc, OSScTask* t) { + long type = t->list.t.type; + + assert((type == M_AUDTASK) || (type == M_GFXTASK)); + + if (type == M_AUDTASK) { + if (sc->audioListTail) + sc->audioListTail->next = t; + else + sc->audioListHead = t; + + sc->audioListTail = t; + sc->doAudio = 1; +#ifdef SC_LOGGING + osLogEvent(l, 506, 1, t); +#endif + } else { + if (sc->gfxListTail) + sc->gfxListTail->next = t; + else + sc->gfxListHead = t; + + sc->gfxListTail = t; +#ifdef SC_LOGGING + osLogEvent(l, 507, 1, t); +#endif + } + + t->next = NULL; + t->state = t->flags & OS_SC_RCP_MASK; +} + +/* + * + */ +void __scExec(OSSched* sc, OSScTask* sp, OSScTask* dp) { + int rv; + +#ifdef SC_LOGGING + osLogEvent(l, 511, 2, sp, dp); +#endif + + assert(sc->curRSPTask == 0); + + if (sp) { + if (sp->list.t.type == M_AUDTASK) { + osWritebackDCacheAll(); /* flush the cache */ + } + + sp->state &= ~(OS_SC_YIELD | OS_SC_YIELDED); +#ifndef _FINALROM + sp->startTime = osGetTime(); +#endif + osSpTaskLoad(&sp->list); + osSpTaskStartGo(&sp->list); + sc->curRSPTask = sp; + if (sp == dp) + sc->curRDPTask = dp; + } + + if (dp && (dp != sp)) { + assert(dp->list.t.output_buff); + +#ifdef SC_LOGGING + osLogEvent(l, 523, 3, dp, dp->list.t.output_buff, (u32)*dp->list.t.output_buff_size); +#endif + rv = osDpSetNextBuffer(dp->list.t.output_buff, *dp->list.t.output_buff_size); + + dp_busy = 1; + dpCount = 0; + + assert(rv == 0); + + sc->curRDPTask = dp; + } +} + +static void __scYield(OSSched* sc) { + +#ifdef SC_LOGGING + osLogEvent(l, 503, 1, sc->curRSPTask); +#endif + + if (sc->curRSPTask->list.t.type == M_GFXTASK) { + + /* assert(sc->curRSPTask->state & OS_SC_YIELD);*/ + + sc->curRSPTask->state |= OS_SC_YIELD; + + osSpTaskYield(); + } else { +#ifdef SC_LOGGING + osLogEvent(l, 508, 1, sc->curRSPTask); +#endif + } +} + +/* + * Schedules the tasks to be run on the RCP + */ +s32 __scSchedule(OSSched* sc, OSScTask** sp, OSScTask** dp, s32 availRCP) { + s32 avail = availRCP; + OSScTask* gfx = sc->gfxListHead; + OSScTask* audio = sc->audioListHead; + +#ifdef SC_LOGGING + osLogEvent(l, 517, 3, *sp, *dp, availRCP); +#endif + + if (sc->doAudio && (avail & OS_SC_SP)) { + + if (gfx && (gfx->flags & OS_SC_PARALLEL_TASK)) { + *sp = gfx; + avail &= ~OS_SC_SP; + } else { + *sp = audio; + avail &= ~OS_SC_SP; + sc->doAudio = 0; + sc->audioListHead = sc->audioListHead->next; + if (sc->audioListHead == NULL) + sc->audioListTail = NULL; + } + } else { +#ifdef SC_LOGGING + osLogEvent(l, 520, 1, gfx); +#endif + if (__scTaskReady(gfx)) { + +#ifdef SC_LOGGING + osLogEvent(l, 522, 3, gfx, gfx->state, gfx->flags); +#endif + switch (gfx->flags & OS_SC_TYPE_MASK) { + case (OS_SC_XBUS): + if (gfx->state & OS_SC_YIELDED) { +#ifdef SC_LOGGING + osLogEvent(l, 518, 0); +#endif + /* can hit this if RDP finishes at yield req */ + /* assert(gfx->state & OS_SC_DP); */ + + if (avail & OS_SC_SP) { /* if SP is available */ +#ifdef SC_LOGGING + osLogEvent(l, 519, 0); +#endif + *sp = gfx; + avail &= ~OS_SC_SP; + + if (gfx->state & OS_SC_DP) { /* if it needs DP */ + *dp = gfx; + avail &= ~OS_SC_DP; + + if (avail & OS_SC_DP == 0) + assert(sc->curRDPTask == gfx); + } + + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } else { + if (avail == (OS_SC_SP | OS_SC_DP)) { + *sp = *dp = gfx; + avail &= ~(OS_SC_SP | OS_SC_DP); + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } + + break; + + case (OS_SC_DRAM): + case (OS_SC_DP_DRAM): + case (OS_SC_DP_XBUS): + if (gfx->state & OS_SC_SP) { /* if needs SP */ + if (avail & OS_SC_SP) { /* if SP is available */ + *sp = gfx; + avail &= ~OS_SC_SP; + } + } else if (gfx->state & OS_SC_DP) { /* if needs DP */ + if (avail & OS_SC_DP) { /* if DP available */ + *dp = gfx; + avail &= ~OS_SC_DP; + sc->gfxListHead = sc->gfxListHead->next; + if (sc->gfxListHead == NULL) + sc->gfxListTail = NULL; + } + } + break; + + case (OS_SC_SP_DRAM): + case (OS_SC_SP_XBUS): + default: + break; + } + } + } + + if (avail != availRCP) + avail = __scSchedule(sc, sp, dp, avail); + + return avail; +} diff --git a/lib/hackerlibultra/src/sched/sched_log.fmt b/lib/hackerlibultra/src/sched/sched_log.fmt new file mode 100644 index 00000000..50e042d5 --- /dev/null +++ b/lib/hackerlibultra/src/sched/sched_log.fmt @@ -0,0 +1,19 @@ +500 "__scHandleRetrace: framecount %d, curRSPTask 0x%x, curRDPTask 0x%x" +510 "__scHandleRSP: Current 0x%x state 0x%x flags 0x%x" +521 "__scHandleRSP: Yielded Task 0x%x" +515 "__scHandleRDP: Current 0x%x state 0x%x flags 0x%x" +513 "__scTaskReady: Pending swap bail - current 0x%x next 0x%x" +514 "__scTaskReady: Rendering bail - current 0x%x" +504 "__scTaskComplete: Task 0x%x" +525 "__scTaskComplete: Swapbuffer 0x%x" +506 "__scAppendList: Audio task 0x%x" +507 "__scAppendList: Gfx task 0x%x" +511 "__scExec: sp 0x%x, dp 0x%x" +523 "__scExec: DP only buf 0x%x, size %d" +503 "__scYield: curRSPtask 0x%x" +508 "__scYield: NOT A GFX TASK!! curRSPtask 0x%x" +517 "__scSchedule: sp 0x%x, dp 0x%x, avail 0x%x" +520 "__scSchedule: gfx task 0x%x" +522 "__scSchedule: gfx task ready 0x%x, state 0x%x, flags 0x%x" +518 "__scSchedule: Yielded" +519 "__scSchedule: SP available" diff --git a/lib/hackerlibultra/src/sp/Makefile b/lib/hackerlibultra/src/sp/Makefile new file mode 100644 index 00000000..7807431c --- /dev/null +++ b/lib/hackerlibultra/src/sp/Makefile @@ -0,0 +1,30 @@ +#!smake +# +# Makefile for the sp subdirectory +# + +include $(ROOT)/usr/include/make/PRdefs + + +# LCOPTS = -mips2 -non_shared -fullwarn -G 0 +LCINCS = -I. -I$(ROOT)/usr/include/PR -I$(ROOT)/usr/include + +CFILES = \ + clearattribute.c \ + color.c \ + hide.c \ + setattribute.c \ + show.c \ + sprite.c \ + spriteex.c \ + spriteex2.c \ + spscale.c + + +ASFILES = + +OBJECTS = $(CFILES:.c=.o) + +default: $(OBJECTS) + +include $(COMMONRULES) diff --git a/lib/hackerlibultra/src/sp/clearattribute.c b/lib/hackerlibultra/src/sp/clearattribute.c new file mode 100644 index 00000000..fa991d50 --- /dev/null +++ b/lib/hackerlibultra/src/sp/clearattribute.c @@ -0,0 +1,33 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ + +#include + +/* + * spClearAttribute() + * + * Clears attributes about a sprite. + */ +void spClearAttribute(Sprite* sp, s32 attr) { + sp->attr &= ~attr; +} diff --git a/lib/hackerlibultra/src/sp/color.c b/lib/hackerlibultra/src/sp/color.c new file mode 100644 index 00000000..b43e2d6f --- /dev/null +++ b/lib/hackerlibultra/src/sp/color.c @@ -0,0 +1,36 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ + +#include + +/* + * spColor() + * + * Sets the color for IA or I images. + */ +void spColor(Sprite* sp, unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) { + sp->red = red; + sp->green = green; + sp->blue = blue; + sp->alpha = alpha; +} diff --git a/lib/hackerlibultra/src/sp/hide.c b/lib/hackerlibultra/src/sp/hide.c new file mode 100644 index 00000000..91b77b5e --- /dev/null +++ b/lib/hackerlibultra/src/sp/hide.c @@ -0,0 +1,33 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ + +#include + +/* + * spHide() + * + * Hides a sprite so that it will not be drawn at the next spUpdate(). + */ +void spHide(Sprite* sp) { + spSetAttribute(sp, SP_HIDDEN); +} diff --git a/lib/hackerlibultra/src/sp/setattribute.c b/lib/hackerlibultra/src/sp/setattribute.c new file mode 100644 index 00000000..9aaad0fd --- /dev/null +++ b/lib/hackerlibultra/src/sp/setattribute.c @@ -0,0 +1,33 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ + +#include + +/* + * spSetAttribute() + * + * Sets attributes about a sprite. + */ +void spSetAttribute(Sprite* sp, s32 attr) { + sp->attr |= attr; +} diff --git a/lib/hackerlibultra/src/sp/show.c b/lib/hackerlibultra/src/sp/show.c new file mode 100644 index 00000000..c9ad6b6b --- /dev/null +++ b/lib/hackerlibultra/src/sp/show.c @@ -0,0 +1,33 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ + +#include + +/* + * spShow() + * + * Shows a sprite so that it will be drawn at the next spUpdate(). + */ +void spShow(Sprite* sp) { + spClearAttribute(sp, SP_HIDDEN); +} diff --git a/lib/hackerlibultra/src/sp/sprite.c b/lib/hackerlibultra/src/sp/sprite.c new file mode 100644 index 00000000..aba83939 --- /dev/null +++ b/lib/hackerlibultra/src/sp/sprite.c @@ -0,0 +1,678 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ +#include +#include +#include +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +/* + * spSetZ() + * + */ +void spSetZ(Sprite* sp, s32 z) { + +#ifdef DEBUG + emPrintf("spSetZ (Sprite 0x%08x, (%d))\n", sp, z); +#endif + + sp->zdepth = (s16)z; +} + +/* + * spMove() + * + * Moves a sprite on the screen. + */ +void spMove(Sprite* sp, s32 x, s32 y) { + +#ifdef DEBUG + emPrintf("spMove (Sprite 0x%08x, (%d,%d))\n", sp, x, y); +#endif + + sp->x = (s16)x; + sp->y = (s16)y; +} + +static s32 scissor_xmax; +static s32 scissor_ymax; + +static s32 scissor_xmin; +static s32 scissor_ymin; + +/* + * spScissor() + * + * Sets the scissoring box to be used for subsequent Sprite Drawing + */ +void spScissor(s32 xmin, s32 xmax, s32 ymin, s32 ymax) { + scissor_xmin = xmin; + scissor_ymin = ymin; + + scissor_xmax = xmax; + scissor_ymax = ymax; +} + +static int* prev_bmbuf = NULL; + +/* + * drawbitmap() + * + * Draws a bitmap from a sprite at a location on the screen. If the + * "usevert" flag is set, then the routine will use vertices and triangles + * to draw the bitmap. Otherwise, the texture rectangle instruction + * will be used. + */ + +static void drawbitmap(Gfx** glp, Sprite* s, Bitmap* b, s32 x, s32 y, s32 xx, s32 yy, s32 fs, s32 ft, s32 sx, s32 sy) { + s32 rs, rt; + s32 rxh, ryh; + s32 rxl, ryl; + Gfx* gl; + s32 tex_width, tex_height; + Gtexrect gt, *g; + s32 s_clamp, t_clamp, s_mask, t_mask, s_lod, t_lod; + + g = > + + tex_width = b->width_img; + tex_height = s->bmHreal; + +#ifdef rmDEBUG + rmonPrintf("\tdrawbitmap (buf= 0x%08x; x,y= %d,%d; w,h= %d,%d )\n", b->buf, x, y, b->width, s->bmheight); +#endif + gl = *glp; + + /* Scissoring */ + if ((x >= scissor_xmax) || (y >= scissor_ymax)) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Upper Left corner (%d,%d) beyond range (%d,%d)\n", x, y, scissor_xmax, + scissor_ymax); +#endif + return; + } + + if ((xx < scissor_xmin) || (yy < scissor_ymin)) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Lower Right corner (%d,%d) not in range (%d,%d)\n", xx, yy, scissor_xmin, + scissor_ymin); +#endif + return; + } + + if (x < scissor_xmin) { + rxh = scissor_xmin * 4; + rs = (b->s << 5) + fs + (((scissor_xmin - x) * sx) >> 5); +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Left Edge (%d) not in range (%d,%d)\n", x, scissor_xmin, scissor_xmax); +#endif + } else { + rxh = x * 4; + rs = (b->s << 5) + fs; + }; + + if (y < scissor_ymin) { + ryh = scissor_ymin * 4; + rt = (b->t << 5) + ft + (((scissor_ymin - y) * sy) >> 5); +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Top Edge (%d) not in range (%d,%d)\n", y, scissor_ymin, scissor_ymax); +#endif + } else { + ryh = y * 4; + rt = (b->t << 5) + ft; + } + + if (xx >= scissor_xmax) { + rxl = scissor_xmax * 4; +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Right Edge (%d) not in range (%d,%d)\n", xx, scissor_xmin, scissor_xmax); +#endif + } else { + rxl = xx * 4; + }; + + if (yy >= scissor_ymax) { + ryl = scissor_ymax * 4; +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: Bottom Edge (%d) not in range (%d,%d)\n", yy, scissor_ymin, scissor_ymax); +#endif + } else { + ryl = yy * 4; + }; + + s_clamp = G_TX_CLAMP; + t_clamp = G_TX_CLAMP; + s_mask = G_TX_NOMASK; + t_mask = G_TX_NOMASK; + s_lod = G_TX_NOLOD; + t_lod = G_TX_NOLOD; + +#define LOAD_TEX + +#ifdef LOAD_TEX + if (b->buf != prev_bmbuf) { + switch (s->bmsiz) { +#if BUILD_VERSION >= VERSION_J + case G_IM_SIZ_DD: + gDPLoadTextureTile_4b(gl++, b->buf, s->bmfmt, tex_width, tex_height, b->s, b->t, b->s + b->width, + b->t + b->actualHeight, 0, s_clamp, t_clamp, s_mask, t_mask, s_lod, t_lod); + break; +#endif + case G_IM_SIZ_4b: + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlock_4bS(gl++, b->buf, s->bmfmt, tex_width, tex_height, 0, s_clamp, t_clamp, s_mask, + t_mask, s_lod, t_lod); + } else { + gDPLoadTextureBlock_4b(gl++, b->buf, s->bmfmt, tex_width, tex_height, 0, s_clamp, t_clamp, s_mask, + t_mask, s_lod, t_lod); + }; + break; + + case G_IM_SIZ_8b: + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockS(gl++, b->buf, s->bmfmt, G_IM_SIZ_8b, tex_width, tex_height, 0, s_clamp, + t_clamp, s_mask, t_mask, s_lod, t_lod); + } else { + gDPLoadTextureBlock(gl++, b->buf, s->bmfmt, G_IM_SIZ_8b, tex_width, tex_height, 0, s_clamp, t_clamp, + s_mask, t_mask, s_lod, t_lod); + }; + break; + case G_IM_SIZ_16b: + if (s->bmfmt == G_IM_FMT_YUV) { + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockYuvS(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, tex_width, tex_height, 0, s_clamp, + t_clamp, s_mask, t_mask, s_lod, t_lod); + } else { + if (b->LUToffset != 0) { /* Split Y and UV areas */ + unsigned char *uv, *addr; + int j; + s32 tmem, siz; + + gDPSetTextureImage(gl++, G_IM_FMT_I, G_IM_SIZ_8b, 1, b->buf); + gDPSetTile(gl++, G_IM_FMT_I, G_IM_SIZ_8b, 0, 256, G_TX_LOADTILE, 0, t_clamp, t_mask, t_lod, + s_clamp, s_mask, s_lod); + gDPLoadSync(gl++); + gDPLoadBlock(gl++, G_TX_LOADTILE, 0, 0, tex_width * tex_height - 1, CALC_DXT(tex_width, 1)); + gDPLoadSync(gl++); + + uv = ((unsigned char*)b->buf) + ((tex_width * tex_height) / 2) * b->LUToffset; + + for (j = 0; j <= (tex_height / 2); j++) { + addr = uv + ((tex_height / 2) - 2 - j) * tex_width; + siz = 3 * tex_width; + tmem = (tex_width / 8) * (tex_height - 2 - 2 * j); + if (tmem < 0) { + addr += (-tmem) * 8; + siz -= (-tmem) * 8; + tmem = 0; + }; + if (j == 0) + siz = 2 * tex_width; + + gDPSetTextureImage(gl++, G_IM_FMT_I, G_IM_SIZ_8b, 1, addr); + gDPSetTile(gl++, G_IM_FMT_I, G_IM_SIZ_8b, 0, tmem, G_TX_LOADTILE, 0, t_clamp, t_mask, + t_lod, s_clamp, s_mask, s_lod); + gDPLoadSync(gl++); + gDPLoadBlock(gl++, G_TX_LOADTILE, 0, 0, siz - 1, CALC_DXT(tex_width, 1)); + gDPLoadSync(gl++); + }; + + gDPSetTile(gl++, s->bmfmt, G_IM_SIZ_16b, (((tex_width) * 1) + 7) >> 3, 0, G_TX_RENDERTILE, + 0, t_clamp, t_mask, t_lod, s_clamp, s_mask, s_lod); + gDPSetTileSize(gl++, G_TX_RENDERTILE, 0, 0, ((tex_width)-1) << G_TEXTURE_IMAGE_FRAC, + ((tex_height)-1) << G_TEXTURE_IMAGE_FRAC); + + } else { + gDPLoadTextureBlockYuv(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, tex_width, tex_height, 0, + s_clamp, t_clamp, s_mask, t_mask, s_lod, t_lod); + }; + }; + } else { + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockS(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, tex_width, tex_height, 0, s_clamp, + t_clamp, s_mask, t_mask, s_lod, t_lod); + } else { + gDPLoadTextureBlock(gl++, b->buf, s->bmfmt, G_IM_SIZ_16b, tex_width, tex_height, 0, s_clamp, + t_clamp, s_mask, t_mask, s_lod, t_lod); + }; + }; + break; + case G_IM_SIZ_32b: + if (s->attr & SP_TEXSHUF) { + gDPLoadTextureBlockS(gl++, b->buf, s->bmfmt, G_IM_SIZ_32b, tex_width, tex_height, 0, s_clamp, + t_clamp, s_mask, t_mask, s_lod, t_lod); + } else { + gDPLoadTextureBlock(gl++, b->buf, s->bmfmt, G_IM_SIZ_32b, tex_width, tex_height, 0, s_clamp, + t_clamp, s_mask, t_mask, s_lod, t_lod); + }; + break; + } + prev_bmbuf = b->buf; + } +#endif /* LOAD_TEX */ + + g->cmd = G_TEXRECT; + g->tile = 0; + + g->xh = rxh; + g->xl = rxl; + g->yh = ryh; + g->yl = ryl; + + g->s = rs; + g->t = rt; + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV)) + g->dsdx = sx * 4; + else + g->dsdx = sx; + + g->dtdy = sy; + +#ifdef rmDEBUG + rmonPrintf("\trect (xh,l= %d,%d, yh,l= %d,%d, s,t= %d,%d, dsdx=%d, dtdy=%d )\n", rxh, rxl, ryh, ryl, rs, rt, + g->dsdx, sy); +#endif + + gSPTextureRectangle(gl++, g->xh, g->yh, g->xl, g->yl, g->tile, g->s, g->t, g->dsdx, g->dtdy); + + gDPPipeSync(gl++); + + *glp = gl; +} + +static u16 sp_attr = 0; + +void spInit(Gfx** glistp) { + Gfx* gl; + + gl = *glistp; + +#ifdef DEBUG + emPrintf("spInit ()\n"); +#endif + sp_attr = 0; + + scissor_xmin = 0; + scissor_ymin = 0; + + scissor_xmax = 320; + scissor_ymax = 240; + + /* Turn on texturing */ + gDPPipeSync(gl++); + gDPSetCycleType(gl++, G_CYC_1CYCLE); + gSPTexture(gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); + gDPSetAlphaCompare(gl++, G_AC_NONE); + gDPSetTexturePersp(gl++, G_TP_NONE); + gDPSetTextureFilter(gl++, G_TF_BILERP); + gDPSetTextureConvert(gl++, G_TC_FILT); + gDPSetTextureDetail(gl++, G_TD_CLAMP); + gDPSetTextureLOD(gl++, G_TL_TILE); + gDPSetTextureLUT(gl++, G_TT_NONE); + +#define SPRITE_SURF G_RM_TEX_EDGE +#define SPRITE_SURF2 G_RM_TEX_EDGE2 + + gDPSetRenderMode(gl++, SPRITE_SURF, SPRITE_SURF2); + + *glistp = gl; +} + +/* + * spDraw() + * + * Draws all of the sprites that are associated with bitmaps and that + * are supposed to be drawn (spDraw()). They are drawn from 0 to maxsp, + * so sprites with higher numbers will overwrite lower-numbered sprites. + * + */ +Gfx* spDraw(Sprite* s) { + int i; + s32 x, y; + float sx, sy; + Bitmap* b; + Gfx* gl; +#ifndef NDEBUG + Gfx* ogl; +#endif + Gfx* dl_start; + s32 isx, isy; + s32 tx, ty; + s32 tx2, ty2; + s32 x2, y2; + float ftx, fty; + s32 fs, ft; + s32 ex, ey; + +#ifdef rmDEBUG + rmonPrintf("spDraw (Sprite 0x%08x )\n", s); +#endif + + if (s->attr & SP_HIDDEN) + return (NULL); + + prev_bmbuf = NULL; + + gl = s->rsp_dl_next; + if (gl == NULL) + gl = s->rsp_dl; + dl_start = gl; + +#ifndef NDEBUG + ogl = gl; +#endif + + b = s->bitmap; + ex = 0; + ey = 0; + + if (sp_attr & SP_EXTERN) /* previous attr was extern? */ + sp_attr = ~s->attr; /* Assume previous modes are all different + from new ones */ + + if (s->attr & SP_EXTERN) /* current attr is extern? */ + sp_attr = s->attr; /* Assume all settings should remain the same */ + + if (s->attr != sp_attr) { + if ((s->attr & SP_TRANSPARENT) && !(sp_attr & SP_TRANSPARENT)) { + gDPSetRenderMode(gl++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + } else if (!(s->attr & SP_TRANSPARENT) && (sp_attr & SP_TRANSPARENT)) { + gDPSetRenderMode(gl++, SPRITE_SURF, SPRITE_SURF2); + } + + if ((s->attr & SP_CUTOUT) && !(sp_attr & SP_CUTOUT)) { + gDPSetBlendColor(gl++, 0xff, 0xff, 0xff, 0x01); + gDPSetAlphaCompare(gl++, G_AC_THRESHOLD); + } else if (!(s->attr & SP_CUTOUT) && (sp_attr & SP_CUTOUT)) { + gDPSetAlphaCompare(gl++, G_AC_NONE); + } + + if ((s->attr & SP_TEXSHIFT) && !(sp_attr & SP_TEXSHIFT)) { + gDPSetTextureFilter(gl++, G_TF_AVERAGE); + } else if (!(s->attr & SP_TEXSHIFT) && (sp_attr & SP_TEXSHIFT)) { + gDPSetTextureFilter(gl++, G_TF_BILERP); + }; + }; + + sp_attr = s->attr; + + if (sp_attr & SP_Z) { + gDPSetPrimDepth(gl++, s->zdepth, 0); + }; + + gDPSetPrimColor(gl++, 0, 0, s->red, s->green, s->blue, s->alpha); + + if (s->bmfmt == G_IM_FMT_IA || s->bmfmt == G_IM_FMT_I) { + if (s->alpha == 255) { + gDPSetCombineMode(gl++, G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM); + } else { + gDPSetCombineMode(gl++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + }; + } else { + if (s->alpha == 255) { + gDPSetCombineMode(gl++, G_CC_MODULATEIDECALA_PRIM, G_CC_MODULATEIDECALA_PRIM); + } else { + gDPSetCombineMode(gl++, G_CC_MODULATERGBA_PRIM, G_CC_MODULATERGBA_PRIM); + }; + } + + if (s->bmfmt == G_IM_FMT_CI) { + gDPSetTextureLUT(gl++, G_TT_RGBA16); + gDPLoadTLUT(gl++, s->nTLUT, 256 + s->startTLUT, s->LUT); + gDPLoadSync(gl++); + }; + +#define MY_K0 (175 & 0x1ff) +#define MY_K1 (-43 & 0x1ff) +#define MY_K2 (-89 & 0x1ff) +#define MY_K3 (222 & 0x1ff) +#define MY_K4 (114 & 0x1ff) +#define MY_K5 (42 & 0x1ff) + + if ((s->bmfmt == G_IM_FMT_YUV) && (s->attr & SP_FASTCOPY)) { + gDPSetTextureConvert(gl++, G_TC_CONV); + gDPSetTextureFilter(gl++, G_TF_POINT); + gDPSetCombineMode(gl++, G_CC_1CYUV2RGB, G_CC_1CYUV2RGB); + gDPSetConvert(gl++, MY_K0, MY_K1, MY_K2, MY_K3, MY_K4, MY_K5); + } else if (s->bmfmt == G_IM_FMT_YUV) { + gDPSetCycleType(gl++, G_CYC_2CYCLE); + gDPSetTextureFilter(gl++, G_TF_BILERP); + gDPSetTextureConvert(gl++, G_TC_FILTCONV); + gDPSetConvert(gl++, MY_K0, MY_K1, MY_K2, MY_K3, MY_K4, MY_K5); + gDPSetCombineMode(gl++, G_CC_YUV2RGB, G_CC_PASS2); + } + + if (s->attr & SP_SCALE) { + sx = s->scalex; + sy = s->scaley; + } else { + sx = 1.0F; + sy = 1.0F; + } + + isx = (int)((1 << 10) / sx + 0.5F); + isy = (int)((1 << 10) / sy + 0.5F); + + if (b) { + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV)) + gDPSetCycleType(gl++, G_CYC_COPY); + + x = 0.0F; + y = 0.0F; + + fty = s->y + y * sy; + ty = (int)(fty + 0.99999F); + ft = (int)(isy * (ty - fty)); + ft = (ft + 16) >> 5; + if (s->attr & SP_TEXSHIFT) + ft += 16; /* 1/2 Texel for AntiAliasing */ + + if (s->attr & SP_FRACPOS) + ft += s->frac_t; /* Micro-positioning */ + + y2 = y + s->bmheight; + ty2 = (int)(s->y + y2 * sy + 0.99999F); + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV)) + ty2--; + +#ifdef rmDEBUG + rmonPrintf("\tiscale=(%d,%d), %d bitmaps, sprite_size=(%d,%d)\n", isx, isy, s->nbitmaps, s->width, s->height); +#endif + + for (i = 0; (i < s->nbitmaps) && (b->width > 0); i++, b++) { + + if ((x + b->width) > s->width) { /* Next bitmap hits edge? */ + int bh; + + x = 0; + fs = 0; + ex = 0; + ey += s->expy; + y += s->bmheight; /* Wrap to next line */ + y2 = y + s->bmheight; /* Wrap to next line */ + + fty = s->y + y * sy; + ty = (int)(fty + 0.9999F); + ft = (int)(isy * (ty - fty)); + ft = (ft + 16) >> 5; + if (s->attr & SP_TEXSHIFT) + ft += 16; /* 1/2 Texel for AntiAliasing */ + + if (s->attr & SP_FRACPOS) + ft += s->frac_t; /* Micro-positioning */ + + ty2 = (int)(s->y + y2 * sy + 0.9999F); + + ty += ey; + ty2 += ey; + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV)) + ty2--; + + /* Fill out to rect. bdy? */ + + if ((b->actualHeight != 0)) + bh = b->actualHeight; + else + bh = s->bmheight; + + if ((y + bh) > s->height) /* Can't wrap any more? */ + break; + }; + +#ifdef rmDEBUG + rmonPrintf("bm# %d, x,y=(%d,%d) width=%d \n", i, x, y, b->width); +#endif + + ftx = s->x + x * sx; + tx = (s32)(ftx + 0.9999F); + fs = (s32)(isx * (tx - ftx)); + fs = (fs + 16) >> 5; + if (s->attr & SP_TEXSHIFT) + fs += 16; /* 1/2 Texel for AntiAliasing */ + + if (s->attr & SP_FRACPOS) + fs += s->frac_s; /* Micro-positioning */ + + x2 = x + b->width; + tx2 = (int)(s->x + x2 * sx + 0.9999F); + + if ((b->actualHeight != 0)) { + y2 = y + b->actualHeight; + ty2 = (s32)(s->y + y2 * sy + 0.9999F); + ty2 += ey; + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV)) + ty2--; + }; + +#ifdef rmDEBUG + rmonPrintf("\tfull(%g,%g) = int(%d,%d) + frac(%d,%d)\n", ftx, fty, tx, ty, fs, ft); +#endif + + tx += ex; + tx2 += ex; + + if ((s->attr & SP_FASTCOPY) && (s->bmfmt != G_IM_FMT_YUV)) + tx2--; + + if (b->buf != NULL) /* Skip over null bitmaps (blanks) */ + drawbitmap(&gl, s, b, tx, ty, tx2, ty2, fs, ft, isx, isy); + + x += b->width; + ex += s->expx; + } + + if (s->attr & SP_FASTCOPY) + gDPSetCycleType(gl++, G_CYC_1CYCLE); + + if (s->bmfmt == G_IM_FMT_YUV) { + gDPSetCycleType(gl++, G_CYC_1CYCLE); + gDPSetTextureFilter(gl++, G_TF_BILERP); + gDPSetTextureConvert(gl++, G_TC_FILT); + }; + + } else { + int rgba; + + x = (s32)s->x; + y = (s32)s->y; + x2 = s->x + (s->width * sx) - 1; + y2 = s->y + (s->height * sy) - 1; + + if ((x >= scissor_xmax) || (y >= scissor_ymax)) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: FILL Upper Left corner (%d,%d) beyond range (%d,%d)\n", x, y, scissor_xmax, + scissor_ymax); +#endif + } else if ((x2 < scissor_xmin) || (y2 < scissor_ymin)) { +#ifdef DEBUG_SCISSOR + emPrintf("Sprite Scissoring: FILL Lower Right corner (%d,%d) below range (%d,%d)\n", x2, y2, scissor_xmin, + scissor_ymin); +#endif + } else { + + if (x < scissor_xmin) + x = scissor_xmin; + + if (x2 >= scissor_xmax) + x2 = scissor_xmax - 1; + + if (y < scissor_ymin) + y = scissor_ymin; + + if (y2 >= scissor_ymax) + y2 = scissor_ymax - 1; + + rgba = GPACK_RGBA5551((s->red), (s->green), (s->blue), (s->alpha >> 7)); + + gSPTexture(gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_OFF); + gDPSetCycleType(gl++, G_CYC_FILL); + gDPSetFillColor(gl++, (rgba << 16) | (rgba)); + + gDPFillRectangle(gl++, x, y, x2, y2); + gDPSetCycleType(gl++, G_CYC_1CYCLE); + gSPTexture(gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); + } + } + + if (s->bmfmt == G_IM_FMT_CI) { + gDPSetTextureLUT(gl++, G_TT_NONE); + }; + + gSPEndDisplayList(gl++); + +#if BUILD_VERSION >= VERSION_J +#line 722 +#else +#line 714 +#endif + assert((gl - ogl) < s->ndisplist); + s->rsp_dl_next = gl; + return (dl_start); +} + +void spFinish(Gfx** glistp) { + Gfx* gl; + + gl = *glistp; + + /* Turn off texturing */ + gSPTexture(gl++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_OFF); + gDPSetCombineMode(gl++, G_CC_SHADE, G_CC_SHADE); + + if (sp_attr & SP_TRANSPARENT) { + /* Turn off transparency */ + gDPSetRenderMode(gl++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + } + + if (sp_attr & SP_CUTOUT) { + /* Turn off Alpha write enable */ + gDPSetAlphaCompare(gl++, G_AC_NONE); + } + + gSPEndDisplayList(gl++); + + *glistp = gl; +} diff --git a/lib/hackerlibultra/src/sp/spriteex.c b/lib/hackerlibultra/src/sp/spriteex.c new file mode 100644 index 00000000..ce112eb5 --- /dev/null +++ b/lib/hackerlibultra/src/sp/spriteex.c @@ -0,0 +1,2 @@ +#define F3DEX_GBI +#include "sprite.c" diff --git a/lib/hackerlibultra/src/sp/spriteex2.c b/lib/hackerlibultra/src/sp/spriteex2.c new file mode 100644 index 00000000..2e8d5761 --- /dev/null +++ b/lib/hackerlibultra/src/sp/spriteex2.c @@ -0,0 +1,2 @@ +#define F3DEX_GBI_2 +#include "sprite.c" diff --git a/lib/hackerlibultra/src/sp/spscale.c b/lib/hackerlibultra/src/sp/spscale.c new file mode 100644 index 00000000..8fa4b6eb --- /dev/null +++ b/lib/hackerlibultra/src/sp/spscale.c @@ -0,0 +1,40 @@ +/* + * Copyright 1995, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * + * UNPUBLISHED -- Rights reserved under the copyright laws of the United + * States. Use of a copyright notice is precautionary only and does not + * imply publication or disclosure. + * + * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND: + * Use, duplication or disclosure by the Government is subject to restrictions + * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights + * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or + * in similar or successor clauses in the FAR, or the DOD or NASA FAR + * Supplement. Contractor/manufacturer is Silicon Graphics, Inc., + * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. + * + * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY + * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION, + * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY + * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON + * GRAPHICS, INC. + */ + +#include + +/* + * spScale() + * + * Scales the sprite by a vertical and horizontal factor. + */ +void spScale(Sprite* sp, float sx, float sy) { + + sp->scalex = sx; + sp->scaley = sy; + + if ((sx == 1.0F) && (sy == 1.0F)) + spClearAttribute(sp, SP_SCALE); + else + spSetAttribute(sp, SP_SCALE); +} diff --git a/lib/hackerlibultra/src/vimodes/vimodefpalhaf1.c b/lib/hackerlibultra/src/vimodes/vimodefpalhaf1.c new file mode 100644 index 00000000..11ba35ac --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpalhaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpalhaf1.c + * + * FPAL HAF1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalHaf1 = { + OS_VI_FPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpalhan1.c b/lib/hackerlibultra/src/vimodes/vimodefpalhan1.c new file mode 100644 index 00000000..76e04af0 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpalhan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpalhan1.c + * + * FPAL HAN1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalHan1 = { + OS_VI_FPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpalhpf1.c b/lib/hackerlibultra/src/vimodes/vimodefpalhpf1.c new file mode 100644 index 00000000..556ae9f7 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpalhpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpalhpf1.c + * + * FPAL HPF1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalHpf1 = { + OS_VI_FPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpalhpf2.c b/lib/hackerlibultra/src/vimodes/vimodefpalhpf2.c new file mode 100644 index 00000000..23616bee --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpalhpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpalhpf2.c + * + * FPAL HPF2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalHpf2 = { + OS_VI_FPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpalhpn1.c b/lib/hackerlibultra/src/vimodes/vimodefpalhpn1.c new file mode 100644 index 00000000..e951c807 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpalhpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpalhpn1.c + * + * FPAL HPN1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalHpn1 = { + OS_VI_FPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpalhpn2.c b/lib/hackerlibultra/src/vimodes/vimodefpalhpn2.c new file mode 100644 index 00000000..ed7bcd75 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpalhpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpalhpn2.c + * + * FPAL HPN2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalHpn2 = { + OS_VI_FPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallaf1.c b/lib/hackerlibultra/src/vimodes/vimodefpallaf1.c new file mode 100644 index 00000000..8d0da766 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallaf1.c + * + * FPAL LAF1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLaf1 = { + OS_VI_FPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallaf2.c b/lib/hackerlibultra/src/vimodes/vimodefpallaf2.c new file mode 100644 index 00000000..8e408576 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallaf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallaf2.c + * + * FPAL LAF2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLaf2 = { + OS_VI_FPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallan1.c b/lib/hackerlibultra/src/vimodes/vimodefpallan1.c new file mode 100644 index 00000000..f1dcb804 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallan1.c + * + * FPAL LAN1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLan1 = { + OS_VI_FPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallan2.c b/lib/hackerlibultra/src/vimodes/vimodefpallan2.c new file mode 100644 index 00000000..c658748a --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallan2.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallan2.c + * + * FPAL LAN2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLan2 = { + OS_VI_FPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallpf1.c b/lib/hackerlibultra/src/vimodes/vimodefpallpf1.c new file mode 100644 index 00000000..d37e92ef --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallpf1.c + * + * FPAL LPF1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLpf1 = { + OS_VI_FPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallpf2.c b/lib/hackerlibultra/src/vimodes/vimodefpallpf2.c new file mode 100644 index 00000000..6c2f18b4 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallpf2.c + * + * FPAL LPF2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLpf2 = { + OS_VI_FPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(45, 615), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(47, 617), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallpn1.c b/lib/hackerlibultra/src/vimodes/vimodefpallpn1.c new file mode 100644 index 00000000..f90f65bb --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallpn1.c + * + * FPAL LPN1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLpn1 = { + OS_VI_FPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodefpallpn2.c b/lib/hackerlibultra/src/vimodes/vimodefpallpn2.c new file mode 100644 index 00000000..8ddf1ffe --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodefpallpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodefpallpn2.c + * + * FPAL LPN2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeFpalLpn2 = { + OS_VI_FPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(47, 617), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempalhaf1.c b/lib/hackerlibultra/src/vimodes/vimodempalhaf1.c new file mode 100644 index 00000000..b8464d88 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempalhaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempalhaf1.c + * + * MPAL HAF1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalHaf1 = { + OS_VI_MPAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + //[0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + //[1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempalhan1.c b/lib/hackerlibultra/src/vimodes/vimodempalhan1.c new file mode 100644 index 00000000..22a97981 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempalhan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempalhan1.c + * + * MPAL HAN1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalHan1 = { + OS_VI_MPAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempalhpf1.c b/lib/hackerlibultra/src/vimodes/vimodempalhpf1.c new file mode 100644 index 00000000..f25708a9 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempalhpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempalhpf1.c + * + * MPAL HPF1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalHpf1 = { + OS_VI_MPAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempalhpf2.c b/lib/hackerlibultra/src/vimodes/vimodempalhpf2.c new file mode 100644 index 00000000..73815877 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempalhpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodempalhpf2.c + * + * MPAL HPF2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalHpf2 = { + OS_VI_MPAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempalhpn1.c b/lib/hackerlibultra/src/vimodes/vimodempalhpn1.c new file mode 100644 index 00000000..31eba6dc --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempalhpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempalhpn1.c + * + * MPAL HPN1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalHpn1 = { + OS_VI_MPAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempalhpn2.c b/lib/hackerlibultra/src/vimodes/vimodempalhpn2.c new file mode 100644 index 00000000..c409e088 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempalhpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodempalhpn2.c + * + * MPAL HPN2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalHpn2 = { + OS_VI_MPAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallaf1.c b/lib/hackerlibultra/src/vimodes/vimodempallaf1.c new file mode 100644 index 00000000..72e74bc1 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallaf1.c + * + * MPAL LAF1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLaf1 = { + OS_VI_MPAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallaf2.c b/lib/hackerlibultra/src/vimodes/vimodempallaf2.c new file mode 100644 index 00000000..3c1352d7 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallaf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallaf2.c + * + * MPAL LAF2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLaf2 = { + OS_VI_MPAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallan1.c b/lib/hackerlibultra/src/vimodes/vimodempallan1.c new file mode 100644 index 00000000..e9190d0b --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallan1.c + * + * MPAL LAN1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLan1 = { + OS_VI_MPAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallan2.c b/lib/hackerlibultra/src/vimodes/vimodempallan2.c new file mode 100644 index 00000000..54632378 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallan2.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallan2.c + * + * MPAL LAN2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLan2 = { + OS_VI_MPAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallpf1.c b/lib/hackerlibultra/src/vimodes/vimodempallpf1.c new file mode 100644 index 00000000..43bdc3c9 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallpf1.c + * + * MPAL LPF1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLpf1 = { + OS_VI_MPAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallpf2.c b/lib/hackerlibultra/src/vimodes/vimodempallpf2.c new file mode 100644 index 00000000..b4bb5427 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallpf2.c + * + * MPAL LPF2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLpf2 = { + OS_VI_MPAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(524), // vSync + HSYNC(3088, 0), // hSync + LEAP(3100, 3100), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(2, 2, 11, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallpn1.c b/lib/hackerlibultra/src/vimodes/vimodempallpn1.c new file mode 100644 index 00000000..bb3802c4 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallpn1.c + * + * MPAL LPN1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLpn1 = { + OS_VI_MPAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodempallpn2.c b/lib/hackerlibultra/src/vimodes/vimodempallpn2.c new file mode 100644 index 00000000..25877bed --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodempallpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodempallpn2.c + * + * MPAL LPN2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeMpalLpn2 = { + OS_VI_MPAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 30, 5, 70), // burst + VSYNC(525), // vSync + HSYNC(3089, 4), // hSync + LEAP(3097, 3098), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentschaf1.c b/lib/hackerlibultra/src/vimodes/vimodentschaf1.c new file mode 100644 index 00000000..18677927 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentschaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentschaf1.c + * + * NTSC HAF1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscHaf1 = { + OS_VI_NTSC_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentschan1.c b/lib/hackerlibultra/src/vimodes/vimodentschan1.c new file mode 100644 index 00000000..3c34b4bd --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentschan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentschan1.c + * + * NTSC HAN1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscHan1 = { + OS_VI_NTSC_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentschpf1.c b/lib/hackerlibultra/src/vimodes/vimodentschpf1.c new file mode 100644 index 00000000..7080366f --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentschpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentschpf1.c + * + * NTSC HPF1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscHpf1 = { + OS_VI_NTSC_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentschpf2.c b/lib/hackerlibultra/src/vimodes/vimodentschpf2.c new file mode 100644 index 00000000..925ad0d4 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentschpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodentschpf2.c + * + * NTSC HPF2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscHpf2 = { + OS_VI_NTSC_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentschpn1.c b/lib/hackerlibultra/src/vimodes/vimodentschpn1.c new file mode 100644 index 00000000..cff84a65 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentschpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentschpn1.c + * + * NTSC HPN1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscHpn1 = { + OS_VI_NTSC_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentschpn2.c b/lib/hackerlibultra/src/vimodes/vimodentschpn2.c new file mode 100644 index 00000000..31ee5520 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentschpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodentschpn2.c + * + * NTSC HPN2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscHpn2 = { + OS_VI_NTSC_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclaf1.c b/lib/hackerlibultra/src/vimodes/vimodentsclaf1.c new file mode 100644 index 00000000..6fbc2402 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclaf1.c + * + * NTSC LAF1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLaf1 = { + OS_VI_NTSC_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclaf2.c b/lib/hackerlibultra/src/vimodes/vimodentsclaf2.c new file mode 100644 index 00000000..c6c4618d --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclaf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclaf2.c + * + * NTSC LAF2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLaf2 = { + OS_VI_NTSC_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclan1.c b/lib/hackerlibultra/src/vimodes/vimodentsclan1.c new file mode 100644 index 00000000..c095a5de --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclan1.c + * + * NTSC LAN1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLan1 = { + OS_VI_NTSC_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclan2.c b/lib/hackerlibultra/src/vimodes/vimodentsclan2.c new file mode 100644 index 00000000..89260a56 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclan2.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclan2.c + * + * NTSC LAN2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLan2 = { + OS_VI_NTSC_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclpf1.c b/lib/hackerlibultra/src/vimodes/vimodentsclpf1.c new file mode 100644 index 00000000..19540011 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclpf1.c + * + * NTSC LPF1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLpf1 = { + OS_VI_NTSC_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclpf2.c b/lib/hackerlibultra/src/vimodes/vimodentsclpf2.c new file mode 100644 index 00000000..abcafa1e --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclpf2.c + * + * NTSC LPF2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLpf2 = { + OS_VI_NTSC_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(524), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(35, 509), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclpn1.c b/lib/hackerlibultra/src/vimodes/vimodentsclpn1.c new file mode 100644 index 00000000..c91d1ec2 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclpn1.c + * + * NTSC LPN1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLpn1 = { + OS_VI_NTSC_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodentsclpn2.c b/lib/hackerlibultra/src/vimodes/vimodentsclpn2.c new file mode 100644 index 00000000..64fca925 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodentsclpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodentsclpn2.c + * + * NTSC LPN2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModeNtscLpn2 = { + OS_VI_NTSC_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(57, 34, 5, 62), // burst + VSYNC(525), // vSync + HSYNC(3093, 0), // hSync + LEAP(3093, 3093), // leap + HSTART(108, 748), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(37, 511), // vStart + BURST(4, 2, 14, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepalhaf1.c b/lib/hackerlibultra/src/vimodes/vimodepalhaf1.c new file mode 100644 index 00000000..5b19d54d --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepalhaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepalhaf1.c + * + * PAL HAF1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalHaf1 = { + OS_VI_PAL_HAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepalhan1.c b/lib/hackerlibultra/src/vimodes/vimodepalhan1.c new file mode 100644 index 00000000..ade41cfa --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepalhan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepalhan1.c + * + * PAL HAN1 Video Mode + * + * H = High Resolution + * A = Anti-Aliased + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalHan1 = { + OS_VI_PAL_HAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepalhpf1.c b/lib/hackerlibultra/src/vimodes/vimodepalhpf1.c new file mode 100644 index 00000000..132328df --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepalhpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepalhpf1.c + * + * PAL HPF1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalHpf1 = { + OS_VI_PAL_HPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepalhpf2.c b/lib/hackerlibultra/src/vimodes/vimodepalhpf2.c new file mode 100644 index 00000000..54cba31e --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepalhpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodepalhpf2.c + * + * PAL HPF2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * F = Deflickered Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalHpf2 = { + OS_VI_PAL_HPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(640), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(0.5, 0.5), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(0.5, 0.5), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepalhpn1.c b/lib/hackerlibultra/src/vimodes/vimodepalhpn1.c new file mode 100644 index 00000000..514f4932 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepalhpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepalhpn1.c + * + * PAL HPN1 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalHpn1 = { + OS_VI_PAL_HPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepalhpn2.c b/lib/hackerlibultra/src/vimodes/vimodepalhpn2.c new file mode 100644 index 00000000..525ddb90 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepalhpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodepalhpn2.c + * + * PAL HPN2 Video Mode + * + * H = High Resolution + * P = Point Sampled + * N = Normal Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalHpn2 = { + OS_VI_PAL_HPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(1280), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(1, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(2560), // origin + SCALE(1, 0), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(5120), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallaf1.c b/lib/hackerlibultra/src/vimodes/vimodepallaf1.c new file mode 100644 index 00000000..46fefc91 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallaf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallaf1.c + * + * PAL LAF1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLaf1 = { + OS_VI_PAL_LAF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallaf2.c b/lib/hackerlibultra/src/vimodes/vimodepallaf2.c new file mode 100644 index 00000000..8e7d057d --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallaf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallaf2.c + * + * PAL LAF2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLaf2 = { + OS_VI_PAL_LAF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON + | VI_CTRL_ANTIALIAS_MODE_0 | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallan1.c b/lib/hackerlibultra/src/vimodes/vimodepallan1.c new file mode 100644 index 00000000..23c31b71 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallan1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallan1.c + * + * PAL LAN1 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLan1 = { + OS_VI_PAL_LAN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallan2.c b/lib/hackerlibultra/src/vimodes/vimodepallan2.c new file mode 100644 index 00000000..e90bdf6b --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallan2.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallan2.c + * + * PAL LAN2 Video Mode + * + * L = Low Resolution + * A = Anti-Aliased + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLan2 = { + OS_VI_PAL_LAN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_0 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallpf1.c b/lib/hackerlibultra/src/vimodes/vimodepallpf1.c new file mode 100644 index 00000000..49c80e32 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallpf1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallpf1.c + * + * PAL LPF1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLpf1 = { + OS_VI_PAL_LPF1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallpf2.c b/lib/hackerlibultra/src/vimodes/vimodepallpf2.c new file mode 100644 index 00000000..5e23d837 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallpf2.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallpf2.c + * + * PAL LPF2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * F = Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLpf2 = { + OS_VI_PAL_LPF2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(624), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0.25), // yScale + HSTART(93, 567), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0.75), // yScale + HSTART(95, 569), // vStart + BURST(105, 2, 13, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallpn1.c b/lib/hackerlibultra/src/vimodes/vimodepallpn1.c new file mode 100644 index 00000000..4bf71bdd --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallpn1.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallpn1.c + * + * PAL LPN1 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 1 = 16-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLpn1 = { + OS_VI_PAL_LPN1, // type + { + // comRegs + VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_2 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(640), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/vimodes/vimodepallpn2.c b/lib/hackerlibultra/src/vimodes/vimodepallpn2.c new file mode 100644 index 00000000..818f2a70 --- /dev/null +++ b/lib/hackerlibultra/src/vimodes/vimodepallpn2.c @@ -0,0 +1,47 @@ +/** + * @file vimodepallpn2.c + * + * PAL LPN2 Video Mode + * + * L = Low Resolution + * P = Point Sampled + * N = Non-Interlaced + * 2 = 32-bit Framebuffer + */ +#include "PR/os.h" +#include "PR/rcp.h" +#include "PRinternal/viint.h" + +OSViMode osViModePalLpn2 = { + OS_VI_PAL_LPN2, // type + { + // comRegs + VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | VI_CTRL_ANTIALIAS_MODE_3 + | VI_CTRL_PIXEL_ADV_3, // ctrl + WIDTH(320), // width + BURST(58, 30, 4, 69), // burst + VSYNC(625), // vSync + HSYNC(3177, 23), // hSync + LEAP(3183, 3181), // leap + HSTART(128, 768), // hStart + SCALE(2, 0), // xScale + VCURRENT(0), // vCurrent + }, + { // fldRegs + { + // [0] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + }, + { + // [1] + ORIGIN(1280), // origin + SCALE(1, 0), // yScale + HSTART(95, 569), // vStart + BURST(107, 2, 9, 0), // vBurst + VINTR(2), // vIntr + } }, +}; diff --git a/lib/hackerlibultra/src/voice/voicecheckresult.c b/lib/hackerlibultra/src/voice/voicecheckresult.c new file mode 100644 index 00000000..625200ed --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecheckresult.c @@ -0,0 +1,32 @@ +/** + * File: voicecheckresult.c + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 __osVoiceCheckResult(OSVoiceHandle* hd, u8* stat) { + s32 ret; + u8 buf[2]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, stat); + if (ret == 0) { + if (*stat & 1) { + ret = CONT_ERR_VOICE_NO_RESPONSE; + } else { + ret = __osVoiceContRead2(hd->__mq, hd->__channel, 0, buf); + if (ret == 0) { + hd->cmd_status = buf[0] & 7; + + if (buf[0] & 0x40) { + ret = CONT_ERR_VOICE_NO_RESPONSE; + } else { + ret = buf[1] << 8; + } + } + } + } + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecheckword.c b/lib/hackerlibultra/src/voice/voicecheckword.c new file mode 100644 index 00000000..298bd243 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecheckword.c @@ -0,0 +1,88 @@ +/** + * File: voicecheckwork.c + * + * Checks whether or not a word can be registered in the dictionary + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" + +s32 osVoiceCheckWord(u8* word) { + s32 k; + s32 ret = 0; + u16 sjis; + u16 old = '\0'; + + for (k = 0; word[k] != 0; k += 2) { + sjis = (word[k] << 8) + word[k + 1]; + if (((sjis != 'ー') && (sjis < 'ぁ')) || ((sjis > 'ん') && (sjis < 'ァ')) || (sjis == 0x837F) + || (sjis > 'ヶ')) { + ret = CONT_ERR_VOICE_WORD; + } else if ((k == 0) + && ((sjis == 'ー') || (sjis == 'ん') || (sjis == 'っ') || (sjis == 'ゎ') || (sjis == 'ン') + || (sjis == 'ッ') || (sjis == 'ヮ') || (sjis == 'ヵ') || (sjis == 'ヶ'))) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぁ') || (sjis == 'ァ')) && (old != 'ふ') && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぃ') || (sjis == 'ィ')) && (old != 'う') && (old != 'て') && (old != 'で') + && (old != 'ふ') && (old != 'ウ') && (old != 'テ') && (old != 'デ') && (old != 'フ') + && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぅ') || (sjis == 'ゥ')) && (old != 'と') && (old != 'ど') && (old != 'ふ') + && (old != 'ト') && (old != 'ド') && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぇ') || (sjis == 'ェ')) && (old != 'う') && (old != 'し') && (old != 'じ') + && (old != 'ち') && (old != 'ぢ') && (old != 'つ') && (old != 'ふ') && (old != 'ウ') && (old != 'シ') + && (old != 'ジ') && (old != 'チ') && (old != 'ヂ') && (old != 'ツ') && (old != 'フ') + && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ぉ') || (sjis == 'ォ')) && (old != 'う') && (old != 'ふ') && (old != 'ウ') + && (old != 'フ') && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ゃ') || (sjis == 'ゅ') || (sjis == 'ょ') || (sjis == 'ャ') || (sjis == 'ュ') + || (sjis == 'ョ')) + && (old != 'き') && (old != 'し') && (old != 'ち') && (old != 'に') && (old != 'ひ') && (old != 'み') + && (old != 'り') && (old != 'ぎ') && (old != 'じ') && (old != 'ぢ') && (old != 'び') && (old != 'ぴ') + && (old != 'キ') && (old != 'シ') && (old != 'チ') && (old != 'ニ') && (old != 'ヒ') && (old != 'ミ') + && (old != 'リ') && (old != 'ギ') && (old != 'ジ') && (old != 'ヂ') && (old != 'ビ') && (old != 'ピ') + && (old != 'ヴ')) { + ret = CONT_ERR_VOICE_WORD; + } else if ((sjis == 'ー') && ((old == 'ん') || (old == 'っ') || (old == 'ン') || (old == 'ッ'))) { + ret = CONT_ERR_VOICE_WORD; + } else if (((sjis == 'ん') || (sjis == 'ン')) && ((old == 'ん') || (old == 'ン'))) { + ret = CONT_ERR_VOICE_WORD; + } else if (((old == 'っ') || (old == 'ッ')) + && ((sjis == 'ー') || (sjis == 'あ') || (sjis == 'い') || (sjis == 'う') || (sjis == 'え') + || (sjis == 'お') || (sjis == 'な') || (sjis == 'に') || (sjis == 'ぬ') || (sjis == 'ね') + || (sjis == 'の') || (sjis == 'ま') || (sjis == 'み') || (sjis == 'む') || (sjis == 'め') + || (sjis == 'も') || (sjis == 'や') || (sjis == 'ゆ') || (sjis == 'よ') || (sjis == 'ら') + || (sjis == 'り') || (sjis == 'る') || (sjis == 'れ') || (sjis == 'ろ') || (sjis == 'わ') + || (sjis == 'ゐ') || (sjis == 'ゑ') || (sjis == 'を') || (sjis == 'ん') || (sjis == 'ぁ') + || (sjis == 'ぃ') || (sjis == 'ぅ') || (sjis == 'ぇ') || (sjis == 'ぉ') || (sjis == 'ゃ') + || (sjis == 'ゅ') || (sjis == 'ょ') || (sjis == 'っ') || (sjis == 'ゎ') + + || (sjis == 'ア') || (sjis == 'イ') || (sjis == 'ウ') || (sjis == 'エ') || (sjis == 'オ') + || (sjis == 'ナ') || (sjis == 'ニ') || (sjis == 'ヌ') || (sjis == 'ネ') || (sjis == 'ノ') + || (sjis == 'マ') || (sjis == 'ミ') || (sjis == 'ム') || (sjis == 'メ') || (sjis == 'モ') + || (sjis == 'ヤ') || (sjis == 'ユ') || (sjis == 'ヨ') || (sjis == 'ラ') || (sjis == 'リ') + || (sjis == 'ル') || (sjis == 'レ') || (sjis == 'ロ') || (sjis == 'ワ') || (sjis == 'ヰ') + || (sjis == 'ヱ') || (sjis == 'ヲ') || (sjis == 'ン') || (sjis == 'ァ') || (sjis == 'ィ') + || (sjis == 'ゥ') || (sjis == 'ェ') || (sjis == 'ォ') || (sjis == 'ャ') || (sjis == 'ュ') + || (sjis == 'ョ') || (sjis == 'ッ') || (sjis == 'ヮ'))) { + ret = CONT_ERR_VOICE_WORD; + } + + if (ret != 0) { + return ret; + } else { + old = sjis; + } + } + + if ((sjis == 'っ') || (sjis == 'ッ')) { + ret = CONT_ERR_VOICE_WORD; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecleardictionary.c b/lib/hackerlibultra/src/voice/voicecleardictionary.c new file mode 100644 index 00000000..ed43c1d6 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecleardictionary.c @@ -0,0 +1,41 @@ +/** + * File: voicecleardictionary.c + * + * Initializes Voice Recognition System word registration dictionary. + * + * The dictionary is initialized so that the specified "numWords" can be + * registered in the dictionary. 1-255 words can be registered in the dictionary. + * + * Words cannot be registered with the osVoiceSetWord before the dictionary + * is initialized with the osVoiceClearDictionary function + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceClearDictionary(OSVoiceHandle* hd, u8 words) { + s32 ret; + u8 stat; + u8 buf[4]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + *(u32*)buf = 0x02000000; + buf[2] = words; + + ERRCK(__osVoiceContWrite4(hd->__mq, hd->__channel, 0, buf)); + + ret = __osVoiceCheckResult(hd, &stat); + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecontread2.c b/lib/hackerlibultra/src/voice/voicecontread2.c new file mode 100644 index 00000000..66ef5a43 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecontread2.c @@ -0,0 +1,80 @@ +/** + * File: voicecontread2.c + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "PRinternal/controller_voice.h" +#include "PRinternal/siint.h" + +#define READ2FORMAT(ptr) ((__OSVoiceRead2Format*)(ptr)) + +s32 __osVoiceContRead2(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + u8 status; + int i; + u8* ptr; + int retry = 2; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam.ramarray; + + if ((__osContLastCmd != CONT_CMD_READ2_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_READ2_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READ2FORMAT(ptr)->dummy = CONT_CMD_NOP; + READ2FORMAT(ptr)->txsize = CONT_CMD_READ2_VOICE_TX; + READ2FORMAT(ptr)->rxsize = CONT_CMD_READ2_VOICE_RX; + READ2FORMAT(ptr)->cmd = CONT_CMD_READ2_VOICE; + READ2FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceRead2Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + READ2FORMAT(ptr)->addrh = address >> 3; + READ2FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READ2FORMAT(ptr)); + + if (ret == 0) { + if (__osVoiceContDataCrc(READ2FORMAT(ptr)->data, ARRLEN(READ2FORMAT(ptr)->data)) + != READ2FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } else { + bcopy(READ2FORMAT(ptr)->data, buffer, ARRLEN(READ2FORMAT(ptr)->data)); + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecontread36.c b/lib/hackerlibultra/src/voice/voicecontread36.c new file mode 100644 index 00000000..4be3c480 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecontread36.c @@ -0,0 +1,80 @@ +/** + * File: voicecontread36.c + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "PRinternal/controller_voice.h" +#include "PRinternal/siint.h" + +#define READ36FORMAT(ptr) ((__OSVoiceRead36Format*)(ptr)) + +s32 __osVoiceContRead36(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + u8 status; + s32 i; + u8* ptr; + s32 retry = 2; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam.ramarray; + + if ((__osContLastCmd != CONT_CMD_READ36_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_READ36_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READ36FORMAT(ptr)->dummy = CONT_CMD_NOP; + READ36FORMAT(ptr)->txsize = CONT_CMD_READ36_VOICE_TX; + READ36FORMAT(ptr)->rxsize = CONT_CMD_READ36_VOICE_RX; + READ36FORMAT(ptr)->cmd = CONT_CMD_READ36_VOICE; + READ36FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceRead36Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + READ36FORMAT(ptr)->addrh = address >> 3; + READ36FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READ36FORMAT(ptr)); + + if (ret == 0) { + if (__osVoiceContDataCrc(READ36FORMAT(ptr)->data, ARRLEN(READ36FORMAT(ptr)->data)) + != READ36FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } else { + bcopy(READ36FORMAT(ptr)->data, buffer, ARRLEN(READ36FORMAT(ptr)->data)); + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecontrolgain.c b/lib/hackerlibultra/src/voice/voicecontrolgain.c new file mode 100644 index 00000000..102b90f6 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecontrolgain.c @@ -0,0 +1,35 @@ +/** + * File: voicecontrolgain.c + * + * Adjusts the input gain of the Voice Recognition System + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceControlGain(OSVoiceHandle* hd, s32 analog, s32 digital) { + s32 ret; + u8 cmd; + + static u8 digital_table[] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0 }; + + if (analog == 0) { + cmd = 0x18; + } else { + cmd = 0x98; + } + + ERRCK(__osVoiceSetADConverter(hd->__mq, hd->__channel, cmd)); + + if ((digital < ARRLEN(digital_table)) && (digital >= 0)) { + cmd = digital_table[digital] + 2; + } else { + return CONT_ERR_INVALID; + } + + ERRCK(__osVoiceSetADConverter(hd->__mq, hd->__channel, cmd)); + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecontwrite20.c b/lib/hackerlibultra/src/voice/voicecontwrite20.c new file mode 100644 index 00000000..7b963824 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecontwrite20.c @@ -0,0 +1,81 @@ +/** + * File: voicecontwrite20.c + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "PRinternal/controller_voice.h" +#include "PRinternal/siint.h" + +#define WRITE20FORMAT(ptr) ((__OSVoiceWrite20Format*)(ptr)) + +s32 __osVoiceContWrite20(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + u8 status; + int i; + u8* ptr; + int retry = 2; + u8 crc; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam; + + if ((__osContLastCmd != CONT_CMD_WRITE20_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_WRITE20_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + WRITE20FORMAT(ptr)->dummy = CONT_CMD_NOP; + WRITE20FORMAT(ptr)->txsize = CONT_CMD_WRITE20_VOICE_TX; + WRITE20FORMAT(ptr)->rxsize = CONT_CMD_WRITE20_VOICE_RX; + WRITE20FORMAT(ptr)->cmd = CONT_CMD_WRITE20_VOICE; + WRITE20FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceWrite20Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + WRITE20FORMAT(ptr)->addrh = address >> 3; + WRITE20FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + bcopy(buffer, WRITE20FORMAT(ptr)->data, ARRLEN(WRITE20FORMAT(ptr)->data)); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + crc = __osVoiceContDataCrc(buffer, ARRLEN(WRITE20FORMAT(ptr)->data)); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*WRITE20FORMAT(ptr)); + + if (ret == 0) { + if (crc != WRITE20FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecontwrite4.c b/lib/hackerlibultra/src/voice/voicecontwrite4.c new file mode 100644 index 00000000..8d212fc0 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecontwrite4.c @@ -0,0 +1,81 @@ +/** + * File: voicecontwrite4.c + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "PRinternal/controller_voice.h" +#include "PRinternal/siint.h" + +#define WRITE4FORMAT(ptr) ((__OSVoiceWrite4Format*)(ptr)) + +s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + u8 status; + int i; + u8* ptr; + s32 retry = 2; + u8 crc; + + __osSiGetAccess(); + + do { + + ptr = (u8*)&__osPfsPifRam; + + if ((__osContLastCmd != CONT_CMD_WRITE4_VOICE) || ((u32)__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_WRITE4_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + WRITE4FORMAT(ptr)->dummy = CONT_CMD_NOP; + WRITE4FORMAT(ptr)->txsize = CONT_CMD_WRITE4_VOICE_TX; + WRITE4FORMAT(ptr)->rxsize = CONT_CMD_WRITE4_VOICE_RX; + WRITE4FORMAT(ptr)->cmd = CONT_CMD_WRITE4_VOICE; + WRITE4FORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSVoiceWrite4Format)] = CONT_CMD_END; + } else { + ptr += channel; + } + + WRITE4FORMAT(ptr)->addrh = address >> 3; + WRITE4FORMAT(ptr)->addrl = (address << 5) | __osContAddressCrc(address); + + bcopy(buffer, WRITE4FORMAT(ptr)->data, ARRLEN(WRITE4FORMAT(ptr)->data)); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + crc = __osVoiceContDataCrc(buffer, ARRLEN(WRITE4FORMAT(ptr)->data)); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*WRITE4FORMAT(ptr)); + + if (ret == 0) { + if (crc != WRITE4FORMAT(ptr)->datacrc) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicecountsyllables.c b/lib/hackerlibultra/src/voice/voicecountsyllables.c new file mode 100644 index 00000000..b175347d --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecountsyllables.c @@ -0,0 +1,59 @@ +/** + * File: voicecountsyllables.c + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" + +// The VRU can store only 880 semisyllables of words in its dictionary. +// Use this function to determine the semisyllable count before adding a word with osVoiceSetWord, +// to properly see whether it will fit. + +void osVoiceCountSyllables(u8* data, u32* syllable) { + s32 k; + u16 sjis; + u16 old; + + old = 0; + *syllable = 1; + for (k = 0; data[k] != 0; k += 2) { + sjis = (data[k] << 8) + data[k + 1]; + if ((sjis == 'あ') || (sjis == 'い') || (sjis == 'う') || (sjis == 'え') || (sjis == 'お') || (sjis == 'ア') + || (sjis == 'イ') || (sjis == 'ウ') || (sjis == 'エ') || (sjis == 'オ')) { + if (k == 0) { + *syllable += 2; + } else { + *syllable += 1; + } + } else if ((sjis == 'か') || (sjis == 'き') || (sjis == 'く') || (sjis == 'け') || (sjis == 'こ') + || (sjis == 'た') || (sjis == 'ち') || (sjis == 'つ') || (sjis == 'て') || (sjis == 'と') + || (sjis == 'ぱ') || (sjis == 'ぴ') || (sjis == 'ぷ') || (sjis == 'ぺ') || (sjis == 'ぽ') + || (sjis == 'カ') || (sjis == 'キ') || (sjis == 'ク') || (sjis == 'ケ') || (sjis == 'コ') + || (sjis == 'タ') || (sjis == 'チ') || (sjis == 'ツ') || (sjis == 'テ') || (sjis == 'ト') + || (sjis == 'パ') || (sjis == 'ピ') || (sjis == 'プ') || (sjis == 'ペ') || (sjis == 'ポ')) { + if (k == 0) { + *syllable += 2; + } else if ((old == 'っ') || (old == 'ッ')) { + *syllable += 2; + } else { + *syllable += 3; + } + } else if ((sjis == 'ぁ') || (sjis == 'ぃ') || (sjis == 'ぅ') || (sjis == 'ぇ') || (sjis == 'ぉ') + || (sjis == 'ゃ') || (sjis == 'ゅ') || (sjis == 'ょ') || (sjis == 'ゎ') + + || (sjis == 'ァ') || (sjis == 'ィ') || (sjis == 'ゥ') || (sjis == 'ェ') || (sjis == 'ォ') + || (sjis == 'ャ') || (sjis == 'ュ') || (sjis == 'ョ') || (sjis == 'ヮ') || (sjis == 'ヵ') + || (sjis == 'ヶ')) { + if ((old == 'あ') || (old == 'い') || (old == 'う') || (old == 'え') || (old == 'お') || (old == 'ア') + || (old == 'イ') || (old == 'ウ') || (old == 'エ') || (old == 'オ')) { + *syllable += 1; + } + } else if ((sjis == 'ん') || (sjis == 'ー') || (sjis == 'っ') || (sjis == 'ン') || (sjis == 'ッ')) { + *syllable += 1; + } else { + *syllable += 2; + } + old = sjis; + } +} diff --git a/lib/hackerlibultra/src/voice/voicecrc.c b/lib/hackerlibultra/src/voice/voicecrc.c new file mode 100644 index 00000000..52ae78a1 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicecrc.c @@ -0,0 +1,50 @@ +/** + * File: voicecrc.c + * Description: CRC check used by the voice files + * + * For general information about CRC, see the crc.c file + */ +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" + +#define VOICE_CRC_LENGTH 8 +#define VOICE_CRC_GENERATOR 0x85 + +/** + * This function is essentially the same as __osContDataCrc, but allows for a variable message length, + * specified by `numBytes`. + */ +u8 __osVoiceContDataCrc(u8* data, u32 length) { + s32 temp = 0; + u32 i; + u32 j; + + for (i = length; i != 0; i--) { + // Loop over each j in the i starting with most significant + for (j = (1 << (VOICE_CRC_LENGTH - 1)); j != 0; j >>= 1) { + temp <<= 1; + if (*data & j) { + if (temp & (1 << VOICE_CRC_LENGTH)) { + // Same as temp++; temp ^= 0x85 since last j always 0 after the shift + temp ^= VOICE_CRC_GENERATOR - 1; + } else { + temp++; + } + } else if (temp & (1 << VOICE_CRC_LENGTH)) { + temp ^= VOICE_CRC_GENERATOR; + } + } + data++; + } + // Act like a i of zeros is appended to data + do { + temp <<= 1; + if (temp & (1 << VOICE_CRC_LENGTH)) { + temp ^= VOICE_CRC_GENERATOR; + } + } while (++i < VOICE_CRC_LENGTH); + + // Discarding the excess is done automatically by the return type + return temp; +} diff --git a/lib/hackerlibultra/src/voice/voicegetreaddata.c b/lib/hackerlibultra/src/voice/voicegetreaddata.c new file mode 100644 index 00000000..c4f8f1bc --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicegetreaddata.c @@ -0,0 +1,100 @@ +/** + * File: voicegetreaddata.c + * + * Gets voice recognition result from the Voice Recognition System + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceGetReadData(OSVoiceHandle* hd, OSVoiceData* micdata) { + s32 ret = 0; + s32 i; + u8 stat; + u8 temp[36]; + static u8 c; + + switch (hd->__mode) { + case 1: + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 1) { + return CONT_ERR_NOT_READY; + } + + ERRCK(__osVoiceContRead2(hd->__mq, hd->__channel, 0, temp)); + + c = temp[0] & 7; + hd->cmd_status = c; + if ((c != 0) && (c != 7)) { + return CONT_ERR_NOT_READY; + } + case 2: + hd->__mode = 2; + + ERRCK(__osVoiceGetStatus(hd->__mq, hd->__channel, &stat)); + + if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + *(u32*)temp = 0x600; + ERRCK(__osVoiceContWrite4(hd->__mq, hd->__channel, 0, temp)); + + case 3: + hd->__mode = 3; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 1) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + ERRCK(__osVoiceContRead36(hd->__mq, hd->__channel, 0, temp)); + + micdata->warning = temp[4] + (temp[5] << 8); + micdata->answer_num = temp[6]; + micdata->voice_level = temp[8] + (temp[9] << 8); + micdata->voice_sn = temp[10] + (temp[11] << 8); + micdata->voice_time = temp[12] + (temp[13] << 8); + + for (i = 0; i < 5; i++) { + micdata->answer[i] = temp[14 + (i << 2)] + (temp[15 + (i << 2)] << 8); + micdata->distance[i] = temp[16 + (i << 2)] + (temp[17 + (i << 2)] << 8); + } + + if (micdata->answer[0] == 0x7FFF) { + micdata->answer_num = 0; + } + + hd->cmd_status = temp[34] & 7; + if ((c == 0) || (hd->cmd_status == 0)) { + break; + } + case 4: + hd->__mode = 4; + + ERRCK(__osVoiceGetStatus(hd->__mq, hd->__channel, &stat)); + + if (stat & 1) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + ERRCK(__osVoiceContRead2(hd->__mq, hd->__channel, 0, temp)); + + hd->cmd_status = temp[0] & 7; + if (temp[0] & 7) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + break; + default: + return CONT_ERR_INVALID; + } + hd->__mode = 0; + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicegetstatus.c b/lib/hackerlibultra/src/voice/voicegetstatus.c new file mode 100644 index 00000000..bafa4dd6 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicegetstatus.c @@ -0,0 +1,66 @@ +/** + * File: voicegetstatus.c + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "PRinternal/siint.h" + +s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) { + __OSContRequesFormatShort header; + s32 ret = 0; + s32 i; + u8* ptr = (u8*)&__osContPifRam.ramarray; + s32 retry = 2; + + __osSiGetAccess(); + + do { + if (ret != CONT_ERR_CONTRFAIL) { + __osContPifRam.pifstatus = CONT_CMD_EXE; + + for (i = 0; i < port; i++, *ptr++ = CONT_CMD_REQUEST_STATUS) { + ; + } + + *ptr++ = CONT_CMD_REQUEST_STATUS_TX; + *ptr++ = CONT_CMD_REQUEST_STATUS_RX; + *ptr = CONT_CMD_REQUEST_STATUS; + ptr += 4; + *ptr = CONT_CMD_END; + + __osContLastCmd = CONT_CMD_END; + ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + } + ret = __osSiRawStartDma(OS_READ, &__osContPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ptr = (u8*)&__osContPifRam.ramarray + port; + + header = *((__OSContRequesFormatShort*)ptr); + + ret = (u8)CHNL_ERR(header); + *status = header.status; + + if (ret == 0) { + if (header.typeh == 0 && header.typel == 1) { + if (header.status & 4) { + ret = CONT_ERR_CONTRFAIL; + } + } else { + ret = CONT_ERR_DEVICE; + } + } else if (ret & CONT_NO_RESPONSE_ERROR) { + ret = CONT_ERR_NO_CONTROLLER; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voiceinit.c b/lib/hackerlibultra/src/voice/voiceinit.c new file mode 100644 index 00000000..8aacf850 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voiceinit.c @@ -0,0 +1,49 @@ +/** + * File: voiceinit.c + * + * Initializes Voice Recognition System control structure and hardware + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* handle, int channel) { + s32 ret; + s32 i; + u8 stat = 0; + u8 buf[4]; + static u8 cmd[] = { 0x1E, 0x6E, 0x08, 0x56, 0x03 }; + + handle->__channel = channel; + handle->__mq = mq; + handle->__mode = 0; + + ERRCK(__osVoiceGetStatus(mq, channel, &stat)); + + ret = __osContChannelReset(mq, channel); + if (ret != 0) { + return CONT_ERR_CONTRFAIL; + } + + for (i = 0; i < ARRLEN(cmd); i++) { + ERRCK(__osVoiceSetADConverter(mq, channel, cmd[i])); + } + + ERRCK(__osVoiceGetStatus(mq, channel, &stat)); + if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + *(u32*)buf = 0x100; + ERRCK(__osVoiceContWrite4(mq, channel, 0, buf)); + + ret = __osVoiceCheckResult(handle, &stat); + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voiceinternal.h b/lib/hackerlibultra/src/voice/voiceinternal.h new file mode 100644 index 00000000..8dc62995 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voiceinternal.h @@ -0,0 +1,18 @@ +#ifndef VOICE_INTERNAL_H +#define VOICE_INTERNAL_H + +// Various prototypes and externs that don't show up in os_voice.h +extern s32 __osPfsLastChannel; + +s32 __osContChannelReset(OSMesgQueue* mq, int channel); + +s32 __osVoiceCheckResult(OSVoiceHandle* hd, u8* stat); +s32 __osVoiceContRead2(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osVoiceContRead36(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osVoiceContWrite4(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +s32 __osVoiceContWrite20(OSMesgQueue* mq, int channel, u16 address, u8* buffer); +u8 __osVoiceContDataCrc(u8* data, u32 length); +s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status); +s32 __osVoiceSetADConverter(OSMesgQueue*, s32 channel, u8 cmd); + +#endif diff --git a/lib/hackerlibultra/src/voice/voicemaskdictionary.c b/lib/hackerlibultra/src/voice/voicemaskdictionary.c new file mode 100644 index 00000000..60d8b183 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicemaskdictionary.c @@ -0,0 +1,55 @@ +/** + * File: voicemaskdictionary.c + * + * Mask words registered in the voice recognition system + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceMaskDictionary(OSVoiceHandle* hd, u8* pattern, int size) { + s32 ret = 0; + s32 i; + s32 j; + u8 stat; + u8 buf[20]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + if (size & 1) { + j = size + 1; + } else { + j = size; + } + + bzero(&buf, ARRLEN(buf)); + + buf[18 - j] = 4; + + for (i = 0; i < j; i += 2) { + buf[i + ARRLEN(buf) - j] = pattern[i]; + buf[i + ARRLEN(buf) - j + 1] = pattern[i + 1]; + } + + if (size & 1) { + buf[ARRLEN(buf) - 1] = 0; + } + + ret = __osVoiceContWrite20(hd->__mq, hd->__channel, 0, (u8*)&buf); + if (ret == 0) { + ret = __osVoiceCheckResult(hd, &stat); + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + } + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicesetadconverter.c b/lib/hackerlibultra/src/voice/voicesetadconverter.c new file mode 100644 index 00000000..f5aca4d3 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicesetadconverter.c @@ -0,0 +1,75 @@ +/** + * File: voicesetadconverter.c + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "PRinternal/controller_voice.h" +#include "PRinternal/siint.h" + +#define SWRITEFORMAT(ptr) ((__OSVoiceSWriteFormat*)(ptr)) + +s32 __osVoiceSetADConverter(OSMesgQueue* mq, s32 channel, u8 data) { + s32 ret = 0; + int i; + u8* ptr; + u8 status; + int retry = 2; + + __osSiGetAccess(); + + do { + + ptr = (u8*)__osPfsPifRam.ramarray; + + if ((__osContLastCmd != CONT_CMD_SWRITE_VOICE) || (__osPfsLastChannel != channel)) { + __osContLastCmd = CONT_CMD_SWRITE_VOICE; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + SWRITEFORMAT(ptr)->txsize = CONT_CMD_SWRITE_VOICE_TX; + SWRITEFORMAT(ptr)->rxsize = CONT_CMD_SWRITE_VOICE_RX; + SWRITEFORMAT(ptr)->cmd = CONT_CMD_SWRITE_VOICE; + SWRITEFORMAT(ptr)->datacrc = 0; + + ptr[sizeof(__OSVoiceSWriteFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + + SWRITEFORMAT(ptr)->data = data; + SWRITEFORMAT(ptr)->scrc = __osContAddressCrc(data << 3); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*SWRITEFORMAT(ptr)); + + if (ret == 0) { + if (SWRITEFORMAT(ptr)->datacrc & 1) { + ret = __osVoiceGetStatus(mq, channel, &status); + if (ret != 0) { + break; + } else { + ret = CONT_ERR_CONTRFAIL; + } + } + } else { + ret = CONT_ERR_NO_CONTROLLER; + } + + } while ((ret == CONT_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicesetword.c b/lib/hackerlibultra/src/voice/voicesetword.c new file mode 100644 index 00000000..fb116de5 --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicesetword.c @@ -0,0 +1,61 @@ +/** + * File: voicesetword.c + * + * Registers words to the Voice Recognition System dictionary + */ + +#include "PRinternal/macros.h" +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceSetWord(OSVoiceHandle* hd, u8* word) { + s32 j; + s32 k; + s32 ret; + u8 stat; + u8 buf[40]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + for (k = 0; word[k] != 0; k += 2) { + ; + } + +#ifndef NDEBUG + if (k >= 34) { + return CONT_ERR_VOICE_WORD; + } +#endif + + bzero(buf, ARRLEN(buf)); + + for (j = 0; j < k; j += 2) { + buf[ARRLEN(buf) - 1 - k + j] = word[j]; + buf[ARRLEN(buf) - 1 - k + j - 1] = word[j + 1]; + } + + buf[ARRLEN(buf) - 1 - j - 5] = 3; + + if (k >= 15) { + ERRCK(__osVoiceContWrite20(hd->__mq, hd->__channel, 0, buf)); + } + ERRCK(__osVoiceContWrite20(hd->__mq, hd->__channel, 0, buf + 20)); + ret = __osVoiceCheckResult(hd, &stat); + if (ret != 0) { + if (ret & 0x100) { + ret = CONT_ERR_VOICE_MEMORY; + } else if (ret & 0x200) { + ret = CONT_ERR_VOICE_WORD; + } else if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } + } + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicestartreaddata.c b/lib/hackerlibultra/src/voice/voicestartreaddata.c new file mode 100644 index 00000000..4381e5bd --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicestartreaddata.c @@ -0,0 +1,42 @@ +/** + * File: voicestartreaddata.c + * + * Start voice recognition by the Voice Recognition System + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" + +s32 osVoiceStartReadData(OSVoiceHandle* hd) { + s32 ret; + u8 stat; + u8 temp[4]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + if (hd->__mode != 0) { + return CONT_ERR_INVALID; + } + + *(u32*)temp = 0x5000000; + ret = __osVoiceContWrite4(hd->__mq, hd->__channel, 0, temp); + + if (ret == 0) { + ret = __osVoiceCheckResult(hd, &stat); + + if (ret & 0xFF00) { + ret = CONT_ERR_INVALID; + } else { + hd->__mode = 1; + } + } + + return ret; +} diff --git a/lib/hackerlibultra/src/voice/voicestopreaddata.c b/lib/hackerlibultra/src/voice/voicestopreaddata.c new file mode 100644 index 00000000..1996c5db --- /dev/null +++ b/lib/hackerlibultra/src/voice/voicestopreaddata.c @@ -0,0 +1,65 @@ +/** + * File: voicestopreaddata.c + * + * Forcibly stops voice recognition processing by the Voice Recognition System + */ + +#include "PR/os_internal.h" +#include "PRinternal/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "os_version.h" + +s32 osVoiceStopReadData(OSVoiceHandle* hd) { + s32 ret; +#if BUILD_VERSION >= VERSION_K + s32 i; +#endif + u8 stat; + u8 temp[4]; + + ret = __osVoiceGetStatus(hd->__mq, hd->__channel, &stat); + if (ret != 0) { + return ret; + } else if (stat & 2) { + return CONT_ERR_VOICE_NO_RESPONSE; + } + + if (hd->__mode == 0) { + return CONT_ERR_INVALID; + } + + *(u32*)temp = 0x700; + ret = __osVoiceContWrite4(hd->__mq, hd->__channel, 0, temp); + + if (ret == 0) { +#if BUILD_VERSION >= VERSION_K + i = 0; +#endif + do { + ret = __osVoiceCheckResult(hd, &stat); + if (ret & 0xFF00) { + if (((ret & 7) == 0) || ((ret & 7) == 7)) { + ret = 0; + hd->__mode = 0; + } else { + ret = CONT_ERR_INVALID; + } + } else { + hd->__mode = 0; + } +#if BUILD_VERSION >= VERSION_K + i++; + } while ((ret == CONT_ERR_VOICE_NO_RESPONSE) && (i < 20)); +#else + } while ((ret == CONT_ERR_VOICE_NO_RESPONSE)); +#endif + } +#if BUILD_VERSION >= VERSION_K + if (i >= 20) { + ret == CONT_ERR_VOICE_NO_RESPONSE; + } +#endif + + return ret; +} diff --git a/lib/hackerlibultra/tools/ar.py b/lib/hackerlibultra/tools/ar.py new file mode 100755 index 00000000..0f3e5743 --- /dev/null +++ b/lib/hackerlibultra/tools/ar.py @@ -0,0 +1,476 @@ +#!/usr/bin/env python3 +# +# ar +# + +from genericpath import isfile +import os, struct, time +from dataclasses import dataclass +from libelf import ElfFile, SB_GLOBAL, SHN_UND + +class Archive: + @dataclass + class ArchiveFileRecord: + """ + AR file headers + data + + Offset Length Name Format + 0 16 File identifier ASCII + 16 12 File modification timestamp (in seconds) Decimal + 28 6 Owner ID Decimal + 34 6 Group ID Decimal + 40 8 File mode (type and permission) Octal + 48 10 File size in bytes Decimal + 58 2 Ending characters 0x60 0x0A + """ + name : str + time : int + uid : int + gid : int + mode : int + size : int + data : bytes + + def __init__(self): + self.files = [] # List[ArchiveFileRecord] + self.armap_entries = None + self.time = int(time.time()) + + def add_data(self, name, time, uid, gid, mode, size, data): + self.files.append(Archive.ArchiveFileRecord(name, time, uid, gid, mode, size, data)) + + def add_file(self, file_path): + if not os.path.isfile(file_path): + print(f"Error: No file named {file_path}") + return + + st = os.stat(file_path) + name = os.path.basename(file_path) + time = int(st.st_mtime) + uid = st.st_uid + gid = st.st_gid + mode = st.st_mode + size = st.st_size + + data = None + with open(file_path, "rb") as infile: + data = bytes(infile.read()) + + self.add_data(name, time, uid, gid, mode, size, data) + + def add_ar(self, file_path): + for file in Archive.from_file(file_path).files: + self.add_data(file) + + def build_image(self): + def add_bin(ba, bin): + for b in bin: + ba.append(b) + + def add_str(ba, s, pad_to_len=-1): + if pad_to_len != -1: + s = f"{s:{pad_to_len}}" + s = s.encode("ASCII") + for c in s: + ba.append(c) + + def add_pad(ba): + if len(ba) % 2 != 0: + ba.append(0) + + def add_ar_hdr(ba, name, time, uid, gid, mode, length): + add_str(ba, name, 16) + add_str(ba, str(time), 12) + add_str(ba, str(uid), 6) + add_str(ba, str(gid), 6) + add_str(ba, oct(mode)[2:], 8) + add_str(ba, str(length), 10) + add_str(ba, "`\n") + + b = bytearray() + + # MAGIC + + add_str(b, "!\n") + + # ARMAP + + armap_data= bytearray() + + armap_entries_files = [] + + num_entries = 0 + armap_size = 4 + armap_string_data = bytearray() + for i,file in enumerate(self.files): + elf = ElfFile(file.data) + if elf.symtab is not None: + for sym in elf.symtab.symbol_entries: + if sym.st_shndx != SHN_UND and sym.bind == SB_GLOBAL: + num_entries += 1 + armap_size += 4 + len(sym.name) + 1 + armap_string_data.extend(sym.name.encode("latin1") + b'\0') + armap_entries_files.append(i) + + armap_data.extend(struct.pack(">I", num_entries)) + armap_data.extend([0] * 4 * num_entries) # defer writing file positions until files are emplaced later + armap_data.extend(armap_string_data) + + if len(armap_data) % 4 != 0: + alsiz = (len(armap_data) + 3) & ~3 + armap_data.extend([0] * (alsiz - len(armap_data))) + + current_time = int(time.time()) + + add_ar_hdr(b, "/", current_time, 0, 0, 0, len(armap_data)) + armap_offsets_start = len(b) + 4 + add_bin(b, armap_data) + add_pad(b) + + # LONG STRINGS + + long_strings = "" + + file_names = [] + flag = False + for _,file in enumerate(self.files): + if len(file.name) >= 16: + fname = f"{file.name}/\n" + ind = len(long_strings) + long_strings += fname + else: + fname = f"{file.name}/" + ind = None + file_names.append((fname, ind)) + + # Weird hack + if len(long_strings) != 0 and not flag: + flag = True + long_strings += "/\n" + + long_strings += "/" + + add_ar_hdr(b, "//", current_time, 0, 0, 0, len(long_strings)) + add_str(b, long_strings) + add_pad(b) + + # FILES + + armap_pos = 0 + for i,(file,(fname,ind)) in enumerate(zip(self.files, file_names)): + file_pos = len(b) + add_ar_hdr(b, f"/{ind}" if ind is not None else fname, file.time, file.uid, file.gid, file.mode, file.size) + add_bin(b, file.data) + add_pad(b) + + # Patch the armap with file locations + while armap_pos < len(armap_entries_files) and armap_entries_files[armap_pos] == i: + b[armap_offsets_start+armap_pos*4:armap_offsets_start+armap_pos*4+4] = struct.pack(">I", file_pos) + armap_pos += 1 + + return b + + def write(self, file_path): + ar = self.build_image() + with open(file_path, "wb") as outfile: + outfile.write(ar) + + @staticmethod + def from_image(ar_data): + long_strings = None + ar = Archive() + + assert ar_data[:8].decode("ASCII") == "!\n" , "Not an archive file? Bad file magic value" + + i = 8 + while i < len(ar_data): + file_name = ar_data[i:][ 0:][:16].decode("ASCII").strip() + file_time = int(ar_data[i:][16:][:12].decode("ASCII").strip()) + file_uid = int(ar_data[i:][28:][: 6].decode("ASCII").strip()) + file_gid = int(ar_data[i:][34:][: 6].decode("ASCII").strip()) + file_mode = int(ar_data[i:][40:][: 8].decode("ASCII").strip(), 8) + file_size = int(ar_data[i:][48:][:10].decode("ASCII").strip()) + end = ar_data[i:][58:][:2].decode("ASCII") + assert end == "`\n" + + data = ar_data[i:][60:][:file_size] + assert len(data) == file_size + + if file_name == '/': + """ + "armap" + The special filename "/" denotes that this entry contains a symbol lookup table used by some libraries + to speed up file access. + The symbol table is comprised of three contiguous parts: + - A 32-bit Big Endian integer recording the number of symbol entries. + - A list of 32-bit Big Endian integers for each symbol entry, recording the position within the + archive of the header of the file containing the symbol. + - A list of null-terminated strings, the symbol names for each symbol entry. + + We rebuild this from scratch on write out. + """ + ar.time = file_time + assert file_uid == 0 + assert file_gid == 0 + assert file_mode == 0 + + # Code to interpret the armap, currently unused + """ + armap_n_syms = struct.unpack(">I", data[0:4])[0] + offsets = [i[0] for i in struct.iter_unpack(">I", data[4:4+4*armap_n_syms])] + + strings = [] + ofs = 4 + 4 * armap_n_syms + for _ in range(armap_n_syms): + to = data.find(b'\0', ofs) + assert to != -1 + string = data[ofs:to].decode('latin1') + strings.append(string) + ofs += len(string) + 1 + assert all([b == 0 for b in data[ofs:]]) + assert len(strings) == len(offsets) + + ar.armap_entries = list(zip(offsets, strings)) + """ + elif file_name == '//': + """ + Long string table. Strings larger than 16 are placed here and referenced from the header by /. + + We rebuild this from scratch on write out. + """ + assert file_time == ar.time + assert file_uid == 0 + assert file_gid == 0 + assert file_mode == 0 + long_strings = data.decode("ASCII") + else: + """ + Normal files. + """ + if file_name.startswith("/"): + assert long_strings is not None + # Fetch the name from the long string table + file_name = long_strings[int(file_name[1:]):].split("\n")[0] + # Add file + ar.add_data(file_name[:-1], file_time, file_uid, file_gid, file_mode, file_size, data) + + if file_size % 2 != 0: + file_size += 1 + i += 60 + file_size + + return ar + + @staticmethod + def from_file(file_path): + ar_file = None + with open(file_path, "rb") as infile: + ar_file = infile.read() + + return Archive.from_image(ar_file) + +def ar_usage(progname): + print(f"Usage: {progname} [-]{{dmpqrstx}}[abcDfilMNoOPsSTuvV] [member-name] [count] archive-file file...") + print(f" commands:") + print(f" d - delete file(s) from the archive") + print(f" m[ab] - move file(s) in the archive") + print(f" p - print file(s) found in the archive") + print(f" q[f] - quick append file(s) to the archive") + print(f" r[ab][f][u] - replace existing or insert new file(s) into the archive") + print(f" s - act as ranlib") + print(f" t[O][v] - display contents of the archive") + print(f" x[o] - extract file(s) from the archive") + print(f" command specific modifiers:") + print(f" [a] - put file(s) after [member-name]") + print(f" [b] - put file(s) before [member-name] (same as [i])") + print(f" [D] - use zero for timestamps and uids/gids (default)") + print(f" [U] - use actual timestamps and uids/gids") + print(f" [N] - use instance [count] of name") + print(f" [f] - truncate inserted file names") + print(f" [P] - use full path names when matching") + print(f" [o] - preserve original dates") + print(f" [O] - display offsets of files in the archive") + print(f" [u] - only replace files that are newer than current archive contents") + print(f" generic modifiers:") + print(f" [c] - do not warn if the library had to be created") + print(f" [s] - create an archive index (cf. ranlib)") + print(f" [S] - do not build a symbol table") + print(f" [v] - be verbose") + print(f" [V] - display the version number") + print(f" @ - read options from ") + print(f" --output=DIRNAME - specify the output directory for extraction operations") + return 1 + +def ar(argv): + if len(argv) < 2: + return ar_usage(argv[0]) + + progname = argv[0] + create_ok = False + make_ar_idx = False + no_symtab = False + verbose = False + + def verbose_print(msg): + if verbose: + print(msg) + + def dcmd(modifiers, args): + if modifiers != "": + print(f"{progname}: bad modifiers -- '{modifiers}'") + return ar_usage(progname) + + ar_file = args[0] + o_files = args[1:] + + ar = Archive.from_file(ar_file) + for file in ar.files: + if file.name in o_files: + ar.files.remove(file) + ar.write(ar_file) + return 0 + + def mcmd(modifiers, args): + print("") + return 1 + + def pcmd(modifiers, args): + if modifiers != "": + print(f"{progname}: bad modifiers -- '{modifiers}'") + return ar_usage(progname) + if len(args) != 1: + print(f"{progname} p: bad args") + return ar_usage(progname) + + ar_file = args[0] + + ar = Archive.from_file(ar_file) + for file in ar.files: + print(file.data) + return 0 + + def qcmd(modifiers, args): + print("") + return 1 + + def rcmd(modifiers, args): + if modifiers !="": + print("") + if len(args) < 2: + print(f"{progname} r: bad args") + return ar_usage(progname) + + ar_file = args[0] + o_files = args[1:] + + ar = Archive() + if os.path.isfile(ar_file): + ar = Archive.from_file(ar_file) + else: + if not create_ok: + print(f"Warning: Created file {ar_file}") + ar = Archive() + + for o_file in o_files: + ar.add_file(o_file) + + ar.write(ar_file) + + def scmd(modifiers, args): + print("") + return 1 + + def tcmd(modifiers, args): + # TODO modifiers + + if len(args) != 1: + print(f"{progname} t: bad args") + return ar_usage(progname) + + ar_file = args[0] + + ar = Archive.from_file(ar_file) + for file in ar.files: + print(file.name) + return 0 + + def xcmd(modifiers, args): + if modifiers not in ('', 'o'): + print(f"{progname}: bad modifiers -- '{modifiers}'") + return ar_usage(progname) + if len(args) not in (1, 3) or not (args[0].startswith("--output") or args[1].startswith("--output")): + print(f"{progname} t: bad args") + return ar_usage(progname) + + original_times = modifiers == 'o' + + if args[0].startswith("--output"): + out_dir = args[1] + ar_file = args[2] + elif args[1].startswith("--output"): + out_dir = args[2] + ar_file = args[0] + else: + ar_file = args[0] + out_dir = "" + + # Create dir if not exists + if not os.path.exists(out_dir): + os.makedirs(out_dir, exist_ok=True) + + if not os.path.isdir(out_dir): + print(f"Output directory {out_dir} is a file") + return ar_usage(progname) + + # Extract files to destination + ar = Archive.from_file(ar_file) + for file in ar.files: + opath =os.path.join(out_dir, file.name) + with open(opath, "wb") as ofile: + ofile.write(file.data) + + if not original_times: + t = time.time() + os.utime(opath, (t, t)) + # TODO patch with original dates etc. + + return 0 + + argtbl = { + 'd': dcmd, # delete file(s) from the archive + 'm': mcmd, # [ab] move file(s) in the archive + 'p': pcmd, # print file(s) found in the archive + 'q': qcmd, # [f] quick append file(s) to the archive + 'r': rcmd, # [ab][f][u] replace existing or insert new file(s) into the archive + 's': scmd, # act as ranlib + 't': tcmd, # [O][v] display contents of the archive + 'x': xcmd, # [o] extract file(s) from the archive + } + + arg1 = argv[1] + if arg1[0] == '-': + arg1 = arg1[1:] + cmd = arg1[0] + + if cmd not in argtbl: + print(f"{progname}: invalid option -- '{cmd}'") + return ar_usage(argv[0]) + + modifiers = arg1[1:] + + create_ok = "c" in modifiers + modifiers = modifiers.replace("c","") + make_ar_idx = "s" in modifiers + modifiers = modifiers.replace("s","") + no_symtab = "S" in modifiers + modifiers = modifiers.replace("S","") + verbose = "v" in modifiers + modifiers = modifiers.replace("v","") + + if "V" in modifiers: + print(f"{progname} v1.0") + + return argtbl[cmd](modifiers, argv[2:]) + +if __name__ == '__main__': + import sys + sys.exit(ar(sys.argv)) diff --git a/lib/hackerlibultra/tools/asm_differ/.gitignore b/lib/hackerlibultra/tools/asm_differ/.gitignore new file mode 100644 index 00000000..eb176dc5 --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/.gitignore @@ -0,0 +1,2 @@ +.mypy_cache/ +__pycache__/ diff --git a/tools/ido-static-recomp/tools/rabbitizer/.gitrepo b/lib/hackerlibultra/tools/asm_differ/.gitrepo similarity index 58% rename from tools/ido-static-recomp/tools/rabbitizer/.gitrepo rename to lib/hackerlibultra/tools/asm_differ/.gitrepo index cbd77990..2e999c85 100644 --- a/tools/ido-static-recomp/tools/rabbitizer/.gitrepo +++ b/lib/hackerlibultra/tools/asm_differ/.gitrepo @@ -4,9 +4,9 @@ ; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme ; [subrepo] - remote = git@github.com:Decompollaborate/rabbitizer.git - branch = develop - commit = 72bf240f468d30286888212b5fb773fae94340f6 - parent = fa84f928c510147d6083b979efb28a5a07eefe10 + remote = https://github.com/simonlindholm/asm-differ + branch = main + commit = 4b38c884c1efdc3bfa8b14f13015a69368a8d3a2 + parent = 32a1a8061de197c4f10d4904cd72a22dd7cf905c method = merge cmdver = 0.4.3 diff --git a/lib/hackerlibultra/tools/asm_differ/.pre-commit-config.yaml b/lib/hackerlibultra/tools/asm_differ/.pre-commit-config.yaml new file mode 100644 index 00000000..6695f71a --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: +- repo: https://github.com/psf/black + rev: 20.8b1 + hooks: + - id: black + language_version: python3.6 diff --git a/tools/asm-processor/LICENSE b/lib/hackerlibultra/tools/asm_differ/LICENSE similarity index 100% rename from tools/asm-processor/LICENSE rename to lib/hackerlibultra/tools/asm_differ/LICENSE diff --git a/lib/hackerlibultra/tools/asm_differ/README.md b/lib/hackerlibultra/tools/asm_differ/README.md new file mode 100644 index 00000000..4a7f329b --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/README.md @@ -0,0 +1,56 @@ +# asm-differ + +Nice differ for assembly code. Currently supports MIPS, PPC, AArch64, and ARM32; should be easy to hack to support other instruction sets. + +![](screenshot.png) + +## Dependencies + +- Python >= 3.6 +- `python3 -m pip install --user colorama watchdog python-Levenshtein` (also `dataclasses` if on 3.6) + +## Usage + +Create a file `diff_settings.sh` in some directory (see the one in this repo for an example). Then from that directory, run + +```bash +/path/to/diff.sh [flags] (function|rom addr) +``` + +Recommended flags are `-mwo` (automatically run `make` on source file changes, and include symbols in diff). See `--help` for more details. + +### Tab completion + +[argcomplete](https://kislyuk.github.io/argcomplete/) can be optionally installed (with `python3 -m pip install argcomplete`) to enable tab completion in a bash shell, completing options and symbol names using the linker map. It also requires a bit more setup: + +If invoking the script **exactly** as `./diff.py`, the following should be added to the `.bashrc` according to argcomplete's instructions: + +```bash +eval "$(register-python-argcomplete ./diff.py)" +``` + +If that doesn't work, run `register-python-argcomplete ./diff.py` in your terminal and copy the output to `.bashrc`. + +If setup correctly (don't forget to restart the shell), `complete | grep ./diff.py` should output: + +```bash +complete -o bashdefault -o default -o nospace -F _python_argcomplete ./diff.py +``` + +Note for developers or for general troubleshooting: run `export _ARC_DEBUG=` to enable debug output during tab-completion, it may show otherwise silenced errors. Use `unset _ARC_DEBUG` or restart the terminal to disable. + +### Contributing + +Contributions are very welcome! Some notes on workflow: + +`black` is used for code formatting. You can either run `black diff.py` manually, or set up a pre-commit hook: +```bash +pip install pre-commit black +pre-commit install +``` + +Type annotations are used for all Python code. `mypy` should pass without any errors. + +PRs that skip the above are still welcome, however. + +The targeted Python version is 3.6. There are currently no tests. diff --git a/lib/hackerlibultra/tools/asm_differ/diff-stylesheet.css b/lib/hackerlibultra/tools/asm_differ/diff-stylesheet.css new file mode 100644 index 00000000..79da120d --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/diff-stylesheet.css @@ -0,0 +1,67 @@ +table.diff { + border: none; + font-family: Monospace; + white-space: pre; +} +tr.data-ref { + background-color: gray; +} +.immediate { + color: lightblue; +} +.stack { + color: yellow; +} +.register { + color: yellow; +} +.delay-slot { + font-weight: bold; + color: gray; +} +.diff-change { + color: lightblue; +} +.diff-add { + color: green; +} +.diff-remove { + color: red; +} +.source-filename { + font-weight: bold; +} +.source-function { + font-weight: bold; + text-decoration: underline; +} +.source-other { + font-style: italic; +} +.rotation-0 { + color: magenta; +} +.rotation-1 { + color: cyan; +} +.rotation-2 { + color: green; +} +.rotation-3 { + color: red; +} +.rotation-4 { + color: yellow; +} +.rotation-5 { + color: pink; +} +.rotation-6 { + color: blue; +} +.rotation-7 { + color: lime; +} +.rotation-8 { + color: gray; +} diff --git a/lib/hackerlibultra/tools/asm_differ/diff.py b/lib/hackerlibultra/tools/asm_differ/diff.py new file mode 100755 index 00000000..8ed764f9 --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/diff.py @@ -0,0 +1,2923 @@ +#!/usr/bin/env python3 +# PYTHON_ARGCOMPLETE_OK +import argparse +import sys +from typing import ( + Any, + Callable, + Dict, + Iterator, + List, + Match, + NoReturn, + Optional, + Pattern, + Set, + Tuple, + Type, + Union, +) + + +def fail(msg: str) -> NoReturn: + print(msg, file=sys.stderr) + sys.exit(1) + + +def static_assert_unreachable(x: NoReturn) -> NoReturn: + raise Exception("Unreachable! " + repr(x)) + + +# ==== COMMAND-LINE ==== + +if __name__ == "__main__": + # Prefer to use diff_settings.py from the current working directory + sys.path.insert(0, ".") + try: + import diff_settings + except ModuleNotFoundError: + fail("Unable to find diff_settings.py in the same directory.") + sys.path.pop(0) + + try: + import argcomplete + except ModuleNotFoundError: + argcomplete = None + + parser = argparse.ArgumentParser( + description="Diff MIPS, PPC, AArch64, or ARM32 assembly." + ) + + start_argument = parser.add_argument( + "start", + help="Function name or address to start diffing from.", + ) + + if argcomplete: + + def complete_symbol( + prefix: str, parsed_args: argparse.Namespace, **kwargs: object + ) -> List[str]: + if not prefix or prefix.startswith("-"): + # skip reading the map file, which would + # result in a lot of useless completions + return [] + config: Dict[str, Any] = {} + diff_settings.apply(config, parsed_args) # type: ignore + mapfile = config.get("mapfile") + if not mapfile: + return [] + completes = [] + with open(mapfile) as f: + data = f.read() + # assume symbols are prefixed by a space character + search = f" {prefix}" + pos = data.find(search) + while pos != -1: + # skip the space character in the search string + pos += 1 + # assume symbols are suffixed by either a space + # character or a (unix-style) line return + spacePos = data.find(" ", pos) + lineReturnPos = data.find("\n", pos) + if lineReturnPos == -1: + endPos = spacePos + elif spacePos == -1: + endPos = lineReturnPos + else: + endPos = min(spacePos, lineReturnPos) + if endPos == -1: + match = data[pos:] + pos = -1 + else: + match = data[pos:endPos] + pos = data.find(search, endPos) + completes.append(match) + return completes + + setattr(start_argument, "completer", complete_symbol) + + parser.add_argument( + "end", + nargs="?", + help="Address to end diff at.", + ) + parser.add_argument( + "-o", + dest="diff_obj", + action="store_true", + help="""Diff .o files rather than a whole binary. This makes it possible to + see symbol names. (Recommended)""", + ) + parser.add_argument( + "-e", + "--elf", + dest="diff_elf_symbol", + metavar="SYMBOL", + help="""Diff a given function in two ELFs, one being stripped and the other + one non-stripped. Requires objdump from binutils 2.33+.""", + ) + parser.add_argument( + "-c", + "--source", + dest="show_source", + action="store_true", + help="Show source code (if possible). Only works with -o or -e.", + ) + parser.add_argument( + "-C", + "--source-old-binutils", + dest="source_old_binutils", + action="store_true", + help="""Tweak --source handling to make it work with binutils < 2.33. + Implies --source.""", + ) + parser.add_argument( + "-j", + "--section", + dest="diff_section", + default=".text", + metavar="SECTION", + help="Diff restricted to a given output section.", + ) + parser.add_argument( + "-L", + "--line-numbers", + dest="show_line_numbers", + action="store_const", + const=True, + help="""Show source line numbers in output, when available. May be enabled by + default depending on diff_settings.py.""", + ) + parser.add_argument( + "--no-line-numbers", + dest="show_line_numbers", + action="store_const", + const=False, + help="Hide source line numbers in output.", + ) + parser.add_argument( + "--inlines", + dest="inlines", + action="store_true", + help="Show inline function calls (if possible). Only works with -o or -e.", + ) + parser.add_argument( + "--base-asm", + dest="base_asm", + metavar="FILE", + help="Read assembly from given file instead of configured base img.", + ) + parser.add_argument( + "--write-asm", + dest="write_asm", + metavar="FILE", + help="Write the current assembly output to file, e.g. for use with --base-asm.", + ) + parser.add_argument( + "-m", + "--make", + dest="make", + action="store_true", + help="Automatically run 'make' on the .o file or binary before diffing.", + ) + parser.add_argument( + "-l", + "--skip-lines", + dest="skip_lines", + metavar="LINES", + type=int, + default=0, + help="Skip the first LINES lines of output.", + ) + parser.add_argument( + "-s", + "--stop-jr-ra", + dest="stop_jrra", + action="store_true", + help="""Stop disassembling at the first 'jr ra'. Some functions have + multiple return points, so use with care!""", + ) + parser.add_argument( + "-i", + "--ignore-large-imms", + dest="ignore_large_imms", + action="store_true", + help="Pretend all large enough immediates are the same.", + ) + parser.add_argument( + "-I", + "--ignore-addr-diffs", + dest="ignore_addr_diffs", + action="store_true", + help="Ignore address differences. Currently only affects AArch64 and ARM32.", + ) + parser.add_argument( + "-B", + "--no-show-branches", + dest="show_branches", + action="store_false", + help="Don't visualize branches/branch targets.", + ) + parser.add_argument( + "-S", + "--base-shift", + dest="base_shift", + metavar="N", + type=str, + default="0", + help="""Diff position N in our img against position N + shift in the base img. + Arithmetic is allowed, so e.g. |-S "0x1234 - 0x4321"| is a reasonable + flag to pass if it is known that position 0x1234 in the base img syncs + up with position 0x4321 in our img. Not supported together with -o.""", + ) + parser.add_argument( + "-w", + "--watch", + dest="watch", + action="store_true", + help="""Automatically update when source/object files change. + Recommended in combination with -m.""", + ) + parser.add_argument( + "-3", + "--threeway=prev", + dest="threeway", + action="store_const", + const="prev", + help="""Show a three-way diff between target asm, current asm, and asm + prior to -w rebuild. Requires -w.""", + ) + parser.add_argument( + "-b", + "--threeway=base", + dest="threeway", + action="store_const", + const="base", + help="""Show a three-way diff between target asm, current asm, and asm + when diff.py was started. Requires -w.""", + ) + parser.add_argument( + "--width", + dest="column_width", + metavar="COLS", + type=int, + default=50, + help="Sets the width of the left and right view column.", + ) + parser.add_argument( + "--algorithm", + dest="algorithm", + default="levenshtein", + choices=["levenshtein", "difflib"], + help="""Diff algorithm to use. Levenshtein gives the minimum diff, while difflib + aims for long sections of equal opcodes. Defaults to %(default)s.""", + ) + parser.add_argument( + "--max-size", + "--max-lines", + metavar="LINES", + dest="max_lines", + type=int, + default=1024, + help="The maximum length of the diff, in lines.", + ) + parser.add_argument( + "--no-pager", + dest="no_pager", + action="store_true", + help="""Disable the pager; write output directly to stdout, then exit. + Incompatible with --watch.""", + ) + parser.add_argument( + "--format", + choices=("color", "plain", "html", "json"), + default="color", + help="Output format, default is color. --format=html or json implies --no-pager.", + ) + parser.add_argument( + "-U", + "--compress-matching", + metavar="N", + dest="compress_matching", + type=int, + help="""Compress streaks of matching lines, leaving N lines of context + around non-matching parts.""", + ) + parser.add_argument( + "-V", + "--compress-sameinstr", + metavar="N", + dest="compress_sameinstr", + type=int, + help="""Compress streaks of lines with same instructions (but possibly + different regalloc), leaving N lines of context around other parts.""", + ) + + # Project-specific flags, e.g. different versions/make arguments. + add_custom_arguments_fn = getattr(diff_settings, "add_custom_arguments", None) + if add_custom_arguments_fn: + add_custom_arguments_fn(parser) + + if argcomplete: + argcomplete.autocomplete(parser) + +# ==== IMPORTS ==== + +# (We do imports late to optimize auto-complete performance.) + +import abc +import ast +from collections import Counter, defaultdict +from dataclasses import asdict, dataclass, field, replace +import difflib +import enum +import html +import itertools +import json +import os +import queue +import re +import string +import struct +import subprocess +import threading +import time +import traceback + + +MISSING_PREREQUISITES = ( + "Missing prerequisite python module {}. " + "Run `python3 -m pip install --user colorama watchdog python-Levenshtein cxxfilt` to install prerequisites (cxxfilt only needed with --source)." +) + +try: + from colorama import Back, Fore, Style + import watchdog +except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + +# ==== CONFIG ==== + + +@dataclass +class ProjectSettings: + arch_str: str + objdump_executable: str + build_command: List[str] + map_format: str + mw_build_dir: str + baseimg: Optional[str] + myimg: Optional[str] + mapfile: Optional[str] + source_directories: Optional[List[str]] + source_extensions: List[str] + show_line_numbers_default: bool + disassemble_all: bool + + +@dataclass +class Compress: + context: int + same_instr: bool + + +@dataclass +class Config: + arch: "ArchSettings" + + # Build/objdump options + diff_obj: bool + make: bool + source_old_binutils: bool + diff_section: str + inlines: bool + max_function_size_lines: int + max_function_size_bytes: int + + # Display options + formatter: "Formatter" + threeway: Optional[str] + base_shift: int + skip_lines: int + compress: Optional[Compress] + show_branches: bool + show_line_numbers: bool + show_source: bool + stop_jrra: bool + ignore_large_imms: bool + ignore_addr_diffs: bool + algorithm: str + + # Score options + score_stack_differences = True + penalty_stackdiff = 1 + penalty_regalloc = 5 + penalty_reordering = 60 + penalty_insertion = 100 + penalty_deletion = 100 + + +def create_project_settings(settings: Dict[str, Any]) -> ProjectSettings: + return ProjectSettings( + arch_str=settings.get("arch", "mips"), + baseimg=settings.get("baseimg"), + myimg=settings.get("myimg"), + mapfile=settings.get("mapfile"), + build_command=settings.get( + "make_command", ["make", *settings.get("makeflags", [])] + ), + source_directories=settings.get("source_directories"), + source_extensions=settings.get( + "source_extensions", [".c", ".h", ".cpp", ".hpp", ".s"] + ), + objdump_executable=get_objdump_executable(settings.get("objdump_executable")), + map_format=settings.get("map_format", "gnu"), + mw_build_dir=settings.get("mw_build_dir", "build/"), + show_line_numbers_default=settings.get("show_line_numbers_default", True), + disassemble_all=settings.get("disassemble_all", False) + ) + + +def create_config(args: argparse.Namespace, project: ProjectSettings) -> Config: + arch = get_arch(project.arch_str) + + formatter: Formatter + if args.format == "plain": + formatter = PlainFormatter(column_width=args.column_width) + elif args.format == "color": + formatter = AnsiFormatter(column_width=args.column_width) + elif args.format == "html": + formatter = HtmlFormatter() + elif args.format == "json": + formatter = JsonFormatter(arch_str=arch.name) + else: + raise ValueError(f"Unsupported --format: {args.format}") + + compress = None + if args.compress_matching is not None: + compress = Compress(args.compress_matching, False) + if args.compress_sameinstr is not None: + if compress is not None: + raise ValueError( + "Cannot pass both --compress-matching and --compress-sameinstr" + ) + compress = Compress(args.compress_sameinstr, True) + + show_line_numbers = args.show_line_numbers + if show_line_numbers is None: + show_line_numbers = project.show_line_numbers_default + + return Config( + arch=arch, + # Build/objdump options + diff_obj=args.diff_obj, + make=args.make, + source_old_binutils=args.source_old_binutils, + diff_section=args.diff_section, + inlines=args.inlines, + max_function_size_lines=args.max_lines, + max_function_size_bytes=args.max_lines * 4, + # Display options + formatter=formatter, + threeway=args.threeway, + base_shift=eval_int( + args.base_shift, "Failed to parse --base-shift (-S) argument as an integer." + ), + skip_lines=args.skip_lines, + compress=compress, + show_branches=args.show_branches, + show_line_numbers=show_line_numbers, + show_source=args.show_source or args.source_old_binutils, + stop_jrra=args.stop_jrra, + ignore_large_imms=args.ignore_large_imms, + ignore_addr_diffs=args.ignore_addr_diffs, + algorithm=args.algorithm, + ) + + +def get_objdump_executable(objdump_executable: Optional[str]) -> str: + if objdump_executable is not None: + return objdump_executable + + objdump_candidates = [ + "mips-linux-gnu-objdump", + "mips64-elf-objdump", + "mips-elf-objdump", + ] + for objdump_cand in objdump_candidates: + try: + subprocess.check_call( + [objdump_cand, "--version"], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + return objdump_cand + except subprocess.CalledProcessError: + pass + except FileNotFoundError: + pass + + return fail( + f"Missing binutils; please ensure {' or '.join(objdump_candidates)} exists, or configure objdump_executable." + ) + + +def get_arch(arch_str: str) -> "ArchSettings": + for settings in ARCH_SETTINGS: + if arch_str == settings.name: + return settings + raise ValueError(f"Unknown architecture: {arch_str}") + + +BUFFER_CMD: List[str] = ["tail", "-c", str(10 ** 9)] + +# -S truncates long lines instead of wrapping them +# -R interprets color escape sequences +# -i ignores case when searching +# -c something about how the screen gets redrawn; I don't remember the purpose +# -#6 makes left/right arrow keys scroll by 6 characters +LESS_CMD: List[str] = ["less", "-SRic", "-#6"] + +DEBOUNCE_DELAY: float = 0.1 + +# ==== FORMATTING ==== + + +@enum.unique +class BasicFormat(enum.Enum): + NONE = enum.auto() + IMMEDIATE = enum.auto() + STACK = enum.auto() + REGISTER = enum.auto() + DELAY_SLOT = enum.auto() + DIFF_CHANGE = enum.auto() + DIFF_ADD = enum.auto() + DIFF_REMOVE = enum.auto() + SOURCE_FILENAME = enum.auto() + SOURCE_FUNCTION = enum.auto() + SOURCE_LINE_NUM = enum.auto() + SOURCE_OTHER = enum.auto() + + +@dataclass(frozen=True) +class RotationFormat: + group: str + index: int + key: str + + +Format = Union[BasicFormat, RotationFormat] +FormatFunction = Callable[[str], Format] + + +class Text: + segments: List[Tuple[str, Format]] + + def __init__(self, line: str = "", f: Format = BasicFormat.NONE) -> None: + self.segments = [(line, f)] if line else [] + + def reformat(self, f: Format) -> "Text": + return Text(self.plain(), f) + + def plain(self) -> str: + return "".join(s for s, f in self.segments) + + def __repr__(self) -> str: + return f"" + + def __bool__(self) -> bool: + return any(s for s, f in self.segments) + + def __str__(self) -> str: + # Use Formatter.apply(...) instead + return NotImplemented + + def __eq__(self, other: object) -> bool: + return NotImplemented + + def __add__(self, other: Union["Text", str]) -> "Text": + if isinstance(other, str): + other = Text(other) + result = Text() + # If two adjacent segments have the same format, merge their lines + if ( + self.segments + and other.segments + and self.segments[-1][1] == other.segments[0][1] + ): + result.segments = ( + self.segments[:-1] + + [(self.segments[-1][0] + other.segments[0][0], self.segments[-1][1])] + + other.segments[1:] + ) + else: + result.segments = self.segments + other.segments + return result + + def __radd__(self, other: Union["Text", str]) -> "Text": + if isinstance(other, str): + other = Text(other) + return other + self + + def finditer(self, pat: Pattern[str]) -> Iterator[Match[str]]: + """Replacement for `pat.finditer(text)` that operates on the inner text, + and returns the exact same matches as `Text.sub(pat, ...)`.""" + for chunk, f in self.segments: + for match in pat.finditer(chunk): + yield match + + def sub(self, pat: Pattern[str], sub_fn: Callable[[Match[str]], "Text"]) -> "Text": + result = Text() + for chunk, f in self.segments: + i = 0 + for match in pat.finditer(chunk): + start, end = match.start(), match.end() + assert i <= start <= end <= len(chunk) + sub = sub_fn(match) + if i != start: + result.segments.append((chunk[i:start], f)) + result.segments.extend(sub.segments) + i = end + if chunk[i:]: + result.segments.append((chunk[i:], f)) + return result + + def ljust(self, column_width: int) -> "Text": + length = sum(len(x) for x, _ in self.segments) + return self + " " * max(column_width - length, 0) + + +@dataclass +class TableMetadata: + headers: Tuple[Text, ...] + current_score: int + max_score: int + previous_score: Optional[int] + + +class Formatter(abc.ABC): + @abc.abstractmethod + def apply_format(self, chunk: str, f: Format) -> str: + """Apply the formatting `f` to `chunk` and escape the contents.""" + ... + + @abc.abstractmethod + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + """Format a multi-column table with metadata""" + ... + + def apply(self, text: Text) -> str: + return "".join(self.apply_format(chunk, f) for chunk, f in text.segments) + + @staticmethod + def outputline_texts(lines: Tuple["OutputLine", ...]) -> Tuple[Text, ...]: + return tuple([lines[0].base or Text()] + [line.fmt2 for line in lines[1:]]) + + +@dataclass +class PlainFormatter(Formatter): + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + return chunk + + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + rows = [meta.headers] + [self.outputline_texts(ls) for ls in lines] + return "\n".join( + "".join(self.apply(x.ljust(self.column_width)) for x in row) for row in rows + ) + + +@dataclass +class AnsiFormatter(Formatter): + # Additional ansi escape codes not in colorama. See: + # https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters + STYLE_UNDERLINE = "\x1b[4m" + STYLE_NO_UNDERLINE = "\x1b[24m" + STYLE_INVERT = "\x1b[7m" + + BASIC_ANSI_CODES = { + BasicFormat.NONE: "", + BasicFormat.IMMEDIATE: Fore.LIGHTBLUE_EX, + BasicFormat.STACK: Fore.YELLOW, + BasicFormat.REGISTER: Fore.YELLOW, + BasicFormat.DELAY_SLOT: Fore.LIGHTBLACK_EX, + BasicFormat.DIFF_CHANGE: Fore.LIGHTBLUE_EX, + BasicFormat.DIFF_ADD: Fore.GREEN, + BasicFormat.DIFF_REMOVE: Fore.RED, + BasicFormat.SOURCE_FILENAME: Style.DIM + Style.BRIGHT, + BasicFormat.SOURCE_FUNCTION: Style.DIM + Style.BRIGHT + STYLE_UNDERLINE, + BasicFormat.SOURCE_LINE_NUM: Fore.LIGHTBLACK_EX, + BasicFormat.SOURCE_OTHER: Style.DIM, + } + + BASIC_ANSI_CODES_UNDO = { + BasicFormat.NONE: "", + BasicFormat.SOURCE_FILENAME: Style.NORMAL, + BasicFormat.SOURCE_FUNCTION: Style.NORMAL + STYLE_NO_UNDERLINE, + BasicFormat.SOURCE_OTHER: Style.NORMAL, + } + + ROTATION_ANSI_COLORS = [ + Fore.MAGENTA, + Fore.CYAN, + Fore.GREEN, + Fore.RED, + Fore.LIGHTYELLOW_EX, + Fore.LIGHTMAGENTA_EX, + Fore.LIGHTCYAN_EX, + Fore.LIGHTGREEN_EX, + Fore.LIGHTBLACK_EX, + ] + + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + if f == BasicFormat.NONE: + return chunk + undo_ansi_code = Fore.RESET + if isinstance(f, BasicFormat): + ansi_code = self.BASIC_ANSI_CODES[f] + undo_ansi_code = self.BASIC_ANSI_CODES_UNDO.get(f, undo_ansi_code) + elif isinstance(f, RotationFormat): + ansi_code = self.ROTATION_ANSI_COLORS[ + f.index % len(self.ROTATION_ANSI_COLORS) + ] + else: + static_assert_unreachable(f) + return f"{ansi_code}{chunk}{undo_ansi_code}" + + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + rows = [(meta.headers, False)] + [ + (self.outputline_texts(line), line[1].is_data_ref) for line in lines + ] + return "\n".join( + "".join( + (self.STYLE_INVERT if is_data_ref else "") + + self.apply(x.ljust(self.column_width)) + for x in row + ) + for (row, is_data_ref) in rows + ) + + +@dataclass +class HtmlFormatter(Formatter): + rotation_formats: int = 9 + + def apply_format(self, chunk: str, f: Format) -> str: + chunk = html.escape(chunk) + if f == BasicFormat.NONE: + return chunk + if isinstance(f, BasicFormat): + class_name = f.name.lower().replace("_", "-") + data_attr = "" + elif isinstance(f, RotationFormat): + class_name = f"rotation-{f.index % self.rotation_formats}" + rotation_key = html.escape(f"{f.group};{f.key}", quote=True) + data_attr = f'data-rotation="{rotation_key}"' + else: + static_assert_unreachable(f) + return f"{chunk}" + + def table(self, meta: TableMetadata, lines: List[Tuple["OutputLine", ...]]) -> str: + def table_row(line: Tuple[Text, ...], is_data_ref: bool, cell_el: str) -> str: + tr_attrs = " class='data-ref'" if is_data_ref else "" + output_row = f" " + for cell in line: + cell_html = self.apply(cell) + output_row += f"<{cell_el}>{cell_html}" + output_row += "\n" + return output_row + + output = "\n" + output += " \n" + output += table_row(meta.headers, False, "th") + output += " \n" + output += " \n" + output += "".join( + table_row(self.outputline_texts(line), line[1].is_data_ref, "td") + for line in lines + ) + output += " \n" + output += "
\n" + return output + + +@dataclass +class JsonFormatter(Formatter): + arch_str: str + + def apply_format(self, chunk: str, f: Format) -> str: + # This method is unused by this formatter + return NotImplemented + + def table(self, meta: TableMetadata, rows: List[Tuple["OutputLine", ...]]) -> str: + def serialize_format(s: str, f: Format) -> Dict[str, Any]: + if f == BasicFormat.NONE: + return {"text": s} + elif isinstance(f, BasicFormat): + return {"text": s, "format": f.name.lower()} + elif isinstance(f, RotationFormat): + attrs = asdict(f) + attrs.update( + { + "text": s, + "format": "rotation", + } + ) + return attrs + else: + static_assert_unreachable(f) + + def serialize(text: Optional[Text]) -> List[Dict[str, Any]]: + if text is None: + return [] + return [serialize_format(s, f) for s, f in text.segments] + + is_threeway = len(meta.headers) == 3 + + output: Dict[str, Any] = {} + output["arch_str"] = self.arch_str + output["header"] = { + name: serialize(h) + for h, name in zip(meta.headers, ("base", "current", "previous")) + } + output["current_score"] = meta.current_score + output["max_score"] = meta.max_score + if meta.previous_score is not None: + output["previous_score"] = meta.previous_score + output_rows: List[Dict[str, Any]] = [] + for row in rows: + output_row: Dict[str, Any] = {} + output_row["key"] = row[0].key2 + output_row["is_data_ref"] = row[1].is_data_ref + iters = [ + ("base", row[0].base, row[0].line1), + ("current", row[1].fmt2, row[1].line2), + ] + if is_threeway: + iters.append(("previous", row[2].fmt2, row[2].line2)) + if all(line is None for _, _, line in iters): + # Skip rows that were only for displaying source code + continue + for column_name, text, line in iters: + column: Dict[str, Any] = {} + column["text"] = serialize(text) + if line: + if line.line_num is not None: + column["line"] = line.line_num + if line.branch_target is not None: + column["branch"] = line.branch_target + if line.source_lines: + column["src"] = line.source_lines + if line.comment is not None: + column["src_comment"] = line.comment + if line.source_line_num is not None: + column["src_line"] = line.source_line_num + if line or column["text"]: + output_row[column_name] = column + output_rows.append(output_row) + output["rows"] = output_rows + return json.dumps(output) + + +def format_fields( + pat: Pattern[str], + out1: Text, + out2: Text, + color1: FormatFunction, + color2: Optional[FormatFunction] = None, +) -> Tuple[Text, Text]: + diffs = [ + of.group() != nf.group() + for (of, nf) in zip(out1.finditer(pat), out2.finditer(pat)) + ] + + it = iter(diffs) + + def maybe_color(color: FormatFunction, s: str) -> Text: + return Text(s, color(s)) if next(it, False) else Text(s) + + out1 = out1.sub(pat, lambda m: maybe_color(color1, m.group())) + it = iter(diffs) + out2 = out2.sub(pat, lambda m: maybe_color(color2 or color1, m.group())) + + return out1, out2 + + +def symbol_formatter(group: str, base_index: int) -> FormatFunction: + symbol_formats: Dict[str, Format] = {} + + def symbol_format(s: str) -> Format: + # TODO: it would be nice to use a unique Format for each symbol, so we could + # add extra UI elements in the HTML version + f = symbol_formats.get(s) + if f is None: + index = len(symbol_formats) + base_index + f = RotationFormat(key=s, index=index, group=group) + symbol_formats[s] = f + return f + + return symbol_format + + +# ==== LOGIC ==== + +ObjdumpCommand = Tuple[List[str], str, Optional[str]] + + +def maybe_eval_int(expr: str) -> Optional[int]: + try: + ret = ast.literal_eval(expr) + if not isinstance(ret, int): + raise Exception("not an integer") + return ret + except Exception: + return None + + +def eval_int(expr: str, emsg: str) -> int: + ret = maybe_eval_int(expr) + if ret is None: + fail(emsg) + return ret + + +def eval_line_num(expr: str) -> Optional[int]: + expr = expr.strip().replace(":", "") + if expr == "": + return None + return int(expr, 16) + + +def run_make(target: str, project: ProjectSettings) -> None: + subprocess.check_call(project.build_command + [target]) + + +def run_make_capture_output( + target: str, project: ProjectSettings +) -> "subprocess.CompletedProcess[bytes]": + return subprocess.run( + project.build_command + [target], + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + ) + + +def restrict_to_function(dump: str, fn_name: str) -> str: + try: + ind = dump.index("\n", dump.index(f"<{fn_name}>:")) + return dump[ind + 1 :] + except ValueError: + return "" + + +def serialize_data_references(references: List[Tuple[int, int, str]]) -> str: + return "".join( + f"DATAREF {text_offset} {from_offset} {from_section}\n" + for (text_offset, from_offset, from_section) in references + ) + + +def maybe_get_objdump_source_flags(config: Config) -> List[str]: + flags = [] + + if config.show_line_numbers or config.show_source: + flags.append("--line-numbers") + + if config.show_source: + flags.append("--source") + + if not config.source_old_binutils: + flags.append("--source-comment=│ ") + + if config.inlines: + flags.append("--inlines") + + return flags + + +def run_objdump(cmd: ObjdumpCommand, config: Config, project: ProjectSettings) -> str: + flags, target, restrict = cmd + try: + out = subprocess.run( + [project.objdump_executable] + config.arch.arch_flags + flags + [target], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + ).stdout + except subprocess.CalledProcessError as e: + print(e.stdout) + print(e.stderr) + if "unrecognized option '--source-comment" in e.stderr: + fail("** Try using --source-old-binutils instead of --source **") + raise e + + obj_data: Optional[bytes] = None + if config.diff_obj: + with open(target, "rb") as f: + obj_data = f.read() + + return preprocess_objdump_out(restrict, obj_data, out, config) + + +def preprocess_objdump_out( + restrict: Optional[str], obj_data: Optional[bytes], objdump_out: str, config: Config +) -> str: + """ + Preprocess the output of objdump into a format that `process()` expects. + This format is suitable for saving to disk with `--write-asm`. + + - Optionally filter the output to a single function (`restrict`) + - Otherwise, strip objdump header (7 lines) + - Prepend .data references ("DATAREF" lines) when working with object files + """ + out = objdump_out + + if restrict is not None: + out = restrict_to_function(out, restrict) + else: + for i in range(7): + out = out[out.find("\n") + 1 :] + out = out.rstrip("\n") + + if obj_data: + out = serialize_data_references(parse_elf_data_references(obj_data, config)) + out + + return out + + +def search_map_file( + fn_name: str, project: ProjectSettings, config: Config +) -> Tuple[Optional[str], Optional[int]]: + if not project.mapfile: + fail(f"No map file configured; cannot find function {fn_name}.") + + try: + with open(project.mapfile) as f: + contents = f.read() + except Exception: + fail(f"Failed to open map file {project.mapfile} for reading.") + + if project.map_format == "gnu": + lines = contents.split("\n") + + try: + cur_objfile = None + ram_to_rom = None + cands = [] + last_line = "" + for line in lines: + if line.startswith(" " + config.diff_section): + cur_objfile = line.split()[3] + if "load address" in line: + tokens = last_line.split() + line.split() + ram = int(tokens[1], 0) + rom = int(tokens[5], 0) + ram_to_rom = rom - ram + if line.endswith(" " + fn_name): + ram = int(line.split()[0], 0) + if cur_objfile is not None and ram_to_rom is not None: + cands.append((cur_objfile, ram + ram_to_rom)) + last_line = line + except Exception as e: + traceback.print_exc() + fail(f"Internal error while parsing map file") + + if len(cands) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(cands) == 1: + return cands[0] + elif project.map_format == "mw": + section_pattern = re.escape(config.diff_section) + find = re.findall( + re.compile( + # ram elf rom + r" \S+ \S+ (\S+) (\S+) . " + + fn_name + # object name + + r"(?: \(entry of " + section_pattern + r"\))? \t(\S+)" + ), + contents, + ) + if len(find) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(find) == 1: + rom = int(find[0][1], 16) + objname = find[0][2] + # The metrowerks linker map format does not contain the full object path, + # so we must complete it manually. + objfiles = [ + os.path.join(dirpath, f) + for dirpath, _, filenames in os.walk(project.mw_build_dir) + for f in filenames + if f == objname + ] + if len(objfiles) > 1: + all_objects = "\n".join(objfiles) + fail( + f"Found multiple objects of the same name {objname} in {project.mw_build_dir}, " + f"cannot determine which to diff against: \n{all_objects}" + ) + if len(objfiles) == 1: + objfile = objfiles[0] + # TODO Currently the ram-rom conversion only works for diffing ELF + # executables, but it would likely be more convenient to diff DOLs. + # At this time it is recommended to always use -o when running the diff + # script as this mode does not make use of the ram-rom conversion. + return objfile, rom + else: + fail(f"Linker map format {project.map_format} unrecognised.") + return None, None + + +def parse_elf_data_references(data: bytes, config: Config) -> List[Tuple[int, int, str]]: + e_ident = data[:16] + if e_ident[:4] != b"\x7FELF": + return [] + + SHT_SYMTAB = 2 + SHT_REL = 9 + SHT_RELA = 4 + + is_32bit = e_ident[4] == 1 + is_little_endian = e_ident[5] == 1 + str_end = "<" if is_little_endian else ">" + str_off = "I" if is_32bit else "Q" + sym_size = {"B": 1, "H": 2, "I": 4, "Q": 8} + + def read(spec: str, offset: int) -> Tuple[int, ...]: + spec = spec.replace("P", str_off) + size = struct.calcsize(spec) + return struct.unpack(str_end + spec, data[offset : offset + size]) + + ( + e_type, + e_machine, + e_version, + e_entry, + e_phoff, + e_shoff, + e_flags, + e_ehsize, + e_phentsize, + e_phnum, + e_shentsize, + e_shnum, + e_shstrndx, + ) = read("HHIPPPIHHHHHH", 16) + if e_type != 1: # relocatable + return [] + assert e_shoff != 0 + assert e_shnum != 0 # don't support > 0xFF00 sections + assert e_shstrndx != 0 + + @dataclass + class Section: + sh_name: int + sh_type: int + sh_flags: int + sh_addr: int + sh_offset: int + sh_size: int + sh_link: int + sh_info: int + sh_addralign: int + sh_entsize: int + + sections = [ + Section(*read("IIPPPPIIPP", e_shoff + i * e_shentsize)) for i in range(e_shnum) + ] + shstr = sections[e_shstrndx] + sec_name_offs = [shstr.sh_offset + s.sh_name for s in sections] + sec_names = [data[offset : data.index(b"\0", offset)] for offset in sec_name_offs] + + symtab_sections = [i for i in range(e_shnum) if sections[i].sh_type == SHT_SYMTAB] + assert len(symtab_sections) == 1 + symtab = sections[symtab_sections[0]] + + section_name = config.diff_section.encode("utf-8") + text_sections = [i for i in range(e_shnum) if sec_names[i] == section_name and sections[i].sh_size != 0] + if len(text_sections) != 1: + return [] + text_section = text_sections[0] + + ret: List[Tuple[int, int, str]] = [] + for s in sections: + if s.sh_type == SHT_REL or s.sh_type == SHT_RELA: + if s.sh_info == text_section: + # Skip section_name -> section_name references + continue + sec_name = sec_names[s.sh_info].decode("latin1") + if sec_name == ".mwcats.text": + # Skip Metrowerks CATS Utility section + continue + sec_base = sections[s.sh_info].sh_offset + for i in range(0, s.sh_size, s.sh_entsize): + if s.sh_type == SHT_REL: + r_offset, r_info = read("PP", s.sh_offset + i) + else: + r_offset, r_info, r_addend = read("PPP", s.sh_offset + i) + + if is_32bit: + r_sym = r_info >> 8 + r_type = r_info & 0xFF + sym_offset = symtab.sh_offset + symtab.sh_entsize * r_sym + st_name, st_value, st_size, st_info, st_other, st_shndx = read( + "IIIBBH", sym_offset + ) + else: + r_sym = r_info >> 32 + r_type = r_info & 0xFFFFFFFF + sym_offset = symtab.sh_offset + symtab.sh_entsize * r_sym + st_name, st_info, st_other, st_shndx, st_value, st_size = read( + "IBBHQQ", sym_offset + ) + if st_shndx == text_section: + if s.sh_type == SHT_REL: + if e_machine == 8 and r_type == 2: # R_MIPS_32 + (r_addend,) = read("I", sec_base + r_offset) + else: + continue + text_offset = (st_value + r_addend) & 0xFFFFFFFF + ret.append((text_offset, r_offset, sec_name)) + return ret + + +def dump_elf( + start: str, + end: Optional[str], + diff_elf_symbol: str, + config: Config, + project: ProjectSettings, +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if not project.baseimg or not project.myimg: + fail("Missing myimg/baseimg in config.") + if config.base_shift: + fail("--base-shift not compatible with -e") + + start_addr = eval_int(start, "Start address must be an integer expression.") + + if end is not None: + end_addr = eval_int(end, "End address must be an integer expression.") + else: + end_addr = start_addr + config.max_function_size_bytes + + flags1 = [ + f"--start-address={start_addr}", + f"--stop-address={end_addr}", + ] + + if project.disassemble_all: + disassemble_flag = "-D" + else: + disassemble_flag = "-d" + + flags2 = [ + f"--disassemble={diff_elf_symbol}", + ] + + objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] + return ( + project.myimg, + (objdump_flags + flags1, project.baseimg, None), + ( + objdump_flags + flags2 + maybe_get_objdump_source_flags(config), + project.myimg, + None, + ), + ) + + +def dump_objfile( + start: str, end: Optional[str], config: Config, project: ProjectSettings +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if config.base_shift: + fail("--base-shift not compatible with -o") + if end is not None: + fail("end address not supported together with -o") + if start.startswith("0"): + fail("numerical start address not supported with -o; pass a function name") + + objfile, _ = search_map_file(start, project, config) + if not objfile: + fail("Not able to find .o file for function.") + + if config.make: + run_make(objfile, project) + + if not os.path.isfile(objfile): + fail(f"Not able to find .o file for function: {objfile} is not a file.") + + refobjfile = "expected/" + objfile + if not os.path.isfile(refobjfile): + fail(f'Please ensure an OK .o file exists at "{refobjfile}".') + + if project.disassemble_all: + disassemble_flag = "-D" + else: + disassemble_flag = "-d" + + objdump_flags = [disassemble_flag, "-rz", "-j", config.diff_section] + return ( + objfile, + (objdump_flags, refobjfile, start), + (objdump_flags + maybe_get_objdump_source_flags(config), objfile, start), + ) + + +def dump_binary( + start: str, end: Optional[str], config: Config, project: ProjectSettings +) -> Tuple[str, ObjdumpCommand, ObjdumpCommand]: + if not project.baseimg or not project.myimg: + fail("Missing myimg/baseimg in config.") + if config.make: + run_make(project.myimg, project) + start_addr = maybe_eval_int(start) + if start_addr is None: + _, start_addr = search_map_file(start, project, config) + if start_addr is None: + fail("Not able to find function in map file.") + if end is not None: + end_addr = eval_int(end, "End address must be an integer expression.") + else: + end_addr = start_addr + config.max_function_size_bytes + objdump_flags = ["-Dz", "-bbinary"] + ["-EB" if config.arch.big_endian else "-EL"] + flags1 = [ + f"--start-address={start_addr + config.base_shift}", + f"--stop-address={end_addr + config.base_shift}", + ] + flags2 = [f"--start-address={start_addr}", f"--stop-address={end_addr}"] + return ( + project.myimg, + (objdump_flags + flags1, project.baseimg, None), + (objdump_flags + flags2, project.myimg, None), + ) + +# Example: "ldr r4, [pc, #56] ; (4c )" +ARM32_LOAD_POOL_PATTERN = r"(ldr\s+r([0-9]|1[0-3]),\s+\[pc,.*;\s*)(\([a-fA-F0-9]+.*\))" + + +# The base class is a no-op. +class AsmProcessor: + def __init__(self, config: Config) -> None: + self.config = config + + def process_reloc(self, row: str, prev: str) -> str: + return prev + + def normalize(self, mnemonic: str, row: str) -> str: + """This should be called exactly once for each line.""" + arch = self.config.arch + row = self._normalize_arch_specific(mnemonic, row) + if self.config.ignore_large_imms and mnemonic not in arch.branch_instructions: + row = re.sub(self.config.arch.re_large_imm, "", row) + return row + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + return row + + def post_process(self, lines: List["Line"]) -> None: + return + + +class AsmProcessorMIPS(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> str: + arch = self.config.arch + if "R_MIPS_NONE" in row: + # GNU as emits no-op relocations immediately after real ones when + # assembling with -mabi=64. Return without trying to parse 'imm' as an + # integer. + return prev + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + if imm != "0": + # MIPS uses relocations with addends embedded in the code as immediates. + # If there is an immediate, show it as part of the relocation. Ideally + # we'd show this addend in both %lo/%hi, but annoyingly objdump's output + # doesn't include enough information to pair up %lo's and %hi's... + # TODO: handle unambiguous cases where all addends for a symbol are the + # same, or show "+???". + mnemonic = prev.split()[0] + if ( + mnemonic in arch.instructions_with_address_immediates + and not imm.startswith("0x") + ): + imm = "0x" + imm + repl += "+" + imm if int(imm, 0) > 0 else imm + if "R_MIPS_LO16" in row: + repl = f"%lo({repl})" + elif "R_MIPS_HI16" in row: + # Ideally we'd pair up R_MIPS_LO16 and R_MIPS_HI16 to generate a + # correct addend for each, but objdump doesn't give us the order of + # the relocations, so we can't find the right LO16. :( + repl = f"%hi({repl})" + elif "R_MIPS_26" in row: + # Function calls + pass + elif "R_MIPS_PC16" in row: + # Branch to glabel. This gives confusing output, but there's not much + # we can do here. + pass + elif "R_MIPS_GPREL16" in row: + repl = f"%gp_rel({repl})" + else: + assert False, f"unknown relocation type '{row}' for line '{prev}'" + return before + repl + after + + +class AsmProcessorPPC(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> str: + arch = self.config.arch + assert any( + r in row for r in ["R_PPC_REL24", "R_PPC_ADDR16", "R_PPC_EMB_SDA21"] + ), f"unknown relocation type '{row}' for line '{prev}'" + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + if "R_PPC_REL24" in row: + # function calls + pass + elif "R_PPC_ADDR16_HI" in row: + # absolute hi of addr + repl = f"{repl}@h" + elif "R_PPC_ADDR16_HA" in row: + # adjusted hi of addr + repl = f"{repl}@ha" + elif "R_PPC_ADDR16_LO" in row: + # lo of addr + repl = f"{repl}@l" + elif "R_PPC_ADDR16" in row: + # 16-bit absolute addr + if "+0x7" in repl: + # remove the very large addends as they are an artifact of (label-_SDA(2)_BASE_) + # computations and are unimportant in a diff setting. + if int(repl.split("+")[1], 16) > 0x70000000: + repl = repl.split("+")[0] + elif "R_PPC_EMB_SDA21" in row: + # small data area + pass + return before + repl + after + + +class AsmProcessorARM32(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> str: + arch = self.config.arch + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + return before + repl + after + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + if self.config.ignore_addr_diffs: + row = self._normalize_bl(mnemonic, row) + row = self._normalize_data_pool(row) + return row + + def _normalize_bl(self, mnemonic: str, row: str) -> str: + if mnemonic != "bl": + return row + + row, _ = split_off_address(row) + return row + "" + + def _normalize_data_pool(self, row: str) -> str: + pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) + return pool_match.group(1) if pool_match else row + + def post_process(self, lines: List["Line"]) -> None: + lines_by_line_number = {} + for line in lines: + lines_by_line_number[line.line_num] = line + for line in lines: + if line.data_pool_addr is None: + continue + + # Add data symbol and its address to the line. + line_original = lines_by_line_number[line.data_pool_addr].original + value = line_original.split()[1] + addr = "{:x}".format(line.data_pool_addr) + line.original = line.normalized_original + f"={value} ({addr})" + + +class AsmProcessorAArch64(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + self._adrp_pair_registers: Set[str] = set() + + def _normalize_arch_specific(self, mnemonic: str, row: str) -> str: + if self.config.ignore_addr_diffs: + row = self._normalize_adrp_differences(mnemonic, row) + row = self._normalize_bl(mnemonic, row) + return row + + def _normalize_bl(self, mnemonic: str, row: str) -> str: + if mnemonic != "bl": + return row + + row, _ = split_off_address(row) + return row + "" + + def _normalize_adrp_differences(self, mnemonic: str, row: str) -> str: + """Identifies ADRP + LDR/ADD pairs that are used to access the GOT and + suppresses any immediate differences. + + Whenever an ADRP is seen, the destination register is added to the set of registers + that are part of an ADRP + LDR/ADD pair. Registers are removed from the set as soon + as they are used for an LDR or ADD instruction which completes the pair. + + This method is somewhat crude but should manage to detect most such pairs. + """ + row_parts = row.split("\t", 1) + if mnemonic == "adrp": + self._adrp_pair_registers.add(row_parts[1].strip().split(",")[0]) + row, _ = split_off_address(row) + return row + "" + elif mnemonic == "ldr": + for reg in self._adrp_pair_registers: + # ldr xxx, [reg] + # ldr xxx, [reg, ] + if f", [{reg}" in row_parts[1]: + self._adrp_pair_registers.remove(reg) + return normalize_imms(row, AARCH64_SETTINGS) + elif mnemonic == "add": + for reg in self._adrp_pair_registers: + # add reg, reg, + if row_parts[1].startswith(f"{reg}, {reg}, "): + self._adrp_pair_registers.remove(reg) + return normalize_imms(row, AARCH64_SETTINGS) + + return row + + +@dataclass +class ArchSettings: + name: str + re_int: Pattern[str] + re_comment: Pattern[str] + re_reg: Pattern[str] + re_sprel: Pattern[str] + re_large_imm: Pattern[str] + re_imm: Pattern[str] + re_reloc: Pattern[str] + branch_instructions: Set[str] + instructions_with_address_immediates: Set[str] + forbidden: Set[str] = field(default_factory=lambda: set(string.ascii_letters + "_")) + arch_flags: List[str] = field(default_factory=list) + branch_likely_instructions: Set[str] = field(default_factory=set) + proc: Type[AsmProcessor] = AsmProcessor + big_endian: Optional[bool] = True + delay_slot_instructions: Set[str] = field(default_factory=set) + +MIPS_BRANCH_LIKELY_INSTRUCTIONS = { + "beql", + "bnel", + "beqzl", + "bnezl", + "bgezl", + "bgtzl", + "blezl", + "bltzl", + "bc1tl", + "bc1fl", +} +MIPS_BRANCH_INSTRUCTIONS = MIPS_BRANCH_LIKELY_INSTRUCTIONS.union( + { + "b", + "beq", + "bne", + "beqz", + "bnez", + "bgez", + "bgtz", + "blez", + "bltz", + "bc1t", + "bc1f", + } +) + +ARM32_PREFIXES = {"b", "bl"} +ARM32_CONDS = { + "", + "eq", + "ne", + "cs", + "cc", + "mi", + "pl", + "vs", + "vc", + "hi", + "ls", + "ge", + "lt", + "gt", + "le", + "al", +} +ARM32_SUFFIXES = {"", ".n", ".w"} +ARM32_BRANCH_INSTRUCTIONS = { + f"{prefix}{cond}{suffix}" + for prefix in ARM32_PREFIXES + for cond in ARM32_CONDS + for suffix in ARM32_SUFFIXES +} + +AARCH64_BRANCH_INSTRUCTIONS = { + "b", + "b.eq", + "b.ne", + "b.cs", + "b.hs", + "b.cc", + "b.lo", + "b.mi", + "b.pl", + "b.vs", + "b.vc", + "b.hi", + "b.ls", + "b.ge", + "b.lt", + "b.gt", + "b.le", + "cbz", + "cbnz", + "tbz", + "tbnz", +} + +PPC_BRANCH_INSTRUCTIONS = { + "b", + "beq", + "beq+", + "beq-", + "bne", + "bne+", + "bne-", + "blt", + "blt+", + "blt-", + "ble", + "ble+", + "ble-", + "bdnz", + "bdnz+", + "bdnz-", + "bge", + "bge+", + "bge-", + "bgt", + "bgt+", + "bgt-", +} + +MIPS_SETTINGS = ArchSettings( + name="mips", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"<.*?>"), + re_reg=re.compile( + r"\$?\b(a[0-7]|t[0-9]|s[0-8]|at|v[01]|f[12]?[0-9]|f3[01]|kt?[01]|fp|ra|zero)\b" + ), + re_sprel=re.compile(r"(?<=,)([0-9]+|0x[0-9a-f]+)\(sp\)"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(\b|-)([0-9]+|0x[0-9a-fA-F]+)\b(?!\(sp)|%(lo|hi)\([^)]*\)"), + re_reloc=re.compile(r"R_MIPS_"), + arch_flags=["-m", "mips:4300"], + branch_likely_instructions=MIPS_BRANCH_LIKELY_INSTRUCTIONS, + branch_instructions=MIPS_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=MIPS_BRANCH_INSTRUCTIONS.union({"jal", "j"}), + delay_slot_instructions=MIPS_BRANCH_INSTRUCTIONS.union({"j", "jal", "jr", "jalr"}), + proc=AsmProcessorMIPS, +) + +MIPSEL_SETTINGS = replace(MIPS_SETTINGS, name="mipsel", big_endian=False) + +ARM32_SETTINGS = ArchSettings( + name="arm32", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"(<.*?>|//.*$)"), + # Includes: + # - General purpose registers: r0..13 + # - Frame pointer registers: lr (r14), pc (r15) + # - VFP/NEON registers: s0..31, d0..31, q0..15, fpscr, fpexc, fpsid + # SP should not be in this list. + re_reg=re.compile( + r"\$?\b([rq][0-9]|[rq]1[0-5]|pc|lr|[ds][12]?[0-9]|[ds]3[01]|fp(scr|exc|sid))\b" + ), + re_sprel=re.compile(r"sp, #-?(0x[0-9a-fA-F]+|[0-9]+)\b"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(?|//.*$)"), + # GPRs and FP registers: X0-X30, W0-W30, [BHSDVQ]0..31 + # (FP registers may be followed by data width and number of elements, e.g. V0.4S) + # The zero registers and SP should not be in this list. + re_reg=re.compile(r"\$?\b([bhsdvq]([12]?[0-9]|3[01])(\.\d\d?[bhsdvq])?|[xw][12]?[0-9]|[xw]30)\b"), + re_sprel=re.compile(r"sp, #-?(0x[0-9a-fA-F]+|[0-9]+)\b"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(?|//.*$)"), + re_reg=re.compile(r"\$?\b([rf][0-9]+)\b"), + re_sprel=re.compile(r"(?<=,)(-?[0-9]+|-?0x[0-9a-f]+)\(r1\)"), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"(\b|-)([0-9]+|0x[0-9a-fA-F]+)\b(?!\(r1)|[^@]*@(ha|h|lo)"), + re_reloc=re.compile(r"R_PPC_"), + branch_instructions=PPC_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=PPC_BRANCH_INSTRUCTIONS.union({"bl"}), + proc=AsmProcessorPPC, +) + +ARCH_SETTINGS = [ + MIPS_SETTINGS, + MIPSEL_SETTINGS, + ARM32_SETTINGS, + ARMEL_SETTINGS, + AARCH64_SETTINGS, + PPC_SETTINGS, +] + + +def hexify_int(row: str, pat: Match[str], arch: ArchSettings) -> str: + full = pat.group(0) + if len(full) <= 1: + # leave one-digit ints alone + return full + start, end = pat.span() + if start and row[start - 1] in arch.forbidden: + return full + if end < len(row) and row[end] in arch.forbidden: + return full + return hex(int(full)) + + +def parse_relocated_line(line: str) -> Tuple[str, str, str]: + for c in ",\t ": + if c in line: + ind2 = line.rindex(c) + break + else: + raise Exception(f"failed to parse relocated line: {line}") + before = line[: ind2 + 1] + after = line[ind2 + 1 :] + ind2 = after.find("(") + if ind2 == -1: + imm, after = after, "" + else: + imm, after = after[:ind2], after[ind2:] + if imm == "0x0": + imm = "0" + return before, imm, after + + +def pad_mnemonic(line: str) -> str: + if "\t" not in line: + return line + mn, args = line.split("\t", 1) + return f"{mn:<7s} {args}" + + +@dataclass +class Line: + mnemonic: str + diff_row: str + original: str + normalized_original: str + scorable_line: str + line_num: Optional[int] = None + branch_target: Optional[int] = None + data_pool_addr: Optional[int] = None + source_filename: Optional[str] = None + source_line_num: Optional[int] = None + source_lines: List[str] = field(default_factory=list) + comment: Optional[str] = None + + +def process(dump: str, config: Config) -> List[Line]: + arch = config.arch + processor = arch.proc(config) + skip_next = False + source_lines = [] + source_filename = None + source_line_num = None + + i = 0 + num_instr = 0 + data_refs: Dict[int, Dict[str, List[int]]] = defaultdict(lambda: defaultdict(list)) + output: List[Line] = [] + stop_after_delay_slot = False + lines = dump.split("\n") + while i < len(lines): + row = lines[i] + i += 1 + + if not row: + continue + + if re.match(r"^[0-9a-f]+ <.*>:$", row): + continue + + if row.startswith("DATAREF"): + parts = row.split(" ", 3) + text_offset = int(parts[1]) + from_offset = int(parts[2]) + from_section = parts[3] + data_refs[text_offset][from_section].append(from_offset) + continue + + if config.diff_obj and num_instr >= config.max_function_size_lines: + output.append( + Line( + mnemonic="...", + diff_row="...", + original="...", + normalized_original="...", + scorable_line="...", + ) + ) + break + + if not re.match(r"^\s+[0-9a-f]+:\s+", row): + # This regex is conservative, and assumes the file path does not contain "weird" + # characters like colons, tabs, or angle brackets. + if re.match( + r"^[^ \t<>:][^\t<>:]*:[0-9]+( \(discriminator [0-9]+\))?$", row + ): + source_filename, _, tail = row.rpartition(":") + source_line_num = int(tail.partition(" ")[0]) + source_lines.append(row) + continue + + # If the instructions loads a data pool symbol, extract the address of + # the symbol. + data_pool_addr = None + pool_match = re.search(ARM32_LOAD_POOL_PATTERN, row) + if pool_match: + offset = pool_match.group(3).split(" ")[0][1:] + data_pool_addr = int(offset, 16) + + m_comment = re.search(arch.re_comment, row) + comment = m_comment[0] if m_comment else None + row = re.sub(arch.re_comment, "", row) + line_num_str = row.split(":")[0] + row = row.rstrip() + tabs = row.split("\t") + row = "\t".join(tabs[2:]) + line_num = eval_line_num(line_num_str.strip()) + + if line_num in data_refs: + refs = data_refs[line_num] + ref_str = "; ".join( + section_name + "+" + ",".join(hex(off) for off in offs) + for section_name, offs in refs.items() + ) + output.append( + Line( + mnemonic="", + diff_row="", + original=ref_str, + normalized_original=ref_str, + scorable_line="", + ) + ) + + if "\t" in row: + row_parts = row.split("\t", 1) + else: + # powerpc-eabi-objdump doesn't use tabs + row_parts = [part.lstrip() for part in row.split(" ", 1)] + mnemonic = row_parts[0].strip() + + if mnemonic not in arch.instructions_with_address_immediates: + row = re.sub(arch.re_int, lambda m: hexify_int(row, m, arch), row) + + # Let 'original' be 'row' with relocations applied, while we continue + # transforming 'row' into a coarser version that ignores registers and + # immediates. + original = row + + while i < len(lines): + reloc_row = lines[i] + if re.search(arch.re_reloc, reloc_row): + original = processor.process_reloc(reloc_row, original) + else: + break + i += 1 + + normalized_original = processor.normalize(mnemonic, original) + + scorable_line = normalized_original + if not config.score_stack_differences: + scorable_line = re.sub(arch.re_sprel, "addr(sp)", scorable_line) + if mnemonic in arch.branch_instructions: + # Replace the final argument with "" + scorable_line = re.sub(r"[^, \t]+$", "", scorable_line) + + if skip_next: + skip_next = False + row = "" + mnemonic = "" + scorable_line = "" + if mnemonic in arch.branch_likely_instructions: + skip_next = True + + row = re.sub(arch.re_reg, "", row) + row = re.sub(arch.re_sprel, "addr(sp)", row) + row_with_imm = row + if mnemonic in arch.instructions_with_address_immediates: + row = row.strip() + row, _ = split_off_address(row) + row += "" + else: + row = normalize_imms(row, arch) + + branch_target = None + if mnemonic in arch.branch_instructions: + branch_target = int(row_parts[1].strip().split(",")[-1], 16) + if mnemonic in arch.branch_likely_instructions: + branch_target -= 4 + + output.append( + Line( + mnemonic=mnemonic, + diff_row=row, + original=original, + normalized_original=normalized_original, + scorable_line=scorable_line, + line_num=line_num, + branch_target=branch_target, + data_pool_addr=data_pool_addr, + source_filename=source_filename, + source_line_num=source_line_num, + source_lines=source_lines, + comment=comment, + ) + ) + num_instr += 1 + source_lines = [] + + if config.stop_jrra and mnemonic == "jr" and row_parts[1].strip() == "ra": + stop_after_delay_slot = True + elif stop_after_delay_slot: + break + + processor.post_process(output) + return output + + +def normalize_imms(row: str, arch: ArchSettings) -> str: + return re.sub(arch.re_imm, "", row) + + +def normalize_stack(row: str, arch: ArchSettings) -> str: + return re.sub(arch.re_sprel, "addr(sp)", row) + + +def imm_matches_everything(row: str, arch: ArchSettings) -> bool: + # (this should probably be arch-specific) + return "(." in row + + +def split_off_address(line: str) -> Tuple[str, str]: + """Split e.g. 'beqz $r0,1f0' into 'beqz $r0,' and '1f0'.""" + parts = line.split(",") + if len(parts) < 2: + parts = line.split(None, 1) + off = len(line) - len(parts[-1]) + return line[:off], line[off:] + + +def diff_sequences_difflib( + seq1: List[str], seq2: List[str] +) -> List[Tuple[str, int, int, int, int]]: + differ = difflib.SequenceMatcher(a=seq1, b=seq2, autojunk=False) + return differ.get_opcodes() + + +def diff_sequences( + seq1: List[str], seq2: List[str], algorithm: str +) -> List[Tuple[str, int, int, int, int]]: + if ( + algorithm != "levenshtein" + or len(seq1) * len(seq2) > 4 * 10 ** 8 + or len(seq1) + len(seq2) >= 0x110000 + ): + return diff_sequences_difflib(seq1, seq2) + + # The Levenshtein library assumes that we compare strings, not lists. Convert. + # (Per the check above we know we have fewer than 0x110000 unique elements, so chr() works.) + remapping: Dict[str, str] = {} + + def remap(seq: List[str]) -> str: + seq = seq[:] + for i in range(len(seq)): + val = remapping.get(seq[i]) + if val is None: + val = chr(len(remapping)) + remapping[seq[i]] = val + seq[i] = val + return "".join(seq) + + rem1 = remap(seq1) + rem2 = remap(seq2) + import Levenshtein + + ret: List[Tuple[str, int, int, int, int]] = Levenshtein.opcodes(rem1, rem2) + return ret + + +def diff_lines( + lines1: List[Line], + lines2: List[Line], + algorithm: str, +) -> List[Tuple[Optional[Line], Optional[Line]]]: + ret = [] + for (tag, i1, i2, j1, j2) in diff_sequences( + [line.mnemonic for line in lines1], + [line.mnemonic for line in lines2], + algorithm, + ): + for line1, line2 in itertools.zip_longest(lines1[i1:i2], lines2[j1:j2]): + if tag == "replace": + if line1 is None: + tag = "insert" + elif line2 is None: + tag = "delete" + elif tag == "insert": + assert line1 is None + elif tag == "delete": + assert line2 is None + ret.append((line1, line2)) + + return ret + + +def score_diff_lines( + lines: List[Tuple[Optional[Line], Optional[Line]]], config: Config +) -> int: + # This logic is copied from `scorer.py` from the decomp permuter project + # https://github.com/simonlindholm/decomp-permuter/blob/main/src/scorer.py + score = 0 + deletions = [] + insertions = [] + + def lo_hi_match(old: str, new: str) -> bool: + # TODO: Make this arch-independent, like `imm_matches_everything()` + old_lo = old.find("%lo") + old_hi = old.find("%hi") + new_lo = new.find("%lo") + new_hi = new.find("%hi") + + if old_lo != -1 and new_lo != -1: + old_idx = old_lo + new_idx = new_lo + elif old_hi != -1 and new_hi != -1: + old_idx = old_hi + new_idx = new_hi + else: + return False + + if old[:old_idx] != new[:new_idx]: + return False + + old_inner = old[old_idx + 4 : -1] + new_inner = new[new_idx + 4 : -1] + return old_inner.startswith(".") or new_inner.startswith(".") + + def diff_sameline(old: str, new: str) -> None: + nonlocal score + if old == new: + return + + if lo_hi_match(old, new): + return + + ignore_last_field = False + if config.score_stack_differences: + oldsp = re.search(config.arch.re_sprel, old) + newsp = re.search(config.arch.re_sprel, new) + if oldsp and newsp: + oldrel = int(oldsp.group(1) or "0", 0) + newrel = int(newsp.group(1) or "0", 0) + score += abs(oldrel - newrel) * config.penalty_stackdiff + ignore_last_field = True + + # Probably regalloc difference, or signed vs unsigned + + # Compare each field in order + newfields, oldfields = new.split(","), old.split(",") + if ignore_last_field: + newfields = newfields[:-1] + oldfields = oldfields[:-1] + for nf, of in zip(newfields, oldfields): + if nf != of: + score += config.penalty_regalloc + # Penalize any extra fields + score += abs(len(newfields) - len(oldfields)) * config.penalty_regalloc + + def diff_insert(line: str) -> None: + # Reordering or totally different codegen. + # Defer this until later when we can tell. + insertions.append(line) + + def diff_delete(line: str) -> None: + deletions.append(line) + + # Find the end of the last long streak of matching mnemonics, if it looks + # like the objdump output was truncated. This is used to skip scoring + # misaligned lines at the end of the diff. + last_mismatch = -1 + max_index = None + lines_were_truncated = False + for index, (line1, line2) in enumerate(lines): + if (line1 and line1.original == "...") or (line2 and line2.original == "..."): + lines_were_truncated = True + if line1 and line2 and line1.mnemonic == line2.mnemonic: + if index - last_mismatch >= 50: + max_index = index + else: + last_mismatch = index + if not lines_were_truncated: + max_index = None + + for index, (line1, line2) in enumerate(lines): + if max_index is not None and index > max_index: + break + if line1 and line2 and line1.mnemonic == line2.mnemonic: + diff_sameline(line1.scorable_line, line2.scorable_line) + else: + if line1: + diff_delete(line1.scorable_line) + if line2: + diff_insert(line2.scorable_line) + + insertions_co = Counter(insertions) + deletions_co = Counter(deletions) + for item in insertions_co + deletions_co: + ins = insertions_co[item] + dels = deletions_co[item] + common = min(ins, dels) + score += ( + (ins - common) * config.penalty_insertion + + (dels - common) * config.penalty_deletion + + config.penalty_reordering * common + ) + + return score + + +@dataclass(frozen=True) +class OutputLine: + base: Optional[Text] = field(compare=False) + fmt2: Text = field(compare=False) + key2: Optional[str] + boring: bool = field(compare=False) + is_data_ref: bool = field(compare=False) + line1: Optional[Line] = field(compare=False) + line2: Optional[Line] = field(compare=False) + + +@dataclass(frozen=True) +class Diff: + lines: List[OutputLine] + score: int + max_score: int + + +def trim_nops(lines: List[Line], arch: ArchSettings) -> List[Line]: + lines = lines[:] + while lines and lines[-1].mnemonic == "nop" and (len(lines) == 1 or lines[-2].mnemonic not in arch.delay_slot_instructions): + lines.pop() + return lines + +def do_diff(lines1: List[Line], lines2: List[Line], config: Config) -> Diff: + if config.show_source: + import cxxfilt + arch = config.arch + fmt = config.formatter + output: List[OutputLine] = [] + + sc1 = symbol_formatter("base-reg", 0) + sc2 = symbol_formatter("my-reg", 0) + sc3 = symbol_formatter("base-stack", 4) + sc4 = symbol_formatter("my-stack", 4) + sc5 = symbol_formatter("base-branch", 0) + sc6 = symbol_formatter("my-branch", 0) + bts1: Set[int] = set() + bts2: Set[int] = set() + + if config.show_branches: + for (lines, btset, sc) in [ + (lines1, bts1, sc5), + (lines2, bts2, sc6), + ]: + for line in lines: + bt = line.branch_target + if bt is not None: + btset.add(bt) + sc(str(bt)) + + lines1 = trim_nops(lines1, arch) + lines2 = trim_nops(lines2, arch) + + diffed_lines = diff_lines(lines1, lines2, config.algorithm) + score = score_diff_lines(diffed_lines, config) + max_score = len(lines1) * config.penalty_deletion + + line_num_base = -1 + line_num_offset = 0 + line_num_2to1 = {} + for (line1, line2) in diffed_lines: + if line1 is not None and line1.line_num is not None: + line_num_base = line1.line_num + line_num_offset = 0 + else: + line_num_offset += 1 + if line2 is not None and line2.line_num is not None: + line_num_2to1[line2.line_num] = (line_num_base, line_num_offset) + + for (line1, line2) in diffed_lines: + line_color1 = line_color2 = sym_color = BasicFormat.NONE + line_prefix = " " + is_data_ref = False + out1 = Text() if not line1 else Text(pad_mnemonic(line1.original)) + out2 = Text() if not line2 else Text(pad_mnemonic(line2.original)) + if line1 and line2 and line1.diff_row == line2.diff_row: + if line1.diff_row == "": + if line1.normalized_original != line2.normalized_original: + line_prefix = "i" + sym_color = BasicFormat.DIFF_CHANGE + out1 = out1.reformat(sym_color) + out2 = out2.reformat(sym_color) + is_data_ref = True + elif ( + line1.normalized_original == line2.normalized_original + and line2.branch_target is None + ): + # Fast path: no coloring needed. We don't include branch instructions + # in this case because we need to check that their targets line up in + # the diff, and don't just happen to have the are the same address + # by accident. + pass + elif line1.diff_row == "": + # Don't draw attention to differing branch-likely delay slots: they + # typically mirror the branch destination - 1 so the real difference + # is elsewhere. Still, do mark them as different to avoid confusion. + # No need to consider branches because delay slots can't branch. + out1 = out1.reformat(BasicFormat.DELAY_SLOT) + out2 = out2.reformat(BasicFormat.DELAY_SLOT) + else: + mnemonic = line1.original.split()[0] + branchless1, address1 = out1.plain(), "" + branchless2, address2 = out2.plain(), "" + if mnemonic in arch.instructions_with_address_immediates: + branchless1, address1 = split_off_address(branchless1) + branchless2, address2 = split_off_address(branchless2) + + out1 = Text(branchless1) + out2 = Text(branchless2) + out1, out2 = format_fields( + arch.re_imm, out1, out2, lambda _: BasicFormat.IMMEDIATE + ) + + if line2.branch_target is not None: + target = line2.branch_target + line2_target = line_num_2to1.get(line2.branch_target) + if line2_target is None: + # If the target is outside the disassembly, extrapolate. + # This only matters near the bottom. + assert line2.line_num is not None + line2_line = line_num_2to1[line2.line_num] + line2_target = (line2_line[0] + (target - line2.line_num), 0) + + # Set the key for three-way diffing to a normalized version. + norm2, norm_branch2 = split_off_address(line2.normalized_original) + if norm_branch2 != "": + line2.normalized_original = norm2 + str(line2_target) + same_target = line2_target == (line1.branch_target, 0) + else: + # Do a naive comparison for non-branches (e.g. function calls). + same_target = address1 == address2 + + if normalize_imms(branchless1, arch) == normalize_imms( + branchless2, arch + ): + if imm_matches_everything(branchless2, arch): + # ignore differences due to %lo(.rodata + ...) vs symbol + out1 = out1.reformat(BasicFormat.NONE) + out2 = out2.reformat(BasicFormat.NONE) + elif line2.branch_target is not None and same_target: + # same-target branch, don't color + pass + else: + # must have an imm difference (or else we would have hit the + # fast path) + sym_color = BasicFormat.IMMEDIATE + line_prefix = "i" + else: + out1, out2 = format_fields(arch.re_sprel, out1, out2, sc3, sc4) + if normalize_stack(branchless1, arch) == normalize_stack( + branchless2, arch + ): + # only stack differences (luckily stack and imm + # differences can't be combined in MIPS, so we + # don't have to think about that case) + sym_color = BasicFormat.STACK + line_prefix = "s" + else: + # reg differences and maybe imm as well + out1, out2 = format_fields(arch.re_reg, out1, out2, sc1, sc2) + line_color1 = line_color2 = sym_color = BasicFormat.REGISTER + line_prefix = "r" + + if same_target: + address_imm_fmt = BasicFormat.NONE + else: + address_imm_fmt = BasicFormat.IMMEDIATE + out1 += Text(address1, address_imm_fmt) + out2 += Text(address2, address_imm_fmt) + elif line1 and line2: + line_prefix = "|" + line_color1 = line_color2 = sym_color = BasicFormat.DIFF_CHANGE + out1 = out1.reformat(line_color1) + out2 = out2.reformat(line_color2) + elif line1: + line_prefix = "<" + line_color1 = sym_color = BasicFormat.DIFF_REMOVE + out1 = out1.reformat(line_color1) + out2 = Text() + elif line2: + line_prefix = ">" + line_color2 = sym_color = BasicFormat.DIFF_ADD + out1 = Text() + out2 = out2.reformat(line_color2) + + if config.show_source and line2 and line2.comment: + out2 += f" {line2.comment}" + + def format_part( + out: Text, + line: Optional[Line], + line_color: Format, + btset: Set[int], + sc: FormatFunction, + ) -> Optional[Text]: + if line is None: + return None + if line.line_num is None: + return out + in_arrow = Text(" ") + out_arrow = Text() + if config.show_branches: + if line.line_num in btset: + in_arrow = Text("~>", sc(str(line.line_num))) + if line.branch_target is not None: + out_arrow = " " + Text("~>", sc(str(line.branch_target))) + formatted_line_num = Text(hex(line.line_num)[2:] + ":", line_color) + return formatted_line_num + " " + in_arrow + " " + out + out_arrow + + part1 = format_part(out1, line1, line_color1, bts1, sc5) + part2 = format_part(out2, line2, line_color2, bts2, sc6) + + if config.show_source and line2: + for source_line in line2.source_lines: + line_format = BasicFormat.SOURCE_OTHER + if config.source_old_binutils: + if source_line and re.fullmatch(".*\.c(?:pp)?:\d+", source_line): + line_format = BasicFormat.SOURCE_FILENAME + elif source_line and source_line.endswith("():"): + line_format = BasicFormat.SOURCE_FUNCTION + try: + source_line = cxxfilt.demangle( + source_line[:-3], external_only=False + ) + except: + pass + else: + # File names and function names + if source_line and source_line[0] != "│": + line_format = BasicFormat.SOURCE_FILENAME + # Function names + if source_line.endswith("():"): + line_format = BasicFormat.SOURCE_FUNCTION + try: + source_line = cxxfilt.demangle( + source_line[:-3], external_only=False + ) + except: + pass + padding = " " * 7 if config.show_line_numbers else " " * 2 + output.append( + OutputLine( + base=None, + fmt2=padding + Text(source_line, line_format), + key2=source_line, + boring=True, + is_data_ref=False, + line1=None, + line2=None, + ) + ) + + key2 = line2.normalized_original if line2 else None + boring = False + if line_prefix == " ": + boring = True + elif config.compress and config.compress.same_instr and line_prefix in "irs": + boring = True + + if config.show_line_numbers: + if line2 and line2.source_line_num is not None: + num_color = ( + BasicFormat.SOURCE_LINE_NUM + if sym_color == BasicFormat.NONE + else sym_color + ) + num2 = Text(f"{line2.source_line_num:5}", num_color) + else: + num2 = Text(" " * 5) + else: + num2 = Text() + + fmt2 = Text(line_prefix, sym_color) + num2 + " " + (part2 or Text()) + + output.append( + OutputLine( + base=part1, + fmt2=fmt2, + key2=key2, + boring=boring, + is_data_ref=is_data_ref, + line1=line1, + line2=line2, + ) + ) + + output = output[config.skip_lines :] + return Diff(lines=output, score=score, max_score=max_score) + + +def chunk_diff_lines( + diff: List[OutputLine], +) -> List[Union[List[OutputLine], OutputLine]]: + """Chunk a diff into an alternating list like A B A B ... A, where: + * A is a List[OutputLine] of insertions, + * B is a single non-insertion OutputLine, with .base != None.""" + cur_right: List[OutputLine] = [] + chunks: List[Union[List[OutputLine], OutputLine]] = [] + for output_line in diff: + if output_line.base is not None: + chunks.append(cur_right) + chunks.append(output_line) + cur_right = [] + else: + cur_right.append(output_line) + chunks.append(cur_right) + return chunks + + +def compress_matching( + li: List[Tuple[OutputLine, ...]], context: int +) -> List[Tuple[OutputLine, ...]]: + ret: List[Tuple[OutputLine, ...]] = [] + matching_streak: List[Tuple[OutputLine, ...]] = [] + context = max(context, 0) + + def flush_matching() -> None: + if len(matching_streak) <= 2 * context + 1: + ret.extend(matching_streak) + else: + ret.extend(matching_streak[:context]) + skipped = len(matching_streak) - 2 * context + filler = OutputLine( + base=Text(f"<{skipped} lines>", BasicFormat.SOURCE_OTHER), + fmt2=Text(), + key2=None, + boring=False, + is_data_ref=False, + line1=None, + line2=None, + ) + columns = len(matching_streak[0]) + ret.append(tuple([filler] * columns)) + if context > 0: + ret.extend(matching_streak[-context:]) + matching_streak.clear() + + for line in li: + if line[0].boring: + matching_streak.append(line) + else: + flush_matching() + ret.append(line) + + flush_matching() + return ret + + +def align_diffs( + old_diff: Diff, new_diff: Diff, config: Config +) -> Tuple[TableMetadata, List[Tuple[OutputLine, ...]]]: + meta: TableMetadata + diff_lines: List[Tuple[OutputLine, ...]] + padding = " " * 7 if config.show_line_numbers else " " * 2 + + if config.threeway: + meta = TableMetadata( + headers=( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + Text(f"{padding}PREVIOUS ({old_diff.score})"), + ), + current_score=new_diff.score, + max_score=new_diff.max_score, + previous_score=old_diff.score, + ) + old_chunks = chunk_diff_lines(old_diff.lines) + new_chunks = chunk_diff_lines(new_diff.lines) + diff_lines = [] + empty = OutputLine(Text(), Text(), None, True, False, None, None) + assert len(old_chunks) == len(new_chunks), "same target" + for old_chunk, new_chunk in zip(old_chunks, new_chunks): + if isinstance(old_chunk, list): + assert isinstance(new_chunk, list) + if not old_chunk and not new_chunk: + # Most of the time lines sync up without insertions/deletions, + # and there's no interdiffing to be done. + continue + differ = difflib.SequenceMatcher( + a=old_chunk, b=new_chunk, autojunk=False + ) + for (tag, i1, i2, j1, j2) in differ.get_opcodes(): + if tag in ["equal", "replace"]: + for i, j in zip(range(i1, i2), range(j1, j2)): + diff_lines.append((empty, new_chunk[j], old_chunk[i])) + if tag in ["insert", "replace"]: + for j in range(j1 + i2 - i1, j2): + diff_lines.append((empty, new_chunk[j], empty)) + if tag in ["delete", "replace"]: + for i in range(i1 + j2 - j1, i2): + diff_lines.append((empty, empty, old_chunk[i])) + else: + assert isinstance(new_chunk, OutputLine) + # old_chunk.base and new_chunk.base have the same text since + # both diffs are based on the same target, but they might + # differ in color. Use the new version. + diff_lines.append((new_chunk, new_chunk, old_chunk)) + diff_lines = [ + (base, new, old if old != new else empty) for base, new, old in diff_lines + ] + else: + meta = TableMetadata( + headers=( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + ), + current_score=new_diff.score, + max_score=new_diff.max_score, + previous_score=None, + ) + diff_lines = [(line, line) for line in new_diff.lines] + if config.compress: + diff_lines = compress_matching(diff_lines, config.compress.context) + return meta, diff_lines + + +def debounced_fs_watch( + targets: List[str], + outq: "queue.Queue[Optional[float]]", + config: Config, + project: ProjectSettings, +) -> None: + import watchdog.events + import watchdog.observers + + class WatchEventHandler(watchdog.events.FileSystemEventHandler): + def __init__( + self, queue: "queue.Queue[float]", file_targets: List[str] + ) -> None: + self.queue = queue + self.file_targets = file_targets + + def on_modified(self, ev: object) -> None: + if isinstance(ev, watchdog.events.FileModifiedEvent): + self.changed(ev.src_path) + + def on_moved(self, ev: object) -> None: + if isinstance(ev, watchdog.events.FileMovedEvent): + self.changed(ev.dest_path) + + def should_notify(self, path: str) -> bool: + for target in self.file_targets: + if os.path.normpath(path) == target: + return True + if config.make and any( + path.endswith(suffix) for suffix in project.source_extensions + ): + return True + return False + + def changed(self, path: str) -> None: + if self.should_notify(path): + self.queue.put(time.time()) + + def debounce_thread() -> NoReturn: + listenq: "queue.Queue[float]" = queue.Queue() + file_targets: List[str] = [] + event_handler = WatchEventHandler(listenq, file_targets) + observer = watchdog.observers.Observer() + observed = set() + for target in targets: + if os.path.isdir(target): + observer.schedule(event_handler, target, recursive=True) + else: + file_targets.append(os.path.normpath(target)) + target = os.path.dirname(target) or "." + if target not in observed: + observed.add(target) + observer.schedule(event_handler, target) + observer.start() + while True: + t = listenq.get() + more = True + while more: + delay = t + DEBOUNCE_DELAY - time.time() + if delay > 0: + time.sleep(delay) + # consume entire queue + more = False + try: + while True: + t = listenq.get(block=False) + more = True + except queue.Empty: + pass + outq.put(t) + + th = threading.Thread(target=debounce_thread, daemon=True) + th.start() + + +class Display: + basedump: str + mydump: str + last_refresh_key: object + config: Config + emsg: Optional[str] + last_diff_output: Optional[Diff] + pending_update: Optional[str] + ready_queue: "queue.Queue[None]" + watch_queue: "queue.Queue[Optional[float]]" + less_proc: "Optional[subprocess.Popen[bytes]]" + + def __init__(self, basedump: str, mydump: str, config: Config) -> None: + self.config = config + self.base_lines = process(basedump, config) + self.mydump = mydump + self.emsg = None + self.last_refresh_key = None + self.last_diff_output = None + + def run_diff(self) -> Tuple[str, object]: + if self.emsg is not None: + return (self.emsg, self.emsg) + + my_lines = process(self.mydump, self.config) + diff_output = do_diff(self.base_lines, my_lines, self.config) + last_diff_output = self.last_diff_output or diff_output + if self.config.threeway != "base" or not self.last_diff_output: + self.last_diff_output = diff_output + + meta, diff_lines = align_diffs(last_diff_output, diff_output, self.config) + output = self.config.formatter.table(meta, diff_lines) + refresh_key = ( + [line.key2 for line in diff_output.lines], + diff_output.score, + ) + return (output, refresh_key) + + def run_less( + self, output: str + ) -> "Tuple[subprocess.Popen[bytes], subprocess.Popen[bytes]]": + # Pipe the output through 'tail' and only then to less, to ensure the + # write call doesn't block. ('tail' has to buffer all its input before + # it starts writing.) This also means we don't have to deal with pipe + # closure errors. + buffer_proc = subprocess.Popen( + BUFFER_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + less_proc = subprocess.Popen(LESS_CMD, stdin=buffer_proc.stdout) + assert buffer_proc.stdin + assert buffer_proc.stdout + buffer_proc.stdin.write(output.encode()) + buffer_proc.stdin.close() + buffer_proc.stdout.close() + return (buffer_proc, less_proc) + + def run_sync(self) -> None: + output, _ = self.run_diff() + proca, procb = self.run_less(output) + procb.wait() + proca.wait() + + def run_async(self, watch_queue: "queue.Queue[Optional[float]]") -> None: + self.watch_queue = watch_queue + self.ready_queue = queue.Queue() + self.pending_update = None + output, refresh_key = self.run_diff() + self.last_refresh_key = refresh_key + dthread = threading.Thread(target=self.display_thread, args=(output,)) + dthread.start() + self.ready_queue.get() + + def display_thread(self, initial_output: str) -> None: + proca, procb = self.run_less(initial_output) + self.less_proc = procb + self.ready_queue.put(None) + while True: + ret = procb.wait() + proca.wait() + self.less_proc = None + if ret != 0: + # fix the terminal + os.system("tput reset") + if ret != 0 and self.pending_update is not None: + # killed by program with the intent to refresh + output = self.pending_update + self.pending_update = None + proca, procb = self.run_less(output) + self.less_proc = procb + self.ready_queue.put(None) + else: + # terminated by user, or killed + self.watch_queue.put(None) + self.ready_queue.put(None) + break + + def progress(self, msg: str) -> None: + # Write message to top-left corner + sys.stdout.write("\x1b7\x1b[1;1f{}\x1b8".format(msg + " ")) + sys.stdout.flush() + + def update(self, text: str, error: bool) -> None: + if not error and not self.emsg and text == self.mydump: + self.progress("Unchanged. ") + return + if not error: + self.mydump = text + self.emsg = None + else: + self.emsg = text + output, refresh_key = self.run_diff() + if refresh_key == self.last_refresh_key: + self.progress("Unchanged. ") + return + self.last_refresh_key = refresh_key + self.pending_update = output + if not self.less_proc: + return + self.less_proc.kill() + self.ready_queue.get() + + def terminate(self) -> None: + if not self.less_proc: + return + self.less_proc.kill() + self.ready_queue.get() + + +def main() -> None: + args = parser.parse_args() + + # Apply project-specific configuration. + settings: Dict[str, Any] = {} + diff_settings.apply(settings, args) # type: ignore + project = create_project_settings(settings) + + try: + config = create_config(args, project) + except ValueError as e: + fail(str(e)) + + if config.algorithm == "levenshtein": + try: + import Levenshtein + except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + + if config.show_source: + try: + import cxxfilt + except ModuleNotFoundError as e: + fail(MISSING_PREREQUISITES.format(e.name)) + + if config.threeway and not args.watch: + fail("Threeway diffing requires -w.") + + if args.diff_elf_symbol: + make_target, basecmd, mycmd = dump_elf( + args.start, args.end, args.diff_elf_symbol, config, project + ) + elif config.diff_obj: + make_target, basecmd, mycmd = dump_objfile( + args.start, args.end, config, project + ) + else: + make_target, basecmd, mycmd = dump_binary(args.start, args.end, config, project) + + map_build_target_fn = getattr(diff_settings, "map_build_target", None) + if map_build_target_fn: + make_target = map_build_target_fn(make_target=make_target) + + if args.write_asm is not None: + mydump = run_objdump(mycmd, config, project) + with open(args.write_asm, "w") as f: + f.write(mydump) + print(f"Wrote assembly to {args.write_asm}.") + sys.exit(0) + + if args.base_asm is not None: + with open(args.base_asm) as f: + basedump = f.read() + else: + basedump = run_objdump(basecmd, config, project) + + mydump = run_objdump(mycmd, config, project) + + display = Display(basedump, mydump, config) + + if args.no_pager or args.format in ("html", "json"): + print(display.run_diff()[0]) + elif not args.watch: + display.run_sync() + else: + if not args.make: + yn = input( + "Warning: watch-mode (-w) enabled without auto-make (-m). " + "You will have to run make manually. Ok? (Y/n) " + ) + if yn.lower() == "n": + return + if args.make: + watch_sources = None + watch_sources_for_target_fn = getattr( + diff_settings, "watch_sources_for_target", None + ) + if watch_sources_for_target_fn: + watch_sources = watch_sources_for_target_fn(make_target) + watch_sources = watch_sources or project.source_directories + if not watch_sources: + fail("Missing source_directories config, don't know what to watch.") + else: + watch_sources = [make_target] + q: "queue.Queue[Optional[float]]" = queue.Queue() + debounced_fs_watch(watch_sources, q, config, project) + display.run_async(q) + last_build = 0.0 + try: + while True: + t = q.get() + if t is None: + break + if t < last_build: + continue + last_build = time.time() + if args.make: + display.progress("Building...") + ret = run_make_capture_output(make_target, project) + if ret.returncode != 0: + display.update( + ret.stderr.decode("utf-8-sig", "replace") + or ret.stdout.decode("utf-8-sig", "replace"), + error=True, + ) + continue + mydump = run_objdump(mycmd, config, project) + display.update(mydump, error=False) + except KeyboardInterrupt: + display.terminate() + + +if __name__ == "__main__": + main() diff --git a/lib/hackerlibultra/tools/asm_differ/diff_settings.py b/lib/hackerlibultra/tools/asm_differ/diff_settings.py new file mode 100644 index 00000000..183b96b7 --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/diff_settings.py @@ -0,0 +1,11 @@ +def apply(config, args): + config["baseimg"] = "target.bin" + config["myimg"] = "source.bin" + config["mapfile"] = "build.map" + config["source_directories"] = ["."] + # config["show_line_numbers_default"] = True + # config["arch"] = "mips" + # config["map_format"] = "gnu" # gnu or mw + # config["mw_build_dir"] = "build/" # only needed for mw map format + # config["makeflags"] = [] + # config["objdump_executable"] = "" diff --git a/lib/hackerlibultra/tools/asm_differ/mypy.ini b/lib/hackerlibultra/tools/asm_differ/mypy.ini new file mode 100644 index 00000000..138b9393 --- /dev/null +++ b/lib/hackerlibultra/tools/asm_differ/mypy.ini @@ -0,0 +1,17 @@ +[mypy] +check_untyped_defs = True +disallow_any_generics = True +disallow_incomplete_defs = True +disallow_untyped_calls = True +disallow_untyped_decorators = True +disallow_untyped_defs = True +no_implicit_optional = True +warn_redundant_casts = True +warn_return_any = True +warn_unused_ignores = True +ignore_missing_imports = True +python_version = 3.6 +files = diff.py + +[mypy-diff_settings] +ignore_errors = True diff --git a/lib/hackerlibultra/tools/asm_differ/screenshot.png b/lib/hackerlibultra/tools/asm_differ/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3230555328cd9acdf388ce1626415ceb78760535 GIT binary patch literal 99842 zcmeAS@N?(olHy`uVBq!ia0y~yU^>LWz*NS;#=yW3>iJ|B0|NtRfk$L90|Va?5N4dJ z%_q&kpuphi;uumf=gr;9h|sJ5j(_}a_uN2va)T0E7uTa1lY)h2rq22tk!JZgWZBfH zq`vKQK9~CzYqft#Gxy$nX37~w({ve!^~NU@6q?Q`aLoDpn|Y2PA6LhRTHF5fi#OfK ze*3cc+`a0xTSfi-{Y4d91e`b&wIt47&T9a%S_J$LKdu+NX4C$?A@Iw$O>UKwjGQ06Q!f^FzPXg&qM?-hd|S`IKgm+Evpe2zGXDPF*q8TS+@?8=Ti@Hx z$t%q8%TIgb#V(@rddu?r4S5yj1qaV*OujLJ;ZL~!^X0)GJ=9ATPf4HrnLhE!o)sPQ z4v8mDZP}mp@t&yqro+uAHU6@7C|!uUer$KO{jaYT6JITpdh|(qiQ(ZxG3Q(5)jqtp z<*fX_a*|xN@%!gjD@r5krHgn#ot`{DUb(yzT{)3| z{$DH3+f$ooZ1@?qGCor4+184?l3pGWWm&@9B^uZKSK>=i z?i|@Q2G^Dg6@N6ieQjM*ae~b+qp0wQTXvL5o_?VAFlVl@^zMgsTh48tqdHaR%aJ%s z_lyiX`O04&+kB)>TzivK#K56oa8q)9rGD`F(9`c&c806Ccut<9KjX=sCwo@RC}GIT zGN`_;pHiN~B-tgp^%ig9k@nyd9UoGk-pmPDlWCg9_c+ey$@=$cn{A@nizoZ-3H?7$ zRWiWM_ulFK?emZMBzw>P`1wWfDed1CB^BT1A7fv;_{N4DEqCS17b9*welx}O$y^@~WpX=_@+MexF zrn3B->%E`ny$`CHWErwyCgsP@Xyf45nrNBvdiYQEMeCxdUxfp>er3p92SyCbQNB>aOlK2 zt>34=`DKrNo2{tU*pMGql=+*k9hEe6Y>T_4urOX#@ zm@IkypuBSLO6k67QkR7Dld`z3_x1)b^ma>|nr!@2`t6spzt~#F)Oo%$S=Pj#y7yAv zpg5NMU-^stfA_XF+cF9+5#O@tW+Ka+o`vsM%k9YeYxrhmK;|{p1&a@E2tD)i*#zs_ z4!gGd$M{ojzFcH`=#u;2bNk!=@M+Ajy0WzNK7Ymed^0so<;WtVzxy^V%ZvT_<#XZ= zmcR1zYs=dn?OCtbQegrPb8)w#xGCXQQ&yGCF%gbmKDp-q+vhAUOBQXcYy217erNBY za7TWPSxjl2CQHujZRP$kGmbxM?X?S~8ikR9)-&uMam=2zb)oO<@E6u=`QOL=XpA)e zclhNK_qE+zRiXi1ChoDB*H|rEa{h_We`kJfcW^=XjtT0OElVc}R`8YJ`zFC)E zNnau?tdpasrKO+uQ+jeCf6ctViq7t}-Vt-_crxSPUKBo|9lG-V0h5)O4su`CUn z?v?e#(vO`@NJPRT;DY6%OI;7``WJmjNEWr0Kju>_e*3TS%qmsQAfQIbW;JH+*(CrH;49 zIew+yH>nD%=TkU&fA<{H{>;*N@VduIqhtH#v43;h-r=+Bf8m66b?Izn!5lrOj=fx3 z{vzCb;$Gu#MUNZL7_PiNKk{;Q@Xs$nfA;;Dy!-BQug!YQlD7la&f+~bD=R{}@!ToS z>ryLImc=N4a%0nSyYlvj-q+1~1y8HAs*Kg8w!HUNZ-4#fM!8-7{nsDf7_;O*Rp{P! zJmF~+^XffEU*{hyG*#O=!`+cv@tv||Jjcn(la+yiFE6-nN`Wg& zH?5QAdIAD-=Y22Go_kr_KGAED{$K092b;I+UQAgkATM`h-ih1l>l9P-PAgViR=T#k z)}#OX@{4-fecrdlHa&OHSh>pUjQr=Bnbxxo&b3QAwp(q5q~;wC{-pXR!7nnG%vfZ) z%H{F7mPcAzs z9+?a;r#FcB`}|0>iCG4}AO1A@teqD(JMQu`!xdfjk8AfotO-1(GbJt7 zi9@l-^Bi}e-bw8T-ZR%laqs&6#xuP?rR?0@6Rko#Yc8$v=1_FeJ6WkXPxh1Rjwvg} z{B}spPrlnS^UcmL50uxXZ`V_75!k8nytSgt<2nbp!4Rk@nrr0*W-6ZI{Hde^X+@~~ zRQj_f@XW`GWQq6XUv=*B-Rm;_TFt*S+4u3Im@L6p=EwhjRqS~aw7sb;#(b$?c>J#F zu&OUDznnU{9E{s#B)1eMo*(IrmwgmpL5H0zoHN$fIg5%YfBR0HpH_Myn zy!=#~{Ht48Zzc8@2o{U$r4?PDCGk}E^0joK*ZX8Woj)(ya^phn!lOI8<>&87Jn}Ab z{)evzcPRB*>D_z${N&WF-|n2gu~S!m{k>D=i=}M#*nheBX4YTLZoeBBaxbZG(f?o} zyeLEEIj^$i{QaAztxjEQ`+d@!`fo2TEHALtVVx2pm16VqQHapLSx2kG=bYfZQd^!0g6-;Awk zH$Ftk%-BES@=Kd9dEecQbK*6o#;4v`@GIv3&*W+HefqzySRbwWBhtL-nw&#+tn~YL ze_vdG?7C`pR!4Qn!8aadb(Yg_bw4-ASi#?({?B*OnU_jk%};6!C(h9q-Whf6R`ZiT zo6l_MuJrZ27rCp)@44F3eR+ZhPPCt|o7?jCl%vm$8r~eMPe=LXA5X2WJiWGdzVsKj zIY$21I|8%!FPWYEZff-WqxF~A8Ky3ITes(PJ!1;6cG)a0|F)}^HM zeBVn`S&D=ndzfT;KK0tRMapQ>E%yCS4lno}AD?xlLgI9tRR7|oUPVVV%htr5`R<-{ zQt|u7iHX0RnzP&GDpKDjUpv*e$zaNGL7)8_X--}ckbu>W4ozE8}rtY%LXtZmzWT|fEjx`4d= zz@x|74U63$zRl@wHJiQUMX}6{4Rb=Rn|5X=!BkG$%C)!b%-mk_-aX`GBYCnC41aR1xG^tl<;m)w-#=WQk(rZeTo)JDF@^c2 z_>cE33vYu_2ij^&%|Ds_GCkiZ?2Rkm-%q-$ z|LRZ9yU;n?Imd_T>YeOl*=K#;&r17DKBPw6Ro3~X@L^%K=wK=L&-1M=8!9I<3h%yn z=hUD7?|zmcW=F)5yoFg;pIFyu%-svwYU0&#HoHyrp`~5mwN0&)#>hBwS z)zN^l;|IBVG1?CI|4|6^{zP6QhvhZV>tNPsGO056}8t?fmi4cHbXOmG^uTO=Z8_ z-Jn}i`!3S&so9>ZCueHEZr@x`Y+-qzGdNKqH2&c2{H+h4FUUP|{~lNR_DyBp_hNg6 z!!PVymlDuFJ+k^o`J)g8>q)`CmEP<84%)!kd&_5GoUQwm&4FyKowKA4{1cY!$^WWk zdM!@Hg55;VZcm7I@8bWqr{3}d$BUFWd3qN9&wjTf zYrEk5$>;S~UAL%KWAoh|wIf4OPuj$c_oda3*tq;xZHt$-eK|6F#;il7$;u)IId`w7 z^u4umx|Nc@=k7n}52`DE7D;ERyh#o{aMw0er_`3uwD*dMs4;i(%=-ZyMovZh5+;3i zRk4guli2Y$^h?!+tgUQQb?3{~Ze9K?W#U?`kWIVN^Bihru0Q@Faq~t(;1bIq5uMq5 ziBCQ^uCaRPCg1PyZ0~>5#IQPK3)~myQ5Q8eTnJc zlld*Le(ZVFcy5Q?+qmk!6|w*3?7Qr__QxwNqoX|B#;rYHN|rpIp6-I%U#gd$e;5_(993fC>3Tx^=ps($`}wD4E?sSr{;DJMhij9tUXkLVwpDy>H4b;L zzi9gI>L;Q2@WHD%>B)cUWF(J;u6hu8{a}ORnSQ&vBB%4hb7EWDdRG^w^KLn3k{8qZ z=7D$1)AH#I4&igv&W9`h{^aUZ%z(8=puL|r=D}%1v)ww5D_h1Zoc!tJaZX(NnG0GplcI z#qX^ZOqa9*r+VkuOStvTI&#uE{Y2G!-D7)ZpIP5n_(J>Y(YV8htpj|Ydljg7tv|Qt z_CvPzNjfW6?L4xr-f8~JxpRwkXIwCmj`}WpAoHxJ(AKGihJ0zS_h~e~pW*V43-~J@ zz9~8;=c}|hQby9O>_*1h4ck4H-nj{GPe}ajB=37*VgTE>im7Q~?Kl4)5OK)*lDAE+ zuKOeNa)YS-^O~=hgk*kTle60KFCdmx#@_s2+F|*u{-sPzrJ1jO2tiUjT@9U~P0~+TT=*6ErxH~s~7fb%roEWw) z*Ib#NPo4*wZcX0p&UtfN>wYVlqH62HnUw~!nb%Ff{X6fG=EOPr6F{RHPil@XE-fgSG4FS{ zZDF{Q;kOUVYPX-;bL*1q>LZu`6dQF#JKTC2%#xk;G3ofclJ~bJhDX`7OI6N$TwPvl z^y%KbUs{}s3s>Z=&Ah*rd;Qju<64F<&K1pzj0}wFGdaGulzms(+Y{QlS;>`;P1yZh z3%RFG;XZCL{i)Mxz5I*Y%h{!(+cwr-l=)X|^s@1|99N%Rv*eptS?zS$gVEmvCT&kV zBlX*8tH06eeLp%M@SNBwcXsWwzc21@RP~!^zp?6cYEUTmt8MQcFZa~{$c(>ta@|U| z({Z^gYwEOb``^D^zGg%1!bu`iTdTL5e>CGxdj65!`ptcnFF!PeWM_TK+8$Su^}4lN zPkL>$?#kn4AFuzcu0A4K@+U>G_>+RTX=%pgwfwgCDg?v-M%MidCU;J*T zvW{2tx+w0dZ`IS!o$a;wadrPs3NXgy&J)kuCVm!N}iu`V|zjGj^`6+C;4u5)4zPZ zT7YkA&xPg3g$v8%yX}7WF}q4iDse4W6PB);^0iL-M#(acU}a9lQ!*zjC+eU4Y2>-f z4ctrX;PQM{DCPuWi%zN$M6lLzh-AO|F6VW8)-lzPM$OV)zb@U~Jc&_w6SrcEM%kp# zPBvmcm16E`ZZoN_w=-tnvS`}m(331Pj)_e_mMdYEF1OEjt*T0^z#0Q3R zTE6)eMQ|#%D1y3`yPkOHEiO5i|G+$(!Sri?oqup*>XcLKjdB8N*ZsF?f7<@oyKL1o zNDsq)(q0LZE9}xcV-;EiSSQU9fAsP)qXy1#)7KehdCb9Y!VMEHnF+nOJ?(Sb;OFy; zOMKp+4nIEsRd%u0l%$s@rQd&hu+&Y?=6Oc<)}@A7ZcNLs*BzR2R`3NQu9kb`k(3}E zDZ`9Y2|D%jPYM0j^!ZjZ$4Dy1`pW_BZ28S*ac917UC#Qx++pLP><#kGaqD_FH;W$o z6_TVUmv;MBXbxY`^Ml_XuE=a$6JOpCuJ+~0)~w$*BsBBS2rgPP0Wlc6;PB@ECUzOJ zN83_^Ev07m9XlkKzFbGim?7lR<3|gp>4tHsNJR!;jdOMiVcNdt?S{a-0@Zyr^EtY5 zldVds1xtSyh1H0AI#uymaYs*CkzMZO-;F1*Fx5g&A zg`fW@-+ROPk7R$DKCau-@%eXuq#JTG-TTF%Z`KW(SEWrBrd`rM6IC%IWU-dXt1I&x zjh`pIHgB7{T)sxT&+F5}Sef0HGsVuz-q>R4rp6<_$Y;VF{T@(3ykbVlf}^*taRv1i zJxdV~pY-K`>$$nRVqN@mzLaj*eB5vGgcrtrsq&E<(mqsd3oSd~C-3~_>nGU>JB>JP zpPc`f+|RN5jfdac?meGThjk?-M7XBj?n_L$%ka;(%HBLg_gsG{+l5_^o-rj_H=R7S zechpNzhi&h;AWY_^GHmfM2SUAe_{Cj={HM`&2M23*D;>a{g6xlN{OR4&(rV!CJLMv zI$3!bGL-Dbj%#FfHG|g6>x(?MlpMNvNa%GKui>Q^8She0pPL=J(RYW}mOb4vy}r)7 z`0A!#pS|m0#!5xok7~=772LhS!OFwsadeevbNe;bjGr8R%b)z0Zkxh*;D$``T(7EI zXWg&F-l(f@d1JujckIIVQ2v;$|5R*dG-OGw%+yK~dv=L2w!_G|XrG10x#tt-h(GP% zQ_xOg|LiW47`)kROXg>;+T~v#-sQG8$UatYF?Y=*VM#ZU^N*igYkKun|HEZA-MM?C zAJwhXim`P{Id?g(ce&3>uj8J^A4{!He!pMm=is6x^;-OeeJRH_*NC3V&3r#@++H~I zhw?q)&thw@E(~ScR8s6bjc4AGeQK@KZ_2Gdw6^5ZW|24Akqaiw%l8o5cK`G8ra0Cq zf0zRd45k8{dGIB@cxf~JLCRj zpEPLOa{uUYd-p|Zt%B2DIP9JGc4b{1yLbKd!1SZ9znGOiI<_<5l2#SFBBZVMx02WX zE%#Yowz;N;+pj3Gruv13yc_^vT11%KzoS1#51Djnh|FXmHGC*K2U$k_`xy8gc-vgpjjIrTM@K9_@rV_n$Q zOx_rCtv@5o!WOTrdRpRlmD~;KyGllyw%bGeG^VeA@#5B@URz_nNdoIr!!H!reZBVK z{Imi~!JxPNv}fw(LP-s=t%U}s>hmNgSN)x7y4QTFzy8tp-S(a5yp>FC zr=9px?fq(l?^(yQUP{lhbXHa!m|(>4D}$-8#c0Fv)h3&*&ird%_lNh!`|a5)?$2zz zE5fvRQ(@Ih*Iz=A*RhjQ?qU-+y)d%Qsg^a25FeR@3=gwVdhgrd_tjE-dZhl)RXJ!?Ip)HNUF8 zOoLkKi<|e^&rW3hQyMBagEKJAz<2E-&hb*+IL?1_#fNrU1j0!g-dQXmGbz`@O^*&`!j3zr*}7%naFQ$ zIH@0-{By?n8)B-Ank_4KfGQia6AkBsmaV?l6zAM_@uu?3x!Pt$3tgViJ*oKVyXBeR z%5$eZer~v~H~Hiq`MAOdM>l@{P_5hjw)pwR*h7IFfsLRl@683#I2RH1tA{wn9~ZBg zZ7|t(`lre_A#X(03UW?XEIYEVHQOcV>& z)EGgHYggXePU$o4^@A9QT%fb z9Pzh%WP88-#V0T2RVgh6YATJ#=UN`$;TFD3FaFGrZI*vF|26U4-fpTjb;a#ko%z21 zTE4gM^KGA|w<5f0hs5^>JQJek?Dl*9dEe9<*2PTm^1A|^7Iy~kEc(DvSh~w-L%Hpv z@Bhy}4UuftY|%&u&t&aXE^p~><>YNYcW8aHr2F)rhG|>mwfUq!e{zpEShMnGvToq> zKWufI*#d(9C%n+K*!Pd~ztl&jm-V{O;*G^NYM<>+jITMA&G$Wiu{LZ(vXbvK|MBT> zO3ZIgeDkMBuU@6vFk=P3Sj=*)`qWhBv`+^zQAC=yp_$BMDqiJ^XrhGMF`HkI6 zg~J6VtXq6@2d~e@_@fP;w>|cJ*D=mL{A9lSWTU|!P;|8wEBUcSAv z587{@xjRq)q?U~ReCMyG!Y_ZeN$OC1(XG!1=gs^X$raQYUX z^i#I*N2fn`2Hg0@_@&S#{`8@JFS~clp8qswSJ%0fcJH>GjIoiAJ#szv)~`jTf&UJSS(}>$K>+#kAU#gR>4k zz8Q9t(YluB;`P(T4r1GC8NRYvPuE>^v1j9%f7|TX`Q0CWc*MQJ{_KO~lY!w|(4e)Vxz--3KRM@hwMe z%Jy3-x)e@=wdhuuOz=GLYw4TNTgJtAqn`Q8cr8ympIEp2eZSYQtrj0!#7=K~yW3*^nnka4SNttvpJkQB zyUufC*3kzGOF5&q&U&ob8k?M6ocT6_?Q4Di)&Hl}nP3B5HAk-QQhYr%ek*87_~43d z?CXB6oi)oXYgX6H)}18|;)~9J8=rsvUiCWH-Q~xzE4n?l)fDZM*9h zbL6f{v-}&HFNE_ZtcXfTPj6e~udHX*nsZcU_o=iMoF7&0?aM6Ip8G|I^|Y5*|D0#b zE_^*T9W+(^iQfS_B=x2J*ECMWd2-cE6VkSLdbz{fooza&gpf(SbhEd z7vbQ`dIf4v#Gdi-wZ_*z_q5+KBhb0sDCjQ#)de=ee? zA7#>&O)Jc@n^Nx;iJn%gsLa?=^-bpFcBGN3<1y=NG~tuSpMNKqlr7%2+N;9D<>Ie1 zoQhuap41#vdHz{z@*Hu|c0Qks8|fl(Gu1hG_PKdYGyL||W`p@I*OZ{R{mbVB=*3^W zxV2TfI!#7JG4Axb1rKXpt$jFO_u zqMZI$|62GjRPF08dl=6){*wM~BSn)MR7ZPJkN$DH*-wo^ignV{yxNnxuB{O2weDZKJ6W~oq{`D@qD=KO zPM*5Uxs!e8tW!(5!%vp+CjH)M67cZDw!e2W0-L#~%gF>ros-y9Th#RPWqkYs>5KEX zFRweB5p0{eF`VO$$>jXHU7rptRz{nv<$kMPra$#{{khatFE!l0{p@&|?|kSf^O`xE zrtDvLf47Wn;=kFJ_g*Xi+JARKgQ(-3?aO&0*WWfxiw@X+Tw+&i*2_2_)X{d|k~B&GQv|qObKmOBOTuxinix{9-HQVsghx4jpi@i!ho&u-XaQ9k$VAwj-3|7&Er`HxS(;}JjC_^sXVNgH{cfBb6J{NaB3ij`BxC(oj| zqPQvYMzv9f7g5)j$z^L=rp%U@SoTO=>~BG@4|jOfcgc?TA+6cX&k79QmRTmp-0Dw% zWl+B8|GmEdt8`;}dsTlmUeDHowPSuJPn(`%!Ia{@>GSEGSK@5i9i3|}Y(D1;Jr(li z2<(HjWZa2t$-J|F;d|QvKEB~ya_qzMRS(`WFF3mObOf6@XZq_oH*fHMU;H)s>XM@5 z`&rZO{QU0Olvnw{_-ya2J}JJqlY4)eeUoXpFQC1xPyXQgg){pjrm6T$s$)EQ8gT8v5qWTEP2%^5gA?-B!A+ zzBhNpJkj3sPqu#9Y_6#NO{u-^=d`Q;rhD%H%ebuYQR_5Q58F*`k5~ST-6Xv!ZdpkF zg_c>K`wg-mCIQ?#hXPE?T(Z zZSbEfTbgxbjc0KNi*0zgNBHmaGmHFll^H~gtKaB`D)r|i-#_`erDe|31K;C6zfRST z+M3&S^KGld?BsR9p8mUkc08y%^Ys*;@`Dr}x2?7XSD)Rk2)Z0{M(0ebmk_L^yzgEV z7os55u%<)yjQmHv#m{q|%(*mS-{pO&SEn;)WK6Bz_Qa)4&{cHKou~(~|C#J_E&6wt zd*4|d-n#ms%QKs+r5c5;x$~2jFB6omnrQ6)=jXfl&o}11^Zee&dx0^_PweI@C)L%} z&x)=bFSPaRpV-SQw*CL-Fsql5T+^oN$XT8}`*91tla+yqcWjSsp3GtSMS695 z{fP^K_l3fi%RAo+cV@h@#Nd#S?27A~ZNHv-|LFVu^5TPwW%tguD17Xtktw>cIe_u@ za+j4_tK>{(?TMW#=@=nmbA5x|we8y1ZQHX;c{49wRJnUk+%mDHrFnIAt`ApKUEp=^ zm0o|@LNBzl3eUUGzIdbb*4WTP&Pp23=g)SssaAQ;t!6nN)WlJ+GFX^6Kd>Too`S&- zDb2`ZH?Ds^aPNiKM9-HymliqgtZ{X}E|&LZX5oaE3f!(dGX1mg!G^cY z2|3PNv&${=wV!_bFT`*DrYELTf2^Hv^kB8{cOJEX4WGXpI(&>NR$E>w z;+=w(YQAQdq*$m;<=$-n7#ZD*_q>#Ted4T}^G{aV|1O`d?Zo|c2TdLa^1L*f$jaR7 zvAe3vKJDBS`{(c89$Bt_rr!8?b*;<)?b1RUlsbNYo6`82bph#(hkH8TMKlI#EaXdR zuuMha8=F6Ir;~o)smz&PAmS7P9*VGjB6@nM559)O#|PDKx>xt5BsuqQx|h#9``nZO zStpK*$uB*DGW!KcF%6@M`7*NHtg?X#wVLDSqo zwT+65Ki0>c^I!f*euZ~;@%5WJG7k^@JAZuRj}OiE`fgU~w`#wsCQG+{_{tvqp?})S z(iVZI;4yHGa@c^(yjrflx9Z0ACC*9PbdrxAQ(kiI)u9Hv($2e|%@tp^>MKs~%GA}j zxzzvR_ObgnDs^}sx6Q5GJXtt=+h1oFu?2X<3cUR_>g6ht8}G_x>ij@|Vau7MA3{uNZb+?@4(6FTjZFzpi3Sg&U-a zLBe23(B&<>lk4StPkq@}Q@Y0`ou_^k*FC!iJR={h(h`1J=HJ$)ot#@gU**L#cDu`W zR=iyC@PVl93+05#C=IPP=YvU#hg-R0c=y?OAoJQ|XM`>W1Xo%>h9 zb-FKpLrw#yeZ5t8!{@4~tE;=G3i&uqoFAHr+!*=Z(p#l2!zgm*?OVh1ok~W}=1E+$ z_~>+6YKdIr;g47TXzADNJuu}J@2mjhm*Q!;!>2Br%SS9j zpGt{^Or=0p>aQSYDn({OYp(o-8)3)XJRj%OsEPHiO3KY`TI|ZEo_ELPAJ_Zf)dw^hA6?_+ZGb8fkyXScs3OlFLj*%Xov6KYxb@f`$*sY>-ULc>ibl`VDUv z`|ogEl+`$Qu4I>8?~WTHn?#G>Xw6=zc4TtI6=}^Zsf`Q8EsKxLfB(<4|Lx0pCGT%2 zY{HE(4?Gvxs=XiC;=@{P~ zoXap=e3NY2UNph=cJhXzwT+?o)P}+U4J$_x?N=Sh;LN7y|x-sbA*z@?}KUZT!x z^kDOpm#elexIQ7Vh-urB3b2S%QwFo?tRJ7DTve_B2x&p!4$H5Jn)9K)P`Efr- z_PoQ@2Q;dxBkgx3?^8^5Il4F^c>nhRt7|58USDTF{`X73t!!nqqxH$zLCaU`-?h~~ zS*gjTW~nbX{mGwTHOu@J$Nwv>S$pzye(B<+-H{Vd&#<+hvvhw>isOB&^XC||qFQ(9 zMg<(-CBnDz(wfx_=(&pzE20vXSU$-=H`nD+RWBM^i?zDE#yt7r!t@8Ai zuQQMA%6GqXLFUSnzcr?(rcXSq{^5SoOqSs8VsU%B%EKLZH`_gY-CXD@RT=Z=ZKV-t zUAs|P-s$73w|~03f{lNE@~@1tv;U^Js^`2gdntTNykZXLM+=qbr=4OaefD3sX6y5~ zNuQ5C)_gMA>rnjWiuYZ@Hy<8MnNr8>)nTaj_PBBB4C{;a`N!+8imf|#Oz5wR{sR4# zyGkm`-uw49WY+u$4^Gps5?*iryy(ap)5C4oA07D9I>(RQ<6%_+TRXw1%h!G1kB7;7iuApAZhil`{eH^gl_#yer(b+| zM}@7XRO$QP*KT$--(IWag!3gGdX~M^x_;q0!Nu3=Jk5{aS-sM(`~MPt1})Fqe=DB< zXF9>wW6S=){7Bc@$L=4pGtwm2dw0*>Yw8&;bi%Vo`Qj4QsoFO$Wu5TIlK(S_zxfh( z{E^!3;sdYGKID0EWzMW^TAT;nZ|?gRU1uj(eO|iHWJlSH#_(%)X}No5{J-73<(o+@ zXnnld;j{O6jD&WI)ph=T{p|DKk4k5bW(HI{yuLX5e0ZHhY`U@0qVpfV|4LnRPxRDV z-K-0hfgIfPPp+B!IZ)cU|l;qaB_W(a+Bu%iAHpmOEqiEU^>6O4%z?o&4ig zZ|m=!XyjN|sb(3^aI%tFOx^Oo#-z{Z&14&9Nu9a(mHVdbY=^ca*R^HN5+5Im7%A06 zR+>qRWJmSRJiJ3(_~+~0H+A~2J-o9-IREPYbWgS^fs?;~djD{_;pH2b(*Eq(GkJf{ z>3s+4)p=5@=h~f_abwElVztehD&I{`d!Dv_IK^wrtGk`AA}{{%iSxFv7T%PkU-V*n ze&pNwnI+EW-vq7JZoe^uW!28>$E?oCPCxTnCiB7R4ZGYUzBn#;_?Gp+9Jj;I4Av&| zRbM}op1Y$>>MfhWgU>r7e)p!iCdA#ynp3ebl{ct=&BKbUI?)-IFO>6L-mM`Mvwgz< z7!Q`&;*tg%rF&z~{QOr@^l=+|z!u4vdz)tTPPDZ6`6c;5%gq_f`yc%0d)ijG@Odla zC4V^;gTu4Mqjqe3RWDxrec`d0Vr#P|6h3nIyL(1A-6Iyq;-V*R(R_-pj~o1`77cxU z?m=SfRzKCBAN2a}&hhDf#+P$TMtSm+>B*BmgG!l}CpC^L&*$gvj8)#GY`Inc)4BRM zF0+M!vo)`*e%?`J#w8QCuv%LB+oq>W&B9=~An>JZU*wN((bAHkFU6*$(lr%s0_i+CHc?wFN&6B@7xb@F% zt=y#lnO~x6YIIa-YVp76Q)PbV@OY~&El4_?H&6af>*H>>Vy(3q%R7R0^5&NoJv;U5 zq0Su{KfZ!TArfv^!#{kB&i!GTA^lMcJ`p(ee$ktnip{~LN_92;`t@8VcRQ!}ve$0k zecZor>+^467Q3fzjsEm5WbTfpbET@yReR3dI=o+adC-f>#1qqkf|+mBD>Z*y8@J@x zt!|d*4abhQPtRIf_+`KQ&d-sF1+g<*C~jO{=G}Ro=nVrV?DEjtEHvR_v^F!m$v5ypW*xCD=6~h8n3G@ppJl!7R_>8>=3~!hybif^Iqz9@ zO-6QA&~1%rw(5uHzfdtKxI_a~a3_^*zg{a8)^66fuapI>G3>nBIf*D%*^$QO#iszS#WY@;Q4_DLQmT zO6mEU+Fusyj=wbAwDI7g6U<%StMynMtFpROyhdj79PyAILT^of zbZufMe_7K1L;jXeggU$r1tt~u6{%dD&Bpk&-Z64RM2JW@^SbAvC&j{}-oIVsWbs*l z%R(1d*2G?0w?8je7e(8s3oR&gDW0RP(XFdFFPKH}rq+SRpM2R1Y@T0ky|~d?;M!yN z&drU=&s&wBG9HjQ{3(=^<(|=uxZ1Xh$Db>lo-S`&?Y<=H_o~ES1+&b=X{3S z-Fwr;{M5QkJy{qz2d zRd2ivFC^aT?lG!6aYw!{_{rtQg|S_c`>m#LQ?5?9{lVD!l7GDQt%5wehUom97CU2Z zDVIwt7xvyb67$B@Go|Y8k++NUl$NMW7y7RDMdrJ~_Y#eSqqn(#T5ru+G9#+v zFQ3)(p1KL0lednT(6;oZL!R^v$@@ymX6u)gys_`N_qJK{PGREjooha6rwFq63c@4&Pt-7(i+@8!(A!C*hXt>lHY@8LbQZ~QhrUZ$(I|HYs7 ziCpjQzJK^{pIKP_7iIQ!Cqx1kl@%=L1+9qjKIeVzy7MiD`sd<(Z!J5wMVd6b^(8&Y zJ^Vskwo&o7%5SsvY1wl)H%!=#E&udPq>pLFx!`8mrb z6)W+X{&CBbwd<)fcX^O`=k)#ElQkK+`rj*tUGACJ>|S{L!@(~v?+KW`G_bzDKC%3g zY1QvTlg@lpVHPy!OZfqol=;4e{ zf8XOS$kn)4&Dhe4=X`+d#{KJ_9{E{(CZ@G^ri)aG{_xV&TinteJ;-rhSC=*wNzFLC&Uqitr6 z{R#d2Y15v+(Of=hc8+4w5m}er@1Cxo`<(xVzEa+ExgN&3FRUMxwcWWi)6Giz7K1$3 zw*M#Qx1a9s*nQ@cMwE?{GDrU1sf~x*F8*KkjYZ_mvv%|6pM8C9dTV6ah0Yi6o3gw| zQ!x1g1Di|ArY~RlZ_bNdw@l{FbY;esyz-}CbI*S^@8RBzcMA^+$eo?=@Nh?2=fml1 zHJ@+ef6no)>XBWP+`k^y(|%VL?u(?@R>;&=iZ(_pB{9< zE6wk3hxX2hvsdqgU)|EeH~(}rf6K<=f605cnQgsv+{EjG$Fq7n$;W$k&)B?hS)8*V zgT}s+*&o@?-TnR~Xq`*QnvRn#4$IUgojOe*dQu#viy z`XtunS$<;NnX47E7sv%Nz4&=T+veW&LtX!8pXcIqSIn9Mv&-NmM||q4XoKD_?LR(! zv|M8w)*D)q^>d%hvS%Cq?wx5fyHLGX__S?M@E(rLdgF3ef29M5Id^N$KGG~5@!^Yj z&Z=+G8jFImMqv|8X$~UL88;Q(Y92b{V&B=_U!Ki;FR%2! zb$3PebJO`pe{)^DRCB3)Pp!Z3mZ$%>&pN$o`THkl-=^M={G8Zr=HPzx4*DUne-v z%zJcl)6DN5i({U8FJ9GZsPnH#xK>Wyb^iq3KND0Y*Kik_dYlV)15G4f3Aef+X!);F zZlB@I_xI}iay`{d^8U53MSEzm1)My0rY+5`LMx%<)1t=xZF8Q;c|F|GU&HFtn=sR(c3k(YXsh}2=v+e zJylMBSO4>{DeG1({^4R+;NpKpRQ|(5anC0+a$el2378ao`Wl=0g}Pfd^W<}q|2|*8 zQNz)B@;~7jA1)+LG70 zT*$kRE2HUUk+U$@wz_lYnz-HxM)ZF;`}q5&MMov#YBmY)er|iXU)^i}=CvDiHi+_9 z^~gERP;HGnuamT9zwxx5#eY6uK3=o!lf^P_v(=Nfr<&gGp0}`iJ40Q}EH&X;?!u#< z=feG9q4wzMW6qzqZ|twucQ1N-Adv5^1$W1;Z?f6H2 zV}#b7Ns`G$N9=&2B5SMGx;!??C3;6f6)oRO zoc!74ajtup4|{^=pXTfDZlCIpt-idwT>f2E9na&wKm9xP>yGZT5sePAIa#7$vBx?w zw{OD}YhCBX`3jE$m@T$WRcU88jorT`@o?prM!hG0EV}u(&)c83ooSm$*xpYv-v0Bd z4MMW*US74Z6R%%?;3LQ8=P8LHcRzeBb=~-U@=QjJc|U&bT=Xm@*`_vm`H_~Biypjx z*w(ailI;rdzcaHoCxnXbv9%4*;PrSjb4mKG!cX6h`93^!JgrMRZyncBH{sIXa+3wN zwm+%4s`6a_lkmyP!1lR&12#V^dNe=&$D66{JHI#fcjg;T)7;*+fFUc-=HoGjsQz73 zueFDNzMY?KacPtNVr#a^rAB>+cG>-KzuqDEf2LE)CG$NWpE7ox`@Qk)lf;`~JbUcXByDa~N0m&vVK(ooN`m_08X(!Pkz5+k9G) z7r-H9GyA49PtMOr^>6e)9=Ls5IzL~3&RSNHX)6Lsx=ft;^Q4Vi`1Y0QbZOt?opotf zwECZ3cTYW?+mphh+4!=X3*YkRc&>XOwNs8;)$2S=NJ&n)@v6ZfHQ&g9#XpYE{N zlpmaZglpf#xtTBDwyks5zqRYXqu0Ne8v;G!ziOS|X>;Ij^1rj(<<93m`qq4U{``5S$d*YngY6%EP~AIiwQ9+an0r+UJ##+69RMF+@OQ&7NS#K=b%8HXd z-_HM3eQ4>uje#facTKiCbm*T3hK@ZX#@vwkbxms|O` zd`64FBO}jq+=Wj)-G5juHF}%#l@Z~?vI5%}i zc*5bOjtnpF?>`w{t+#!T6Gz~8ud?8*TIWH7sXBL+W=a|(XwLt66Kn` zfjnDeOnTYd-KXhsMhQ`r|DpYS-N)VRx59q^&UXG~{CO?wo?q9jZH)J5`Y~wy z_)^uSZ@+JTS=+0evln+=5VFcK+stOUG3}ksy}NTF*P7R6Z~Ggw?^c*xKtaCYgqQkz z&rkQRPrtco{*Ri2!FO&R{C-DZ%kmAsrm9D5I6Yg?|Lmh{36&AbS$$7x&Q6-Me_K{` zrONa5`Bra!E;;_ZImqGmqtkcic%7SH{PX(Bgf*NSW4=9GryRBZnah2%X&aTRg`O=^ z+Jkxeeq6KVd7o!@ymR( zoPT})|FBv2=GFP{mbu;b=UtKe^kU0}@>>}DQ$>>Yft+CcyRd;1c-y?d6X9QN+1%d}MuU-Kfo|IyuU z$@O*)B`f&zqO^Bvw%_=2m%ZkfyN;_?!?a_Eg`j z+MFj5u^EU4^u?~%Ua$R^gPP(6;fMalF1+E9b;!`H?x$4z`!mHh0b3bM_9a^hx0Nhj z+3)4|#w<+d*Npe&X>&Fonz-$0M%=F_iBYY)g63?RU)p{D`R1#IbK;I{ezj}GtmyUW z5nn>Q|5fA|$;(>QnmamAt`__B?uE;e7xt%I*fH_Wm3^wb%(Wkit}hmQ zz9Ijj&b-)J9e3v)S?}+gGV^NGH`{W7$>Ltmf0|$3wQ-uM<@0-I1GtkT{ybItWn zrzrhH(K9SnC>+%B-ScG6lN#HQWdE&K_I%xASu4LzO1|p+obxkg-73&sAa-O^-N)!P zCr>Pl__!qUzvi9qFE)#)`#qi99CqMX=TYMsf3|k5>P`5x#rtM=Z_gGPC#6}BMdclp zi>;z>`=v&$UaM1K!FIV)eZOwDy0=)a%Gx87PY4F@e7-U=#drSEO(s`A?z+Ho`DvS) zNY39mb6G`~b~lyIzy{7VMw zcImB3yR~=bj7J%}O8B2&W_I^(_7?W~F6XOp@2hV0DKY1wl=v=x5oY%uZe~?32BvH>`?FbKX|;W4Zs0 ze_wd+Rcp&${l4$-Wue8>@cN^k0joa(>#yY4=Zr6t2-* zwLt7m!sB&GY2RLWPIh(g+}gM-P(Lp#?8LVGZH3RuTMz#>68?VP%Peob)q+w*<{5@- zrDxjPpFB0Cd&)JL(-&D<^?aols`lP8VDjT|00qw?mFMRt&Dp>2%JJ_qt9&2d?Rz-+ zxZ#3ei^g|SKF5?|ViaQEw=kKOsV-0ZbM}z?|FngV9Iw0IfBJ8)_s_S}!hhB*vyPOu ze>C;Gd8mb&?^#d9t4kJk_N#O4?3?bMe_%ndp{Q8skNhpZ%9-z`9K3axb9(8dEJQOu z{LD6$q@+s{_w}2O-Fli5UU6~Gse^wrGk%#bo+xIt)-*&sOYU}f{?ZRKGZr1*uk=mA zWbaOM-y*XQFZ(u^>t^k`7kjAv^AYdM8C$;ZxA}Xtu1ha!pA#2XXv|$6qx}m7p!uoh z?~?}~!#Cb`Tz%E*%S|iS%mWXWKQq`GY$$D4*Qx&hvxWZtzuNA4w|41Qx9=#Qb?C2b z(vOmGi{z+d2LBJ1cfL2AJ8`Xk+1;eWY0SMvb){i};;L#sVyxx-+q>?cy^wJ+>1fvO zKURBx?3SOJ8_l@Xq$^~_#a$YAHg@eVKJ?=1a#gEZ>0jToJwCmf`o`MWW3Afj*n<~d z>BY^lpZZ|!`VU94vpv?nG4FfSHG8$w#*-~QGQ#2gpfRJTpmy7SxvAEVbs}`Mx>hrW zvwEG{9(~orZ=LM+3jsA#-ll|9?VFNdwp!zz+z#ytwR@j0)throu=c?i+I!oA`WL7Tut{f5EBMi}Z3n&hcnC zCwR6{?QxTNU#{oJIgiAYqFEQn_^nmS)4x}jQ`p|Qm2W|82*)kwrTu3vv$J00<1t&>NB?!! zye7vZ{*~YP8hLYDMc@1_g0-h(dAehd9XyjHvi%v0#oY3@tG}zM9Fg9u#-gu&p_1+L z4o}8se?lg0>N?LU{`}hGnZFNZ{Q0Jv^6m6$3*#0KLjlv5iMwR}G`Mej8g$2Wa#DW$ zo~`?SR6n0IGxV%-L}=`d;2RrF`#P0>U%Fb%E&chNZSmD9raHHa)Q#2cPCI`)n&Wp> z@JgA0Zs~-&gZs2H?IU0Rc=!F{9-D8G|8jqJm2z_V{_1=F?n6r0nYeH%iPZLB;Tv7+ zWQ#RQ_?G=$u(2nvsOx^(dUf};Zm}Vu^DcEgJ@P63ruD0Mn?DnpDnG}BEuZH9HS5jl zAS)NPVAo^IWO>+2=RrP0pC@YMk*z!|k3~ zPu)d9iB0~S@;_&7J2th?^io^@)32@m#pgf7nS8&Hz|o&};zOd#?js*gUz<{--sqID z{-jSI-(lkr_c!aaEd$FEViqs^bZ3T*U2P@j#-j<|{tK7fjyT4@ukpbW)tYaw3%Nqf zqwZQw@;h3;ImP+r$#t9$+ivF{eE-2H?2Wd4*_u_m0#5pF6EJ+lwjs!T}p*%io)G-rO+t@^^~}@zCiQWAA#a zWbRCVbah(e;adqYznP;aX;&Or$|7W2CUbX|+2Z399`eZ6eLH_(L$FSC^_=2+#f5zj z)~UZ+{Pf}Zhz)OC_Rd-y8pAv3v*@Hb)8|Z|vwr)O6DK@&O6)u(;#{0pUuQSDDa@$& zm3z$X*1|0%YJ2SZM(yKdD)8Gx^JZPaerq33a~o6Gaub*rcEIJ#FmieH)= zn0(xD%WUD<_vnR?^oBmZlY z0Ay61I?E56Ntw(f-|ONB+EdFtef0%q=c|C)Sv zZe8@Gw0)Ml+Z{8p^Z)wfzlSGhsVKUvRkqaEQn8HJM(zWh!{`IayynnmQ)2UZ_%Cs7 zN(#TK3SQq|RnK>gdD7?W zGoIAsE(zSjZk+xze$AiFU(T;TfA36d`yFU^X2Kn(eaB>0uYZ+yrF|X$zGHJZZ8OB) zM6MNH^z2lyaqgQgnfa?7k%#U>p?bUMW8(Z<)_xORZ??qV_K=osX}Bb73QD2j@Ze-&s5M{L)%~ zY1^xU$|GMFe48tN-TdUw?A6<*x)=TXwd~+L|Ee09!otp!lb_V4`@Ft7XSTZCaqIVI z7v*>S6I!>X#O0pZJT>ckPhN&!dsup2wxo>h=x?`WzWK+NmG4iP&zZGrpUD1wKC`d1 zeR==<z($7mh#Q6PD!r zX#Ms0r{DLS^Vzjs{GO=EqSNd2S6vK~)#%^hcV*k>M^>tq@!q%mbG7@Q{3%@qdk5dwgTC3S=1&D?@B7{0|G#6Y z2kV7P6*rW9-px3$sdD`T>smAOuxkCNn!kHb*v@P|JEQaBPqywG@4mp+0{pS5d13gp zZdQKXT=(x`#ijDO40GSlIMi4ety8N>2<(URMv>*Ok7m%Z3`cOi8e@*ZD^04GOpY~J1rP8Z+>8*Np?X{$s?bS*4 zaQ{lyw*L|Rue0~pLv)+Ir(?c9c4+AJQee;`JRUzo^&f%ztN}Wk0{Tw-#^~l zZ%sM$LEA;QBlYj2?GckFI&XaBx%pr4j`tVSHT~wCQfFV=&@0@XZtyc(G*tTFlg#Ox z#HA%OEn8enj%(XBxjie{wr%dIEn(4-9}0MuWyvNmzg>Rz@y~;1*XsXCbqkr8ytHrR z)Zg26{Z0E1gJn87rUy%QF63m5wogxYbhS3PkoU?aPGZ@HpQpF~c-0}er`qV@NkJD= zqYq!t?U|*^AG&?xs@IFMmffA*soA&8`+I?%ZNV0k9VQD)-d}8a6nlTu@|=zG?%$ST zpVF|DRed$HfF;1-$M56~s*|ULT~u1GRT&+&dG8C!UFF;ljxWtjKfhM%^=q#!SG`Ut zzfu98?pk^B=dPM{^VdhoCcZwHs`IO~_NC~lb(3F6)gM|i(R_2p>HL&yPZy{8CY^6v zVq9-4_S)z7z4MoLl`5P%_~a7X;#Jdc7Oau^_fmM9y>0XNd8g8^muJ5)sFbi4w>dKJ z(5u|YkFU?pb#}7cSz(p0>wAFh%`M^n;2Z6CYSZ)g-QPVYNA!Z3+8)6p{{_33E_(ap z+oL|kM3uVV`f>3^Oxg{T#hKqKe^~kQ(;Pdl(5;5iF}mA`$@sprOb zPu}_=xPH(6lMCZrZmF&1xW06wmD{TiSlq<*tL50!#n1ySFc#F9r(=awDK!EkO$d4&rP2+XaB#L zVBo=no@T9vPZhj8RCNW~@sKK8VI%r?^{3o5Y_As; z9M}4HZl?EoJKac`^^5EGx2deJn_HXCw(@GqUTuk}yC*;E_aDtZtZno0UYe2iuhxQR zkJs(ksU;%qJI6R^^{QXHg1|BLwE=V@*kf?d+5M^2Au$~>(W6%zRx_!F&K2HeU{%I( zsOpbK;ndJ?U;V`WUUS$M-mgD5iMMbmugi1SsLm=^rl7*tCyuaNZ>)dF!}s&tG1Wxz zjh612GhX;^XV9IqGi`rG?afDg!r8J8yH^NoY4?&3T*#}crNxo`#_*B<_366vggGx* zF0wqAQtB@!L8z8J*v)g4g2U8MPL zmgmOp`uC#Z|LiS3c}DBHjrQvGYf5Xr|IUb$`>peTTg}m3EUjv_$BWA=jI`6%TUR&T zLhE|0^)OB4J-zMD$uphjKTW7LoE==svQ^f_TXxC(`Z;>rZBpAeUov}^K~hKJ`OCxc zQ%G@w4|^H;OyTNxP{ z^{4z>KKIOI&lk~d#jiUSe%Y(YYi}I?&Q9+t8Yq$TV3;zwwrcc-0rOH;p&TboSPMGW+@(S7kn#pSU)=W)La&{ z6+13B|7ffW46e-ck(O_I zI(4vCGcH%sVh!)Ht@ayKcQ&zmc_~~>K7Mg+rg0UIHKzJ}L41?$J5CSLb{V3i126^mdPV#j|B0b~8SjoYv;LlXdO- zRQ-N|MM}_yy5COgLyxj9w3eh_xlzdT_SunV+wVX5-qO7Ph02r%z0wldzNIcU~F#Z=bcrWc4ErMFGg=tKB{MXu6S+yCf?VJ!B)Ob}Y?(a@yQ3CDyC;wQ#3*8e)EARhGE; z%Jtb{a*8gMlRhs>n)G?=M4n#ol!(CBpxW8ykQF){4pxUCy@h#@8I!=(HwrUnyE=pv zs;=G|%XG9Y`+3fuKkKh{cv$P@ZsP1Px(=Epxl!16>X7x0e`n7G%#J-KblQnSaUFM? zjnne9gbUODh1!a_yfOOjU1#Zb*`RyF!k;(FStf6}yYtm|@cm3b> z>~!%~O|vhFtUuhv7yj0rafapXR=tT}F9d!U-8p&N4c6YI!;9-rrRqzsshIZQNs{x| ztqUFAzHhMb_;^}1BSNv&TPjI!*AH9oqq`dp2ukia#wxu3-qNW1@gL8rf4F8dhvD`^ zhM?pxD;ms{dfm)lc>KNAujFmI?Rh}#iWiG7ab&HY^uJo;rTVIyjH@4hE54Z(T^UfA zm33sjw_Tfpwv=nL=~;(&YW78wPRV9p?ff%UQKNY>r_7wbr?V4^ir2@kbk%&x!L8^L zyF6<{+DpfcNo(EIUnk|TH+h`cvLMYec)r{xt#xU4tR+6ajp&#>+3V}|69I)UCo~t= zFbnaE306%PJlyEO^|h7dPKeXNRSaET3#=Zq$*ki3&h)2REcvdams_dz!GOnapKrRl z?bCt&W0ABe{~9DM&SJZ~e< zLjkbUa+gLFX2-WkJ#W+e&b9y2!YL1`&ui`pYU+%B8&#Da813+3|D}un?sf$4F1`L< z`Q@sNE{++KdbYd2jQ?6b-=cW>#clR8Cf7>^1YUGceRTaq=bfpIFY>&OzZEK5TDm>) z^p!=kw%jNQE73E%lYi!rrCGy~;OEyi3QhBU{M+b)WwY+_seAVSJ!!X6+xFho72LJ6 zV|dKUgUaGkUbGzRTIelSm+Na$y&_=I(MgYe4%#!O91UOmxTebbt&fHDfmw+P@8#`_ z9+f_SXRa~*0_V&f6}LA&-!)E4EMcZ&=8jTe94u&^}j;G(53 z<_kBPdM?$)G3xObHAIg8 zn4BC^kTtRSeuIdKYT}Zk(@J-B&(*vk=1{j!%-Sp_D*f?&ebMSNXQN=5-LZN8C5KZq zk6hToqPp`9lf%Xb*VeF@9+bZPa;uZf&FKpz&T9z2`L3M2S$LaJz!x)vusf}nD#RXM zUB|J>#vpdd)o7NxM7^-pat^30V zK2p5b5^g>0%RX=8lYL0*-4dzTll`U(n3m;8x1EgKVY+2vwZrR**bJ|NZ>*mkYmb&U z-{tz4nZGclS|Zc>l-=U34^!K-co!AuAJ{&Z_474@OXbt^j!#+P{?WG8|2k8VU*$YW zuSLr$CW!`@eYbM#e>A-#zTIh)UqwvhNz?ZFzLds=eWb$sVhUiC<>gt4StQ z)SfI?er#=SwBhl!_acm*aT3w0ms1*KUmMy7UEdvQ^XK;HTS?%MVRiaoGG)PaOBPu4ASvthy$Z3S_#i zXI#x|AoBRGvGjR2Rg0Yscb7O`Yzz&bE0m>alXJjsi9mV1{F#>z?rdV%d$RY;kD}v? z+`fe#d*k-YJkg?ZT0+OEgZUv`e>qFJ$sYZK>L;dN`TsLmXkKgi zhok)Kve;cM-#-t%+8Ww?mn~{~x5>22w^!@_H9XpMeSydy=}e6u)*Zp#P9BkOJwK}M z5lQd=ykxnNH{$KEC@+sn}7w zY)jRK=^o~9q9$7(a^eV#&dk~2^5o%FJ^t?k*4u*LJ^3fSx?b?!`lqGoa-F5RIO`I+O5+6+jFh$ zYLsL9(oNrZ5=s@nHwe$m{akQ9=wm^#Vs-pZaW>PdH^NI-dfjY&>RPu>S9ViS(H|w} zup^<$vWbcmCb^Dll9ethMXqiUhy%rgN1)wp|U1NIC9VsP^6J|I&5OUTSJ?e0a~a zUFoRk>||DUN@Nn;oNq;bw>V8`m^@dH_YAx?v$L_5Qb}e1ENH0X4%m3BK*AWc|kM=e_ z`uwkQo%ONFZc<-7R0F;)R0uz+X(BJK8&i?IWzx6c2Y%o7#W?L=E|~FI(O!Cva`A_c zzZYA-kW0HGmAUctnjPED9z1@Y^YNuknMdAKbr~PrJ5}&KkAD}Jh{#^a*w(#M zPu(iMx$)+E*TCgIOurkXq+RNMR#vaxy8hIv18obF<@{LBMfh;NSi57(xr3);-QP{@ zN`H01MDKv_dmq0!C5P9U<~leW;J&^K)OgcMC|_i7tou)exXw}2kDsPBnO^4f4N#mH zSXp7F>lppS$?@iofa*5ww52TH%XU_jpE$gDC2P;Q8GSpGjk3<&?9+ATXH>JXo^#jl zUuvK6-e);}GkUf3&VK&bck1}!OwL({HXnEAG!QZ~SXK2Gcn zW=`%t_{i?> z+*#o&w(z=!hMd`(!nh|(=S9C4&$s8g=3?HZd2n;G-o0F3i`9A(|9MobKbBO6n%qm9 z)7z@1(^*Fck^8AZQepeQ=h&{ThC_cZhvSN$DV%;mjBCj12r!9V} z8T_c_tg-xhHmjccAAu1O|7?m1;@2Im*s6c5?8t1VWY*^klMXLUm5Y1(`NO*z{pp*N zN>tZ9S;wuid(q41C22M6X%8p8a{qPj_3uX;^#YWXm6!6h2sm}jT4Mg#Sclc#pWjdS z)8Zeq`VNL(bYCiP?RHaUsz#>!su@cU7*F5edGkh?ncCA8J&9`ryLh)pPvXdX=yGiP z!6&C=4qcyfXR^2xhho-*N4bY~FBV*{z+1U`&-y}j35SI$Y8@u`Q>1u2)H(!$`se)n zy8h7}E%Ef#a^0THdSZ91qzX07Cd|^9`#@@GMB)3{P667jcTyWKajsKcqO8**;B-Z0 zFYDfOt!w1>p77t@qT0KjL$~#{lgBypMd$Ux)sD8=tr58Y%<@G{h(WfdXQA@n^mwkW zb+MVRRYJQ}FFSk-$}gIf<-J?L$OPO|aJu6C>5ema#TDxMe#p5wdsRRMf`AifHP#wI zQ&;&@y^r4|=lth0`F3r>{4Mi)z3m=-w)YQES+C5cc;u^pQCx?Wd)Tzqg6Fo({wJpY zMgQUX*8C3-%d;)sU1_}-+$LO*VHq8)7x6ciL-9zdYf)UsE|2B8h1TcK?rJVO$mSLF z{j~bNRLp7h>=EA`;zSG}5tf_jCk*Sd3^zz54CRCCYw3yw{Y?OTTYF^0&m-U z(jUzU|2WgO+5g)~o)=CX#h&NFK~eZ?RY}i=yB>!o9?mJY>&cv;-pT%bbK_p0_m?LG zh+Dk5GuyhorKsp*$-Ssq4ZJtDs>?0kz`yhNxqCJH%PnuRTHn~Qdd5uKs!J&s1Cw$W zWM1i>Jxg@c+u6AyD;6NHN`F4B?cv19FQWeSAOHRBNd43EDOYy2T)|iaulZfjw0r-( zc!%HO@(-u>-`-H^ZNzB1dx2i%#QtqFv&!OA-$=UO*jTNvdf;BH`h&UOcl=#9`)A>Q zucEBGh9XWe#gjfyoiImy(LSs4YaN%>r!lS2(&Fk`v>^9VS3#`Q@1#lRinO^3%dTVH0$cI%yzkP43*g1$bEVVjPOm>5{^9l~(LdY%u&237 zU--fPC|vvb27}GXADymgZ#Q~=+I7#jCwqBb-V$gI`e)3wZr?(dooO3tk7n^bU%8^p zeAa!N34V=NBi$}etPMRNb-wRzriE#KWR$oQN1@@Q&!RBra$M~@yDsQr@#^mRi_`66 zb|j0|KR>fHeEu|@zUvqF$2(67-+#`oc<0(1K@ne173L{&Yo>Sf-v9BnJ=CYZ z+K%7v&Y5pN|37%qyhiJLsG{f_tpz7)Dx5k_K}IP%e!ZOY`Q)z0`|sHPsk}Dl`;_Bi zX?^P2nHJIf#Z#aH@Qh;~;Ne;y<_LD!oJkD_kzPB*x-!N-y z-}^fGv!|2iKfOO~eZ=$y7nZ!Qc*p0TcJxhY%KV)TTMLtZu74x@RbQ^o$GbHOuvAE!RsQGfjXZNH=~yBzD6=AYQH zFu9^)0>56FaAc?9pB?#XoUhP)s`1*P}Pr|J`WU?_lp>#gBG-^||=^}}qNz@uLZU|;-Q?BeEj%CdB-X4|tn z|Nhjdv93*dcBS7UW^Uz;sSa*?KB|6yw&&1`>DR8mJKp2O5$NxEj=QjSg6g#OMzJ2{ zdD5m`3w1yLczspgLaAGjQ_*FvlBNEUug+G7!e_n`^HKh*xUZ&$FT4MwvYukgifqtk zwYn3CWyd8g;HnXI*|AQGK(Mh)btMVC(#nmh2wxSrh(Q zw7V?0sJ)`qeZ!m|+}`^ZuRhPMc*Hctwx`lxsOwSNx}SF~Vqbr{lD00lAkUU1_ni3* zKb5$dZ#5V#Tzy^N$Nf9FR`m8nbIo%aj3yfU%op+JHeb6d?P{2;-*HsxyZE#{pRb*_ zJ9|NL`nK(hbR+!(lmv}%vQCBb!)TwWInVrH2gsLK*PTDgFCCu{BN#1+;1j%Q8V zBItCbD9dowN{OjSA+uA$TIWbD;C|N`?BQ(^_4Lwm*WwK8Dv`Oe)sM_)7;~NeH@_CO=DUBK-iev7+yNmK1}{Tt`z@4m5>SuZ!wY4NEg$DF1tKfKpkPw?)= z9Tv`oO50+%rS>n=_!hEeqkZtC;DBGAM}>1E;=l0DT38qq$eq0L$ohjxXSDxr{O=JH z-Ij3oyPay~^7*$lGo<_unwm&|{CBS-f494ZnfZiy>kDCB}=DHi{w0_X(F?!?x0LPhvxHi|a~nLL6F2KhWAX}a*XtX!t=1=)oO`EXC3}NwgX*9DM^DyVIv*0a z+^NIr*j{VBxp}UyU-d-I=`j81?{&#|)y|2lJ{`X(vpRLvsY;WKCiX?&&mAiIl0Idb zvff9(NsDh6I$m6LgM0FZ**cW-Za@FF za|^52{M(mW*Ct-K<=+Qe3&1Jxt=(Y~+a!w#0!|#Ay>pMu&N&^WlfAWM%bd5{&wf5W zQ8&_VQr+=ssW<0+f4y|iqvB_0&b&7_p8sCw{>;ohvkT_--~MM&=C$Bz&f%zH^Q80P z8{0RZaN(Y}U25+lF}GdC8@s)}tdcPLs5Fl~VNqwZCc!{qmm<$vqFw6p#0zgMpKYqa5>>jm!q68#PDFYMvjTqpV^=XjpHOO>63>jb}^ z6rqfgf%?Q&(!pT6~zUNN}H ztp4aD%q7t;=la4dNJP0uaEbNh-NGFgl6rQzdF<_)J};-R%W&F$UgfVMFBjja;^I1R{=F{@1zPxT&ZmQ;CQD{-1>AIv{{`vEmf#T~$`t=Pf6ep}y-XZIs%+KS;S+4r< zZ25xMOmocM*zP}KzjJ1gLelo+saq!9-O9g`uPaEyPx*gWPr{z(YDNG1j$Pa$c;}%f zZvfvT)wYFdeQIS7PnyL2SA6nHt!L5mjmI6j*E(+gp3L8SUQf()!OO%WtN4@G%$YNf zZ|0^$Rz06PcS?NTlq>Pnl*73pxmj<*EIZW&{r5i#td!%O`Sn8fc@xLR6_v&dqYA#; zc1@nQ#kFSLy~G7ZwwM2Ci*&V~H@J7g;L4Q+oK0K5H+@NGla20Rx%RVCY4hYWeRCTc z0&I^hy1jAMJErfBZ;rG$v*dB#yc_SxeSN|8*#6R^u^)aNwn&zf(B3E|{h`lh#|Cyq zuA`MHUhX%}ue>2y*6`%Q>WXjG7m^D-UP^4#`t$Gqq1kKdjT);TR9l?XT%=*lUBaGi znRdB)!=c<8x%LOV(+@y2Or8#w@``%PZ zR2!Uscc1&6EGX5sL1IFK>BXN)XQyr4+rMgV>H3}+VxFMh=kv?1+o$yL(p?{goHsn& zJ7a5i;jvo+qS=N{M>o7WEV24nGq>y!UYBipYP%ob-ch#CM6}DhJ=pq?v;TxDL;n>a z=KJbJt0GlCbJo^3N6Pw1%t@8yXM7;%Tcb+Yh=zVdNY5(rk8wy)j z9E&Mbu6o9LNw(5V;M`Sfo~UJ9t&bkLg!o>*xA)G2SpKJC?CSNRA@ymOH@3P7%(cJY zp%7bC=@nu5L*=Ec{oF5m+qONCb8@Xd@#g>69lyJr3NwXsF0bCpzC4}#;n8xTN&64@ zPP`o%P3V^TVQYVY9kc>nrVFd|j4^ zSngoXSClhWWB(8==k_M*%o9JG+l+g~ayPA>`sV1%tfLWy+6%WFkYru^PmCw(>@?~Z2%c6k`XQVUD`Lt_7>xIA8tH#Ve`Z8;#(gw4*+vc9>`3F|*mRh}y!%=MJs{@iZcRE-fYPQhr zSCCqNJf>27+QR1Pj<@bs%oNV{61w?YLh^5z6K}rS9*&evtkv%?SDq6P>$sHqB8@|9 z_Ql@tLjPZRt`}G9J9Ee;KYj13CBy&z!v4uGC6nLXOJq!46`-M4AoJ%U-=7;(TlDTv zDo&QL?%4Z1a?Zn**^lk&uKO2s-Rs!+XuIKG!9DZjAIr%*uw9z3V72W4$CA$uCB_T4 zUSBwO#vI=Ly&k#FFGZD2>y{Ad`Ls2D^l?6*|XdmzE@6Md_B?ZezWK;->T=vr+6I~2Anw;8M|@K zjPfbxv_-^OUZw5)skVn{b0T+Iq15)Ls;Yfltxkm-7nZ~=+>sC<`|#(n6%LnoZHTXD zDc5HU82_$Z{J|M+k-=<9Q9eUM;;M~7CA>h`2*?&tM-9to**-764wyZG}~SINrnxjtKd_|8zB_<8O` z)_%ssFSFLp@Y65*zVXk(Go>x&`&s`U`SbArzsI}#=J_*2K!(rzTv#(}g=72{&WqoS z{1$C6SoB8h(AjXM{<_&`F3zhw`7Uzt^o3K8CVaWDbAM^B-Q`)G#Yy+OFHFDhyuUmHBSo^;K8;mb#7)@$&I^tT$+{5h9D@vVPfz1l?ebw5O=O7z~o z@HX~_uDx@YSI<%Nq_t)ftoQY=em6Z_L*%){&ELwGP8NB5o%ept8QJ2cpFdBU))u#) zSNCJ>rP|(>^|!k2{nnVbPipl>vF{IrE94Hy+%A93wdS;#^6q_c73vaVabOQ{&g%2| z)0LCX)Fa_`m^b1qQ~mM&4{G-lG};UJ?Yg#o%Ug3SZO`A}^}*o>p7a%byxL-Zr%#Sk z(Rl8Tx&F!Dzlux5is;rUhutmO;vw=zZcp<01bJ(#f1gaZoPMXi$-?Yux#k_)|6XM$ ztamTB44-kfW!(-@+n^o+Iit(1)g{(``R|VuAHClaS|_voX?w@geEY-9vzm_yyS)&y zzu7wf)aBJvn=PvCx|RLU7;SlEDf%MZY_aIe2^JscmAd>?Thq4sg1467E|*)Jf7Z!Q zv@8>p)NgeXbU4niR%-D_vokk@Ozs|&_f}w;V-#;0Jww6!yR|bG-=Dc-Rz$Yi zmalI+ww<47X;#x0cgUneHDdO=qdZUF*<8C;ms9i1U#WVZ@2ddq;$@#dPn*`ZVbO^Y zp*Mj`wh1MQEHuB@WcI^i=H+$Q=IP#F`l37U zFh9S0@^ZbcodKLDSd5G>dboa#?lf83c0}8veg5Hc83S#BnU!WvT&<7p7_aVgy*T~8 z?+UHX+y9*3^z?=8liQq9q{4V;$L|yWmKkrKvggx0)(ul+7%F+5Z`FSwmalqei^%%} zFSHwOP9btM_%;&N<5}Ec#-q;gbuSm!I>QcjVMjVeuWZ{t5ld4#ad`-NLDx z<@lhl;J}{)Z)#^p-ah&Usn2ozzN>0gD9_A_!kTBc2~p2dXMA0~Aly*G4`H^XpYhA@<62$F`sv1YwVIYAN@tFlPN3w{?piK>&Fj78N79i_c~(y4%_mC4I(uUd ze3oARNXhv4#55^Q+mvq>b-!ZXddykBrRGnv{o&jy;fc#k?p@sbqF1_rzjkRsbvBMZ zN%*;a-C0{Se$>`pK61GyGQ6|?%juNocj(xPsMc#2 z=k5-&-XyhHqx*Vgg_3^b<)RPl<&V#8@yd(wtoSVZVi&`5-sxw?o(eepS#^gaXe zYjG9L?^0S&8@)QeObS=v>?xyR)t-O|gZ=+}hWM zH{+H@Uebd%^RzSS{FMFgr}@39mRkQ`pr};X?c(Pf$qSBNTX6ID#&)&6-8YbX^tzmy(U_I@HPMAo~N&E(kISyc@g&TWen4qw~UYugz#w_b^G&A+&t7fa#XhD zSZ;cq_~u}1-4b`q{zP)3@{QuAmK^cC*TEU0?+>rYJK*PY=0(?}Y|gbi`3yfO8?Dt{ zURv>V$$wCXVkU!?n(CQlS&oNToSrRlUtvA>8FOHra9E{uSvBv%qp~SwTNC5Hx}9lk zo?H|4oZ-IPFQ&wnMjN{mPRx5)Q_7y5+jn|l_{TTj7aV^y;gVre=#RhuTgyLvJy#m9 zgxMMS)Us7zmxC4Suhw{_C*g{Lt#NT|C*K8IZ>X@8z2dxFJm!_ezWA=Nln2ZE=l`1S z>DMBBb%u7H%lSPH+aA9-l*xa2;nfAAvw!S8|B$ETf%@+c?p4d;n=IrzY|fs@Iu=!H z`{;*q3g7&DoNBjw=Zj{9uKx5dW??{#3(Ligg}m3bm*u7D8JzK)b0>^dxoFqk37Sik z1s|SbHCSlCd7p9OYm*q0Oi6FU>H0_WYsKRATSLtE-R+&O=M*tHT`7Ij`@1`f^jFXM z;S)0Np8o{qADI`tvOYgoz1#0E8RhBu@4bH_-zVd#D{E&rz4^`alkvmt!m9qoN3SIx zF-wYw-C=uI`2PIM`;Kr{6>pJ~Dr^@&lIRd2t}xac^? zHn{)R3H1H}!;R{~UFL#uU-AweTVK%rYr?+Hjwwp)jhD?NWZsvJD`&-^zm?HhqG<-3yy=&F~ z)ywxij(mLa;;VJ;-*J3h?{R%!2#zT7$M!=iG*XO(j%CSG`b@yHU+ zJqn3xN=N+poDNs5*%cV`yk+kT_MnR9xhGPiIdwfB^7J^8Qw_1L`^J0g( z->az9H_letZmDb4vN`?!O1llsez}IWo?#iTFv7h_p7#?$uBrA z_GnA3RQ(SAz$-10`&l>FF{g#fBz}L)|L&l7@9+O2vF;Uj=SF-?GjV=$=(u^p3t5Zi z$>r5tE^pkNLZ^0Y=)1r7`4z#3Yd*SM(7OKg)T%n>w5v%i@;kDbX!wkKU%=dzgl`Gv(6!Ff89CHeRMlPcM( z{CsmYms#B+S;?p_$@@)_n?-y-3ocYjd6atR;>mqS(`U=~-u!LG`1bdjpOVL|`*`A8 zBaOPM3#{ka?p(;`b2_F+GQQHi2gu%b4flPo{Y=q4G}OmX3~nj z53KGSYu}}ciT-r5%2j}7!H9LEwGq##19esU1_}6o3Vck06G|wkB=`ITc=9Eu4 z7e7a1ZhVKtjMp6bb=DN8SNb>FFv?AbMr4@xAix>UVcd`m$z=d zf4&sGJA36B+fk8o&wiLJ{d_RMYQFr^&&AD`ezJBp?w5BXE%>YtaFkG zblJkPql3k0*Tf62)b?DD+BnxH%%eXsrc635M{w3VrQ>`Lx8&;QY)|{)<+R#NiQy)= ztNQRdqN{p-wq;lFW9}d^si;41Te3>;{JpPWZ4u_cWbpj!^PI?xpN`HUaqU+NEUOAF zol-s?=X>n8RvI**m>5y3zi^rLhw}Px+499Rtf!n~Pga{N?!Ce6ZnxyA;@;e6sz%n^ z9zW zNj>NIO;1GW#p(A-A%-2rKW3+F7W~q7d&9LmoV)jR3a?m{{o?EG3qtqR?_T%#v1;v$ zz5S0~uHGn>UC3`2IKx6{gU%Z54SLZ%Z+=xhe8h34^si;MSXAAF1ust=S%0ET?LbGO z$(@F)Iv>jaaJ-+=y`v4a>uM3MaZX_A=k)$J2XB5Cc=x1k!%m*;tEC+-(FZRv9GTE%0lIx=eMLeMc?ns z_$@Ot`LOuAprbiHGg&WydW&B)C)(auD_tSllR6{R^@r^J19B%~x4)2|k|BM+H88yW z@-lurhJ zzx@k^g5TNc@0<0Z?e;}w#gt{j+dpT%+4ryW{n<39@H<^{nrh)Y)r1-hv`*+H}XP>(h zbo5lU*s-9aF$(<;_k3f$^Js0$>}ii=fAIMg?Fp=W+#Ai^$nY{vt?v2P2TKoh91|#E z&)9>t@Avo1{oC#ZR^OEWazy<}TeHl1!hXs5wR}-xi=Ilen?YJQx#({{&P`(tO-Cb|?!>xb$%zN=r@5E--d^MRu)KUaw?yzLR#W8gO7-I<>u zR{INP?C#reM(J{-irJVcf4tP(m+U8AC)KlS^~LtO#`Nlr z0M%J~47LeYcKuS3KVQjsd9`%h7VXYx)MmRbdNDOP)_NQC@A> zwW(rmyZR>~3tjg50`qqlc=T`YnDpV9^@UPKKk0At;ve~Me|YlsQGd=ei?SRzmn1P3 zYQFxXIVDLauHEd{=gxD{3RBK8i!VPXt(Fq|PWqS;_&V{n>2GDpts_Ilnw-QV$X`G?#k`T}ke zCoTuHvQ_BF`2Q<9v+R39>+KD<>l&t?YuL!M`scAjX?hHnU$o}^mHQGQ6J+JKhHL-- z{U7}Nn9jyVS#CNJVjj0jTHlaG`d)YBZi)0Yy8aQ|3%Qp}_O}u3DsH{>Ga(~mz5Poh>gaESRni-T-9NPiTkQ{+v7|ySh^gwu7cPZh z4|kR@kr1tJyEIcTLeF zh|ATLiCd($Bnj{TZaJrs?@x;SKacY!dTho|*bn3%e`(t%7Tqs+yCbpm;WwXKS0VzU zT8;i4xGZV1mQ7ddTm4#XYOFvIO6tl$2{&s`w z%RfztmwF1=>`l2!UmIp0`>@AA%GTmIdxOZm1ofhuVNTvb7KaxnTv^;%)9fK_Z^^;? zdgCj%!nwj9zswi=)TDH|{k_;i{abB{w*O3gUhD^dFT!rI3c zzvrEM|2=e5?}u5dFSgBB+WY^i=X-;eeNW1ICNB5nUp7H>ae|n#i{T+3#ko#%Kc#7M zTeg_r=nt)DZ7UQg&x$jyE@WS?xaG;*mM7dhBxM74iNzicXvv4I1vv21%Fy}m#_tcl z;pg;8e1~SyY>h?E7S-S8MzuTfN<8&k64n=2ZJSmikbeHhN24MJ`=^OV)*bbE zcVx5dh3t!;{1VQF%xA3mb5FK{cYC6)aKWGU<@26L1VkAJ_T1aRr+d5k{f!0F7hjF( zmXtasd7?gG--?Llb>AQHh+1?6X{5Qn{L^!0*=L4pNn1LO*qeQJ7593suR8ZStaCbZ z&bjMabN2^aNZxqk{^Fg}Qa}6H~(%v>%ZFWmjqD@|Q@exp35!V|E{s-WgjnPQ9LVZLQ1cJsp?tcB{0+?UuZ2 z-(YNT?}jU@+u^4j7w7I+9`nGkI`TwMdt5#5u6q+dKeb|&w!hfNqkFU`|KOU)u4O+v z0tAgd8okT-c4f=5wf1sFKNRc=dwztSxivMTt)!Hq`onhd81EBYT*Z0F zx~cd@;hcxUvjZ>vI9%JYNbSro-5Fn{4OTzm*ezdQz#pfTQFrWPpYq}G#A!W`dZG7~)-K+$VW&p!L75kSI2TECuFX4Cy;k)0OruSLu&$GD zKD6sJv0cF|^_*$&%_+rw9f|Aq%CD~Yv}j*<`Gff$h*6Cttkqdiz4v zeg3=FPy7%XeX&~p=;iQa(`%39Y8GwqGhjS@XcyD#O-E0xTQ9B`aUkaU{LN_#pQam4 zEN#)h-=_BY?rz=_ig%j(7p>hZy?Uc${{MS6;kUI!#M#8>>(1bw%in?7Zz}F=zBR@2 znonx*Ge+*jA3x^aSGryQ=$TdLmgPFS8ncBu63$t}=GqiXUwFJTUOV%`we8Bc?A)K- z_|Uq$#(;a#FFz&UuRGS)@>M@MvLbeY?!JDH!wNU2%OCujZ6H1E;79q1x##b$eAoM{ z!#Dr%nzaYtawKt>w1~Pco0QP6v~?=SVvfBZ#kL$ge$vPG#-2B6O5yuOec5N`9nP&6 zsxJ6*?$d!(#S2;Hi+}$#rJhgdGoS1?PJ zn`uAy`Ieh;xo?jjOP5sL^!)Y`zO77VMQgGrEpxpXzSenrykhZ_0Ee~O7nYrw^MzUu1+mGbLvjz#@&#qw3-c{=Cy9DFCv8l&U*qo1EcyCJeog!-0ZpKQIv~O-?RP)Q}6k#cp`A~?%U=6@7Xn7-YEal z{lX*jWYfEif6kg08W~kYc5r<;B~kPua?hU0Q^Y_saF3a`KjwUMQDlbp##v?yU3EEh zq87&3l-lL}etbi-F>Et$_Sw4~w(&>h=9QH1dG?^(wsZ2gi>uZjj;RzsR6F6#gNi7m z1$=28&;@+WzBAdiE-%QOIX&^(`lfkrZ@g{xIM2SAkfBi z?)V+Ak&wEhT`MEB^pm_~{G*|+b{{phnZN~ivC-|zG7 zMTLZJm%jPLVOu z-QN_OWv)E>`e->zTA=9y7jHxNGhy?cvkj61_iS4~`RzH$*!+k^N5%cOd{;=+bBQ*{ zx8i?*Jc(Gf>~8;3iSFwQd;ire`YhJLlzYmDhMb?}@zod!mcYFNO;KX-q${P40w!*LGnK{{=Gz7c|UWIIC4a=+4UX zhJITZeWj23@`(IU2!7nTI8%AY;mJ}fk@|0skK^vYePJ>Z+2HeBNjF(FESdSFQkN{4mcRs^f?LG4c}Me^b?OtRnkP^5`~L6m$4{CWKD_&S zzpzR?%rsiWD93$#_dc1;FKr{9n&sW*Ke6YV!AxiC59bq@53fnJa?kAS+A6UysV7u^ z*^68Im%O;uFSJg(^^tT(&R%Zi^?H#Uu?l;cYJZ4yWpW10U)pl>+0&*L&Lf95Ykpq) z`QU{MNz)fw>h5TsY23H8V0KZP#_XbVxu>RtK)Q2z+jtgN?fT6+#dl_>=h_3OO;c=3 zcAYsXa%o~mK`H}h$ppIumuD_|;w*L6e(wvn+^Fig;l{I?d;9Y0N7c)@?UgTRP4lza ze6b@==Y#t$uI$gpg3dhk{un*~=yh+!tG)T)r_70dX_%^z4S%uRN?uZUSB>Ld6fCvpH^Ju$GaGPlJLXlbz0{p$j{j8!|jz_ z_2j|iCFM1ZU-JJI|9S77!hTHQtI^E6{tuqse!k%90$0_#Pde$oB3;5PE6=Y?-dPqU zINNTXLZY8h^FNW4;AfpbuT(OCrVAJNbay0%Oi^x+QY&4-rLw_yCNpoi+0!|a87Qmg=Uq(=Fvg@Zx~&a+}k5&T}um*j!x0;PH^ROlf+q>K2t&V;e3v+gT^fH*Eem zx%t8dxz%|h*DVG8|7R-d%b<0ej;mJ}?us%DyW^#yTj1undOvG(*rvUeHA}s=3C0zh z-ue){{DmAg+AH!fdq|4nYrJlz)Y`<@>En9N=ClATL9 z($DV;ejTuaaj{M3l~Wh9*B|fUd-O)q{*x=;gXK0oH@40=Ik#dPbCqt?JZZiDlWdw81d zT%R|$%T0m*%|TAOFutO`Sszh(ihj;1}@S;B8xL?Etn@i+9bBvRpsBtnfm^- zq-PtkgDTUV+cjTglwM!_`|gjMJTIPRY`vb;)>g>&>AG-gaGG2H(WLs>zvDZ7c$K_n z89b6U)PDS+D`XJ2_texLfVl$KiVOY>U{^ zjr@CN{66F7@O0~pQtgXI`j1M!D{(Hop6B+R{{c^rxkF&%#RAKu67_c{Qsf`rJnfWb z^W|6eg|B^c>aS|v_|aLGlA)Pa!<}|E$mFbhOV@4ol_moGET{rhnObT;hSJ^omW zcDbXLmA8A_I<76As&}|2|Hz8CrVo7&WU6G+f4KM?_1fQQ*T_1w=6+M;e#XsOeH(s% zWdHtPY11=xkD17mUl$UeGOaD*c3UC6ef#H<$19F*47=N9_DiSiyot1*$aJ-fX=}7T z^u5!*6K)bv`)$Hu-5;BT_Ld2U)f`rtd%t;lA#>?xQ^py`EZ`7Dw)R*hUvbHGp-ON|!31PZ!74C&m z@`ok8=E=p}oB~;+c`W+*B**oKbM~=oZ<+n&T>7~KE6%E-POix=U3j*|{9Z@SPoA5M zPxDQ-i!5HhV|qbo)0=niS4206EHAQK7ZEnc^7G2ir5L)w}fr*O_Cp z4ZAPzaF4S(-^BXharys_9DlLor`4RH)BS#(bLfuk4cyAJw?we&Y1Epj*B9(&|Hx(A z6Klx5^o902MUl@1QF6geO9Ns~oLPQOd-kFe-J3KW1CK91YwpH6>sssIU&=d@(+lkX zS}Jyy|41~tnSJ5X)XEoi=`$;XgOr%ypu8YH-t{7-h)Bnuf@9l~bmmDLfFr&=X}b=~cmf7X$)l)xBo^ zbMf}9=hqHKPbvJlyKcU@zO8?_L6^qrdlmBa1;<}`Un#Ubb87qD^VYMx#m=!ZbG1JD zv!LXk5~zpmB7BiW{^#b}KhNWz{ImPrCwOLahrymD{r`Xa^L-MJHWsPkpQXfcbj`lE z`wM^Hnic78II)!f!%g{``TxJKn`+$Mw<6)QeC@3L_5V$E`lpLsad7=P`{!@!8_Af`9_{*{x`=Zy{pL{5viadc&oVT03q zr`;DWu00xaal^b-Pq_cAd0*kUUFGH1?H}uFzwjk-xYhrv|8Zrpdx1d6oezd~pZ7W1 z{Z*g;eCvVPO{@=RsUGP*y+J%Yv0%c=>3@2bdmWaQf4q2q>Zi;7|M~y@4R2?`E3*ssq5%<{A_*C{jv7{?tYuSjsAaL@4ort$?^)#B3b#01WWyz zU-1>XtOwgCOj@}7f1|yP(DAnxK54sZ!tWkpulru~Yv1?fHTxV2Sq{iAU0*A5L?Ya0 z`iYuN7d|mBaMkGgCG+Fi{Lkm@tqZv)s$8{SI&DX6&j0298z0@bJNf?KKi)sD-p^NE zc&;Sy46E1k^Kvs6Y<+FHOU*wuYpco8*&QmsCAhDIL1*+9l>B2-n=!lZMA7m0au0c9 zyMLZu-c_XRSKGp0_e3J~yzcYM>t_h~eo(K!arWtBZ?AKWZ2z9LFO7NO&Mc)Gy+bw5 zG5z`FH@@>Fc5-^H%1eqqDzQKFuj$==3zpQ#u3o%&OZk2ujcqe`H3eTmyEHXFy|mxdzir#h&}g;t&mXSGJy>R6ufF}-|2gl= zSKe&$mKF3XKD@O#CuY*Zbyt?Es7&m0JpI}G$8}k;;xK2u#JTgWZtwoH$vTp+;fUNn z)!Wro9}7KG*=Ghk5-9!XrnUF*pH=(S_t(v9yHpuqwZ5b-(J=krE2G#`&hdRhLVD5n z?i`%`OzY9-p4qRS?O3B87SiRRevEbDj9ZU__JnXV+cl&-`LX%W7YhZg2wCgNQ*3@! zx37rb+O+9gsLsi6A1{f1|J-<0|Koc3TfSLdkH7c5f3Tb1)_;Ah*XP^spYN^z8rWz5 zAyDr9)Dsh*|9H+Gr@Sb%;PL#w%KL3&Cq>Qijh2?IeyRQDg!Np(r>B0~pS*uh@yFBa z|613}dpP{uy63}PQ`A_Qi-h8}sea)s{eT`d@h3<^G!QyZ=;h|3kUD=jZJmO};w*JKt?-I4!xo^4-Jwhs*yur?_aI z&fne7U-u;cM9IDL&DEdvx%^bW&W_(?U2HphUEHzh-?ltqiOPQPDqHI0n?Gi|kFkGn zyd)%=U3vNTde?tHKG!^49m})Sre_h?k&W{@`Mg%l*;LTBCC=3~P``7Db#vmxo`v2#{e~!oZ zZu)F(pL+NG-GhDgf0N5p{qvRnU7Y*p&GhvN%)4)UNB-Z+zN4yE^Z(b$iA(0EJjf7o znYD1{HQleLBet>Jnr}7dyQRxh-aWr{yI=hICjZI*e(u?`0y9(hoUFGNWwn{PV%Nm) zdzLmT^V=WTZ*!@U{mq@LeLG)p-}yUF`scmX{st9~bl=p@X_u3ofAvNs%i~S#Kkr)K zKj6H-s)vztN9>zlmDf-1;FseoyxLoTc$TSY$KK;iot-k(tC-USz_ByRWAK%lfQmvM5$c=8so0Dw>@fP(x(_! ztC@CQ2)OEDvAKWRMW=OaVOIQJ&x2 zyeV$Uu9{5`A1HfkdtI5ZWYWt$`!7y6+kEKF^Yr~MEmpg&GGCWA^Wtga-Tl5g{gttA z?%h58J1_QV>MvoQXSZ{et8e_S(!Z5^I&#tB2JWbzQ}?|6{_bh7^t8a>H50v-aJDZz zZzL%2=H^olef!TsC-?80_j-Em+{5gNFQxOA6ux*~^KxouWVfX!_lJJlWB>QPH*^r_ zTl;L+Zo4D$b#H`Q-2ONG|KU4twSMZPjZ0L5L_(iSYl(0R2xcuYe0BNqUAIjK?rY7R z-*l;R>F4J&54^uWeZfn{RYzPc_P<|t>*cqumHI0kghO@obk$5R9s5}PX-(53-tQmT zUzdGeI`{OCx6AJSc`X0e`t5a_19P*NNpG*HkjqHQDm*vI(c1NtpvZKQr}t+seEDL> zj^J|t`HYv(C!ZDB&Mr8`efSbWlWu2{HL{i*d+&S{@h7S{FRis5g0DLhZg z>s8MZg`mV>tJkOI94K>au~}3+=jP|O`~JT_XiU7c^oaNLiwpQK&GVQe9IeoG?Xz|L zmd5M$zg54rW^Tp4#z9sO$68+1LHD*<-e4u`aBMFW*`` zC2Cgqai*N4vI3dT4wp_J&No}%KHm_1dTRD-^>Z>;r6YE46Z`(b@z!$d>XQ*iewA+B z(H@oYnITy+J1la`-zVBN-=D89df}n1yIy{Y`Fo*fUw$$w?4GSY@6Cc|&&-Pt`<533 zAB~$=u_!gkZOMWyTrM3m%Uh#QM-#$tvDJQ6RG^+ zSlqJ}#$S6*3b=-G^eX8v&WdyKJaO=QP|wcgdKRtM_Vm~PxLqFj^;Y`N8~6YIe{;98 zM(pa|A0N-pto&wc?Wyp_T0%_F(IF(n!Es~U_G??WZ4F!f{hHpkt#9|Py|(oGwy)c+ z>D^j&{dLgV@6XqXiiS8a8op^#l)m}-&2OXgfBtbebui9z;9xxW`|GE#lb)oUoB7uI zzGd;VGtwsY`!o_4f7%soS^E0$oo|5?j`Z*e&8xA=vTL2EAbT%vo?cbYtXFPFrt3Y? z=H9!8&q`v+nvztvUbnY9dXxXA zRYx68E^+NKb+|45s_Rm~^~Oym1x zCt6>k?A+BD%SD~n-_>j{es|WE(OFaOc+bkZMbCo#B1=T4^W8q{UB2$XdgdtE`ByW} zSpMdk7P9}$wLX?Zc3q3)o_)2+sAjlu#Hk5lqFznech zXZqPG&-#zMOM50BRb;x-`u*%2g)2;-e61Mw|6jn_)AQNr+-ZyYnt<-EuDWYK_cuB0 z=1k6^bY!>|s>e)z5mF>5R-wru|cO=kL1t?ESA5ZUR}x zi>JHHFg|uY<(0F&Ngy9hiv8r9wKrt?$7V*EuSse*n)Ors zFZXG&vuPP+r{5dSgRKS7{{Q~^_fJRKY~PA%o%>|iGsB>{)q7gOyF0-eT{#bS#@|05 z99pgCR5fGn{3{Fk<{Vy>I(@^NN2)qAjM-+dZ}VL}?Q>%8y0EWbKmV1?broOgI7!G+Jec2tct3=aVKkm@Zbe|;}+ghi~S2d_# z`&yuA+W)ZYeSP!B+wxBjPA``&hzof6L@}rEnP0E)tuTkF|2^WTO)mVm;0wpXDU92T zH4fVxmdyE{aAnVyBa5nqYmORC*{H`I_uuc9F}qh{%ADziamRi>Zk4dF+p|aVW%?nr zF8#k>>egvj&b7|_BYeC6US zlg^cjSoWqQ+evL(_vE1b-(LPE=0#7{`D|UP-@4mWJ~y`6zf(L|*>jS~gA*3|Upn||rwNeg{hJ;~?&hLX>VOMi53 zn3QnL$9^g+`^;aD8B%pbbN@WqHn-;g7nZ$$+xo85x1<}E@BbyX{{QCB`^Dc|O;+a1 zRO*+!U)8XC{mi2$g2LDPUD%i1-~5qVKl$U7Ny=3!MIqb#>jOTmSTW~(`1`%{rI+ta zoiK&Z=h)B1?i(kj%eVZN$d{3P{(H6UU!P+?=g3Z$R^4pvIZ@SlmqIh6--`3xtClJH zXwCO>{K9-M^RwL5?N0qm^tQf<`S-QjTf<49?)Uy3?~h7d;`sFJ?#cZ1-##A5<=?FN zMQ;D!XJI*Ba_RqW>;Jqoar=xdy1L!__p|)RU8(r>x7K{GtnNGGkj>9<%3$4} zzlUS2SG`_2H|gu%>7U-8{(gpiR&Lr){r&x)7RMLf=HKsrcy0N|s?Bpw2fd0`Pn)xS z!iqWV<+n5@l?B{h{c%l14$O=|QGSN%9NbKbw6 ztESS{`>&L77@d>f*?3LP;n+{RG9RIb50(}ETWs6ir&1=Z`z~#r)l4=hu=oZ(l3_e9(A*gC?86vbB0VN{5!% z{rJ+WVbQ)m)_mf&{r{!;zZ+RFO?Z3zo6N?>YjO-nyY5bVdinofz5R8^_djp9+W0Nc z-E-N*?RBN{i~s$OTlf2w&9ys!^%yPdd#<$m?Xl25;bSp>TIJCh*Y}=Xkmlhtv%CD| zPYwUQ9maRs)hEa$gg@qz+Fh2arP`w_+iiNwO=bD2lsWH(nb+DXJg$*9X5fhKSgoI* z92Lj5TC3y7+L}L!hUar%2_5M1OgoqT^bn^ZmoL{nF<~~=n%L=O9Y%-59&DREd*+Vk zfdRiR7v=r7zy5Fj6A{m8G2w@2_B#JKIQ!cTlicfvsuv)U|?Cl>9X0}&8 zIh*y!((IVs`{Op>4sYD^bMEV(m#3Y#*IjDx<~0Au-QLnWzMn4tT&J^rS4*-@_r6U% zJD2yQdKAj#wR74&Ouw9b|M5C;sc$t**BUR+Te>$*dh1s9{##XBy42{HC*H@XrXEvo1C+_YO3t|IZ|)B}^(FEW{}@2!4t@T*$U-E5w$NCaycZQ+Q}PZ@0NP?RM9-XS5rb*B0}z!2Da-h zJ|1iHZ3XY<69u;(Rf&Cjy-IGL&l<_~ac&duwsx?8o3n(^OGaLT~Ji>)eF>h0RPQ^$G^#hSNurAW*B?V7m0_xA+${IyEgR%=h_4c=F#Zy&p6Qb zA0qZ1+EBdy;jH=h+kc;n{*iojUc%}rMXz2S?x^_@e(n2>xrxc2dcS|#tlAXX|G!P$ zj<+G*?E0SvN?O`Ef6o63xWA2EAgk$o+@Jh;*;h2?mWy7m`#$|f()|bf!^+u`ZG+Bs zsn;LA{kBf%(9sjc`46PG-*;W~(CyzQ)9vq<9y43BNXxK2IKA(|L|tnu<}E?z&O{#e zsQF_u|INlw+o{@EPI?qho9lD&4vKTABg)v<` zOKgFY-vb<-Wu;KU&W8J2G8)u~7Hx~5a;(5mNqt{aXpu*!n z2Q_%FMqFOp$*Zljf8|!=g`$;5+(Z;!T~G97{AMI1CwuxA+os8SN#Avp=hg4&TI;GF zW!0hcc4u$vwZCt2D!Q#sXQWLLyL@p^SM14i#{TDzRo_{@s#NFk+@@#G{69Y3b2$|n z>08b%6pR$Uz5TuPzu44sJkh#{x-E^77se(#omQsOdMP6q!Z|%|j@-pj7bgbmI|Bv<8 z{JpsS=U@KAHGj_B_Ssp-`C5KYtN)_C)~+rGYxMRnm@`X#|GE6Q74FP-|CaDQeqdkp z^y%lHzmJ7mAK$dnSu&8ZG(YV74mqWIx#_V6GuoEtKMOzq?$sMbqg|0R_IB*qmv{bo zbmHsNHs2m~or~-4&or}R`j(@&)t1WxR(Okvb z)1FL;{&!^Z{qW8!>z|)JF8}D`)Lz@~=TuhT4Ai$Mtzgw!`$X*9(tqk1f6g4<73==t zRCmv3_Gv2)U!1Tk_lQSOc9dayujGJSF(xowmZFPh7$~zZ*;pH zkmMfha8}dvs>ia!ORk7mMP7PoF!9R4MV(VWH6=y}-M%4sZms@~$vvMH9@jj7lrqO& zg1I57yYSi`zH<`OmK<0#xkGCP&jaHZ91fZu0qZ0puclZ$a9sE-;MtEUi%hRL?ON00 z_$-%2_(2KZv6ZG9b#Gm75B`63>Gu8Sok94}$)4Nw$9<*aA1vMc{_*;9ix2z0tJnQ( z=eKG;qPXJlF~dU_PJLRnthRsg7PnQaqIOmtlxSPE{?Ta$HEFYEKOL#}AAbb2_oq+U zIJeyFiu^^-S;5s+RoU+OiLal9O(}K{TIl4?CUQPyTHJrpbFeg1db;)noSmD z+$sCKs$=VEdzD|0Ezd}PWVvdc_+#d0$!GB=m0y4R8ui69)?wRA)qjuMrZY4y&5%it zDbzN<|I_=-!`VOnw#mu0z6w+dlwEySOMx5iltSK_b7_q z_H>N>enqLf@~m-4j@XKaIv+XRx2GPm=}FwCqkDF%OZCs~M(4_vAMfe;Y#Shu`Aj$W z!KFm5*Y|Xv+s~IdC4cY4;$^qr&f)8DE^&Jjl$L+6`NXRQE11>Kq$QP_Wb>VxQ>n42 zK~ax=V}S0x#TSnJTf@!LmuX&bd5V_Y&kC0RM%%i6@BeE3Dy?>Is&G+#|EB}H_joT3 zHcZNFJe>J{=blB2CMjP2`}XDG3BlD>zqBt(c9k#~b{w_eGh2GOYQ)dy^FKG&|JK|8 z<860Ml|;Uy+x5K%fB!pp#yVSv?Xt_cSc8^jPuFkGe6O%|-|B4nxh}uWru~2Teb2?P zGjl50XLtukY>Z~@j93%ie{<>Mo}SO`ORnS|l=~_m8QrvQnvmS|_K%m(Mtn=jQ4(`K z+LC78H1CLjpMpWzKWnkm8_g@~+vBPmZ(qGBxyia}$KBUP=iYx0H#+BiS3`r-jqg(C zt%xJ9Z|7dwK6_>EmIrT(b}!o+z4H2{9_eW|4@`u2PPyqm;Z%b`_KjWty}~(<9+)-# zkZFM0zSG-+#d(rTd6!=?Z7RCz9;;ALQswe%qh8|tQ(N!PI`*txE^+o!3GcsrtNvR5 z*mCgjf<@~V-@UZtvelui!?$whXKcN_^4t`Iottv*|FGCP=hP`7qpQ{{fB#t*vpPB4 zmPgi@tC&CcqSWgfzMPMbi$48u$WwmHa_hqh%ltGIKi}lbGCg3>#F^}KW#7N>d9gbu zp3f@VnEcrvI-v&}N(A zW{|bQ@9(-c;gl-vmF`C8&$^jP^Wottq?s_P)#N_j*(nJa}X`>CfB{ zBA_iOF?)9P{maX;Qw$RV_%|`ObPMgCTe4-PcyjY@U8iF|Ye5~bee7(T(q7$Wy{ukg zx%%wk^hDM~ze)F>{<)y67x(+f@%{7m&7SQds4d;Iqx*I$7He+qKlIK__|X*x zZ>`=Mq01UVVqtF#CLcX;ZLXOScTG*|w#KJl**0BcsccHFP+u&}_vX;-a<0kUtWhbt zyD#5;UTczUJ~MDbve1GRWpkdHMC!V!Z2s@8@VRC6&gbdVgEqWWeD~+5w8{JJE9zEx z-&nEdU6|k9Uk2N2MN|wIH@B$E_s{ZQsP56e{dC;r#U@uu7wGJ3&=&s@Azo_KF?Y|l zReWcE>z&_Iq`7~`E4_cFe_7sN<8GTc2n_;hf#;C z7yiBOnO`@1`t_J|ve)k&)xD`6c{OQ4$|a>^QVZU4?|#g2d$W3i#?i+!46piMi8-a& zz3$Pa#NCxI&x!shby)p)vsABTdi=pjucqI;HPPXQd*GGBd*-p{@-s;7j;o#6JN?d? zwc9x+t$vqS={^1Hd*4|0)Ra4q)*Bf9)ili&+;lBSZEiiQxX9Lz&rZFywdoSESav?W zZS5@aYg^|g^zT~w_k_j#W}Rocp%KgHc^aZSK{8wkj zyYy=>M1HKvx%Dn>cl^nXXP&bxG&8R9Y_Yuj=ZxIU1A?13@4MzA)v^6%hJfcXzmFRe zq8er@2S3=p>1nX}?LWseTD;AiPFYM*oMvIFJ3Hg`w+#1)V}{u;GJ8&HA79JG^USEN zsx5d`Nq}^3ndJ|bqo3D3|7F=+I8}N@-ACE7+C+|97uTOAFnm)wbG4DTyRY)Hjl~xK z7jauY2aVCpuBdkw*1WVOFXAX)s>x^lU*gkrXPv$9ChXt+_3xi{@*dR7y~t^{RI>PD z>Y0ssPu70D%l_v0%Gm#$jf*np6knXa(dMWd31byeEhU@OPyNI;vbj%-#_0q>H5yc$Lu%$)!29F=KNCGSzbRcRsT3^ z&c6BIzxN*wSnIOCeJY@OddL6u*M)a{=Xw`+^R%V@(q`eGbH2U(|Kxaabj6R`_K&X4 zV_K);+3tI+Qu2AfrR4MCBAYlNWEKYHS7LMYtBxk zwEN$@_f`ANy8iERUEJh@fs=ks>G^DQPQKXa+;bnbLw|j?PY+7Gb?ou|y|c^9zCF^m zV&1cE&da)M|Nim4%i2F@A#beQN>20C<#SGo7Oz`;B2z{B^TiFNs{H?6qqWTDzMEXw*i#|Z+~Xwtxe~=s&CErn^h{cWBNhywv+3$mlm##+}CmWx{KK97KL{+X7;UW z7C&1XpK;^4xnYJ<3$xyf7e}A&U*9J`@u-nugLT@X#jBR*pZ{81{cH9G1Kz#>3-!K- zOM|RlU3LE7TXN;3OT;9VmoDPv7k({abIGd{Rz z>{}t5ovT@@t+O|({vl^@O&y2wf?WMYOHZ}%tw@eqX>r%#^kvo~m-j}*`Tce}9&*#` zq{`e6+E2HsC!k_%OpP)Jg5oBo$9}yI94?ri~{iymXyZs&H$X&@1apFXBEM{!uCVFMLg#n!Ts?*Auyn-> zL(#Jn4klbInDg*xOsvb{cYnWclz5Z;!u*!u49CyWoO|Ot)*rjDb8q!VeIMcG8z$^$ zU-KK3IGs$ezUqB&iA36RKFz6H?)#*a3f|ilr*dw-etHqlW?rMWW=^ZQKU|mmwtl;c z$4^t)2%E@Fj@%FXxnAB#yA^&+Y~c?f{XQGsP{9mF9Qr)+!=NRv?+NrZ1i^RNeUMb}=d-2puj_esRm%8$|%091jjFDsi z=g_CEDl2LvI8DVxoNS2@JwEnw*HzUWS>{BaanKeAQp2@|<&YaM-QKj>hZ_+7= zj%n4JI$JM(oAQ<0bDrEwpBY9ob*5>?eG=b3v2syQLdTu&tscqp6P2PT`|I3%d@FhG zWuHjZxt;mlT-zjAyPG0Dm##QndUjL9bF*MG$wTrYkH5a0as2nm{VOED%0Jyw?)j-z z$sZ;5rH+NVIlha0@acu%v)w{l0F_|`L*!V2AK$~c9kZL3w0=+%KX|rm(#N{G?{VQLeuxS*oiY4B zC12hvqVo#3mz$g6TC>S#n0^Y*Y2~`epIdA3$9cky0Ed!7cF}Ipq}MVL>FphRZFf9Z zF-=g7$#rH=vg5t|HSUeGNmKNdJKtL;9h$>`a_zEt)y;1MKlyo1juJv=+nyJnGuSqFk)v7E z{GtgLOZje|>Y3TX|A{-8gXj3);Hi&i`n0HePGU1@yq2i`p>OViYRNUie?-n^9<@E{ z`*?BdktYm??G^~#%~P&+6md_KJ85Rn-2!%k*VHYdoZs{>MqMM zQ^PlVbY{+F-LhuGcbjh(X)1HsCfjb8XDo^!%$pE2qw?#(=#aJ0=+hPB^kg zisS9OO>@>vjA(BB^U>2sE2V1J;tRY-X7d=>b$T}Tu-y=FZkJ+n^=lT6d9og;SImFqF*ZspZ{wvD9?6y?bZ;2z>Q3tgT8@CTVGMXxE~d zVYB{U?|S`-&&E2Z#N_)Q^D42H7u!DaZ`C*Aisa>)rej-Y_2BbU-YGRcOA7U~mR-m_ z`n`@baDLZ@V<+}sxc<83>4e`~`d z9sA_(W~;4i-N@&sJnK8p#(+yV+EOmuKD)%EY98-m@0m;3R%otKwOaZ0=Z~@(R;O1; z&Gg~tJbkb)-QtT~XjR~K$CPr>p#Kq$*V__j-gGIPIQiN1yGN33|4h7PnWFmjCS%(g zkH2oH8n{`H69 zsBtLM?$8Y?h8^>)WLZy|Df{qGwD(k%I-ewx)^z-1aPchhP#z6S3zX;`>%!m;ouWqge;cXNBx%kUi^DOvx9GgS)yzrfq7Lu@_|D=j(VXeOu6)r-I)aEBDOb-r}48g}I(@M71KF* z>A#ujrjxC7k+H9k(dMn*Bf&-kRl_ec*2=u8xVJf%Z<~L0=yk^>JWFa~>lZ9mV@VOY zROj5Uzg^2&`G#-WpRGo`*4M5qTC`}s>}zlf$o7O(XV^~8>yaMnzaAa6a9nn{BS`3I zsN^A2n^vjq0ymBAOm63?Y6e-Tv48a8d?+)otzqU3KlY6co9-8FDH9esTHt$g`#H=1*IxP8C>Y>~!+2dkqrSM(%pYzPuL8Y_7yaf{%ZoBzLRJeH7e zU3__k+}xC@lb_7<36OlV^h?OpzVJ_0^-s$v$_q?HB6C=yYRYFmpXG@gC39C-I`03^I z>GiUocPKpT=`8VK^p^U4g<)Dt?=-fVEZ;RJ9xU`TR(;HJaC&#Dkd4C$P~*{a(yvLH zy(be6{@ydY;B{inr5`H-I`>7p1zR+nyuQ@e>9C1~*FOz=wr)PpsUe%^Zu@^)UC6#{ zt*zoqt(Sb#`^0U2NVA_RR6My*5ac`+&r6=3cHiOCqTuEPNW#wxiTNqj(sPmuXO7~j z{G8+4p3BNX+R5MMr)f_&I&PfIcKU%xRd?@_nn0gPeq0cZ3hx$t_2lllP%!Vd&%KA! zEc-f}6jZ$zxy+Y!GP-xTU6?0R#(3`&|BmEMPG$*;d-gHB7rQKO7kei?_Y+d{x4rQ4 z#G^(_n-{$dJY#lZ%Wcj*(H;w)evspkudG(dOqdAn0*D~X{^z)Q|KT&Xc_%FX-h1Ue^F{u?UY`--NzeHJY zd?2V6wM=E5W!xt>Rl}&#FH@SHm0$YS&y=)sU*@|)@6O;7XJNVY=k~tg?{3|`y*5{G z>9hG}C918p5p8F-CDmA4RXa_-S950ZtPN9_3YI>*Q|+EB*rosR(TU3eqK#q(!ja(~ z$M4Ncl?_g1XBBm8S}&eF<96HM4cD|gtE+g*#4c|-)yQ@v>Oe`Y^gK_^L#usX^l>z= z%Q+kr?sRzew{zziZ!ek>bF=H|<{+uCh?Cz!t5q@?z)2mfsUOr5 zUl=8PGtR#M+QvEeygq6u{}XNQU=uM&HQ34ea`L+L?d*}<`<`oYh_P!#ODKP<(roNI zw@|Pu=&et|X04YK4g?4u&Dk`;qw#~vh8v-ibdTNR74(?VSrg)7v1XF%VWWfY51Yg` z?Ncl<;dYo16YTd^%E2?p;Jd-~)6e1ghtc`~x&Ye`e!(ARc zVT-`MCrUeR-urBEjXB`0luFK#*K1WCF{BCcy03kDT(VKjVA58N7aW@ul{MqP=VmK> z$y2P10ul)J069#{-!6rGNG~@sakUP(i@j0e6%k1`Uzz*wa+_hW7d;9d!~oR_t`=@oHmyD{_95VD;g7x6cSF^;QQOx8`Z@`|jQGE2PEL?O*FYyZs8U4Vfi3NxZ3g z-rbkTz}u|MZ8+8EI-9ld4X)BnoQ;(wET7wIgoATOzPe? z*{zumRWcXA9IIA1SIlwk=L?^vOuRk>35DCPLPmMsc-SiT07NeyQuimx>M8H3{1o>{pgzf<@x^evph-~l4BVBcXwB~ zDEN5t++BZ+jdyXhvqol!Xp3p@N(V=ODG%2vGOvwY%vr9cMTX%l_EoGrQk zYT{Ejp373cpSk>Lee9B?3%~q&x?JCiT;o}`*6nR+waUwiMPj0&f8RuyJ55sYeC2q} zW6LSu9p{{^3RRNLHqX#nw8NkC;Y_h3#+qHa@e|f)E!lhO&RX^02`>#6O>rp?SV)o;WBq&E!v^&Y|&%ZWO_{IbyLpnxfMpe$zBb6P8#}nO7Ao8;;6FjS2sN2|I*SkDWC7q z{cDli-))|t%Qw+JPJQ1^H?`Zlzj<8x=+Yx^|8GZMG^qMBc`#$r6Wz>Z2cD*UPi9r= zdnVERZ;kgPKZBx-7SN#6SH*{&4`)gph+QO5b+|Z0_%c}51)RwyE!mgim24F8!S21< zomKNJN{fJ?tqVxuVxcG+h?w1-h-*&ve z<~^y;{FBCX70*daWF*wK1(v1Fd9zJvR-Bg7oUY)CLTSD9`0Go+wd>?fF5y!yeF)Kf zYif0l^{fcr+utTT{$KN+#3pxB8Eq6t`OWqXt{VG}bSwKihq6Q+@JWePl#Q*H;MJUy zUU5=h{&+@+$95?Ju9RJR&jV6jy8h_DKXy09>upi?bM@(0IhLAlU$`&+;5%OCFPn;2 zyj`qP=-+?vTvAk+<%Na_?iuUy4;yQ`R&3SWe%@QVuq!X)&}Q|MCb2ua_t@^gWHvqM zv%mDNNr&uooYSHW_sNQtD7-v-+-4PLbfi>Z`ni>QsU_Nn#nn0g)^fb{{arQJ*SI{` z@T|vaWmOlW+AVRDO6Eu{5Clcnp&7@FuDRd)!*{9FuPIc|X{*|%_Q^9<&bZiVDanML zT$DKT!Qui(?#TNBRyd_ndSs*u3}o#-;3&OoeVI-uZn#Wp`g`j`p=p zJSNfyB^C46xIJn%x@GrLM|?GVc52h!``V|Mp85Dn;I{h>BZ+_xcUG@TwyUd>O}G~c zvU-{DaAjEbMhRpvDo1uV^(jajP5M-Nzn{(Ny;xH0t%DD;g{mY}1 z4u`y!#03}`b!BdynId+g|A9_OM_q<8ckPb2NhLLqMoNR)1* zcE|D^nKfG`M6A18x{YPtO}iLT%^tB6$3$8fjoQxrbDcQ<&=Ls_Q`sMzK;_Og#ck*9 znx4EW$}(>h6N^xnoBK@Tn+e-wuad=+TV@?tm~Pn5n|wP>P3Y8DHV@TZcip}%^v<6I_8?w%}6kGkL zAIDO3awA`;8~Z{TcV+M58+KJ^9NKi)cJu9WQsY^WSdgN)Y|_iqaly`W{(NTc@Nc`Y z=~_o$_kk*P*XicLHmBX*@K&EQc2CKUby;-Q;<)O^pCvJmFD=d`;I8jMBR&?YtJ9we)!5y<51Y_YE0&5t}6bDfak|5?CyyM4w?7lu2BlU77q$7>xHIv&QfQp@}O za+A{;=}?OJlG?V~+ZLIM_Y@1PjWwF?9PdomVc9NG=*#u+!z+uoVl}gO z?a8@*{k5v+aY=BY#T$|(bUjn>iWR?ZzGdex{^DmHYdT%nEsn8%*s{CBo#oJ!BNx7M z36ws#EwQA=jeDt5f5KwMyHk!R+?a0iG>C0##8%eYx`szHwHohgMeLd`nNW1oF4Fkm z*RVU>d#23cYfRhV^ZC&Mx7*M3?}>B-*+2DWmXPAktU2nrE1J|g1?_@glM|M`1eoEW^_}q@p_Jal%9{)JzUWs}wo~OqbH(g=pP2ZX*_M_>Iaj{Mo z6+d39da6rpU9sXt`te<$zETkXCbvbQd522HE_KH3k@(K4b&^eZkwsUv*MvPQ73VCT zydqHeW0rd0dL|Ad-ZG&msoO^cDubOY+?NT~8E=&3OKOZc?Xc~xSJ09IAHGL3g$`NT z@G=^2ocsF}kIv2<`4ii2cdB2uSjKW`}Z-6W9|=Mn5=SFk9?{! z^JSQW@g$xX5pJy?L)r@Y{1>|Dy1eRrvCC`Gy%vqmM>7Q#>Z2sw6;;edFMXT%m3!~O z_BGn6F2${d{6+#5n;SAp{(t+HwpZn)i}JC4dHwt!psHu3{!HprbyZW+Bi^0grSg(R z1uwDHHaCXh9rlT>6&A@w6@(#5NNK1a96&fZHqGgA5gXF-ue6L_KLsr=l+l;%OT{@CpTt?~_=FVz$d0J@_S8u#KZ|BTi zr_ZZfoG?mw9d!EK)4uyQCu;Zq%&*&1V&TTXQu(>=#N+yXohQvMIKTgRJOADZ-}wJ} z{<-h%oPR$I(2OrqzaO3Qtzr0%QT6=$SQ;rFrGgg{xP* zs9KgjJM!P@_n#jem(%<8@VmwSkiH3%e% z%&nDG`@Kky`LX`KS&6Uf&i2>+)O)8Nf2_oq<2-cPYryFV-@f6=P&$jR6i*_X>nhjEvkCggu;FK5)3W6N3KraZm6r@ z94hMaC(Q2Oh8fSzBEPX3Bu|?8IcjHtQ;*Z+rtL>t92w)UFO^-?vw?NT+h=KN?<)PK z{o69<_P_J4yIvc)Oj5mmwIJ=WK;4IBb9ox19!YOEe;8*tiT#@7@2|I?-@MqpGTMUU z`sez^3toOsQ1O^sCc1n1PtD3Np>Jk7IbCi$l)gTAPZhgXLiR<^_-ebx&Q^)xS`9ypd=d~XfnPgecEDwHgCixn#xnb7T^*d^l*OW_p>L&e4jekCi+b_9dUf=#- z%5l|i&i|>cwZ3)FiOX4BFS)8p^}EgXW;y@ptrIe**UrrrJD=dPP*jL9>Q(utdyn}) z*uQq(`TqNyTgnwvpO+f5bE?bdw0pIm_-%IWDSL0IZ}a)bx7zzDewA`%rp_BG zrR8lt8}#pq^tCyD?8fuIGmh6;Of%nKY+HZpQ)PbBp$+=>N8an@KDeiU|LpILcU}qg zebo7N%IMiVqiKpqD|g7MeQBBR+h5ziJ1!&Py+5&Btg{Ea~>b|H2<`GE#V zus>fJJ`TY5J!Tn0^`Zc$NbEXFQ+15%-mcKJ@;&m(JSrT<0TenBK>!3`_ISsr9K`v;rV9c5`21JipLY<=eO^t`@Mbt z#sQL%-rXVSZ5dczU+dnUfyzUVKgNRSyf*Zm@LVZHk@>2 zR@j+Hg?f{TheW<@HPvXy+q`(E)&01SIe3oQZRZi{JkI^V$txQ{}1)UDMYe zJ#H$|_OJEzw7Dmfv*Q*yvm5o+Y}!=#ep7kaY|GStu|6{bdT!jB5^Qi$`E|wn$1LS% zW}V$|yewdCV~}D0PUXclU#_^n*&FsGCVbMZtLs1CyETt#%Yp}Q@{2F;DE;$m+V>By zw4T~dx#hoUmh9K2;P&tZmrfm!W>hZ~GO2r(cz2z0#Wu~ye;QTSxV&OjRbD(JY_?}w z;~$Q5POUH6x5eEp;F$x75o>Yv$A1n=Fo;C=Y<^Z+aBPDLtJqwZkb@}<^Bvt8yd0Z~ zj-FVhc9@Z$%e39-_;QwQZ%sA2-34`Hns@R}N+O;S>wY)S*Lh}oK44?yg0{^^ z)Oqgg`tt32<%@6MD?Kb`7XE&}Bl9u$o|131f4=gu-~0aWi2nZ%j_DIDSW0hLxJg7s z#$Da=zHrJlkI+!YAMMJNyZhq0_pR{WkyiLO{P@O?5A!$J&3PQT!oAa_bWPdpIU#>o zK%uh2W&7CPV}f$;>%6nYRi9=yi+LbIM)$#>WyxNK%}fl>4TQYrFq=nUL18fHf_T5P>%l7 zhkv}B9r10>N%*?X0|IOtNkGTr=RqO%4ZJK>B0#7|X36C*fr9Jv&CBytOqE7>TTI78z`GQqJHG@ak$5+x{=WNd~{QT<7oT=NVE|0sr z@x9E;&{%e{=)d=CKCiBSSH!cT=kKS#ckDjN{`>p<{6^gihr>*J6Rrfz{lzb3abej+ zKL(?7@=?c}3c3ZaFA?Bd-*-9h;P#U>B~|-=Z`6}~zIy^_tDv03iCHW2#eL>Kc)G@n ze}1cIi=}7Xbn|szI=Zjhef+q7`TJ*Tfk#fUDQ6Zp)f~LnJIi}!tw`DSnF7n%B7!oX zOrGI3al?kB_L(|t+um)N82R9__GVt4_2v_{s+|y)Icz->W2NQ6X}DHeT8E=ASbcqb zfgYai!g|%d{dhO}{@+~w{9|d%*T4Vc)2Hpux-TAmPyD9eoC;r=+ZG#}g`MXd@l{-M zLEu5)t_uvhf1>tHIaIzd-oyLnzYK5grJARwPwLHa_|~GL*7^8Gq|E#79M5ZITjTH6 zzB^O%e?rdbPm8jncTHMz{_{r;{+d#g=Vxwww@p7c$FlhP^&gAA8pq`Y_{9I`v@_d0 zbNT*HpH>RbxqPV4yua}K+t-ovw)d`mczOStywl!)s&2dgymUAIaq+qHm3yx)sJVFd zjIn~rm-UZ>ZW|X&*s|%T&i-AqS8Si8oxiW!dYSz5@c7EsJn;>$Eo-i%edR4LIz2Id z^LFJ%u5-(-*qpXF^79sRgYVs7|4rGa=YM)WKUgLHzja)W?3`EP0oN;cY%H7QS1oX7 zfkD#asJ&Zc^VN%viF-`kTq1j#*}Wpi{e{u)tGa&5mh%~1i^}ajs>)7@<$pJ^=vP&{ zh+)o|8tJ8xFRV27w=R!3>?^fIX*s|19Q)^+L#993^JLGHKO4SWn$(qVV)Em{soxQs zw{%NS|5osJ56i!f>CNq*ZeCr;+;#3(%&Rvd;V~D_wk^FIW3A2_TX*mN{PX|vbPpS; zYaCM4&#P>?>b)z{RNK){=ft^WIUNN#t_v$B#ngt1OHccaz?_PMhKXS$C{XdNVynWyPv;Y5B0e7K<_9&0FJG%XIcD0>a*1qHa$-~Rl zemuTVxP|llo~t=~z8+q)KTWUF_WkGG<+D5!FMd1sTIR~L4ezeqfBtQDxZ&BGr-kqT z6|=8iUVdTvxux50CcRrLpSZPNT>p)XRigd5jdR~$3f|T7b^AX#`CW;crfyPuw@f$@ zz5mJ2zs>u9PQM|ybaJ%q^qJh#iZAPKFL*plTeEl1VdeXK`{VbRZ>Z_NeSBeg|Dy9z zXU}fWfB5ZoUgF_bJ6U%1efsxW|I@RLKDUh(u6g+XWdHf#4xilbcKHus*B5L#wLx#{ z{*KvsksjysIcXhh?+uvKYrCqapYv3M>uJi0s znN$88O)NUYu-E`uKQFHLE{ZFPE2^tlwQXCNp1>v_*0j&n@%#Jzr`aE#Zui;Q z?Q^Q>%{AE-R##{L@B9B*J@`iD{rFGc_vhNa&y@&{ zbmOCY??0GlNB!Jhz5i6OBrQk`QCw)%#E3#9betWk5aofdNs@rpK9%_HyTKVvH ze?fu>v-a%L)MLwDhTng*Z`SW0ucp6ytbbSk<9Ge}J3=2Pp5vW8bEcJBak#3>R z?|bInH{16$uBPX9?aaWXYkvLt|LpW@-Fg4yzkl4)vRFXb3*@0Qp6AkitPVv!W7A&w z@y+Aq@&DBJ+mtg2>Qoo_O&Me^aUKinVneh5^3*YCJ$+LsgDDlmES zlRrCFct6!SwkEP|VtCUfojVz_VSl+JY$pb0Y!(ncKcl4O?l$!fcW#AiW@1|`I=0$ z`^OX(eS77(iD6BKf8EYpk}|Pv6@KZ+TdV)4Aoa}Z54!&aesxAy%k~T1-T(fJ*h-@_ ztL<8EeplFd*qwb_v=w)%B5W-{_xD-Rfye(%b@_Zjd{g?tg5&N}6T{B8oKyF>_Wm&I z8$0%`ImT&~k}uo1Ed*26>hZ4qq-Mi9H-cT>{p^lVv8iH@iqtIY{Z>6G`}28~$NvB8 zmmE_6=CaWDugJewdXw^P-EK+Fd~-G}c1LVP^}hb6^Hwb9yRGH2f03B(3g`1b@BLIe z^5nw(@1ENy<<-n8G3x4;Ut1$P?`E{ZH|L;QGXaPBUk&#h4ZQTVf3nw$4A$`EXMFcU z*itY3_Skp1BgnDGvb=C!WcuUN1;>xiX?j*%*mr%gmR-~SV@GcNwJ4k4Ju$p>k?!Y< z*VbHp`oQGRj0olhS|5G(pGa12nIWO_{QSwcmL0k0-Su_a3%viguj1IdLuC7N-W=%< zJwD&kHn01~og}DrZJwK>;RTV~j(JU_1++kSWQA&q(6*Df?YX8QM2;-E^|tcK^^R7G>RgHso?PizIpgxR1d%BVd04}^N?KRH{JWItX@-{1F8!K!x~V~F zi=^KDnDgX;$)A>p)oru4Ts(ceGS;c%q;t_fn@2a^wiiA>f0!drRg`gU31d{2{mOSw zCTyBMYwyi9*%KZF)o|xIeErwvQoGnjSm_7@Gnc{hT9N+u5-XGYla31~oH-J_JMV(% zKJMlJO3G$VIoZLjx8T_6-F8M6b}Kp7y>_kiDG=V_$zXr#F{5@BWB9w9YrHuOD?QHf zAAftVb?z^Xs!Y`*B|Vpt=6t)KFn@-lLDS9IXLm7#ywlplz0SGR#&OZR1#{F}BwU=e zolhGU-ikZ;D&s(BTfw2V7R}4~kIpKbWAo+ErQ&?e$wumte=kqt`9E{wt78Sa;!m}u zChpjqGE+u=HK+Q*3tZ`QvNjva+PXh%nQgTH)44Q=|LZFJY{R0}qh4N>Sn6$Ps_8i*_>zU&a7yFtM&ZqdUg3#u_mBBSE||WUcVB@2+oM^r zo%yF^f86L2eaE_&%eU|q_e{^3!O}-M%N)O6tl{-j-;3HSx^72J>|remSg;>UWeqx$VNt+h<~%^ACD$x%a%|{r%Fc z{hK1i8^l~bvpR?_GGTRNj8b5HIq%=jOs9_1%};9BWaey}d*iD4qnRrgeExX(`Nh7J zZ)t1wWY_+x;whbwlC7^5P_-&K_xnQ?Ve$GMEjxT(ELF9nA0A(Q)KfB zrZsGD<~6cgF8XRQB{^ixfi-)oE|h&sQr~pfvD^61N5(~^H_8Ovo^GA-wD`gst2NF3 zllypc*E>yJcQ`tx<wl-Y5Ok=5dI@2ij8uluOvm-Tpyp5l=gnm3&a z^i;OndPRlpllrgnymf}a6IrgC&t~^V?qxDo_xtr=_G0M>P>NM_u|HXBYk#Y z$1>B2xBg1JJdv?yeqGNiAt#QD{zY*eoX*SKKoyl!hiB#=oktqrn#@Ja(>($#>f+a6aU z+#-;4N#gC(%do=y;lw`o&Ug3Aziq0ri>lN7B71CR&ii{a&-~UqlA4hd*84$paSwym z1nw9;*+luMtGyMgpDn5s$@{_(c9%P%cJW7%_ZnA3Bf9c0x_!B#edK<%@3aSkNt-<1 ztN+Xs_F^?mtLOP#lgjM<@!b6Ozjd;j*^_j$=4`E<|KPcZqFRUHOyxJ*Y#smH{jX5> z<3dD;J(tL;8smME#s#iqIie8a6D8#`IQ3E!S)|dReP-Kl9E0uV&BJeZF5Mt$t@- z^NnvcUk(*kT)S+4tRjp7bPip+t$J zq2H@l)0+*mjosc@J~|$KAuaaBML{PY9;v9a?;q;EJGQF2BSneTO>fruV|yp;{+(xh z?YF(c++yB+mBt(RZ8}6{Z#2ltO`Vp0w&3|e!CT+gJpWVhJGJkLrE5p$^8Lzh%96`V z=Ks0SIqQY$_Qg-1I>wtA+tB~FC&l}JaDLhP?l8-#lg<5%G#{%KKK6_W+A*`w zp=WD}Y?(jT;tIVeXYc=aBLCO)Bna*P=uz)bQ52xnIeC-9eumUp8ix;gE>%!xUwYuI zisz})6A!vbijPHAWQ4ROt z#7ni$cfLBiv}o20_~L?8B4h@1pW3bRd1hCS|C;Dv?lbh@2wY4AMemh z=9~BO>J9h$7Tw_H)*WY-Zj_#<9=luc{wB*CbE`eKzd!Wu-IR;_gxjq7`)1_K3*OQ2 zSE>=@0v?S6bG`@K>`PwKXWJ#~-(V>0|8|$7@=iU2GfRH@oJu*uDjx7Sz2y>?icx~c z!?hq*|5Wlf`+`X<9~RrlZCE5;Vmf#2u8@aGJo$WQ_KGLJ>*OyD$o?2_JoU*rc8}#o z`P&7O=5)VT`gtyK%^_BarQ9E{#4*>dpLpl{D~@=c{{1}iacs{I3QpNu?8WxmwCTCN zqM8!(S{~iwM>4BeS1;cCKUnlY;e#h%lh#Nc-zl_rgUGLQhJ|+EdiL`r9(yi7`H2O| zJEnDi5?yFvWap+mr)teMzdxek$wz#6{Ds4^Pp_OG?Q6l=8fd{R`l|j0L$Xy>-=WOR zT^njo1jXiE-+ZKepUDeh-nGy4_8hcT`IbNZt6}R7nVp7n*2yl}RW{+%`Xl96zgC>O zuYT`}?TQI^@Bh5GH~raX&OX*t&6mz!@|EeAw438|u33Ff{(a-AYm2?qew$7Lc|w7C zJF|LP@|1OldiM3s-Q=L}E?r|d|5o?aT|)P#Sbx|ks(pvMN_3W#$fTK5EVnw&$q)~T z?_IvAf6G(n#iFY>%XTD|n?5?Xhb`ZiXZ3dep5k2fXyh8U@KUGa+QQo#X1y{<%Re9; z9#Oj>bnWp4eJRl|&YXR^?%?(W)u{KyN4~$8+7utT>NMZuIon*8w0T)SI8yjHQIb{Q z(WayY;rBb<$sF$c_P~lwYrW9YrG@8re4Tut^Q+_0t20ssbAG$nmGfu`9r9$qxO~mQ zfa3+Be6z$3z2Y#mGp>=CIfvcf;{85;Be^2G$$xiU*wwP*3>9niz|IU?zNZqR+6LO| z<+jY-d!y4(YSk9&!rJhpXWu5;ePJrg@>t^jdc#|#o>SR|r=KslSsKAUUrko}R$QxA zZ2R^d98WJ7Mtyt0Q+rQob}6scYSFa^K5Uzimo2kjT}M%EwS(@wqz(P=cXx>2`*DFQ z%TRlIVwmpnH4zPR1qD&_l&>0n;hWbj{o3j2yc5s8Hc0tDHEy`wJNd(c={j;JUT}Hz ze&(@XZ*h1&J3G(z_XmEQ{K@lO`|+-p9e-Bbx)t^EGfG8YSaSc-w6nWf1Qw@niQlN> zHtoqC0pUY8_9RsreLj0^OEL&Z|RWyhJ=8utkA4K=Ce-QDLm_no&q^&`va&)etxAH%P!oU6(1 z7jWwM=m_bfP7YPx^V8F-HgnA*6SjnYS7o<3{YM^cEzz6lYs69YTaYWRvh~lkBP}aV z8`m1g|GoA+;?~#Xe_x9KyEd;0)@s?oGClp=_h44RQ+c_^>(@;B6<)LW7t^ANYrKo% zI*fZg-FJNdoAuAVnrruE_o5$ zpX+ZOI@I_(zroPGK|EF~R)wR#O zdi}puu~}e!Fl*)hKZZxos_V@cT`5{#SmSB_^t-*QL9A27NfV1dJgNCIF6>Ne^{(BO zei<3zbZ*8`QT;ub8Gd9pI7gH(pQatoS&utlSgRtB9^oz0cY?1^V_kB!RzeHSN0n9&fj~te(ApF5@#ZXlzw}cq{v1e^h|nk!ud;pY%*UyDLECet~|yO+EYlzjwl{V&}ekSntVUs3zju&V3`W zob$Dj$GQ2@hy0f~2HI(NJ?GW;WY_4L5WPsS*0{h?T;}mAy_1!SZK(_yjS|<_zkRUl zrDs>IUgwIo;|+R;T^XYao3hS6`I`24&i2(`cux8Fa5DYwUz9t`cT0-&Jpq;H=Tt?l zT?+qR*crxmFPA@PbM(URmPf>U?(Yh@xAo5Fmp|Y9+J1ghvCDGaca>XC@BXO7#_Cmm)?M>A^@#h!&K)^dRW0?8eBjx_vRNx; z*7oV2&eY}q&y}?GO`kQHF?0Lx%nj8u?QJ_RKCym%dG*XGmaY@Mnm^rQX}EXLzNqw& z;Ro?$CxQ+1_AP$-_{rP1%knRZx>)flHHLAOxBJ;n5z9Y#eKCjs?5@r41O7icvrj7N zDOYj$=~mrqbC&K(%Ksx=|LJADd`MjSJ^4Gw#nb*y`~S~gJ~94$g~bP_4najr`#oFw z@7bzVb{~3Dvg-+3ZOPvEvU4ZC*MYd%L`I+YZPzK*xiR+E$F_W8xx9L^2yfM+Q@u|< ze%URzYMtdd`StIfp2{@LN>|kg5)Vr&*m~SqE~J!yyH4MR3_tzr=Y9EVB6+{baZOnF z?$P7bhjixL+CTS@VQuQf=JNB^Kh9Q`teMU0eot|Gc|e23+b4U2`HQbz+*TyFG4u0_ zdp{T#T?yW>{BcjH%pPvLgXMBnP4e}*%2U(dgqOW4N`7l%YIdpO)BeXTN@nY>df)z7 zrnG6_5`pRbCx7y2Oxpdqvs!6NtbD8T&o5v3G?Q-3II3xLRBRXDsr-kUeh*Jt8XKIS z|M})hNc!0!SNHpM7Sr|e4ga3Gz5B59#x%bz=a0XW%YDEV`uM?V(;9uLq|cAc{{4uO zK6~xuOP&pTUmw|;rk3g#V6rdt;QCWhH#a=AxW1J4)&12^&Njy-IXthP`bXi$v1zNL zetdo{6SKPB+Ip9J)w*k}FK)XZY?-RJ=^N9%)!^M-&Zw`@=Ur_v#Eoyr6y}B8X z)Z;Br@7mY3=+@FR+8jwSyQjHYp1)|c#mDTmkW;DCUcYTWNx=T3~&v{yhh)7-9l<=x)Y%732w^P%nX4-aUtg@J5_^wB$=(TA}` zJ#N;M7q!>9doMjFBn0hIjJuO8ybj1R9NQ5lD8oIs_I?3fk4uSJ3tJZElT5 z*8GiSZ(BhF(TXhsO275?DZf$Mv263~)svq`PW&yCTC-8$zD-5P`ckzE=Rd9nYj^5d zW*BLDC|gx?^W}(>CTw#yPWa*S%(Hdp?v1Ut=B%vQ`R9!5rQ^Y|2VMBLZ!O=fGjGX( zt1mvWRqos}C!U?R@)LL@VftRfmmJ@pg?|ps=eqq^*;0&Gf_2y2gvxOB?WJD>AMPsY z|Gg_HM*LO6zQ6;?Q&USOCq=qtmFD-*G%~^;)P9+6$?UN7@SV#NNtIf@2SUHh ztSb|l{?Vba|48Q~ze%BQbMM@eUVP@_ix1TX4d)Ib8YnhvW?EHVl z=eee=`_K8Ya{KIe&)RM>{nfiLJE5;1l1fEcbI)8 zDUjxO>8Yu6S}C`o-A<7szaug$D-6%K@3D8}P}G~p_~4b@Hqr18yD}#nNsG$wu+PX< zdN}taa~A{yW3Mer$76{RrchkpL~yi6Gx%rulxpW{_4**>h?CT zbQhZ4IdW%5>!<1iT$>H&JS(_q@^ABodY5m170$fxn`r;RTC3S;!NsQ^8KfR^ZYr3) zn*FBSl^;3r^1)s;SF|roN(@smxu<(h(Q3yVmQ~pr%2!V>cM{yyz3kH_%R|!QPBB{? zv<|I$CwJ|;o5saIIrzd+fo76PHO;+DtIMwD)JuwbCy0n`h^n zw5{L^DT>d0aHT{-@yLuzL397qmnvrU#K^6kb<*2XF6r?9SprTSJediF&c({*Zl?Ei zRzHiryzJxuaIqlsCHJ2m*pSVb9`vl`bLli$hw|h8-Pi{Z~lzkiGDTq6BM|L->HFOy6WO1e|ftFT^#<>eOToV@I(=gt`zUwW)A z-71i@$hbiGOy6!9eZ8mGE8}Ds%zfJ*J( z`gv`aOqJV0KE)$Pi%sSCuU+x*=_Zlxs@;+I@1DAT`*y~Ov(LA)w(b!#X@9a@z^Q|K z;q+K3cqI=q#0_KcN}EzDfQnpPhU{PWK#j!$C8taiQK{j+yh&3yPur9i{)Si~*y zd3HgncgPn^!qgSoF4`nfdljhO-W>mz2?6@kIVq)8EhcW4g7i zZ~gG_pQ4$`9{&3Nxo?-U|&+-cafF1cp6Zr{S99}nlO%&}dZKfiaEPTnf}L-I$?+01%5$LrnPD2Mw7?k*gL zWg^P|FRT%8@-YL=#cnb=J!SHPXODSnj%YooKdbZjgT}ejXVYTAWwLPR9($eBJs~ap zWu+Sx*KOXqszZ744MVteZ%NDMGo?WxyX)#K*Uq|LyV&}y^6XMhP}k4L1W{QCKlz&n zHqWU?=OqU>NV>z*)9R2?@u{?LT>{zO?%8I&{g$)s59e;(DY<`P0Eglcj!ARGC-;=J zxVBx=xfO6;d|h`ya6-RdLuTt0ow(!6_m|4gkDR2hsM#VAscNaOCck&fmM_xDcR38d zow=0v@6EjAnykj8=j#|IUaor;v~Nl0`S|3|*Mu+s_?h@vDQv-qi4ir-xwFkKZLG3< zDCxT5oLbF9$MydUlx1rF`dU59dG^j)?84TsseJBFBK;IwBsdq(|NJ+^vE@_0Szy$I z<=g8{JPMigIcd&B!NkV68;9lp*0BfQ*}Ok2@@dP@zov$}wuOH@FtMA{-L>kVThw(w z=iC26OKEjZohXLlcb)2Q-`ps7yUp>~2km{aM|| z>*b_A-HJ6nGyhMe^u^<8pD!<-{(67P^jW6vKVPkS@-m!v-MRO2GY|W}V*3_-^UN-* zBhQWoE)!o`sBBmER_FOb*?*J6@17D*f4fR=+BKCGC%h-WE-ln;ZjR3WanFyRuOV$? zL25_z`Yr?21sv^7dvSD_r&DTdE_ugN-utzMFwQE~Q{la@4jH#JLqF-K`saonilw;POpeEk@ zc;abO8Ag$_*2_M9-OGIac-oxV`MHTZr=Fj!&U`TO*ekYu6(k}BdD4--DVx+QpY?A&ru<{A z<&kC6gRb1Uc7I`L>yb3E#ZqMt{232w39;(!o7-#Ao%i&|RyEdsJJ$tQRih#sovnXm zMwfEtS5MsjsQ&ON(WQSrZ8WQt?3l5o?R>9~$GQ3QpZxh*bPu^tYZE4RFjDhQ8&lHC zf5|iMgq_`(+c0fO#n}Sh$#cXXH#1I<-l90~@WNjV?#T>xeOKmdEPCdKZpR$E)hFk3tSRYI%!iDv%k8|^RtFBawb{4iCl zdfwcl%+>7o9$b6myx!u-a&b3}n*9^jO}<~?difz!*_FAKL4lTudHb}Ee!QOkVX|zT zOhSIM_~sWHv%}gdmo03#$DOe~&7z{TJYh>{;!=|}j-J5*w@lD=m@&AET+l(^mP;}4xHbM8kU z__kQ?5p(>qivD)H_%5Y>-*ayyc0DUP+GCQxMCa2Yxm)e`+;{qj>SsOV7e6T7ANtYj z`pSmO-j98ZbBoMnAN`)q_P6QTqOTE8wAomn?0mVjaM>%hd=s8scVAZAxSz18GOoOpVo%$?5aM z*|2u!YqLBe+23ztUwL!wh2JudxX)exqcL$sx4p!K&NogmMkjyzc%GZT^{UHv_5wQ* z)#Xbjq;Tx{tW=TYX!S~8aUnPW7?$k*wDbQznR)Xi(_C})XXm|6D$X{vuUIpsxv*fD z?UtQ^UZ<5pd_I0WV-{hqerQV?_tmM+w^e4`S}a;x{QVcl!|lsHUJ(5IWkbM%82~Yr1&5lB|gKL5ZQb8mHo zh%A5E1s3zhi|h|x|1Z`ldzN9)@JaZKwvg?{z?sJCM^cn6?QKr}EPlSHSf}4(OY5DV zp1XF%e0mlg@%wZ~{3(NVPxeT#`>oA>^uk0=Z^_33MSro3sd($3}1G#hF#B5mz;1fKDLs-){`oFH zm6t1Jy5wr9ABQj5?ECK`=)QCAa<1D+|_LN+R+v7Fone-HOedF*D)!<6sW= zm~EzQKhD@ppPOH;|66b9c+zxdD4OH2bE?ZL^zFer%7S ze<^$Xp1qTs9*h2YEc|mzyo1tC&&k^^Upl91zwp4dmoJPu=iZq1I`O-p{&wBhPr2&( ztRJP{o&_GsSpSbf_O-~X6PKTSjOE><@p)Oywb+^-7=vA7S{?Uv#mUF zL6QGtrJ9*zi=|=Nal@;eZx3ZMJir#bMC}Z5(*Z+_IxmUgO z%NehtHE)aN-<+Iw@Qy^?+0>`YlGoV$+?jNL^X8xLcC+b8wa2f0X#KD(Z|APb{rcNJ z?vlDYmvNqT9K%DO{FY3aib}2jlQ;^0e-itr!|?E%%)FnelKyj_dOrHIisN!K-?29a z#e05knV-*hLp9@G=#hC(b?+4A_T1HHJtv{bxFBDim3`XfJqE51&nY{*RmS$%o)1c_ zX*jo3IwO{^>UUz-{F>G~`!*k$U(Oe8w^8iv+4mp*d_4X4i?)jyxX!6bvz+gY80j$V zTHRH>a@S_*^PP83@COESzl;r)slHfWl^$Lc*CPySsOlY2(|GFp;oxnl9k%-$e%FP# z-CdE|>HTw(+rCY9N9W!5d2Ii!?_AV$h80R-cYe$MOY_zKU-mw{a#bW#5Qkx<=Q(b} zU3%Y7|2aJ^P~u^8w)2|RS1SK5RqE@@>eIM&Z`~vJ_gOmob~aXLt-V-jzeg+e>ht%H zwWW3D{rgsHqx(>!WyTSe=dBX8RhgMD&5!L8e5CZmJtB7P=Ud!UZLSu4eBW|@j@ye2 zx%S-ICB=Hj7cCZ?Xtu8_$cevx`ux4Om5YzH2uz;+WRJjNKlnljPXr4-f^z9VbJ#vU z|J17y+g&*nkF1z5N8G7n^Th-0ab>(|b^jouJE!C*?#SXk=6d(|(&Rd!Jqb4-fY zNGr8Sa31^M>XKHI5o-Qu?X2!+fjcfTN0jO(e4YDM)K>ZMeu4K*{0qzfH$}ugev#uo zHA(Lu&%8MY)9;&nYkWT`!#_5rn#ud4?yZh_Rjog&*FQY*c$QN~r_u(I_kSvHyuUti zlV0J=^*QP51s?HS5|k6<3f(7pzlUqi$Wr^G z?#+&O-yf+-d79h#YhAJX;B5bEOY{ek>5KO;PI>m=Sl`5T^?f1NA58CMzo2#f;mR4U z&-fiyiSGXC8g%x!`Zw__YmV;DVBTfVzBK2Ki}1_G`UzXNetkb(>+qU+oOAsrthwLL zeWR8y>t@=SPezw`bCtuzrJ|ntR&ZHu&sf8%OE7fro4S~HIVi6hmiQrdC@JGV(*0T`&|}RnWg{Wj>?hL zS69BfZ7!HK?`W5GhU)dib328n{u4a8&LUya)3Yv{%O~Bb=a??D<<#qsXKwfWKKK8q z*N(rb%W8SzTYY!^%M6;RvMRxH-b?v|+5bCSqASjneVVj1+SA<5*Glr}(fj`|oP47z z@LO@Eo%9*a3_J1X6}GD$DgVg!S#!5P`TI_Z%2174M*9UM*6GR2X_FVuW(ZN8_fmX! zuwrOdJCf@mSVRFQ>w~P3Gfc-Hgq8+wMAbbWfW)r@Ua6ypr6d z->V5Gai!q5);ae#&D_fs z`YG|x=V#96`PL|}e-I%yqjiPL`&I<{-~GQ&@kpYFu`a6!X(!wY1b=&0A(|9}{~sZN>zj z#pi!1GqoM+l~uj_!DeOOI_?`CPE+%aOpbQ{bhmcLrmXn_$;#1|`ClJIFfe|(nQic8 z@se+QT5RW~yYSB5n|a4YeVyd-(%d^K>V7pM@%%PIH&-u9@QY`#Juh_s_qPR~FI>Es zu~9(ylI6Rk?@8^|3)k@YHr8(Qi&@2fo$c%g=0J|H#V_ry+^IHv#-p{o#N$bPM0&v< z!{teS(anJYZAKyynioXZE#udGfwXebee*gU&pp0L&u=#{<%=Gh(p&NDF6T@6iLX3) zf4^psDE{EH{+Qjb#UE>xM3RCe-_8kNvB|gMwBp|Po@*|?G3jeLZCJfG^hKQb^1}Z| zZ2xl^p3-}mxU(_;>Vxo!yKR^7+tj=&yLj@vuy93c1JjvG`J<1m-Co^TeB&dFgz?8K z>#VoF#;n~c^?~l%?e&j5BCF;+0 zAJv_o881mb+a;hhTTk)%U+<6S=Ct1aQXCY!@nYT!)m=85%O7m_|F>S?kx%-2j@3zD znrb?>rQB=mHGOOmzKE4~PT#bN*$*QwpSn=wGiO=&1}io>tw2T@cE3L12*g^82tMdq zi&HjDMk}+|tmL-W-4T0U=>E@33;a#C%-a2d?fZlq`)ePFtrAdL?PmNul=In}(iffA zJIs9=+L!99RLgQtVPBfQv%5y{ruQaR^_2!)&lfqpKe=LqKziXS>fwVtw&+ zwIOqCMD@2cxrCK_BXm!H@cqeQmn{AAoxr-}MSm)H#9D83uj1U8Q)pd~Wajo#>&%PW zH#E7w6m2E!u6AhEk2z_n1LiwhcRq^bd*&lQxIkHc`bvN^%r<#MlgLZuD%eO~gWt^(9 zE|Yk^<>?gDkXwxEebW5i7TgncBTrVgYV8*^*7y8XAp66MeI8dqVQ}n@mxUItN|)cT zdbAW=a{Qv1ZE(dfW@_`Y)(uu|DSsGp<-Y-%9xBjD(TPw7}9%=F~@_2Mi zYQv#?{|9{q;@1uy54aqjd~T<3|H9_E2Yk0CsQbyti*J7$uJVPqVzv3h*-Uv~6jts% zKR=Z>vGvsK&b+FHE5z>JaJ8ycEM;tbS|J|aUY68wV7p}f%Y%kO1Z+bTOzIW{Z`{>2F`QXL17lSvoK8W$i ztDf@FVue=Qgg2r|P7};er_RndOZ&=oW{$zYf}_v9tYA0M9fpR%h(!0F56H=@WZFD8Z8fJfiJ!)xFnx1^v`82Z!*<@wPilOx?DZk~y`arBjx zciRN@wI`RC7u!i(J-Ue8+@6S=vsbsk@zYrBo_TQ`eezh;-5xq0Spxz2*@*QaIrPHdjz zl+ya-Ppal_%lFC~f3V#$%UzQEwdjy>SHN7~A4<*l)RZjsk4f(QFn>)*SN6411O1t& z*Vh?Ot^Zf5S-q8G``v4&PCb~g$TG36-nVDn+fbW=Cy%TSdg(7%m7=-N{3Hu5XQI>uEmoul4A zWBSh%joxQxEv_jI{q$uuTln+x{xc8NOPTK{q#D0|B`{mueP-O0W4%9aY~4Jkz3hkO zN2kE2-J8oo#l5qILY^!=`E}QhX$KFkHLb~CzWl#MmKb+<+m5fRID(nF3N%ivjy_%S z>;{K?`t`&4^0SVf?vuKaH-UMhNVlC>T3F}lZ7)`)tlG7yyR}Tt{>HoGQkx`|%UNG* zb7$t%%-j1>SU2Q}Sp4}}hdAC}$z6Ul@QGN=(LWCIUv={z>c;vV{W(jlwtxQrFQ)7M ze-bkb*?UUacl!7J28!p@7vDLNVm;~eb4APgeRIm6~$;|stFHYPxbF0b`-PzGE zcJ6PRUVVJo$D0c??io&9|6X>7o!R3%HQC&!*Vf$2vHQ5SY{tf2jrwtGE8bq^nwN9= z#OjyN`uI>-QkXFLQb)_lks`tKLdGcAu)qSlxba$)OL+7XEhmVR9BPg zPp9{9jr|hBqo}s)VX?CCq|eXQK|y$3s{g_EX9Bb1yaJ1(>)XRbg=R%SFY zbN1QP*k7rC`7LD4GkckD#8d{eYuh-=)$Hi`+xc()>Vz5m`kQZjexoCI!@58xs^*1g z`;RY&I9lI}Un>2?pgD_Ae8b{*XQ~~w)X$s^UuyC17f;=$#r1vn?y>2oT?{l^%k$aC znNhq*?-CFD`geRWt=em*w3YVl*I2w^y8oK)3ww*T_P>_gGf^eDdtv4F{x3J{F6J#( z%_>HO?JZljwsdB3t!(|qln0yz z*Pk4XKl7;Zm~r#X=v!yg-*E)qj5ztf($pd813xeOe7=uM%KG*{7Rh}Wwq})<)}G%l zd>!)Mi4?s}`{t^zcuTQZw{L%*-WC~n`}DHgyKdZxI>Rrg{q%ul{N!~7G8e9-bhusU+O@N~ zw&g?g<%$<4CI~k%J+1n2cm1*tHOD6~Y%;adPk43tgst&{j5~p6%lUYEM0Rw&yD&5Q zdwAKW<>e(4suy&<-!sAc`-N@GOdpwv{K^qY=RaApW}aBJXz0#X8Lup#v!@ls?s-06 z`sZ>$T~nRwBK5MF=Y2(#tW}=3t6SE;n{)lucY&UJZYgn=t#hSnKXV)M+qCB=>~TK2 z=taebX0;uhJ$4N7|K}%fG_l!>YOPdFKU%X_14yoB}sF^q|sjk=6>d9iu$AL|C8}sbhcc1@TJXQFa z@b>Zvj_7&)(-6F7VQ%gC$Dyj;z(ymHpcvybkS2(m!2_x{=0VGd&~LH-z;C?o9&aH ztX*A^yXV4g?})iR#`hm39yeIOse4EtKel-0BUW93 zJ0?!gvz=em)qcI@AMUq<{sTwwf5GO*25oNxY)j_J1;+AD0^yGYk-f^ zy7WzFzcg{r6*u7vNpMhZQxtv>57 zuvEqV+I{5a{ac?8a*7&poqPZB(cdPWL%W`TXxT5A9oeYoe)_%m+yw_NH5#x!FWdTT z|I(Q)>`Om3iE(XubK_gHbo7}uDrGs5E!)>}hW=)Hx3Ns+^((!eSrd4+tAXzPT)Nmqw&JQ|2Ws9;>+t^>P}p9 z`|{z{%+t3`-tx+^quD3&Ufs6zlsHSBv|9dTwUz}IU+n5*M3~c<4xUvm*_YOGE_%^t zk$Fd7#t5vOd%Cc%WB01*;clhR%%fKPnkZ~B$n({t8dmXqht z`)53m?MjI~b%A{{M|nxoN%6dx9jQ@DkL4zundA6$&d;s9s~6=xoVREax9#%%=VyOk zzPad^bdIMelcoU2EIp^^tWD9~62iNk11-f3O;jfTlk?(xQ=s^7+N%ziV;iT{6goBj z?@(FxBlOO!&kt3@f1QgsH0PjbPVAnRwN5guOpd~CFZMVTybj#8YuCQo-E#%*F!Z^y zRBPS*znndKl2lSguw&XD=I6a`JS)Gch}`GuG)cOAXzH2w_77GIoA12gry#)buB7E0 zH_LVzLsKUO0S*?XMu!V3g2Bol28iz~6euVL7FG~2@pN(h;pcqmQsR-zdkjvkzm=)+ zb>ceZxyS8XGonjtmqoGvj;d+5JGnVg_VxFD?<8_|q+bb<`?7hzDR&49)4{pT7k=&* zS@^kEu=R<^sXw~)o8I=HI=`&)?~a*Di(Z=birVKr`1|p@$;FZu$4AU$*Y>alu<>|1OJ4|2lWRG*7E>+`qq-Sr>(t zu~~3U6uF}9^!&X^%Q^ENd)}T4KixXL^lqGPKkvFQ)Z+5{sjW68!6!X$?5KR0_}ruN zb=r!Kr>~3;zl&0-w(6^!mVWG>yLCEe?47#0n2(&Z7jf&xiLTDEY?+?k{;nIs4L$eIH6i^7kC?*}2)XE>rIIr6b#% zntnOHsIgTn*%$aCEBW(tBd6!@T|#DXo%GRRS=mwjx+tkPGNq(m=fTekejd-lXa37} zYELYXwwhgU|JeJ@cKMI*H($`Kk@DYfE&aFn{}cZ1b4NlRet*ESr+?qkGxkgoJ8EPa z_v=2J@XT)BylZ`by{8v?@lP{X)a`D)k|W^n|IX*x_w^e#^*!PU*#C36Tt?16h6Ts6 zZ|MB{xkW#7_qI*BSJm{=QYVHLT)k|zjKR83s?oEVr`^GSDub5fZljPSQo-y5bUTOZU zo7R_~pG?oJe_)$7?@D~()~Ww5*KDd2%PTWtJ*ocV@9F*@zXHVEwAy=hx?7vf4j<-R zbK`Imui>-gr8#~Fc4YeS@E%&elg;b1hksY<`&&zEWCIg+F3^hQlrit^RIa{sEz(WA ze8$>ryXU_<)@aY`-E=tO-p@y>R#jOVzSd{gmCpb0^c%~mRr{vTahkF3hh>xP+>N19 zC;Y8X|9c;{>D6}&FP)NOi)Osi-K=`^r{SZ{f_Lw4HD1d*XK`!gMDNl$QO2_?r6(IQ zX6^4hQ+cWJ?B;n7m$z(sy_2;eM&{(Mt-mEd+>&71e&=wT$i--d4270++;hdP^h@?} z2IXJg{iNw`jlo+HsaE5^>ADXe{_^@^w%ER|;l!ncsxO}sug;ut>d=}GOTy*zz4~iU zcM462vATHjvdfiU!Z%v?omLlK`}5ydR+(P2i_3%EWtLc!Y!!=Bj+C^D`nB!2;YIQF zn|%20T2EbWEtmAud*X}rzxEocH+{|iHYxC3!~GX4ZS2a;EH9^RwshWRBgVyF_2t{L z7ZmFIP!i2X*`>dw3`_<0;(SPwrb>>g2MF-C0pINx{_2upg?JFnV zUGVL|7lKOG_l%;d-e-V@p>Zxe4Ikx1w*rKcUhwJ~X5=q{v z(RcUtw2jK%?kk@->{j&ubmmOu6gB^+-5RIaGITpN#coZS^H-HSP#e0J^16I~D2%iBLco%?)!r}haEnLFnuPBMRa z_3~7Cv$PK0=d8VK3qLzOU*CVBa^dH4wXfUH9SrgLb~I^%*M+NhBz7&H(A~G`dxYlZ zUtf+^`|=dJ1yr;a)bCE>t1q6RBst~W*@8)3ou_mUZ_DPEkzHH3S@&s#A7@Z|nuVrA zcy@SW;|uxy4^Bv5{`vlnQ(x`&=DgrT9TESO)VtQ}DlO|iexve%##4usMa*}v`z;PH zXRo_Etv@GIXG-pek4;DJKVD(*dFvCQLpvs}_4xO#@?LcP!d2}jCO%wt(IWa61LMlb zdO69Lo_}^_>fD~uB4|;jB)B?k{-+npe}DdaB3AUjjw^6>mqJzu(+D6BY&O3JH5BMZN4|gJ zXYG{-hiWr8RJD>0=I5SZmAP5h@yNWH^V`p^9T6F~*W2IQWxK{|)&5sW%p0@Q3@SG_ z?ODUMi+A;d`PSB!i9{+^R8UP~`6%6@Ow)&K99U97efTZzNccV{LXTQRCmw0JTVq7BD za&GSVD-A*4YX0&4uXt*D?{9(dbDg-v+L^bKqT;uuB(t(b9=f;i*1n0$a*Q_nMp#-V zX1_b=A(dk)w6w}L>Di104+X6BOa46rlYUF0I#(@NTBJ&}M2Qo*e=^9RtI$v}za#4`T57yHCCFdu_ zmNQvv?2ss(wpzURT1(39xt{tg1yx72&fVIPI9bGbj$T{wNxv-xTc5Co&W%b+^m*bW zwB=)N|JI%BgN1f>Sl7wM>P8%?`THl?r$g=B13&Tq(_(fpFIE5d@14Y>B+otf3Kp#r zy}Ns7vW2{JlVHHl3n#;U4{f`;=6>;{&mYA*EM>jjcJ5@4ajt8NN{%v*HVv5Olccrf z-6hH6`~L=PUFNIJdNech$!u@Gx6Z%Kj6B6B=|ki?2X7@MdOd!zkVUPPU+Kg{h3fS|MV7hjv-#}~t?~R^adAr@ z^GmHe?`0j?MN{IESGWC{yt(^*o$Tq|{bwIP?OK0hs>(y#45t2HOE#6B(<@5VD^=CF zVkDV-fGW{}`p0KUES*R(k%pmxW)(KjKc>qD|ftb8bJ*N_At*{&alN zjB5wOd?gbPrdF)yfg*}k54PE4E5*YZe<9(!`-)w!|IoznEla*T zGiQqJow;`Ts`Ij|b;XQ+t`z;zC+EK5nM%D|jBVonmX;3TCp*~;GQK$X$VhZdKh<#Q z>dZyT_8;6!zDD|+KAq2H)F-dtR>=R?-QMR%$G$Cwt{*?McmH@*F?IhWp=$s58Y@;q z8=W4-@8w6gzOazCi#TLHF_fG4iBppQk;OUUXF5I@w%AJ?dyo*nW#`8^RvYFzb58q} z?C7JrMb+}&=?@#uJ$ZZQz`>AW<`|>a=Y0j+4t3il_8Zi_DfshN=;p3HpYE;y*}7H# zaeRFn-^KV%HJ@A6wz#iekSJgkuk7@^^&I!y{34IKy1GS%mkxN``eyUxnvmM={N!s_ z&Ufrvd)jqsMPJl`P0ynQH$DlS_ReShMtAoj{`8ZtG@s~7o&RHd-RHmf9UjzPm!b9! zrp5<;4lni`&~bV$Eqk@9g_XB)RjU3mn{O=qU$#6t&@TTW`x5UOh85u{T**ov1+UI0 zPjyvD5mHS*d%v-xv3mRf9l9;Wo# z;?w=eGpDOs%uZfyyQAVBRrdDyj|V4r+=@=T^n8-c*7m3QfBOHXrT^#7li1m?rseRO z*`HN+I&i-&xS>6`St^T^bRZo&g^WoZT^kk%ot$_s zdA`z?wZF`6UVmi$#d99->l-fW>uwjEU$N5WMSA|hW#3F3_Pl!0@1T(Jhhy&kvmA5t zdo)y*2RzIFIXSmJq|WT@>*KjvN=)24R6kCd!&#N6`C0wj!ny6vbGcmp{!DJa|Dmv@ zta$&*Yd2+Q&lf#c@$>uhm9E}1q#i^R^W-VTZ9gLKxcGUWuDGwr!q2=<{h5_Z_607Q z#Qp8l!{WdU(Q{v_Qx*B|=Jme|!Py~`T!p_w_Ek<_bzWle4BJCpvhVktI?i7FddsA( z8=uZU_UwGBipe}%NxLeGgN=1t3Oy6PUa|Z$EBNac-^`r&A68xF_mYp@xv8?>q(3+F z*|+I?c2=D?6&01q%6;ZL z9aZkMoqKlw{1=D+$KC(@jz4`fPUghr_vg|!tX`U{BU;Drci{I6_B|U5#QXaDl`lxC zEdO0m6=nUce$TYvsuk}mJkPRy{PN^nO5OgBspdg9q@qCthlPWKI%dL1HOfU)4HvB7k=(l`)^`a z&#>@wxt>^$-wKYZuk2>JJbS+}-u&|XY`mF)@`rbG-zH0cQj^|RdvwdWtM3CFzdzQ# zx#uHq)7FMd?GKZi6Yg_~t-pKj;^EsrvmUC;OlXoYKE%G%b=s62Cgm#j?(K&9vu$2K zGud3e?EDr`=Sq2>Rpjx@wNuuy*!^OYuls8}yY6qN>FMW2b{D>C#fxl_l=DkCD!1>R zK=Qwgkkn!(xw)q|tvB10`P$4Z_s_KRb~WvsjioZHHlC0VD3dsC9iQ{y`P%)T?oRKn z%$s0-?JBtY^zo&6&HhU1=xuq=X6sM?^k_p_#;XTCu7+DLOiOw0{$g`+Hyf zBo>@r-JO2+<1W$4t!ecv<@}JsNZjhaN$I^N>uD#?o?~@Smr-$e>(M>!TmH(z@ETk#?mmF0dVpG*Wxf3TD-e81`4?xj6t zoli2hbcW5f3bWfDWjJZ-!o^GTt7UHgd=xs(^XA^*%3Y5Y?IMLc_xbrc>Bi2FI}+W$ zP4Q*>(mj9A|Nl_DivRKb$TK1JZ=aqPk^A!Et?$K!b6rGc8ZQ9%rv6q~U#gEhw*TKp ztN&5kW((a{__KFQ+PeLo^$ebor+)g%e|$HaJF@)Lyo2j?pB%NDel$X_EBX7b)IYzs zzC2U$HTRm!Eu)NQHgexL|545L^wHg_YWdr^rX+sL#rvOMPTD@hINR)h%#KOC?w7UC zPoMtgrE!_cS}hrl%3|Kv^|wy!IxqhDQOCE8v(LC^HZ|Y247xNg&Ng;^4d+#%_0f~V zvp={Oh%1)FK^s27&vj3Ps%^Stba1Jq9#`j{3E@AVq(+DN&pbLUZQYI;Mjog4RI>)@ zS)ICZBvph zRXt>9JzT;N>&w2IIYHsqaea$V$4dTLZ=aBS|Lua?Qw)@*?LX1^Xcupf$Jt+>Pk8u0 zy6&5N^O#D{fsMkQ5nF#vahHF2{=5423EIr3%zjijK6+m`BXf(=&K85b6zxg-Yv+Bx z7Jq;t;pvHj%NcWC-=4pJzSEVoYdN=KZ*tj*^{+ZB?!))~_^jsr6Lgu|MEu@(?wnGV zGsiUc_xZ)a>gG#Ugmkw}(CN%vYCP?hmh!{(xo>Qfc3hirN<_RMEM2kDt%)n>c6v z0p$uI{c{lw+Y+?Azt6TTU8U1EL#0zLcW=O?gG)oQJFn}WUVZ&DJT!mK%H^E9KYHT= zC7s3o{>taiF`GwQ%ls}m=(TWB`U2znXRzcWp|+-WtpG0DSv&y)$d46VW9ZoZXG3mNTp+|<1Ad}=~6^UN%5l?^$1 zQ!#o^HYpFB4jtd}>Zj#ncD4mK_jhNrIX_M6>Pj`)c1ycGCks7jDi?nC4Sue>D?Zsv zY2}W`4=;B=IQKl_f2_&AgL^;bUS-l#n;4X>{o~xSA20IXT;8gb;=msA>Ku>comp4j z-nIz+nq=^@=)~mQ!orIRGrLZn(>kJ%S(v%Z@!Hc#;mi9(ICnRwS8j_|S>5;ZLqWU8 zv^^gTJ8PE--aGjzap7zJ+z{=kr&V7>h04Bdd$vAYBQWVe!k(YOJ9IxCzq1}szsl>? zJO5n6wffPUHZnEqB)$*Go$nTGHuI+1nmKben0`-C;oTQb?(?2dkpJQH{q)E(OwEgpGeQS&Bi5$th zt0xH0caU{2d1rG<>E@?sp*&`1PDz1d49_*T<#g`6QZ?=KIiabG4(PA2E(<;Hx9PQC z0z0et;&Vk`7hRk+A!oPo%T@-z^$|xSrOk6DC3RdrTA+8cQ*7PU6(N1^cdy$%z54n`@J=Jg-2Hlx5>($6r(3R; z{jKo7WwCv_)P3*- zyV)k&y-|Kf$2PugU+nSS{`ebpHh~+-4E_HfN4|T^Ar0zd{fsD|b>R2w`e*f@+a3n) z{oob#M}5Cb|B9(=tmgO^`k5{D)3eZw&3HG(zszszl&p^Fb2fLsuk&5{Hu-bK&xHb2 zEMJq~WPh%>qCR!){kN;;n6o8-J78P(vI(Z7Ep4B(t@$kb*OGZA{o?LlRX3z_EEIOT za4@Fbwe|-yxNo&r`)(C~@}oWVA6I;Lt^1p2ZY61;R%Cat7RbLIk_!7wr<31_Jt18JDg$c6G0N(EsAq=ZSfj--Jw682>l|H?XZV&f{`U;lIH z*7T3-?Va0S=tu7R$+R?lX=w2togMnGCWU8zb}x9YShCLz+Sh$j68Guz=j^Ph|8Ms# z$vy9!uba5(w^^F+-<}t@ci9AYK3~DAQ@u`9&^s>m<+(3X)paW03#P4^=X7t;$20eX zkK5|Ankw(SQ2gunp2~VF?dAIqifwL+-d=IHs-A_Z(X!XR}*dL7+M4f)^^O;Z!R$<=7mv}kbe(% z`jr&{Y+qhAP&#Y6;b>GBtvh)Qw-et9%yT26D z%gU8APM`bq^L1@|Z8@C-uhfLLd_47JzHw6J-g3=TxAgZHZ!k)@9M-?}S($Z``*B5n z!!!5SUJL74cH1QE&yL3L$L|Mket|Y$7E;8O`fr;3&2R2c(=YF-yEEg+t%v3{G7InC z$zN3(R{zh$fGd5^pWmOaEK>F1Ef7)CToK-KF1ll7(>GVwEqmWCZ|9hsFHtWg0qSK= zjY&Em{{M1u3&5QT>_M(zCSPd1et z^YV+_v%9mUcec1(S>KfHd2L-0pJx{>K4P51x7j^ncj15$K=oKq2cqQKg%t?yKZW2@Gt&7W>1CBNiYOU-4@^1_o(;#48wA> zllo_qqoXe0J|9?+Ent-|dCExke2k9DqF&vPY3JYU?b+pXyxa3-N$5_a?YYH4x?2@X z{w>SQ`NuJL|K>nN?UN_NnwC77*EQSU;Qti$|L3%h&q#Kje6ucK)d58dao>&1miu=n zOwii!dZzbh_Du$BG94GX{+_t{Lv;buJ@@-b&*T|(V(j`3+!rhMD31m6l z?5Af>Fxq7=_Mv7Ed)ty7ujh#0K_*@rx#A z^*zsjeq1a0X3e#~YL;ITF1_x5ELPa_n42)R+O2uzuRWx^6mw8 z0#@&8a_;`c2s2-IE#;gdo4-L(pZo9UYDdpG#WZi` z%&y1p%5-eASZ~>++01u)zKZWcSMj_vKTbAQUAS|*dlAcZ_29xy>;J6(b&=a5yf)S5 zt>Yj0sFa&sdwS!Z%wFQn6dV-PSe9crE6u32$~(lj)4SOH)8kT!&znwee&=gko&L+_ zr_NjcJ;%>X4!^c+?VtJ2CV$;ruz9kkhuy*V@pVV8w{J2CvdsDN?*Cq=gwTaL_doL` z-@lprY)>(3Zd#Kv}3>7+9?{2H@`4f3Rfotr;ou4}wxb7^wY&D~|1@$MoKdMmub znU4D=KRPjQOX;+WM`hDq&pQ9pPU&^mJ(bkHAvn3t(nwIsY1Uq@$k73&DmH9B? zz`ZE9bpe8#uXjHce3jjwzcP8Ppxo1_1Ai z^qv#trx!mhu>F-Q_arquEa$1w)6~WlVVrCMHzWgRgiH~SxV6O`)>9R({it>N$puJH zb=rQB&VQ?#QqFWH{GGKoWs3C!^D3?W^K*UAZMm6qZo)+Fvd;&%1ZRkx`!auPOZ)ot zpofnA_wI?vM)|r-v@E@NDfN}oJ-*2n8_Fc(=bmO>zR%~+@r*xvw}56>AMVY3`Rj|) zJucHt)n9|Isc3$XGn&}>Uguchx$YXN%E&*eshZEtYmc;vD9b7K8@}Ayn(_7ghxz-p zV7=NmCoTnQSzgFHG1Ddp22XSc>mI9T%nmw(mQkITN? z*gj`P)yBvq@1k$%KVIxR5gq>N<^P}yFMC(y%$*o?`D|D~&b!*4<-fFVTL1rVkzBUK zVcCNRWqnijc&?wf?#~9p#V7NM^j5fRx+*La&{A`$_iOdlC(}Jwtl?d-dDVWe4Xt;! zTIpy0xVc)^+Pk>IbnA@Ey3w1jE(_Y-%N4rSYfj^WEg@A=yFdFGOGhoaes#iyO3+lv zzQVwIZu3;uT`{H}TwL#dylZ^rA@O;Q!A*?`6AeTo0_Q~+KMgC=I`X#8woO=0Ha4k-p#x} z@3gy_=;Yds5=(?iOnalXZa;X;+PVMu%(oXO#yClsZxTIu-|l?%YyFUK9TApBcT9c- zt>2+apzHkmdvM3CGqZd{_evdq6u9+g)5(W_BZ@zWZ%REd;ZUco=JZQ_y_=V1|F0~0 z^`uQ?YSzRVCtTfcRU1J^KtnVEuW9TVld#h@p%44hIe=NS-ol`#h$?PqdJ^lKfqgL??!h&-`k{lM@ z@bX>t>sI>PIrGm6FWpx2@NEO%OtI2!$|Z6w=fc(0OZIKNU{Y?dvsGi(^UIG8##|AP z^}LxMyj)J&GFx6d?Ok$fivNW({gvOIxYbGSm~nOUn-e#GOLE)a^xwAg{>w`q*R?;C zl{qNg|1@oBRCk!_VtqZs-_pqa-k_!B?lmEjIsHC+?`%%;Q8Y4Y=4`IbTztoA-Oj6K z#7-v09GLjFU8Bx;M#B8{9o?J?i|21i~RM$4;iUa$bnz`$gw=U~J znN)OZO3_J)3FAz^TVqiw9G%KBcRv?siZ$O@%)Wjy57$!G$VHsr-)l!bxmc8=w~9M2 z=Fi=}E@`RlQ#No{OiJJFy6M#ne*W@~l#|@@lW(L;J)FDldY)mDNt4qqt2tX)7RU7O zb2@bH-nBoscv^*2*?5l4=706|_r@%*Xr`4xT`3GJSr-;RH#S``#diMw!}f8Nz2)|I zj_kBLdvW!WAJ}@{rJ0kW{@z^W;`y7A`GeMt^Yh!ev-^6M91K$qTy@?2$A#?+GL=jI z{o1}v^VIV6*2cJ%8*3zG&%Sz5eCAr{0-dvI|8}OZU0ErnS@N$do^!7F9XGw{7LkV% zSWcd5;f=9uQPS4D(0pvC3_E90cAwr;wh3!`GZ?$m*-XlKxKeyH)~x@$H&-w((Q3-Z zcT3(}N!sD)J23~^-<@$Ta=PUW6Q%e0ZIxa$XOofS$#Zhn#f8S8?k!X8 z?PT9;rrLeInw>Ez3U#uv6Bk|1o_L!}ODjdCSFD%i=~X>5H5cJ@2`};g(=^V9@y%TL z<;eZ}vd%F&o!4(ydtU8&clVCroPNcF94l&GJXx*w@b}d<_a_Hv%4xY9ok}%!uDJf4 zymcuDR>mKm!Te zXJ)yEJ4W?!wbsiizYjfJ&(g=hpuphi;uuo6>x@Tn&JE%0UQW@#jZr+!#g&WJcfIx0 z@|hJhNA=8>6p@%SA35dQGlG z_M=4dUj0v}=iGgfa$v@ZpB2gnnU4#LZJ)W~O_0j%Z#$x9zHDD{Ql6nF=EkPZ$;tDc zFBMlk#ix@{T~!*ozFC)hLd?6R#oEG#_VY~lXZ`*(6=^!N`1tGx+Z0Onsr7_iiwTk7 zICb*boHeTQ%=6Tww^>IdheS-QJGzqBsE>Szb{*Q<7KYpv<1tUG)`Wbq%-y6-e|pM=1(uKu9GQ|Iya~I$(nUl zuKtS@E=%3q+wp)wws!TU&J|wI`;KO~M$YT;{p~d85BJ9W=)Ofa+7_v3r=0AF)tB9N z_VmWrK@F4tKkZ-KJ?l@#>nzFGLuk{UQz@GEoP06X!{OV`{=~(HB<|c6Z{IWdjrF{! zP!F_T`=L5~z4lA_O4fF)rR@oAy>$(adut0%Scj&rZt8i=-Vu1m`Ts?JVY@~8xjun^ z{v1@=XBGE!{gNa1E{o6ibL8RYPCoHBwoupVTpRzi556f^o0xY_xFP&e<2I|YQVq{T z{x(C48{)ZnHp}^Po(D87{TH&(U+sLYhI8%an?LR?mpQri8`t&=)1Fl5A3kg~d3!N4 zd-e>0WuIh^Ejg$+=gtRP!AR2((KWS_|9=^mbo`t2bhds>d3=E5Wyed?3hKWLah)?$ z4l3W={j}xW^^PTKj=6`H8}uty{`{h=<-Gb*(UEI^YIlmg+;KkPFkiZEYq*+9N!*J+ zrR#;Q?(dlJ=g%LPjq}1}etclA^WF6@^5@qUpF|%PPQSmEIhQ!1mcM)M;8b|EJnNmLgx`eaVr%yr z>)v8D`gD@BB||yl`%%A1vmQ+h+Rk-y>ONz!&%Y9s_v`);zklyX7H^|N!E8Y*eS>b$ z+RhtxYa1u#+I|R{pZYfY^G(UtjcQUX#;@`3VH|F2hu-RWdf%}A)#hG1}_dgzfX_eEfBETUf>-3y8P0;GT2FhaC zjs2S;o&UxKo=QmF|C7DpElZ1-nv5l`U90$eIYnou+l4O^WM0~Q({#GMDtrI8X*ZCj zT2I2JTJ=vYU69stjyq3e;pgp=3qMaQdMujgs_D45MJK{N-Z0iCGPc1w0Ra&CIgOU$vk%P%u~e z(TeqLTSA$go=cya&*t`G&(S;6+9qvHmRx7XrZr14;Gk^bo&{HQbkyt*_tP} zbe0zAFNu6#^CoKA;t)-Pl*|+N@5{s%-Hm7DP4vE5#G!wl@33g+A=&?lAD2~VO(@`- zdAMD;DAFofbvYNxWbf6Ve(N@NrQeWA>)()c+;XQZ-k^zjK)zKJ8`2 zvm`~q+?>wqS7J&7roXH()SSCcEBx8ET)!;kEvhB|o`L)G>+AEpT`l0f_`|UqT^EKl zIv428N@6dnD?g|ZnsD8C`ZNBN#E8pHhko7Z-xHU!l2Aup1KLer+rBt|Nm_G7RZ+Up z{`%Ibr6TSOK3`v-_q}}MkKw%M$G4|#xcutVe3f=NpQ^uwca-`j#_UytOzB?!x7gLE zPOGK)bNNK|Z~cN-l*{Ly3wMs3cl`6on-!j2(fe4h_1+eOb>OdCYcY66A82tm;w&&* z5a=cH(nQAk$+5QJt1M?$^~5Pk+FbDTFW%ZTr^Hl?^+}lj+G*J;xpKzy{1+F89#1`L z>7VxJNx{>LQ-dTECqI5U{nD)ZKY7uWB1<+kq^B)=v}3odcYl=Wn|sw=LNW7wj-K52 zY5yyC{Rc5$r+(bR{;@t|VygBhv#N>tlk|RuA$9n<*;S>^OcR>^tnbP3*9Om0C#T8`wz$S|KxVZcCF3ntibL%_deRt*+ zXrA}>Q}l`dBXe-xxf@!%PnOS3{a>yf`L$X`Rm=)B<(>Vk?7{c&vu>WbJ)_6-+T_B2I+FF$ z(`8;-TTeN+YyOPSHx;?oeTsz4BlA?`@-#=kOLXpfp_|d;VW!&h<*e$3)l&z_XN)}Gvcsh<%+k_Gan{7pcu}iL!@GySUD|kLlIQuunvplG zwkP?za$SC1rRLOpQ^<-RG=FiukIO-C>%$N6x)u=&7Wo)Gx@tMO@Nlrk>92{-T`UqW z%~WP;?(^b%^YO{;8p-nYHf|MR{;R%aKM`WTRBXWQa(~VEKW)<1o?SHaQ_;e;VTP=*&i|FfG{5GXMmYQb`~311AT!kq-OAR-otmY> zde2$S=;Pd@7UwD_`YW$K5{BICXO7zC6MN)#q7eHvy~nGID<52$-uYjmcmMQh>y^1) zU6*$VnpRYI**(X@@R8sriOF%%9bx}@{{LJZ)bn(aMcMl3V|_ZZOD8eEZL>LPZ2UZM zmd#ZCMLO2{q4j?lCN4er<;By(tBeh&GOa}{X_B)DzF{9j{omf70I1|ND*8?pGSIvTrY5^2E35Ysu60Udg29?`|C_tJN(Q zaQs{%{rdZ=llqebBBdSDQwvokz}4@=^z~(Lbk07!dL_wkd(PRg*V7rmEbwoTJHG0^hgeMW8i(nt**qN&ir!`JmE=sGC#ojRY9zFbN&8fB z_PPQuzt$ah*B>u9)ZFyvSjK6bg8-%4N4_d1@M8kVz*u5Wthz`Iu`weX0F=a-Dv zt&@0kCf7P1R-RaNuXC|@Ued|#3qPeMXaua*G}AIv2+Uck7FzpubJ;on=bb^(`#zL8 zwEJ|s<$Axc;h4ML$L~dr?+ONyC|hQyO*_x;?nyHdT9#XqdS6aGl?E=g@K^hala#g41G(UmlV&IJqF;UZv6MjEU~2*-JH&?(Eoc zTI{gy8rJLmy71}nf6otd_q!YYZ+*=3?}O{1a`{J}ji-5D{puX2+XkKyKl?U!;)VFx ztRh}hBn%|-?cRy~Onw(0v{d9ILlC#q^KB|e8cOXJ%XqBpXXvebtR(e-`?D2oy97%e?Iq$xV_HQ`t^=KdlEr`@hIHs zIcxYrr$DdWVn!?5V{eM(#{Qfzg{_DuM#v+1TANC;o$TJz0ZVVp$UPZZbT(Dx6t6<0 z^hKudo)@RRxV|hX)I09DsA$Jh!-N2ZWT(X1x$kqk3%D;Y>?u`GT`qR`?2o$++f;79 z^Qls7xU9Xb_*yETndkA2%SSI*-RzvV&TEIrQKUhFHl4b zd7dYG7%*wcTm4++`J>MC^>>w!Y1~tlC7*7Rytr$hJ;M~&O;5M0wDobQs$87KcrLJJ zv+A=VNj!rH9dFmNn0H*LJRP91;y}wWpWKBW&!ijqCc{5L%P7f?F4DP+6+;32??f0U0hnLx#zKzFPx>iK!wjJDQb20qr zHx*GeU(Itu+qbGJi?7hsH%}5@ve@NPLWo3w_S%#Ep~}k1!ZW&Mqm2Al2ke*eQ4Se+#?Gi-LqnRijvH_E=;tsvY5X3 z=(jBj)7G*J89saSXm|YaPw$dHSL}SGU8d?;!9VN3V!M?&b2q>K#C>kcv5U@}K3wuH z6An9mi`%*-)bIAeXU+Wv*_UkMOx8Yj*v0j|+Wmqf>&)vckJbLJeB~9eqf}+Z?!KgK z{#|_)JsaB>j$T?dgy(>v~z0b4Egi3;LuQ{d@6ZL+ zUajY@cU{_A*}Z-8q?~{q;zjiddd^IrUtC@&;ycmQaAV(`Ghs|ZmYv^X45nRP+TC}s z(dyToV7{GFey-L+Yl9;y&ffPBNr_V4EiNdtU~&HLpf_K(xu~pI$>3$QRmD5C$ zyY*Nte#ZZ^*tOzh|F(70eyZGYT4tcSLzHix)+4jGPYzw(xq~q$^Uv~6=i9j>zP_t^ zYqxJ=SMZZe^JPi?e{7D$W`HQ-X0wmj`Ok^ zn%(S=oM>#USjnRiJ6F@{6LY;w`1F6Xzqkh_y?@#5zg(fMz18r^zjZsrWYZ6`d;d_| zly$H%#^X(A#gw;Al7e<^AJ`8|$h_$`GoKgCzO7i}U{L+43+j`f+f7-x?`BTT`{2GO zVbyn|GrWuTOn;a-_vG!Jjm@S$9Kk>Nk}oBQ`{n(Z*Re)wmFTs7J@tPjtz7C)emX0@ z?&V%V6F!w(&hO>=3m@bdE0vn>ity{aP{}>vipmP#A0p2TRrKfYb4|?%jq1Cx>a5`W)TP(KW&CW0voyw_8tuJTGESq@eaO9>cuFCFX#`XTS^SqQCiWWZq^1br& zzmhP&`et3zbz1~DSV}?rB7WZPyHMG^Ls$K@X=;dW^~VP@3~eqfY_J#4e{e@vWKG+a zR7tm>y2v9!>s9v{W^=ATwK-zf>-P(#OuzHUwE9;vt=uJ~^84Bs4*CB0hmK;d*Gi99 zIre(2`!aXqgzIdf8@}H6zM*v_Pysa6%{_PjTaLNgB?1NW5>lf1_gqPj{C%sY?AW!3 zB6HpHPA8?vy8pB8u8i!zptkeYgjr8KPOtkbA#WoYUajr(D`wK-ZyWyf{@-Z7Kd_?i zyMp+HsRc7ii}yWlzx=aTIi7>1To4po_sd$&Mfc2*QUt9WXmkKA#ojxW6}o%?b(5{g z0=I|vGYhHsquge*9OOz*QB-GkKbA^#=*jL@a@8%5;?#797~-a zS3s2{UGJzm%;tJpF=G1{*M-w2be|6_eCV&mm0#d3;hVn3y4PjpZ??a!Pqg<>j@kHW ze%GyazoaiVe7wUxC2gi~T(I!YifFrNLZQ18Xu?hlrOcp7{ z=zDm)Tf8CjHq+&!_ce4GQcpLoux?eH|3l6>QufNRRjgY5`y#f!X>ihvO+PJcI_Xr4 z=1=KUo4Qv2Q&XNk+p^!|GVknj-xp8F|NU$dQ=>xx`(=sJxINq~O|zdCx!zbOZpL^x zAZyJ;@5zQL{~asSu07ROt)4QkIbeH6`=Kb_V@W=$FC~QQ7uvjke{F+UtNZ^`*(OmM z{>NwRn)~TWcPMLYudFk70-goQk2;yONY&~oAB8vgDp#%QSK(E8 zqTB(c*pa8=x_HX8MaG>(muEMf3NqPS2wT9YW=@!!J+>4{#jg&pI!+> zU%v1ww#By2{@)`00A_vbQ&YQymqyQ6J9S3x+}vX~4@xxD-nbd?)hzC~$(+4?Itvy* zI-YReLUeC<{FJ=JpHc?e_D43WUr82oa^X4o)6X^UT>I-71(z>YKYm{RGh^!M54(N0 zEctk&EvA)A=ScK(wl^*6+<@9(s>IJ*CfT{vl(&}3U4sZSrK z*EGKT-mJ^`G?V9LMyr6JThYE?!P%b^EyXzm@AC1r%>MK-RFp{|XGPt%lrb}b`?r(ac%jpy_#&lX8JCelF-brT&NLM8Txz9su_tAg>g-ys&8vI?G8BA z{qnQ({E8`O+l>Cqu#?{rqrn;u~c_PZWy7H+t8iepNBSAKk~J7cTYK7s1> zL3^aRH(Euj`hPt>Z6-JG=>qX5@F8xZD_jh)j`5ADkr9e+W>6C10UxD($ zWo{mxj==&wXB{rj;xu_g-OL1Yi@tITHUXaoiuH~)9pCk)6y>fwtnqTP9EQ^C?D{^ zz>R-q|E?)Bo&O~B@9mWt7cDliC5G;6Tfc6t_3_`6H@q?z{_@wj zs>nX$vf(6Q!)$xCiUqUxiRqkf+;scEr-Vwzq<}K(AJP4f9WFEFt2SPGn!$NJQ6=?3 zwuZB6&yj*12`|=4I9qpV$zD-OI%mWAzRjGY;K6;(#R-ZmlRgVh`@C=p=gXK2Cm#tp zxlBICen?Bub|3$iG8?6$>q$m3Ys2+3>`wi;xXpIPvy~ZzY|r+sTD*P5qz$}w>~}Y_ zmH&KqLZWTv?hoPb)zxxE+-CD0j_a&{uUPvfJgG{=?T|x=@9*gv21XZSxi+u*^y7Qr z%ENVAUQK&=Z^Nev_cJn>*BukwE_#03SJ{4@)dqXHlnXUhrA@vgDyDSHG=_+qbp}y%Czl<)t_kYTlRP6F)@`sF5sEbb~wuUz~aSK{Vw4j z{@OCeGyYp;Xz|Y(C~c1jm@h*hEGf4v6F9)ewfdu`&V3I%A>XGekPXg zReN+sw)@%+neW@qwzIDgYk$_mIv=F@hsOui7^xW9(|*o5wmlfK8|Hw#~uXSv(zCi?I1 z@d_KQmJXjupN|V9TFP%LZWOq9mcc%)*fQ-Chs@#g8TEUvZeor- zc;@u{eUd3LOMLUw1G3G`^Ht;z&Rzfbo8O^%W@6P@GFVM2b zuC?gc0w43V*M2pvt3Q~RJeQo_8v5BT@4w^?W48op8@8p5PuCw`^Rwr`zuJj~;_e)R zOecR%a0!8w!6m_#mX`K;dmdZJK7UcXp=;j3-TrnZcNZ;BJiSwDce3!iKcbs<_X{k_ z_PpF7&2_JS&vDM(E43{DKlVJwEhy-8C-R(ww_I=9wWOc52`Y=0_dD~yIdEI!;SJq$ z2X7diJMgSXSR+dPp+?IKMV04=-HPHmIs_j%Sct9l=lgbKb6^|aL9sK>ax1v^DJV>S zyZg9@!)2|Hxs~%BPWRuLAIG71$gjvQN9B2IhlG7yRtw~UBSD{SGa)w{270nVt~yfE zI_UtuZ^+3-RT6rk#R`!}s{|K$uM$73x4SbkyeB=NY0yBGo z-nMKjlhZ%wUq1hM%fi0}E5lZGU;F&go4exwZnv9LoH;&zRc~f~s+#i|q`#1MZbDUoAck1C4e``dS=GtytTW~e`p^V9_H`_{Uew=Hs z`F2+Cjq)<1ztjI}M1K+$-SlRXz@v1>qPU{CKQfXGT4e&_XZCc)_n%kW+dsEqcjvAy z(KGx1SAMdx(>OKt@X_o4x;mGq6$g1S)y9&lsB8=tHi`(3$1Ftsz2NJi`7>w=Z4sl|K8t?-#*d_+ZW|z z&{FnD&Gv{kf7<3h>!g3&zQ+8!Fe@d_cz$Jg$cHDU#Xn9-&)eo?nP&Vl=Uw%;x=rSP zCR+d7GmVWqnkT%i{&i3y6MLLD#8C>YmeUFbaVRICGMLgW-R(xdb9Hu zlQ&19&ZN)B)j*-QXfh+4<#pRrx{tqqcvjrMVc#ZRUA@kpx;iaecJ5Uz6JttlMn=rn zdGK?(_R4(jq$8>ezP)*R!2Lj$=ELsm{|=qHRb{ivyjku4w8-uDJS6!K@E+;J!IOPFeDT>M7{238f&T7WC<1x*>h zzh#?Msu`r^i0S9)X7O9;Hg9}v^zq65gKp+4_C3thUXpxo`>aZT-sk6w-#uIRcKfII z^3@Xdzs=Ol_MWZnHoN$%xy&Rf$UpIvzWc)I`pM2qTNVr0Hb1EeS9z}b+_l8WVY$Ck zen#B+Y5C@x_g-Y_(ztUYvQXdpy57^%`F%oVjb3K!*8TZ+TvnCO&-Qs@QE_kpYqe6j zT%h>hOF}}O;cG>%RCZdM_S)6TEICqn;{JQLRCS^Cj^!h?bQOdEl+BugPk5?bin&w_UE6EHb&3*{3>GGy4a(u zL{I;;S>LoRPi>Z%eUo?oj%nO}rkS#f8qi;S-S-@JCh>yLq-p2dju z#vFLBe|pi2rICBWza8dG410b3%>Gid_sh}@pH0f%`R=6pgL~DLyCc;4IX_;WJm-Da zlRZ!Nbofa%>`$`vKfi0*P5*t)3#AT*_U}8;{lC&yxoY*gxcUiR$)}o&XH?E=zpDR- z{rmk&{(k$-Gu}?zceaY-uhHx8mlKX&+@8;KDkn8Q*O*b%`~DG$HNUK+c71%Z!Zcqp z{_6MiOFM5$e0%6)_h04Pnut^7_daa9I=5=elVFS71&-O-4QD!^8y>mo*&3$3)w=t} zraVpk{~tB&GEYDJq`CaWCKabI0+T);R{$sbYX?hPn0u$J`#Zt4e%IXky+2vYcz4da zA2-AAgkWaMMC&W(&Mnpdc@<@AXgAeV@;(m;U@W+iLxtLq?95Q)XrYa6KXmuuRF zFL!O0-77Qx9`>RpfWvbCu8ALO4sZ7MuK(~h&i!4f&Bq&}Ds|@b+2!Kht|l%NTT*f| z$;|(^?DjKZ75nR&M61_+*e)7mYsjK!gBv@?FL;G^d*MgL}i6YmwH0KbxGeK)_o zy{Ch#5|4Wq`%2D^n}7Jw)UONAe>c*O{PX1Tj=Vi>r{7mK&D67Y^yl{dy?t`{Rk4kq zk2$@b?s|69PMb%2X3k!>r}=oAL+wW?F*}?2{@HzRb}q_4m$B*bV}oP9k3_B)t(wKJ zpL})QgS%6WB}xOe-|yc#?eKq@b=!8WJ8t(TD{rSxUueJm@$0hjf$RQ%s*L+}l>3g| z>nyvwI~vyhlXw(VyyL;8OdgNIg} zdeUa?pp`cc{`qxr`48V$LGR}MG~XtB{PauVo6`iGI?5(}c5-2x`M9o0@@4YQnp-Bz z(#${Jyi(fkktl>=Bsg%yvk9hUoQv#&1q>d(-*mzt6B**DvIs679sH mcnef{Tc$v3)DExz?0Q?>LTBjeJz-#AVDNPHb6Mw<&;$SmCB6gz literal 0 HcmV?d00001 diff --git a/lib/hackerlibultra/tools/check_format.py b/lib/hackerlibultra/tools/check_format.py new file mode 100644 index 00000000..0db12a04 --- /dev/null +++ b/lib/hackerlibultra/tools/check_format.py @@ -0,0 +1,82 @@ +# SPDX-FileCopyrightText: 2024 zeldaret +# SPDX-License-Identifier: CC0-1.0 + +import subprocess +import argparse +import difflib +import multiprocessing +import glob +import os.path +import sys + +sys.path.insert(0, os.curdir) +import format + +sys.path.pop(0) + + +def get_git_status(): + return subprocess.check_output("git status --porcelain".split(), text=True) + + +def get_modified_files_to_format(compare_to): + modified_files_str = subprocess.check_output( + ["git", "diff", "--name-only", compare_to], text=True + ) + modified_files = set(modified_files_str.splitlines()) + + all_src_files, all_extra_files = format.list_files_to_format() + # Split modified_files between source files and extra files (see format.py) + # This also filters out deleted files that no longer exist + modified_src_files_existing = list(modified_files.intersection(all_src_files)) + modified_extra_files_existing = list(modified_files.intersection(all_extra_files)) + + return modified_src_files_existing, modified_extra_files_existing + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--compare-to", dest="compare_to") + args = parser.parse_args() + + if args.compare_to: + src_files, extra_files = get_modified_files_to_format(args.compare_to) + if args.verbose: + print("Formatting specific files:") + print(len(src_files), src_files) + print(len(extra_files), extra_files) + if not src_files and not extra_files: + if args.verbose: + print("Nothing to format") + exit(0) + else: + src_files, extra_files = format.list_files_to_format() + + nb_jobs = multiprocessing.cpu_count() + + git_status_pre = get_git_status() + + format.format_files(src_files, extra_files, nb_jobs) + + git_status_post = get_git_status() + + if git_status_pre != git_status_post: + print( + "Misformatted files found." + " Run ./format.py and verify codegen is not impacted." + ) + for l in difflib.unified_diff( + git_status_pre.splitlines(), + git_status_post.splitlines(), + "Old git status", + "New git status", + ): + print(l) + + print(subprocess.check_output("git diff".split(), text=True)) + exit(1) + + +if __name__ == "__main__": + main() diff --git a/lib/hackerlibultra/tools/compile_sjis.py b/lib/hackerlibultra/tools/compile_sjis.py new file mode 100755 index 00000000..fe2c4203 --- /dev/null +++ b/lib/hackerlibultra/tools/compile_sjis.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import sys, os +from shiftjis_conv import sjis_process + +WORKING_DIR = os.getcwd() + +fb = [] +input_c_file = [i for i in sys.argv if ".c" in i][0] +CC = [i for i in sys.argv if "-D__CC=" in i][0][7:] +build_dir = [i for i in sys.argv if "-D__BUILD_DIR" in i][0][14:] + + +output_c_file = f"{build_dir}/{input_c_file}" + +# Edit compile command to point to the converted file +sys.argv[sys.argv.index(input_c_file)] = output_c_file + +with open(input_c_file) as f: + fb = f.read() + +with open(output_c_file, "w+") as outf: + sjis_process(fb, outf) + +os.system("%s %s" % (CC, " ".join(sys.argv[1:]))) diff --git a/lib/hackerlibultra/tools/disassemble_elf.py b/lib/hackerlibultra/tools/disassemble_elf.py new file mode 100755 index 00000000..1fa58a81 --- /dev/null +++ b/lib/hackerlibultra/tools/disassemble_elf.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +# +# ELF disassembler that attempts to be matching +# + +import argparse, struct, sys + +from libelf import * +from mdebug import * +from mips_isa import * +from util import * + +def debug_log(msg): + print(msg, file=sys.stderr) + +class MipsDisasm: + """ + """ + + def __init__(self, elf_file) -> None: + self.elf_file = elf_file + mdebug_section = elf_file.find_section_by_type(SHT_MIPS_DEBUG) + if mdebug_section is not None: + self.mdebug = mdebug_section + self.has_mdebug = True + else: + self.has_mdebug = False + self.cur_file = None + self.comment_section_pos = 1 + self.section_local_labels = {} + + def add_section_local_label(self, section, offset): + if section not in self.section_local_labels: + self.section_local_labels.update({section : set()}) + self.section_local_labels[section].add(offset) + + def advance_file(self): + seen_cur_file = False + for sym in self.elf_file.symtab.symbol_entries: + if sym.type == ST_FILE: + if seen_cur_file or self.cur_file is None: + self.cur_file = sym + break + elif self.cur_file == sym: + seen_cur_file = True + return self.cur_file is not None + + def disassemble_all_sections(self): + print(MipsDisasm.asm_prelude()) + + # debug_log("Name Type Addr Off Size ES Flg Lk Inf Al") + for section in self.elf_file.sections: + local_labels = self.section_local_labels.get(section.name, None) + # debug_log(section) + if section.name in ['', '.strtab', '.shstrtab', '.symtab', '.reginfo', '.comment', '.note', '.options', '.mdebug', '.gptab.data', '.gptab.bss'] or \ + (section.sh_type == SHT_REL or section.sh_type == SHT_RELA): + continue + if section.sh_size == 0: + continue + print("") + print(MipsDisasm.begin_section(section)) + if section.is_executable(): + self.disassemble_exec(section) + elif section.sh_type == SHT_PROGBITS: + # TODO kmc as doesn't support incbin, byte array this + # print(f".incbin \"libultra.a\", 0x{section.sh_offset:08X}, 0x{section.sh_size:X}") + first = True + for i,b in enumerate(section.data): + if local_labels is not None and i in local_labels: + if not first: + print("") + print(f".{section.name[1].upper()}_{i:08X}:") + print(" .byte ", end='') + first = True + elif first: + print(" .byte ", end='') + if not first: + print(", ", end='') + print(f"0x{int(b):02X}", end='') + first = False + print("") + elif section.sh_type == SHT_NOBITS: + print(f".skip 0x{section.sh_size:X}") + else: + assert False, f"Unhandled section: {section.name}" + # debug_log("/// UNHANDLED ///") + + def pass_section(self, section): + pass + + @staticmethod + def asm_prelude(): + return f""".include "macro.inc" +#include "regdef.h" + +// assembler directives +.set noat // allow manual use of $at +.set noreorder // don't insert nops after branches""" + + @staticmethod + def begin_section(section): + section_flags = section.flags_str().lower().replace(' ', '') + if section_flags != "": + section_flags = f", \"{section_flags}\"" + section_type = "" + if section.sh_type == SHT_PROGBITS: + section_type = ", @progbits" + elif section.sh_type == SHT_NOBITS: + section_type = ", @nobits" + if section_type != "" and section_flags == "": + section_flags = ", \"\"" + + return f""".section {section.name}{section_flags}{section_type} +.balign {section.sh_addralign} +""" + + def get_label_name(self, addr, pdr=None, optional=False): + if pdr is not None: + sym = pdr.lookup_sym(addr, EcoffSt.LABEL) + if sym is not None: + return sym.name + if not optional: + return f".L{addr:08X}" + else: + return None + + def get_comment_string(self, start): + comment_section = self.elf_file.find_section_by_name(".comment") + end = comment_section.data.find(b'\0', start) + if end == -1: + return None, None + comment = comment_section.data[start:end].decode("ASCII") + return comment, end + 1 + + def print_end(self, vaddr, eof): + ends = eof.get(vaddr, None) + if ends is not None: + for sym in ends: + print(f" .type {sym.name}, @{'function' if sym.type == ST_FUNC else 'object'}") + if sym.st_size != 0: + print(f" .size {sym.name}, . - {sym.name}") + print(f" .end {sym.name}\n") + + def disassemble_exec(self, section): + raw_insns = as_word_list(section.data) + insns = [decode_insn(raw, section.sh_addr + j * 4) for j,raw in enumerate(raw_insns)] + + # enumerate branch labels + branch_labels = set() + + for i,insn in enumerate(insns): + if insn.id in MIPS_BRANCH_INSNS or insn.id == MIPS_INS_J: + branch_labels.add(insn.target if insn.id == MIPS_INS_J else insn.offset) + + eof = {} # vaddr : name + def add_end(vaddr, sym): + if vaddr not in eof: + eof[vaddr] = set() + eof[vaddr].add(sym) + + cur_fdr = None + cur_pdr = None + for i,insn in enumerate(insns): + mnemonic = insn.mnemonic + op_str = insn.op_str + + # Update mdebug info + src_inf = "" + if self.has_mdebug: + # Get new fdr if there is one + fdr = self.mdebug.fdr_foraddr(i * 4, extensions=('.c', '.s')) + if fdr is not None: + # debug_log(fdr.name) + cur_fdr = fdr + + # Get new pdr if there is one + if cur_fdr is not None: + pdr = cur_fdr.pdr_foraddr(i * 4) + if pdr is not None: + # debug_log(pdr) + cur_pdr = pdr + + # Line numbers + if cur_pdr is not None: + asm_line = i - cur_pdr.addr//4 + if asm_line < len(cur_pdr.lines): + src_inf = f" {cur_pdr.lines[asm_line]:4}" + else: + src_inf = " PADDING" + + # Symbols for this address + syms = section.get_sym(i * 4) + # if len(syms) != 0: + # debug_log("\n".join([str(sym) for sym in syms])) + + # Print end + self.print_end(insn.vaddr, eof) + + # Print symbol + for sym in syms: + if sym.name == "gcc2_compiled.": + print(f"// compiler generated") + if self.cur_file is None: + print(f".version \"01.01\"") + if self.advance_file(): + print(f".file 1 \"{self.cur_file.name}\"") + + comment_string = None + while comment_string != "\"GCC: (GNU) 2.7.2\"": + comment_string, self.comment_section_pos = self.get_comment_string(self.comment_section_pos) + if comment_string is None: + break + print(f".ident \"{comment_string}\"") + + if sym.bind == SB_GLOBAL: + print(f"glabel {sym.name}") + else: + print(f"{sym.name}:") + + if sym.st_size != 0: + print(f" .ent {sym.name}") + add_end(insn.vaddr + sym.st_size, sym) + else: + print(f" .type {sym.name}, @{'function' if sym.type == ST_FUNC else 'object'}\n") + + # Print branch labels + lbl = self.get_label_name(insn.vaddr, pdr=cur_pdr, optional=not insn.vaddr in branch_labels) + if lbl is not None: + print(f"{lbl}:") + + # Relocations for this address + rels = section.get_rel(i * 4) + assert len(rels) < 2 # There should never be more than 1 relocation for a single address, right? + # if len(rels) != 0: + # debug_log("\n".join([str(rel) for rel in rels])) + + # Apply relocation + if len(rels) != 0: + rel = rels[0] + if rel.rel_type == R_MIPS_26: + if insn.id == MIPS_INS_JAL: + op_str = rel.relocated_symbol.name + if op_str == ".text" and cur_fdr is not None: + pdr = cur_fdr.pdr_foraddr(insn.target) + if pdr is not None: + op_str = pdr.name + elif insn.id != MIPS_INS_J: # Branch labels for j instructions are also R_MIPS_26 relocations + assert False , f"Got unexpected R_MIPS_26 relocation {insn.id}" + elif rel.rel_type == R_MIPS_HI16: + assert insn.id in [MIPS_INS_LUI] + rel_name = rel.relocated_symbol.name + if rel.relocated_symbol.type == ST_SECTION: + rel_name = f".{rel_name[1].upper()}_00000000" + if cur_fdr is not None: + pass + + op_str = f"{insn.abi.gpr_names[insn.rt]}, %hi({rel_name})" + elif rel.rel_type == R_MIPS_LO16: + # Ideally this should be in the elf code so the relocations don't look identical + addend = insn.imm + rel_name = rel.relocated_symbol.name + if rel.relocated_symbol.type == ST_SECTION: + rel_name = f".{rel_name[1].upper()}_{addend:08X}" + self.add_section_local_label(rel.relocated_symbol.name, addend) + addend = 0 + addend_str = f" + 0x{addend:X}" if addend != 0 else "" + + if insn.id == MIPS_INS_ADDIU: + op_str = f"{insn.abi.gpr_names[insn.rt]}, {insn.abi.gpr_names[insn.rs]}, %lo({rel_name}{addend_str})" + elif insn.id in MIPS_LOAD_STORE_INSNS: + if insn.id in MIPS_FP_LOAD_STORE_INSNS: + op_str = f"{insn.abi.cop1_names[insn.ft]}, " + else: + op_str = f"{insn.abi.gpr_names[insn.rt]}, " + op_str += f"%lo({rel_name}{addend_str})({insn.abi.gpr_names[insn.base]})" + else: + assert False + else: + assert False + + # Apply branch labels + if insn.id in MIPS_BRANCH_INSNS: + op_str_parts = [] + for field in insn.fields: + if field == 'offset': + op_str_parts.append(self.get_label_name(insn.offset, cur_pdr)) + else: + op_str_parts.append(insn.format_field(field)) + op_str = ", ".join(op_str_parts) + elif insn.id == MIPS_INS_J: + op_str = self.get_label_name(insn.target, cur_pdr) + + print(f"/* {section.sh_offset + i * 4:06X} {insn.vaddr:08X} {insn.raw:08X}{src_inf} */ {mnemonic:12}{op_str:35}".rstrip()) + self.print_end(section.sh_addr + section.sh_size, eof) + +def main(): + parser = argparse.ArgumentParser(description="Disassemble relocatable ELF object.") + parser.add_argument("filepath", help="path to the ELF file") + # TODO unimplemented optionals + parser.add_argument("--compiler", help="original compiler that produced the ELF (IDO or GCC, IDO default)", default="IDO") + parser.add_argument("--strenc", help="string encoding, default is EUC-JP for IDO and SJIS for GCC") + args = parser.parse_args() + + elf_file = None + with open(args.filepath, "rb") as elf: + elf_file = ElfFile(bytearray(elf.read())) + + disassembler = MipsDisasm(elf_file) + disassembler.disassemble_all_sections() + +if __name__ == '__main__': + main() diff --git a/lib/hackerlibultra/tools/fix_objfile.py b/lib/hackerlibultra/tools/fix_objfile.py new file mode 100755 index 00000000..52a79bcd --- /dev/null +++ b/lib/hackerlibultra/tools/fix_objfile.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +# +# Fixes garbage data between sections and optionally rodata section flags +# + +import argparse +from libelf import * + +def fix_section_flags(elf): + for section in elf.sections: + # Unset Alloc flag in .rodata section + if section.name == ".rodata": + section.sh_flags &= ~SHF_ALLOC + +def fix_garbage(elf, original): + # Begin with the original data, and paste header and section data over it + result = original + if len(original) < len(elf.data): + result.extend([0]*(len(elf.data) - len(original))) + else: + result = result[:len(elf.data)] + + # NOTE: This only supports the elf header, program headers, section headers and section data at this time + + # emplace elf header + hdr = elf.elf_header.to_bin() + result[0:len(hdr)] = hdr + + # emplace program headers + for i,proghdr in enumerate(elf.progheaders): + offset = elf.elf_header.e_phoff + i * elf.elf_header.e_phentsize + result[offset:offset+elf.elf_header.e_phentsize] = proghdr.to_bin() + + # emplace section headers and section data + for i,section in enumerate(elf.sections): + offset = elf.elf_header.e_shoff + i * elf.elf_header.e_shentsize + section_header, section_data = section.to_bin() + result[offset:offset+elf.elf_header.e_shentsize] = section_header + if section_data is not None: + result[section.sh_offset:section.sh_offset+section.sh_size] = section_data + + return result + +def main(): + parser = argparse.ArgumentParser(description="Disassemble relocatable ELF object.") + parser.add_argument("compiled", help="path to the compiled ELF file") + parser.add_argument("original", help="path to the original ELF file") + parser.add_argument("--fix-section-flags", help="", action="store_true") + args = parser.parse_args() + + elf = None + with open(args.compiled, "rb") as elf_file: + elf = ElfFile(bytearray(elf_file.read())) + + original = None + with open(args.original, "rb") as original_file: + original = bytearray(original_file.read()) + + if args.fix_section_flags: + fix_section_flags(elf) + + result_data = fix_garbage(elf, original) + + with open(args.compiled, "wb") as elf_file: + elf_file.write(result_data) + +if __name__ == '__main__': + main() diff --git a/lib/hackerlibultra/tools/libdiff.py b/lib/hackerlibultra/tools/libdiff.py new file mode 100755 index 00000000..ac6b1391 --- /dev/null +++ b/lib/hackerlibultra/tools/libdiff.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +from typing import Any, Dict, Optional +import json +import logging +import subprocess +import tempfile +import pathlib +import sys +import queue + +import asm_differ.diff as asm_differ + +MAX_FUNC_SIZE_LINES = 5000 + +class AsmDifferWrapper: + @staticmethod + def create_config(arch: asm_differ.ArchSettings) -> asm_differ.Config: + return asm_differ.Config( + arch=arch, + # Build/objdump options + diff_obj=True, + make=False, + source_old_binutils=True, + diff_section=".text", + inlines=False, + max_function_size_lines=MAX_FUNC_SIZE_LINES, + max_function_size_bytes=MAX_FUNC_SIZE_LINES * 4, + # Display options + formatter=asm_differ.AnsiFormatter(column_width=50), + threeway=None, + base_shift=0, + skip_lines=0, + compress=None, + show_branches=True, + show_line_numbers=False, + show_source=False, + stop_jrra=False, + ignore_large_imms=False, + ignore_addr_diffs=False, + algorithm="levenshtein", + ) + + @staticmethod + def run_objdump(target_data: bytes, config: asm_differ.Config, label: Optional[str]) -> Optional[str]: + flags = [ + "--disassemble", + "--disassemble-zeroes", + "--line-numbers", + "--reloc", + ] + + with tempfile.TemporaryDirectory() as tempdir: + target_path = pathlib.Path(tempdir) / "out.s" + target_path.write_bytes(target_data) + + start_addr = 0 + + if label: + nm_command = "mips-linux-gnu-nm" + + if nm_command: + try: + nm_proc = subprocess.run( + [nm_command] + [target_path], + capture_output=True, + universal_newlines=True + ) + except subprocess.CalledProcessError as e: + logger.error(f"Error running nm: {e}") + logger.error(e.stderr) + + if nm_proc.stdout: + for line in nm_proc.stdout.splitlines(): + if label in line: + start_addr = int(line.split()[0], 16) + break + else: + # logger.error(f"No nm command for {platform}") + return None + + flags.append(f"--start-address={start_addr}") + + objdump_command = "mips-linux-gnu-objdump" + cmds = [objdump_command] + config.arch.arch_flags + flags + [target_path] + + try: + objdump_proc = subprocess.run( + [objdump_command] + config.arch.arch_flags + flags + [target_path], + capture_output=True, + universal_newlines=True + ) + except subprocess.CalledProcessError as e: + # logger.error(e) + # logger.error(e.stderr) + return None + + out = objdump_proc.stdout + return out + + @staticmethod + def diff(target_elf: bytes, compiled_elf: bytes, diff_label:Optional[str]) -> Dict[str, Any]: + arch = asm_differ.get_arch("mips") + + config = AsmDifferWrapper.create_config(arch) + + # Base + if len(target_elf) == 0: + print("Base asm empty") + return + + basedump = AsmDifferWrapper.run_objdump(target_elf, config, diff_label) + if not basedump: + print("Error running asm-differ on basedump") + return + + if len(compiled_elf) == 0: + print("Creation of compilation elf_object failed") + return + + mydump = AsmDifferWrapper.run_objdump(compiled_elf, config, diff_label) + if not mydump: + print("Error running asm-differ") + return + + # Preprocess the dumps + basedump = asm_differ.preprocess_objdump_out(None, target_elf, basedump, config) + mydump = asm_differ.preprocess_objdump_out(None, compiled_elf, mydump, config) + + try: + display = asm_differ.Display(basedump, mydump, config) + except Exception: + print("Error running asm-differ") + return + + # Print the output + display.run_sync() + +if __name__ == "__main__": + if len(sys.argv) != 3 and len(sys.argv) != 4: + print(f"Usage: {sys.argv[0]} [path/to/target.o] [path/to/compiled.o] [function name (optional)]") + sys.exit(0) + target = pathlib.Path(sys.argv[1]) + compiled = pathlib.Path(sys.argv[2]) + if len(sys.argv) == 4: + label = sys.argv[3] + else: + label = None + target_bytes = target.read_bytes() + compiled_bytes = compiled.read_bytes() + AsmDifferWrapper.diff(target_bytes, compiled_bytes, label) diff --git a/lib/hackerlibultra/tools/libelf.py b/lib/hackerlibultra/tools/libelf.py new file mode 100755 index 00000000..11c4c037 --- /dev/null +++ b/lib/hackerlibultra/tools/libelf.py @@ -0,0 +1,1181 @@ +#!/usr/bin/env python3 +# +# MIPS ELF library +# + +import struct + +from mdebug import EcoffHDRR, EcoffFdr, EcoffPdr, EcoffLiner, EcoffSymr + +# ===================================================================================================== +# Utility +# ===================================================================================================== + +def align_as(value, align): + if align == 0: + return value + while (value % align != 0): + value += 1 + return value + +# ===================================================================================================== +# ELF Identity +# ===================================================================================================== + +# Offsets into e_ident +EI_MAG0 = 0x00 # Magic char 0 , 0x7F +EI_MAG1 = 0x01 # Magic char 1 , 0x45 +EI_MAG2 = 0x02 # Magic char 2 , 0x4C +EI_MAG3 = 0x03 # Magic char 3 , 0x46 +EI_CLASS = 0x04 # +EI_DATA = 0x05 # +EI_VERSION = 0x06 # +EI_OSABI = 0x07 # +EI_ABIVERSION = 0x08 # +EI_PAD = 0x09 # +EI_NIDENT = 0x10 # + +# Values for e_ident[EI_DATA] +EI_DATA_LE = 1 # little endian +EI_DATA_BE = 2 # big endian + +EI_DATA_V = { + EI_DATA_LE : 'Little Endian', + EI_DATA_BE : 'Big Endian' +} + +# Values for e_ident[EI_CLASS] +EI_CLASS_32 = 1 # 32-bit +EI_CLASS_64 = 2 # 64-bit + +EI_CLASS_V = { + EI_CLASS_32 : 'ELF32', + EI_CLASS_64 : 'ELF64' +} + +# Values for e_ident[EI_OSABI] +EI_OSABI_V = { + 0x00 : 'UNIX / System V', + 0x01 : 'HP-UX', + 0x02 : 'NetBSD', + 0x03 : 'Linux', + 0x04 : 'GNU Hurd', + 0x06 : 'Solaris', + 0x07 : 'AIX', + 0x08 : 'IRIX', + 0x09 : 'FreeBSD', + 0x0A : 'Tru64', + 0x0B : 'Novell Modesto', + 0x0C : 'OpenBSD', + 0x0D : 'OpenVMS', + 0x0E : 'NonStop Kernel', + 0x0F : 'AROS', + 0x10 : 'Fenix OS', + 0x11 : 'CloudABI', + 0x12 : 'Stratus Technologies OpenVOS' +} + +# ===================================================================================================== +# ELF Types +# ===================================================================================================== + +ET_NONE = 0x0000 # +ET_REL = 0x0001 # relocatable +ET_EXEC = 0x0002 # +ET_DYN = 0x0003 # +ET_CORE = 0x0004 # +ET_LOOS = 0xFE00 # +ET_HIOS = 0xFEFF # +ET_LOPROC = 0xFF00 # +ET_HIPROC = 0xFFFF # + +E_TYPE = { + ET_NONE : 'ET_NONE', + ET_REL : 'ET_REL', + ET_EXEC : 'ET_EXEC', + ET_DYN : 'ET_DYN', + ET_CORE : 'ET_CORE', + ET_LOOS : 'ET_LOOS', + ET_HIOS : 'ET_HIOS', + ET_LOPROC : 'ET_LOPROC', + ET_HIPROC : 'ET_HIPROC' +} + +# ===================================================================================================== +# ELF Machines +# ===================================================================================================== + +EM_UNSPECIFIED = 0x00 +EM_ATNT_WE_32100 = 0x01 +EM_SPARC = 0x02 +EM_X86 = 0x03 +EM_MOTOROLA_68000 = 0x04 +EM_MOTOROLA_88000 = 0x05 +EM_INTEL_MCU = 0x06 +EM_INTEL_80860 = 0x07 +EM_MIPS = 0x08 +EM_IBM_SYSTEM_370 = 0x09 +EM_MIPS_RS3000_LE = 0x0A +EM_RESERVED_xB = 0x0B +EM_RESERVED_xC = 0x0C +EM_RESERVED_xD = 0x0D +EM_HEWLETT_PACKARD = 0x0E +EM_RESERVED_xF = 0x0F +EM_INTEL_80960 = 0x13 +EM_POWERPC = 0x14 +EM_POWERPC_64 = 0x15 +EM_5390 = 0x16 +EM_ARM = 0x28 +EM_SUPERH = 0x2A +EM_IA64 = 0x32 +EM_AMD64 = 0x3E +EM_TMS320C6000 = 0x8C +EM_ARM64 = 0xB7 +EM_RISC_V = 0xF3 + +E_MACHINE = { + EM_UNSPECIFIED : 'Unspecified', + EM_ATNT_WE_32100 : 'AT&T WE 32100', + EM_SPARC : 'SPARC', + EM_X86 : 'x86', + EM_MOTOROLA_68000 : 'Motorola 68000 (M68K)', + EM_MOTOROLA_88000 : 'Motorola 88000 (M88K)', + EM_INTEL_MCU : 'Intel MCU', + EM_INTEL_80860 : 'Intel 80860', + EM_MIPS : 'MIPS', + EM_IBM_SYSTEM_370 : 'IBM_System/370', + EM_MIPS_RS3000_LE : 'MIPS RS3000 Little-endian', + EM_RESERVED_xB : 'Reserved', + EM_RESERVED_xC : 'Reserved', + EM_RESERVED_xD : 'Reserved', + EM_HEWLETT_PACKARD : 'Hewlett-Packard PA-RISC', + EM_RESERVED_xF : 'Reserved', + EM_INTEL_80960 : 'Intel 80960', + EM_POWERPC : 'PowerPC', + EM_POWERPC_64 : 'PowerPC (64-bit)', + EM_5390 : 'S390, including S390x', + EM_ARM : 'ARM (up to ARMv7/Aarch32)', + EM_IA64 : 'SuperH', + EM_IA64 : 'IA-64', + EM_AMD64 : 'amd64', + EM_TMS320C6000 : 'TMS320C6000 Family', + EM_ARM64 : 'ARM 64-bits (ARMv8/Aarch64)', + EM_RISC_V : 'RISC-V' +} + +# ===================================================================================================== +# Program Types +# ===================================================================================================== + +PT_NULL = 0x00000000 # Program header table entry unused +PT_LOAD = 0x00000001 # Loadable segment +PT_DYNAMIC = 0x00000002 # Dynamic linking information +PT_INTERP = 0x00000003 # Interpreter information +PT_NOTE = 0x00000004 # Auxiliary information +PT_SHLIB = 0x00000005 # Reserved +PT_PHDR = 0x00000006 # Segment containing the program header table itself +PT_TLS = 0x00000007 # Thread-Local storage template +PT_LOOS = 0x60000000 # Inclusive reserved range for processor-specific semantics +PT_HIOS = 0x6FFFFFFF # ^ +PT_LOPROC = 0x70000000 # Inclusive reserved range for processor-specific semantics +PT_HIPROC = 0x7FFFFFFF # ^ + +P_TYPE = { + PT_NULL : 'PT_NULL' , + PT_LOAD : 'PT_LOAD' , + PT_DYNAMIC : 'PT_DYNAMIC', + PT_INTERP : 'PT_INTERP' , + PT_NOTE : 'PT_NOTE' , + PT_SHLIB : 'PT_SHLIB' , + PT_PHDR : 'PT_PHDR' , + PT_TLS : 'PT_TLS' , + PT_LOOS : 'PT_LOOS' , + PT_HIOS : 'PT_HIOS' , + PT_LOPROC : 'PT_LOPROC' , + PT_HIPROC : 'PT_HIPROC' +} + +# ===================================================================================================== +# Program Flags ( May be platform specific ! ) +# ===================================================================================================== + +PF_E = 1 << 0 # Execute +PF_W = 1 << 1 # Write +PF_R = 1 << 2 # Read + +# ===================================================================================================== +# Symbol Info +# ===================================================================================================== + +# Symbol Types + +ST_NOTYPE = 0 +ST_OBJECT = 1 +ST_FUNC = 2 +ST_SECTION = 3 +ST_FILE = 4 + +SYM_TYPE = { + ST_NOTYPE : 'NOTYPE', + ST_OBJECT : 'OBJECT', + ST_FUNC : 'FUNC', + ST_SECTION : 'SECTION', + ST_FILE : 'FILE' +} + +# Symbol Bind + +SB_LOCAL = 0 +SB_GLOBAL = 1 +SB_WEAK = 2 + +SYM_BIND = { + SB_LOCAL : 'LOCAL', + SB_GLOBAL : 'GLOBAL', + SB_WEAK : 'WEAK' +} + +# Symbol Visibility + +SV_DEFAULT = 0 + +SYM_VIS = { + SV_DEFAULT : 'DEFAULT' +} + +# NDX + +SHN_UND = 0x0000 +SHN_ABS = 0xFFF1 +SHN_COMMON = 0xFFF2 +SHN_XINDEX = 0xFFFF +SHN_LORESERVE = 0xFF00 + +SYM_NDX = { + SHN_UND : 'UND', + SHN_ABS : 'ABS', + SHN_COMMON : 'COMMON', + SHN_XINDEX : 'XINDEX', + SHN_LORESERVE : 'LORESERVE' +} + +# ===================================================================================================== +# Relocation Type +# ===================================================================================================== + +# EM_MIPS +R_MIPS_32 = 2 # Write the 32 bit address of the symbol +R_MIPS_26 = 4 # Write the 26 bit address of the symbol divided by four (for relocating branch instructions). Fail if address won't fit +R_MIPS_HI16 = 5 # Write the high 16 bits of the address of the symbol +R_MIPS_LO16 = 6 # Write the low 16 bits of the address of the symbol + +# EM_POWERPC +R_PPC_NONE = 0 # Do nothing. Skip this entry +R_PPC_ADDR32 = 1 # Write the 32 bit address of the symbol +R_PPC_ADDR24 = 2 # Write the 24 bit address of the symbol divided by four shifted up 2 bits to the 32 bit value (for relocating branch instructions). Fail if address won't fit +R_PPC_ADDR16 = 3 # Write the 16 bit address of the symbol. Fail if address more than 16 bits +R_PPC_ADDR16_LO = 4 # Write the low 16 bits of the address of the symbol +R_PPC_ADDR16_HI = 5 # Write the high 16 bits of the address of the symbol +R_PPC_ADDR16_HA = 6 # Write the high 16 bits of the address of the symbol plus 0x8000 +R_PPC_ADDR14 = 7 # Write the 14 bits of the address of the symbol divided by four shifted up 2 bits to the 32 bit value (for relocating conditional branch instructions). Fail if address won't fit +R_PPC_REL24 = 10 # Write the 24 bit address of the symbol minus the address of the relocation divided by four shifted up 2 bits to the 32 bit value (for relocating relative branch instructions). Fail if address won't fit +R_PPC_REL14 = 11 # Write the 14 bit address of the symbol minus the address of the relocation divided by four shifted up 2 bits to the 32 bit value (for relocating conditional relative branch instructions). Fail if address won't fit +R_PPC_EMB_SDA21 = 109 # Small Data Area + +# Gamecube/Wii custom relocations +R_DOLPHIN_NOP = 201 # Do nothing. Skip this entry. Carry the address of the symbol to the next entry +R_DOLPHIN_SECTION = 202 # Change which section relocations are being applied to. Set the offset into the section to 0 +R_DOLPHIN_END = 203 # Stop parsing the relocation table +R_DOLPHIN_MRKREF = 204 # Unknown + +RELOC_TYPE = { + EM_MIPS : { + R_MIPS_32 : 'R_MIPS_32', + R_MIPS_26 : 'R_MIPS_26', + R_MIPS_HI16 : 'R_MIPS_HI16', + R_MIPS_LO16 : 'R_MIPS_LO16' + }, + EM_POWERPC : { + R_PPC_NONE : 'R_PPC_NONE', + R_PPC_ADDR32 : 'R_PPC_ADDR32', + R_PPC_ADDR24 : 'R_PPC_ADDR24', + R_PPC_ADDR16 : 'R_PPC_ADDR16', + R_PPC_ADDR16_LO : 'R_PPC_ADDR16_LO', + R_PPC_ADDR16_HI : 'R_PPC_ADDR16_HI', + R_PPC_ADDR16_HA : 'R_PPC_ADDR16_HA', + R_PPC_ADDR14 : 'R_PPC_ADDR14', + 8 : 'R_PPC_ADDR14', + 9 : 'R_PPC_ADDR14', + R_PPC_REL24 : 'R_PPC_REL24', + R_PPC_REL14 : 'R_PPC_REL14', + 12 : 'R_PPC_REL14', + 13 : 'R_PPC_REL14', + R_PPC_EMB_SDA21 : 'R_PPC_EMB_SDA21', + R_DOLPHIN_NOP : 'R_DOLPHIN_NOP', + R_DOLPHIN_SECTION : 'R_DOLPHIN_SECTION', + R_DOLPHIN_END : 'R_DOLPHIN_END', + R_DOLPHIN_MRKREF : 'R_DOLPHIN_MRKREF' + } +} + +# ===================================================================================================== +# Section Types +# ===================================================================================================== + +SHT_NULL = 0x00000000 # Section header table entry unused +SHT_PROGBITS = 0x00000001 # Program data +SHT_SYMTAB = 0x00000002 # Symbol table +SHT_STRTAB = 0x00000003 # String table +SHT_RELA = 0x00000004 # Relocation entries with addends +SHT_HASH = 0x00000005 # Symbol hash table +SHT_DYNAMIC = 0x00000006 # Dynamic linking information +SHT_NOTE = 0x00000007 # Notes +SHT_NOBITS = 0x00000008 # Program space with no data (bss) +SHT_REL = 0x00000009 # Relocation entries, no addends +SHT_SHLIB = 0x0000000A # Reserved +SHT_DYNSYM = 0x0000000B # Dynamic linker symbol table +SHT_INIT_ARRAY = 0x0000000E # Array of constructors +SHT_FINI_ARRAY = 0x0000000F # Array of destructors +SHT_PREINIT_ARRAY = 0x00000010 # Array of pre-constructors +SHT_GROUP = 0x00000011 # Section group +SHT_SYMTAB_SHNDX = 0x00000012 # Extended section indices +SHT_NUM = 0x00000013 # Number of defined types. +SHT_LOOS = 0x60000000 # Start OS-specific. + +# MIPS specific +SHT_MIPS_DEBUG = 0x70000005 # .mdebug +SHT_MIPS_REGINFO = 0x70000006 # .reginfo +SHT_MIPS_OPTIONS = 0x7000000D # .options + +SH_TYPE = { + SHT_NULL : 'SHT_NULL', + SHT_PROGBITS : 'SHT_PROGBITS', + SHT_SYMTAB : 'SHT_SYMTAB', + SHT_STRTAB : 'SHT_STRTAB', + SHT_RELA : 'SHT_RELA', + SHT_HASH : 'SHT_HASH', + SHT_DYNAMIC : 'SHT_DYNAMIC', + SHT_NOTE : 'SHT_NOTE', + SHT_NOBITS : 'SHT_NOBITS', + SHT_REL : 'SHT_REL', + SHT_SHLIB : 'SHT_SHLIB', + SHT_DYNSYM : 'SHT_DYNSYM', + SHT_INIT_ARRAY : 'SHT_INIT_ARRAY', + SHT_FINI_ARRAY : 'SHT_FINI_ARRAY', + SHT_PREINIT_ARRAY : 'SHT_PREINIT_ARRAY', + SHT_GROUP : 'SHT_GROUP', + SHT_SYMTAB_SHNDX : 'SHT_SYMTAB_SHNDX', + SHT_NUM : 'SHT_NUM', + SHT_LOOS : 'SHT_LOOS', + + SHT_MIPS_DEBUG : 'SHT_MIPS_DEBUG', + SHT_MIPS_REGINFO : 'SHT_MIPS_REGINFO', + SHT_MIPS_OPTIONS : 'SHT_MIPS_OPTIONS', +} + +# ===================================================================================================== +# Section Flags +# ===================================================================================================== + +SHF_WRITE = 1 << 0 # Writable +SHF_ALLOC = 1 << 1 # Occupies memory during execution +SHF_EXECINSTR = 1 << 2 # Executable +SHF_MERGE = 1 << 4 # Might be merged +SHF_STRINGS = 1 << 5 # Contains null-terminated strings +SHF_INFO_LINK = 1 << 6 # 'sh_info' contains SHT index +SHF_LINK_ORDER = 1 << 7 # Preserve order after combining +SHF_OS_NONCONFORMING = 1 << 8 # Non-standard OS specific handling required +SHF_GROUP = 1 << 9 # Section is member of a group +SHF_TLS = 1 << 10 # Section hold thread-local data + +SHF_MASKOS = 0x0ff00000 # OS-specific +SHF_MASKPROC = 0xf0000000 # Processor-specific +SHF_ORDERED = 0x04000000 # Special ordering requirement (Solaris) +SHF_EXCLUDE = 0x08000000 # Section is excluded unless referenced or allocated (Solaris) + +SH_FLAG = { + SHF_WRITE : 'SHF_WRITE', + SHF_ALLOC : 'SHF_ALLOC', + SHF_EXECINSTR : 'SHF_EXECINSTR', + SHF_MERGE : 'SHF_MERGE', + SHF_STRINGS : 'SHF_STRINGS', + SHF_INFO_LINK : 'SHF_INFO_LINK', + SHF_LINK_ORDER : 'SHF_LINK_ORDER', + SHF_OS_NONCONFORMING : 'SHF_OS_NONCONFORMING', + SHF_GROUP : 'SHF_GROUP', + SHF_TLS : 'SHF_TLS', + SHF_MASKOS : 'SHF_MASKOS', + SHF_MASKPROC : 'SHF_MASKPROC', + SHF_ORDERED : 'SHF_ORDERED', + SHF_EXCLUDE : 'SHF_EXCLUDE' +} + +# ===================================================================================================== +# ELF Header +# ===================================================================================================== + +ELF32_BIG_STRUCT = '>HHIIIIIHHHHHH' +ELF32_LITTLE_STRUCT = 'IIIBBH', data) + assert self.st_shndx != SHN_XINDEX, "too many sections (SHN_XINDEX not supported)" + self.bind = st_info >> 4 + self.type = st_info & 0xF + self.visibility = self.st_other & 3 + self.parent_section = elf_file.sections[self.st_shndx] if self.st_shndx < SHN_LORESERVE else None + + self.name = name + if self.type == ST_SECTION: + self.name = elf_file.shstrtab.lookup_str(self.parent_section.sh_name) + if self.name == None: + self.name = elf_file.symtab.strtab.lookup_str(self.st_name) + + @staticmethod + def from_parts(st_name, st_value, st_size, st_info, st_other, st_shndx, strtab, name): + header = struct.pack('>IIIBBH', st_name, st_value, st_size, st_info, st_other, st_shndx) + return Symbol(header, strtab, name) + + def to_bin(self): + st_info = (self.bind << 4) | self.type + return struct.pack('>IIIBBH', self.st_name, self.st_value, self.st_size, st_info, self.st_other, self.st_shndx) + + def section_offset(self): + return self.st_value - self.parent_section.sh_addr + + def padded_size_n(self, n): + return align_as(self.st_size, n) + + def padded_size(self): + return self.padded_size_n(self.parent_section.sh_addralign) + + def __str__(self): + # Num: Value Size Type Bind Vis Ndx Name + ndx = ' ' + (SYM_NDX[self.st_shndx] if self.st_shndx in SYM_NDX.keys() else self.parent_section.name) + out = f"{self.st_value:08X} {self.st_size:06X} {SYM_TYPE[self.type]:7} {SYM_BIND[self.bind]:6} {SYM_VIS[self.visibility]:7} {ndx:12} {self.name}" + return out + +# ===================================================================================================== +# Relocation +# ===================================================================================================== + +class Relocation: + """ + typedef struct { + Elf32_Word r_offset; + struct { + Elf32_Word sym_index : 24; + Elf32_Word rel_type : 8; + } r_info; + Elf32_Word r_addend; + } Elf32_Reloc; + """ + + def __init__(self, data, elf_file, target_section, sh_type): + self.sh_type = sh_type + if sh_type == SHT_REL: + self.r_offset, self.r_info = struct.unpack('>II', data) + self.r_addend = 0 + else: + self.r_offset, self.r_info, self.r_addend = struct.unpack('>III', data) + self.sym_index = self.r_info >> 8 + self.rel_type = self.r_info & 0xff + self.relocated_symbol = elf_file.symtab.symbol_entries[self.sym_index] + self.elf_machine = elf_file.elf_header.e_machine + self.target_section = target_section + # TODO obtain the addend if the target section is executable + + def to_bin(self): + self.r_info = (self.sym_index << 8) | self.rel_type + if self.sh_type == SHT_REL: + return struct.pack('>II', self.r_offset, self.r_info) + else: + return struct.pack('>III', self.r_offset, self.r_info, self.r_addend) + + def relocated_symbol_in_section(self, symtab, section): + return symtab.lookup_symbol_in_section(symtab.symbol_entries[self.sym_index].st_value, section) + + def __str__(self): + relocated_symbol = self.relocated_symbol + # Offset Info Type Sym.Value Sym. Name + Addend + # 80135560 00091201 R_MY_RELOC_TYPE 800f39e0 ...data.0 + 0 + out = f"{self.r_offset:08X} {self.r_info:08X} {RELOC_TYPE[self.elf_machine][self.rel_type]:17} {relocated_symbol.st_value:08X} {relocated_symbol.name} + 0x{self.r_addend:X}" + return out + +# ===================================================================================================== +# Section +# ===================================================================================================== + +class Section: + """ + Describes a section + + typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; + } Elf32_Shdr; + +x00 x00 4 4 sh_name Offset to string in the .shstrtab section representing this section's name + +x04 x04 4 4 sh_type See SH_TYPE + +x08 x08 4 8 sh_flags See SH_FLAG + +x0C x10 4 8 sh_addr Virtual address of the section in memory (for loaded sections) + +x10 x18 4 8 sh_offset Offset of the section in the file image + +x14 x20 4 8 sh_size Size in bytes of the section in the file image + +x18 x28 4 4 sh_link Contains the section index of an associated section. This field is used for several purposes depending on section type + +x1C x2C 4 4 sh_info Contains extra information about the section. This field is used for several purposes, depending on section type + +x20 x30 4 8 sh_addralign Contains the required alignment of the section. This field must be a power of two + +x24 x38 4 8 sh_entsize Contains the size, in bytes, of each entry, for sections that contain fixed-size entries. Zero otherwise + +x28 x40 END + """ + + def __init__(self, header, elf_file, index): + self.late_init_done = False + self.sh_name, self.sh_type, \ + self.sh_flags, self.sh_addr, \ + self.sh_offset, self.sh_size, \ + self.sh_link, self.sh_info, \ + self.sh_addralign, self.sh_entsize = struct.unpack('>IIIIIIIIII', header) + assert not self.sh_flags & SHF_LINK_ORDER + if self.sh_entsize != 0: + assert self.sh_size % self.sh_entsize == 0 + if self.sh_type in [SHT_NULL, SHT_NOBITS]: + self.data = None + else: + self.data = elf_file.data[self.sh_offset:][:self.sh_size] + self.index = index + self.relocated_by = [] + self.elf_file = elf_file + + def late_init(self): + self.late_init_done = True + + @staticmethod + def from_parts(sh_name, sh_type, sh_flags, sh_link, sh_info, sh_addralign, sh_entsize, sh_addr, sh_offset, data, index): + header = struct.pack('>IIIIIIIIII', sh_name, sh_type, sh_flags, sh_addr, sh_offset, \ + len(data), sh_link, sh_info, sh_addralign, sh_entsize) + return Section(header, data, index) + + def to_bin(self): + if self.sh_type not in [SHT_NULL, SHT_NOBITS]: + self.sh_size = len(self.data) + header = struct.pack('>IIIIIIIIII', self.sh_name, self.sh_type, self.sh_flags, self.sh_addr, self.sh_offset, self.sh_size, self.sh_link, self.sh_info, self.sh_addralign, self.sh_entsize) + return header, self.data + + def get_rel(self, addr): + relocs = [] + for reloc_section in self.relocated_by: + reloc = reloc_section.find_reloc(addr) + if reloc is not None: + relocs.append(reloc) + return relocs + + def get_sym(self, addr): + symtab = self.elf_file.symtab + symbols = [] + for symbol in symtab.symbol_entries: + if symbol.st_value == addr and symbol.st_shndx == self.index and symbol.type != ST_SECTION: + symbols.append(symbol) + return symbols + + def is_rel(self): + return self.sh_type == SHT_REL or self.sh_type == SHT_RELA + + def is_allocable(self): + return (self.sh_flags & SHF_ALLOC) == SHF_ALLOC + + def is_executable(self): + return (self.sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR + + def is_writable(self): + return (self.sh_flags & SHF_WRITE) == SHF_WRITE + + def padded_size(self): + return align_as(self.sh_size, self.sh_addralign) + + def padded_size_4(self): + return align_as(self.sh_size, 4) + + def flags_str(self): + flags = "" + flags += "W" if self.is_writable() else " " + flags += "A" if self.is_allocable() else " " + flags += "X" if self.is_executable() else " " + return flags + + def __str__(self): + s_type = SH_TYPE[self.sh_type].replace('SHT_','') if self.sh_type in SH_TYPE.keys() else str(self.sh_type) + out = f"{self.name:12}{s_type:12} " + out += f"{self.sh_addr:08X} " + out += f"{self.sh_offset:06X} " + out += f"{self.sh_size:06X} " + out += f"{self.sh_entsize:2X} " + out += f"{self.flags_str():3} " + out += f"{self.sh_link:2} " + out += f"{self.sh_info:3} " + out += f"{self.sh_addralign:5X} " + return out + +class SymtabSection(Section): + """ + Symbol Table Section + """ + + def __init__(self, header, elf_file, index): + super().__init__(header, elf_file, index) + assert self.sh_entsize == 16 + + def late_init(self): + if self.late_init_done: + return + super().late_init() + self.strtab = self.elf_file.sections[self.sh_link] + self.symbol_entries = [] + for i in range(0, self.sh_size, self.sh_entsize): + self.symbol_entries.append(Symbol(self.data[i:i+self.sh_entsize], self.elf_file)) + + def to_bin(self): + header, _ = super().to_bin() + data = bytearray() + for sym in self.symbol_entries: + data.extend(sym.to_bin()) + return header, data + + def find_symbol(self, name): + for s in self.symbol_entries: + if s.name == name: + return (s.st_shndx, s.st_value) + return None + + def lookup_symbol(self, vaddr): + found = [] + for s in self.symbol_entries: + if s.st_value == vaddr and s.type != ST_SECTION: + found.append(s) + if len(found) != 0: + found.sort(reverse=True, key=(lambda s : s.type)) + return found[0] + return None + + def lookup_symbol_for_section(self, vaddr, shndx): + found = [] + for s in self.symbol_entries: + if s.st_value == vaddr and s.type != ST_SECTION and s.st_shndx == shndx: + found.append(s) + if len(found) != 0: + found.sort(reverse=True, key=(lambda s : s.type)) + return found[0] + return None + + def lookup_symbol_in_section(self, vaddr, section): + found = [] + for s in self.symbol_entries: + if s.st_value == vaddr and s.type != ST_SECTION and s.st_shndx == section.index: + found.append(s) + if len(found) != 0: + found.sort(reverse=True, key=(lambda s : s.type)) + return found[0] + return None + + def find_symbol_in_section(self, name, section): + pos = self.find_symbol(name) + assert pos is not None + assert pos[0] == section.index + return pos[1] + + def local_symbols(self): + return self.symbol_entries[:self.sh_info] + + def global_symbols(self): + return self.symbol_entries[self.sh_info:] + +class StrtabSection(Section): + """ + String Table Section + """ + def __init__(self, header, data, index): + super().__init__(header, data, index) + + def lookup_str(self, index): + to = self.data.find(b'\0', index) + assert to != -1 + return self.data[index:to].decode('latin1') + +class RelocationSection(Section): + """ + Relocation Section + """ + def __init__(self, header, data, index): + super().__init__(header, data, index) + + def late_init(self): + if self.late_init_done: + return + super().late_init() + self.rel_target = self.elf_file.sections[self.sh_info] + self.rel_target.relocated_by.append(self) + self.relocations = [] + for i in range(0, self.sh_size, self.sh_entsize): + self.relocations.append(Relocation(self.data[i:][:self.sh_entsize], self.elf_file, self.rel_target, self.sh_type)) + + def to_bin(self): + header, _ = super().to_bin() + data = bytearray() + for rel in self.relocations: + data.extend(rel.to_bin()) + return header, data + + def lookup_reloc(self, vaddr): + for r in self.relocations: + if r.r_offset - r.r_offset % 4 == vaddr: + return r + return None + + def find_reloc(self, vaddr): + for r in self.relocations: + if r.r_offset == vaddr: + return r + return None + + def lookup_jtbl_reloc(self, vaddr, symtab): + for r in self.relocations: + r_sym = r.relocated_symbol(symtab) + if r_sym.st_value + r.r_addend == vaddr: + return r + return None + +class MdebugSection(Section): + """ + MIPS Debugging Section + """ + def __init__(self, header, elf_file, index): + super().__init__(header, elf_file, index) + self.parent = self.elf_file + self.hdrr = EcoffHDRR(self.data) + + self.fdrs = [] + for i in range(self.hdrr.ifdMax): + fdr = EcoffFdr.from_binary(self, i) + self.fdrs.append(fdr) + + def late_init(self): + if self.late_init_done: + return + super().late_init() + for fdr in self.fdrs: + fdr.late_init() + + def fdr_forname(self, filename): + for fdr in self.fdrs: + # remove path and file ext + normalized_name = ".".join(fdr.name.split("/")[-1].split(".")[:-1]) + + if normalized_name == filename: + return fdr + return None + + def fdr_foraddr(self, addr, extensions=('.c')): + for fdr in self.fdrs: + if fdr.adr == addr and any((fdr.name.endswith(ext) for ext in extensions)): + return fdr + return None + + def read_string(self, index): + to = self.elf_file.data.find(b'\0', self.hdrr.cbSsOffset + index) + assert to != -1 + return self.elf_file.data[self.hdrr.cbSsOffset + index:to].decode("ASCII") + + def read_ext_string(self, index): + to = self.elf_file.data.find(b'\0', self.hdrr.cbSsExtOffset + index) + assert to != -1 + return self.elf_file.data[self.hdrr.cbSsExtOffset + index:to].decode("ASCII") + +class ReginfoSection(Section): + """ + MIPS Register Information Section + """ + def __init__(self, header, elf_file, index): + super().__init__(header, elf_file, index) + +# ===================================================================================================== +# Elf File +# ===================================================================================================== + +class ElfFile: + def __init__(self, data): + def init_section(i): + offset = self.elf_header.e_shoff + i * self.elf_header.e_shentsize + section_type = struct.unpack(">I", data[offset + 4:][:4])[0] + header_data = data[offset:][:self.elf_header.e_shentsize] + + if section_type == SHT_REL or section_type == SHT_RELA: + return RelocationSection(header_data, self, i) + elif section_type == SHT_SYMTAB: + return SymtabSection(header_data, self, i) + elif section_type == SHT_STRTAB: + return StrtabSection(header_data, self, i) + elif section_type == SHT_MIPS_DEBUG: + return MdebugSection(header_data, self, i) + elif section_type == SHT_MIPS_REGINFO: + return ReginfoSection(header_data, self, i) + else: + return Section(header_data, self, i) + + self.data = data + self.elf_header = ElfHeader(data[0:52]) + + num_progheaders = self.elf_header.e_phnum + num_sections = self.elf_header.e_shnum + + # Init program headers + self.progheaders = [] + for i in range(num_progheaders): + offset = self.elf_header.e_phoff + i * self.elf_header.e_phentsize + self.progheaders.append(ProgramHeader(data[offset:][:self.elf_header.e_phentsize], self.elf_header.e_ident[EI_CLASS])) + + # Init sections + self.sections = [] + for i in range(num_sections): + self.sections.append(init_section(i)) + + # Init shstrtab and name sections + self.shstrtab = self.sections[self.elf_header.e_shstrndx] + assert isinstance(self.shstrtab, StrtabSection) + + for s in self.sections: + s.name = self.shstrtab.lookup_str(s.sh_name) + + # Init symtab + symtab = None + for s in self.sections: + if s.sh_type == SHT_SYMTAB: + assert not symtab , "Found more than one symtab section?" + symtab = s + self.symtab = symtab + if self.symtab is not None: + self.symtab.late_init() + + # Late Init sections + for s in self.sections: + s.late_init() + + def find_section_by_name(self, name): + for s in self.sections: + if s.name == name: + return s + return None + + def find_section_by_type(self, type): + for s in self.sections: + if s.sh_type == type: + return s + return None + +### Tests + +if __name__ == "__main__": + import sys + + elf_file = None + + with open(sys.argv[1], "rb") as elf: + elf_file = ElfFile(bytearray(elf.read())) + + # Header Info Test + print(elf_file.elf_header) + # Program Headers Info Test + print("") + print("Program Headers:") + print(" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align") + for phdr in elf_file.progheaders: + print(phdr) + # Section Headers Info Test + print("") + print("Section Headers:") + print(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al") + for i,s in enumerate(elf_file.sections,0): + print(f" [{i:2}] {s}") + # Symbols Info Test + if elf_file.symtab is not None: + print("") + print(f"Symbol table '{elf_file.symtab.name}' contains {len(elf_file.symtab.symbol_entries)} entries") + print(" Num: Value Size Type Bind Vis Ndx Name") + for i,sym in enumerate(elf_file.symtab.symbol_entries,0): + print(f"{i:6}: {sym}") + # Relocations Info Test + print("") + for s in elf_file.sections: + if s.is_rel(): + print(f"\nRelocation section '{s.name}' at offset 0x{s.sh_offset:06X} contains {len(s.relocations)} entries:") + print(" Offset Info Type Sym.Value Sym.Name + Addend") + for reloc in s.relocations: + print(f"{reloc}") + # mdebug Info Test + print("") + mdebug_section = elf_file.find_section_by_type(SHT_MIPS_DEBUG) + if mdebug_section is not None: + """ + for fdr in mdebug_section.fdrs: + print(fdr) + for symr in fdr.symrs: + print(symr) + for pdr in fdr.pdrs: + print(pdr) + for symr in pdr.symrs: + print(symr) + for liner in pdr.lines: + print(liner) + """ + for fdr in mdebug_section.fdrs: + print(fdr.c_str()) diff --git a/lib/hackerlibultra/tools/m2ctx.py b/lib/hackerlibultra/tools/m2ctx.py new file mode 100755 index 00000000..39c5dc50 --- /dev/null +++ b/lib/hackerlibultra/tools/m2ctx.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys +import subprocess +import tempfile + +script_dir = os.path.dirname(os.path.realpath(__file__)) +root_dir = os.path.abspath(os.path.join(script_dir, "..")) +src_dir = root_dir + "src/" + +# Project-specific +CPP_FLAGS = [ + "-Iinclude", + "-Iinclude/PR", + "-Iinclude/gcc", + "-Isrc", + "-Isrc/libc", + "-Iver/current/build/include", + "-D_LANGUAGE_C", + "-DF3DEX_GBI_2", + "-D_MIPS_SZLONG=32", + "-DSCRIPT(...)={}" + "-D__attribute__(...)=", + "-D__asm__(...)=", + "-ffreestanding", + "-DM2CTX", +] + +def import_c_file(in_file) -> str: + in_file = os.path.relpath(in_file, root_dir) + cpp_command = ["gcc", "-E", "-P", "-dM", *CPP_FLAGS, in_file] + cpp_command2 = ["gcc", "-E", "-P", *CPP_FLAGS, in_file] + + with tempfile.NamedTemporaryFile(suffix=".c") as tmp: + stock_macros = subprocess.check_output(["gcc", "-E", "-P", "-dM", tmp.name], cwd=root_dir, encoding="utf-8") + + out_text = "" + try: + out_text += subprocess.check_output(cpp_command, cwd=root_dir, encoding="utf-8") + out_text += subprocess.check_output(cpp_command2, cwd=root_dir, encoding="utf-8") + except subprocess.CalledProcessError: + print( + "Failed to preprocess input file, when running command:\n" + + cpp_command, + file=sys.stderr, + ) + sys.exit(1) + + if not out_text: + print("Output is empty - aborting") + sys.exit(1) + + for line in stock_macros.strip().splitlines(): + out_text = out_text.replace(line + "\n", "") + return out_text + +def main(): + parser = argparse.ArgumentParser( + description="""Create a context file which can be used for mips_to_c""" + ) + parser.add_argument( + "c_file", + help="""File from which to create context""", + ) + args = parser.parse_args() + + output = import_c_file(args.c_file) + + with open(os.path.join(root_dir, "ctx.c"), "w", encoding="UTF-8") as f: + f.write(output) + + +if __name__ == "__main__": + main() diff --git a/lib/hackerlibultra/tools/mdebug.py b/lib/hackerlibultra/tools/mdebug.py new file mode 100644 index 00000000..6f061ecc --- /dev/null +++ b/lib/hackerlibultra/tools/mdebug.py @@ -0,0 +1,938 @@ +#!/usr/bin/env python3 +# +# .mdebug section +# + +""" +References: +https://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf +https://web.archive.org/web/20010628021622/http://reality.sgi.com/davea/objectinfo.html +https://github.com/astrelsky/ghidra_mdebug +https://github.com/Rozelette/print-mdebug/blob/master/print_mdebug.py +https://opensource.apple.com/source/gcc_legacy/gcc_legacy-938/gcc/mips-tdump.c.auto.html +https://github.com/uhhpctools/openuh/blob/master/osprey-gcc-4.2.0/gcc/mips-tdump.c +https://github.com/bminor/binutils-gdb/blob/master/gdb/mdebugread.c + +(stabs docs): +https://sourceware.org/gdb/current/onlinedocs/stabs.html + +(ecoff docs): +https://web.archive.org/web/20160305114748/http://h41361.www4.hp.com/docs/base_doc/DOCUMENTATION/V50A_ACRO_SUP/OBJSPEC.PDF +https://chromium.googlesource.com/native_client/nacl-toolchain/+/refs/tags/gcc-4.4.3/binutils/gas/ecoff.c +https://kernel.googlesource.com/pub/scm/linux/kernel/git/hjl/binutils/+/hjl/secondary/include/coff/sym.h +https://kernel.googlesource.com/pub/scm/linux/kernel/git/hjl/binutils/+/hjl/secondary/include/coff/symconst.h +""" + +from enum import IntEnum +import struct + +class EcoffBt(IntEnum): # Basic Type + NIL = 0 # + ADR = 1 # pointer-sized integer type + CHAR = 2 # char + UCHAR = 3 # unsigned char + SHORT = 4 # short + USHORT = 5 # unsigned short + INT = 6 # int + UINT = 7 # unsigned int + LONG = 8 # long + ULONG = 9 # unsigned long + FLOAT = 10 # float + DOUBLE = 11 # double + STRUCT = 12 # struct + UNION = 13 # union + ENUM = 14 # enum + TYPEDEF = 15 # type definition + RANGE = 16 # subrange of int + SET = 17 # pascal set + COMPLEX = 18 # FORTRAN complex + DCOMPLEX = 19 # FORTRAN double com[plex + INDIRECT = 20 # forward or unnamed typedef + FIXEDDEC = 21 # Fixed point decimal + FLOATDEC = 22 # Floating point decimal + STRING = 23 # Varying length character string + BIT = 24 # Aligned bit tring + PICTURE = 25 # picture + VOID = 26 # void + LONGLONG = 27 # long long int + ULONGLONG = 28 # unsigned long long int + LONG64 = 30 # + ULONG64 = 31 # + LONGLONG64 = 32 # + ULONGLONG64 = 33 # + ADR64 = 34 # + INT64 = 35 # + UINT64 = 36 # + + AGGREGATE = 63 # not a basic type + MAX = 64 # + +class EcoffSc(IntEnum): + NIL = 0 + TEXT = 1 # .text symbol + DATA = 2 # .data symbol + BSS = 3 # .bss symbol + REGISTER = 4 # value of symbol is register number + ABS = 5 # value of symbol is absolute + UNDEFINED = 6 # value of symbol is undefined + CDBLOCAL = 7 # variable value is in se->va.?? + BITS = 8 # variable is a bit field + CDBSYSTEM = 9 # variable value is in cdb address space + REGIMAGE = 10 # register value is saved on stack + INFO = 11 # symbol contains debugger information + USERSTRUCT = 12 # address in struct user for current process + SDATA = 13 # load time only small data + SBSS = 14 # load time only small common + RDATA = 15 # load time only read-only data + VAR = 16 # var parameter (FORTRAN, Pascal) + COMMON = 17 # common variable + SCOMMON = 18 # small common + VARREGISTER = 19 # var parameter in a register + VARIANT = 20 # variant record + SUNDEFINED = 21 # small undefined (external) data + INIT = 22 # .init section symbol + BASEDVAR = 23 # FORTRAN or PL/1 ptr based var + XDATA = 24 # exception handling data + PDATA = 25 # procedure section + FINI = 26 # .fini section + RCONST = 27 # .rconst section + MAX = 32 # + +class EcoffSt(IntEnum): + NIL = 0 # + GLOBAL = 1 # external symbol + STATIC = 2 # static symbol + PARAM = 3 # procedure argument + LOCAL = 4 # local variable + LABEL = 5 # label + PROC = 6 # procedure + BLOCK = 7 # beginning of block + END = 8 # end of something + MEMBER = 9 # member of struct/union/enum/.. + TYPEDEF = 10 # type definition + FILE = 11 # filename + REGRELOC = 12 # register relocation + FORWARD = 13 # forwarding address + STATICPROC = 14 # load time only static procedures + # (CONSTANT and STAPARAM are in different orders between different sources...) + CONSTANT = 15 # constant + STAPARAM = 16 # FORTRAN static parameters + STRUCT = 26 # structure + UNION = 27 # union + ENUM = 28 # enum + INDIRECT = 34 # + +class EcoffTq(IntEnum): # Type qualifier + NIL = 0 # + PTR = 1 # pointer + PROC = 2 # procedure + ARRAY = 3 # array + FAR = 4 # longer addressing + VOL = 5 # volatile + CONST = 6 # constant + MAX = 8 # + + UNK7 = 7 # invalid + UNK9 = 9 # invalid + UNK10 = 10 # invalid + UNK11 = 11 # invalid + UNK12 = 12 # invalid + UNK13 = 13 # invalid + UNK14 = 14 # invalid + UNK = 15 # invalid + +class EcoffLanguageCode(IntEnum): + C = 0 + PASCAL = 1 + FORTRAN = 2 + ASM = 3 + MACHINE = 4 + NIL = 5 + ADA = 6 + PL1 = 7 + COBOL = 8 + STDC = 9 + CPLUSPLUSV2 = 10 + MAX = 11 + +def get_bitrange(value, start, length): + return (value >> start) & ((1 << length) - 1) + +def sign_extend_16(value): + return (value & 0x7FFF) - (value & 0x8000) + +def sign_extend_4(value): + return (value & 0x7) - (value & 0x8) + +class EcoffLiner: + """ + ECOFF Line Numbers Mapping + + typedef struct sLINER { + s32 count : 4; + s32 delta : 4; + } tLINER, *pLINER; + """ + + def __init__(self, data) -> None: + self.count = get_bitrange(data[0], 0, 4) + 1 + self.delta = get_bitrange(data[0], 4, 4) + + if self.delta == 8: + self.is_extended = True + self.delta = sign_extend_16((data[1] << 8) | data[2]) + self.data = data[:3] + else: + self.is_extended = False + self.delta = sign_extend_4(self.delta) + self.data = data[:1] + + def __str__(self) -> str: + return f"""= EcoffLiner ============= +delta = {self.delta} +count = {self.count} +extended = {self.is_extended}""" + +class EcoffTir: + """ + ECOFF Type Information Record + + typedef struct { +#ifdef LITTLE_ENDIAN + u32 tq3 : 4; + u32 tq2 : 4; + u32 tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ + u32 tq0 : 4; + /* ---- 16 bit boundary ---- */ + u32 tq5 : 4; + u32 tq4 : 4; + u32 bt : 6; /* basic type */ + u32 continued : 1; /* indicates additional TQ info in next AUX */ + u32 fBitfield : 1; /* set if bit width is specified */ +#else + u32 fBitfield : 1; /* set if bit width is specified */ + u32 continued : 1; /* indicates additional TQ info in next AUX */ + u32 bt : 6; /* basic type */ + u32 tq4 : 4; + u32 tq5 : 4; + /* ---- 16 bit boundary ---- */ + u32 tq0 : 4; + u32 tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ + u32 tq2 : 4; + u32 tq3 : 4; +#endif + } TIR, *pTIR; // size = 4 + """ + SIZE = 4 + + def __init__(self, data, endian) -> None: + if endian == 1: + self.tq3 = EcoffTq(get_bitrange(data, 0, 4)) + self.tq2 = EcoffTq(get_bitrange(data, 4, 4)) + self.tq1 = EcoffTq(get_bitrange(data, 8, 4)) + self.tq0 = EcoffTq(get_bitrange(data, 12, 4)) + self.tq5 = EcoffTq(get_bitrange(data, 16, 4)) + self.tq4 = EcoffTq(get_bitrange(data, 20, 4)) + self.bt = EcoffBt(get_bitrange(data, 24, 6)) + self.continued = get_bitrange(data, 30, 1) + self.fBitfield = get_bitrange(data, 31, 1) + else: + self.fBitfield = get_bitrange(data, 0, 1) + self.continued = get_bitrange(data, 1, 1) + self.bt = EcoffBt(get_bitrange(data, 2, 6)) + self.tq4 = EcoffTq(get_bitrange(data, 8, 4)) + self.tq5 = EcoffTq(get_bitrange(data, 12, 4)) + self.tq0 = EcoffTq(get_bitrange(data, 16, 4)) + self.tq1 = EcoffTq(get_bitrange(data, 20, 4)) + self.tq2 = EcoffTq(get_bitrange(data, 24, 4)) + self.tq3 = EcoffTq(get_bitrange(data, 28, 4)) + self.tqs = (self.tq0, self.tq1, self.tq2, self.tq3, self.tq4, self.tq5) + + def __str__(self) -> str: + return f"""= EcoffTIR ============== +fBitfield = {self.fBitfield} +continued = {self.continued} +bt = {self.bt.name} +tq4 = {self.tq4} +tq5 = {self.tq5} +tq0 = {self.tq0} +tq1 = {self.tq1} +tq2 = {self.tq2} +tq3 = {self.tq3}""" + +class EcoffRNDXR: + """ + typedef struct { +#ifdef LITTLE_ENDIAN + u32 index : 20; /* index int sym/aux/iss tables */ + u32 rfd : 12; /* index into the file indirect table */ +#else + u32 rfd : 12; /* index into the file indirect table */ + u32 index : 20; /* index int sym/aux/iss tables */ +#endif + } RNDXR, *pRNDXR; // size = 4 + """ + SIZE = 4 + + def __init__(self, data, endian) -> None: + if endian == 1: + self.index = get_bitrange(data, 0, 20) + self.rfd = get_bitrange(data, 20, 12) + else: + self.rfd = get_bitrange(data, 0, 12) + self.index = get_bitrange(data, 12, 20) + + def __str__(self) -> str: + return f"""= EcoffRNDXR ============== +index = {self.index} +rfd = {self.rfd}""" + +class EcoffAux: + """ + typedef union __sgi_auxu_u { + TIR ti; /* type information record */ + RNDXR rndx; /* relative index into symbol table */ + long_i dnLow; /* low dimension of array */ + long_i dnHigh; /* high dimension of array */ + long_i isym; /* symbol table index (end of proc) */ + long_i iss; /* index into string space (not used) */ + long_i width; /* width for non-default sized struct fields */ + long_i count; /* count of ranges for variant arm */ + } AUXU, *pAUXU; // size = 4 + """ + SIZE = 4 + + def __init__(self, fdr, data, endian) -> None: + data = struct.unpack((">" if endian == 1 else "<") + "I", data)[0] + self.ti = EcoffTir(data, endian) + self.rndx = EcoffRNDXR(data, endian) + self.dnLow = self.dnHigh = self.isym = self.iss = self.width = self.count = data + self.fdr = fdr + + def __str__(self) -> str: + return f"""= EcoffAux ============== +ti = {{ +{self.ti} +}} +rndx = {{ +{self.rndx} +}} +dnLow = {self.dnLow:04X} +dnHigh = {self.dnHigh:04X} +isym = {self.isym:04X} +iss = {self.iss:04X} +width = {self.width:04X} +count = {self.count:04X}""" + +class EcoffSymr: + """ + ECOFF Local Symbol + + typedef struct sSymr { + s32 iss; /* index into String Space of name */ + s32 value; /* symbol value */ + /* value can be an address, size or frame offset depending on symbol type */ + EcoffSt st : 6; /* symbol type */ + EcoffSc sc : 5; /* storage class - text, data, etc */ + s32 _reserved : 1; /* reserved bit */ + s32 index : 20; /* index into sym/aux table */ + } tSymr, *pSymr; // size = 0xC + """ + SIZE = 0xC + + def __init__(self, parent, idx, data): + self.idx = idx + self.parent = parent # can be either Fdr or Pdr + self.pdr = parent if type(parent) == EcoffPdr else None + self.fdr = self.pdr.parent if self.pdr is not None else parent + + self.data = data[:EcoffSymr.SIZE] + + self.iss, self.value, bits = struct.unpack(">III", self.data) + self.st = EcoffSt(get_bitrange(bits, 26, 6)) + self.sc = EcoffSc(get_bitrange(bits, 21, 5)) + self._reserved = get_bitrange(bits, 20, 1) + self.index = get_bitrange(bits, 0, 20) + + self.name = self.fdr.read_string(self.iss) + self.type_name = None + + self.c_repr = None + + assert self._reserved == 0 # Sanity check + + def link_syms(self): + if self.st == EcoffSt.END: + self.start_sym = self.fdr.symrs[self.index] + elif self.st in [EcoffSt.BLOCK, EcoffSt.FILE, EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + self.end_sym = self.fdr.symrs[self.index - 1] + elif self.st in [EcoffSt.PROC, EcoffSt.STATICPROC]: + aux = self.fdr.auxs[self.index] + self.end_sym = self.fdr.symrs[aux.isym - 1] + elif self.st in [EcoffSt.GLOBAL, EcoffSt.STATIC, EcoffSt.PARAM, EcoffSt.LOCAL, EcoffSt.MEMBER, EcoffSt.TYPEDEF, EcoffSt.FORWARD]: + pass + + def late_init(self): + if self.st == EcoffSt.END: + """ + END symbols index the associated begin symbol + """ + self.start_sym = self.fdr.symrs[self.index] + if self.start_sym.st == EcoffSt.BLOCK: + self.c_repr = "}" + elif self.start_sym.st == EcoffSt.FILE: + self.c_repr = f"// end of file: \"{self.start_sym.name}\"" + elif self.start_sym.st in [EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + self.c_repr = "}" + if len(self.start_sym.type_name) != 0: + self.c_repr += " " + self.start_sym.type_name + self.c_repr += f";" + elif self.st in [EcoffSt.BLOCK, EcoffSt.FILE, EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + """ + These symbols index the first symbol after their associated END symbol + """ + self.end_sym = self.fdr.symrs[self.index - 1] + if self.st == EcoffSt.BLOCK: + self.c_repr = "{" + elif self.st == EcoffSt.FILE: + self.c_repr = f"#line 1 \"{self.name}\"" + elif self.st in [EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.ENUM]: + keyword = "" + self.type_name = "" + next_sym = self.fdr.symrs[self.index] + if next_sym.st == EcoffSt.TYPEDEF: + # possible typedef struct/union/enum + # TODO check this by ensuring the typedef symbol references this symbol + keyword += "typedef " + self.type_name = next_sym.name + + if self.st == EcoffSt.UNION: + keyword += "union" + elif self.st == EcoffSt.ENUM: + keyword += "enum" + else: + keyword += "struct" + + name = self.name + if len(name) != 0: + name = ' ' + name + + self.c_repr = f"{keyword}{name} {{" + elif self.st in [EcoffSt.PROC, EcoffSt.STATICPROC]: + aux1 = self.fdr.auxs[self.index] + self.end_sym = self.fdr.symrs[aux1.isym - 1] + + self.c_repr = "" + if self.st == EcoffSt.STATICPROC: + self.c_repr += "static " + + self.return_type, _ = self.process_type_information(1) + self.c_repr += self.return_type + if len(self.return_type) != 0: + self.c_repr += " " + self.c_repr += self.name + self.c_repr += "()" + elif self.st in [EcoffSt.GLOBAL, EcoffSt.STATIC, EcoffSt.PARAM, EcoffSt.LOCAL, EcoffSt.MEMBER, EcoffSt.FORWARD]: + self.c_repr = "" + if self.st == EcoffSt.MEMBER: + # value of a stMember is the offset in bits + self.c_repr += f"/* 0x{self.value//8:X} */ " + + type_str, bitwidth = self.process_type_information(0) + self.c_repr += type_str + if len(self.c_repr) != 0: + self.c_repr += " " + self.c_repr += f"{self.name}{f' : {bitwidth}' if bitwidth is not None else ''};" + elif self.st == EcoffSt.TYPEDEF: + # TODO the typedef may already be absorbed into a struct or similar, check before emitting + type_str, _ = self.process_type_information(0) + self.c_repr = f"typedef {type_str} {self.name};" + elif self.st == EcoffSt.LABEL: + self.c_repr = f"{self.name}:" + + def process_type_information(self, ind): + c_bt_names = { + EcoffBt.NIL : None, + EcoffBt.ADR : None, + EcoffBt.CHAR : "signed char", + EcoffBt.UCHAR : "char", + EcoffBt.SHORT : "short", + EcoffBt.USHORT : "unsigned short", + EcoffBt.INT : "int", + EcoffBt.UINT : "unsigned int", + EcoffBt.LONG : "long", + EcoffBt.ULONG : "unsigned long", + EcoffBt.FLOAT : "float", + EcoffBt.DOUBLE : "double", + EcoffBt.STRUCT : "struct", + EcoffBt.UNION : "union", + EcoffBt.ENUM : "enum", + EcoffBt.TYPEDEF : "typedef", + EcoffBt.RANGE : None, + EcoffBt.SET : None, + EcoffBt.COMPLEX : "complex", + EcoffBt.DCOMPLEX : "double complex", + EcoffBt.INDIRECT : None, + EcoffBt.FIXEDDEC : None, + EcoffBt.FLOATDEC : None, + EcoffBt.STRING : "const char*", + EcoffBt.BIT : None, + EcoffBt.PICTURE : None, + EcoffBt.VOID : "void", + EcoffBt.LONGLONG : "long long", + EcoffBt.ULONGLONG : "unsigned long long", + EcoffBt.LONG64 : "long", + EcoffBt.ULONG64 : "unsigned long", + EcoffBt.LONGLONG64 : "long long", + EcoffBt.ULONGLONG64 : "unsigned long long", + EcoffBt.ADR64 : None, + EcoffBt.INT64 : None, + EcoffBt.UINT64 : None, + } + c_tq_str = { + EcoffTq.NIL : "", + EcoffTq.PTR : "*", + EcoffTq.PROC : "()", + EcoffTq.ARRAY : "[]", + EcoffTq.FAR : "/* FAR */", + EcoffTq.VOL : "volatile", + EcoffTq.CONST : "const", + } + + if self.index == 0xFFFFF: + # no type info + return "", None + + aux = self.fdr.auxs[self.index + ind] + ind += 1 + type_str = "" + + bit_width = None + if aux.ti.fBitfield == 1: + bit_width = self.fdr.auxs[self.index + ind].isym + ind += 1 + + if aux.ti.bt in [EcoffBt.STRUCT, EcoffBt.UNION, EcoffBt.ENUM, EcoffBt.TYPEDEF]: + type_ref_aux = self.fdr.auxs[self.index + ind] + ind += 1 + + fd_ref_idx = type_ref_aux.rndx.rfd + if fd_ref_idx == 4095: + fd_ref_idx = self.fdr.auxs[self.index + ind].isym + ind += 1 + + fdr_ref = self.fdr.parent.fdrs[fd_ref_idx] + sym_ref = fdr_ref.symrs[type_ref_aux.rndx.index] + # now we have the reference to the stStruct, stUnion, stEnum, or stTypeDef + type_str += f"{sym_ref.type_name if sym_ref.type_name is not None else sym_ref.name}" + else: + type_str += f"{c_bt_names[aux.ti.bt]}" + + # TODO improve emitting qualified types + tqs = "" + for tq in aux.ti.tqs: + if tq == EcoffTq.NIL: + continue + if tq == EcoffTq.ARRAY: + ind += 2 # skips over some info such as the type of index (always int for C) + array_low_aux = self.fdr.auxs[self.index + ind] + array_high_aux = self.fdr.auxs[self.index + ind + 1] + stride_aux = self.fdr.auxs[self.index + ind + 2] + ind += 3 + tqs += "[" + if array_high_aux.dnHigh != 0xFFFFFFFF: + tqs += '%d' % (array_high_aux.dnHigh + 1) + tqs += "]" + else: + tqs += c_tq_str[tq] + tqs += " " + tqs = tqs.strip() + if len(tqs) != 0: + type_str += " " + tqs + + return type_str, bit_width + + def __str__(self) -> str: + return f"""= EcoffSymr ============== {self.idx} +iss = 0x{self.iss:08X} +value = 0x{self.value:08X} +st = st{self.st.name} +sc = sc{self.sc.name} +_reserved = {self._reserved} +index = 0x{self.index:05X} +name = {self.name}""" + +class EcoffPdr: + """ + ECOFF Procedure Descriptor + + typedef struct sPDR { + s32 addr; /* memory address of start of procedure */ + s32 isym; /* start of local symbol entries */ + s32 iline; /* start of line number entries */ + s32 regmask; /* save register mask */ + s32 regoffset; /* save register offset */ + s32 iopt; /* start of optimization symbol entries */ + s32 fregmask; /* save floating point register mask */ + s32 fregoffset; /* save floating point register offset */ + s32 frameoffset; /* frame size */ + u16 framereg; /* frame pointer register */ + u16 pcreg; /* offset or reg of return pc */ + s32 lnLow; /* lowest line in the procedure */ + s32 lnHigh; /* highest line in the procedure */ + s32 cbLineOffset; /* byte offset for this procedure from the fd base */ +#ifdef 64_BIT + // TODO there's a bitfield in here + s32 gpPrologue; /* byte size of GP prologue */ + s32 gpUsed; /* true if the procedure uses GP */ + s32 regFrame; /* true if register frame procedure */ + s32 prof; /* true if compiled with -pg */ + s32 localOffset; /* offset of local variables from vfp */ +#endif + } tPDR, *pPDR; // size = 0x34 + """ + SIZE = 0x34 + + def __init__(self, fdr, data) -> None: + self.parent = fdr + self.data = data[:EcoffPdr.SIZE] + + self.addr, self.isym, self.iline, self.regmask, \ + self.regoffset, self.iopt, self.fregmask, self.fregoffset, \ + self.frameoffset, self.framereg, self.pcreg, self.lnLow, \ + self.lnHigh, self.cbLineOffset = struct.unpack(">IIIIIIIIIHHIII", self.data) + + self.symrs = [] + + i = self.isym + symr = self.parent.symrs[i] + assert symr.st == EcoffSt.PROC or symr.st == EcoffSt.STATICPROC + # Inherit procedure name from procedure symbol + self.name = symr.name + + self.symrs.append(symr) + while not (symr.st == EcoffSt.END and symr.name == self.symrs[0].name): + i += 1 + symr = self.parent.symrs[i] + self.symrs.append(symr) + + assert symr.st == EcoffSt.END and symr.sc == EcoffSc.TEXT + self.size = symr.value # value field of an stEND and scTEXT symbol is the procedure size + assert self.size % 4 == 0 + + # indexed by asm word offset from proc start + self.lines = [] + + # ilineMax = self.parent.parent.hdrr.ilineMax + # cbLine = self.parent.parent.hdrr.cbLine + # cbLineOffset = self.parent.parent.hdrr.cbLineOffset + # ilineBase = self.parent.ilineBase + # cline = self.parent.cline + # cbLineOffset = self.parent.cbLineOffset + # cbLine = self.parent.cbLine + # lnLow = self.lnLow + # lnHigh = self.lnHigh + # iline = self.iline + + elf_data = self.parent.parent.parent.data + + line_no = self.lnLow # first line in the procedure + line_data = self.parent.parent.hdrr.cbLineOffset + self.parent.cbLineOffset + self.cbLineOffset + # line_end = self.parent.parent.hdrr.cbLineOffset + self.parent.cbLineOffset + self.parent.cbLine + + # print(self) + # print(f"{self.name} [{self.lnLow}:{self.lnHigh}]") + # print(self.size//4) + while len(self.lines) < self.size//4: + # assert line_data < line_end , "Overflow in line numbers table" + + liner = EcoffLiner(elf_data[line_data:]) + line_no += liner.delta + # if line_no < self.lnLow or line_no > self.lnHigh: + # break + + # print(liner) + for i in range(liner.count): + # print(f"[{len(self.lines)}] {line_no}") + self.lines.append(line_no) + + line_data += len(liner.data) + + def lookup_sym(self, value, type=-1): + for sym in self.symrs: + if sym.value == value and (type == -1 or type == sym.st): + return sym + return None + + def __str__(self) -> str: + return f"""= EcoffPdr =============== +addr = 0x{self.addr:08X} +isym = 0x{self.isym:08X} +iline = 0x{self.iline:08X} +regmask = 0b{self.regmask:032b} +regoffset = 0x{self.regoffset:08X} +iopt = 0x{self.iopt:08X} +fregmask = 0b{self.fregmask:032b} +fregoffset = 0x{self.fregoffset:08X} +frameoffset = 0x{self.frameoffset:08X} +framereg = ${self.framereg} +pcreg = ${self.pcreg} +lnLow = {self.lnLow} +lnHigh = {self.lnHigh} +cbLineOffset = 0x{self.cbLineOffset:08X} +name = {self.name}""" + +class EcoffFdr: + """ + ECOFF File Descriptor + + typedef struct sFDR { + u32 adr; /* memory address of beginning of file */ + s32 rss; /* file name (of source, if known) */ + s32 issBase; /* file's string space */ + s32 cbSs; /* number of bytes in the ss */ + s32 isymBase; /* beginning of symbols */ + s32 csym; /* count file's of symbols */ + s32 ilineBase; /* file's line symbols */ + s32 cline; /* count of file's line symbols */ + s32 ioptBase; /* file's optimization entries */ + s32 copt; /* count of file's optimization entries */ + u16 ipdFirst; /* start of procedures for this file */ + u16 cpd; /* count of procedures for this file */ + s32 iauxBase; /* file's auxiliary entries */ + s32 caux; /* count of file's auxiliary entries */ + s32 rfdBase; /* index into the file indirect table */ + s32 crfd; /* count file indirect entries */ + EcoffLanguageCode lang : 5; /* language for this file */ + u32 fMerge : 1; /* whether this file can be merged */ + u32 fReadin : 1; /* true if it was read in (not just created) */ + u32 fBigEndian : 1; /* true if AUXU's are big endian */ + u32 glevel : 2; /* level this file was compiled with */ + u32 _reserved : 20; /* reserved bits */ + s32 cbLineOffset; /* byte offset from header for this file ln's */ + s32 cbLine; /* size of lines for this file */ + } tFDR, *pFDR; // size = 0x48 + """ + SIZE = 0x48 + + @staticmethod + def from_binary(mdebug, i): + # Init + if 'init' not in EcoffFdr.from_binary.__dict__: + EcoffFdr.from_binary.cache = {} + EcoffFdr.from_binary.init = True + # Parent Init + if mdebug not in EcoffFdr.from_binary.cache: + EcoffFdr.from_binary.cache[mdebug] = {} + # Cache hit + if i in EcoffFdr.from_binary.cache[mdebug]: + return EcoffFdr.from_binary.cache[mdebug][i] + # Cache miss + cbFdOffset = mdebug.hdrr.cbFdOffset + elf_data = mdebug.parent.data + EcoffFdr.from_binary.cache[mdebug][i] = EcoffFdr(mdebug, elf_data[cbFdOffset+i*EcoffFdr.SIZE:cbFdOffset+(i+1)*EcoffFdr.SIZE]) + return EcoffFdr.from_binary.cache[mdebug][i] + + def __init__(self, mdebug, data) -> None: + self.parent = mdebug + self.data = data[:EcoffFdr.SIZE] + + self.adr, self.rss, self.issBase, self.cbSs, \ + self.isymBase, self.csym, self.ilineBase, self.cline, \ + self.ioptBase, self.copt, self.ipdFirst, self.cpd, \ + self.iauxBase, self.caux, self.rfdBase, self.crfd, \ + bits, self.cbLineOffset, self.cbLine = struct.unpack(">IIIIIIIIIIHHIIIIIII", self.data) + + self.lang = EcoffLanguageCode(get_bitrange(bits, 27, 5)) + self.fMerge = get_bitrange(bits, 26, 1) + self.fReadin = get_bitrange(bits, 25, 1) + self.fBigEndian = get_bitrange(bits, 24, 1) + self.glevel = get_bitrange(bits, 22, 2) + self._reserved = get_bitrange(bits, 2, 20) + + self.name = self.parent.read_string(self.issBase + self.rss) + + # print(self) + + hdrr = self.parent.hdrr + elf_data = self.parent.parent.data + + # Aux Symbols + self.auxs = [] + for i in range(self.caux): + i += self.iauxBase + assert i < hdrr.iauxMax , "Out of bounds in Auxiliary Symbol Table" + aux = EcoffAux(self, elf_data[hdrr.cbAuxOffset+i*EcoffAux.SIZE:][:EcoffAux.SIZE], self.fBigEndian) + self.auxs.append(aux) + + # Symbols + self.symrs = [] + for i in range(self.csym): + j = i + self.isymBase + assert j < hdrr.isymMax , "Out of bounds in Local Symbol Table" + symr = EcoffSymr(self, i, elf_data[hdrr.cbSymOffset+j*EcoffSymr.SIZE:hdrr.cbSymOffset+(j+1)*EcoffSymr.SIZE]) + self.symrs.append(symr) + for symr in self.symrs: + symr.link_syms() + + # PDRs + self.pdrs = [] + for i in range(self.cpd): + i += self.ipdFirst + assert i < hdrr.ipdMax , "Out of bounds in Procedure Descriptor Table" + pdr = EcoffPdr(self, elf_data[hdrr.cbPdOffset+i*EcoffPdr.SIZE:hdrr.cbPdOffset+(i+1)*EcoffPdr.SIZE]) + self.pdrs.append(pdr) + + self.size = sum([pdr.size for pdr in self.pdrs]) + + def late_init(self): + for symr in self.symrs: + symr.late_init() + + def pdr_forname(self, procedure_name): + for pdr in self.pdrs: + if pdr.name == procedure_name: + return pdr + return None + + def pdr_foranyaddr(self, addr): + for pdr in self.pdrs: + if pdr.addr <= addr and pdr.addr + pdr.size > addr: + return pdr + return None + + def pdr_foraddr(self, addr): + for pdr in self.pdrs: + if pdr.addr == addr: + return pdr + return None + + def read_string(self, index): + return self.parent.read_string(self.issBase + index) + + def c_str(self) -> str: + """ + C prettyprint file + """ + def print_symbol(symr): + return f"{symr.st.name} :: {symr.c_repr}" + + indent = 0 + out = f"File: {self.name}\n" + + for symr in self.symrs: + if symr.st in [EcoffSt.END]: + indent -= 2 + + out += " " * indent + out += print_symbol(symr) + out += "\n" + + if symr.st in [EcoffSt.FILE, EcoffSt.STRUCT, EcoffSt.UNION, EcoffSt.PROC, EcoffSt.STATICPROC, EcoffSt.BLOCK]: + indent += 2 + + return out + + def __str__(self) -> str: + return f"""= EcoffFdr =============== +adr = 0x{self.adr:08X} +rss = 0x{self.rss:08X} +issBase = 0x{self.issBase:08X} +cbSs = 0x{self.cbSs:08X} +isymBase = 0x{self.isymBase:08X} +csym = 0x{self.csym:08X} +ilineBase = 0x{self.ilineBase:08X} +cline = 0x{self.cline:08X} +ioptBase = 0x{self.ioptBase:08X} +copt = 0x{self.copt:08X} +ipdFirst = 0x{self.ipdFirst:08X} +cpd = 0x{self.cpd:08X} +iauxBase = 0x{self.iauxBase:08X} +caux = 0x{self.caux:08X} +rfdBase = 0x{self.rfdBase:08X} +crfd = 0x{self.crfd:08X} +lang = {self.lang.name} +fMerge = {bool(self.fMerge)} +fReadin = {bool(self.fReadin)} +fBigEndian = {bool(self.fBigEndian)} +glevel = {self.glevel} +_reserved = {self._reserved} +cbLineOffset = 0x{self.cbLineOffset:08X} +cbLine = 0x{self.cbLine:08X} +name = {self.name}""" + +class EcoffHDRR: + """ + Symbolic Header + + typedef struct sHDRR { + u16 magic; /* 0x7009 */ + u16 vstamp; /* version stamp */ + s32 ilineMax; /* number of line number entries */ + s32 cbLine; /* number of bytes for line number entries */ + s32 cbLineOffset; /* offset to start of line number entries */ + s32 idnMax; /* max index into dense number table */ + s32 cbDnOffset; /* offset to start dense number table */ + s32 ipdMax; /* number of procedures */ + s32 cbPdOffset; /* offset to procedure descriptor table */ + s32 isymMax; /* number of local symbols */ + s32 cbSymOffset; /* offset to start of local symbols */ + s32 ioptMax; /* max index into optimization symbol entries */ + s32 cbOptOffset; /* offset to optimization symbol entries */ + s32 iauxMax; /* number of auxillary symbol entries */ + s32 cbAuxOffset; /* offset to start of auxillary symbol entries */ + s32 issMax; /* max index into local strings */ + s32 cbSsOffset; /* offset to start of local strings */ + s32 issExtMax; /* max index into external strings */ + s32 cbSsExtOffset; /* offset to start of external strings */ + s32 ifdMax; /* number of file descriptor entries */ + s32 cbFdOffset; /* offset to file descriptor table */ + s32 crfd; /* number of relative file descriptor entries */ + s32 cbRfdOffset; /* offset to relative file descriptor table */ + s32 iextMax; /* max index into external symbols */ + s32 cbExtOffset; /* offset to start of external symbol entries */ + } tHDRR, *pHDRR; // size = 0x60 + """ + HDRR_MAGIC = 0x7009 + SIZE = 0x60 + + def __init__(self, data) -> None: + self.data = data[:EcoffHDRR.SIZE] + + self.magic, self.vstamp, self.ilineMax, self.cbLine, \ + self.cbLineOffset, self.idnMax, self.cbDnOffset, self.ipdMax, \ + self.cbPdOffset, self.isymMax, self.cbSymOffset, self.ioptMax, \ + self.cbOptOffset, self.iauxMax, self.cbAuxOffset, self.issMax, \ + self.cbSsOffset, self.issExtMax, self.cbSsExtOffset, self.ifdMax, \ + self.cbFdOffset, self.crfd, self.cbRfdOffset, self.iextMax, \ + self.cbExtOffset = struct.unpack(">HHIIIIIIIIIIIIIIIIIIIIIII", self.data) + + assert self.magic == EcoffHDRR.HDRR_MAGIC , f"Symbolic Header magic value is incorrect. Got 0x{self.magic:04X}, expected 0x{EcoffHDRR.HDRR_MAGIC:04X}" + + def __str__(self) -> str: + return f"""= EcoffHDRR ============== +magic = 0x{self.magic:04X} +vstamp = 0x{self.vstamp:04X} +ilineMax = 0x{self.ilineMax:08X} +cbLine = 0x{self.cbLine:08X} +cbLineOffset = 0x{self.cbLineOffset:08X} +idnMax = 0x{self.idnMax:08X} +cbDnOffset = 0x{self.cbDnOffset:08X} +ipdMax = 0x{self.ipdMax:08X} +cbPdOffset = 0x{self.cbPdOffset:08X} +isymMax = 0x{self.isymMax:08X} +cbSymOffset = 0x{self.cbSymOffset:08X} +ioptMax = 0x{self.ioptMax:08X} +cbOptOffset = 0x{self.cbOptOffset:08X} +iauxMax = 0x{self.iauxMax:08X} +cbAuxOffset = 0x{self.cbAuxOffset:08X} +issMax = 0x{self.issMax:08X} +cbSsOffset = 0x{self.cbSsOffset:08X} +issExtMax = 0x{self.issExtMax:08X} +cbSsExtOffset = 0x{self.cbSsExtOffset:08X} +ifdMax = 0x{self.ifdMax:08X} +cbFdOffset = 0x{self.cbFdOffset:08X} +crfd = 0x{self.crfd:08X} +cbRfdOffset = 0x{self.cbRfdOffset:08X} +iextMax = 0x{self.iextMax:08X} +cbExtOffset = 0x{self.cbExtOffset:08X}""" diff --git a/lib/hackerlibultra/tools/mips_isa.py b/lib/hackerlibultra/tools/mips_isa.py new file mode 100644 index 00000000..d99dcdaa --- /dev/null +++ b/lib/hackerlibultra/tools/mips_isa.py @@ -0,0 +1,1309 @@ +# TODO enum these constants +from enum import IntEnum, auto + +# Register IDs +class MipsGPReg(IntEnum): + R0 = 0 # 0 + AT = auto() # 1 + V0 = auto() # 2 + V1 = auto() # 3 + A0 = auto() # 4 + A1 = auto() # 5 + A2 = auto() # 6 + A3 = auto() # 7 + T0 = auto() # 8 + T1 = auto() # 9 + T2 = auto() # 10 + T3 = auto() # 11 + T4 = auto() # 12 + T5 = auto() # 13 + T6 = auto() # 14 + T7 = auto() # 15 + S0 = auto() # 16 + S1 = auto() # 17 + S2 = auto() # 18 + S3 = auto() # 19 + S4 = auto() # 20 + S5 = auto() # 21 + S6 = auto() # 22 + S7 = auto() # 23 + T8 = auto() # 24 + T9 = auto() # 25 + K0 = auto() # 26 + K1 = auto() # 27 + GP = auto() # 28 + SP = auto() # 29 + FP = auto() # 30 + RA = auto() # 31 + +class MipsFPReg(IntEnum): + F0 = 0 # 0 + F1 = auto() # 1 + F2 = auto() # 2 + F3 = auto() # 3 + F4 = auto() # 4 + F5 = auto() # 5 + F6 = auto() # 6 + F7 = auto() # 7 + F8 = auto() # 8 + F9 = auto() # 9 + F10 = auto() # 10 + F11 = auto() # 11 + F12 = auto() # 12 + F13 = auto() # 13 + F14 = auto() # 14 + F15 = auto() # 15 + F16 = auto() # 16 + F17 = auto() # 17 + F18 = auto() # 18 + F19 = auto() # 19 + F20 = auto() # 20 + F21 = auto() # 21 + F22 = auto() # 22 + F23 = auto() # 23 + F24 = auto() # 24 + F25 = auto() # 25 + F26 = auto() # 26 + F27 = auto() # 27 + F28 = auto() # 28 + F29 = auto() # 29 + F30 = auto() # 30 + F31 = auto() # 31 + +# Instruction Unique IDs +MIPS_INS_SLL = 0 +MIPS_INS_SRL = 1 +MIPS_INS_SRA = 2 +MIPS_INS_SLLV = 3 +MIPS_INS_SRLV = 4 +MIPS_INS_SRAV = 5 +MIPS_INS_JR = 6 +MIPS_INS_JALR = 7 +MIPS_INS_SYSCALL = 8 +MIPS_INS_BREAK = 9 +MIPS_INS_SYNC = 10 +MIPS_INS_MFHI = 11 +MIPS_INS_MTHI = 12 +MIPS_INS_MFLO = 13 +MIPS_INS_MTLO = 14 +MIPS_INS_DSLLV = 15 +MIPS_INS_DSRLV = 16 +MIPS_INS_DSRAV = 17 +MIPS_INS_MULT = 18 +MIPS_INS_MULTU = 19 +MIPS_INS_DIV = 20 +MIPS_INS_DIVU = 21 +MIPS_INS_DMULT = 22 +MIPS_INS_DMULTU = 23 +MIPS_INS_DDIV = 24 +MIPS_INS_DDIVU = 25 +MIPS_INS_ADD = 26 +MIPS_INS_ADDU = 27 +MIPS_INS_SUB = 28 +MIPS_INS_SUBU = 29 +MIPS_INS_AND = 30 +MIPS_INS_OR = 31 +MIPS_INS_XOR = 32 +MIPS_INS_NOR = 33 +MIPS_INS_SLT = 34 +MIPS_INS_SLTU = 35 +MIPS_INS_DADD = 36 +MIPS_INS_DADDU = 37 +MIPS_INS_DSUB = 38 +MIPS_INS_DSUBU = 39 +MIPS_INS_TGE = 40 +MIPS_INS_TGEU = 41 +MIPS_INS_TLT = 42 +MIPS_INS_TLTU = 43 +MIPS_INS_TEQ = 44 +MIPS_INS_TNE = 45 +MIPS_INS_DSLL = 46 +MIPS_INS_DSRL = 47 +MIPS_INS_DSRA = 48 +MIPS_INS_DSLL32 = 49 +MIPS_INS_DSRL32 = 50 +MIPS_INS_DSRA32 = 51 +MIPS_INS_BLTZ = 52 +MIPS_INS_BGEZ = 53 +MIPS_INS_BLTZL = 54 +MIPS_INS_BGEZL = 55 +MIPS_INS_TGEI = 56 +MIPS_INS_TGEIU = 57 +MIPS_INS_TLTI = 58 +MIPS_INS_TLTIU = 59 +MIPS_INS_TEQI = 60 +MIPS_INS_TNEI = 61 +MIPS_INS_BLTZAL = 62 +MIPS_INS_BGEZAL = 63 +MIPS_INS_BLTZALL = 64 +MIPS_INS_BGEZALL = 65 +MIPS_INS_J = 66 +MIPS_INS_JAL = 67 +MIPS_INS_BEQ = 68 +MIPS_INS_BNE = 69 +MIPS_INS_BLEZ = 70 +MIPS_INS_BGTZ = 71 +MIPS_INS_ADDI = 72 +MIPS_INS_ADDIU = 73 +MIPS_INS_SLTI = 74 +MIPS_INS_SLTIU = 75 +MIPS_INS_ANDI = 76 +MIPS_INS_ORI = 77 +MIPS_INS_XORI = 78 +MIPS_INS_LUI = 79 +MIPS_INS_MFC0 = 80 +MIPS_INS_MTC0 = 81 +MIPS_INS_TLBR = 82 +MIPS_INS_TLBWI = 83 +MIPS_INS_TLBWR = 84 +MIPS_INS_TLBP = 85 +MIPS_INS_ERET = 86 +MIPS_INS_MFC1 = 87 +MIPS_INS_DMFC1 = 88 +MIPS_INS_CFC1 = 89 +MIPS_INS_MTC1 = 90 +MIPS_INS_DMTC1 = 91 +MIPS_INS_CTC1 = 92 +MIPS_INS_BC1F = 93 +MIPS_INS_BC1T = 94 +MIPS_INS_BC1FL = 95 +MIPS_INS_BC1TL = 96 +MIPS_INS_ADD_S = 97 +MIPS_INS_SUB_S = 98 +MIPS_INS_MUL_S = 99 +MIPS_INS_DIV_S = 100 +MIPS_INS_SQRT_S = 101 +MIPS_INS_ABS_S = 102 +MIPS_INS_MOV_S = 103 +MIPS_INS_NEG_S = 104 +MIPS_INS_ROUND_L_S = 105 +MIPS_INS_TRUNC_L_S = 106 +MIPS_INS_CEIL_L_S = 107 +MIPS_INS_FLOOR_L_S = 108 +MIPS_INS_ROUND_W_S = 109 +MIPS_INS_TRUNC_W_S = 110 +MIPS_INS_CEIL_W_S = 111 +MIPS_INS_FLOOR_W_S = 112 +MIPS_INS_CVT_D_S = 113 +MIPS_INS_CVT_W_S = 114 +MIPS_INS_CVT_L_S = 115 +MIPS_INS_C_F_S = 116 +MIPS_INS_C_UN_S = 117 +MIPS_INS_C_EQ_S = 118 +MIPS_INS_C_UEQ_S = 119 +MIPS_INS_C_OLT_S = 120 +MIPS_INS_C_ULT_S = 121 +MIPS_INS_C_OLE_S = 122 +MIPS_INS_C_ULE_S = 123 +MIPS_INS_C_SF_S = 124 +MIPS_INS_C_NGLE_S = 125 +MIPS_INS_C_SEQ_S = 126 +MIPS_INS_C_NGL_S = 127 +MIPS_INS_C_LT_S = 128 +MIPS_INS_C_NGE_S = 129 +MIPS_INS_C_LE_S = 130 +MIPS_INS_C_NGT_S = 131 +MIPS_INS_ADD_D = 132 +MIPS_INS_SUB_D = 133 +MIPS_INS_MUL_D = 134 +MIPS_INS_DIV_D = 135 +MIPS_INS_SQRT_D = 136 +MIPS_INS_ABS_D = 137 +MIPS_INS_MOV_D = 138 +MIPS_INS_NEG_D = 139 +MIPS_INS_ROUND_L_D = 140 +MIPS_INS_TRUNC_L_D = 141 +MIPS_INS_CEIL_L_D = 142 +MIPS_INS_FLOOR_L_D = 143 +MIPS_INS_ROUND_W_D = 144 +MIPS_INS_TRUNC_W_D = 145 +MIPS_INS_CEIL_W_D = 146 +MIPS_INS_FLOOR_W_D = 147 +MIPS_INS_CVT_S_D = 148 +MIPS_INS_CVT_W_D = 149 +MIPS_INS_CVT_L_D = 150 +MIPS_INS_C_F_D = 151 +MIPS_INS_C_UN_D = 152 +MIPS_INS_C_EQ_D = 153 +MIPS_INS_C_UEQ_D = 154 +MIPS_INS_C_OLT_D = 155 +MIPS_INS_C_ULT_D = 156 +MIPS_INS_C_OLE_D = 157 +MIPS_INS_C_ULE_D = 158 +MIPS_INS_C_SF_D = 159 +MIPS_INS_C_NGLE_D = 160 +MIPS_INS_C_SEQ_D = 161 +MIPS_INS_C_NGL_D = 162 +MIPS_INS_C_LT_D = 163 +MIPS_INS_C_NGE_D = 164 +MIPS_INS_C_LE_D = 165 +MIPS_INS_C_NGT_D = 166 +MIPS_INS_CVT_S_W = 167 +MIPS_INS_CVT_D_W = 168 +MIPS_INS_CVT_S_L = 169 +MIPS_INS_CVT_D_L = 170 +MIPS_INS_BEQL = 171 +MIPS_INS_BNEL = 172 +MIPS_INS_BLEZL = 173 +MIPS_INS_BGTZL = 174 +MIPS_INS_DADDI = 175 +MIPS_INS_DADDIU = 176 +MIPS_INS_LDL = 177 +MIPS_INS_LDR = 178 +MIPS_INS_LB = 179 +MIPS_INS_LH = 180 +MIPS_INS_LWL = 181 +MIPS_INS_LW = 182 +MIPS_INS_LBU = 183 +MIPS_INS_LHU = 184 +MIPS_INS_LWR = 185 +MIPS_INS_LWU = 186 +MIPS_INS_SB = 187 +MIPS_INS_SH = 188 +MIPS_INS_SWL = 189 +MIPS_INS_SW = 190 +MIPS_INS_SDL = 191 +MIPS_INS_SDR = 192 +MIPS_INS_SWR = 193 +MIPS_INS_CACHE = 194 +MIPS_INS_LL = 195 +MIPS_INS_LWC1 = 196 +MIPS_INS_LWC2 = 197 +MIPS_INS_LLD = 198 +MIPS_INS_LDC1 = 199 +MIPS_INS_LDC2 = 200 +MIPS_INS_LD = 201 +MIPS_INS_SC = 202 +MIPS_INS_SWC1 = 203 +MIPS_INS_SWC2 = 204 +MIPS_INS_SCD = 205 +MIPS_INS_SDC1 = 206 +MIPS_INS_SDC2 = 207 +MIPS_INS_SD = 208 + +# RSP COP2 +MIPS_INS_VMULF = 209 +MIPS_INS_VMULU = 210 +MIPS_INS_VRNDP = 211 +MIPS_INS_VMULQ = 212 +MIPS_INS_VMUDL = 213 +MIPS_INS_VMUDM = 214 +MIPS_INS_VMUDN = 215 +MIPS_INS_VMUDH = 216 +MIPS_INS_VMACF = 217 +MIPS_INS_VMACU = 218 +MIPS_INS_VRNDN = 219 +MIPS_INS_VMACQ = 220 +MIPS_INS_VMADL = 221 +MIPS_INS_VMADM = 222 +MIPS_INS_VMADN = 223 +MIPS_INS_VMADH = 224 +MIPS_INS_VADD = 225 +MIPS_INS_VSUB = 226 +MIPS_INS_VABS = 227 +MIPS_INS_VADDC = 228 +MIPS_INS_VSUBC = 229 +MIPS_INS_VSAR = 230 +MIPS_INS_VLT = 231 +MIPS_INS_VEQ = 232 +MIPS_INS_VNE = 233 +MIPS_INS_VGE = 234 +MIPS_INS_VCL = 235 +MIPS_INS_VCH = 236 +MIPS_INS_VCR = 237 +MIPS_INS_VMRG = 238 +MIPS_INS_VAND = 239 +MIPS_INS_VNAND = 240 +MIPS_INS_VOR = 241 +MIPS_INS_VNOR = 242 +MIPS_INS_VXOR = 243 +MIPS_INS_VNXOR = 244 +MIPS_INS_VRCP = 245 +MIPS_INS_VRCPL = 246 +MIPS_INS_VRCPH = 247 +MIPS_INS_VMOV = 248 +MIPS_INS_VRSQ = 249 +MIPS_INS_VRSQL = 250 +MIPS_INS_VRSQH = 251 +MIPS_INS_VNOP = 252 +MIPS_INS_LBV = 253 +MIPS_INS_LSV = 254 +MIPS_INS_LLV = 255 +MIPS_INS_LDV = 256 +MIPS_INS_LQV = 257 +MIPS_INS_LRV = 258 +MIPS_INS_LPV = 259 +MIPS_INS_LUV = 260 +MIPS_INS_LHV = 261 +MIPS_INS_LFV = 262 +MIPS_INS_LTV = 263 +MIPS_INS_SBV = 264 +MIPS_INS_SSV = 265 +MIPS_INS_SLV = 266 +MIPS_INS_SDV = 267 +MIPS_INS_SQV = 268 +MIPS_INS_SRV = 269 +MIPS_INS_SPV = 270 +MIPS_INS_SUV = 271 +MIPS_INS_SHV = 272 +MIPS_INS_SFV = 273 +MIPS_INS_SWV = 274 +MIPS_INS_STV = 275 +MIPS_INS_MFC2 = 276 +MIPS_INS_MTC2 = 277 +MIPS_INS_CFC2 = 278 +MIPS_INS_CTC2 = 279 + +# Pseudo-Instruction Unique IDs +MIPS_INS_BEQZ = 280 +MIPS_INS_BNEZ = 281 +MIPS_INS_B = 282 +MIPS_INS_NOP = 283 +MIPS_INS_MOVE = 284 +MIPS_INS_NEGU = 285 +MIPS_INS_NOT = 286 + +# Invalid Instruction Unique ID +MIPS_INS_INVALID = -1 + +# Op IDs +# MIPS_OP_RS = 0 +# MIPS_OP_RT = 0 +# MIPS_OP_RD = 0 +# MIPS_OP_IMM = 0 + +# Instruction Groups + +MIPS_BRANCH_LIKELY_INSNS = [ + MIPS_INS_BEQL, MIPS_INS_BGEZALL, + MIPS_INS_BGEZL, MIPS_INS_BGTZL, + MIPS_INS_BLEZL, MIPS_INS_BLTZALL, + MIPS_INS_BLTZL, MIPS_INS_BNEL, + MIPS_INS_BC1TL, MIPS_INS_BC1FL, +] + +MIPS_BRANCH_INSNS = [ + *MIPS_BRANCH_LIKELY_INSNS, + + MIPS_INS_BEQ, + MIPS_INS_BGEZ, MIPS_INS_BGEZAL, + MIPS_INS_BGTZ, + MIPS_INS_BNE, + MIPS_INS_BLTZ, MIPS_INS_BLTZAL, + MIPS_INS_BLEZ, + MIPS_INS_BC1T, MIPS_INS_BC1F, + + MIPS_INS_BEQZ, + MIPS_INS_BNEZ, + MIPS_INS_B, +] + +MIPS_JUMP_INSNS = [ + MIPS_INS_JAL, MIPS_INS_JALR, MIPS_INS_J, MIPS_INS_JR +] + +MIPS_DELAY_SLOT_INSNS = [ + *MIPS_BRANCH_INSNS, *MIPS_JUMP_INSNS +] + +MIPS_FP_LOAD_INSNS = [ + MIPS_INS_LWC1, MIPS_INS_LDC1 +] + +MIPS_LOAD_INSNS = [ + MIPS_INS_LB, MIPS_INS_LBU, + MIPS_INS_LH, MIPS_INS_LHU, + MIPS_INS_LW, MIPS_INS_LWL, MIPS_INS_LWR, MIPS_INS_LWU, + MIPS_INS_LD, MIPS_INS_LDL, MIPS_INS_LDR, + MIPS_INS_LL, MIPS_INS_LLD, + *MIPS_FP_LOAD_INSNS +] + +MIPS_FP_STORE_INSNS = [ + MIPS_INS_SWC1, MIPS_INS_SDC1 +] + +MIPS_STORE_INSNS = [ + MIPS_INS_SB, + MIPS_INS_SH, + MIPS_INS_SW, MIPS_INS_SWL, MIPS_INS_SWR, + MIPS_INS_SD, MIPS_INS_SDL, MIPS_INS_SDR, + MIPS_INS_SC, MIPS_INS_SCD, + *MIPS_FP_STORE_INSNS +] + +MIPS_LOAD_STORE_INSNS = [ + *MIPS_LOAD_INSNS, + *MIPS_STORE_INSNS, +] + +MIPS_FP_LOAD_STORE_INSNS = [ + *MIPS_FP_LOAD_INSNS, *MIPS_FP_STORE_INSNS +] + +RSP_VECTOR_LOAD_STORES = [ + MIPS_INS_LBV, MIPS_INS_LSV, MIPS_INS_LLV, MIPS_INS_LDV, + MIPS_INS_LQV, MIPS_INS_LRV, MIPS_INS_LPV, MIPS_INS_LUV, + MIPS_INS_LHV, MIPS_INS_LFV, MIPS_INS_LTV, + + MIPS_INS_SBV, MIPS_INS_SSV, MIPS_INS_SLV, MIPS_INS_SDV, + MIPS_INS_SQV, MIPS_INS_SRV, MIPS_INS_SPV, MIPS_INS_SUV, + MIPS_INS_SHV, MIPS_INS_SFV, MIPS_INS_SWV, MIPS_INS_STV, +] + +# Labels + +# These labels can be referenced from pointers/loads/stores/etc. +LABEL_TYPE_FUNC = 0 +LABEL_TYPE_JTBL = 1 +LABEL_TYPE_DATA = 2 +LABEL_TYPE_BRANCH = 3 + +# Unknown +LABEL_TYPE_UNK = 20 + +class MipsLabel: + """ + Label + """ + + def __init__(self, vaddr, name=None, lbl_type=LABEL_TYPE_UNK, is_global=None) -> None: + self.name = name + self.vaddr = vaddr + self.lbl_type = lbl_type + self.is_global = is_global or (False if (lbl_type == LABEL_TYPE_BRANCH) else True) + + def __str__(self): + if self.name is not None: + return self.name + + if self.lbl_type == LABEL_TYPE_FUNC: + return f"func_{self.vaddr:08X}" + elif self.lbl_type == LABEL_TYPE_JTBL: + return f"jtbl_{self.vaddr:08X}" + elif self.lbl_type == LABEL_TYPE_BRANCH: + return f".L{self.vaddr:08X}" + elif (self.lbl_type == LABEL_TYPE_DATA or self.lbl_type == LABEL_TYPE_UNK): + return f"D_{self.vaddr:08X}" + assert False , f"Unimplemented default name for label type {self.lbl_type}" + +# Register Names + +mips_gpr_names = ( + "$zero", + "$at", + "$v0", "$v1", + "$a0", "$a1", "$a2", "$a3", + "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", + "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7", + "$t8", "$t9", + "$k0", "$k1", + "$gp", + "$sp", + "$fp", + "$ra", +) + +rsp_gpr_names = ( + "$zero", + "$1", "$2", "$3", "$4", "$5", "$6", + "$7", "$8", "$9", "$10", "$11", "$12", + "$13", "$14", "$15", "$16", "$17", "$18", + "$19", "$20", "$21", "$22", "$23", "$24", + "$25", "$26", "$27", "$28", "$29", "$30", + "$ra", +) + +mips_cop0_names = ( + "Index" , "Random" , "EntryLo0" , "EntryLo1" , + "Context" , "PageMask" , "Wired" , "Reserved07", + "BadVaddr" , "Count" , "EntryHi" , "Compare" , + "Status" , "Cause" , "EPC" , "PRevID" , + "Config" , "LLAddr" , "WatchLo" , "WatchHi" , + "XContext" , "Reserved21", "Reserved22", "Reserved23", + "Reserved24", "Reserved25", "PErr" , "CacheErr" , + "TagLo" , "TagHi" , "ErrorEPC" , "Reserved31", +) + +rsp_cop0_names = ( + "SP_MEM_ADDR", "SP_DRAM_ADDR", "SP_RD_LEN" , "SP_WR_LEN" , + "SP_STATUS" , "SP_DMA_FULL" , "SP_DMA_BUSY" , "SP_SEMAPHORE", + "DPC_START" , "DPC_END" , "DPC_CURRENT" , "DPC_STATUS" , + "DPC_CLOCK" , "DPC_BUFBUSY" , "DPC_PIPEBUSY", "DPC_TMEM" , +) + +mips_cop1_names = ( + "$f0", "$f1", "$f2", "$f3", + "$f4", "$f5", "$f6", "$f7", "$f8", "$f9", "$f10", "$f11", + "$f12", "$f13", "$f14", "$f15", + "$f16", "$f17", "$f18", "$f19", + "$f20", "$f21", "$f22", "$f23", "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", + # Status register + "FpCsr", +) + +rsp_cop2_names = ( + "$v0", "$v1", "$v2", "$v3", "$v4", "$v5", "$v6", "$v7", + "$v8", "$v9", "$v10", "$v11", "$v12", "$v13", "$v14", "$v15", + "$v16", "$v17", "$v18", "$v19", "$v20", "$v21", "$v22", "$v23", + "$v24", "$v25", "$v26", "$v27", "$v28", "$v29", "$v30", "$v31", +) + +rsp_cop2_ctrl_names = ( + '$vco', '$vcc', '$vce' +) + +# Instruction sets + +class MipsAbi: + def __init__(self, name, gpr_names, cop0_names, cop1_names, cop2_names): + self.name = name + self.gpr_names, self.cop0_names, self.cop1_names, self.cop2_names = \ + gpr_names, cop0_names, cop1_names, cop2_names + +ABI_VR4300 = MipsAbi("VR4300", mips_gpr_names, mips_cop0_names, mips_cop1_names, None ) +ABI_RSP = MipsAbi("RSP", rsp_gpr_names, rsp_cop0_names, None, rsp_cop2_names) + +# Instruction field fetching + +def sign_extend_6(value): + if value & (1 << (6 - 1)): + return value - (1 << 6) + return value + +def sign_extend_16(value): + return (value & 0x7FFF) - (value & 0x8000) + +def mask_shift(v, s, w): + return (v >> s) & ((1 << w) - 1) + +mips_get_field = lambda raw,vaddr : mask_shift(raw, 26, 6) +mips_get_special = lambda raw,vaddr : mask_shift(raw, 0, 6) +mips_get_cop0 = lambda raw,vaddr : mask_shift(raw, 21, 5) +mips_get_cop1 = lambda raw,vaddr : mask_shift(raw, 21, 5) +mips_get_cop2 = lambda raw,vaddr : mask_shift(raw, 21, 4) +mips_get_regimm = lambda raw,vaddr : mask_shift(raw, 16, 5) +mips_get_tlb = lambda raw,vaddr : mask_shift(raw, 0, 5) +mips_get_function = lambda raw,vaddr : mask_shift(raw, 0, 6) + +mips_get_cond = lambda raw,vaddr : mask_shift(raw, 0, 4) +mips_get_fd = lambda raw,vaddr : MipsFPReg(mask_shift(raw, 6, 5)) +mips_get_fs = lambda raw,vaddr : MipsFPReg(mask_shift(raw, 11, 5)) +mips_get_ft = lambda raw,vaddr : MipsFPReg(mask_shift(raw, 16, 5)) +mips_get_fmt = lambda raw,vaddr : mask_shift(raw, 21, 5) +mips_get_ndtf = lambda raw,vaddr : mask_shift(raw, 16, 2) + +mips_get_target = lambda raw,vaddr : ((vaddr & 0xFC000000) | (mask_shift(raw, 0, 26) << 2)) +mips_get_offset = lambda raw,vaddr : vaddr + 4 + sign_extend_16(mask_shift(raw, 0, 16)) * 4 +mips_get_imm = lambda raw,vaddr : mask_shift(raw, 0, 16) + +mips_get_base = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 21, 5)) + +mips_get_cd = lambda raw,vaddr : mask_shift(raw, 11, 5) + +mips_get_code = lambda raw,vaddr : (mask_shift(raw, 6, 20) << 6) >> 16 +mips_get_op = lambda raw,vaddr : mask_shift(raw, 16, 5) + +mips_get_sa = lambda raw,vaddr : mask_shift(raw, 6, 5) + +mips_get_rd = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 11, 5)) +mips_get_rs = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 21, 5)) +mips_get_rt = lambda raw,vaddr : MipsGPReg(mask_shift(raw, 16, 5)) + +rsp_load_store_multiplier = { + 0b00000 : 0x01, # lbv, sbv + 0b00001 : 0x02, # lsv, ssv + 0b00010 : 0x04, # llv, slv + 0b00011 : 0x08, # ldv, sdv + 0b00100 : 0x10, # lqv, sqv + 0b00101 : 0x10, # lrv, srv + 0b00110 : 0x08, # lpv, spv + 0b00111 : 0x08, # luv, suv + + 0b01000 : 0x02, # lhv, shv + 0b01001 : 0x04, # lfv, sfv + 0b01010 : 0x10, # swv + 0b01011 : 0x10, # ltv, stv +} + +mips_get_vc = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_vd = lambda raw,vaddr : mask_shift(raw, 6, 5) +mips_get_vs = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_vt = lambda raw,vaddr : mask_shift(raw, 16, 5) +mips_get_elem = lambda raw,vaddr : mask_shift(raw, 21, 4) +mips_get_elemd = lambda raw,vaddr : mask_shift(raw, 7, 4) +mips_get_cop2_func = lambda raw,vaddr : mask_shift(raw, 25, 1) +mips_get_lwc2 = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_swc2 = lambda raw,vaddr : mask_shift(raw, 11, 5) +mips_get_voffset = lambda raw,vaddr : sign_extend_6(mask_shift(raw, 0, 6)) * rsp_load_store_multiplier[mips_get_lwc2(raw,vaddr)] + +# Formatting + +def resolve_pseudo_insn(insn): + # move varies between assemblers + # IDO + move_insn = MIPS_INS_OR + # GCC + # move_insn = MIPS_INS_ADDU + + if insn.id == MIPS_INS_SLL and insn.rd == MipsGPReg.R0 and insn.rt == MipsGPReg.R0 and insn.sa == 0: + return MIPS_INS_NOP, "nop", (), () + elif insn.id == MIPS_INS_BEQ and insn.rs == MipsGPReg.R0 and insn.rt == MipsGPReg.R0: + return MIPS_INS_B, "b", ("offset",), (False,) + elif insn.id == move_insn and insn.rt == MipsGPReg.R0: + return MIPS_INS_MOVE, "move", ("rd","rs"), (True,False) + elif insn.id == MIPS_INS_BEQ and insn.rt == MipsGPReg.R0: + return MIPS_INS_BEQZ, "beqz", ("rs","offset"), (False,False) + elif insn.id == MIPS_INS_BNE and insn.rt == MipsGPReg.R0: + return MIPS_INS_BNEZ, "bnez", ("rs","offset"), (False,False) + elif insn.id == MIPS_INS_SUBU and insn.rs == MipsGPReg.R0: + return MIPS_INS_NEGU, "negu", ("rd","rt"), (True,False) + elif insn.id == MIPS_INS_NOR and insn.rt == MipsGPReg.R0: + return MIPS_INS_NOT, "not", ("rd","rs"), (True,False) + else: + return insn.id, insn.mnemonic, insn.fields, insn.writes + +def format_hex(v, signed, zeros, no_zero): + if abs(v) < 10: + if v == 0 and no_zero: + return "" + return f"{v}" + elif not signed: + return f"0x{v:{f'0{zeros}' if zeros > 0 else ''}x}" + else: + return f"{v:#x}" + +def format_vector_elem(insn, elem): + if insn.id in RSP_VECTOR_LOAD_STORES: + return f"[{elem}]" + elif (elem & 8) == 8: + return f"[{elem & 7}]" + elif (elem & 0xC) == 4: + return f"[{elem & 3}h]" + elif (elem & 0xE) == 2: + return f"[{elem & 1}q]" + else: + return "" + +mips_field_formatters = { + 'code' : (lambda insn : f'{insn.code}' if insn.code != 0 else ''), + 'cd' : (lambda insn : insn.abi.cop0_names[insn.cd]), + 'rd' : (lambda insn : insn.abi.gpr_names[insn.rd]), + 'rs' : (lambda insn : insn.abi.gpr_names[insn.rs]), + 'rt' : (lambda insn : insn.abi.gpr_names[insn.rt]), + 'fd' : (lambda insn : insn.abi.cop1_names[insn.fd]), + 'fs' : (lambda insn : insn.abi.cop1_names[insn.fs]), + 'ft' : (lambda insn : insn.abi.cop1_names[insn.ft]), + 'sa' : (lambda insn : format_hex(insn.sa, True, 0, False)), + 'op' : (lambda insn : format_hex(insn.op, False, 0, False)), + 'imm' : (lambda insn : format_hex(insn.imm, True, 0, False)), + 'offset(base)' : (lambda insn : f'{format_hex(insn.imm, True, 0, True)}({insn.abi.gpr_names[insn.base]})'), + 'offset' : (lambda insn : f'{format_hex(insn.offset, True, 0, False)}'), + 'target' : (lambda insn : f'{format_hex(insn.target, False, 0, False)}'), + 'vd' : (lambda insn : insn.abi.cop2_names[insn.vd]), + 'vs' : (lambda insn : insn.abi.cop2_names[insn.vs]), + 'vt' : (lambda insn : insn.abi.cop2_names[insn.vt]), + 'vt[e]' : (lambda insn : f"{insn.abi.cop2_names[insn.vt]}{format_vector_elem(insn, insn.elem)}"), + 'vt[ed]' : (lambda insn : f"{insn.abi.cop2_names[insn.vt]}{format_vector_elem(insn, insn.elemd)}"), + 'vd[e]' : (lambda insn : f"{insn.abi.cop2_names[insn.vd]}{format_vector_elem(insn, insn.elem)}"), + 'vd[ed]' : (lambda insn : f"{insn.abi.cop2_names[insn.vd]}{format_vector_elem(insn, insn.elemd)}"), + 'voffset' : (lambda insn : f'{format_hex(insn.voffset, True, 0, False)}'), + 'voffset(base)' : (lambda insn : f'{format_hex(insn.voffset, True, 0, True)}({insn.abi.gpr_names[insn.base]})'), + 'vc' : (lambda insn : rsp_cop2_ctrl_names[insn.vc]) +} + +class MipsInsn: + + def __init__(self, abi, raw, vaddr, values): + self.abi = abi + self.raw = raw + self.vaddr = vaddr + + if values is None: + values = MIPS_INS_INVALID, f"/* Invalid Instruction */ .4byte 0x{raw:08X}", (), () + + self.id, self.mnemonic, self.fields, self.writes = values + + # self.code = self.sa = self.op = self.cd = self.rd = self.rs = self.rt = self.fd = self.fs = self.ft = self.imm = self.offset = self.base = self.target = None + + for field in self.fields: + self.set_value(field) + + self.id, self.mnemonic, self.fields, self.writes = resolve_pseudo_insn(self) + + self.op_str = self.format_insn() + + def read_fields(self): + return [field for i,field in enumerate(self.fields) if self.writes[i] == False] + + def write_fields(self): + return [field for i,field in enumerate(self.fields) if self.writes[i] == True] + + def has_field(self, field): + return field in self.fields + + def format_field(self, field): + return mips_field_formatters[field](self) + + def format_insn(self): + return ", ".join([self.format_field(field) for field in self.fields]) + + def __str__(self): + return f"{self.mnemonic:12}{self.op_str}" + + # Field setters + + def set_code(self): + self.code = mips_get_code(self.raw, self.vaddr) + + def set_sa(self): + self.sa = mips_get_sa(self.raw, self.vaddr) + + def set_op(self): + self.op = mips_get_op(self.raw, self.vaddr) + + def set_cd(self): + self.cd = mips_get_cd(self.raw, self.vaddr) + + def set_rd(self): + self.rd = mips_get_rd(self.raw, self.vaddr) + + def set_rs(self): + self.rs = mips_get_rs(self.raw, self.vaddr) + + def set_rt(self): + self.rt = mips_get_rt(self.raw, self.vaddr) + + def set_fd(self): + self.fd = mips_get_fd(self.raw, self.vaddr) + + def set_fs(self): + self.fs = mips_get_fs(self.raw, self.vaddr) + + def set_ft(self): + self.ft = mips_get_ft(self.raw, self.vaddr) + + do_sign_extend = [ + MIPS_INS_ADDIU, MIPS_INS_SLTI, MIPS_INS_ADDI, MIPS_INS_DADDIU, + MIPS_INS_LB, MIPS_INS_LBU, + MIPS_INS_LH, MIPS_INS_LHU, + MIPS_INS_LW, MIPS_INS_LWL, MIPS_INS_LWR, MIPS_INS_LWU, + MIPS_INS_LWC1, + MIPS_INS_LD, MIPS_INS_LDL, MIPS_INS_LDR, + MIPS_INS_LDC1, + MIPS_INS_LL, MIPS_INS_LLD, + MIPS_INS_SB, + MIPS_INS_SH, + MIPS_INS_SW, MIPS_INS_SWL, MIPS_INS_SWR, + MIPS_INS_SWC1, + MIPS_INS_SD, MIPS_INS_SDL, MIPS_INS_SDR, + MIPS_INS_SDC1, + MIPS_INS_SC, MIPS_INS_SCD, + ] + + def set_imm(self): + self.imm = mips_get_imm(self.raw, self.vaddr) + if self.id in MipsInsn.do_sign_extend: # sign extended immediates + self.imm = sign_extend_16(self.imm) + + def set_offset(self): + self.offset = mips_get_offset(self.raw, self.vaddr) + + def set_base(self): + self.base = mips_get_base(self.raw, self.vaddr) + + def set_offset_base(self): + self.set_imm() + self.set_base() + + def set_target(self): + self.target = mips_get_target(self.raw, self.vaddr) + + def set_vd(self): + self.vd = mips_get_vd(self.raw, self.vaddr) + + def set_vs(self): + self.vs = mips_get_vs(self.raw, self.vaddr) + + def set_vt(self): + self.vt = mips_get_vt(self.raw, self.vaddr) + + def set_e(self): + self.elem = mips_get_elem(self.raw, self.vaddr) + + def set_ed(self): + self.elemd = mips_get_elemd(self.raw, self.vaddr) + + def set_vd_e(self): + self.set_vd() + self.set_e() + + def set_vt_ed(self): + self.set_vt() + self.set_ed() + + def set_vt_e(self): + self.set_vt() + self.set_e() + + def set_vd_ed(self): + self.set_vd() + self.set_ed() + + def set_voffset(self): + self.voffset = mips_get_voffset(self.raw, self.vaddr) + + def set_voffset_base(self): + self.set_voffset() + self.set_base() + + def set_vc(self): + self.vc = mips_get_vc(self.raw, self.vaddr) + + field_setters = { + 'code' : set_code, + 'sa' : set_sa, + 'op' : set_op, + 'cd' : set_cd, + 'rd' : set_rd, + 'rs' : set_rs, + 'rt' : set_rt, + 'fd' : set_fd, + 'fs' : set_fs, + 'ft' : set_ft, + 'imm' : set_imm, + 'offset' : set_offset, + 'base' : set_base, + 'offset(base)' : set_offset_base, + 'target' : set_target, + 'vd' : set_vd, + 'vs' : set_vs, + 'vt' : set_vt, + 'vt[e]' : set_vt_e, + 'vt[ed]' : set_vt_ed, + 'vd[e]' : set_vd_e, + 'vd[ed]' : set_vd_ed, + 'voffset' : set_voffset, + 'voffset(base)' : set_voffset_base, + 'vc' : set_vc + } + + def set_value(self, name): + MipsInsn.field_setters[name](self) + + # Field getters + + field_getters = { + 'code' : (lambda insn: insn.code), + 'sa' : (lambda insn: insn.sa), + 'op' : (lambda insn: insn.op), + 'cd' : (lambda insn: insn.cd), + 'rd' : (lambda insn: insn.rd), + 'rs' : (lambda insn: insn.rs), + 'rt' : (lambda insn: insn.rt), + 'fd' : (lambda insn: insn.fd), + 'fs' : (lambda insn: insn.fs), + 'ft' : (lambda insn: insn.ft), + 'imm' : (lambda insn: insn.imm), + 'offset' : (lambda insn: insn.offset), + 'base' : (lambda insn: insn.base), + 'offset(base)' : (lambda insn: (insn.offset, insn.base)), + 'target' : (lambda insn: insn.target), + 'vd' : (lambda insn: insn.vd), + 'vs' : (lambda insn: insn.vs), + 'vt' : (lambda insn: insn.vt), + 'vt[e]' : (lambda insn: (insn.vt, insn.elem)), + 'vt[ed]' : (lambda insn: (insn.vt, insn.elemd)), + 'vd[e]' : (lambda insn: (insn.vd, insn.elem)), + 'vd[ed]' : (lambda insn: (insn.vd, insn.elemd)), + 'voffset' : (lambda insn: insn.voffset), + 'voffset(base)' : (lambda insn: (insn.voffset, insn.base)), + 'vc' : (lambda insn: insn.vc), + } + + def value_forname(self, name): + return MipsInsn.field_getters[name](self) + +def fetch_insn(raw, vaddr, insn_set, func): + insn = insn_set.get(func(raw, vaddr), None) # default none for invalid instruction encoding + + if insn is not None and type(insn[1]) == dict: # extra decoding required + insn = fetch_insn(raw, vaddr, insn[1], insn[0]) + return insn + +def decode_insn(raw, vaddr): + return MipsInsn(ABI_VR4300, raw, vaddr, fetch_insn(raw, vaddr, mips_insns, mips_get_field)) + +def decode_rsp_insn(raw, vaddr): + return MipsInsn(ABI_RSP, raw, vaddr, fetch_insn(raw, vaddr, rsp_insns, mips_get_field)) + +mips_insns = { + 0b000000: (mips_get_special, { + # opcode id mnemonic fields field is written to + 0b000000: (MIPS_INS_SLL, "sll", ("rd","rt","sa"), (True , False, False)), + 0b000010: (MIPS_INS_SRL, "srl", ("rd","rt","sa"), (True , False, False)), + 0b000011: (MIPS_INS_SRA, "sra", ("rd","rt","sa"), (True , False, False)), + 0b000100: (MIPS_INS_SLLV, "sllv", ("rd","rt","rs"), (True , False, False)), + 0b000110: (MIPS_INS_SRLV, "srlv", ("rd","rt","rs"), (True , False, False)), + 0b000111: (MIPS_INS_SRAV, "srav", ("rd","rt","rs"), (True , False, False)), + 0b001000: (MIPS_INS_JR, "jr", ("rs", ), (False, )), + 0b001001: (MIPS_INS_JALR, "jalr", ("rs", ), (False, )), # technically also rd but it's always $ra + 0b001100: (MIPS_INS_SYSCALL, "syscall", ( ), ( )), + 0b001101: (MIPS_INS_BREAK, "break", ("code", ), (False, )), + 0b001111: (MIPS_INS_SYNC, "sync", ( ), ( )), + 0b010000: (MIPS_INS_MFHI, "mfhi", ("rd", ), (True , )), + 0b010001: (MIPS_INS_MTHI, "mthi", ("rs", ), (False, )), + 0b010010: (MIPS_INS_MFLO, "mflo", ("rd", ), (True , )), + 0b010011: (MIPS_INS_MTLO, "mtlo", ("rs", ), (False, )), + 0b010100: (MIPS_INS_DSLLV, "dsllv", ("rd","rt","rs"), (True , False, False)), + 0b010110: (MIPS_INS_DSRLV, "dsrlv", ("rd","rt","rs"), (True , False, False)), + 0b010111: (MIPS_INS_DSRAV, "dsrav", ("rd","rt","rs"), (True , False, False)), + 0b011000: (MIPS_INS_MULT, "mult", ("rs","rt" ), (False, False )), + 0b011001: (MIPS_INS_MULTU, "multu", ("rs","rt" ), (False, False )), + 0b011010: (MIPS_INS_DIV, "div", ("rd","rs","rt"), (False, False, False)), # for some reason gas hates div instructions + 0b011011: (MIPS_INS_DIVU, "divu", ("rd","rs","rt"), (False, False, False)), # with the correct number of operands + 0b011100: (MIPS_INS_DMULT, "dmult", ("rs","rt" ), (False, False )), + 0b011101: (MIPS_INS_DMULTU, "dmultu", ("rs","rt" ), (False, False )), + 0b011110: (MIPS_INS_DDIV, "ddiv", ("rd","rs","rt"), (False, False, False)), + 0b011111: (MIPS_INS_DDIVU, "ddivu", ("rd","rs","rt"), (False, False, False)), + 0b100000: (MIPS_INS_ADD, "add", ("rd","rs","rt"), (True , False, False)), + 0b100001: (MIPS_INS_ADDU, "addu", ("rd","rs","rt"), (True , False, False)), + 0b100010: (MIPS_INS_SUB, "sub", ("rd","rs","rt"), (True , False, False)), + 0b100011: (MIPS_INS_SUBU, "subu", ("rd","rs","rt"), (True , False, False)), + 0b100100: (MIPS_INS_AND, "and", ("rd","rs","rt"), (True , False, False)), + 0b100101: (MIPS_INS_OR, "or", ("rd","rs","rt"), (True , False, False)), + 0b100110: (MIPS_INS_XOR, "xor", ("rd","rs","rt"), (True , False, False)), + 0b100111: (MIPS_INS_NOR, "nor", ("rd","rs","rt"), (True , False, False)), + 0b101010: (MIPS_INS_SLT, "slt", ("rd","rs","rt"), (True , False, False)), + 0b101011: (MIPS_INS_SLTU, "sltu", ("rd","rs","rt"), (True , False, False)), + 0b101100: (MIPS_INS_DADD, "dadd", ("rd","rs","rt"), (True , False, False)), + 0b101101: (MIPS_INS_DADDU, "daddu", ("rd","rs","rt"), (True , False, False)), + 0b101110: (MIPS_INS_DSUB, "dsub", ("rd","rs","rt"), (True , False, False)), + 0b101111: (MIPS_INS_DSUBU, "dsubu", ("rd","rs","rt"), (True , False, False)), + 0b110000: (MIPS_INS_TGE, "tge", ("rs","rt" ), (False, False )), + 0b110001: (MIPS_INS_TGEU, "tgeu", ("rs","rt" ), (False, False )), + 0b110010: (MIPS_INS_TLT, "tlt", ("rs","rt" ), (False, False )), + 0b110011: (MIPS_INS_TLTU, "tltu", ("rs","rt" ), (False, False )), + 0b110100: (MIPS_INS_TEQ, "teq", ("rs","rt" ), (False, False )), + 0b110110: (MIPS_INS_TNE, "tne", ("rs","rt" ), (False, False )), + 0b111000: (MIPS_INS_DSLL, "dsll", ("rd","rt","sa"), (True , False, False)), + 0b111010: (MIPS_INS_DSRL, "dsrl", ("rd","rt","sa"), (True , False, False)), + 0b111011: (MIPS_INS_DSRA, "dsra", ("rd","rt","sa"), (True , False, False)), + 0b111100: (MIPS_INS_DSLL32, "dsll32", ("rd","rt","sa"), (True , False, False)), + 0b111110: (MIPS_INS_DSRL32, "dsrl32", ("rd","rt","sa"), (True , False, False)), + 0b111111: (MIPS_INS_DSRA32, "dsra32", ("rd","rt","sa"), (True , False, False)), + }), + 0b000001: (mips_get_regimm, { + 0b00000: (MIPS_INS_BLTZ, "bltz", ("rs","offset"), (False, False)), + 0b00001: (MIPS_INS_BGEZ, "bgez", ("rs","offset"), (False, False)), + 0b00010: (MIPS_INS_BLTZL, "bltzl", ("rs","offset"), (False, False)), + 0b00011: (MIPS_INS_BGEZL, "bgezl", ("rs","offset"), (False, False)), + 0b01000: (MIPS_INS_TGEI, "tgei", ("rs","imm" ), (False, False)), + 0b01001: (MIPS_INS_TGEIU, "tgeiu", ("rs","imm" ), (False, False)), + 0b01010: (MIPS_INS_TLTI, "tlti", ("rs","imm" ), (False, False)), + 0b01011: (MIPS_INS_TLTIU, "tltiu", ("rs","imm" ), (False, False)), + 0b01100: (MIPS_INS_TEQI, "teqi", ("rs","imm" ), (False, False)), + 0b01110: (MIPS_INS_TNEI, "tnei", ("rs","imm" ), (False, False)), + 0b10000: (MIPS_INS_BLTZAL, "bltzal", ("rs","offset"), (False, False)), + 0b10001: (MIPS_INS_BGEZAL, "bgezal", ("rs","offset"), (False, False)), + 0b10010: (MIPS_INS_BLTZALL, "bltzall", ("rs","offset"), (False, False)), + 0b10011: (MIPS_INS_BGEZALL, "bgezall", ("rs","offset"), (False, False)), + }), + 0b000010: (MIPS_INS_J, "j", ("target", ), (False, )), + 0b000011: (MIPS_INS_JAL, "jal", ("target", ), (False, )), + 0b000100: (MIPS_INS_BEQ, "beq", ("rs","rt","offset"), (False, False, False)), + 0b000101: (MIPS_INS_BNE, "bne", ("rs","rt","offset"), (False, False, False)), + 0b000110: (MIPS_INS_BLEZ, "blez", ("rs","offset" ), (False, False, )), + 0b000111: (MIPS_INS_BGTZ, "bgtz", ("rs","offset" ), (False, False, )), + 0b001000: (MIPS_INS_ADDI, "addi", ("rt","rs","imm" ), (True , False, False)), + 0b001001: (MIPS_INS_ADDIU, "addiu", ("rt","rs","imm" ), (True , False, False)), + 0b001010: (MIPS_INS_SLTI, "slti", ("rt","rs","imm" ), (True , False, False)), + 0b001011: (MIPS_INS_SLTIU, "sltiu", ("rt","rs","imm" ), (True , False, False)), + 0b001100: (MIPS_INS_ANDI, "andi", ("rt","rs","imm" ), (True , False, False)), + 0b001101: (MIPS_INS_ORI, "ori", ("rt","rs","imm" ), (True , False, False)), + 0b001110: (MIPS_INS_XORI, "xori", ("rt","rs","imm" ), (True , False, False)), + 0b001111: (MIPS_INS_LUI, "lui", ("rt","imm" ), (True , False )), + 0b010000: (mips_get_cop0, { + 0b00000: (MIPS_INS_MFC0, "mfc0", ("rt","cd"), (True , False)), + 0b00100: (MIPS_INS_MTC0, "mtc0", ("rt","cd"), (False, True )), + 0b10000: (mips_get_tlb, { + 0b000001: (MIPS_INS_TLBR, "tlbr", (), ()), + 0b000010: (MIPS_INS_TLBWI, "tlbwi", (), ()), + 0b000110: (MIPS_INS_TLBWR, "tlbwr", (), ()), + 0b001000: (MIPS_INS_TLBP, "tlbp", (), ()), + 0b011000: (MIPS_INS_ERET, "eret", (), ()), + }), + }), + 0b010001: (mips_get_cop1, { + 0b00000: (MIPS_INS_MFC1, "mfc1", ("rt","fs"), (True , False)), + 0b00001: (MIPS_INS_DMFC1, "dmfc1", ("rt","fs"), (True , False)), + 0b00010: (MIPS_INS_CFC1, "cfc1", ("rt","fs"), (True , False)), + 0b00100: (MIPS_INS_MTC1, "mtc1", ("rt","fs"), (False, True )), + 0b00101: (MIPS_INS_DMTC1, "dmtc1", ("rt","fs"), (False, True )), + 0b00110: (MIPS_INS_CTC1, "ctc1", ("rt","fs"), (False, True )), + 0b01000: (mips_get_ndtf, { + 0b00: (MIPS_INS_BC1F, "bc1f", ("offset",), (False,)), + 0b01: (MIPS_INS_BC1T, "bc1t", ("offset",), (False,)), + 0b10: (MIPS_INS_BC1FL, "bc1fl", ("offset",), (False,)), + 0b11: (MIPS_INS_BC1TL, "bc1tl", ("offset",), (False,)), + }), + 0b010000: (mips_get_function, { + 0b000000: (MIPS_INS_ADD_S, "add.s", ("fd","fs","ft"), (True , False, False)), + 0b000001: (MIPS_INS_SUB_S, "sub.s", ("fd","fs","ft"), (True , False, False)), + 0b000010: (MIPS_INS_MUL_S, "mul.s", ("fd","fs","ft"), (True , False, False)), + 0b000011: (MIPS_INS_DIV_S, "div.s", ("fd","fs","ft"), (True , False, False)), + 0b000100: (MIPS_INS_SQRT_S, "sqrt.s", ("fd","fs" ), (True , False )), + 0b000101: (MIPS_INS_ABS_S, "abs.s", ("fd","fs" ), (True , False )), + 0b000110: (MIPS_INS_MOV_S, "mov.s", ("fd","fs" ), (True , False )), + 0b000111: (MIPS_INS_NEG_S, "neg.s", ("fd","fs" ), (True , False )), + 0b001000: (MIPS_INS_ROUND_L_S, "round.l.s", ("fd","fs" ), (True , False )), + 0b001001: (MIPS_INS_TRUNC_L_S, "trunc.l.s", ("fd","fs" ), (True , False )), + 0b001010: (MIPS_INS_CEIL_L_S, "ceil.l.s", ("fd","fs" ), (True , False )), + 0b001011: (MIPS_INS_FLOOR_L_S, "floor.l.s", ("fd","fs" ), (True , False )), + 0b001100: (MIPS_INS_ROUND_W_S, "round.w.s", ("fd","fs" ), (True , False )), + 0b001101: (MIPS_INS_TRUNC_W_S, "trunc.w.s", ("fd","fs" ), (True , False )), + 0b001110: (MIPS_INS_CEIL_W_S, "ceil.w.s", ("fd","fs" ), (True , False )), + 0b001111: (MIPS_INS_FLOOR_W_S, "floor.w.s", ("fd","fs" ), (True , False )), + 0b100001: (MIPS_INS_CVT_D_S, "cvt.d.s", ("fd","fs" ), (True , False )), + 0b100100: (MIPS_INS_CVT_W_S, "cvt.w.s", ("fd","fs" ), (True , False )), + 0b100101: (MIPS_INS_CVT_L_S, "cvt.l.s", ("fd","fs" ), (True , False )), + 0b110000: (MIPS_INS_C_F_S, "c.f.s", ("fs","ft" ), (False, False )), + 0b110001: (MIPS_INS_C_UN_S, "c.un.s", ("fs","ft" ), (False, False )), + 0b110010: (MIPS_INS_C_EQ_S, "c.eq.s", ("fs","ft" ), (False, False )), + 0b110011: (MIPS_INS_C_UEQ_S, "c.ueq.s", ("fs","ft" ), (False, False )), + 0b110100: (MIPS_INS_C_OLT_S, "c.olt.s", ("fs","ft" ), (False, False )), + 0b110101: (MIPS_INS_C_ULT_S, "c.ult.s", ("fs","ft" ), (False, False )), + 0b110110: (MIPS_INS_C_OLE_S, "c.ole.s", ("fs","ft" ), (False, False )), + 0b110111: (MIPS_INS_C_ULE_S, "c.ule.s", ("fs","ft" ), (False, False )), + 0b111000: (MIPS_INS_C_SF_S, "c.sf.s", ("fs","ft" ), (False, False )), + 0b111001: (MIPS_INS_C_NGLE_S, "c.ngle.s", ("fs","ft" ), (False, False )), + 0b111010: (MIPS_INS_C_SEQ_S, "c.seq.s", ("fs","ft" ), (False, False )), + 0b111011: (MIPS_INS_C_NGL_S, "c.ngl.s", ("fs","ft" ), (False, False )), + 0b111100: (MIPS_INS_C_LT_S, "c.lt.s", ("fs","ft" ), (False, False )), + 0b111101: (MIPS_INS_C_NGE_S, "c.nge.s", ("fs","ft" ), (False, False )), + 0b111110: (MIPS_INS_C_LE_S, "c.le.s", ("fs","ft" ), (False, False )), + 0b111111: (MIPS_INS_C_NGT_S, "c.ngt.s", ("fs","ft" ), (False, False )), + }), + 0b010001: (mips_get_function, { + 0b000000: (MIPS_INS_ADD_D, "add.d", ("fd","fs","ft"), (True , False, False)), + 0b000001: (MIPS_INS_SUB_D, "sub.d", ("fd","fs","ft"), (True , False, False)), + 0b000010: (MIPS_INS_MUL_D, "mul.d", ("fd","fs","ft"), (True , False, False)), + 0b000011: (MIPS_INS_DIV_D, "div.d", ("fd","fs","ft"), (True , False, False)), + 0b000100: (MIPS_INS_SQRT_D, "sqrt.d", ("fd","fs" ), (True , False )), + 0b000101: (MIPS_INS_ABS_D, "abs.d", ("fd","fs" ), (True , False )), + 0b000110: (MIPS_INS_MOV_D, "mov.d", ("fd","fs" ), (True , False )), + 0b000111: (MIPS_INS_NEG_D, "neg.d", ("fd","fs" ), (True , False )), + 0b001000: (MIPS_INS_ROUND_L_D, "round.l.d", ("fd","fs" ), (True , False )), + 0b001001: (MIPS_INS_TRUNC_L_D, "trunc.l.d", ("fd","fs" ), (True , False )), + 0b001010: (MIPS_INS_CEIL_L_D, "ceil.l.d", ("fd","fs" ), (True , False )), + 0b001011: (MIPS_INS_FLOOR_L_D, "floor.l.d", ("fd","fs" ), (True , False )), + 0b001100: (MIPS_INS_ROUND_W_D, "round.w.d", ("fd","fs" ), (True , False )), + 0b001101: (MIPS_INS_TRUNC_W_D, "trunc.w.d", ("fd","fs" ), (True , False )), + 0b001110: (MIPS_INS_CEIL_W_D, "ceil.w.d", ("fd","fs" ), (True , False )), + 0b001111: (MIPS_INS_FLOOR_W_D, "floor.w.d", ("fd","fs" ), (True , False )), + 0b100000: (MIPS_INS_CVT_S_D, "cvt.s.d", ("fd","fs" ), (True , False )), + 0b100100: (MIPS_INS_CVT_W_D, "cvt.w.d", ("fd","fs" ), (True , False )), + 0b100101: (MIPS_INS_CVT_L_D, "cvt.l.d", ("fd","fs" ), (True , False )), + 0b110000: (MIPS_INS_C_F_D, "c.f.d", ("fs","ft" ), (False, False )), + 0b110001: (MIPS_INS_C_UN_D, "c.un.d", ("fs","ft" ), (False, False )), + 0b110010: (MIPS_INS_C_EQ_D, "c.eq.d", ("fs","ft" ), (False, False )), + 0b110011: (MIPS_INS_C_UEQ_D, "c.ueq.d", ("fs","ft" ), (False, False )), + 0b110100: (MIPS_INS_C_OLT_D, "c.olt.d", ("fs","ft" ), (False, False )), + 0b110101: (MIPS_INS_C_ULT_D, "c.ult.d", ("fs","ft" ), (False, False )), + 0b110110: (MIPS_INS_C_OLE_D, "c.ole.d", ("fs","ft" ), (False, False )), + 0b110111: (MIPS_INS_C_ULE_D, "c.ule.d", ("fs","ft" ), (False, False )), + 0b111000: (MIPS_INS_C_SF_D, "c.sf.d", ("fs","ft" ), (False, False )), + 0b111001: (MIPS_INS_C_NGLE_D, "c.ngle.d", ("fs","ft" ), (False, False )), + 0b111010: (MIPS_INS_C_SEQ_D, "c.seq.d", ("fs","ft" ), (False, False )), + 0b111011: (MIPS_INS_C_NGL_D, "c.ngl.d", ("fs","ft" ), (False, False )), + 0b111100: (MIPS_INS_C_LT_D, "c.lt.d", ("fs","ft" ), (False, False )), + 0b111101: (MIPS_INS_C_NGE_D, "c.nge.d", ("fs","ft" ), (False, False )), + 0b111110: (MIPS_INS_C_LE_D, "c.le.d", ("fs","ft" ), (False, False )), + 0b111111: (MIPS_INS_C_NGT_D, "c.ngt.d", ("fs","ft" ), (False, False )), + }), + 0b010100: (mips_get_function, { + 0b100000: (MIPS_INS_CVT_S_W, "cvt.s.w", ("fd","fs"), (True , False)), + 0b100001: (MIPS_INS_CVT_D_W, "cvt.d.w", ("fd","fs"), (True , False)), + }), + 0b010101: (mips_get_function, { + 0b100000: (MIPS_INS_CVT_S_L, "cvt.s.l", ("fd","fs"), (True , False)), + 0b100001: (MIPS_INS_CVT_D_L, "cvt.d.l", ("fd","fs"), (True , False)), + }), + }), + 0b010100: (MIPS_INS_BEQL, "beql", ("rs","rt","offset" ), (False, False, False)), + 0b010101: (MIPS_INS_BNEL, "bnel", ("rs","rt","offset" ), (False, False, False)), + 0b010110: (MIPS_INS_BLEZL, "blezl", ("rs","offset" ), (False, False )), + 0b010111: (MIPS_INS_BGTZL, "bgtzl", ("rs","offset" ), (False, False )), + 0b011000: (MIPS_INS_DADDI, "daddi", ("rt","rs","imm" ), (True , False, False)), + 0b011001: (MIPS_INS_DADDIU, "daddiu", ("rt","rs","imm" ), (True , False, False)), + 0b011010: (MIPS_INS_LDL, "ldl", ("rt","offset(base)"), (True , False )), + 0b011011: (MIPS_INS_LDR, "ldr", ("rt","offset(base)"), (True , False )), + 0b100000: (MIPS_INS_LB, "lb", ("rt","offset(base)"), (True , False )), + 0b100001: (MIPS_INS_LH, "lh", ("rt","offset(base)"), (True , False )), + 0b100010: (MIPS_INS_LWL, "lwl", ("rt","offset(base)"), (True , False )), + 0b100011: (MIPS_INS_LW, "lw", ("rt","offset(base)"), (True , False )), + 0b100100: (MIPS_INS_LBU, "lbu", ("rt","offset(base)"), (True , False )), + 0b100101: (MIPS_INS_LHU, "lhu", ("rt","offset(base)"), (True , False )), + 0b100110: (MIPS_INS_LWR, "lwr", ("rt","offset(base)"), (True , False )), + 0b100111: (MIPS_INS_LWU, "lwu", ("rt","offset(base)"), (True , False )), + 0b101000: (MIPS_INS_SB, "sb", ("rt","offset(base)"), (False, False )), + 0b101001: (MIPS_INS_SH, "sh", ("rt","offset(base)"), (False, False )), + 0b101010: (MIPS_INS_SWL, "swl", ("rt","offset(base)"), (False, False )), + 0b101011: (MIPS_INS_SW, "sw", ("rt","offset(base)"), (False, False )), + 0b101100: (MIPS_INS_SDL, "sdl", ("rt","offset(base)"), (False, False )), + 0b101101: (MIPS_INS_SDR, "sdr", ("rt","offset(base)"), (False, False )), + 0b101110: (MIPS_INS_SWR, "swr", ("rt","offset(base)"), (False, False )), + 0b101111: (MIPS_INS_CACHE, "cache", ("op","offset(base)"), (False, False, False)), + 0b110000: (MIPS_INS_LL, "ll", ("rt","offset(base)"), (True , False )), + 0b110001: (MIPS_INS_LWC1, "lwc1", ("ft","offset(base)"), (True , False )), + # lwc2 + 0b110100: (MIPS_INS_LLD, "lld", ("rt","offset(base)"), (True , False )), + 0b110101: (MIPS_INS_LDC1, "ldc1", ("ft","offset(base)"), (True , False )), + # ldc2 + 0b110111: (MIPS_INS_LD, "ld", ("rt","offset(base)"), (True , False )), + 0b111000: (MIPS_INS_SC, "sc", ("rt","offset(base)"), (False, False )), + 0b111001: (MIPS_INS_SWC1, "swc1", ("ft","offset(base)"), (False, False )), + # lwc2 + 0b111100: (MIPS_INS_SCD, "scd", ("rt","offset(base)"), (False, False )), + 0b111101: (MIPS_INS_SDC1, "sdc1", ("ft","offset(base)"), (False, False )), + # sdc2 + 0b111111: (MIPS_INS_SD, "sd", ("rt","offset(base)"), (False, False )), +} + +rsp_insns = { + 0b000000: (mips_get_special, { + # opcode id mnemonic fields field is written to + 0b000000: (MIPS_INS_SLL, "sll", ("rd","rt","sa"), (True , False, False)), + 0b000010: (MIPS_INS_SRL, "srl", ("rd","rt","sa"), (True , False, False)), + 0b000011: (MIPS_INS_SRA, "sra", ("rd","rt","sa"), (True , False, False)), + 0b000100: (MIPS_INS_SLLV, "sllv", ("rd","rt","rs"), (True , False, False)), + 0b000110: (MIPS_INS_SRLV, "srlv", ("rd","rt","rs"), (True , False, False)), + 0b000111: (MIPS_INS_SRAV, "srav", ("rd","rt","rs"), (True , False, False)), + 0b001000: (MIPS_INS_JR, "jr", ("rs", ), (False, )), + 0b001001: (MIPS_INS_JALR, "jalr", ("rs", ), (False, )), # technically also rd but it's always $ra + 0b001101: (MIPS_INS_BREAK, "break", ("code", ), (False, )), + 0b100000: (MIPS_INS_ADD, "add", ("rd","rs","rt"), (True , False, False)), + 0b100001: (MIPS_INS_ADDU, "addu", ("rd","rs","rt"), (True , False, False)), + 0b100010: (MIPS_INS_SUB, "sub", ("rd","rs","rt"), (True , False, False)), + 0b100011: (MIPS_INS_SUBU, "subu", ("rd","rs","rt"), (True , False, False)), + 0b100100: (MIPS_INS_AND, "and", ("rd","rs","rt"), (True , False, False)), + 0b100101: (MIPS_INS_OR, "or", ("rd","rs","rt"), (True , False, False)), + 0b100110: (MIPS_INS_XOR, "xor", ("rd","rs","rt"), (True , False, False)), + 0b100111: (MIPS_INS_NOR, "nor", ("rd","rs","rt"), (True , False, False)), + 0b101010: (MIPS_INS_SLT, "slt", ("rd","rs","rt"), (True , False, False)), + 0b101011: (MIPS_INS_SLTU, "sltu", ("rd","rs","rt"), (True , False, False)), + }), + 0b000001: (mips_get_regimm, { + 0b00000: (MIPS_INS_BLTZ, "bltz", ("rs","offset"), (False, False)), + 0b00001: (MIPS_INS_BGEZ, "bgez", ("rs","offset"), (False, False)), + 0b10000: (MIPS_INS_BLTZAL, "bltzal", ("rs","offset"), (False, False)), + 0b10001: (MIPS_INS_BGEZAL, "bgezal", ("rs","offset"), (False, False)), + }), + 0b000010: (MIPS_INS_J, "j", ("target", ), (False, )), + 0b000011: (MIPS_INS_JAL, "jal", ("target", ), (False, )), + 0b000100: (MIPS_INS_BEQ, "beq", ("rs","rt","offset"), (False, False, False)), + 0b000101: (MIPS_INS_BNE, "bne", ("rs","rt","offset"), (False, False, False)), + 0b000110: (MIPS_INS_BLEZ, "blez", ("rs","offset" ), (False, False )), + 0b000111: (MIPS_INS_BGTZ, "bgtz", ("rs","offset" ), (False, False )), + 0b001000: (MIPS_INS_ADDI, "addi", ("rt","rs","imm" ), (True , False, False)), + 0b001001: (MIPS_INS_ADDIU, "addiu", ("rt","rs","imm" ), (True , False, False)), + 0b001010: (MIPS_INS_SLTI, "slti", ("rt","rs","imm" ), (True , False, False)), + 0b001011: (MIPS_INS_SLTIU, "sltiu", ("rt","rs","imm" ), (True , False, False)), + 0b001100: (MIPS_INS_ANDI, "andi", ("rt","rs","imm" ), (True , False, False)), + 0b001101: (MIPS_INS_ORI, "ori", ("rt","rs","imm" ), (True , False, False)), + 0b001110: (MIPS_INS_XORI, "xori", ("rt","rs","imm" ), (True , False, False)), + 0b001111: (MIPS_INS_LUI, "lui", ("rt","imm" ), (True , False )), + 0b010000: (mips_get_cop0, { + 0b00000: (MIPS_INS_MFC0, "mfc0", ("rt","cd"), (True , False)), + 0b00100: (MIPS_INS_MTC0, "mtc0", ("rt","cd"), (False, True )), + }), + 0b010010: (mips_get_cop2_func, { # TODO this encoding got ugly, move to a mask matcher like gnu objdump + 0b0: (mips_get_cop2, { + 0b0000: (MIPS_INS_MFC2, "mfc2", ("rt", "vd[e]"), (True , False)), + 0b0100: (MIPS_INS_MTC2, "mtc2", ("rt", "vd[e]"), (False, True )), + 0b0010: (MIPS_INS_CFC2, "cfc2", ("rt", "vc" ), (True , False)), + 0b0110: (MIPS_INS_CTC2, "ctc2", ("rt", "vc" ), (False, True )), + }), + 0b1: (mips_get_function, { + 0b000000: (MIPS_INS_VMULF, "vmulf", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000001: (MIPS_INS_VMULU, "vmulu", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000010: (MIPS_INS_VRNDP, "vrndp", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000011: (MIPS_INS_VMULQ, "vmulq", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000100: (MIPS_INS_VMUDL, "vmudl", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000101: (MIPS_INS_VMUDM, "vmudm", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000110: (MIPS_INS_VMUDN, "vmudn", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b000111: (MIPS_INS_VMUDH, "vmudh", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001000: (MIPS_INS_VMACF, "vmacf", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001001: (MIPS_INS_VMACU, "vmacu", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001010: (MIPS_INS_VRNDN, "vrndn", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001011: (MIPS_INS_VMACQ, "vmacq", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001100: (MIPS_INS_VMADL, "vmadl", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001101: (MIPS_INS_VMADM, "vmadm", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001110: (MIPS_INS_VMADN, "vmadn", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b001111: (MIPS_INS_VMADH, "vmadh", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010000: (MIPS_INS_VADD, "vadd", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010001: (MIPS_INS_VSUB, "vsub", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010011: (MIPS_INS_VABS, "vabs", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010100: (MIPS_INS_VADDC, "vaddc", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b010101: (MIPS_INS_VSUBC, "vsubc", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b011101: (MIPS_INS_VSAR, "vsar", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100000: (MIPS_INS_VLT, "vlt", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100001: (MIPS_INS_VEQ, "veq", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100010: (MIPS_INS_VNE, "vne", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100011: (MIPS_INS_VGE, "vge", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100100: (MIPS_INS_VCL, "vcl", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100101: (MIPS_INS_VCH, "vch", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100110: (MIPS_INS_VCR, "vcr", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b100111: (MIPS_INS_VMRG, "vmrg", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101000: (MIPS_INS_VAND, "vand", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101001: (MIPS_INS_VNAND, "vnand", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101010: (MIPS_INS_VOR, "vor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101011: (MIPS_INS_VNOR, "vnor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101100: (MIPS_INS_VXOR, "vxor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b101101: (MIPS_INS_VNXOR, "vnxor", ("vd", "vs", "vt[e]"), (True , False, False)), + 0b110000: (MIPS_INS_VRCP, "vrcp", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110001: (MIPS_INS_VRCPL, "vrcpl", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110010: (MIPS_INS_VRCPH, "vrcph", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110011: (MIPS_INS_VMOV, "vmov", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110100: (MIPS_INS_VRSQ, "vrsq", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110101: (MIPS_INS_VRSQL, "vrsql", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110110: (MIPS_INS_VRSQH, "vrsqh", ("vd[ed]", "vt[e]" ), (True , False)), + 0b110111: (MIPS_INS_VNOP, "vnop", ( ), ()), + }), + }), + 0b100000: (MIPS_INS_LB, "lb", ("rt","offset(base)"), (True , False)), + 0b100001: (MIPS_INS_LH, "lh", ("rt","offset(base)"), (True , False)), + 0b100011: (MIPS_INS_LW, "lw", ("rt","offset(base)"), (True , False)), + 0b100100: (MIPS_INS_LBU, "lbu", ("rt","offset(base)"), (True , False)), + 0b100101: (MIPS_INS_LHU, "lhu", ("rt","offset(base)"), (True , False)), + 0b101000: (MIPS_INS_SB, "sb", ("rt","offset(base)"), (False, False)), + 0b101001: (MIPS_INS_SH, "sh", ("rt","offset(base)"), (False, False)), + 0b101011: (MIPS_INS_SW, "sw", ("rt","offset(base)"), (False, False)), + 0b110010: (mips_get_lwc2, { + 0b00000: (MIPS_INS_LBV, "lbv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00001: (MIPS_INS_LSV, "lsv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00010: (MIPS_INS_LLV, "llv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00011: (MIPS_INS_LDV, "ldv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00100: (MIPS_INS_LQV, "lqv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00101: (MIPS_INS_LRV, "lrv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00110: (MIPS_INS_LPV, "lpv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b00111: (MIPS_INS_LUV, "luv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b01000: (MIPS_INS_LHV, "lhv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b01001: (MIPS_INS_LFV, "lfv", ("vt[ed]", "voffset(base)"), (True , False)), + 0b01011: (MIPS_INS_LTV, "ltv", ("vt[ed]", "voffset(base)"), (True , False)), + }), + 0b111010: (mips_get_swc2, { + 0b00000: (MIPS_INS_SBV, "sbv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00001: (MIPS_INS_SSV, "ssv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00010: (MIPS_INS_SLV, "slv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00011: (MIPS_INS_SDV, "sdv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00100: (MIPS_INS_SQV, "sqv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00101: (MIPS_INS_SRV, "srv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00110: (MIPS_INS_SPV, "spv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b00111: (MIPS_INS_SUV, "suv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01000: (MIPS_INS_SHV, "shv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01001: (MIPS_INS_SFV, "sfv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01010: (MIPS_INS_SWV, "swv", ("vt[ed]", "voffset(base)"), (False, False)), + 0b01011: (MIPS_INS_STV, "stv", ("vt[ed]", "voffset(base)"), (False, False)), + }), +} diff --git a/lib/hackerlibultra/tools/patch_ar_meta.py b/lib/hackerlibultra/tools/patch_ar_meta.py new file mode 100755 index 00000000..d831785b --- /dev/null +++ b/lib/hackerlibultra/tools/patch_ar_meta.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +# +# Patch metadata in .ar files +# + +import argparse + +def ar_patch(ar, original, new_uid, new_gid, new_filemode): + """ + AR file headers + + Offset Length Name Format + 0 16 File identifier ASCII + 16 12 File modification timestamp (in seconds) Decimal + 28 6 Owner ID Decimal + 34 6 Group ID Decimal + 40 8 File mode (type and permission) Octal + 48 10 File size in bytes Decimal + 58 2 Ending characters 0x60 0x0A + """ + assert len(ar) > 0x24 , "Got empty archive?" + + armap_time1 = None + armap_time2 = None + + i = 8 + while i < len(original): + file_name = original[i:][0:][:16].decode("ASCII") + file_size = int(original[i:][48:][:10].decode("ASCII").strip()) + end = original[i:][58:][:2].decode("ASCII") + + assert end == "`\n" + + if file_name.strip() == "/": + armap_time1 = original[i+16:i+16+12] + elif file_name.strip() == "//": + armap_time2 = original[i+16:i+16+12] + + if file_size % 2 != 0: + file_size += 1 + i += file_size + 60 + + assert armap_time1 is not None + assert armap_time2 is not None + + i = 8 + while i < len(ar): + file_name = ar[i:][0:][:16].decode("ASCII") + file_size = int(ar[i:][48:][:10].decode("ASCII").strip()) + end = ar[i:][58:][:2].decode("ASCII") + + assert end == "`\n" + + if file_name.strip() == "/": + ar[i+16:i+16+12] = armap_time1 + elif file_name.strip() == "//": + ar[i+16:i+16+12] = armap_time2 + else: + ar[i+28:i+28+6] = f"{new_uid:<6}".encode("ASCII")[:6] + ar[i+34:i+34+6] = f"{new_gid:<6}".encode("ASCII")[:6] + ar[i+40:i+40+8] = f"{new_filemode:<8}".encode("ASCII")[:8] + + if file_size % 2 != 0: + file_size += 1 + i += file_size + 60 + +def main(): + parser = argparse.ArgumentParser(description="Patch metadata in .a files.") + parser.add_argument("target", help="path to the ar file to patch") + parser.add_argument("original", help="path to the original ar file") + parser.add_argument("uid", help="new uid") + parser.add_argument("gid", help="new gid") + parser.add_argument("filemode", help="new filemode") + args = parser.parse_args() + + ar = None + with open(args.target, "rb") as ar_file: + ar = bytearray(ar_file.read()) + + original = None + with open(args.original, "rb") as original_ar_file: + original = bytearray(original_ar_file.read()) + + ar_patch(ar, original, args.uid, args.gid, args.filemode) + + with open(args.target, "wb") as ar_file: + ar_file.write(ar) + +if __name__ == '__main__': + main() diff --git a/lib/hackerlibultra/tools/print_mdebug.py b/lib/hackerlibultra/tools/print_mdebug.py new file mode 100755 index 00000000..e0b295a3 --- /dev/null +++ b/lib/hackerlibultra/tools/print_mdebug.py @@ -0,0 +1,589 @@ +#!/usr/bin/env python3 +''' +Resources: +http://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/include/coff/sym.h +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/include/coff/symconst.h +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/gas/ecoff.c +https://github.com/pathscale/binutils/blob/5c2c133020e41fc4aadd80a99156d2cea4754b96/bfd/ecoff.c +https://github.com/pathscale/absoft/blob/master/svn/trunk/ekopath-gcc/ekopath-gcc-4.2.0/gcc/mips-tdump.c +https://chromium.googlesource.com/native_client/nacl-toolchain/+/refs/tags/gcc-4.4.3/binutils/gas/ecoff.c +https://android.googlesource.com/toolchain/binutils/+/refs/heads/donut/binutils-2.17/bfd/ecofflink.c +https://kernel.googlesource.com/pub/scm/linux/kernel/git/hjl/binutils/+/hjl/secondary/include/coff/symconst.h +https://c0de.pw/bg/binutils-gdb/blob/cdbf20f73486c66e24f322400eba877eb534ae51/gdb/mdebugread.c +''' + +import os +import struct +import collections +import sys + +OFFSET = 0 # TODO why are the offsets in the symbolic header off by some amount? + +indent_level = 0 +is_comment = False + +symbol_type_list = [ + 'stNil', 'stGlobal', 'stStatic', 'stParam', 'stLocal', 'stLabel', 'stProc', 'stBlock', + 'stEnd', 'stMember', 'stTypedef', 'stFile', 'INVALID', 'INVALID', 'stStaticProc', 'stConstant', + 'stStaParam', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', 'INVALID', + 'INVALID', 'INVALID', 'stStruct', 'stUnion', 'stEnum', 'INVALID', 'INVALID', 'INVALID', + 'INVALID', 'INVALID', 'stIndirect'] +storage_class_list = ['scNil', 'scText', 'scData', 'scBss', 'scRegister', 'scAbs', 'scUndefined', 'reserved', + 'scBits', 'scDbx', 'scRegImage', 'scInfo', 'scUserStruct', 'scSData', 'scSBss', 'scRData', + 'scVar', 'scCommon', 'scSCommon', 'scVarRegister', 'scVariant', 'scUndefined', 'scInit'] +basic_type_c_list = ['nil', 'addr', 'signed char', 'unsigned char', 'short', 'unsigned short', 'int', 'unsigned int', + 'long', 'unsigned long', 'float', 'double', 'struct', 'union', 'enum', 'typedef', + 'range', 'set', 'complex', 'double complex', 'indirect', 'fixed decimal', 'float decimal', 'string', + 'bit', 'picture', 'void', 'long long', 'unsigned long long', 'INVALID', 'long', 'unsigned long', + 'long long', 'unsigned long long', 'addr', 'int64', 'unsigned int64'] + +def increase_indent(): + global indent_level + indent_level += 1 + +def decrease_indent(): + global indent_level + indent_level -= 1 + +def set_is_comment(set_to): + global is_comment + old = is_comment + is_comment = set_to + return old + +def get_indent(): + global indent_level + global is_comment + ret = '//' if is_comment else '' + for i in range(indent_level): + ret += ' ' + return ret + +def check_indent(): + global indent_level + assert indent_level == 0 + +def read_uint32_be(file_data, offset): + return struct.unpack('>I', file_data[offset:offset+4])[0] + +def read_uint16_be(file_data, offset): + return struct.unpack('>H', file_data[offset:offset+2])[0] + +def read_uint8_be(file_data, offset): + return struct.unpack('>B', file_data[offset:offset+1])[0] + +def read_elf_header(file_data, offset): + Header = collections.namedtuple('ElfHeader', + '''e_magic e_class e_data e_version e_osabi e_abiversion e_pad + e_type e_machine e_version2 e_entry e_phoff e_shoff e_flags + e_ehsize e_phentsize e_phnum e_shentsize e_shnum e_shstrndx''') + return Header._make(struct.unpack('>I5B7s2H5I6H', file_data[offset:offset+52])) + +def read_elf_section_header(file_data, offset): + Header = collections.namedtuple('SectionHeader', + '''sh_name sh_type sh_flags sh_addr sh_offset sh_size sh_link + sh_info sh_addralign sh_entsize''') + return Header._make(struct.unpack('>10I', file_data[offset:offset+40])) + +def read_symbolic_header(file_data, offset): + Header = collections.namedtuple('SymbolicHeader', + '''magic vstamp ilineMax cbLine cbLineOffset idnMax cbDnOffset + ipdMax cbPdOffset isymMax cbSymOffset ioptMax cbOptOffset + iauxMax cbAuxOffset issMax cbSsOffset issExtMax cbSsExtOffset + ifdMax cbFdOffset crfd cbRfdOffset iextMax cbExtOffset''') + return Header._make(struct.unpack('>2H23I', file_data[offset:offset+96])) + +# TODO find a better solution for the bitfield +def read_file_descriptor(file_data, offset): + if 'init' not in read_file_descriptor.__dict__: + read_file_descriptor.cache = {} + read_file_descriptor.header = collections.namedtuple('FileDescriptor', + '''adr rss issBase cbSs isymBase csym ilineBase cline ioptBase + copt ipdFirst cpd iauxBase caux rfdBase crfd XXX_bitfield + cbLineOffset cbLine''') + read_file_descriptor.init = True + if offset in read_file_descriptor.cache: + return read_file_descriptor.cache[offset] + read_file_descriptor.cache[offset] = read_file_descriptor.header._make( + struct.unpack('>I2iI6iHh4iI2I', file_data[offset:offset+72])) + return read_file_descriptor.cache[offset] + +def read_procedure_descriptor(file_data, offset): + Header = collections.namedtuple('ProcedureDescriptor', + '''adr isym iline regmask regoffset iopt fregmask fregoffset + frameoffset framereg pcreg lnLow lnHigh cbLineOffset''') + return Header._make(struct.unpack('>I8i2h2iI', file_data[offset:offset+52])) + +def read_symbol(file_data, offset): + if 'init' not in read_symbol.__dict__: + read_symbol.cache = {} + read_symbol.header = collections.namedtuple('Symbol', '''iss value st sc index''') + read_symbol.init = True + if offset in read_symbol.cache: + return read_symbol.cache[offset] + (word0, word1, word2) = struct.unpack('>iiI', file_data[offset:offset+12]) + read_symbol.cache[offset] = read_symbol.header._make(( + word0, word1, (word2 >> 26) & 0x3F, (word2 >> 21) & 0x1F, word2 & 0xFFFFF)) + return read_symbol.cache[offset] + +def read_auxiliary_symbol(file_data, offset): + if 'init' not in read_auxiliary_symbol.__dict__: + read_auxiliary_symbol.cache = {} + read_auxiliary_symbol.header = collections.namedtuple('AuxSymbol', + '''ti rndx dnLow dnHigh isym iss width count''') + read_auxiliary_symbol.type_info = collections.namedtuple('TypeInfo', + '''fBitfield continued bt tq4 tq5 tq0 tq1 tq2 tq3''') + read_auxiliary_symbol.rel_sym = collections.namedtuple('RelativeSymbol', '''rfd index''') + read_auxiliary_symbol.init = True + if offset in read_auxiliary_symbol.cache: + return read_auxiliary_symbol.cache[offset] + word0 = struct.unpack('>I', file_data[offset:offset+4])[0] + read_auxiliary_symbol.cache[offset] = read_auxiliary_symbol.header._make(( + read_auxiliary_symbol.type_info._make(((word0 >> 31) & 1, (word0 >> 30) & 1, (word0 >> 24) & 0x3F, (word0 >> 20) & 0xF, (word0 >> 16) & 0xF, (word0 >> 12) & 0xF, (word0 >> 8) & 0xF, (word0 >> 4) & 0xF, word0 & 0xF)), + read_auxiliary_symbol.rel_sym._make(((word0 >> 20) & 0xFFF, word0 & 0xFFFFF)), + word0, word0, word0, word0, word0, word0)) + return read_auxiliary_symbol.cache[offset] + +def read_string(file_data, offset): + current_offset = 0 + current_string = b'' + while True: + char = struct.unpack('c', file_data[offset+current_offset:offset+current_offset+1])[0] + if char == b'\0': + return current_string.decode('ascii') + else: + current_string += char + current_offset += 1 + +def map_relative_file_descriptor(file_data, fd, symbolic_header, rfd_num): + if fd.crfd == 0: + return rfd_num + + offset = symbolic_header.cbRfdOffset - OFFSET + (fd.rfdBase + rfd_num)*4 + return struct.unpack('>I', file_data[offset:offset+4])[0] + +def get_symbol_name_from_aux(file_data, fd, symbolic_header, aux_num, search_for_typedef): + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + aux_num)*4) + fd_num = aux.rndx.rfd + next_aux = aux_num+1 + if fd_num == 4095: + aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4) + fd_num = aux2.isym + next_aux = next_aux+1; + fd_num = map_relative_file_descriptor(file_data, fd, symbolic_header, fd_num) + fd2 = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + fd_num*72) + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd2.isymBase + aux.rndx.index)*12) + ret = '' + #print('%r' % (aux,)); + #print('%r' % (aux2,)); + #print('%r' % (sym,)); + if sym.st == 26 or sym.st == 27: #stStruct, stunion + ret = get_struct_or_union_string(file_data, fd2, symbolic_header, fd2.isymBase + aux.rndx.index, search_for_typedef) + elif sym.st == 28: #stEnum: + ret = get_enum_string(file_data, fd2, symbolic_header, fd2.isymBase + aux.rndx.index) + else: + ret = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd2.issBase + sym.iss) + return (ret, next_aux) + +def get_type_string(file_data, fd, symbolic_header, aux_num, name, search_for_typedef): + ret = '' + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + aux_num)*4) + #print(''); + #print('%r' % (aux,)); + next_aux = aux_num+1 + has_bitfield = aux.ti.fBitfield == 1 + bitwidth = 0 + if has_bitfield: + bit_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4) + bitwidth = bit_aux.isym + next_aux = next_aux+1 + if aux.ti.bt == 12: # btStruct + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + elif aux.ti.bt == 13: # btUnion + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + elif aux.ti.bt == 15: # btTypedef + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + elif aux.ti.bt == 14: # btEnum + (ret, next_aux) = get_symbol_name_from_aux(file_data, fd, symbolic_header, next_aux, search_for_typedef) + else: + if aux.ti.bt >= 36: + print('Error unknow bt: %d' % (aux.ti.bt)) + ret = basic_type_c_list[aux.ti.bt] + + tq_list = (aux.ti.tq0, aux.ti.tq1, aux.ti.tq2, aux.ti.tq3, aux.ti.tq4, aux.ti.tq5) + + # TODO this is very naive and probably does not work in a large amount of cases + last_was_proc = False # if we see a tqProc, assume the next will be a tqPtr + for tq in tq_list: + if tq == 0: # tqNil + break; + elif tq == 1: # tqPtr + if last_was_proc: + last_was_proc = False + continue + ret += '*' + elif tq == 2: # tqProc + last_was_proc = True + name = '(*%s)(/* ECOFF does not store param types */)' % name + elif tq == 3: # tqArray + next_aux += 2 # todo what does this skip over? (Apparantly the type of the index, so always int for C) + array_low_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux)*4) + array_high_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux+1)*4) + stride_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + next_aux+2)*4) + next_aux += 3 + if array_high_aux.dnHigh == 0xFFFFFFFF: + name += '[]' + else: + name += '[%d]' % (array_high_aux.dnHigh + 1) + elif tq == 4: # tqFar + print('ERROR tqFar in get_type_name') + elif tq == 5: # tqVol + ret = 'volatile ' + ret + elif tq == 6: # tqConst + ret = 'const ' + ret + if has_bitfield: + name += ' : %d' % bitwidth + return ret + ' ' + name + +def get_enum_string(file_data, fd, symbolic_header, enum_sym_num): + ret = '' + start_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + enum_sym_num*12) + if start_sym.st != 28: + print('ERROR unknown type in get_enum_string start:%d' % start_sym.st) + return ret + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss) + if name != '': + name += ' ' + ret += 'enum %s{\n' % name + increase_indent() + sym_num = enum_sym_num + 1 + while sym_num < fd.isymBase + start_sym.index: + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if sym.st == 8: # stEnd + decrease_indent() + ret += get_indent() + ret += '}' + elif sym.st == 9: # stMember + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + ret += get_indent() + ret += '%s = %d,\n' % (name, sym.value) + else: + print('ERROR unknown type in get_enum_string:%d' % sym.st) + break + sym_num += 1 + return ret + +def get_struct_or_union_string(file_data, fd, symbolic_header, union_sym_num, search_for_typedef): + ret = '' + start_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + union_sym_num*12) + if search_for_typedef: + typedef_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd.isymBase + start_sym.index)*12) + if typedef_sym.st == 10: # stTypedef + return read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + typedef_sym.iss) + else: + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss) + if name != '': + return name + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + start_sym.iss) + if name != '': + name += ' ' + if start_sym.st == 26: # stStruct + ret += 'struct %s{\n' % name + increase_indent() + elif start_sym.st == 27: # stUnion + ret += 'union %s{\n' % name + increase_indent() + else: + print('ERROR unknown type in get_struct_or_union_string start:%d' % start_sym.st) + return ret + sym_num = union_sym_num + 1 + while sym_num < fd.isymBase + start_sym.index: + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if sym.st == 8: # stEnd + decrease_indent() + ret += get_indent() + ret += '}' + elif sym.st == 9: # stMember + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + ret += get_indent() + ret += '/* 0x%X */ %s;\n' % (sym.value // 8, get_type_string(file_data, fd, symbolic_header, sym.index, name, True)) + elif sym.st == 26 or sym.st == 27: #stStruct, stUnion + sym_num = fd.isymBase + sym.index + continue + elif sym.st == 34: # stIndirect + # TODO what even is a stIndirect? + sym_num += 1 + else: + print('ERROR unknown type in get_struct_or_union_string:%d' % sym.st) + break + sym_num += 1 + return ret + +def print_typedef_symbols(file_data, fd, symbolic_header, typedef_sym_num): + typedef_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + typedef_sym_num*12) + if typedef_sym.st != 10: # stTypedef + print('ERROR expected stTypedef symbol in print_typedef_symbols, found:%d' % typedef_sym.st) + return + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + typedef_sym.iss) + print('typedef %s;' % get_type_string(file_data, fd, symbolic_header, typedef_sym.index, name, False)) + +def print_procedure(file_data, fd, symbolic_header, proc_sym_num): + proc_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + proc_sym_num*12) + proc_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + proc_sym.iss) + print('%s(' % get_type_string(file_data, fd, symbolic_header, proc_sym.index+1, proc_name, True), end='') + sym_num = proc_sym_num+1 + param_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + first = True + while param_sym.st == 3: # stParam + param_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + param_sym.iss) + print('%s%s' % ('' if first else ', ', + get_type_string(file_data, fd, symbolic_header, param_sym.index, param_name, True)), + end='') + sym_num += 1 + param_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + first = False + + print(');') + + check_indent(); + + comment_old = set_is_comment(True) + while sym_num < fd.isymBase + fd.csym: + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + sym_num += 1 + if sym.st == 7: # stBlock + print('%s{' % get_indent()) + increase_indent() + elif sym.st == 8: # stEnd + end_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + if end_name == proc_name: + break + if end_name != '': + # this is a stEnd for something other than the function. Let's back out and return + sym_num -= 1 + break + decrease_indent() + print('%s}' % get_indent()) + elif sym.st == 4: # stLocal + local_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + is_reg = sym.sc == 4 # scRegister + print('%s%s%s;' % (get_indent(), + 'register ' if is_reg else '', + get_type_string(file_data, fd, symbolic_header, sym.index, local_name, True))) + elif sym.st == 2: # stStatic + static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + if sym.index == 0xFFFFF: + print('%sstatic %s; // no type symbol' % (get_indent(),static_name)) + else: + print('%sstatic %s;' % (get_indent(),get_type_string(file_data, fd, symbolic_header, sym.index, static_name, True))) + elif sym.st == 5: # stLabel + label_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + print('%sLabel: %s @ %d;' % (get_indent(), label_name, sym.value)) + elif sym.st == 6: # stProc + # multiple name for function? + sym_num = print_procedure(file_data, fd, symbolic_header, sym_num-1) + elif sym.st == 26 or sym.st == 27: # stStruct, stUnion + print('%s%s;' % (get_indent(), get_struct_or_union_string(file_data, fd, symbolic_header, sym_num-1, False))) + sym_num = fd.isymBase + sym.index + elif sym.st == 28: # stEnum + print('%s%s;' % (get_indent(), get_enum_string(file_data, fd, symbolic_header, sym_num-1))) + sym_num = fd.isymBase + sym.index + elif sym.st == 34: # stIndirect + # TODO what even is a stIndirect? + indirect_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss) + print('%sTODO Indirect: %s;' % (get_indent(), indirect_name)) + else: + print('ERROR unknown st in print_procedure: %d' % sym.st) + set_is_comment(comment_old) + + check_indent(); + + return sym_num + +def print_symbols(file_data, fd, symbolic_header): + sym_num = fd.isymBase + indirects = [] + typedefs = [] + while sym_num < fd.isymBase + fd.csym: + root_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if root_sym.st == 10: # stTypedef + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + root_sym.index)*4) + offset = 0 + if aux.ti.fBitfield == 1: + offset = 1 + if aux.ti.bt == 12 or aux.ti.bt == 13 or aux.ti.bt == 14 or aux.ti.bt == 15: # btStruct, btUnion, btEnum, btTypedef + aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + root_sym.index + 1 + offset)*4) + fd_num = aux2.rndx.rfd + if fd_num == 4095: + fd_num = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + root_sym.index + 2 + offset)*4).isym + fd_num = map_relative_file_descriptor(file_data, fd, symbolic_header, fd_num) + fd2 = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + fd_num*72) + sym2 = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (fd2.isymBase + aux2.rndx.index)*12) + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd2.issBase + sym2.iss) + if name != '': + typedefs.append(name) + elif root_sym.st == 34: # stIndirect + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + root_sym.iss) + indirects.append(name); + sym_num += 1 + sym_num = fd.isymBase + while sym_num < fd.isymBase + fd.csym: + root_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + if root_sym.st == 11: # stFile + file_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + root_sym.iss) + print('// begin file %s\n' % file_name) + sym_num += 1 + leaf_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + while leaf_sym.st != 8: # stEnd + if leaf_sym.st == 26 or leaf_sym.st == 27: # stStruct, stUnion + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss) + if (name != '') and ((name in indirects) or (name not in typedefs)): # TODO + print('%s;\n' % get_struct_or_union_string(file_data, fd, symbolic_header, sym_num, False)) + sym_num = fd.isymBase + leaf_sym.index + elif leaf_sym.st == 28: # stEnum + name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss) + if (name != '') and (name not in typedefs): # TODO + print('%s;\n' % get_enum_string(file_data, fd, symbolic_header, sym_num)) + sym_num = fd.isymBase + leaf_sym.index + elif leaf_sym.st == 10: # stTypedef + # TODO typedef for stIndirect shoulf print the keyword i.e. typdef >struct< THING thing + print_typedef_symbols(file_data, fd, symbolic_header, sym_num) + sym_num += 1 + print('') + elif leaf_sym.st == 6 or leaf_sym.st == 14: # stProc, stStaticProc + # TODO how do stProc and stStaticProc differ? stStaticProc isn't exported? + sym_num = print_procedure(file_data, fd, symbolic_header, sym_num) + print('') + elif leaf_sym.st == 2: # stStatic + static_name = read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss) + if leaf_sym.sc == 2 or leaf_sym.sc == 3 or leaf_sym.sc == 5 or leaf_sym.sc == 15: # scData, scBss, scAbsolute, scRData + if leaf_sym.index != 0xFFFFF: # looks like it's an invalid value for .s files + print('static %s;\n' % get_type_string(file_data, fd, symbolic_header, leaf_sym.index, static_name, True)) + else: + print('static %s;\n' % static_name) + else: + print('ERROR unknown sc for stStatic in print_symbols: %d' % leaf_sym.sc) + sym_num += 1 + elif leaf_sym.st == 34: # stIndirect + # stIndirect is put out when the compiler sees a struct when it is not yet defined + # TODO more info + sym_num += 1 + elif leaf_sym.st == 5: # stLabel + print('// label: %s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss)) + sym_num += 1 + elif leaf_sym.st == 0: # stNil + print('// nil: %s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + leaf_sym.iss)) + sym_num += 1 + else: + print('ERROR unknown st in leaf_sym in print_symbols: %d' % leaf_sym.st) + sym_num += 1 + leaf_sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + sym_num = fd.isymBase + root_sym.index + print('// end file %s' % file_name) + else: + print('ERROR expected st of stFile as only root type in print_symbols:%d' % root_sym.st) + return + +def main(): + global OFFSET + if len(sys.argv) < 2: + return # TODO print usage + + filename = sys.argv[1] + + try: + with open(filename, 'rb') as f: + file_data = f.read() + except IOError: + print('failed to read file ' + filename) + return + + elf_header = read_elf_header(file_data, 0) + section_headers = [] + debug_index = 0xFFFFFFFF + #print('%r' % (elf_header,)) + for i in range(elf_header.e_shnum): + section_headers.append(read_elf_section_header(file_data, elf_header.e_shoff + i*40)) + #print('%r' % (section_headers[i],)) + if section_headers[i].sh_type == 0x70000005: + debug_index = i + + if debug_index != 0xFFFFFFFF: + symbolic_header = read_symbolic_header(file_data, section_headers[debug_index].sh_offset) + file_descriptors = [] + print('%r' % (symbolic_header,)) + # Set offset by assuming that there are no optimization symbols so cbOptOffset points to the start of the symbolic header + #OFFSET = symbolic_header.cbOptOffset - section_headers[debug_index].sh_offset + #print('Using OFFSET of %d' % OFFSET) + #for sym_num in range(symbolic_header.isymMax): + #sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + #print('%d:%r' % (sym_num, (sym,))); + #for aux_num in range(symbolic_header.iauxMax): + #aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + aux_num*4) + #print('%d:%r' % (aux_num, (aux,))); + for file_num in range(symbolic_header.ifdMax): + fd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + file_num*72) + file_descriptors.append(fd) + for file_num in range(symbolic_header.ifdMax): + fd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + file_num*72) + print('%r' % (fd,)) + print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + fd.rss)) + + ''' + print(' Relative File Descriptors:') + for rfd_num in range(fd.rfdBase, fd.rfdBase + fd.crfd): + offset = symbolic_header.cbRfdOffset - OFFSET + rfd_num*4 + rfd_index = struct.unpack('>I', file_data[offset:offset+4])[0] + rfd = read_file_descriptor(file_data, symbolic_header.cbFdOffset - OFFSET + rfd_index*72) + print(' %d:%r' % (rfd_index, (rfd,))) + ''' + + ''' + print(' procedures:') + for proc_num in range(fd.ipdFirst, fd.ipdFirst + fd.cpd): + pd = read_procedure_descriptor(file_data, symbolic_header.cbPdOffset - OFFSET + proc_num*52) + print(' %r' % ((pd,))) + ''' + + ''' + print(' symbols:') + for sym_num in range(fd.isymBase, fd.isymBase + fd.csym): + sym = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + sym_num*12) + print(' %r' % ((sym,))) + print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + fd.issBase + sym.iss)) + print(' type:%s(%d)' % (symbol_type_list[sym.st], sym.st)) + print(' storage class:%s(%d)' % (storage_class_list[sym.sc], sym.sc)) + if sym.st == 3 or sym.st == 4 or sym.st == 9 or sym.st == 10 or sym.st == 28: # stParam, stLocal, stMember, stTypedef, stEnum + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index)*4) + print(' %r' % ((aux,))) + offset = 0 + if aux.ti.fBitfield == 1: + bitfield_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 1)*4) + print(' %r' % ((bitfield_aux,))) + offset = 1 + if aux.ti.bt == 12 or aux.ti.bt == 13 or aux.ti.bt == 14 or aux.ti.bt == 15: # btStruct, btUnion, btEnum, btTypedef + aux2 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 1 + offset)*4) + print(' %r' % ((aux2,))) + fd_num = aux2.rndx.rfd + if fd_num == 4095: + aux3 = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index + 2 + offset)*4) + print(' %r' % ((aux3,))) + fd_num = aux3.isym + fd_num = map_relative_file_descriptor(file_data, fd, symbolic_header, fd_num) + sym2 = read_symbol(file_data, symbolic_header.cbSymOffset - OFFSET + (file_descriptors[fd_num].isymBase + aux2.rndx.index)*12) + print(' %r' % (sym2,)) + print(' name:%s' % read_string(file_data, symbolic_header.cbSsOffset - OFFSET + file_descriptors[aux3.isym].issBase + sym2.iss)) + if sym.st == 6 or sym.st == 14: # stProc, stStaticProc + # TODO what is the first aux symbol for? + aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index)*4) + type_aux = read_auxiliary_symbol(file_data, symbolic_header.cbAuxOffset - OFFSET + (fd.iauxBase + sym.index+1)*4) + print(' %r' % ((aux,))) + print(' %r' % ((type_aux,))) + ''' + + print(' pretty print:') + print_symbols(file_data, fd, symbolic_header) + + +main() \ No newline at end of file diff --git a/lib/hackerlibultra/tools/set_o32abi_bit.py b/lib/hackerlibultra/tools/set_o32abi_bit.py new file mode 100755 index 00000000..fc22d2c4 --- /dev/null +++ b/lib/hackerlibultra/tools/set_o32abi_bit.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +import argparse, struct, sys + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + + parser.add_argument('file', help='input file') + args = parser.parse_args() + + with open(args.file, 'r+b') as f: + magic = struct.unpack('>I', f.read(4))[0] + if magic != 0x7F454C46: + print('Error: Not an ELF file') + sys.exit(1) + + f.seek(36) + flags = struct.unpack('>I', f.read(4))[0] + # if flags & 0xF0000000 != 0x20000000: # test for mips3 + # print('Error: Architecture not mips3') + # sys.exit(1) + + flags |= 0x00001000 # set EF_MIPS_ABI_O32 + f.seek(36) + f.write(struct.pack('>I', flags)) + diff --git a/lib/hackerlibultra/tools/shiftjis_conv.py b/lib/hackerlibultra/tools/shiftjis_conv.py new file mode 100755 index 00000000..73037d20 --- /dev/null +++ b/lib/hackerlibultra/tools/shiftjis_conv.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +import sys + +# Converts a file with UTF-8 Japanese glyphs in char literals, +# into one that uses u16 constants + +# Follows the layout in the manual page for easier cross reference +sjis_table = { + "ー": 0x815B, "ぜ": 0x82BA, "へ": 0x82D6, "ァ": 0x8340, "ソ": 0x835C, "ペ": 0x8379, + "ぁ": 0x829F, "そ": 0x82BB, "べ": 0x82D7, "ア": 0x8341, "ゾ": 0x835D, "ホ": 0x837A, + "あ": 0x82A0, "ぞ": 0x82BC, "ぺ": 0x82D8, "ィ": 0x8342, "タ": 0x835E, "ボ": 0x837B, + "ぃ": 0x82A1, "た": 0x82BD, "ほ": 0x82D9, "イ": 0x8343, "ダ": 0x835F, "ポ": 0x837C, + "い": 0x82A2, "だ": 0x82BE, "ぼ": 0x82DA, "ゥ": 0x8344, "チ": 0x8360, "マ": 0x837D, + "ぅ": 0x82A3, "ち": 0x82BF, "ぽ": 0x82DB, "ウ": 0x8345, "ヂ": 0x8361, "ミ": 0x837E, + "う": 0x82A4, "ぢ": 0x82C0, "ま": 0x82DC, "ェ": 0x8346, "ッ": 0x8362, "ム": 0x8380, + "ぇ": 0x82A5, "っ": 0x82C1, "み": 0x82DD, "エ": 0x8347, "ツ": 0x8363, "メ": 0x8381, + "え": 0x82A6, "つ": 0x82C2, "む": 0x82DE, "ォ": 0x8348, "ヅ": 0x8364, "モ": 0x8382, + "ぉ": 0x82A7, "づ": 0x82C3, "め": 0x82DF, "オ": 0x8349, "テ": 0x8365, "ャ": 0x8383, + "お": 0x82A8, "て": 0x82C4, "も": 0x82E0, "カ": 0x834A, "デ": 0x8366, "ヤ": 0x8384, + "か": 0x82A9, "で": 0x82C5, "ゃ": 0x82E1, "ガ": 0x834B, "ト": 0x8367, "ュ": 0x8385, + "が": 0x82AA, "と": 0x82C6, "や": 0x82E2, "キ": 0x834C, "ド": 0x8368, "ユ": 0x8386, + "き": 0x82AB, "ど": 0x82C7, "ゅ": 0x82E3, "ギ": 0x834D, "ナ": 0x8369, "ョ": 0x8387, + "ぎ": 0x82AC, "な": 0x82C8, "ゆ": 0x82E4, "ク": 0x834E, "ニ": 0x836A, "ヨ": 0x8388, + "く": 0x82AD, "に": 0x82C9, "ょ": 0x82E5, "グ": 0x834F, "ヌ": 0x836B, "ラ": 0x8389, + "ぐ": 0x82AE, "ぬ": 0x82CA, "よ": 0x82E6, "ケ": 0x8350, "ネ": 0x836C, "リ": 0x838A, + "け": 0x82AF, "ね": 0x82CB, "ら": 0x82E7, "ゲ": 0x8351, "ノ": 0x836D, "ル": 0x838B, + "げ": 0x82B0, "の": 0x82CC, "り": 0x82E8, "コ": 0x8352, "ハ": 0x836E, "レ": 0x838C, + "こ": 0x82B1, "は": 0x82CD, "る": 0x82E9, "ゴ": 0x8353, "バ": 0x836F, "ロ": 0x838D, + "ご": 0x82B2, "ば": 0x82CE, "れ": 0x82EA, "サ": 0x8354, "パ": 0x8370, "ヮ": 0x838E, + "さ": 0x82B3, "ぱ": 0x82CF, "ろ": 0x82EB, "ザ": 0x8355, "ヒ": 0x8371, "ワ": 0x838F, + "ざ": 0x82B4, "ひ": 0x82D0, "ゎ": 0x82EC, "シ": 0x8356, "ビ": 0x8372, "ヰ": 0x8390, + "し": 0x82B5, "び": 0x82D1, "わ": 0x82ED, "ジ": 0x8357, "ピ": 0x8373, "ヱ": 0x8391, + "じ": 0x82B6, "ぴ": 0x82D2, "ゐ": 0x82EE, "ス": 0x8358, "フ": 0x8374, "ヲ": 0x8392, + "す": 0x82B7, "ふ": 0x82D3, "ゑ": 0x82EF, "ズ": 0x8359, "ブ": 0x8375, "ン": 0x8393, + "ず": 0x82B8, "ぶ": 0x82D4, "を": 0x82F0, "セ": 0x835A, "プ": 0x8376, "ヴ": 0x8394, + "せ": 0x82B9, "ぷ": 0x82D5, "ん": 0x82F1, "ゼ": 0x835B, "ヘ": 0x8377, "ヵ": 0x8395, + "ベ": 0x8378, "ヶ": 0x8396, +} + +skipTimer = 0 + +def sjis_process(buf, outfile): + global skipTimer + + for i, char in enumerate(buf): + if skipTimer > 0: + skipTimer -= 1 + continue + if char == "'" and buf[i+1] in sjis_table: + if sjis_table[buf[i+1]] == 0: + print("Error: Please map %s in %s" % (buf[i+1], sys.argv[0])) + exit(1) + outfile.write("0x%X" % sjis_table[buf[i+1]]) + skipTimer = 2 + else: + outfile.write(char) + + diff --git a/lib/hackerlibultra/tools/strip_debug.sh b/lib/hackerlibultra/tools/strip_debug.sh new file mode 100755 index 00000000..4a8be782 --- /dev/null +++ b/lib/hackerlibultra/tools/strip_debug.sh @@ -0,0 +1,10 @@ +#!/usr/bin/bash + +cd $1 + +mkdir -p .cmp + +for f in *.o ; +do + ${CROSS}objcopy -p --strip-debug $f .cmp/${f/.o/.cmp.o} +done diff --git a/lib/hackerlibultra/tools/util.py b/lib/hackerlibultra/tools/util.py new file mode 100644 index 00000000..b6c61559 --- /dev/null +++ b/lib/hackerlibultra/tools/util.py @@ -0,0 +1,44 @@ + +import struct + +def enumerate_stepped(l, start=0, step=1): + p = start + for e in l: + yield p, e + p += step + +def back_align(x, al): + return x - (x % al) + +def forward_align(x, al): + return (x + (al - 1)) & ~(al - 1) + +def as_double(b): + return struct.unpack(">d", b)[0] + +def as_dword(b): + return struct.unpack(">Q", b)[0] + +def as_float(b): + return struct.unpack(">f", b)[0] + +def as_word(b): + return struct.unpack(">I", b)[0] + +def as_hword(b): + return struct.unpack(">H", b)[0] + +def as_double_list(b): + return [i[0] for i in struct.iter_unpack(">d", b)] + +def as_dword_list(b): + return [i[0] for i in struct.iter_unpack(">Q", b)] + +def as_float_list(b): + return [i[0] for i in struct.iter_unpack(">f", b)] + +def as_word_list(b): + return [i[0] for i in struct.iter_unpack(">I", b)] + +def as_hword_list(b): + return [h[0] for h in struct.iter_unpack(">H", b)] diff --git a/lib/hackerlibultra/util.mk b/lib/hackerlibultra/util.mk new file mode 100644 index 00000000..75af9817 --- /dev/null +++ b/lib/hackerlibultra/util.mk @@ -0,0 +1,16 @@ +# util.mk - Miscellaneous utility functions for use in Makefiles + +# Throws an error if the value of the variable named by $(1) is not in the list given by $(2) +define validate-option + # value must be part of the list + ifeq ($$(filter $($(1)),$(2)),) + $$(error Value of $(1) must be one of the following: $(2)) + endif + # value must be a single word (no whitespace) + ifneq ($$(words $($(1))),1) + $$(error Value of $(1) must be one of the following: $(2)) + endif +endef + +# Returns the path to the command $(1) if exists. Otherwise returns an empty string. +find-command = $(shell which $(1) 2>/dev/null) diff --git a/lib/src/libgcc/_cmpdi2.c b/lib/src/libgcc/_cmpdi2.c deleted file mode 100644 index e7407d72..00000000 --- a/lib/src/libgcc/_cmpdi2.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_cmpdi2 -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_divdi3.c b/lib/src/libgcc/_divdi3.c deleted file mode 100644 index 01efcaa8..00000000 --- a/lib/src/libgcc/_divdi3.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_divdi3 -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_fixdfdi.c b/lib/src/libgcc/_fixdfdi.c deleted file mode 100644 index 856d6805..00000000 --- a/lib/src/libgcc/_fixdfdi.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_fixdfdi -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_fixsfdi.c b/lib/src/libgcc/_fixsfdi.c deleted file mode 100644 index 86e089b7..00000000 --- a/lib/src/libgcc/_fixsfdi.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_fixsfdi -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_fixunsdfdi.c b/lib/src/libgcc/_fixunsdfdi.c deleted file mode 100644 index c6460614..00000000 --- a/lib/src/libgcc/_fixunsdfdi.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_fixunsdfdi -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_fixunssfdi.c b/lib/src/libgcc/_fixunssfdi.c deleted file mode 100644 index 5b1b0689..00000000 --- a/lib/src/libgcc/_fixunssfdi.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_fixunssfdi -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_floatdidf.c b/lib/src/libgcc/_floatdidf.c deleted file mode 100644 index e358a370..00000000 --- a/lib/src/libgcc/_floatdidf.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_floatdidf -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_floatdisf.c b/lib/src/libgcc/_floatdisf.c deleted file mode 100644 index e5293c5a..00000000 --- a/lib/src/libgcc/_floatdisf.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_floatdisf -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_moddi3.c b/lib/src/libgcc/_moddi3.c deleted file mode 100644 index f4494999..00000000 --- a/lib/src/libgcc/_moddi3.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_moddi3 -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_udivdi3.c b/lib/src/libgcc/_udivdi3.c deleted file mode 100644 index 36892ea3..00000000 --- a/lib/src/libgcc/_udivdi3.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_udivdi3 -#include "libgcc2.inc" diff --git a/lib/src/libgcc/_umoddi3.c b/lib/src/libgcc/_umoddi3.c deleted file mode 100644 index adfde87a..00000000 --- a/lib/src/libgcc/_umoddi3.c +++ /dev/null @@ -1,2 +0,0 @@ -#define L_umoddi3 -#include "libgcc2.inc" diff --git a/lib/src/libgcc/libgcc2.inc b/lib/src/libgcc/libgcc2.inc deleted file mode 100644 index 5eda40ea..00000000 --- a/lib/src/libgcc/libgcc2.inc +++ /dev/null @@ -1,4021 +0,0 @@ -// This file is copied from gcc 2.95.2 -// tconfig.h, machmode.h, defaults.h and stddef.h have been un-included - -#define LIBGCC2_WORDS_BIG_ENDIAN 1 -#define BITS_PER_UNIT 8 -#define inhibit_libc - -/* More subroutines needed by GCC output code on some machines. */ -/* Compile this one with gcc. */ -/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* As a special exception, if you link this library with other files, - some of which are compiled with GCC, to produce an executable, - this library does not by itself cause the resulting executable - to be covered by the GNU General Public License. - This exception does not however invalidate any other reasons why - the executable file might be covered by the GNU General Public License. */ - -/* It is incorrect to include config.h here, because this file is being - compiled for the target, and hence definitions concerning only the host - do not apply. */ - -//#include "tconfig.h" - -/* We disable this when inhibit_libc, so that gcc can still be built without - needing header files first. */ -/* ??? This is not a good solution, since prototypes may be required in - some cases for correct code. See also frame.c. */ -#ifndef inhibit_libc -/* fixproto guarantees these system headers exist. */ -#include -#include -#endif - -//#include "machmode.h" -//#include "defaults.h" -#ifndef L_trampoline -//#include -#endif - -/* Don't use `fancy_abort' here even if config.h says to use it. */ -#ifdef abort -#undef abort -#endif - -#if (SUPPORTS_WEAK == 1) && (defined (ASM_OUTPUT_DEF) || defined (ASM_OUTPUT_WEAK_ALIAS)) -#define WEAK_ALIAS -#endif - -/* In a cross-compilation situation, default to inhibiting compilation - of routines that use libc. */ - -#if defined(CROSS_COMPILE) && !defined(inhibit_libc) -#define inhibit_libc -#endif - -/* Permit the tm.h file to select the endianness to use just for this - file. This is used when the endianness is determined when the - compiler is run. */ - -#ifndef LIBGCC2_WORDS_BIG_ENDIAN -#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN -#endif - -#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE -#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE -#endif - -/* In the first part of this file, we are interfacing to calls generated - by the compiler itself. These calls pass values into these routines - which have very specific modes (rather than very specific types), and - these compiler-generated calls also expect any return values to have - very specific modes (rather than very specific types). Thus, we need - to avoid using regular C language type names in this part of the file - because the sizes for those types can be configured to be anything. - Instead we use the following special type names. */ - -typedef unsigned int UQItype __attribute__ ((mode (QI))); -typedef int SItype __attribute__ ((mode (SI))); -typedef unsigned int USItype __attribute__ ((mode (SI))); -typedef int DItype __attribute__ ((mode (DI))); -typedef unsigned int UDItype __attribute__ ((mode (DI))); - -typedef float SFtype __attribute__ ((mode (SF))); -typedef float DFtype __attribute__ ((mode (DF))); - -#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96 -typedef float XFtype __attribute__ ((mode (XF))); -#endif -#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128 -typedef float TFtype __attribute__ ((mode (TF))); -#endif - -typedef int word_type __attribute__ ((mode (__word__))); - -/* Make sure that we don't accidentally use any normal C language built-in - type names in the first part of this file. Instead we want to use *only* - the type names defined above. The following macro definitions insure - that if we *do* accidentally use some normal C language built-in type name, - we will get a syntax error. */ - -#define char bogus_type -#define short bogus_type -#define int bogus_type -#define long bogus_type -#define unsigned bogus_type -#define float bogus_type -#define double bogus_type - -#define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT) - -/* DIstructs are pairs of SItype values in the order determined by - LIBGCC2_WORDS_BIG_ENDIAN. */ - -#if LIBGCC2_WORDS_BIG_ENDIAN - struct DIstruct {SItype high, low;}; -#else - struct DIstruct {SItype low, high;}; -#endif - -/* We need this union to unpack/pack DImode values, since we don't have - any arithmetic yet. Incoming DImode parameters are stored into the - `ll' field, and the unpacked result is read from the struct `s'. */ - -typedef union -{ - struct DIstruct s; - DItype ll; -} DIunion; - -#if (defined (L_udivmoddi4) || defined (L_muldi3) || defined (L_udiv_w_sdiv)\ - || defined (L_divdi3) || defined (L_udivdi3) \ - || defined (L_moddi3) || defined (L_umoddi3)) - -#include "longlong.h" - -#endif /* udiv or mul */ - -extern DItype __fixunssfdi (SFtype a); -extern DItype __fixunsdfdi (DFtype a); -#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96 -extern DItype __fixunsxfdi (XFtype a); -#endif -#if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128 -extern DItype __fixunstfdi (TFtype a); -#endif - -#if defined (L_negdi2) || defined (L_divdi3) || defined (L_moddi3) -#if defined (L_divdi3) || defined (L_moddi3) -static inline -#endif -DItype -__negdi2 (DItype u) -{ - DIunion w; - DIunion uu; - - uu.ll = u; - - w.s.low = -uu.s.low; - w.s.high = -uu.s.high - ((USItype) w.s.low > 0); - - return w.ll; -} -#endif - -/* Unless shift functions are defined whith full ANSI prototypes, - parameter b will be promoted to int if word_type is smaller than an int. */ -#ifdef L_lshrdi3 -DItype -__lshrdi3 (DItype u, word_type b) -{ - DIunion w; - word_type bm; - DIunion uu; - - if (b == 0) - return u; - - uu.ll = u; - - bm = (sizeof (SItype) * BITS_PER_UNIT) - b; - if (bm <= 0) - { - w.s.high = 0; - w.s.low = (USItype)uu.s.high >> -bm; - } - else - { - USItype carries = (USItype)uu.s.high << bm; - w.s.high = (USItype)uu.s.high >> b; - w.s.low = ((USItype)uu.s.low >> b) | carries; - } - - return w.ll; -} -#endif - -#ifdef L_ashldi3 -DItype -__ashldi3 (DItype u, word_type b) -{ - DIunion w; - word_type bm; - DIunion uu; - - if (b == 0) - return u; - - uu.ll = u; - - bm = (sizeof (SItype) * BITS_PER_UNIT) - b; - if (bm <= 0) - { - w.s.low = 0; - w.s.high = (USItype)uu.s.low << -bm; - } - else - { - USItype carries = (USItype)uu.s.low >> bm; - w.s.low = (USItype)uu.s.low << b; - w.s.high = ((USItype)uu.s.high << b) | carries; - } - - return w.ll; -} -#endif - -#ifdef L_ashrdi3 -DItype -__ashrdi3 (DItype u, word_type b) -{ - DIunion w; - word_type bm; - DIunion uu; - - if (b == 0) - return u; - - uu.ll = u; - - bm = (sizeof (SItype) * BITS_PER_UNIT) - b; - if (bm <= 0) - { - /* w.s.high = 1..1 or 0..0 */ - w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1); - w.s.low = uu.s.high >> -bm; - } - else - { - USItype carries = (USItype)uu.s.high << bm; - w.s.high = uu.s.high >> b; - w.s.low = ((USItype)uu.s.low >> b) | carries; - } - - return w.ll; -} -#endif - -#ifdef L_ffsdi2 -DItype -__ffsdi2 (DItype u) -{ - DIunion uu, w; - uu.ll = u; - w.s.high = 0; - w.s.low = ffs (uu.s.low); - if (w.s.low != 0) - return w.ll; - w.s.low = ffs (uu.s.high); - if (w.s.low != 0) - { - w.s.low += BITS_PER_UNIT * sizeof (SItype); - return w.ll; - } - return w.ll; -} -#endif - -#ifdef L_muldi3 -DItype -__muldi3 (DItype u, DItype v) -{ - DIunion w; - DIunion uu, vv; - - uu.ll = u, - vv.ll = v; - - w.ll = __umulsidi3 (uu.s.low, vv.s.low); - w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high - + (USItype) uu.s.high * (USItype) vv.s.low); - - return w.ll; -} -#endif - -#ifdef L_udiv_w_sdiv -#if defined (sdiv_qrnnd) -USItype -__udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d) -{ - USItype q, r; - USItype c0, c1, b1; - - if ((SItype) d >= 0) - { - if (a1 < d - a1 - (a0 >> (SI_TYPE_SIZE - 1))) - { - /* dividend, divisor, and quotient are nonnegative */ - sdiv_qrnnd (q, r, a1, a0, d); - } - else - { - /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */ - sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (SI_TYPE_SIZE - 1)); - /* Divide (c1*2^32 + c0) by d */ - sdiv_qrnnd (q, r, c1, c0, d); - /* Add 2^31 to quotient */ - q += (USItype) 1 << (SI_TYPE_SIZE - 1); - } - } - else - { - b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */ - c1 = a1 >> 1; /* A/2 */ - c0 = (a1 << (SI_TYPE_SIZE - 1)) + (a0 >> 1); - - if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */ - { - sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ - - r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */ - if ((d & 1) != 0) - { - if (r >= q) - r = r - q; - else if (q - r <= d) - { - r = r - q + d; - q--; - } - else - { - r = r - q + 2*d; - q -= 2; - } - } - } - else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */ - { - c1 = (b1 - 1) - c1; - c0 = ~c0; /* logical NOT */ - - sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */ - - q = ~q; /* (A/2)/b1 */ - r = (b1 - 1) - r; - - r = 2*r + (a0 & 1); /* A/(2*b1) */ - - if ((d & 1) != 0) - { - if (r >= q) - r = r - q; - else if (q - r <= d) - { - r = r - q + d; - q--; - } - else - { - r = r - q + 2*d; - q -= 2; - } - } - } - else /* Implies c1 = b1 */ - { /* Hence a1 = d - 1 = 2*b1 - 1 */ - if (a0 >= -d) - { - q = -1; - r = a0 + d; - } - else - { - q = -2; - r = a0 + 2*d; - } - } - } - - *rp = r; - return q; -} -#else -/* If sdiv_qrnnd doesn't exist, define dummy __udiv_w_sdiv. */ -USItype -__udiv_w_sdiv (USItype *rp __attribute__ ((__unused__)), - USItype a1 __attribute__ ((__unused__)), - USItype a0 __attribute__ ((__unused__)), - USItype d __attribute__ ((__unused__))) -{ - return 0; -} -#endif -#endif - -#if (defined (L_udivdi3) || defined (L_divdi3) || \ - defined (L_umoddi3) || defined (L_moddi3)) -#define L_udivmoddi4 -#endif - -#ifdef L_udivmoddi4 -static const UQItype __clz_tab[] = -{ - 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -}; - -#if (defined (L_udivdi3) || defined (L_divdi3) || \ - defined (L_umoddi3) || defined (L_moddi3)) -static inline -#endif -UDItype -__udivmoddi4 (UDItype n, UDItype d, UDItype *rp) -{ - DIunion ww; - DIunion nn, dd; - DIunion rr; - USItype d0, d1, n0, n1, n2; - USItype q0, q1; - USItype b, bm; - - nn.ll = n; - dd.ll = d; - - d0 = dd.s.low; - d1 = dd.s.high; - n0 = nn.s.low; - n1 = nn.s.high; - -#if !UDIV_NEEDS_NORMALIZATION - if (d1 == 0) - { - if (d0 > n1) - { - /* 0q = nn / 0D */ - - udiv_qrnnd (q0, n0, n1, n0, d0); - q1 = 0; - - /* Remainder in n0. */ - } - else - { - /* qq = NN / 0d */ - - if (d0 == 0) - d0 = 1 / d0; /* Divide intentionally by zero. */ - - udiv_qrnnd (q1, n1, 0, n1, d0); - udiv_qrnnd (q0, n0, n1, n0, d0); - - /* Remainder in n0. */ - } - - if (rp != 0) - { - rr.s.low = n0; - rr.s.high = 0; - *rp = rr.ll; - } - } - -#else /* UDIV_NEEDS_NORMALIZATION */ - - if (d1 == 0) - { - if (d0 > n1) - { - /* 0q = nn / 0D */ - - count_leading_zeros (bm, d0); - - if (bm != 0) - { - /* Normalize, i.e. make the most significant bit of the - denominator set. */ - - d0 = d0 << bm; - n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm)); - n0 = n0 << bm; - } - - udiv_qrnnd (q0, n0, n1, n0, d0); - q1 = 0; - - /* Remainder in n0 >> bm. */ - } - else - { - /* qq = NN / 0d */ - - if (d0 == 0) - d0 = 1 / d0; /* Divide intentionally by zero. */ - - count_leading_zeros (bm, d0); - - if (bm == 0) - { - /* From (n1 >= d0) /\ (the most significant bit of d0 is set), - conclude (the most significant bit of n1 is set) /\ (the - leading quotient digit q1 = 1). - - This special case is necessary, not an optimization. - (Shifts counts of SI_TYPE_SIZE are undefined.) */ - - n1 -= d0; - q1 = 1; - } - else - { - /* Normalize. */ - - b = SI_TYPE_SIZE - bm; - - d0 = d0 << bm; - n2 = n1 >> b; - n1 = (n1 << bm) | (n0 >> b); - n0 = n0 << bm; - - udiv_qrnnd (q1, n1, n2, n1, d0); - } - - /* n1 != d0... */ - - udiv_qrnnd (q0, n0, n1, n0, d0); - - /* Remainder in n0 >> bm. */ - } - - if (rp != 0) - { - rr.s.low = n0 >> bm; - rr.s.high = 0; - *rp = rr.ll; - } - } -#endif /* UDIV_NEEDS_NORMALIZATION */ - - else - { - if (d1 > n1) - { - /* 00 = nn / DD */ - - q0 = 0; - q1 = 0; - - /* Remainder in n1n0. */ - if (rp != 0) - { - rr.s.low = n0; - rr.s.high = n1; - *rp = rr.ll; - } - } - else - { - /* 0q = NN / dd */ - - count_leading_zeros (bm, d1); - if (bm == 0) - { - /* From (n1 >= d1) /\ (the most significant bit of d1 is set), - conclude (the most significant bit of n1 is set) /\ (the - quotient digit q0 = 0 or 1). - - This special case is necessary, not an optimization. */ - - /* The condition on the next line takes advantage of that - n1 >= d1 (true due to program flow). */ - if (n1 > d1 || n0 >= d0) - { - q0 = 1; - sub_ddmmss (n1, n0, n1, n0, d1, d0); - } - else - q0 = 0; - - q1 = 0; - - if (rp != 0) - { - rr.s.low = n0; - rr.s.high = n1; - *rp = rr.ll; - } - } - else - { - USItype m1, m0; - /* Normalize. */ - - b = SI_TYPE_SIZE - bm; - - d1 = (d1 << bm) | (d0 >> b); - d0 = d0 << bm; - n2 = n1 >> b; - n1 = (n1 << bm) | (n0 >> b); - n0 = n0 << bm; - - udiv_qrnnd (q0, n1, n2, n1, d1); - umul_ppmm (m1, m0, q0, d0); - - if (m1 > n1 || (m1 == n1 && m0 > n0)) - { - q0--; - sub_ddmmss (m1, m0, m1, m0, d1, d0); - } - - q1 = 0; - - /* Remainder in (n1n0 - m1m0) >> bm. */ - if (rp != 0) - { - sub_ddmmss (n1, n0, n1, n0, m1, m0); - rr.s.low = (n1 << b) | (n0 >> bm); - rr.s.high = n1 >> bm; - *rp = rr.ll; - } - } - } - } - - ww.s.low = q0; - ww.s.high = q1; - return ww.ll; -} -#endif - -#ifdef L_divdi3 -UDItype __udivmoddi4 (); - -DItype -__divdi3 (DItype u, DItype v) -{ - word_type c = 0; - DIunion uu, vv; - DItype w; - - uu.ll = u; - vv.ll = v; - - if (uu.s.high < 0) - c = ~c, - uu.ll = __negdi2 (uu.ll); - if (vv.s.high < 0) - c = ~c, - vv.ll = __negdi2 (vv.ll); - - w = __udivmoddi4 (uu.ll, vv.ll, (UDItype *) 0); - if (c) - w = __negdi2 (w); - - return w; -} -#endif - -#ifdef L_moddi3 -UDItype __udivmoddi4 (); -DItype -__moddi3 (DItype u, DItype v) -{ - word_type c = 0; - DIunion uu, vv; - DItype w; - - uu.ll = u; - vv.ll = v; - - if (uu.s.high < 0) - c = ~c, - uu.ll = __negdi2 (uu.ll); - if (vv.s.high < 0) - vv.ll = __negdi2 (vv.ll); - - (void) __udivmoddi4 (uu.ll, vv.ll, &w); - if (c) - w = __negdi2 (w); - - return w; -} -#endif - -#ifdef L_umoddi3 -UDItype __udivmoddi4 (); -UDItype -__umoddi3 (UDItype u, UDItype v) -{ - UDItype w; - - (void) __udivmoddi4 (u, v, &w); - - return w; -} -#endif - -#ifdef L_udivdi3 -UDItype __udivmoddi4 (); -UDItype -__udivdi3 (UDItype n, UDItype d) -{ - return __udivmoddi4 (n, d, (UDItype *) 0); -} -#endif - -#ifdef L_cmpdi2 -word_type -__cmpdi2 (DItype a, DItype b) -{ - DIunion au, bu; - - au.ll = a, bu.ll = b; - - if (au.s.high < bu.s.high) - return 0; - else if (au.s.high > bu.s.high) - return 2; - if ((USItype) au.s.low < (USItype) bu.s.low) - return 0; - else if ((USItype) au.s.low > (USItype) bu.s.low) - return 2; - return 1; -} -#endif - -#ifdef L_ucmpdi2 -word_type -__ucmpdi2 (DItype a, DItype b) -{ - DIunion au, bu; - - au.ll = a, bu.ll = b; - - if ((USItype) au.s.high < (USItype) bu.s.high) - return 0; - else if ((USItype) au.s.high > (USItype) bu.s.high) - return 2; - if ((USItype) au.s.low < (USItype) bu.s.low) - return 0; - else if ((USItype) au.s.low > (USItype) bu.s.low) - return 2; - return 1; -} -#endif - -#if defined(L_fixunstfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128) -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -DItype -__fixunstfdi (TFtype a) -{ - TFtype b; - UDItype v; - - if (a < 0) - return 0; - - /* Compute high word of result, as a flonum. */ - b = (a / HIGH_WORD_COEFF); - /* Convert that to fixed (but not to DItype!), - and shift it into the high word. */ - v = (USItype) b; - v <<= WORD_SIZE; - /* Remove high part from the TFtype, leaving the low part as flonum. */ - a -= (TFtype)v; - /* Convert that to fixed (but not to DItype!) and add it in. - Sometimes A comes out negative. This is significant, since - A has more bits than a long int does. */ - if (a < 0) - v -= (USItype) (- a); - else - v += (USItype) a; - return v; -} -#endif - -#if defined(L_fixtfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128) -DItype -__fixtfdi (TFtype a) -{ - if (a < 0) - return - __fixunstfdi (-a); - return __fixunstfdi (a); -} -#endif - -#if defined(L_fixunsxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96) -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -DItype -__fixunsxfdi (XFtype a) -{ - XFtype b; - UDItype v; - - if (a < 0) - return 0; - - /* Compute high word of result, as a flonum. */ - b = (a / HIGH_WORD_COEFF); - /* Convert that to fixed (but not to DItype!), - and shift it into the high word. */ - v = (USItype) b; - v <<= WORD_SIZE; - /* Remove high part from the XFtype, leaving the low part as flonum. */ - a -= (XFtype)v; - /* Convert that to fixed (but not to DItype!) and add it in. - Sometimes A comes out negative. This is significant, since - A has more bits than a long int does. */ - if (a < 0) - v -= (USItype) (- a); - else - v += (USItype) a; - return v; -} -#endif - -#if defined(L_fixxfdi) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96) -DItype -__fixxfdi (XFtype a) -{ - if (a < 0) - return - __fixunsxfdi (-a); - return __fixunsxfdi (a); -} -#endif - -#ifdef L_fixunsdfdi -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -DItype -__fixunsdfdi (DFtype a) -{ - DFtype b; - UDItype v; - - if (a < 0) - return 0; - - /* Compute high word of result, as a flonum. */ - b = (a / HIGH_WORD_COEFF); - /* Convert that to fixed (but not to DItype!), - and shift it into the high word. */ - v = (USItype) b; - v <<= WORD_SIZE; - /* Remove high part from the DFtype, leaving the low part as flonum. */ - a -= (DFtype)v; - /* Convert that to fixed (but not to DItype!) and add it in. - Sometimes A comes out negative. This is significant, since - A has more bits than a long int does. */ - if (a < 0) - v -= (USItype) (- a); - else - v += (USItype) a; - return v; -} -#endif - -#ifdef L_fixdfdi -DItype -__fixdfdi (DFtype a) -{ - if (a < 0) - return - __fixunsdfdi (-a); - return __fixunsdfdi (a); -} -#endif - -#ifdef L_fixunssfdi -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -DItype -__fixunssfdi (SFtype original_a) -{ - /* Convert the SFtype to a DFtype, because that is surely not going - to lose any bits. Some day someone else can write a faster version - that avoids converting to DFtype, and verify it really works right. */ - DFtype a = original_a; - DFtype b; - UDItype v; - - if (a < 0) - return 0; - - /* Compute high word of result, as a flonum. */ - b = (a / HIGH_WORD_COEFF); - /* Convert that to fixed (but not to DItype!), - and shift it into the high word. */ - v = (USItype) b; - v <<= WORD_SIZE; - /* Remove high part from the DFtype, leaving the low part as flonum. */ - a -= (DFtype)v; - /* Convert that to fixed (but not to DItype!) and add it in. - Sometimes A comes out negative. This is significant, since - A has more bits than a long int does. */ - if (a < 0) - v -= (USItype) (- a); - else - v += (USItype) a; - return v; -} -#endif - -#ifdef L_fixsfdi -DItype -__fixsfdi (SFtype a) -{ - if (a < 0) - return - __fixunssfdi (-a); - return __fixunssfdi (a); -} -#endif - -#if defined(L_floatdixf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96) -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2)) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -XFtype -__floatdixf (DItype u) -{ - XFtype d; - - d = (SItype) (u >> WORD_SIZE); - d *= HIGH_HALFWORD_COEFF; - d *= HIGH_HALFWORD_COEFF; - d += (USItype) (u & (HIGH_WORD_COEFF - 1)); - - return d; -} -#endif - -#if defined(L_floatditf) && (LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128) -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2)) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -TFtype -__floatditf (DItype u) -{ - TFtype d; - - d = (SItype) (u >> WORD_SIZE); - d *= HIGH_HALFWORD_COEFF; - d *= HIGH_HALFWORD_COEFF; - d += (USItype) (u & (HIGH_WORD_COEFF - 1)); - - return d; -} -#endif - -#ifdef L_floatdidf -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2)) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) - -DFtype -__floatdidf (DItype u) -{ - DFtype d; - - d = (SItype) (u >> WORD_SIZE); - d *= HIGH_HALFWORD_COEFF; - d *= HIGH_HALFWORD_COEFF; - d += (USItype) (u & (HIGH_WORD_COEFF - 1)); - - return d; -} -#endif - -#ifdef L_floatdisf -#define WORD_SIZE (sizeof (SItype) * BITS_PER_UNIT) -#define HIGH_HALFWORD_COEFF (((UDItype) 1) << (WORD_SIZE / 2)) -#define HIGH_WORD_COEFF (((UDItype) 1) << WORD_SIZE) -#define DI_SIZE (sizeof (DItype) * BITS_PER_UNIT) - -/* Define codes for all the float formats that we know of. Note - that this is copied from real.h. */ - -#define UNKNOWN_FLOAT_FORMAT 0 -#define IEEE_FLOAT_FORMAT 1 -#define VAX_FLOAT_FORMAT 2 -#define IBM_FLOAT_FORMAT 3 - -/* Default to IEEE float if not specified. Nearly all machines use it. */ -#ifndef HOST_FLOAT_FORMAT -#define HOST_FLOAT_FORMAT IEEE_FLOAT_FORMAT -#endif - -#if HOST_FLOAT_FORMAT == IEEE_FLOAT_FORMAT -#define DF_SIZE 53 -#define SF_SIZE 24 -#endif - -#if HOST_FLOAT_FORMAT == IBM_FLOAT_FORMAT -#define DF_SIZE 56 -#define SF_SIZE 24 -#endif - -#if HOST_FLOAT_FORMAT == VAX_FLOAT_FORMAT -#define DF_SIZE 56 -#define SF_SIZE 24 -#endif - -SFtype -__floatdisf (DItype u) -{ - /* Do the calculation in DFmode - so that we don't lose any of the precision of the high word - while multiplying it. */ - DFtype f; - - /* Protect against double-rounding error. - Represent any low-order bits, that might be truncated in DFmode, - by a bit that won't be lost. The bit can go in anywhere below the - rounding position of the SFmode. A fixed mask and bit position - handles all usual configurations. It doesn't handle the case - of 128-bit DImode, however. */ - if (DF_SIZE < DI_SIZE - && DF_SIZE > (DI_SIZE - DF_SIZE + SF_SIZE)) - { -#define REP_BIT ((USItype) 1 << (DI_SIZE - DF_SIZE)) - if (! (- ((DItype) 1 << DF_SIZE) < u - && u < ((DItype) 1 << DF_SIZE))) - { - if ((USItype) u & (REP_BIT - 1)) - u |= REP_BIT; - } - } - f = (SItype) (u >> WORD_SIZE); - f *= HIGH_HALFWORD_COEFF; - f *= HIGH_HALFWORD_COEFF; - f += (USItype) (u & (HIGH_WORD_COEFF - 1)); - - return (SFtype) f; -} -#endif - -#if defined(L_fixunsxfsi) && LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 96 -/* Reenable the normal types, in case limits.h needs them. */ -#undef char -#undef short -#undef int -#undef long -#undef unsigned -#undef float -#undef double -#undef MIN -#undef MAX -#include - -USItype -__fixunsxfsi (XFtype a) -{ - if (a >= - (DFtype) LONG_MIN) - return (SItype) (a + LONG_MIN) - LONG_MIN; - return (SItype) a; -} -#endif - -#ifdef L_fixunsdfsi -/* Reenable the normal types, in case limits.h needs them. */ -#undef char -#undef short -#undef int -#undef long -#undef unsigned -#undef float -#undef double -#undef MIN -#undef MAX -#include - -USItype -__fixunsdfsi (DFtype a) -{ - if (a >= - (DFtype) LONG_MIN) - return (SItype) (a + LONG_MIN) - LONG_MIN; - return (SItype) a; -} -#endif - -#ifdef L_fixunssfsi -/* Reenable the normal types, in case limits.h needs them. */ -#undef char -#undef short -#undef int -#undef long -#undef unsigned -#undef float -#undef double -#undef MIN -#undef MAX -#include - -USItype -__fixunssfsi (SFtype a) -{ - if (a >= - (SFtype) LONG_MIN) - return (SItype) (a + LONG_MIN) - LONG_MIN; - return (SItype) a; -} -#endif - -/* From here on down, the routines use normal data types. */ - -#define SItype bogus_type -#define USItype bogus_type -#define DItype bogus_type -#define UDItype bogus_type -#define SFtype bogus_type -#define DFtype bogus_type - -#undef char -#undef short -#undef int -#undef long -#undef unsigned -#undef float -#undef double - -#ifdef L__gcc_bcmp - -/* Like bcmp except the sign is meaningful. - Result is negative if S1 is less than S2, - positive if S1 is greater, 0 if S1 and S2 are equal. */ - -int -__gcc_bcmp (unsigned char *s1, unsigned char *s2, size_t size) -{ - while (size > 0) - { - unsigned char c1 = *s1++, c2 = *s2++; - if (c1 != c2) - return c1 - c2; - size--; - } - return 0; -} - -#endif - -#ifdef L__dummy -void -__dummy () {} -#endif - -#ifdef L_varargs -#ifdef __i860__ -#if defined(__svr4__) || defined(__alliant__) - asm (" .text"); - asm (" .align 4"); - -/* The Alliant needs the added underscore. */ - asm (".globl __builtin_saveregs"); -asm ("__builtin_saveregs:"); - asm (".globl ___builtin_saveregs"); -asm ("___builtin_saveregs:"); - - asm (" andnot 0x0f,%sp,%sp"); /* round down to 16-byte boundary */ - asm (" adds -96,%sp,%sp"); /* allocate stack space for reg save - area and also for a new va_list - structure */ - /* Save all argument registers in the arg reg save area. The - arg reg save area must have the following layout (according - to the svr4 ABI): - - struct { - union { - float freg[8]; - double dreg[4]; - } float_regs; - long ireg[12]; - }; - */ - - asm (" fst.q %f8, 0(%sp)"); /* save floating regs (f8-f15) */ - asm (" fst.q %f12,16(%sp)"); - - asm (" st.l %r16,32(%sp)"); /* save integer regs (r16-r27) */ - asm (" st.l %r17,36(%sp)"); - asm (" st.l %r18,40(%sp)"); - asm (" st.l %r19,44(%sp)"); - asm (" st.l %r20,48(%sp)"); - asm (" st.l %r21,52(%sp)"); - asm (" st.l %r22,56(%sp)"); - asm (" st.l %r23,60(%sp)"); - asm (" st.l %r24,64(%sp)"); - asm (" st.l %r25,68(%sp)"); - asm (" st.l %r26,72(%sp)"); - asm (" st.l %r27,76(%sp)"); - - asm (" adds 80,%sp,%r16"); /* compute the address of the new - va_list structure. Put in into - r16 so that it will be returned - to the caller. */ - - /* Initialize all fields of the new va_list structure. This - structure looks like: - - typedef struct { - unsigned long ireg_used; - unsigned long freg_used; - long *reg_base; - long *mem_ptr; - } va_list; - */ - - asm (" st.l %r0, 0(%r16)"); /* nfixed */ - asm (" st.l %r0, 4(%r16)"); /* nfloating */ - asm (" st.l %sp, 8(%r16)"); /* __va_ctl points to __va_struct. */ - asm (" bri %r1"); /* delayed return */ - asm (" st.l %r28,12(%r16)"); /* pointer to overflow args */ - -#else /* not __svr4__ */ -#if defined(__PARAGON__) - /* - * we'll use SVR4-ish varargs but need SVR3.2 assembler syntax, - * and we stand a better chance of hooking into libraries - * compiled by PGI. [andyp@ssd.intel.com] - */ - asm (" .text"); - asm (" .align 4"); - asm (".globl __builtin_saveregs"); -asm ("__builtin_saveregs:"); - asm (".globl ___builtin_saveregs"); -asm ("___builtin_saveregs:"); - - asm (" andnot 0x0f,sp,sp"); /* round down to 16-byte boundary */ - asm (" adds -96,sp,sp"); /* allocate stack space for reg save - area and also for a new va_list - structure */ - /* Save all argument registers in the arg reg save area. The - arg reg save area must have the following layout (according - to the svr4 ABI): - - struct { - union { - float freg[8]; - double dreg[4]; - } float_regs; - long ireg[12]; - }; - */ - - asm (" fst.q f8, 0(sp)"); - asm (" fst.q f12,16(sp)"); - asm (" st.l r16,32(sp)"); - asm (" st.l r17,36(sp)"); - asm (" st.l r18,40(sp)"); - asm (" st.l r19,44(sp)"); - asm (" st.l r20,48(sp)"); - asm (" st.l r21,52(sp)"); - asm (" st.l r22,56(sp)"); - asm (" st.l r23,60(sp)"); - asm (" st.l r24,64(sp)"); - asm (" st.l r25,68(sp)"); - asm (" st.l r26,72(sp)"); - asm (" st.l r27,76(sp)"); - - asm (" adds 80,sp,r16"); /* compute the address of the new - va_list structure. Put in into - r16 so that it will be returned - to the caller. */ - - /* Initialize all fields of the new va_list structure. This - structure looks like: - - typedef struct { - unsigned long ireg_used; - unsigned long freg_used; - long *reg_base; - long *mem_ptr; - } va_list; - */ - - asm (" st.l r0, 0(r16)"); /* nfixed */ - asm (" st.l r0, 4(r16)"); /* nfloating */ - asm (" st.l sp, 8(r16)"); /* __va_ctl points to __va_struct. */ - asm (" bri r1"); /* delayed return */ - asm (" st.l r28,12(r16)"); /* pointer to overflow args */ -#else /* not __PARAGON__ */ - asm (" .text"); - asm (" .align 4"); - - asm (".globl ___builtin_saveregs"); - asm ("___builtin_saveregs:"); - asm (" mov sp,r30"); - asm (" andnot 0x0f,sp,sp"); - asm (" adds -96,sp,sp"); /* allocate sufficient space on the stack */ - -/* Fill in the __va_struct. */ - asm (" st.l r16, 0(sp)"); /* save integer regs (r16-r27) */ - asm (" st.l r17, 4(sp)"); /* int fixed[12] */ - asm (" st.l r18, 8(sp)"); - asm (" st.l r19,12(sp)"); - asm (" st.l r20,16(sp)"); - asm (" st.l r21,20(sp)"); - asm (" st.l r22,24(sp)"); - asm (" st.l r23,28(sp)"); - asm (" st.l r24,32(sp)"); - asm (" st.l r25,36(sp)"); - asm (" st.l r26,40(sp)"); - asm (" st.l r27,44(sp)"); - - asm (" fst.q f8, 48(sp)"); /* save floating regs (f8-f15) */ - asm (" fst.q f12,64(sp)"); /* int floating[8] */ - -/* Fill in the __va_ctl. */ - asm (" st.l sp, 80(sp)"); /* __va_ctl points to __va_struct. */ - asm (" st.l r28,84(sp)"); /* pointer to more args */ - asm (" st.l r0, 88(sp)"); /* nfixed */ - asm (" st.l r0, 92(sp)"); /* nfloating */ - - asm (" adds 80,sp,r16"); /* return address of the __va_ctl. */ - asm (" bri r1"); - asm (" mov r30,sp"); - /* recover stack and pass address to start - of data. */ -#endif /* not __PARAGON__ */ -#endif /* not __svr4__ */ -#else /* not __i860__ */ -#ifdef __sparc__ - asm (".global __builtin_saveregs"); - asm ("__builtin_saveregs:"); - asm (".global ___builtin_saveregs"); - asm ("___builtin_saveregs:"); -#ifdef NEED_PROC_COMMAND - asm (".proc 020"); -#endif - asm ("st %i0,[%fp+68]"); - asm ("st %i1,[%fp+72]"); - asm ("st %i2,[%fp+76]"); - asm ("st %i3,[%fp+80]"); - asm ("st %i4,[%fp+84]"); - asm ("retl"); - asm ("st %i5,[%fp+88]"); -#ifdef NEED_TYPE_COMMAND - asm (".type __builtin_saveregs,#function"); - asm (".size __builtin_saveregs,.-__builtin_saveregs"); -#endif -#else /* not __sparc__ */ -#if defined(__MIPSEL__) | defined(__R3000__) | defined(__R2000__) | defined(__mips__) - - asm (" .text"); -#ifdef __mips16 - asm (" .set nomips16"); -#endif - asm (" .ent __builtin_saveregs"); - asm (" .globl __builtin_saveregs"); - asm ("__builtin_saveregs:"); - asm (" sw $4,0($30)"); - asm (" sw $5,4($30)"); - asm (" sw $6,8($30)"); - asm (" sw $7,12($30)"); - asm (" j $31"); - asm (" .end __builtin_saveregs"); -#else /* not __mips__, etc. */ - -void * -__builtin_saveregs () -{ - abort (); -} - -#endif /* not __mips__ */ -#endif /* not __sparc__ */ -#endif /* not __i860__ */ -#endif - -#ifdef L_eprintf -#ifndef inhibit_libc - -#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */ -#include -/* This is used by the `assert' macro. */ -extern void __eprintf (const char *, const char *, unsigned int, const char *) - __attribute__ ((__noreturn__)); - -void -__eprintf (const char *string, const char *expression, - unsigned int line, const char *filename) -{ - fprintf (stderr, string, expression, line, filename); - fflush (stderr); - abort (); -} - -#endif -#endif - -#ifdef L_bb - -/* Structure emitted by -a */ -struct bb -{ - long zero_word; - const char *filename; - long *counts; - long ncounts; - struct bb *next; - const unsigned long *addresses; - - /* Older GCC's did not emit these fields. */ - long nwords; - const char **functions; - const long *line_nums; - const char **filenames; - char *flags; -}; - -#ifdef BLOCK_PROFILER_CODE -BLOCK_PROFILER_CODE -#else -#ifndef inhibit_libc - -/* Simple minded basic block profiling output dumper for - systems that don't provide tcov support. At present, - it requires atexit and stdio. */ - -#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */ -#include -char *ctime (); - -#include "gbl-ctors.h" -#include "gcov-io.h" -#include - -static struct bb *bb_head; - -/* Return the number of digits needed to print a value */ -/* __inline__ */ static int num_digits (long value, int base) -{ - int minus = (value < 0 && base != 16); - unsigned long v = (minus) ? -value : value; - int ret = minus; - - do - { - v /= base; - ret++; - } - while (v); - - return ret; -} - -void -__bb_exit_func (void) -{ - FILE *da_file, *file; - long time_value; - int i; - - if (bb_head == 0) - return; - - i = strlen (bb_head->filename) - 3; - - if (!strcmp (bb_head->filename+i, ".da")) - { - /* Must be -fprofile-arcs not -a. - Dump data in a form that gcov expects. */ - - struct bb *ptr; - - for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next) - { - /* If the file exists, and the number of counts in it is the same, - then merge them in. */ - - if ((da_file = fopen (ptr->filename, "r")) != 0) - { - long n_counts = 0; - - if (__read_long (&n_counts, da_file, 8) != 0) - { - fprintf (stderr, "arc profiling: Can't read output file %s.\n", - ptr->filename); - continue; - } - - if (n_counts == ptr->ncounts) - { - int i; - - for (i = 0; i < n_counts; i++) - { - long v = 0; - - if (__read_long (&v, da_file, 8) != 0) - { - fprintf (stderr, "arc profiling: Can't read output file %s.\n", - ptr->filename); - break; - } - ptr->counts[i] += v; - } - } - - if (fclose (da_file) == EOF) - fprintf (stderr, "arc profiling: Error closing output file %s.\n", - ptr->filename); - } - if ((da_file = fopen (ptr->filename, "w")) == 0) - { - fprintf (stderr, "arc profiling: Can't open output file %s.\n", - ptr->filename); - continue; - } - - /* ??? Should first write a header to the file. Preferably, a 4 byte - magic number, 4 bytes containing the time the program was - compiled, 4 bytes containing the last modification time of the - source file, and 4 bytes indicating the compiler options used. - - That way we can easily verify that the proper source/executable/ - data file combination is being used from gcov. */ - - if (__write_long (ptr->ncounts, da_file, 8) != 0) - { - - fprintf (stderr, "arc profiling: Error writing output file %s.\n", - ptr->filename); - } - else - { - int j; - long *count_ptr = ptr->counts; - int ret = 0; - for (j = ptr->ncounts; j > 0; j--) - { - if (__write_long (*count_ptr, da_file, 8) != 0) - { - ret=1; - break; - } - count_ptr++; - } - if (ret) - fprintf (stderr, "arc profiling: Error writing output file %s.\n", - ptr->filename); - } - - if (fclose (da_file) == EOF) - fprintf (stderr, "arc profiling: Error closing output file %s.\n", - ptr->filename); - } - - return; - } - - /* Must be basic block profiling. Emit a human readable output file. */ - - file = fopen ("bb.out", "a"); - - if (!file) - perror ("bb.out"); - - else - { - struct bb *ptr; - - /* This is somewhat type incorrect, but it avoids worrying about - exactly where time.h is included from. It should be ok unless - a void * differs from other pointer formats, or if sizeof (long) - is < sizeof (time_t). It would be nice if we could assume the - use of rationale standards here. */ - - time ((void *) &time_value); - fprintf (file, "Basic block profiling finished on %s\n", ctime ((void *) &time_value)); - - /* We check the length field explicitly in order to allow compatibility - with older GCC's which did not provide it. */ - - for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next) - { - int i; - int func_p = (ptr->nwords >= sizeof (struct bb) - && ptr->nwords <= 1000 - && ptr->functions); - int line_p = (func_p && ptr->line_nums); - int file_p = (func_p && ptr->filenames); - int addr_p = (ptr->addresses != 0); - long ncounts = ptr->ncounts; - long cnt_max = 0; - long line_max = 0; - long addr_max = 0; - int file_len = 0; - int func_len = 0; - int blk_len = num_digits (ncounts, 10); - int cnt_len; - int line_len; - int addr_len; - - fprintf (file, "File %s, %ld basic blocks \n\n", - ptr->filename, ncounts); - - /* Get max values for each field. */ - for (i = 0; i < ncounts; i++) - { - const char *p; - int len; - - if (cnt_max < ptr->counts[i]) - cnt_max = ptr->counts[i]; - - if (addr_p && addr_max < ptr->addresses[i]) - addr_max = ptr->addresses[i]; - - if (line_p && line_max < ptr->line_nums[i]) - line_max = ptr->line_nums[i]; - - if (func_p) - { - p = (ptr->functions[i]) ? (ptr->functions[i]) : ""; - len = strlen (p); - if (func_len < len) - func_len = len; - } - - if (file_p) - { - p = (ptr->filenames[i]) ? (ptr->filenames[i]) : ""; - len = strlen (p); - if (file_len < len) - file_len = len; - } - } - - addr_len = num_digits (addr_max, 16); - cnt_len = num_digits (cnt_max, 10); - line_len = num_digits (line_max, 10); - - /* Now print out the basic block information. */ - for (i = 0; i < ncounts; i++) - { - fprintf (file, - " Block #%*d: executed %*ld time(s)", - blk_len, i+1, - cnt_len, ptr->counts[i]); - - if (addr_p) - fprintf (file, " address= 0x%.*lx", addr_len, - ptr->addresses[i]); - - if (func_p) - fprintf (file, " function= %-*s", func_len, - (ptr->functions[i]) ? ptr->functions[i] : ""); - - if (line_p) - fprintf (file, " line= %*ld", line_len, ptr->line_nums[i]); - - if (file_p) - fprintf (file, " file= %s", - (ptr->filenames[i]) ? ptr->filenames[i] : ""); - - fprintf (file, "\n"); - } - - fprintf (file, "\n"); - fflush (file); - } - - fprintf (file, "\n\n"); - fclose (file); - } -} - -void -__bb_init_func (struct bb *blocks) -{ - /* User is supposed to check whether the first word is non-0, - but just in case.... */ - - if (blocks->zero_word) - return; - -#ifdef ON_EXIT - /* Initialize destructor. */ - if (!bb_head) - ON_EXIT (__bb_exit_func, 0); -#endif - - /* Set up linked list. */ - blocks->zero_word = 1; - blocks->next = bb_head; - bb_head = blocks; -} - -#ifndef MACHINE_STATE_SAVE -#define MACHINE_STATE_SAVE(ID) -#endif -#ifndef MACHINE_STATE_RESTORE -#define MACHINE_STATE_RESTORE(ID) -#endif - -/* Number of buckets in hashtable of basic block addresses. */ - -#define BB_BUCKETS 311 - -/* Maximum length of string in file bb.in. */ - -#define BBINBUFSIZE 500 - -/* BBINBUFSIZE-1 with double quotes. We could use #BBINBUFSIZE or - "BBINBUFSIZE" but want to avoid trouble with preprocessors. */ - -#define BBINBUFSIZESTR "499" - -struct bb_edge -{ - struct bb_edge *next; - unsigned long src_addr; - unsigned long dst_addr; - unsigned long count; -}; - -enum bb_func_mode -{ - TRACE_KEEP = 0, TRACE_ON = 1, TRACE_OFF = 2 -}; - -struct bb_func -{ - struct bb_func *next; - char *funcname; - char *filename; - enum bb_func_mode mode; -}; - -/* This is the connection to the outside world. - The BLOCK_PROFILER macro must set __bb.blocks - and __bb.blockno. */ - -struct { - unsigned long blockno; - struct bb *blocks; -} __bb; - -/* Vars to store addrs of source and destination basic blocks - of a jump. */ - -static unsigned long bb_src = 0; -static unsigned long bb_dst = 0; - -static FILE *bb_tracefile = (FILE *) 0; -static struct bb_edge **bb_hashbuckets = (struct bb_edge **) 0; -static struct bb_func *bb_func_head = (struct bb_func *) 0; -static unsigned long bb_callcount = 0; -static int bb_mode = 0; - -static unsigned long *bb_stack = (unsigned long *) 0; -static size_t bb_stacksize = 0; - -static int reported = 0; - -/* Trace modes: -Always : Print execution frequencies of basic blocks - to file bb.out. -bb_mode & 1 != 0 : Dump trace of basic blocks to file bbtrace[.gz] -bb_mode & 2 != 0 : Print jump frequencies to file bb.out. -bb_mode & 4 != 0 : Cut call instructions from basic block flow. -bb_mode & 8 != 0 : Insert return instructions in basic block flow. -*/ - -#ifdef HAVE_POPEN - -/*#include */ -#include -/*#include */ - -/* Commands executed by gopen. */ - -#define GOPENDECOMPRESS "gzip -cd " -#define GOPENCOMPRESS "gzip -c >" - -/* Like fopen but pipes through gzip. mode may only be "r" or "w". - If it does not compile, simply replace gopen by fopen and delete - '.gz' from any first parameter to gopen. */ - -static FILE * -gopen (char *fn, char *mode) -{ - int use_gzip; - char *p; - - if (mode[1]) - return (FILE *) 0; - - if (mode[0] != 'r' && mode[0] != 'w') - return (FILE *) 0; - - p = fn + strlen (fn)-1; - use_gzip = ((p[-1] == '.' && (p[0] == 'Z' || p[0] == 'z')) - || (p[-2] == '.' && p[-1] == 'g' && p[0] == 'z')); - - if (use_gzip) - { - if (mode[0]=='r') - { - FILE *f; - char *s = (char *) malloc (sizeof (char) * strlen (fn) - + sizeof (GOPENDECOMPRESS)); - strcpy (s, GOPENDECOMPRESS); - strcpy (s + (sizeof (GOPENDECOMPRESS)-1), fn); - f = popen (s, mode); - free (s); - return f; - } - - else - { - FILE *f; - char *s = (char *) malloc (sizeof (char) * strlen (fn) - + sizeof (GOPENCOMPRESS)); - strcpy (s, GOPENCOMPRESS); - strcpy (s + (sizeof (GOPENCOMPRESS)-1), fn); - if (!(f = popen (s, mode))) - f = fopen (s, mode); - free (s); - return f; - } - } - - else - return fopen (fn, mode); -} - -static int -gclose (FILE *f) -{ - struct stat buf; - - if (f != 0) - { - if (!fstat (fileno (f), &buf) && S_ISFIFO (buf.st_mode)) - return pclose (f); - - return fclose (f); - } - return 0; -} - -#endif /* HAVE_POPEN */ - -/* Called once per program. */ - -static void -__bb_exit_trace_func () -{ - FILE *file = fopen ("bb.out", "a"); - struct bb_func *f; - struct bb *b; - - if (!file) - perror ("bb.out"); - - if (bb_mode & 1) - { - if (!bb_tracefile) - perror ("bbtrace"); - else -#ifdef HAVE_POPEN - gclose (bb_tracefile); -#else - fclose (bb_tracefile); -#endif /* HAVE_POPEN */ - } - - /* Check functions in `bb.in'. */ - - if (file) - { - long time_value; - const struct bb_func *p; - int printed_something = 0; - struct bb *ptr; - long blk; - - /* This is somewhat type incorrect. */ - time ((void *) &time_value); - - for (p = bb_func_head; p != (struct bb_func *) 0; p = p->next) - { - for (ptr = bb_head; ptr != (struct bb *) 0; ptr = ptr->next) - { - if (!ptr->filename || (p->filename != (char *) 0 && strcmp (p->filename, ptr->filename))) - continue; - for (blk = 0; blk < ptr->ncounts; blk++) - { - if (!strcmp (p->funcname, ptr->functions[blk])) - goto found; - } - } - - if (!printed_something) - { - fprintf (file, "Functions in `bb.in' not executed during basic block profiling on %s\n", ctime ((void *) &time_value)); - printed_something = 1; - } - - fprintf (file, "\tFunction %s", p->funcname); - if (p->filename) - fprintf (file, " of file %s", p->filename); - fprintf (file, "\n" ); - -found: ; - } - - if (printed_something) - fprintf (file, "\n"); - - } - - if (bb_mode & 2) - { - if (!bb_hashbuckets) - { - if (!reported) - { - fprintf (stderr, "Profiler: out of memory\n"); - reported = 1; - } - return; - } - - else if (file) - { - long time_value; - int i; - unsigned long addr_max = 0; - unsigned long cnt_max = 0; - int cnt_len; - int addr_len; - - /* This is somewhat type incorrect, but it avoids worrying about - exactly where time.h is included from. It should be ok unless - a void * differs from other pointer formats, or if sizeof (long) - is < sizeof (time_t). It would be nice if we could assume the - use of rationale standards here. */ - - time ((void *) &time_value); - fprintf (file, "Basic block jump tracing"); - - switch (bb_mode & 12) - { - case 0: - fprintf (file, " (with call)"); - break; - - case 4: - /* Print nothing. */ - break; - - case 8: - fprintf (file, " (with call & ret)"); - break; - - case 12: - fprintf (file, " (with ret)"); - break; - } - - fprintf (file, " finished on %s\n", ctime ((void *) &time_value)); - - for (i = 0; i < BB_BUCKETS; i++) - { - struct bb_edge *bucket = bb_hashbuckets[i]; - for ( ; bucket; bucket = bucket->next ) - { - if (addr_max < bucket->src_addr) - addr_max = bucket->src_addr; - if (addr_max < bucket->dst_addr) - addr_max = bucket->dst_addr; - if (cnt_max < bucket->count) - cnt_max = bucket->count; - } - } - addr_len = num_digits (addr_max, 16); - cnt_len = num_digits (cnt_max, 10); - - for ( i = 0; i < BB_BUCKETS; i++) - { - struct bb_edge *bucket = bb_hashbuckets[i]; - for ( ; bucket; bucket = bucket->next ) - { - fprintf (file, "Jump from block 0x%.*lx to " - "block 0x%.*lx executed %*lu time(s)\n", - addr_len, bucket->src_addr, - addr_len, bucket->dst_addr, - cnt_len, bucket->count); - } - } - - fprintf (file, "\n"); - - } - } - - if (file) - fclose (file); - - /* Free allocated memory. */ - - f = bb_func_head; - while (f) - { - struct bb_func *old = f; - - f = f->next; - if (old->funcname) free (old->funcname); - if (old->filename) free (old->filename); - free (old); - } - - if (bb_stack) - free (bb_stack); - - if (bb_hashbuckets) - { - int i; - - for (i = 0; i < BB_BUCKETS; i++) - { - struct bb_edge *old, *bucket = bb_hashbuckets[i]; - - while (bucket) - { - old = bucket; - bucket = bucket->next; - free (old); - } - } - free (bb_hashbuckets); - } - - for (b = bb_head; b; b = b->next) - if (b->flags) free (b->flags); -} - -/* Called once per program. */ - -static void -__bb_init_prg () -{ - - FILE *file; - char buf[BBINBUFSIZE]; - const char *p; - const char *pos; - enum bb_func_mode m; - -#ifdef ON_EXIT - /* Initialize destructor. */ - ON_EXIT (__bb_exit_func, 0); -#endif - - if (!(file = fopen ("bb.in", "r"))) - return; - - while(fscanf (file, " %" BBINBUFSIZESTR "s ", buf) != EOF) - { - p = buf; - if (*p == '-') - { - m = TRACE_OFF; - p++; - } - else - { - m = TRACE_ON; - } - if (!strcmp (p, "__bb_trace__")) - bb_mode |= 1; - else if (!strcmp (p, "__bb_jumps__")) - bb_mode |= 2; - else if (!strcmp (p, "__bb_hidecall__")) - bb_mode |= 4; - else if (!strcmp (p, "__bb_showret__")) - bb_mode |= 8; - else - { - struct bb_func *f = (struct bb_func *) malloc (sizeof (struct bb_func)); - if (f) - { - unsigned long l; - f->next = bb_func_head; - if ((pos = strchr (p, ':'))) - { - if (!(f->funcname = (char *) malloc (strlen (pos+1)+1))) - continue; - strcpy (f->funcname, pos+1); - l = pos-p; - if ((f->filename = (char *) malloc (l+1))) - { - strncpy (f->filename, p, l); - f->filename[l] = '\0'; - } - else - f->filename = (char *) 0; - } - else - { - if (!(f->funcname = (char *) malloc (strlen (p)+1))) - continue; - strcpy (f->funcname, p); - f->filename = (char *) 0; - } - f->mode = m; - bb_func_head = f; - } - } - } - fclose (file); - -#ifdef HAVE_POPEN - - if (bb_mode & 1) - bb_tracefile = gopen ("bbtrace.gz", "w"); - -#else - - if (bb_mode & 1) - bb_tracefile = fopen ("bbtrace", "w"); - -#endif /* HAVE_POPEN */ - - if (bb_mode & 2) - { - bb_hashbuckets = (struct bb_edge **) - malloc (BB_BUCKETS * sizeof (struct bb_edge *)); - if (bb_hashbuckets) - memset (bb_hashbuckets, 0, BB_BUCKETS * sizeof (struct bb_edge *)); - } - - if (bb_mode & 12) - { - bb_stacksize = 10; - bb_stack = (unsigned long *) malloc (bb_stacksize * sizeof (*bb_stack)); - } - -#ifdef ON_EXIT - /* Initialize destructor. */ - ON_EXIT (__bb_exit_trace_func, 0); -#endif - -} - -/* Called upon entering a basic block. */ - -void -__bb_trace_func () -{ - struct bb_edge *bucket; - - MACHINE_STATE_SAVE("1") - - if (!bb_callcount || (__bb.blocks->flags && (__bb.blocks->flags[__bb.blockno] & TRACE_OFF))) - goto skip; - - bb_dst = __bb.blocks->addresses[__bb.blockno]; - __bb.blocks->counts[__bb.blockno]++; - - if (bb_tracefile) - { - fwrite (&bb_dst, sizeof (unsigned long), 1, bb_tracefile); - } - - if (bb_hashbuckets) - { - struct bb_edge **startbucket, **oldnext; - - oldnext = startbucket - = & bb_hashbuckets[ (((int) bb_src*8) ^ (int) bb_dst) % BB_BUCKETS ]; - bucket = *startbucket; - - for (bucket = *startbucket; bucket; - oldnext = &(bucket->next), bucket = *oldnext) - { - if (bucket->src_addr == bb_src - && bucket->dst_addr == bb_dst) - { - bucket->count++; - *oldnext = bucket->next; - bucket->next = *startbucket; - *startbucket = bucket; - goto ret; - } - } - - bucket = (struct bb_edge *) malloc (sizeof (struct bb_edge)); - - if (!bucket) - { - if (!reported) - { - fprintf (stderr, "Profiler: out of memory\n"); - reported = 1; - } - } - - else - { - bucket->src_addr = bb_src; - bucket->dst_addr = bb_dst; - bucket->next = *startbucket; - *startbucket = bucket; - bucket->count = 1; - } - } - -ret: - bb_src = bb_dst; - -skip: - ; - - MACHINE_STATE_RESTORE("1") - -} - -/* Called when returning from a function and `__bb_showret__' is set. */ - -static void -__bb_trace_func_ret () -{ - struct bb_edge *bucket; - - if (!bb_callcount || (__bb.blocks->flags && (__bb.blocks->flags[__bb.blockno] & TRACE_OFF))) - goto skip; - - if (bb_hashbuckets) - { - struct bb_edge **startbucket, **oldnext; - - oldnext = startbucket - = & bb_hashbuckets[ (((int) bb_dst * 8) ^ (int) bb_src) % BB_BUCKETS ]; - bucket = *startbucket; - - for (bucket = *startbucket; bucket; - oldnext = &(bucket->next), bucket = *oldnext) - { - if (bucket->src_addr == bb_dst - && bucket->dst_addr == bb_src) - { - bucket->count++; - *oldnext = bucket->next; - bucket->next = *startbucket; - *startbucket = bucket; - goto ret; - } - } - - bucket = (struct bb_edge *) malloc (sizeof (struct bb_edge)); - - if (!bucket) - { - if (!reported) - { - fprintf (stderr, "Profiler: out of memory\n"); - reported = 1; - } - } - - else - { - bucket->src_addr = bb_dst; - bucket->dst_addr = bb_src; - bucket->next = *startbucket; - *startbucket = bucket; - bucket->count = 1; - } - } - -ret: - bb_dst = bb_src; - -skip: - ; - -} - -/* Called upon entering the first function of a file. */ - -static void -__bb_init_file (struct bb *blocks) -{ - - const struct bb_func *p; - long blk, ncounts = blocks->ncounts; - const char **functions = blocks->functions; - - /* Set up linked list. */ - blocks->zero_word = 1; - blocks->next = bb_head; - bb_head = blocks; - - blocks->flags = 0; - if (!bb_func_head - || !(blocks->flags = (char *) malloc (sizeof (char) * blocks->ncounts))) - return; - - for (blk = 0; blk < ncounts; blk++) - blocks->flags[blk] = 0; - - for (blk = 0; blk < ncounts; blk++) - { - for (p = bb_func_head; p; p = p->next) - { - if (!strcmp (p->funcname, functions[blk]) - && (!p->filename || !strcmp (p->filename, blocks->filename))) - { - blocks->flags[blk] |= p->mode; - } - } - } - -} - -/* Called when exiting from a function. */ - -void -__bb_trace_ret () -{ - - MACHINE_STATE_SAVE("2") - - if (bb_callcount) - { - if ((bb_mode & 12) && bb_stacksize > bb_callcount) - { - bb_src = bb_stack[bb_callcount]; - if (bb_mode & 8) - __bb_trace_func_ret (); - } - - bb_callcount -= 1; - } - - MACHINE_STATE_RESTORE("2") - -} - -/* Called when entering a function. */ - -void -__bb_init_trace_func (struct bb *blocks, unsigned long blockno) -{ - static int trace_init = 0; - - MACHINE_STATE_SAVE("3") - - if (!blocks->zero_word) - { - if (!trace_init) - { - trace_init = 1; - __bb_init_prg (); - } - __bb_init_file (blocks); - } - - if (bb_callcount) - { - - bb_callcount += 1; - - if (bb_mode & 12) - { - if (bb_callcount >= bb_stacksize) - { - size_t newsize = bb_callcount + 100; - - bb_stack = (unsigned long *) realloc (bb_stack, newsize); - if (! bb_stack) - { - if (!reported) - { - fprintf (stderr, "Profiler: out of memory\n"); - reported = 1; - } - bb_stacksize = 0; - goto stack_overflow; - } - bb_stacksize = newsize; - } - bb_stack[bb_callcount] = bb_src; - - if (bb_mode & 4) - bb_src = 0; - - } - -stack_overflow:; - - } - - else if (blocks->flags && (blocks->flags[blockno] & TRACE_ON)) - { - bb_callcount = 1; - bb_src = 0; - - if (bb_stack) - bb_stack[bb_callcount] = bb_src; - } - - MACHINE_STATE_RESTORE("3") -} - -#endif /* not inhibit_libc */ -#endif /* not BLOCK_PROFILER_CODE */ -#endif /* L_bb */ - -#ifdef L_shtab -unsigned int __shtab[] = { - 0x00000001, 0x00000002, 0x00000004, 0x00000008, - 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x00000100, 0x00000200, 0x00000400, 0x00000800, - 0x00001000, 0x00002000, 0x00004000, 0x00008000, - 0x00010000, 0x00020000, 0x00040000, 0x00080000, - 0x00100000, 0x00200000, 0x00400000, 0x00800000, - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000 - }; -#endif - -#ifdef L_clear_cache -/* Clear part of an instruction cache. */ - -#define INSN_CACHE_PLANE_SIZE (INSN_CACHE_SIZE / INSN_CACHE_DEPTH) - -void -__clear_cache (char *beg, char *end) -{ -#ifdef CLEAR_INSN_CACHE - CLEAR_INSN_CACHE (beg, end); -#else -#ifdef INSN_CACHE_SIZE - static char array[INSN_CACHE_SIZE + INSN_CACHE_PLANE_SIZE + INSN_CACHE_LINE_WIDTH]; - static int initialized; - int offset; - void *start_addr - void *end_addr; - typedef (*function_ptr) (); - -#if (INSN_CACHE_SIZE / INSN_CACHE_LINE_WIDTH) < 16 - /* It's cheaper to clear the whole cache. - Put in a series of jump instructions so that calling the beginning - of the cache will clear the whole thing. */ - - if (! initialized) - { - int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1) - & -INSN_CACHE_LINE_WIDTH); - int end_ptr = ptr + INSN_CACHE_SIZE; - - while (ptr < end_ptr) - { - *(INSTRUCTION_TYPE *)ptr - = JUMP_AHEAD_INSTRUCTION + INSN_CACHE_LINE_WIDTH; - ptr += INSN_CACHE_LINE_WIDTH; - } - *(INSTRUCTION_TYPE *) (ptr - INSN_CACHE_LINE_WIDTH) = RETURN_INSTRUCTION; - - initialized = 1; - } - - /* Call the beginning of the sequence. */ - (((function_ptr) (((int) array + INSN_CACHE_LINE_WIDTH - 1) - & -INSN_CACHE_LINE_WIDTH)) - ()); - -#else /* Cache is large. */ - - if (! initialized) - { - int ptr = (((int) array + INSN_CACHE_LINE_WIDTH - 1) - & -INSN_CACHE_LINE_WIDTH); - - while (ptr < (int) array + sizeof array) - { - *(INSTRUCTION_TYPE *)ptr = RETURN_INSTRUCTION; - ptr += INSN_CACHE_LINE_WIDTH; - } - - initialized = 1; - } - - /* Find the location in array that occupies the same cache line as BEG. */ - - offset = ((int) beg & -INSN_CACHE_LINE_WIDTH) & (INSN_CACHE_PLANE_SIZE - 1); - start_addr = (((int) (array + INSN_CACHE_PLANE_SIZE - 1) - & -INSN_CACHE_PLANE_SIZE) - + offset); - - /* Compute the cache alignment of the place to stop clearing. */ -#if 0 /* This is not needed for gcc's purposes. */ - /* If the block to clear is bigger than a cache plane, - we clear the entire cache, and OFFSET is already correct. */ - if (end < beg + INSN_CACHE_PLANE_SIZE) -#endif - offset = (((int) (end + INSN_CACHE_LINE_WIDTH - 1) - & -INSN_CACHE_LINE_WIDTH) - & (INSN_CACHE_PLANE_SIZE - 1)); - -#if INSN_CACHE_DEPTH > 1 - end_addr = (start_addr & -INSN_CACHE_PLANE_SIZE) + offset; - if (end_addr <= start_addr) - end_addr += INSN_CACHE_PLANE_SIZE; - - for (plane = 0; plane < INSN_CACHE_DEPTH; plane++) - { - int addr = start_addr + plane * INSN_CACHE_PLANE_SIZE; - int stop = end_addr + plane * INSN_CACHE_PLANE_SIZE; - - while (addr != stop) - { - /* Call the return instruction at ADDR. */ - ((function_ptr) addr) (); - - addr += INSN_CACHE_LINE_WIDTH; - } - } -#else /* just one plane */ - do - { - /* Call the return instruction at START_ADDR. */ - ((function_ptr) start_addr) (); - - start_addr += INSN_CACHE_LINE_WIDTH; - } - while ((start_addr % INSN_CACHE_SIZE) != offset); -#endif /* just one plane */ -#endif /* Cache is large */ -#endif /* Cache exists */ -#endif /* CLEAR_INSN_CACHE */ -} - -#endif /* L_clear_cache */ - -#ifdef L_trampoline - -/* Jump to a trampoline, loading the static chain address. */ - -#if defined(WINNT) && ! defined(__CYGWIN__) && ! defined (_UWIN) - -long getpagesize() -{ -#ifdef _ALPHA_ - return 8192; -#else - return 4096; -#endif -} - -#ifdef i386 -extern int VirtualProtect (char *, int, int, int *) __attribute__((stdcall)); -#endif - -int -mprotect (char *addr, int len, int prot) -{ - int np, op; - - if (prot == 7) - np = 0x40; - else if (prot == 5) - np = 0x20; - else if (prot == 4) - np = 0x10; - else if (prot == 3) - np = 0x04; - else if (prot == 1) - np = 0x02; - else if (prot == 0) - np = 0x01; - - if (VirtualProtect (addr, len, np, &op)) - return 0; - else - return -1; -} - -#endif /* WINNT && ! __CYGWIN__ && ! _UWIN */ - -#ifdef TRANSFER_FROM_TRAMPOLINE -TRANSFER_FROM_TRAMPOLINE -#endif - -#if defined (NeXT) && defined (__MACH__) - -/* Make stack executable so we can call trampolines on stack. - This is called from INITIALIZE_TRAMPOLINE in next.h. */ -#ifdef NeXTStep21 - #include -#else - #include -#endif - -void -__enable_execute_stack (char *addr) -{ - kern_return_t r; - char *eaddr = addr + TRAMPOLINE_SIZE; - vm_address_t a = (vm_address_t) addr; - - /* turn on execute access on stack */ - r = vm_protect (task_self (), a, TRAMPOLINE_SIZE, FALSE, VM_PROT_ALL); - if (r != KERN_SUCCESS) - { - mach_error("vm_protect VM_PROT_ALL", r); - exit(1); - } - - /* We inline the i-cache invalidation for speed */ - -#ifdef CLEAR_INSN_CACHE - CLEAR_INSN_CACHE (addr, eaddr); -#else - __clear_cache ((int) addr, (int) eaddr); -#endif -} - -#endif /* defined (NeXT) && defined (__MACH__) */ - -#ifdef __convex__ - -/* Make stack executable so we can call trampolines on stack. - This is called from INITIALIZE_TRAMPOLINE in convex.h. */ - -#include -#include -#include - -void -__enable_execute_stack () -{ - int fp; - static unsigned lowest = USRSTACK; - unsigned current = (unsigned) &fp & -NBPG; - - if (lowest > current) - { - unsigned len = lowest - current; - mremap (current, &len, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE); - lowest = current; - } - - /* Clear instruction cache in case an old trampoline is in it. */ - asm ("pich"); -} -#endif /* __convex__ */ - -#ifdef __sysV88__ - -/* Modified from the convex -code above. */ - -#include -#include -#include - -void -__enable_execute_stack () -{ - int save_errno; - static unsigned long lowest = USRSTACK; - unsigned long current = (unsigned long) &save_errno & -NBPC; - - /* Ignore errno being set. memctl sets errno to EINVAL whenever the - address is seen as 'negative'. That is the case with the stack. */ - - save_errno=errno; - if (lowest > current) - { - unsigned len=lowest-current; - memctl(current,len,MCT_TEXT); - lowest = current; - } - else - memctl(current,NBPC,MCT_TEXT); - errno=save_errno; -} - -#endif /* __sysV88__ */ - -#ifdef __sysV68__ - -#include -#include - -/* Motorola forgot to put memctl.o in the libp version of libc881.a, - so define it here, because we need it in __clear_insn_cache below */ -/* On older versions of this OS, no memctl or MCT_TEXT are defined; - hence we enable this stuff only if MCT_TEXT is #define'd. */ - -#ifdef MCT_TEXT -asm("\n\ - global memctl\n\ -memctl:\n\ - movq &75,%d0\n\ - trap &0\n\ - bcc.b noerror\n\ - jmp cerror%\n\ -noerror:\n\ - movq &0,%d0\n\ - rts"); -#endif - -/* Clear instruction cache so we can call trampolines on stack. - This is called from FINALIZE_TRAMPOLINE in mot3300.h. */ - -void -__clear_insn_cache () -{ -#ifdef MCT_TEXT - int save_errno; - - /* Preserve errno, because users would be surprised to have - errno changing without explicitly calling any system-call. */ - save_errno = errno; - - /* Keep it simple : memctl (MCT_TEXT) always fully clears the insn cache. - No need to use an address derived from _start or %sp, as 0 works also. */ - memctl(0, 4096, MCT_TEXT); - errno = save_errno; -#endif -} - -#endif /* __sysV68__ */ - -#ifdef __pyr__ - -#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */ -#include -#include -#include -#include -#include - -/* Modified from the convex -code above. - mremap promises to clear the i-cache. */ - -void -__enable_execute_stack () -{ - int fp; - if (mprotect (((unsigned int)&fp/PAGSIZ)*PAGSIZ, PAGSIZ, - PROT_READ|PROT_WRITE|PROT_EXEC)) - { - perror ("mprotect in __enable_execute_stack"); - fflush (stderr); - abort (); - } -} -#endif /* __pyr__ */ - -#if defined (sony_news) && defined (SYSTYPE_BSD) - -#include -#include -#include -#include -#include - -/* cacheflush function for NEWS-OS 4.2. - This function is called from trampoline-initialize code - defined in config/mips/mips.h. */ - -void -cacheflush (char *beg, int size, int flag) -{ - if (syscall (SYS_sysnews, NEWS_CACHEFLUSH, beg, size, FLUSH_BCACHE)) - { - perror ("cache_flush"); - fflush (stderr); - abort (); - } -} - -#endif /* sony_news */ -#endif /* L_trampoline */ - -#ifndef __CYGWIN__ -#ifdef L__main - -#include "gbl-ctors.h" -/* Some systems use __main in a way incompatible with its use in gcc, in these - cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to - give the same symbol without quotes for an alternative entry point. You - must define both, or neither. */ -#ifndef NAME__MAIN -#define NAME__MAIN "__main" -#define SYMBOL__MAIN __main -#endif - -#ifdef INIT_SECTION_ASM_OP -#undef HAS_INIT_SECTION -#define HAS_INIT_SECTION -#endif - -#if !defined (HAS_INIT_SECTION) || !defined (OBJECT_FORMAT_ELF) -/* Run all the global destructors on exit from the program. */ - -void -__do_global_dtors () -{ -#ifdef DO_GLOBAL_DTORS_BODY - DO_GLOBAL_DTORS_BODY; -#else - static func_ptr *p = __DTOR_LIST__ + 1; - while (*p) - { - p++; - (*(p-1)) (); - } -#endif -} -#endif - -#ifndef HAS_INIT_SECTION -/* Run all the global constructors on entry to the program. */ - -#ifndef ON_EXIT -#define ON_EXIT(a, b) -#else -/* Make sure the exit routine is pulled in to define the globals as - bss symbols, just in case the linker does not automatically pull - bss definitions from the library. */ - -extern int _exit_dummy_decl; -int *_exit_dummy_ref = &_exit_dummy_decl; -#endif /* ON_EXIT */ - -void -__do_global_ctors () -{ - DO_GLOBAL_CTORS_BODY; - ON_EXIT (__do_global_dtors, 0); -} -#endif /* no HAS_INIT_SECTION */ - -#if !defined (HAS_INIT_SECTION) || defined (INVOKE__main) -/* Subroutine called automatically by `main'. - Compiling a global function named `main' - produces an automatic call to this function at the beginning. - - For many systems, this routine calls __do_global_ctors. - For systems which support a .init section we use the .init section - to run __do_global_ctors, so we need not do anything here. */ - -void -SYMBOL__MAIN () -{ - /* Support recursive calls to `main': run initializers just once. */ - static int initialized; - if (! initialized) - { - initialized = 1; - __do_global_ctors (); - } -} -#endif /* no HAS_INIT_SECTION or INVOKE__main */ - -#endif /* L__main */ -#endif /* __CYGWIN__ */ - -#ifdef L_ctors - -#include "gbl-ctors.h" - -/* Provide default definitions for the lists of constructors and - destructors, so that we don't get linker errors. These symbols are - intentionally bss symbols, so that gld and/or collect will provide - the right values. */ - -/* We declare the lists here with two elements each, - so that they are valid empty lists if no other definition is loaded. - - If we are using the old "set" extensions to have the gnu linker - collect ctors and dtors, then we __CTOR_LIST__ and __DTOR_LIST__ - must be in the bss/common section. - - Long term no port should use those extensions. But many still do. */ -#if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY) -#if defined (ASM_OUTPUT_CONSTRUCTOR) || defined (USE_COLLECT2) -func_ptr __CTOR_LIST__[2] = {0, 0}; -func_ptr __DTOR_LIST__[2] = {0, 0}; -#else -func_ptr __CTOR_LIST__[2]; -func_ptr __DTOR_LIST__[2]; -#endif -#endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */ -#endif /* L_ctors */ - -#ifdef L_exit - -#include "gbl-ctors.h" - -#ifdef NEED_ATEXIT -# ifdef ON_EXIT -# undef ON_EXIT -# endif -int _exit_dummy_decl = 0; /* prevent compiler & linker warnings */ -#endif - -#ifndef ON_EXIT - -#ifdef NEED_ATEXIT -# include - -static func_ptr *atexit_chain = 0; -static long atexit_chain_length = 0; -static volatile long last_atexit_chain_slot = -1; - -int atexit (func_ptr func) -{ - if (++last_atexit_chain_slot == atexit_chain_length) - { - atexit_chain_length += 32; - if (atexit_chain) - atexit_chain = (func_ptr *) realloc (atexit_chain, atexit_chain_length - * sizeof (func_ptr)); - else - atexit_chain = (func_ptr *) malloc (atexit_chain_length - * sizeof (func_ptr)); - if (! atexit_chain) - { - atexit_chain_length = 0; - last_atexit_chain_slot = -1; - errno = ENOMEM; - return (-1); - } - } - atexit_chain[last_atexit_chain_slot] = func; - return (0); -} -#endif /* NEED_ATEXIT */ - -/* If we have no known way of registering our own __do_global_dtors - routine so that it will be invoked at program exit time, then we - have to define our own exit routine which will get this to happen. */ - -extern void __do_global_dtors (); -extern void __bb_exit_func (); -extern void _cleanup (); -extern void _exit () __attribute__ ((noreturn)); - -void -exit (int status) -{ -#if !defined (INIT_SECTION_ASM_OP) || !defined (OBJECT_FORMAT_ELF) -#ifdef NEED_ATEXIT - if (atexit_chain) - { - for ( ; last_atexit_chain_slot-- >= 0; ) - { - (*atexit_chain[last_atexit_chain_slot + 1]) (); - atexit_chain[last_atexit_chain_slot + 1] = 0; - } - free (atexit_chain); - atexit_chain = 0; - } -#else /* No NEED_ATEXIT */ - __do_global_dtors (); -#endif /* No NEED_ATEXIT */ -#endif /* !defined (INIT_SECTION_ASM_OP) || !defined (OBJECT_FORMAT_ELF) */ -/* In gbl-ctors.h, ON_EXIT is defined if HAVE_ATEXIT is defined. In - __bb_init_func and _bb_init_prg, __bb_exit_func is registered with - ON_EXIT if ON_EXIT is defined. Thus we must not call __bb_exit_func here - if HAVE_ATEXIT is defined. */ -#ifndef HAVE_ATEXIT -#ifndef inhibit_libc - __bb_exit_func (); -#endif -#endif /* !HAVE_ATEXIT */ -#ifdef EXIT_BODY - EXIT_BODY; -#else - _cleanup (); -#endif - _exit (status); -} - -#else /* ON_EXIT defined */ -int _exit_dummy_decl = 0; /* prevent compiler & linker warnings */ - -# ifndef HAVE_ATEXIT -/* Provide a fake for atexit() using ON_EXIT. */ -int atexit (func_ptr func) -{ - return ON_EXIT (func, NULL); -} -# endif /* HAVE_ATEXIT */ -#endif /* ON_EXIT defined */ - -#endif /* L_exit */ - -#ifdef L_eh - -#include "gthr.h" - -/* Shared exception handling support routines. */ - -extern void __default_terminate (void) __attribute__ ((__noreturn__)); - -void -__default_terminate () -{ - abort (); -} - -void (*__terminate_func)() = __default_terminate; - -void -__terminate () -{ - (*__terminate_func)(); -} - -void * -__throw_type_match (void *catch_type, void *throw_type, void *obj) -{ -#if 0 - printf ("__throw_type_match (): catch_type = %s, throw_type = %s\n", - catch_type, throw_type); -#endif - if (strcmp ((const char *)catch_type, (const char *)throw_type) == 0) - return obj; - return 0; -} - -void -__empty () -{ -} - - -/* Include definitions of EH context and table layout */ - -#include "eh-common.h" -#ifndef inhibit_libc -#include -#endif - -/* Allocate and return a new EH context structure. */ - -extern void __throw (); - -static void * -new_eh_context () -{ - struct eh_full_context { - struct eh_context c; - void *top_elt[2]; - } *ehfc = (struct eh_full_context *) malloc (sizeof *ehfc); - - if (! ehfc) - __terminate (); - - memset (ehfc, 0, sizeof *ehfc); - - ehfc->c.dynamic_handler_chain = (void **) ehfc->top_elt; - - /* This should optimize out entirely. This should always be true, - but just in case it ever isn't, don't allow bogus code to be - generated. */ - - if ((void*)(&ehfc->c) != (void*)ehfc) - __terminate (); - - return &ehfc->c; -} - -#if __GTHREADS -static __gthread_key_t eh_context_key; - -/* Destructor for struct eh_context. */ -static void -eh_context_free (void *ptr) -{ - __gthread_key_dtor (eh_context_key, ptr); - if (ptr) - free (ptr); -} -#endif - -/* Pointer to function to return EH context. */ - -static struct eh_context *eh_context_initialize (); -static struct eh_context *eh_context_static (); -#if __GTHREADS -static struct eh_context *eh_context_specific (); -#endif - -static struct eh_context *(*get_eh_context) () = &eh_context_initialize; - -/* Routine to get EH context. - This one will simply call the function pointer. */ - -void * -__get_eh_context () -{ - return (void *) (*get_eh_context) (); -} - -/* Get and set the language specific info pointer. */ - -void ** -__get_eh_info () -{ - struct eh_context *eh = (*get_eh_context) (); - return &eh->info; -} - -#if __GTHREADS -static void -eh_threads_initialize () -{ - /* Try to create the key. If it fails, revert to static method, - otherwise start using thread specific EH contexts. */ - if (__gthread_key_create (&eh_context_key, &eh_context_free) == 0) - get_eh_context = &eh_context_specific; - else - get_eh_context = &eh_context_static; -} -#endif /* no __GTHREADS */ - -/* Initialize EH context. - This will be called only once, since we change GET_EH_CONTEXT - pointer to another routine. */ - -static struct eh_context * -eh_context_initialize () -{ -#if __GTHREADS - - static __gthread_once_t once = __GTHREAD_ONCE_INIT; - /* Make sure that get_eh_context does not point to us anymore. - Some systems have dummy thread routines in their libc that - return a success (Solaris 2.6 for example). */ - if (__gthread_once (&once, eh_threads_initialize) != 0 - || get_eh_context == &eh_context_initialize) - { - /* Use static version of EH context. */ - get_eh_context = &eh_context_static; - } - -#else /* no __GTHREADS */ - - /* Use static version of EH context. */ - get_eh_context = &eh_context_static; - -#endif /* no __GTHREADS */ - - return (*get_eh_context) (); -} - -/* Return a static EH context. */ - -static struct eh_context * -eh_context_static () -{ - static struct eh_context eh; - static int initialized; - static void *top_elt[2]; - - if (! initialized) - { - initialized = 1; - memset (&eh, 0, sizeof eh); - eh.dynamic_handler_chain = top_elt; - } - return &eh; -} - -#if __GTHREADS -/* Return a thread specific EH context. */ - -static struct eh_context * -eh_context_specific () -{ - struct eh_context *eh; - eh = (struct eh_context *) __gthread_getspecific (eh_context_key); - if (! eh) - { - eh = new_eh_context (); - if (__gthread_setspecific (eh_context_key, (void *) eh) != 0) - __terminate (); - } - - return eh; -} -#endif __GTHREADS - -/* Support routines for setjmp/longjmp exception handling. */ - -/* Calls to __sjthrow are generated by the compiler when an exception - is raised when using the setjmp/longjmp exception handling codegen - method. */ - -#ifdef DONT_USE_BUILTIN_SETJMP -extern void longjmp (void *, int); -#endif - -/* Routine to get the head of the current thread's dynamic handler chain - use for exception handling. */ - -void *** -__get_dynamic_handler_chain () -{ - struct eh_context *eh = (*get_eh_context) (); - return &eh->dynamic_handler_chain; -} - -/* This is used to throw an exception when the setjmp/longjmp codegen - method is used for exception handling. - - We call __terminate if there are no handlers left. Otherwise we run the - cleanup actions off the dynamic cleanup stack, and pop the top of the - dynamic handler chain, and use longjmp to transfer back to the associated - handler. */ - -extern void __sjthrow (void) __attribute__ ((__noreturn__)); - -void -__sjthrow () -{ - struct eh_context *eh = (*get_eh_context) (); - void ***dhc = &eh->dynamic_handler_chain; - void *jmpbuf; - void (*func)(void *, int); - void *arg; - void ***cleanup; - - /* The cleanup chain is one word into the buffer. Get the cleanup - chain. */ - cleanup = (void***)&(*dhc)[1]; - - /* If there are any cleanups in the chain, run them now. */ - if (cleanup[0]) - { - double store[200]; - void **buf = (void**)store; - buf[1] = 0; - buf[0] = (*dhc); - - /* try { */ -#ifdef DONT_USE_BUILTIN_SETJMP - if (! setjmp (&buf[2])) -#else - if (! __builtin_setjmp (&buf[2])) -#endif - { - *dhc = buf; - while (cleanup[0]) - { - func = (void(*)(void*, int))cleanup[0][1]; - arg = (void*)cleanup[0][2]; - - /* Update this before running the cleanup. */ - cleanup[0] = (void **)cleanup[0][0]; - - (*func)(arg, 2); - } - *dhc = buf[0]; - } - /* catch (...) */ - else - { - __terminate (); - } - } - - /* We must call terminate if we try and rethrow an exception, when - there is no exception currently active and when there are no - handlers left. */ - if (! eh->info || (*dhc)[0] == 0) - __terminate (); - - /* Find the jmpbuf associated with the top element of the dynamic - handler chain. The jumpbuf starts two words into the buffer. */ - jmpbuf = &(*dhc)[2]; - - /* Then we pop the top element off the dynamic handler chain. */ - *dhc = (void**)(*dhc)[0]; - - /* And then we jump to the handler. */ - -#ifdef DONT_USE_BUILTIN_SETJMP - longjmp (jmpbuf, 1); -#else - __builtin_longjmp (jmpbuf, 1); -#endif -} - -/* Run cleanups on the dynamic cleanup stack for the current dynamic - handler, then pop the handler off the dynamic handler stack, and - then throw. This is used to skip the first handler, and transfer - control to the next handler in the dynamic handler stack. */ - -extern void __sjpopnthrow (void) __attribute__ ((__noreturn__)); - -void -__sjpopnthrow () -{ - struct eh_context *eh = (*get_eh_context) (); - void ***dhc = &eh->dynamic_handler_chain; - void (*func)(void *, int); - void *arg; - void ***cleanup; - - /* The cleanup chain is one word into the buffer. Get the cleanup - chain. */ - cleanup = (void***)&(*dhc)[1]; - - /* If there are any cleanups in the chain, run them now. */ - if (cleanup[0]) - { - double store[200]; - void **buf = (void**)store; - buf[1] = 0; - buf[0] = (*dhc); - - /* try { */ -#ifdef DONT_USE_BUILTIN_SETJMP - if (! setjmp (&buf[2])) -#else - if (! __builtin_setjmp (&buf[2])) -#endif - { - *dhc = buf; - while (cleanup[0]) - { - func = (void(*)(void*, int))cleanup[0][1]; - arg = (void*)cleanup[0][2]; - - /* Update this before running the cleanup. */ - cleanup[0] = (void **)cleanup[0][0]; - - (*func)(arg, 2); - } - *dhc = buf[0]; - } - /* catch (...) */ - else - { - __terminate (); - } - } - - /* Then we pop the top element off the dynamic handler chain. */ - *dhc = (void**)(*dhc)[0]; - - __sjthrow (); -} - -/* Support code for all exception region-based exception handling. */ - -int -__eh_rtime_match (void *rtime) -{ - void *info; - __eh_matcher matcher; - void *ret; - - info = *(__get_eh_info ()); - matcher = ((__eh_info *)info)->match_function; - if (! matcher) - { -#ifndef inhibit_libc - fprintf (stderr, "Internal Compiler Bug: No runtime type matcher."); -#endif - return 0; - } - ret = (*matcher) (info, rtime, (void *)0); - return (ret != NULL); -} - -/* This value identifies the place from which an exception is being - thrown. */ - -#ifdef EH_TABLE_LOOKUP - -EH_TABLE_LOOKUP - -#else - -#ifdef DWARF2_UNWIND_INFO - - -/* Return the table version of an exception descriptor */ - -short -__get_eh_table_version (exception_descriptor *table) -{ - return table->lang.version; -} - -/* Return the originating table language of an exception descriptor */ - -short -__get_eh_table_language (exception_descriptor *table) -{ - return table->lang.language; -} - -/* This routine takes a PC and a pointer to the exception region TABLE for - its translation unit, and returns the address of the exception handler - associated with the closest exception table handler entry associated - with that PC, or 0 if there are no table entries the PC fits in. - - In the advent of a tie, we have to give the last entry, as it represents - an inner block. */ - -static void * -old_find_exception_handler (void *pc, old_exception_table *table) -{ - if (table) - { - int pos; - int best = -1; - - /* We can't do a binary search because the table isn't guaranteed - to be sorted from function to function. */ - for (pos = 0; table[pos].start_region != (void *) -1; ++pos) - { - if (table[pos].start_region <= pc && table[pos].end_region > pc) - { - /* This can apply. Make sure it is at least as small as - the previous best. */ - if (best == -1 || (table[pos].end_region <= table[best].end_region - && table[pos].start_region >= table[best].start_region)) - best = pos; - } - /* But it is sorted by starting PC within a function. */ - else if (best >= 0 && table[pos].start_region > pc) - break; - } - if (best != -1) - return table[best].exception_handler; - } - - return (void *) 0; -} - -/* find_exception_handler finds the correct handler, if there is one, to - handle an exception. - returns a pointer to the handler which controlled should be transferred - to, or NULL if there is nothing left. - Parameters: - PC - pc where the exception originates. If this is a rethrow, - then this starts out as a pointer to the exception table - entry we wish to rethrow out of. - TABLE - exception table for the current module. - EH_INFO - eh info pointer for this exception. - RETHROW - 1 if this is a rethrow. (see incoming value of PC). - CLEANUP - returned flag indicating whether this is a cleanup handler. -*/ -static void * -find_exception_handler (void *pc, exception_descriptor *table, - __eh_info *eh_info, int rethrow, int *cleanup) -{ - - void *retval = NULL; - *cleanup = 1; - if (table) - { - int pos = 0; - /* The new model assumed the table is sorted inner-most out so the - first region we find which matches is the correct one */ - - exception_table *tab = &(table->table[0]); - - /* Subtract 1 from the PC to avoid hitting the next region */ - if (rethrow) - { - /* pc is actually the region table entry to rethrow out of */ - pos = ((exception_table *) pc) - tab; - pc = ((exception_table *) pc)->end_region - 1; - - /* The label is always on the LAST handler entry for a region, - so we know the next entry is a different region, even if the - addresses are the same. Make sure its not end of table tho. */ - if (tab[pos].start_region != (void *) -1) - pos++; - } - else - pc--; - - /* We can't do a binary search because the table is in inner-most - to outermost address ranges within functions */ - for ( ; tab[pos].start_region != (void *) -1; pos++) - { - if (tab[pos].start_region <= pc && tab[pos].end_region > pc) - { - if (tab[pos].match_info) - { - __eh_matcher matcher = eh_info->match_function; - /* match info but no matcher is NOT a match */ - if (matcher) - { - void *ret = (*matcher)((void *) eh_info, - tab[pos].match_info, table); - if (ret) - { - if (retval == NULL) - retval = tab[pos].exception_handler; - *cleanup = 0; - break; - } - } - } - else - { - if (retval == NULL) - retval = tab[pos].exception_handler; - } - } - } - } - return retval; -} -#endif /* DWARF2_UNWIND_INFO */ -#endif /* EH_TABLE_LOOKUP */ - -#ifdef DWARF2_UNWIND_INFO -/* Support code for exception handling using static unwind information. */ - -#include "frame.h" - -/* This type is used in get_reg and put_reg to deal with ABIs where a void* - is smaller than a word, such as the Irix 6 n32 ABI. We cast twice to - avoid a warning about casting between int and pointer of different - sizes. */ - -typedef int ptr_type __attribute__ ((mode (pointer))); - -#ifdef INCOMING_REGNO -/* Is the saved value for register REG in frame UDATA stored in a register - window in the previous frame? */ - -/* ??? The Sparc INCOMING_REGNO references TARGET_FLAT. This allows us - to use the macro here. One wonders, though, that perhaps TARGET_FLAT - compiled functions won't work with the frame-unwind stuff here. - Perhaps the entireity of in_reg_window should be conditional on having - seen a DW_CFA_GNU_window_save? */ -#define target_flags 0 - -static int -in_reg_window (int reg, frame_state *udata) -{ - if (udata->saved[reg] == REG_SAVED_REG) - return INCOMING_REGNO (reg) == reg; - if (udata->saved[reg] != REG_SAVED_OFFSET) - return 0; - -#ifdef STACK_GROWS_DOWNWARD - return udata->reg_or_offset[reg] > 0; -#else - return udata->reg_or_offset[reg] < 0; -#endif -} -#else -static inline int in_reg_window (int reg, frame_state *udata) { return 0; } -#endif /* INCOMING_REGNO */ - -/* Get the address of register REG as saved in UDATA, where SUB_UDATA is a - frame called by UDATA or 0. */ - -static word_type * -get_reg_addr (unsigned reg, frame_state *udata, frame_state *sub_udata) -{ - while (udata->saved[reg] == REG_SAVED_REG) - { - reg = udata->reg_or_offset[reg]; - if (in_reg_window (reg, udata)) - { - udata = sub_udata; - sub_udata = NULL; - } - } - if (udata->saved[reg] == REG_SAVED_OFFSET) - return (word_type *)(udata->cfa + udata->reg_or_offset[reg]); - else - abort (); -} - -/* Get the value of register REG as saved in UDATA, where SUB_UDATA is a - frame called by UDATA or 0. */ - -static inline void * -get_reg (unsigned reg, frame_state *udata, frame_state *sub_udata) -{ - return (void *)(ptr_type) *get_reg_addr (reg, udata, sub_udata); -} - -/* Overwrite the saved value for register REG in frame UDATA with VAL. */ - -static inline void -put_reg (unsigned reg, void *val, frame_state *udata) -{ - *get_reg_addr (reg, udata, NULL) = (word_type)(ptr_type) val; -} - -/* Copy the saved value for register REG from frame UDATA to frame - TARGET_UDATA. Unlike the previous two functions, this can handle - registers that are not one word large. */ - -static void -copy_reg (unsigned reg, frame_state *udata, frame_state *target_udata) -{ - word_type *preg = get_reg_addr (reg, udata, NULL); - word_type *ptreg = get_reg_addr (reg, target_udata, NULL); - - memcpy (ptreg, preg, __builtin_dwarf_reg_size (reg)); -} - -/* Retrieve the return address for frame UDATA. */ - -static inline void * -get_return_addr (frame_state *udata, frame_state *sub_udata) -{ - return __builtin_extract_return_addr - (get_reg (udata->retaddr_column, udata, sub_udata)); -} - -/* Overwrite the return address for frame UDATA with VAL. */ - -static inline void -put_return_addr (void *val, frame_state *udata) -{ - val = __builtin_frob_return_addr (val); - put_reg (udata->retaddr_column, val, udata); -} - -/* Given the current frame UDATA and its return address PC, return the - information about the calling frame in CALLER_UDATA. */ - -static void * -next_stack_level (void *pc, frame_state *udata, frame_state *caller_udata) -{ - caller_udata = __frame_state_for (pc, caller_udata); - if (! caller_udata) - return 0; - - /* Now go back to our caller's stack frame. If our caller's CFA register - was saved in our stack frame, restore it; otherwise, assume the CFA - register is SP and restore it to our CFA value. */ - if (udata->saved[caller_udata->cfa_reg]) - caller_udata->cfa = get_reg (caller_udata->cfa_reg, udata, 0); - else - caller_udata->cfa = udata->cfa; - caller_udata->cfa += caller_udata->cfa_offset; - - return caller_udata; -} - -/* Hook to call before __terminate if only cleanup handlers remain. */ -void -__unwinding_cleanup () -{ -} - -/* throw_helper performs some of the common grunt work for a throw. This - routine is called by throw and rethrows. This is pretty much split - out from the old __throw routine. An addition has been added which allows - for a dummy call to a routine __unwinding_cleanup() when there are nothing - but cleanups remaining. This allows a debugger to examine the state - at which the throw was executed, before any cleanups, rather than - at the terminate point after the stack has been unwound. - - EH is the current eh_context structure. - PC is the address of the call to __throw. - MY_UDATA is the unwind information for __throw. - OFFSET_P is where we return the SP adjustment offset. */ - -static void * -throw_helper (eh, pc, my_udata, offset_p) - struct eh_context *eh; - void *pc; - frame_state *my_udata; - long *offset_p; -{ - frame_state ustruct2, *udata = &ustruct2; - frame_state ustruct; - frame_state *sub_udata = &ustruct; - void *saved_pc = pc; - void *handler; - void *handler_p; - void *pc_p; - frame_state saved_ustruct; - int new_eh_model; - int cleanup = 0; - int only_cleanup = 0; - int rethrow = 0; - int saved_state = 0; - long args_size; - __eh_info *eh_info = (__eh_info *)eh->info; - - /* Do we find a handler based on a re-throw PC? */ - if (eh->table_index != (void *) 0) - rethrow = 1; - - memcpy (udata, my_udata, sizeof (*udata)); - - handler = (void *) 0; - for (;;) - { - frame_state *p = udata; - udata = next_stack_level (pc, udata, sub_udata); - sub_udata = p; - - /* If we couldn't find the next frame, we lose. */ - if (! udata) - break; - - if (udata->eh_ptr == NULL) - new_eh_model = 0; - else - new_eh_model = (((exception_descriptor *)(udata->eh_ptr))-> - runtime_id_field == NEW_EH_RUNTIME); - - if (rethrow) - { - rethrow = 0; - handler = find_exception_handler (eh->table_index, udata->eh_ptr, - eh_info, 1, &cleanup); - eh->table_index = (void *)0; - } - else - if (new_eh_model) - handler = find_exception_handler (pc, udata->eh_ptr, eh_info, - 0, &cleanup); - else - handler = old_find_exception_handler (pc, udata->eh_ptr); - - /* If we found one, we can stop searching, if its not a cleanup. - for cleanups, we save the state, and keep looking. This allows - us to call a debug hook if there are nothing but cleanups left. */ - if (handler) - { - if (cleanup) - { - if (!saved_state) - { - saved_ustruct = *udata; - handler_p = handler; - pc_p = pc; - saved_state = 1; - only_cleanup = 1; - } - } - else - { - only_cleanup = 0; - break; - } - } - - /* Otherwise, we continue searching. We subtract 1 from PC to avoid - hitting the beginning of the next region. */ - pc = get_return_addr (udata, sub_udata) - 1; - } - - if (saved_state) - { - udata = &saved_ustruct; - handler = handler_p; - pc = pc_p; - if (only_cleanup) - __unwinding_cleanup (); - } - - /* If we haven't found a handler by now, this is an unhandled - exception. */ - if (! handler) - __terminate(); - - eh->handler_label = handler; - - args_size = udata->args_size; - - if (pc == saved_pc) - /* We found a handler in the throw context, no need to unwind. */ - udata = my_udata; - else - { - int i; - - /* Unwind all the frames between this one and the handler by copying - their saved register values into our register save slots. */ - - /* Remember the PC where we found the handler. */ - void *handler_pc = pc; - - /* Start from the throw context again. */ - pc = saved_pc; - memcpy (udata, my_udata, sizeof (*udata)); - - while (pc != handler_pc) - { - frame_state *p = udata; - udata = next_stack_level (pc, udata, sub_udata); - sub_udata = p; - - for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i) - if (i != udata->retaddr_column && udata->saved[i]) - { - /* If you modify the saved value of the return address - register on the SPARC, you modify the return address for - your caller's frame. Don't do that here, as it will - confuse get_return_addr. */ - if (in_reg_window (i, udata) - && udata->saved[udata->retaddr_column] == REG_SAVED_REG - && udata->reg_or_offset[udata->retaddr_column] == i) - continue; - copy_reg (i, udata, my_udata); - } - - pc = get_return_addr (udata, sub_udata) - 1; - } - - /* But we do need to update the saved return address register from - the last frame we unwind, or the handler frame will have the wrong - return address. */ - if (udata->saved[udata->retaddr_column] == REG_SAVED_REG) - { - i = udata->reg_or_offset[udata->retaddr_column]; - if (in_reg_window (i, udata)) - copy_reg (i, udata, my_udata); - } - } - /* udata now refers to the frame called by the handler frame. */ - - /* We adjust SP by the difference between __throw's CFA and the CFA for - the frame called by the handler frame, because those CFAs correspond - to the SP values at the two call sites. We need to further adjust by - the args_size of the handler frame itself to get the handler frame's - SP from before the args were pushed for that call. */ -#ifdef STACK_GROWS_DOWNWARD - *offset_p = udata->cfa - my_udata->cfa + args_size; -#else - *offset_p = my_udata->cfa - udata->cfa - args_size; -#endif - - return handler; -} - - -/* We first search for an exception handler, and if we don't find - it, we call __terminate on the current stack frame so that we may - use the debugger to walk the stack and understand why no handler - was found. - - If we find one, then we unwind the frames down to the one that - has the handler and transfer control into the handler. */ - -/*extern void __throw(void) __attribute__ ((__noreturn__));*/ - -void -__throw () -{ - struct eh_context *eh = (*get_eh_context) (); - void *pc, *handler; - long offset; - - /* XXX maybe make my_ustruct static so we don't have to look it up for - each throw. */ - frame_state my_ustruct, *my_udata = &my_ustruct; - - /* This is required for C++ semantics. We must call terminate if we - try and rethrow an exception, when there is no exception currently - active. */ - if (! eh->info) - __terminate (); - - /* Start at our stack frame. */ -label: - my_udata = __frame_state_for (&&label, my_udata); - if (! my_udata) - __terminate (); - - /* We need to get the value from the CFA register. */ - my_udata->cfa = __builtin_dwarf_cfa (); - - /* Do any necessary initialization to access arbitrary stack frames. - On the SPARC, this means flushing the register windows. */ - __builtin_unwind_init (); - - /* Now reset pc to the right throw point. */ - pc = __builtin_extract_return_addr (__builtin_return_address (0)) - 1; - - handler = throw_helper (eh, pc, my_udata, &offset); - - /* Now go! */ - - __builtin_eh_return ((void *)eh, offset, handler); - - /* Epilogue: restore the handler frame's register values and return - to the stub. */ -} - -/*extern void __rethrow(void *) __attribute__ ((__noreturn__));*/ - -void -__rethrow (index) - void *index; -{ - struct eh_context *eh = (*get_eh_context) (); - void *pc, *handler; - long offset; - - /* XXX maybe make my_ustruct static so we don't have to look it up for - each throw. */ - frame_state my_ustruct, *my_udata = &my_ustruct; - - /* This is required for C++ semantics. We must call terminate if we - try and rethrow an exception, when there is no exception currently - active. */ - if (! eh->info) - __terminate (); - - /* This is the table index we want to rethrow from. The value of - the END_REGION label is used for the PC of the throw, and the - search begins with the next table entry. */ - eh->table_index = index; - - /* Start at our stack frame. */ -label: - my_udata = __frame_state_for (&&label, my_udata); - if (! my_udata) - __terminate (); - - /* We need to get the value from the CFA register. */ - my_udata->cfa = __builtin_dwarf_cfa (); - - /* Do any necessary initialization to access arbitrary stack frames. - On the SPARC, this means flushing the register windows. */ - __builtin_unwind_init (); - - /* Now reset pc to the right throw point. */ - pc = __builtin_extract_return_addr (__builtin_return_address (0)) - 1; - - handler = throw_helper (eh, pc, my_udata, &offset); - - /* Now go! */ - - __builtin_eh_return ((void *)eh, offset, handler); - - /* Epilogue: restore the handler frame's register values and return - to the stub. */ -} -#endif /* DWARF2_UNWIND_INFO */ - -#endif /* L_eh */ - -#ifdef L_pure -#ifndef inhibit_libc -/* This gets us __GNU_LIBRARY__. */ -#undef NULL /* Avoid errors if stdio.h and our stddef.h mismatch. */ -#include - -#ifdef __GNU_LIBRARY__ - /* Avoid forcing the library's meaning of `write' on the user program - by using the "internal" name (for use within the library) */ -#define write(fd, buf, n) __write((fd), (buf), (n)) -#endif -#endif /* inhibit_libc */ - -#define MESSAGE "pure virtual method called\n" - -void -__pure_virtual () -{ -#ifndef inhibit_libc - write (2, MESSAGE, sizeof (MESSAGE) - 1); -#endif - __terminate (); -} -#endif diff --git a/lib/src/libgcc/longlong.h b/lib/src/libgcc/longlong.h deleted file mode 100644 index d0f7cad8..00000000 --- a/lib/src/libgcc/longlong.h +++ /dev/null @@ -1,242 +0,0 @@ -// This file is copied from gcc 2.95.2 -// Asm code except mips has been removed - -/* longlong.h -- definitions for mixed size 32/64 bit arithmetic. - Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc. - - This definition file is free software; you can redistribute it - and/or modify it under the terms of the GNU General Public - License as published by the Free Software Foundation; either - version 2, or (at your option) any later version. - - This definition file is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef SI_TYPE_SIZE -#define SI_TYPE_SIZE 32 -#endif - -#define __BITS4 (SI_TYPE_SIZE / 4) -#define __ll_B (1L << (SI_TYPE_SIZE / 2)) -#define __ll_lowpart(t) ((USItype) (t) % __ll_B) -#define __ll_highpart(t) ((USItype) (t) / __ll_B) - -/* Define auxiliary asm macros. - - 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) - multiplies two USItype integers MULTIPLER and MULTIPLICAND, - and generates a two-part USItype product in HIGH_PROD and - LOW_PROD. - - 2) __umulsidi3(a,b) multiplies two USItype integers A and B, - and returns a UDItype product. This is just a variant of umul_ppmm. - - 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, - denominator) divides a two-word unsigned integer, composed by the - integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and - places the quotient in QUOTIENT and the remainder in REMAINDER. - HIGH_NUMERATOR must be less than DENOMINATOR for correct operation. - If, in addition, the most significant bit of DENOMINATOR must be 1, - then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1. - - 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator, - denominator). Like udiv_qrnnd but the numbers are signed. The - quotient is rounded towards 0. - - 5) count_leading_zeros(count, x) counts the number of zero-bits from - the msb to the first non-zero bit. This is the number of steps X - needs to be shifted left to set the msb. Undefined for X == 0. - - 6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, - high_addend_2, low_addend_2) adds two two-word unsigned integers, - composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and - LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and - LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is - lost. - - 7) sub_ddmmss(high_difference, low_difference, high_minuend, - low_minuend, high_subtrahend, low_subtrahend) subtracts two - two-word unsigned integers, composed by HIGH_MINUEND_1 and - LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2 - respectively. The result is placed in HIGH_DIFFERENCE and - LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, - and is lost. - - If any of these macros are left undefined for a particular CPU, - C macros are used. */ - -/* The CPUs come in alphabetical order below. - - Please add support for more CPUs here, or improve the current support - for the CPUs below! - (E.g. WE32100, IBM360.) */ - -#if defined (__GNUC__) && !defined (NO_ASM) - -/* We sometimes need to clobber "cc" with gcc2, but that would not be - understood by gcc1. Use cpp to avoid major code duplication. */ -#if __GNUC__ < 2 -#define __CLOBBER_CC -#define __AND_CLOBBER_CC -#else /* __GNUC__ >= 2 */ -#define __CLOBBER_CC : "cc" -#define __AND_CLOBBER_CC , "cc" -#endif /* __GNUC__ < 2 */ - -#if defined (__mips__) -#define umul_ppmm(w1, w0, u, v) \ - __asm__ ("multu %2,%3" \ - : "=l" ((USItype) (w0)), \ - "=h" ((USItype) (w1)) \ - : "d" ((USItype) (u)), \ - "d" ((USItype) (v))) -#define UMUL_TIME 10 -#define UDIV_TIME 100 -#endif /* __mips__ */ - -#endif /* __GNUC__ */ - -/* If this machine has no inline assembler, use C macros. */ - -#if !defined (add_ssaaaa) -#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - do { \ - USItype __x; \ - __x = (al) + (bl); \ - (sh) = (ah) + (bh) + (__x < (al)); \ - (sl) = __x; \ - } while (0) -#endif - -#if !defined (sub_ddmmss) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - do { \ - USItype __x; \ - __x = (al) - (bl); \ - (sh) = (ah) - (bh) - (__x > (al)); \ - (sl) = __x; \ - } while (0) -#endif - -#if !defined (umul_ppmm) -#define umul_ppmm(w1, w0, u, v) \ - do { \ - USItype __x0, __x1, __x2, __x3; \ - USItype __ul, __vl, __uh, __vh; \ - \ - __ul = __ll_lowpart (u); \ - __uh = __ll_highpart (u); \ - __vl = __ll_lowpart (v); \ - __vh = __ll_highpart (v); \ - \ - __x0 = (USItype) __ul * __vl; \ - __x1 = (USItype) __ul * __vh; \ - __x2 = (USItype) __uh * __vl; \ - __x3 = (USItype) __uh * __vh; \ - \ - __x1 += __ll_highpart (__x0);/* this can't give carry */ \ - __x1 += __x2; /* but this indeed can */ \ - if (__x1 < __x2) /* did we get it? */ \ - __x3 += __ll_B; /* yes, add it in the proper pos. */ \ - \ - (w1) = __x3 + __ll_highpart (__x1); \ - (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \ - } while (0) -#endif - -#if !defined (__umulsidi3) -#define __umulsidi3(u, v) \ - ({DIunion __w; \ - umul_ppmm (__w.s.high, __w.s.low, u, v); \ - __w.ll; }) -#endif - -/* Define this unconditionally, so it can be used for debugging. */ -#define __udiv_qrnnd_c(q, r, n1, n0, d) \ - do { \ - USItype __d1, __d0, __q1, __q0; \ - USItype __r1, __r0, __m; \ - __d1 = __ll_highpart (d); \ - __d0 = __ll_lowpart (d); \ - \ - __r1 = (n1) % __d1; \ - __q1 = (n1) / __d1; \ - __m = (USItype) __q1 * __d0; \ - __r1 = __r1 * __ll_B | __ll_highpart (n0); \ - if (__r1 < __m) \ - { \ - __q1--, __r1 += (d); \ - if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ - if (__r1 < __m) \ - __q1--, __r1 += (d); \ - } \ - __r1 -= __m; \ - \ - __r0 = __r1 % __d1; \ - __q0 = __r1 / __d1; \ - __m = (USItype) __q0 * __d0; \ - __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ - if (__r0 < __m) \ - { \ - __q0--, __r0 += (d); \ - if (__r0 >= (d)) \ - if (__r0 < __m) \ - __q0--, __r0 += (d); \ - } \ - __r0 -= __m; \ - \ - (q) = (USItype) __q1 * __ll_B | __q0; \ - (r) = __r0; \ - } while (0) - -/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through - __udiv_w_sdiv (defined in libgcc or elsewhere). */ -#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd) -#define udiv_qrnnd(q, r, nh, nl, d) \ - do { \ - USItype __r; \ - (q) = __udiv_w_sdiv (&__r, nh, nl, d); \ - (r) = __r; \ - } while (0) -#endif - -/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ -#if !defined (udiv_qrnnd) -#define UDIV_NEEDS_NORMALIZATION 1 -#define udiv_qrnnd __udiv_qrnnd_c -#endif - -#if !defined (count_leading_zeros) -//extern const UQItype __clz_tab[]; -#define count_leading_zeros(count, x) \ - do { \ - USItype __xr = (x); \ - USItype __a; \ - \ - if (SI_TYPE_SIZE <= 32) \ - { \ - __a = __xr < ((USItype)1<<2*__BITS4) \ - ? (__xr < ((USItype)1<<__BITS4) ? 0 : __BITS4) \ - : (__xr < ((USItype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \ - } \ - else \ - { \ - for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8) \ - if (((__xr >> __a) & 0xff) != 0) \ - break; \ - } \ - \ - (count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \ - } while (0) -#endif - -#ifndef UDIV_NEEDS_NORMALIZATION -#define UDIV_NEEDS_NORMALIZATION 0 -#endif diff --git a/lib/ultra/D.inc b/lib/ultra/D.inc deleted file mode 100644 index d06de4be..00000000 --- a/lib/ultra/D.inc +++ /dev/null @@ -1,115 +0,0 @@ - BUILD_DIR/libultra.a:parameters.o(.SECTION); - BUILD_DIR/libultra.a:settime.o(.SECTION); - BUILD_DIR/libultra.a:maptlb.o(.SECTION); - BUILD_DIR/libultra.a:unmaptlball.o(.SECTION); - BUILD_DIR/libultra.a:sprintf.o(.SECTION); - BUILD_DIR/libultra.a:createmesgqueue.o(.SECTION); - BUILD_DIR/libultra.a:seteventmesg.o(.SECTION); - BUILD_DIR/libultra.a:visetevent.o(.SECTION); - BUILD_DIR/libultra.a:createthread.o(.SECTION); - BUILD_DIR/libultra.a:recvmesg.o(.SECTION); - BUILD_DIR/libultra.a:sptask.o(.SECTION); - BUILD_DIR/libultra.a:sptaskyield.o(.SECTION); - BUILD_DIR/libultra.a:sendmesg.o(.SECTION); - BUILD_DIR/libultra.a:sptaskyielded.o(.SECTION); - BUILD_DIR/libultra.a:startthread.o(.SECTION); - BUILD_DIR/libultra.a:writebackdcacheall.o(.SECTION); - BUILD_DIR/libultra.a:vitbl.o(.SECTION); - BUILD_DIR/libultra.a:vimgr.o(.SECTION); - BUILD_DIR/libultra.a:visetmode.o(.SECTION); - BUILD_DIR/libultra.a:viblack.o(.SECTION); - BUILD_DIR/libultra.a:visetspecial.o(.SECTION); - BUILD_DIR/libultra.a:pimgr.o(.SECTION); - BUILD_DIR/libultra.a:setthreadpri.o(.SECTION); - BUILD_DIR/libultra.a:initialize.o(.SECTION); - BUILD_DIR/libultra.a:viswapbuf.o(.SECTION); - BUILD_DIR/libultra.a:sqrtf.o(.SECTION); - BUILD_DIR/libultra.a:contreaddata.o(.SECTION); - BUILD_DIR/libultra.a:controller.o(.SECTION); - BUILD_DIR/libultra.a:conteepprobe.o(.SECTION); - BUILD_DIR/libultra.a:ll.o(.SECTION); - BUILD_DIR/libultra.a:invaldcache.o(.SECTION); - BUILD_DIR/libultra.a:pidma.o(.SECTION); - BUILD_DIR/libultra.a:bzero.o(.SECTION); - BUILD_DIR/libultra.a:invalicache.o(.SECTION); - BUILD_DIR/libultra.a:conteeplongread.o(.SECTION); - BUILD_DIR/libultra.a:conteeplongwrite.o(.SECTION); - BUILD_DIR/libultra.a:bcopy.o(.SECTION); - BUILD_DIR/libultra.a:ortho.o(.SECTION); - BUILD_DIR/libultra.a:perspective.o(.SECTION); - BUILD_DIR/libultra.a:gettime.o(.SECTION); - BUILD_DIR/libultra.a:llcvt.o(.SECTION); - BUILD_DIR/libultra.a:cosf.o(.SECTION); - BUILD_DIR/libultra.a:sinf.o(.SECTION); - BUILD_DIR/libultra.a:translate.o(.SECTION); - BUILD_DIR/libultra.a:rotate.o(.SECTION); - BUILD_DIR/libultra.a:scale.o(.SECTION); - BUILD_DIR/libultra.a:aisetfreq.o(.SECTION); - BUILD_DIR/libultra.a:bnkf.o(.SECTION); - BUILD_DIR/libultra.a:writebackdcache.o(.SECTION); - BUILD_DIR/libultra.a:aigetlen.o(.SECTION); - BUILD_DIR/libultra.a:aisetnextbuf.o(.SECTION); - BUILD_DIR/libultra.a:timerintr.o(.SECTION); - BUILD_DIR/libultra.a:xprintf.o(.SECTION); - BUILD_DIR/libultra.a:string.o(.SECTION); - BUILD_DIR/libultra.a:thread.o(.SECTION); - BUILD_DIR/libultra.a:interrupt.o(.SECTION); - BUILD_DIR/libultra.a:vi.o(.SECTION); - BUILD_DIR/libultra.a:exceptasm.o(.SECTION); - BUILD_DIR/libultra.a:virtualtophysical.o(.SECTION); - BUILD_DIR/libultra.a:spsetstat.o(.SECTION); - BUILD_DIR/libultra.a:spsetpc.o(.SECTION); - BUILD_DIR/libultra.a:sprawdma.o(.SECTION); - BUILD_DIR/libultra.a:sp.o(.SECTION); - BUILD_DIR/libultra.a:spgetstat.o(.SECTION); - BUILD_DIR/libultra.a:getthreadpri.o(.SECTION); - BUILD_DIR/libultra.a:vigetcurrcontext.o(.SECTION); - BUILD_DIR/libultra.a:viswapcontext.o(.SECTION); - BUILD_DIR/libultra.a:getcount.o(.SECTION); - BUILD_DIR/libultra.a:piacs.o(.SECTION); - BUILD_DIR/libultra.a:pirawdma.o(.SECTION); - BUILD_DIR/libultra.a:devmgr.o(.SECTION); - BUILD_DIR/libultra.a:setsr.o(.SECTION); - BUILD_DIR/libultra.a:getsr.o(.SECTION); - BUILD_DIR/libultra.a:setfpccsr.o(.SECTION); - BUILD_DIR/libultra.a:sirawread.o(.SECTION); - BUILD_DIR/libultra.a:sirawwrite.o(.SECTION); - BUILD_DIR/libultra.a:maptlbrdb.o(.SECTION); - BUILD_DIR/libultra.a:pirawread.o(.SECTION); -#if defined(JP_PADDING_TEXT) && !defined(NON_MATCHING) - . += 0x40; /* Not a 2.0D diff, probably a compiler thing */ -#endif - BUILD_DIR/libultra.a:siacs.o(.SECTION); - BUILD_DIR/libultra.a:sirawdma.o(.SECTION); - BUILD_DIR/libultra.a:settimer.o(.SECTION); - BUILD_DIR/libultra.a:conteepwrite.o(.SECTION); - BUILD_DIR/libultra.a:jammesg.o(.SECTION); - BUILD_DIR/libultra.a:pigetcmdq.o(.SECTION); - BUILD_DIR/libultra.a:conteepread.o(.SECTION); - BUILD_DIR/libultra.a:mtxutil.o(.SECTION); - BUILD_DIR/libultra.a:normalize.o(.SECTION); - BUILD_DIR/libultra.a:ai.o(.SECTION); - BUILD_DIR/libultra.a:setcompare.o(.SECTION); - BUILD_DIR/libultra.a:libm_vals.o(.SECTION); - BUILD_DIR/libultra.a:xlitob.o(.SECTION); - BUILD_DIR/libultra.a:xldtob.o(.SECTION); - BUILD_DIR/libultra.a:vimodentsclan1.o(.SECTION); - BUILD_DIR/libultra.a:vimodepallan1.o(.SECTION); - BUILD_DIR/libultra.a:kdebugserver.o(.SECTION); - BUILD_DIR/libultra.a:syncputchars.o(.SECTION); - BUILD_DIR/libultra.a:setintmask.o(.SECTION); - BUILD_DIR/libultra.a:destroythread.o(.SECTION); - BUILD_DIR/libultra.a:probetlb.o(.SECTION); - BUILD_DIR/libultra.a:si.o(.SECTION); - BUILD_DIR/libultra.a:ldiv.o(.SECTION); - BUILD_DIR/libultra.a:getcause.o(.SECTION); - BUILD_DIR/libultra.a:atomic.o(.SECTION); - BUILD_DIR/libultra.a:lookatref.o(.SECTION); /* Fast3DEX2 only */ -#if ENABLE_RUMBLE - BUILD_DIR/libultra.a:pfsgetstatus.o(.SECTION); - BUILD_DIR/libultra.a:motor.o(.SECTION); - BUILD_DIR/libultra.a:pfsisplug.o(.SECTION); - BUILD_DIR/libultra.a:crc.o(.SECTION); - BUILD_DIR/libultra.a:contramwrite.o(.SECTION); - BUILD_DIR/libultra.a:contramread.o(.SECTION); -#endif diff --git a/lib/ultra/F_I.inc b/lib/ultra/F_I.inc deleted file mode 100644 index 7ace54e8..00000000 --- a/lib/ultra/F_I.inc +++ /dev/null @@ -1,155 +0,0 @@ - BUILD_DIR/libultra.a:string.o(.SECTION); - BUILD_DIR/libultra.a:xprintf.o(.SECTION); - BUILD_DIR/libultra.a:ll.o(.SECTION); - BUILD_DIR/libultra.a:initialize.o(.SECTION); - BUILD_DIR/libultra.a:settime.o(.SECTION); - BUILD_DIR/libultra.a:gettime.o(.SECTION); - BUILD_DIR/libultra.a:writebackdcacheall.o(.SECTION); - BUILD_DIR/libultra.a:viblack.o(.SECTION); - BUILD_DIR/libultra.a:viswapbuf.o(.SECTION); - BUILD_DIR/libultra.a:getcurrfaultthread.o(.SECTION); - BUILD_DIR/libultra.a:seteventmesg.o(.SECTION); - BUILD_DIR/libultra.a:recvmesg.o(.SECTION); - BUILD_DIR/libultra.a:parameters.o(.SECTION); - BUILD_DIR/libultra.a:createmesgqueue.o(.SECTION); - BUILD_DIR/libultra.a:createthread.o(.SECTION); - BUILD_DIR/libultra.a:startthread.o(.SECTION); - BUILD_DIR/libultra.a:maptlb.o(.SECTION); - BUILD_DIR/libultra.a:unmaptlball.o(.SECTION); - BUILD_DIR/libultra.a:sprintf.o(.SECTION); - BUILD_DIR/libultra.a:syncprintf.o(.SECTION); - BUILD_DIR/libultra.a:visetevent.o(.SECTION); - BUILD_DIR/libultra.a:sptask.o(.SECTION); - BUILD_DIR/libultra.a:sptaskyield.o(.SECTION); - BUILD_DIR/libultra.a:sendmesg.o(.SECTION); - BUILD_DIR/libultra.a:sptaskyielded.o(.SECTION); - BUILD_DIR/libultra.a:vimgr.o(.SECTION); - BUILD_DIR/libultra.a:visetmode.o(.SECTION); - BUILD_DIR/libultra.a:visetspecial.o(.SECTION); - BUILD_DIR/libultra.a:vitbl.o(.SECTION); - BUILD_DIR/libultra.a:pimgr.o(.SECTION); - BUILD_DIR/libultra.a:setthreadpri.o(.SECTION); - BUILD_DIR/libultra.a:sqrtf.o(.SECTION); - BUILD_DIR/libultra.a:contreaddata.o(.SECTION); - BUILD_DIR/libultra.a:controller.o(.SECTION); - BUILD_DIR/libultra.a:conteepprobe.o(.SECTION); -#if ENABLE_RUMBLE - BUILD_DIR/libultra.a:motor.o(.SECTION); -#endif - BUILD_DIR/libultra.a:invaldcache.o(.SECTION); - BUILD_DIR/libultra.a:pidma.o(.SECTION); - BUILD_DIR/libultra.a:bzero.o(.SECTION); - BUILD_DIR/libultra.a:invalicache.o(.SECTION); - BUILD_DIR/libultra.a:conteeplongread.o(.SECTION); - BUILD_DIR/libultra.a:conteeplongwrite.o(.SECTION); - BUILD_DIR/libultra.a:bcopy.o(.SECTION); - BUILD_DIR/libultra.a:ortho.o(.SECTION); - BUILD_DIR/libultra.a:perspective.o(.SECTION); - BUILD_DIR/libultra.a:llcvt.o(.SECTION); - BUILD_DIR/libultra.a:cosf.o(.SECTION); - BUILD_DIR/libultra.a:sinf.o(.SECTION); - BUILD_DIR/libultra.a:translate.o(.SECTION); - BUILD_DIR/libultra.a:rotate.o(.SECTION); - BUILD_DIR/libultra.a:scale.o(.SECTION); - BUILD_DIR/libultra.a:aisetfreq.o(.SECTION); - BUILD_DIR/libultra.a:cartrominit.o(.SECTION); - BUILD_DIR/libultra.a:epidma.o(.SECTION); - BUILD_DIR/libultra.a:bnkf.o(.SECTION); - BUILD_DIR/libultra.a:aigetlen.o(.SECTION); - BUILD_DIR/libultra.a:aisetnextbuf.o(.SECTION); -#if LIBULTRA_VERSION >= OS_VER_H - BUILD_DIR/libultra.a:getcount.o(.SECTION); - BUILD_DIR/libultra.a:interrupt.o(.SECTION); -#endif - BUILD_DIR/libultra.a:xlitob.o(.SECTION); - BUILD_DIR/libultra.a:xldtob.o(.SECTION); - BUILD_DIR/libultra.a:setsr.o(.SECTION); - BUILD_DIR/libultra.a:getsr.o(.SECTION); - BUILD_DIR/libultra.a:setfpccsr.o(.SECTION); - BUILD_DIR/libultra.a:sirawread.o(.SECTION); - BUILD_DIR/libultra.a:sirawwrite.o(.SECTION); - BUILD_DIR/libultra.a:exceptasm.o(.SECTION); - BUILD_DIR/libultra.a:writebackdcache.o(.SECTION); - BUILD_DIR/libultra.a:maptlbrdb.o(.SECTION); - BUILD_DIR/libultra.a:pirawread.o(.SECTION); - BUILD_DIR/libultra.a:sethwinterrupt.o(.SECTION); -#if LIBULTRA_VERSION <= OS_VER_F - BUILD_DIR/libultra.a:leointerrupt.o(.SECTION); -#endif - BUILD_DIR/libultra.a:timerintr.o(.SECTION); -#if LIBULTRA_VERSION <= OS_VER_F - BUILD_DIR/libultra.a:interrupt.o(.SECTION); - BUILD_DIR/libultra.a:getcount.o(.SECTION); -#endif - BUILD_DIR/libultra.a:vi.o(.SECTION); - BUILD_DIR/libultra.a:thread.o(.SECTION); - BUILD_DIR/libultra.a:virtualtophysical.o(.SECTION); - BUILD_DIR/libultra.a:spsetstat.o(.SECTION); - BUILD_DIR/libultra.a:spsetpc.o(.SECTION); - BUILD_DIR/libultra.a:sprawdma.o(.SECTION); - BUILD_DIR/libultra.a:sp.o(.SECTION); - BUILD_DIR/libultra.a:spgetstat.o(.SECTION); - BUILD_DIR/libultra.a:getthreadpri.o(.SECTION); - BUILD_DIR/libultra.a:vigetcurrcontext.o(.SECTION); - BUILD_DIR/libultra.a:viswapcontext.o(.SECTION); -#if LIBULTRA_VERSION >= OS_VER_H - BUILD_DIR/libultra.a:leodiskinit.o(.SECTION); -#endif - BUILD_DIR/libultra.a:piacs.o(.SECTION); - BUILD_DIR/libultra.a:pirawdma.o(.SECTION); - BUILD_DIR/libultra.a:epirawdma.o(.SECTION); - BUILD_DIR/libultra.a:devmgr.o(.SECTION); - BUILD_DIR/libultra.a:siacs.o(.SECTION); - BUILD_DIR/libultra.a:sirawdma.o(.SECTION); - BUILD_DIR/libultra.a:settimer.o(.SECTION); -#if ENABLE_RUMBLE && defined(SH_PFS_BSS) - BUILD_DIR/libultra.a:pfsisplug.o(.SECTION); -#endif - BUILD_DIR/libultra.a:conteepwrite.o(.SECTION); - BUILD_DIR/libultra.a:kdebugserver.o(.SECTION); - BUILD_DIR/libultra.a:vimodepallan1.o(.SECTION); - BUILD_DIR/libultra.a:vimodempallan1.o(.SECTION); - BUILD_DIR/libultra.a:vimodentsclan1.o(.SECTION); - BUILD_DIR/libultra.a:libm_vals.o(.SECTION); -#if ENABLE_RUMBLE -#ifndef SH_PFS_BSS - BUILD_DIR/libultra.a:pfsisplug.o(.SECTION); -#endif - BUILD_DIR/libultra.a:crc.o(.SECTION); - BUILD_DIR/libultra.a:contramwrite.o(.SECTION); - BUILD_DIR/libultra.a:contramread.o(.SECTION); -#endif - BUILD_DIR/libultra.a:jammesg.o(.SECTION); - BUILD_DIR/libultra.a:pigetcmdq.o(.SECTION); - BUILD_DIR/libultra.a:conteepread.o(.SECTION); - BUILD_DIR/libultra.a:mtxutil.o(.SECTION); - BUILD_DIR/libultra.a:normalize.o(.SECTION); - BUILD_DIR/libultra.a:ai.o(.SECTION); - BUILD_DIR/libultra.a:ldiv.o(.SECTION); - BUILD_DIR/libultra.a:si.o(.SECTION); -#if LIBULTRA_VERSION >= OS_VER_H - BUILD_DIR/libultra.a:leointerrupt.o(.SECTION); -#endif - BUILD_DIR/libultra.a:setintmask.o(.SECTION); - BUILD_DIR/libultra.a:destroythread.o(.SECTION); -#if LIBULTRA_VERSION <= OS_VER_F - BUILD_DIR/libultra.a:leodiskinit.o(.SECTION); -#endif - BUILD_DIR/libultra.a:setcompare.o(.SECTION); - BUILD_DIR/libultra.a:thread.o(.SECTION); - BUILD_DIR/libultra.a:probetlb.o(.SECTION); - BUILD_DIR/libultra.a:resetglobalintmask.o(.SECTION); - BUILD_DIR/libultra.a:epirawwrite.o(.SECTION); -#if LIBULTRA_VERSION >= OS_VER_H - BUILD_DIR/libultra.a:epirawread.o(.SECTION); - BUILD_DIR/libultra.a:setglobalintmask.o(.SECTION); -#endif - BUILD_DIR/libultra.a:yieldthread.o(.SECTION); -#if ENABLE_RUMBLE - BUILD_DIR/libultra.a:pfsgetstatus.o(.SECTION); -#endif - BUILD_DIR/libultra.a:lookatref.o(.SECTION); /* Fast3DEX2 only */ - BUILD_DIR/libultra.a:pfsselectbank.o(.SECTION); -#ifdef LIBULTRA_EXCLUSIVE - BUILD_DIR/libultra.a:driverominit.o(.SECTION); -#endif \ No newline at end of file diff --git a/lib/ultra/K_L.inc b/lib/ultra/K_L.inc deleted file mode 100644 index 3d5e5ba7..00000000 --- a/lib/ultra/K_L.inc +++ /dev/null @@ -1,146 +0,0 @@ - BUILD_DIR/libultra.a:wrapper.o(.SECTION); // BBPLAYER - BUILD_DIR/libultra.a:aigetlen.o(.SECTION); - BUILD_DIR/libultra.a:aisetfreq.o(.SECTION); - BUILD_DIR/libultra.a:aisetnextbuf.o(.SECTION); - BUILD_DIR/libultra.a:bnkf.o(.SECTION); - BUILD_DIR/libultra.a:invaldcache.o(.SECTION); - BUILD_DIR/libultra.a:invalicache.o(.SECTION); - BUILD_DIR/libultra.a:writebackdcacheall.o(.SECTION); - BUILD_DIR/libultra.a:contreaddata.o(.SECTION); - BUILD_DIR/libultra.a:controller.o(.SECTION); - BUILD_DIR/libultra.a:virtualtophysical.o(.SECTION); - BUILD_DIR/libultra.a:sqrtf.o(.SECTION); - BUILD_DIR/libultra.a:cosf.o(.SECTION); - BUILD_DIR/libultra.a:ortho.o(.SECTION); - BUILD_DIR/libultra.a:perspective.o(.SECTION); - BUILD_DIR/libultra.a:sinf.o(.SECTION); - BUILD_DIR/libultra.a:bcopy.o(.SECTION); - BUILD_DIR/libultra.a:bzero.o(.SECTION); - BUILD_DIR/libultra.a:ll.o(.SECTION); - BUILD_DIR/libultra.a:llcvt.o(.SECTION); - BUILD_DIR/libultra.a:string.o(.SECTION); - BUILD_DIR/libultra.a:xprintf.o(.SECTION); - BUILD_DIR/libultra.a:sprintf.o(.SECTION); - BUILD_DIR/libultra.a:syncprintf.o(.SECTION); - BUILD_DIR/libultra.a:createmesgqueue.o(.SECTION); - BUILD_DIR/libultra.a:recvmesg.o(.SECTION); - BUILD_DIR/libultra.a:sendmesg.o(.SECTION); - BUILD_DIR/libultra.a:seteventmesg.o(.SECTION); -#ifdef BBPLAYER - BUILD_DIR/libultra.a:_getcount.o(.SECTION); -#else - BUILD_DIR/libultra.a:getcount.o(.SECTION); -#endif - BUILD_DIR/libultra.a:sptask.o(.SECTION); - BUILD_DIR/libultra.a:sptaskyield.o(.SECTION); - BUILD_DIR/libultra.a:sptaskyielded.o(.SECTION); - BUILD_DIR/libultra.a:sirawdma.o(.SECTION); - BUILD_DIR/libultra.a:siacs.o(.SECTION); - BUILD_DIR/libultra.a:createthread.o(.SECTION); - BUILD_DIR/libultra.a:setthreadpri.o(.SECTION); - BUILD_DIR/libultra.a:startthread.o(.SECTION); - BUILD_DIR/libultra.a:thread.o(.SECTION); - BUILD_DIR/libultra.a:getcurrfaultthread.o(.SECTION); - BUILD_DIR/libultra.a:gettime.o(.SECTION); - BUILD_DIR/libultra.a:settime.o(.SECTION); - BUILD_DIR/libultra.a:settimer.o(.SECTION); - BUILD_DIR/libultra.a:timerintr.o(.SECTION); - BUILD_DIR/libultra.a:maptlb.o(.SECTION); - BUILD_DIR/libultra.a:probetlb.o(.SECTION); - BUILD_DIR/libultra.a:unmaptlball.o(.SECTION); - BUILD_DIR/libultra.a:vimgr.o(.SECTION); - BUILD_DIR/libultra.a:vitbl.o(.SECTION); - BUILD_DIR/libultra.a:visetevent.o(.SECTION); - BUILD_DIR/libultra.a:visetmode.o(.SECTION); - BUILD_DIR/libultra.a:visetspecial.o(.SECTION); - BUILD_DIR/libultra.a:viswapbuf.o(.SECTION); - BUILD_DIR/libultra.a:viswapcontext.o(.SECTION); - BUILD_DIR/libultra.a:viblack.o(.SECTION); - BUILD_DIR/libultra.a:mtxidentf.o(.SECTION); - BUILD_DIR/libultra.a:mtxf2l.o(.SECTION); - BUILD_DIR/libultra.a:scale.o(.SECTION); - BUILD_DIR/libultra.a:translate.o(.SECTION); - BUILD_DIR/libultra.a:rotate.o(.SECTION); - BUILD_DIR/libultra.a:conteepprobe.o(.SECTION); - BUILD_DIR/libultra.a:conteeplongwrite.o(.SECTION); - BUILD_DIR/libultra.a:conteeplongread.o(.SECTION); - BUILD_DIR/libultra.a:exceptasm.o(.SECTION); - BUILD_DIR/libultra.a:interrupt.o(.SECTION); - BUILD_DIR/libultra.a:setintmask.o(.SECTION); - BUILD_DIR/libultra.a:pimgr.o(.SECTION); - BUILD_DIR/libultra.a:epirawdma.o(.SECTION); - BUILD_DIR/libultra.a:epidma.o(.SECTION); - BUILD_DIR/libultra.a:cartrominit.o(.SECTION); - BUILD_DIR/libultra.a:devmgr.o(.SECTION); - BUILD_DIR/libultra.a:piacs.o(.SECTION); - BUILD_DIR/libultra.a:pidma.o(.SECTION); - BUILD_DIR/libultra.a:skapi.o(.SECTION); // BBPLAYER - BUILD_DIR/libultra.a:motor.o(.SECTION); - BUILD_DIR/libultra.a:parameters.o(.SECTION); - BUILD_DIR/libultra.a:initialize.o(.SECTION); - BUILD_DIR/libultra.a:ai.o(.SECTION); - BUILD_DIR/libultra.a:writebackdcache.o(.SECTION); - BUILD_DIR/libultra.a:libm_vals.o(.SECTION); - BUILD_DIR/libultra.a:xlitob.o(.SECTION); - BUILD_DIR/libultra.a:xldtob.o(.SECTION); - BUILD_DIR/libultra.a:jammesg.o(.SECTION); - BUILD_DIR/libultra.a:getcause.o(.SECTION); - BUILD_DIR/libultra.a:getsr.o(.SECTION); - BUILD_DIR/libultra.a:setfpccsr.o(.SECTION); - BUILD_DIR/libultra.a:setsr.o(.SECTION); - BUILD_DIR/libultra.a:setwatchlo.o(.SECTION); -#ifdef BBPLAYER - BUILD_DIR/libultra.a:_setcompare.o(.SECTION); -#else - BUILD_DIR/libultra.a:setcompare.o(.SECTION); -#endif - BUILD_DIR/libultra.a:sp.o(.SECTION); - BUILD_DIR/libultra.a:spgetstat.o(.SECTION); - BUILD_DIR/libultra.a:spsetstat.o(.SECTION); - BUILD_DIR/libultra.a:spsetpc.o(.SECTION); - BUILD_DIR/libultra.a:sprawdma.o(.SECTION); - BUILD_DIR/libultra.a:sirawread.o(.SECTION); - BUILD_DIR/libultra.a:sirawwrite.o(.SECTION); - BUILD_DIR/libultra.a:destroythread.o(.SECTION); - BUILD_DIR/libultra.a:getthreadpri.o(.SECTION); - BUILD_DIR/libultra.a:yieldthread.o(.SECTION); - BUILD_DIR/libultra.a:maptlbrdb.o(.SECTION); - BUILD_DIR/libultra.a:vi.o(.SECTION); - BUILD_DIR/libultra.a:vigetcurrcontext.o(.SECTION); - BUILD_DIR/libultra.a:normalize.o(.SECTION); - BUILD_DIR/libultra.a:conteepread.o(.SECTION); - BUILD_DIR/libultra.a:conteepwrite.o(.SECTION); - BUILD_DIR/libultra.a:setglobalintmask.o(.SECTION); - BUILD_DIR/libultra.a:resetglobalintmask.o(.SECTION); - BUILD_DIR/libultra.a:pirawdma.o(.SECTION); - BUILD_DIR/libultra.a:pigetcmdq.o(.SECTION); - BUILD_DIR/libultra.a:epirawread.o(.SECTION); - BUILD_DIR/libultra.a:epirawwrite.o(.SECTION); - BUILD_DIR/libultra.a:ldiv.o(.SECTION); - BUILD_DIR/libultra.a:si.o(.SECTION); - BUILD_DIR/libultra.a:pirawread.o(.SECTION); - BUILD_DIR/libultra.a:sethwinterrupt.o(.SECTION); - BUILD_DIR/libultra.a:piacs.o(.SECTION); - BUILD_DIR/libultra.a:epirawdma.o(.SECTION); - BUILD_DIR/libultra.a:devmgr.o(.SECTION); - BUILD_DIR/libultra.a:siacs.o(.SECTION); - BUILD_DIR/libultra.a:sirawdma.o(.SECTION); - BUILD_DIR/libultra.a:settimer.o(.SECTION); - BUILD_DIR/libultra.a:kdebugserver.o(.SECTION); - BUILD_DIR/libultra.a:vimodentsclan1.o(.SECTION); - BUILD_DIR/libultra.a:vimodepallan1.o(.SECTION); - BUILD_DIR/libultra.a:vimodempallan1.o(.SECTION); - BUILD_DIR/libultra.a:setintmask.o(.SECTION); - BUILD_DIR/libultra.a:lookatref.o(.SECTION); /* Fast3DEX2 only */ - BUILD_DIR/libultra.a:pfsselectbank.o(.SECTION); -#ifndef BBPLAYER - BUILD_DIR/libultra.a:leodiskinit.o(.SECTION); -#endif - BUILD_DIR/libultra.a:pfsgetstatus.o(.SECTION); - BUILD_DIR/libultra.a:pfsisplug.o(.SECTION); - BUILD_DIR/libultra.a:crc.o(.SECTION); - BUILD_DIR/libultra.a:contramwrite.o(.SECTION); - BUILD_DIR/libultra.a:contramread.o(.SECTION); -#ifdef LIBULTRA_EXCLUSIVE - BUILD_DIR/libultra.a:driverominit.o(.SECTION); -#endif \ No newline at end of file diff --git a/lib/ultra/audio/bnkf.c b/lib/ultra/audio/bnkf.c deleted file mode 100644 index 592a385c..00000000 --- a/lib/ultra/audio/bnkf.c +++ /dev/null @@ -1,114 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/libaudio.h" - -static void _bnkfPatchBank(ALBank *bank, ALBankFile *file, s32 table); -static void _bnkfPatchInst(ALInstrument *inst, ALBankFile *file, s32 table); -static void _bnkfPatchSound(ALSound *sound, ALBankFile *file, s32 table); -static void _bnkfPatchWaveTable(ALWaveTable *wvtbl, ALBankFile *file, s32 table); - -void alSeqFileNew(ALSeqFile *file, u8 *base) -{ - uintptr_t b = (uintptr_t) base; - int i; - - /* - * patch the file so that offsets are pointers - */ - for (i = 0; i < file->seqCount; i++) { - file->seqArray[i].offset = ALBnkfPatch(file->seqArray[i].offset, b, u8 *); - } -} - -void alBnkfNew(ALBankFile *file, u8 *table) -{ - uintptr_t t = (uintptr_t) table; - int i; - - /* - * check the file format revision in debug libraries - */ - ALFailIf(file->revision != AL_BANK_VERSION, ERR_ALBNKFNEW); - - /* - * patch the file so that offsets are pointers - */ - for (i = 0; i < file->bankCount; i++) { - file->bankArray[i] = ALBnkfPatch(file->bankArray[i], file, ALBank *); - if(file->bankArray[i]) - _bnkfPatchBank(file->bankArray[i], file, t); - } -} - -void _bnkfPatchBank(ALBank *bank, ALBankFile *file, s32 table) -{ - int i; - - if (bank->flags) - return; - - bank->flags = 1; - - if (bank->percussion) { - bank->percussion = ALBnkfPatch(bank->percussion, file, ALInstrument *); - _bnkfPatchInst(bank->percussion, file, table); - } - - for (i = 0; i < bank->instCount; i++) { - bank->instArray[i] = ALBnkfPatch(bank->instArray[i], file, ALInstrument *); - if(bank->instArray[i]) - _bnkfPatchInst(bank->instArray[i], file, table); - } -} - -void _bnkfPatchInst(ALInstrument *inst, ALBankFile *file, s32 table) -{ - int i; - - if (inst->flags) - return; - - inst->flags = 1; - - for (i = 0; i < inst->soundCount; i++) { - inst->soundArray[i] = ALBnkfPatch(inst->soundArray[i], file, ALSound *); - _bnkfPatchSound(inst->soundArray[i], file, table); - - } -} - -void _bnkfPatchSound(ALSound *sound, ALBankFile *file, s32 table) -{ - if (sound->flags) - return; - - sound->flags = 1; - - sound->envelope = ALBnkfPatch(sound->envelope, file, ALEnvelope *); - sound->keyMap = ALBnkfPatch(sound->keyMap, file, ALKeyMap *); - - sound->wavetable = ALBnkfPatch(sound->wavetable, file, ALWaveTable *); - _bnkfPatchWaveTable(sound->wavetable, file, table); -} - -void _bnkfPatchWaveTable(ALWaveTable *wvtbl, ALBankFile *file, s32 table) -{ - if (wvtbl->flags) - return; - - wvtbl->flags = 1; - - wvtbl->base += table; - - /* sct 2/14/96 - patch wavetable loop info based on type. */ - if (wvtbl->type == AL_ADPCM_WAVE) - { - wvtbl->waveInfo.adpcmWave.book = ALBnkfPatch(wvtbl->waveInfo.adpcmWave.book, file, ALADPCMBook *); - if (wvtbl->waveInfo.adpcmWave.loop) - wvtbl->waveInfo.adpcmWave.loop = ALBnkfPatch(wvtbl->waveInfo.adpcmWave.loop, file, ALADPCMloop *); - } - else if (wvtbl->type == AL_RAW16_WAVE) - { - if (wvtbl->waveInfo.rawWave.loop) - wvtbl->waveInfo.rawWave.loop = ALBnkfPatch(wvtbl->waveInfo.rawWave.loop, file, ALRawLoop *); - } -} diff --git a/lib/ultra/bb/os/_getcount.c b/lib/ultra/bb/os/_getcount.c deleted file mode 100644 index e16b0e1c..00000000 --- a/lib/ultra/bb/os/_getcount.c +++ /dev/null @@ -1,35 +0,0 @@ -#include "PR/os_internal.h" - -#ifdef BBPLAYER - -u32 __osBbLastRCount; -u32 __osBbRCountWraps; -u32 __osBbLastVCount; -u32 __osBbVCountWraps; - -u32 osGetCount(void) { - u32 count; - u32 mask; - - mask = __osDisableInt(); - - __asm__("mfc0 %0, $9" : "=r"(count)); // $9 = C0_COUNT - - if (count < __osBbLastRCount) { - __osBbRCountWraps++; - } - __osBbLastRCount = count; - - count = (((u64)__osBbRCountWraps << 32) | count) * 125ull / 192ull; - - if (count < __osBbLastVCount) { - __osBbVCountWraps++; - } - __osBbLastVCount = count; - - __osRestoreInt(mask); - - return count; -} - -#endif diff --git a/lib/ultra/bb/os/_setcompare.c b/lib/ultra/bb/os/_setcompare.c deleted file mode 100644 index 0997e7cb..00000000 --- a/lib/ultra/bb/os/_setcompare.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "PR/os_internal.h" - -#ifdef BBPLAYER - -extern u32 __osBbLastRCount; -extern u32 __osBbRCountWraps; -extern u32 __osBbLastVCount; -extern u32 __osBbVCountWraps; - -void __osSetCompare(u32 v) { - if (v != 0) { - u32 mask = __osDisableInt(); - u32 wraps = (v < __osBbLastVCount) ? __osBbVCountWraps + 1 : __osBbVCountWraps; - - v = (((u64)wraps << 32) | v) * 192ull / 125ull; - - __osRestoreInt(mask); - } - __asm__ ("mtc0 %0, $11" :: "r"(v)); // $11 = C0_COMPARE -} - -#endif diff --git a/lib/ultra/bb/sk/skapi.s b/lib/ultra/bb/sk/skapi.s deleted file mode 100644 index a4bb5181..00000000 --- a/lib/ultra/bb/sk/skapi.s +++ /dev/null @@ -1,44 +0,0 @@ -#include "sys/asm.h" -#include "sys/regdef.h" -#include "PR/R4300.h" -#include "PR/ultratypes.h" -#include "PR/bcp.h" -#include "PR/rcp.h" - -#ifdef BBPLAYER - -#define SK_FUNC(name, num) \ - LEAF(name) ;\ - .set noreorder ;\ - li v0, num ;\ - li t0, PHYS_TO_K1(0x04300014) ;\ - lw t1, (t0) ;\ - nop ;\ - jr ra ;\ - nop ;\ - .set reorder ;\ - END(name) - -SK_FUNC(skGetId, 0) -SK_FUNC(skLaunchSetup, 1) -SK_FUNC(skLaunch, 2) -SK_FUNC(skRecryptListValid, 3) -SK_FUNC(skRecryptBegin, 4) -SK_FUNC(skRecryptData, 5) -SK_FUNC(skRecryptComputeState, 6) -SK_FUNC(skRecryptEnd, 7) -SK_FUNC(skSignHash, 8) -SK_FUNC(skVerifyHash, 9) -SK_FUNC(skGetConsumption, 10) -SK_FUNC(skAdvanceTicketWindow, 11) -SK_FUNC(skSetLimit, 12) -SK_FUNC(skExit, 13) -SK_FUNC(skKeepAlive, 14) -SK_FUNC(skGetRandomKeyData, 15) -SK_FUNC(skDumpVirage, 16) -SK_FUNC(skTest2, 17) -SK_FUNC(skTest3, 18) -SK_FUNC(skResetWindow, 19) -SK_FUNC(skValidateRls, 20) - -#endif diff --git a/lib/ultra/bb/wrapper.c b/lib/ultra/bb/wrapper.c deleted file mode 100644 index 74103e2c..00000000 --- a/lib/ultra/bb/wrapper.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "ultra64.h" - -#ifdef BBPLAYER -s32 osMotorStart(OSPfs *pfs) { - return __osMotorAccess(pfs, MOTOR_START); -} - -s32 osMotorStop(OSPfs *pfs) { - return __osMotorAccess(pfs, MOTOR_STOP); -} - -static void osInitializeWrapper(void) { - __osInitialize_common(); - __osInitialize_autodetect(); -} - -void osInitialize(void) { - osInitializeWrapper(); -} -#endif diff --git a/lib/ultra/debug/kdebugserver.c b/lib/ultra/debug/kdebugserver.c deleted file mode 100644 index fce5a8b2..00000000 --- a/lib/ultra/debug/kdebugserver.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "PR/rdb.h" - -#if LIBULTRA_VERSION <= OS_VER_D || !defined(_FINALROM) -static s32 debugState = 0; -static s32 numChars = 0; -static s32 numCharsToReceive = 0; - -static u8 debugBuffer[0x100]; -#endif - -OSThread __osThreadSave; - -#if LIBULTRA_VERSION <= OS_VER_D || !defined(_FINALROM) -static void u32_to_string(u32 k, u8 *s) { - s[0] = (k >> 0x18) & 0xff; - s[1] = (k >> 0x10) & 0xff; - s[2] = (k >> 0x8) & 0xff; - s[3] = k & 0xff; -} - -static u32 string_to_u32(u8 *s) { - u32 k; - - k = (s[0] & 0xff) << 0x18; - k |= (s[1] & 0xff) << 0x10; - k |= (s[2] & 0xff) << 0x8; - k |= (s[3] & 0xff); - - return k; -} - -static void send_packet(u8 *s, s32 n) { - rdbPacket pkt; - s32 i; - - pkt.type = 2; - - for (pkt.length = n, i = 0; i < n; i++) { - pkt.buf[i] = s[i]; - } - *(volatile u32 *) RDB_BASE_REG = *(u32 *) &pkt; - - while (!(__osGetCause() & CAUSE_IP6)) { - ; - } - *(volatile u32 *) RDB_READ_INTR_REG = 0; -} - -static void send(u8 *buff, s32 len) { - s32 i; - s32 end; - s32 rem; - - if (!__osRdbWriteOK) { - while (!(__osGetCause() & CAUSE_IP6)) { - ; - } - *(volatile u32 *) RDB_READ_INTR_REG = 0; - __osRdbWriteOK = 1; - } - - i = 0; - rem = len % 3; - end = len - rem; - - for (; i < end; i += 3) { - send_packet(&buff[i], 3); - } - - if (rem > 0) { - send_packet(&buff[end], rem); - } -} - -static void process_command_memory(void) { - u32 buff = string_to_u32(&debugBuffer[1]); - u32 size = string_to_u32(&debugBuffer[5]); - - send((u8 *) (uintptr_t) buff, size); -} - -static void process_command_register(void) { - send((u8 *) &__osThreadSave.context, sizeof(__OSThreadContext)); -} - -void kdebugserver(u32 packet) { - u32 i; - rdbPacket pkt; - - *(u32 *) &pkt = packet; - - for (i = 0; i < pkt.length; i++) { - debugBuffer[numChars] = pkt.buf[i]; - numChars++; - } - - numCharsToReceive -= pkt.length; - - switch (debugState) { - case 0: - switch (pkt.buf[0]) { - case 1: - debugState = 1; - numCharsToReceive = 9 - pkt.length; - break; - case 2: - process_command_register(); - debugState = 0; - numChars = 0; - numCharsToReceive = 0; - break; - default: - debugState = 0; - numChars = 0; - numCharsToReceive = 0; - break; - } - break; - case 1: - if (numCharsToReceive <= 0) { - if (debugBuffer[0] == 1) { - process_command_memory(); - debugState = 0; - numChars = 0; - numCharsToReceive = 0; - } else { - debugState = 0; - numChars = 0; - numCharsToReceive = 0; - } - } - break; - default: - debugState = 0; - numChars = 0; - numCharsToReceive = 0; - break; - } -} -#endif diff --git a/lib/ultra/gu/mtxutil.c b/lib/ultra/gu/mtxutil.c deleted file mode 100644 index 70c0d1e9..00000000 --- a/lib/ultra/gu/mtxutil.c +++ /dev/null @@ -1,90 +0,0 @@ - -/************************************************************************** - * * - * Copyright (C) 1994, Silicon Graphics, Inc. * - * * - * These coded instructions, statements, and computer programs contain * - * unpublished proprietary information of Silicon Graphics, Inc., and * - * are protected by Federal copyright law. They may not be disclosed * - * to third parties or copied or duplicated in any form, in whole or * - * in part, without the prior written consent of Silicon Graphics, Inc. * - * * - **************************************************************************/ - -#include "guint.h" -#ifdef GBI_FLOATS -#include -#endif - -#if LIBULTRA_VERSION < OS_VER_K || !defined(TARGET_N64) -#ifndef GBI_FLOATS -void guMtxF2L(float mf[4][4], Mtx *m) -{ - int i, j; - int e1,e2; - int *ai,*af; - - - ai=(int *) &m->m[0][0]; - af=(int *) &m->m[2][0]; - - for (i=0; i<4; i++) - for (j=0; j<2; j++) { - e1=FTOFIX32(mf[i][j*2]); - e2=FTOFIX32(mf[i][j*2+1]); - *(ai++) = ( e1 & 0xffff0000 ) | ((e2 >> 16)&0xffff); - *(af++) = ((e1 << 16) & 0xffff0000) | (e2 & 0xffff); - } -} - -void guMtxL2F(float mf[4][4], Mtx *m) -{ - int i, j; - unsigned int e1,e2; - unsigned int *ai,*af; - int q1,q2; - - ai=(unsigned int *) &m->m[0][0]; - af=(unsigned int *) &m->m[2][0]; - - for (i=0; i<4; i++) - for (j=0; j<2; j++) { - e1 = (*ai & 0xffff0000) | ((*af >> 16) & 0xffff); - e2 = ((*(ai++) << 16) & 0xffff0000) | (*(af++) & 0xffff); - q1 = *((int *)&e1); - q2 = *((int *)&e2); - - mf[i][j*2] = FIX32TOF(q1); - mf[i][j*2+1] = FIX32TOF(q2); - } -} -#else -void guMtxF2L(float mf[4][4], Mtx *m) { - memcpy(m, mf, sizeof(Mtx)); -} -#endif - -void guMtxIdentF(float mf[4][4]) -{ - int i, j; - - for (i=0; i<4; i++) - for (j=0; j<4; j++) - if (i == j) mf[i][j] = 1.0; - else mf[i][j] = 0.0; -} - -void guMtxIdent(Mtx *m) -{ -#ifndef GBI_FLOATS - float mf[4][4]; - - guMtxIdentF(mf); - - guMtxF2L(mf, m); -#else - guMtxIdentF(m->m); -#endif -} - -#endif diff --git a/lib/ultra/io/aigetlen.c b/lib/ultra/io/aigetlen.c deleted file mode 100644 index 582f180c..00000000 --- a/lib/ultra/io/aigetlen.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "PR/rcp.h" - -u32 osAiGetLength() { - return IO_READ(AI_LEN_REG); -} diff --git a/lib/ultra/io/aisetfreq.c b/lib/ultra/io/aisetfreq.c deleted file mode 100644 index cc04e022..00000000 --- a/lib/ultra/io/aisetfreq.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "PR/rcp.h" -#include "../os/osint.h" - -s32 osAiSetFrequency(u32 frequency) { - register u32 dacRate; -#if LIBULTRA_VERSION >= OS_VER_J - register u32 bitRate; -#else - register s32 bitRate; -#endif - register float f; - - f = osViClock / (float) frequency + .5f; - dacRate = f; - - if (dacRate < AI_MIN_DAC_RATE) { - return -1; - } - - bitRate = (dacRate / 66) & 0xff; - - if (bitRate > AI_MAX_BIT_RATE) { - bitRate = AI_MAX_BIT_RATE; - } - - IO_WRITE(AI_DACRATE_REG, dacRate - 1); - IO_WRITE(AI_BITRATE_REG, bitRate - 1); -#if LIBULTRA_VERSION < OS_VER_J - IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); -#endif - return osViClock / (s32) dacRate; -} diff --git a/lib/ultra/io/aisetnextbuf.c b/lib/ultra/io/aisetnextbuf.c deleted file mode 100644 index 24a15d30..00000000 --- a/lib/ultra/io/aisetnextbuf.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "../os/osint.h" - -/** - * It is worth noting that a previous hardware bug has been fixed by a software - * patch in osAiSetNextBuffer. This bug occurred when the address of the end of the - * buffer specified by osAiSetNextBuffer was at a specific value. This value - * occurred when the following was true: - * - * Prior 2.0I: (vaddr + nbytes) & 0x00003FFF == 0x2000 - * After 2.0I: (vaddr + nbytes) & 0x00001FFF == 0x0000 - * - * In this case, the DMA transfer does not complete successfully. This can cause - * clicks and pops in the audio output. This bug no longer requires special handling - * by the application because it is now patched by osAiSetNextBuffer. - */ - -s32 osAiSetNextBuffer(void *bufPtr, u32 size) { - static u8 hdwrBugFlag = FALSE; - char *bptr; - -#if LIBULTRA_VERSION >= OS_VER_J - if (__osAiDeviceBusy()) { - return -1; - } -#endif - - bptr = bufPtr; - - if (hdwrBugFlag) { - bptr -= 0x2000; - } - -#if LIBULTRA_VERSION >= OS_VER_I - if ((((uintptr_t) bufPtr + size) & 0x1fff) == 0) -#else - if ((((uintptr_t) bufPtr + size) & 0x3fff) == 0x2000) -#endif - { - hdwrBugFlag = TRUE; - } else { - hdwrBugFlag = FALSE; - } - -#if LIBULTRA_VERSION < OS_VER_J - if (__osAiDeviceBusy()) { - return -1; - } -#endif - - IO_WRITE(AI_DRAM_ADDR_REG, osVirtualToPhysical(bptr)); - IO_WRITE(AI_LEN_REG, size); - return 0; -} diff --git a/lib/ultra/io/conteeplongread.c b/lib/ultra/io/conteeplongread.c deleted file mode 100644 index b5911fbf..00000000 --- a/lib/ultra/io/conteeplongread.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "PR/os_internal.h" -#include "controller.h" - -s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, s32 length) { - s32 ret = 0; -#if LIBULTRA_VERSION < OS_VER_I - if (address > EEPROM_MAXBLOCKS) { - return CONT_RANGE_ERROR; - } -#endif - - while (length > 0) { - ERRCK(osEepromRead(mq, address, buffer)); - length -= EEPROM_BLOCK_SIZE; - address++; - buffer += EEPROM_BLOCK_SIZE; -#if LIBULTRA_VERSION < OS_VER_I - osSetTimer(&__osEepromTimer, OS_USEC_TO_CYCLES(12000), 0, &__osEepromTimerQ, &__osEepromTimerMsg); - osRecvMesg(&__osEepromTimerQ, NULL, OS_MESG_BLOCK); -#endif - } - - return ret; -} diff --git a/lib/ultra/io/conteepprobe.c b/lib/ultra/io/conteepprobe.c deleted file mode 100644 index 3512661f..00000000 --- a/lib/ultra/io/conteepprobe.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -#ifdef BBPLAYER -s32 osEepromProbe(UNUSED OSMesgQueue *mq) { - s32 ret = 0; - - __osSiGetAccess(); - - if (__osBbEepromSize == EEPROM_SIZE) { - ret = EEPROM_TYPE_4K; - } else if (__osBbEepromSize == EEP16K_SIZE) { - ret = EEPROM_TYPE_16K; - } - - __osSiRelAccess(); - return ret; -} - -#else -s32 osEepromProbe(OSMesgQueue *mq) { - s32 ret = 0; -#if LIBULTRA_VERSION > OS_VER_H - u16 type; -#endif - OSContStatus sdata; - - __osSiGetAccess(); - -#if LIBULTRA_VERSION > OS_VER_H - ret = __osEepStatus(mq, &sdata); - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - - if (ret != 0) { - ret = 0; - } else { - switch (type) { - case CONT_EEPROM: - ret = EEPROM_TYPE_4K; - break; - case CONT_EEPROM | CONT_EEP16K: - ret = EEPROM_TYPE_16K; - break; - default: - ret = 0; - break; - } - } - -#if BUILD_VERSION >= OS_VER_L - __osEepromRead16K = 0; -#endif -#else - ret = __osEepStatus(mq, &sdata); - ret = (ret == 0 && (sdata.type & CONT_EEPROM)) ? EEPROM_TYPE_4K : 0; -#endif - - __osSiRelAccess(); - return ret; -} -#endif diff --git a/lib/ultra/io/conteepread.c b/lib/ultra/io/conteepread.c deleted file mode 100644 index a82619ab..00000000 --- a/lib/ultra/io/conteepread.c +++ /dev/null @@ -1,174 +0,0 @@ -#include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -#if LIBULTRA_VERSION > OS_VER_H -ALIGNED16 OSPifRam __osEepPifRam; -#if LIBULTRA_VERSION >= OS_VER_L -s32 __osEepromRead16K; -#endif -#endif - -#ifdef BBPLAYER - -s32 osEepromRead(UNUSED OSMesgQueue *mq, u8 address, u8 *buffer) { - s32 ret = 0; - - __osSiGetAccess(); - - if (__osBbEepromSize == EEPROM_SIZE) { - if (address >= EEPROM_MAXBLOCKS) { - ret = CONT_RANGE_ERROR; - } - } else if (__osBbEepromSize != EEP16K_SIZE) { - ret = CONT_NO_RESPONSE_ERROR; - } - - if (ret == 0) { - int i; - for (i = 0; i < EEPROM_BLOCK_SIZE; i++) { - buffer[i] = (__osBbEepromAddress + address * EEPROM_BLOCK_SIZE)[i]; - } - } - - __osSiRelAccess(); - return ret; -} - -#else -static void __osPackEepReadData(u8); - -s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) { - s32 ret = 0; - s32 i = 0; -#if LIBULTRA_VERSION > OS_VER_H - u16 type; -#endif - u8 *ptr = (u8 *) &__osEepPifRam.ramarray; - OSContStatus sdata; - __OSContEepromFormat eepromformat; - -#if LIBULTRA_VERSION < OS_VER_I - if (address > EEPROM_MAXBLOCKS) { - return CONT_RANGE_ERROR; - } -#endif - - __osSiGetAccess(); - ret = __osEepStatus(mq, &sdata); - -#if LIBULTRA_VERSION > OS_VER_H - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - -#if LIBULTRA_VERSION < OS_VER_J - if (ret != 0) { - __osSiRelAccess(); - return CONT_NO_RESPONSE_ERROR; - } -#else - if (ret == 0) { -#endif - switch (type) { - case CONT_EEPROM: - CONT_CHECK_BLOCK(address, EEPROM_MAXBLOCKS, CONT_RANGE_ERROR); - break; - case CONT_EEPROM | CONT_EEP16K: - // error not technically possible - CONT_CHECK_BLOCK(address, EEP16K_MAXBLOCKS, CONT_RANGE_ERROR) -#if LIBULTRA_VERSION >= OS_VER_L - else { - __osEepromRead16K = 1; - } -#endif - break; - default: -#if LIBULTRA_VERSION < OS_VER_J - __osSiRelAccess(); - return CONT_NO_RESPONSE_ERROR; -#else - ret = CONT_NO_RESPONSE_ERROR; -#endif - } -#if LIBULTRA_VERSION >= OS_VER_J - } - - if (ret != 0) { - __osSiRelAccess(); - return ret; - } -#endif - -#else - if (ret != 0 || sdata.type != CONT_EEPROM) { - return CONT_NO_RESPONSE_ERROR; - } -#endif - - while (sdata.status & CONT_EEPROM_BUSY) { - __osEepStatus(mq, &sdata); - } - __osPackEepReadData(address); - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); // send command to pif - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - -#if LIBULTRA_VERSION < OS_VER_I - CONT_PIFRAM_SET(__osEepPifRam, CONT_CMD_NOP, 0); -#endif - - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); //recv response - __osContLastCmd = CONT_CMD_READ_EEPROM; - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - for (i = 0; i < MAXCONTROLLERS; i++) { - ptr++; - } - - eepromformat = *(__OSContEepromFormat *) ptr; - ret = CHNL_ERR(eepromformat); - - if (ret == 0) { - for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) { - *buffer++ = eepromformat.data[i]; - } - } - - __osSiRelAccess(); - return ret; -} - -void __osPackEepReadData(u8 address) { - u8 *ptr = (u8 *) &__osEepPifRam.ramarray; - __OSContEepromFormat eepromformat; - s32 i; - -#if LIBULTRA_VERSION >= OS_VER_J - __osEepPifRam.pifstatus = CONT_CMD_EXE; -#else - CONT_PIFRAM_SET(__osEepPifRam, CONT_CMD_NOP, CONT_CMD_EXE); -#endif - - eepromformat.txsize = CONT_CMD_READ_EEPROM_TX; - eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX; - eepromformat.cmd = CONT_CMD_READ_EEPROM; - eepromformat.address = address; - -#if LIBULTRA_VERSION < OS_VER_J - for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) { - eepromformat.data[i] = 0; - } -#endif - - for (i = 0; i < MAXCONTROLLERS; i++) { - *ptr++ = 0; - } - - *(__OSContEepromFormat *) ptr = eepromformat; - ptr += sizeof(__OSContEepromFormat); - *ptr = CONT_CMD_END; -} - -#endif diff --git a/lib/ultra/io/contreaddata.c b/lib/ultra/io/contreaddata.c deleted file mode 100644 index b89e8942..00000000 --- a/lib/ultra/io/contreaddata.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -void __osPackReadData(void); - -s32 osContStartReadData(OSMesgQueue *mesg) { - s32 ret = 0; -#if LIBULTRA_VERSION < OS_VER_I - s32 i; -#endif - - __osSiGetAccess(); - - if (__osContLastCmd != CONT_CMD_READ_BUTTON) { - __osPackReadData(); - ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); - osRecvMesg(mesg, NULL, OS_MESG_BLOCK); - } - -#if LIBULTRA_VERSION < OS_VER_I - CONT_PIFRAM_SET(__osContPifRam, CONT_CMD_NOP, 0); -#endif - - ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); -#ifdef BBPLAYER - __osContLastCmd = CONT_CMD_CHANNEL_RESET; -#else - __osContLastCmd = CONT_CMD_READ_BUTTON; -#endif - - __osSiRelAccess(); - - return ret; -} - -void osContGetReadData(OSContPad *data) { - u8 *ptr = (u8 *) __osContPifRam.ramarray; - __OSContReadFormat readformat; - s32 i; - - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(readformat), data++) { - readformat = * (__OSContReadFormat *) ptr; - data->errnum = CHNL_ERR(readformat); - - if (data->errnum != 0) { - continue; - } - - data->button = readformat.button; - data->stick_x = readformat.stick_x; - data->stick_y = readformat.stick_y; - } - -#ifdef BBPLAYER - if (__osBbIsBb && __osBbHackFlags != 0) { - OSContPad tmp; - data -= __osMaxControllers; - - tmp = *data; - *data = data[__osBbHackFlags]; - data[__osBbHackFlags] = tmp; - } -#endif -} - -void __osPackReadData() { - u8 *ptr = (u8 *) __osContPifRam.ramarray; - __OSContReadFormat readformat; - s32 i; - - CONT_PIFRAM_SET(__osContPifRam, 0, CONT_CMD_EXE); - - readformat.dummy = CONT_CMD_NOP; - readformat.txsize = CONT_CMD_READ_BUTTON_TX; - readformat.rxsize = CONT_CMD_READ_BUTTON_RX; - readformat.cmd = CONT_CMD_READ_BUTTON; - readformat.button = 0xFFFF; - readformat.stick_x = -1; - readformat.stick_y = -1; - - for (i = 0; i < __osMaxControllers; i++) { - * (__OSContReadFormat *) ptr = readformat; - ptr += sizeof(readformat); - } - *ptr = CONT_CMD_END; -} diff --git a/lib/ultra/io/controller.c b/lib/ultra/io/controller.c deleted file mode 100644 index f21a9c75..00000000 --- a/lib/ultra/io/controller.c +++ /dev/null @@ -1,125 +0,0 @@ -#include "PR/os_internal.h" -#include "controller.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -#if LIBULTRA_VERSION > OS_VER_D -#define CONT_CMD_REQ CONT_CMD_REQUEST_STATUS -#else -#define CONT_CMD_REQ CONT_CMD_RESET -#endif - -u32 _osContInitialized = 0; - -ALIGNED16 OSPifRam __osContPifRam; -u8 __osContLastCmd; -u8 __osMaxControllers; - -OSTimer __osEepromTimer; -ALIGNED8 OSMesgQueue __osEepromTimerQ; -OSMesg __osEepromTimerMsg; - -s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus *data) { - OSMesg dummy; - u32 ret = 0; - OSTime t; - OSTimer mytimer; - OSMesgQueue timerMesgQueue; - - if (_osContInitialized) { - return 0; - } - _osContInitialized = 1; - - t = osGetTime(); - if (t < OS_USEC_TO_CYCLES(500000)) { - osCreateMesgQueue(&timerMesgQueue, &dummy, 1); - osSetTimer(&mytimer, OS_USEC_TO_CYCLES(500000) - t, 0, &timerMesgQueue, &dummy); - osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); - } - - __osMaxControllers = MAXCONTROLLERS; - - __osPackRequestData(CONT_CMD_REQ); - - ret = __osSiRawStartDma(OS_WRITE, __osContPifRam.ramarray); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, __osContPifRam.ramarray); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); - - __osContGetInitData(bitpattern, data); -#ifdef BBPLAYER - __osContLastCmd = CONT_CMD_CHANNEL_RESET; -#else - __osContLastCmd = CONT_CMD_REQ; -#endif - __osSiCreateAccessQueue(); - osCreateMesgQueue(&__osEepromTimerQ, &__osEepromTimerMsg, 1); - - return ret; -} - -void __osContGetInitData(u8 *pattern, OSContStatus *data) { - u8 *ptr; - __OSContRequesFormat response; - s32 i; - u8 bits; - - bits = 0; - ptr = (u8 *) __osContPifRam.ramarray; - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(response), data++) { - response = *REQFORMAT(ptr); - data->errnum = CHNL_ERR(response); - if (data->errnum == 0) { - data->type = response.typel << 8 | response.typeh; -#ifdef BBPLAYER - data->status = __osBbPakAddress[i] != NULL; -#else - data->status = response.status; -#endif - - bits |= 1 << i; - } - } -#ifdef BBPLAYER - if (__osBbIsBb && __osBbHackFlags != 0) { - OSContStatus tmp; - bits = (bits & ~((1 << __osBbHackFlags) | 1)) | - ((bits & 1) << __osBbHackFlags) | - ((bits & (1 << __osBbHackFlags)) >> __osBbHackFlags); - data -= __osMaxControllers; - tmp = *data; - *data = data[__osBbHackFlags]; - data[__osBbHackFlags] = tmp; - } -#endif - - *pattern = bits; -} - -void __osPackRequestData(u8 cmd) { - u8 *ptr; - __OSContRequesFormat requestHeader; - s32 i; - - CONT_PIFRAM_SET(__osContPifRam, 0, CONT_CMD_EXE); - - ptr = (u8 *) __osContPifRam.ramarray; - requestHeader.dummy = CONT_CMD_NOP; - requestHeader.txsize = CONT_CMD_RESET_TX; - requestHeader.rxsize = CONT_CMD_RESET_RX; - requestHeader.cmd = cmd; - requestHeader.typeh = CONT_CMD_NOP; - requestHeader.typel = CONT_CMD_NOP; - requestHeader.status = CONT_CMD_NOP; - requestHeader.dummy1 = CONT_CMD_NOP; - - for (i = 0; i < __osMaxControllers; i++) { - *REQFORMAT(ptr) = requestHeader; - ptr += sizeof(requestHeader); - } - *ptr = CONT_CMD_END; -} diff --git a/lib/ultra/io/controller.h b/lib/ultra/io/controller.h deleted file mode 100644 index 3d275980..00000000 --- a/lib/ultra/io/controller.h +++ /dev/null @@ -1,308 +0,0 @@ -#ifndef _CONTROLLER_H -#define _CONTROLLER_H -#include "PR/os_internal.h" -#include "PR/os.h" -#include "PR/rcp.h" - -//should go somewhere else but -#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0]))) -#define CHNL_ERR(format) (((format).rxsize & CHNL_ERR_MASK) >> 4) - -typedef struct { - /* 0x00 */ u32 ramarray[15]; - /* 0x3C */ u32 pifstatus; -} OSPifRam; - -typedef struct { - /* 0x0 */ u8 dummy; - /* 0x1 */ u8 txsize; - /* 0x2 */ u8 rxsize; - /* 0x3 */ u8 cmd; - /* 0x4 */ u16 button; - /* 0x6 */ s8 stick_x; - /* 0x7 */ s8 stick_y; -} __OSContReadFormat; - -typedef struct { - /* 0x0 */ u8 dummy; - /* 0x1 */ u8 txsize; - /* 0x2 */ u8 rxsize; - /* 0x3 */ u8 cmd; - /* 0x4 */ u8 typeh; - /* 0x5 */ u8 typel; - /* 0x6 */ u8 status; - /* 0x7 */ u8 dummy1; -} __OSContRequesFormat; - -typedef struct { - /* 0x0 */ u8 dummy; - /* 0x1 */ u8 txsize; - /* 0x2 */ u8 rxsize; - /* 0x3 */ u8 cmd; -#if LIBULTRA_VERSION >= OS_VER_J - /* 0x4 */ u8 addrh; - /* 0x5 */ u8 addrl; -#else - /* 0x4 */ u16 address; -#endif - /* 0x6 */ u8 data[BLOCKSIZE]; - /* 0x26 */ u8 datacrc; -} __OSContRamReadFormat; - -typedef union { - /* 0x0 */ struct - { - /* 0x0 */ u8 bank; - /* 0x1 */ u8 page; - } inode_t; - /* 0x0 */ u16 ipage; -} __OSInodeUnit; - -typedef struct { - /* 0x0 */ u32 game_code; - /* 0x4 */ u16 company_code; - /* 0x6 */ __OSInodeUnit start_page; - /* 0x8 */ u8 status; - /* 0x9 */ s8 reserved; - /* 0xA */ u16 data_sum; - /* 0xC */ u8 ext_name[PFS_FILE_EXT_LEN]; - /* 0x10 */ u8 game_name[PFS_FILE_NAME_LEN]; -} __OSDir; - -typedef struct { - /* 0x0 */ __OSInodeUnit inode_page[128]; -} __OSInode; - -typedef struct { - /* 0x0 */ u32 repaired; - /* 0x4 */ u32 random; - /* 0x8 */ u64 serial_mid; - /* 0x10 */ u64 serial_low; - /* 0x18 */ u16 deviceid; - /* 0x1A */ u8 banks; - /* 0x1B */ u8 version; - /* 0x1C */ u16 checksum; - /* 0x1E */ u16 inverted_checksum; -} __OSPackId; - -typedef struct { - /* 0x0 */ u8 txsize; - /* 0x1 */ u8 rxsize; - /* 0x2 */ u8 cmd; - /* 0x3 */ u8 address; - /* 0x4 */ u8 data[EEPROM_BLOCK_SIZE]; -} __OSContEepromFormat; - -// Joybus commands -//from: http://en64.shoutwiki.com/wiki/SI_Registers_Detailed#CONT_CMD_Usage -#define CONT_CMD_REQUEST_STATUS 0 -#define CONT_CMD_READ_BUTTON 1 -#define CONT_CMD_READ_PAK 2 -#define CONT_CMD_WRITE_PAK 3 -#define CONT_CMD_READ_EEPROM 4 -#define CONT_CMD_WRITE_EEPROM 5 -#define CONT_CMD_READ36_VOICE 9 -#define CONT_CMD_WRITE20_VOICE 10 -#define CONT_CMD_READ2_VOICE 11 -#define CONT_CMD_WRITE4_VOICE 12 -#define CONT_CMD_SWRITE_VOICE 13 -#define CONT_CMD_CHANNEL_RESET 0xFD -#define CONT_CMD_RESET 0xFF - -// Bytes transmitted for each joybus command -#define CONT_CMD_REQUEST_STATUS_TX 1 -#define CONT_CMD_READ_BUTTON_TX 1 -#define CONT_CMD_READ_PAK_TX 3 -#define CONT_CMD_WRITE_PAK_TX 35 -#define CONT_CMD_READ_EEPROM_TX 2 -#define CONT_CMD_WRITE_EEPROM_TX 10 -#define CONT_CMD_READ36_VOICE_TX 3 -#define CONT_CMD_WRITE20_VOICE_TX 23 -#define CONT_CMD_READ2_VOICE_TX 3 -#define CONT_CMD_WRITE4_VOICE_TX 7 -#define CONT_CMD_SWRITE_VOICE_TX 3 -#define CONT_CMD_RESET_TX 1 - -// Bytes received for each joybus command -#define CONT_CMD_REQUEST_STATUS_RX 3 -#define CONT_CMD_READ_BUTTON_RX 4 -#define CONT_CMD_READ_PAK_RX 33 -#define CONT_CMD_WRITE_PAK_RX 1 -#define CONT_CMD_READ_EEPROM_RX 8 -#define CONT_CMD_WRITE_EEPROM_RX 1 -#define CONT_CMD_READ36_VOICE_RX 37 -#define CONT_CMD_WRITE20_VOICE_RX 1 -#define CONT_CMD_READ2_VOICE_RX 3 -#define CONT_CMD_WRITE4_VOICE_RX 1 -#define CONT_CMD_SWRITE_VOICE_RX 1 -#define CONT_CMD_RESET_RX 3 - -#define CONT_CMD_NOP 0xff -#define CONT_CMD_END 0xfe //indicates end of a command -#define CONT_CMD_EXE 1 //set pif ram status byte to this to do a command - -#define DIR_STATUS_EMPTY 0 -#define DIR_STATUS_UNKNOWN 1 -#define DIR_STATUS_OCCUPIED 2 - -// Controller accessory addresses -// https://github.com/joeldipops/TransferBoy/blob/master/docs/TransferPakReference.md - -// Accesory detection -#define CONT_ADDR_DETECT 0x8000 -// Rumble -#define CONT_ADDR_RUMBLE 0xC000 -// Controller Pak -// Transfer Pak -#define CONT_ADDR_GB_POWER 0x8000 // Same as the detection address, but semantically different -#define CONT_ADDR_GB_BANK 0xA000 -#define CONT_ADDR_GB_STATUS 0xB000 - -// Addresses sent to controller accessories are in blocks, not bytes -#define CONT_BLOCKS(x) ((x) / BLOCKSIZE) - -// Block addresses of the above -#define CONT_BLOCK_DETECT CONT_BLOCKS(CONT_ADDR_DETECT) -#define CONT_BLOCK_RUMBLE CONT_BLOCKS(CONT_ADDR_RUMBLE) -#define CONT_BLOCK_GB_POWER CONT_BLOCKS(CONT_ADDR_GB_POWER) -#define CONT_BLOCK_GB_BANK CONT_BLOCKS(CONT_ADDR_GB_BANK) -#define CONT_BLOCK_GB_STATUS CONT_BLOCKS(CONT_ADDR_GB_STATUS) - - -// Transfer pak - -#define GB_POWER_ON 0x84 -#define GB_POWER_OFF 0xFE - -typedef struct -{ - /* 0x0 */ __OSInode inode; - /* 0x100 */ u8 bank; - /* 0x101 */ u8 map[PFS_INODE_DIST_MAP]; -} __OSInodeCache; - -extern s32 __osEepStatus(OSMesgQueue *, OSContStatus *); -u16 __osSumcalc(u8 *ptr, int length); -s32 __osIdCheckSum(u16 *ptr, u16 *csum, u16 *icsum); -s32 __osRepairPackId(OSPfs *pfs, __OSPackId *badid, __OSPackId *newid); -s32 __osCheckPackId(OSPfs *pfs, __OSPackId *temp); -s32 __osGetId(OSPfs *pfs); -s32 __osCheckId(OSPfs *pfs); -s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank); -#if LIBULTRA_VERSION >= OS_VER_J -s32 __osPfsSelectBank(OSPfs *pfs, u8 bank); -#else -s32 __osPfsSelectBank(OSPfs *pfs); -#endif -s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page); -#if LIBULTRA_VERSION >= OS_VER_J -s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u8 bank, __OSInodeUnit *last_page); -#else -s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u16 *sum, u8 bank, __OSInodeUnit *last_page, int flag); -#endif -s32 __osBlockSum(OSPfs *pfs, u8 page_no, u16 *sum, u8 bank); -s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer); -s32 __osContRamWrite(OSMesgQueue *mq, s32 channel, u16 address, u8 *buffer, s32 force); -void __osContGetInitData(u8 *pattern, OSContStatus *data); -void __osPackRequestData(u8 cmd); -void __osPfsRequestData(u8 cmd); -void __osPfsGetInitData(u8* pattern, OSContStatus* data); -u8 __osContAddressCrc(u16 addr); -u8 __osContDataCrc(u8 *data); -s32 __osPfsGetStatus(OSMesgQueue *queue, int channel); - -extern u8 __osContLastCmd; -extern OSTimer __osEepromTimer; -extern OSMesg __osEepromTimerMsg; -extern OSMesgQueue __osEepromTimerQ; -extern OSPifRam __osEepPifRam; -extern OSPifRam __osContPifRam; -extern OSPifRam __osPfsPifRam; -extern u8 __osMaxControllers; -extern s32 __osPfsLastChannel; -extern s32 __osEepromRead16K; - -#if LIBULTRA_VERSION >= OS_VER_J -#define CONT_READFORMAT_ADDR(s, d) \ - s->addrh = d >> 3; \ - s->addrl = (__osContAddressCrc(d) | (d << 5)); -#else -#define CONT_READFORMAT_ADDR(s, d) \ - s.address = (d << 5) | __osContAddressCrc(d); -#endif - -#if LIBULTRA_VERSION > OS_VER_H -#define CONT_PIFRAM_SET(addr, cmdram, cmdstatus) \ - for (i = 0; i < ARRAY_COUNT(addr.ramarray); i++) { \ - addr.ramarray[i] = cmdram; \ - } \ - addr.pifstatus = cmdstatus; -#else -// for loop writing out of bounds of ram array -#define CONT_PIFRAM_SET(addr, cmdram, cmdstatus) \ - for (i = 0; i < ARRAY_COUNT(addr.ramarray) + 1; i++) { \ - addr.ramarray[i] = cmdram; \ - } \ - addr.pifstatus = cmdstatus; -#endif - -#if LIBULTRA_VERSION < OS_VER_J -#define CONT_CHECK_BLOCK(ad, bl, er) \ - if (ad > bl) { \ - __osSiRelAccess(); \ - return er; \ - } -#else -#define CONT_CHECK_BLOCK(ad, bl, er) \ - if (ad >= bl) { \ - ret = er; \ - } -#endif - -#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) -#define REQFORMAT(ptr) ((__OSContRequesFormat*)(ptr)) - -//some version of this almost certainly existed since there's plenty of times where it's used right before a return 0 -#define ERRCK(fn) \ - ret = fn; \ - if (ret != 0) \ - return ret; - -#if LIBULTRA_VERSION >= OS_VER_J -#define SELECT_BANK(pfs, bank) \ - __osPfsSelectBank((pfs), (bank)) - -#define SET_ACTIVEBANK_TO_ZERO \ - if (pfs->activebank != 0) \ - { \ - ERRCK(__osPfsSelectBank(pfs, 0)) \ - } -#else -#define SELECT_BANK(pfs, bank) \ - (pfs->activebank = (bank), \ - __osPfsSelectBank((pfs))) \ - -#define SET_ACTIVEBANK_TO_ZERO \ - if (pfs->activebank != 0) \ - { \ - pfs->activebank = 0; \ - ERRCK(__osPfsSelectBank(pfs)) \ - } -#endif - -#define PFS_CHECK_ID \ - if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) \ - return PFS_ERR_NEW_PACK; - -#define PFS_CHECK_STATUS \ - if ((pfs->status & PFS_INITIALIZED) == 0) \ - return PFS_ERR_INVALID; - -#define PFS_GET_STATUS \ - __osSiGetAccess(); \ - ret = __osPfsGetStatus(queue, channel); \ - __osSiRelAccess(); \ - if (ret != 0) \ - return ret; - -#endif diff --git a/lib/ultra/io/crc.c b/lib/ultra/io/crc.c deleted file mode 100644 index 5be2ff22..00000000 --- a/lib/ultra/io/crc.c +++ /dev/null @@ -1,111 +0,0 @@ -#include "PR/os_internal.h" - -#if LIBULTRA_VERSION >= OS_VER_J -u8 __osContAddressCrc(u16 addr) { - u32 temp = 0; - u32 i = 0x400; - - do { - temp <<= 1; - - if (addr & i) { - if (temp & 0x20) { - temp ^= 0x14; - } else { - ++temp; - } - } else if (temp & 0x20) { - temp ^= 0x15; - } - - i >>= 1; - } while (i != 0); - - i = 5; - - do { - temp <<= 1; - if (temp & 0x20) { - temp ^= 0x15; - } - } while (--i != 0); - - return temp & 0x1F; -} - -u8 __osContDataCrc(u8* data) { - u32 temp = 0; - u32 i; - u32 j; - - for (i = 0x20; i; --i) { - for (j = 0x80; j; j >>= 1) { - temp <<= 1; - - if ((*data & j) != 0) { - if ((temp & 0x100) != 0) { - temp ^= 0x84; - } else { - ++temp; - } - } else if (temp & 0x100) { - temp ^= 0x85; - } - } - - data++; - } - do { - temp <<= 1; - - if (temp & 0x100) { - temp ^= 0x85; - } - } while (++i < 8U); - - return temp; -} - -#else -u8 __osContAddressCrc(u16 addr) { - u8 temp = 0; - u8 temp2; - int i; - - for (i = 0; i < 16; i++) { - temp2 = (temp & 0x10) ? 0x15 : 0; - - temp <<= 1; - temp |= (u8)((addr & 0x400) ? 1 : 0); - addr <<= 1; - temp ^= temp2; - } - - return temp & 0x1f; -} - -u8 __osContDataCrc(u8 *data) { - u8 temp = 0; - u8 temp2; - int i; - int j; - - for (i = 0; i <= 32; i++) { - for (j = 7; j > -1; j--) { - temp2 = (temp & 0x80) ? 0x85 : 0; - - temp <<= 1; - - if (i == 32) { - temp &= -1; - } else { - temp |= ((*data & (1 << j)) ? 1 : 0); - } - - temp ^= temp2; - } - data++; - } - return temp; -} -#endif diff --git a/lib/ultra/io/devmgr.c b/lib/ultra/io/devmgr.c deleted file mode 100644 index f5284e5b..00000000 --- a/lib/ultra/io/devmgr.c +++ /dev/null @@ -1,196 +0,0 @@ -#include "PR/os_internal.h" -#include "piint.h" -#include "macros.h" - -#if LIBULTRA_VERSION > OS_VER_D -#include "PR/rcp.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -void __osDevMgrMain(void *args) { - OSIoMesg *mb; - OSMesg em; - OSMesg dummy; - s32 ret; - OSDevMgr *dm = (OSDevMgr *) args; -#if LIBULTRA_VERSION == OS_VER_F - UNUSED u32 sm = 0; -#endif - u32 messageSend = 0; -#ifdef BBPLAYER - s32 check = FALSE; -#endif - - mb = NULL; - ret = 0; - - while (TRUE) { - osRecvMesg(dm->cmdQueue, (OSMesg) &mb, OS_MESG_BLOCK); - - if (mb->piHandle != NULL && - mb->piHandle->type == DEVICE_TYPE_64DD && - (mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0 || - mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_1)) { - __OSBlockInfo *blockInfo; - __OSTranxInfo *info; - info = &mb->piHandle->transferInfo; - blockInfo = &info->block[info->blockNum]; - info->sectorNum = -1; - - if (info->transferMode != LEO_SECTOR_MODE) { - blockInfo->dramAddr = (void *) ((u32) blockInfo->dramAddr - blockInfo->sectorSize); - } - - if (info->transferMode == LEO_TRACK_MODE && mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0) { - messageSend = 1; - } else { - messageSend = 0; - } - - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - __osResetGlobalIntMask(OS_IM_PI); - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, (info->bmCtlShadow | 0x80000000)); - -readblock1: - osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); -#if LIBULTRA_VERSION >= OS_VER_H - info = &mb->piHandle->transferInfo; - blockInfo = &info->block[info->blockNum]; - - if (blockInfo->errStatus == LEO_ERROR_29) { - u32 stat; - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow); - osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat); - - if (stat & LEO_STATUS_MECHANIC_INTERRUPT) { - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); - } - - blockInfo->errStatus = LEO_ERROR_4; - IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); - __osSetGlobalIntMask(OS_IM_PI | SR_IBIT4); - } - - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - - if (messageSend == 1 && mb->piHandle->transferInfo.block[0].errStatus == LEO_ERROR_GOOD) { - messageSend = 0; - goto readblock1; - } -#else - sm = osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - - if (messageSend == 1 && mb->piHandle->transferInfo.errStatus == LEO_ERROR_GOOD) { - messageSend = 0; - goto readblock1; - } -#endif - osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); - - if (mb->piHandle->transferInfo.blockNum == 1) { - osYieldThread(); - } - } else { - switch (mb->hdr.type) { - case OS_MESG_TYPE_DMAREAD: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); -#ifdef BBPLAYER - if (__osBbIsBb == TRUE && ((uintptr_t) mb->dramAddr & 0x7f) >= 0x60) { - check = TRUE; - ret = dm->dma(OS_READ, mb->devAddr, (void *) 0x80600000, mb->size); - break; - } -#endif - ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_DMAWRITE: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_EDMAREAD: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); -#ifdef BBPLAYER - if (__osBbIsBb == TRUE && ((uintptr_t) mb->dramAddr & 0x7f) >= 0x60) { - check = TRUE; - ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, (void *) 0x80600000, mb->size); - break; - } -#endif - ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_EDMAWRITE: - osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK); - ret = dm->edma(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr, - mb->size); - break; - case OS_MESG_TYPE_LOOPBACK: - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - ret = -1; - break; - break; - default: - ret = -1; - break; - } - - if (ret == 0) { - osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); -#ifdef BBPLAYER - if (__osBbIsBb == TRUE && check) { - osInvalDCache((void *) 0x80600000, (mb->size + DCACHE_LINEMASK) & ~DCACHE_LINEMASK); - bcopy((void *) 0x80600000, mb->dramAddr, mb->size); - check = FALSE; - osWritebackDCache(mb->dramAddr, mb->size); - } -#endif -#if LIBULTRA_VERSION == OS_VER_F - sm = -#endif - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); - } - } - } -} -#else -void __osDevMgrMain(void *args) { - OSIoMesg *mb; - OSMesg em; - OSMesg messageSend; - s32 ret; - OSDevMgr *dm = (OSDevMgr *) args; - - mb = NULL; - ret = 0; - - while (TRUE) { - osRecvMesg(dm->cmdQueue, (OSMesg) &mb, OS_MESG_BLOCK); - - switch (mb->hdr.type) { - case OS_MESG_TYPE_DMAREAD: - osRecvMesg(dm->acsQueue, &messageSend, OS_MESG_BLOCK); - ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_DMAWRITE: - osRecvMesg(dm->acsQueue, &messageSend, OS_MESG_BLOCK); - ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); - break; - case OS_MESG_TYPE_LOOPBACK: - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - ret = -1; - break; - default: - ret = -1; - break; - } - - if (ret == 0) { - osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK); - osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); - osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK); - } - } -} -#endif diff --git a/lib/ultra/io/driverominit.c b/lib/ultra/io/driverominit.c deleted file mode 100644 index 4969988f..00000000 --- a/lib/ultra/io/driverominit.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/os.h" -#include "PR/rcp.h" -#include "macros.h" - -// The existence of this file is due to updated audio library in the game -#ifdef LIBULTRA_EXCLUSIVE -ALIGNED8 OSPiHandle DriveRomHandle; -#else -extern OSPiHandle DriveRomHandle; -#endif - -OSPiHandle *osDriveRomInit(void) { -#if LIBULTRA_VERSION < OS_VER_I || !defined(LIBULTRA_EXCLUSIVE) - UNUSED s32 dummy = 0; -#endif - u32 saveMask; - -#if LIBULTRA_VERSION >= OS_VER_J && defined(LIBULTRA_EXCLUSIVE) - if (DriveRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR1)) { - return &DriveRomHandle; - } -#endif - - DriveRomHandle.type = DEVICE_TYPE_BULK; - DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1); - DriveRomHandle.latency = 64; - DriveRomHandle.pulse = 7; - DriveRomHandle.pageSize = 7; - DriveRomHandle.relDuration = 2; -#if LIBULTRA_VERSION >= OS_VER_J && defined(LIBULTRA_EXCLUSIVE) - DriveRomHandle.domain = PI_DOMAIN1; - DriveRomHandle.speed = 0; -#else - IO_WRITE(PI_BSD_DOM1_LAT_REG, DriveRomHandle.latency); - IO_WRITE(PI_BSD_DOM1_PWD_REG, DriveRomHandle.pulse); - IO_WRITE(PI_BSD_DOM1_PGS_REG, DriveRomHandle.pageSize); - IO_WRITE(PI_BSD_DOM1_RLS_REG, DriveRomHandle.relDuration); -#endif - - bzero(&DriveRomHandle.transferInfo, sizeof(__OSTranxInfo)); - - saveMask = __osDisableInt(); - DriveRomHandle.next = __osPiTable; - __osPiTable = &DriveRomHandle; - __osRestoreInt(saveMask); - - return &DriveRomHandle; -} diff --git a/lib/ultra/io/epidma.c b/lib/ultra/io/epidma.c deleted file mode 100644 index 52aff902..00000000 --- a/lib/ultra/io/epidma.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "piint.h" - -#if LIBULTRA_VERSION > OS_VER_D -s32 osEPiStartDma(OSPiHandle *pihandle, OSIoMesg *mb, s32 direction) { - register s32 ret; - - if (!__osPiDevMgr.active) { - return -1; - } - - mb->piHandle = pihandle; - - if (direction == OS_READ) { - mb->hdr.type = OS_MESG_TYPE_EDMAREAD; - } else { - mb->hdr.type = OS_MESG_TYPE_EDMAWRITE; - } - - if (mb->hdr.pri == OS_MESG_PRI_HIGH) { - ret = osJamMesg(osPiGetCmdQueue(), mb, OS_MESG_NOBLOCK); - } else { - ret = osSendMesg(osPiGetCmdQueue(), mb, OS_MESG_NOBLOCK); - } - - return ret; -} -#endif diff --git a/lib/ultra/io/epirawdma.c b/lib/ultra/io/epirawdma.c deleted file mode 100644 index af3b649a..00000000 --- a/lib/ultra/io/epirawdma.c +++ /dev/null @@ -1,120 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "PR/R4300.h" -#include "piint.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -s32 osEPiRawStartDma(OSPiHandle *pihandle, s32 direction, u32 devAddr, void *dramAddr, u32 size) { -#ifdef BBPLAYER - u64 dummyBuf[2]; - u32 stat; - u32 domain; - u32 buffer; - u32 pgsize; - u16 *adr; - u32 i; -#elif LIBULTRA_VERSION >= OS_VER_H - u32 stat; - u32 domain; -#else - register u32 stat; -#endif - -#if LIBULTRA_VERSION >= OS_VER_H - EPI_SYNC(pihandle, stat, domain); -#else - WAIT_ON_IO_BUSY(stat); -#endif - -#ifdef BBPLAYER - if (direction == OS_READ) { - pgsize = 1; - - for (i = 1; i <= (u32) (pihandle->pageSize + 2); i++) { - pgsize *= 2; - } - - if ((devAddr & (pgsize - 1)) == pgsize - 2) { - osEPiRawReadIo(pihandle, devAddr - 2, &buffer); - - adr = (u16 *) PHYS_TO_K1(dramAddr); - *(adr++) = (u16) buffer; - - devAddr += 2; - dramAddr = adr; - size -= 2; - - if (size >= 4) { - osEPiRawReadIo(pihandle, devAddr, &buffer); - - adr = (u16 *) dramAddr; - *(adr++) = buffer >> 16; - *(adr++) = (u16) buffer; - - devAddr += 4; - dramAddr = adr; - size -= 4; - - if (size != 0) { - osEPiRawReadIo(pihandle, devAddr, &buffer); - - adr = (u16 *) PHYS_TO_K1(dramAddr); - *(adr++) = buffer >> 16; - - devAddr += 2; - dramAddr = adr; - size -= 2; - } - } - } - - if ((((devAddr + size) & (pgsize - 1)) == 2) | (size == 2)) { - if ((devAddr + size) & 2) { - osEPiRawReadIo(pihandle, devAddr + size - 2, &buffer); - adr = (u16 *) PHYS_TO_K1(dramAddr) + (size - 2) / 2; - *adr = buffer >> 16; - } else { - osEPiRawReadIo(pihandle, devAddr + size - 4, &buffer); - adr = (u16 *) PHYS_TO_K1(dramAddr) + (size - 2) / 2; - *adr = (u16) buffer; - } - size -= 2; - } - - if (size == 0) { - size = 8; - dramAddr = dummyBuf; - devAddr = 0; - } - } -#endif - - IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS(pihandle->baseAddress | devAddr)); - -#ifdef BBPLAYER - if ((u32) direction >= 2U) { - return -1; - } - - if ((pihandle->baseAddress | devAddr) <= 0x400) { - IO_WRITE(direction == OS_READ ? PI_5C_REG : PI_58_REG, size - 1); - } else { - IO_WRITE(direction == OS_READ ? PI_WR_LEN_REG : PI_RD_LEN_REG, size - 1); - } -#else - switch (direction) { - case OS_READ: - IO_WRITE(PI_WR_LEN_REG, size - 1); - break; - case OS_WRITE: - IO_WRITE(PI_RD_LEN_REG, size - 1); - break; - default: - return -1; - } -#endif - return 0; -} diff --git a/lib/ultra/io/epirawread.c b/lib/ultra/io/epirawread.c deleted file mode 100644 index 703e0239..00000000 --- a/lib/ultra/io/epirawread.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "piint.h" - -s32 osEPiRawReadIo(OSPiHandle *pihandle, u32 devAddr, u32 *data) { - register s32 stat; -#if LIBULTRA_VERSION > OS_VER_H - register u32 domain; -#endif - -#if LIBULTRA_VERSION > OS_VER_H - EPI_SYNC(pihandle, stat, domain); -#else - WAIT_ON_IO_BUSY(stat); -#endif - *data = IO_READ(pihandle->baseAddress | devAddr); - - return 0; -} diff --git a/lib/ultra/io/epirawwrite.c b/lib/ultra/io/epirawwrite.c deleted file mode 100644 index 256d92a2..00000000 --- a/lib/ultra/io/epirawwrite.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "piint.h" - -s32 osEPiRawWriteIo(OSPiHandle *pihandle, u32 devAddr, u32 data) { - register u32 stat; -#if LIBULTRA_VERSION > OS_VER_H - register u32 domain; -#endif - -#if LIBULTRA_VERSION > OS_VER_H - EPI_SYNC(pihandle, stat, domain); -#else - WAIT_ON_IO_BUSY(stat); -#endif - IO_WRITE(pihandle->baseAddress | devAddr, data); - - return 0; -} diff --git a/lib/ultra/io/leointerrupt.c b/lib/ultra/io/leointerrupt.c deleted file mode 100644 index 0a27837b..00000000 --- a/lib/ultra/io/leointerrupt.c +++ /dev/null @@ -1,279 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "../os/osint.h" -#include "piint.h" -#include "macros.h" - -extern u32 __osLeoPresent; -static void __osLeoResume(void); -static void __osLeoAbnormalResume(void); - -ALIGNED16 u8 leoDiskStack[OS_LEO_STACKSIZE]; - -s32 __osLeoInterrupt(void) { -#if LIBULTRA_VERSION == OS_VER_F - u32 stat; - u32 pistat; -#else - u32 stat = 0; - volatile u32 pistat; -#endif - u32 bmstat; - __OSTranxInfo *info; - __OSBlockInfo *blockInfo; - -#if LIBULTRA_VERSION == OS_VER_F - if (!__osLeoPresent) { - return 0; - } -#endif - - info = &__osDiskHandle->transferInfo; - blockInfo = &info->block[info->blockNum]; - - pistat = IO_READ(PI_STATUS_REG); - if (pistat & PI_STATUS_DMA_BUSY) { -#if LIBULTRA_VERSION == OS_VER_F - IO_WRITE(PI_STATUS_REG, PI_STATUS_RESET | PI_STATUS_CLR_INTR); - WAIT_ON_LEO_IO_BUSY(pistat); - stat = IO_READ(LEO_STATUS); - if (stat & LEO_STATUS_MECHANIC_INTERRUPT) { - WAIT_ON_LEO_IO_BUSY(pistat); - IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); - } - info->errStatus = LEO_ERROR_75; - __osLeoAbnormalResume(); -#else - __OSGlobalIntMask = __OSGlobalIntMask & ~SR_IBIT4; //cartridge interrupt - blockInfo->errStatus = LEO_ERROR_29; - __osLeoResume(); -#endif - return 1; - } - WAIT_ON_LEO_IO_BUSY(pistat); - - stat = IO_READ(LEO_STATUS); - if (stat & LEO_STATUS_MECHANIC_INTERRUPT) { - WAIT_ON_LEO_IO_BUSY(pistat); - IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR); -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_GOOD; -#else - blockInfo->errStatus = LEO_ERROR_GOOD; -#endif - return 0; - } - -#if LIBULTRA_VERSION > OS_VER_F - if (info->cmdType == LEO_CMD_TYPE_2) { - return 1; - } -#endif - - if (stat & LEO_STATUS_BUFFER_MANAGER_ERROR) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_3; - __osLeoAbnormalResume(); -#else - WAIT_ON_LEO_IO_BUSY(pistat); - stat = IO_READ(LEO_STATUS); - blockInfo->errStatus = LEO_ERROR_22; - __osLeoResume(); - IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); - __OSGlobalIntMask |= OS_IM_PI; -#endif - return 1; - } - - if (info->cmdType == LEO_CMD_TYPE_1) { - if ((stat & LEO_STATUS_DATA_REQUEST) == 0) { - if (info->sectorNum + 1 != info->transferMode * 85) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_6; -#else - blockInfo->errStatus = LEO_ERROR_24; -#endif - __osLeoAbnormalResume(); - return 1; - } - IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); - __OSGlobalIntMask |= OS_IM_PI; -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_GOOD; -#else - blockInfo->errStatus = LEO_ERROR_GOOD; -#endif - __osLeoResume(); - return 1; - } - - blockInfo->dramAddr = (void *) ((u32)blockInfo->dramAddr + blockInfo->sectorSize); - info->sectorNum++; - osEPiRawStartDma(__osDiskHandle, OS_WRITE, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize); - return 1; - } - - if (info->cmdType == LEO_CMD_TYPE_0) { - if (info->transferMode == LEO_SECTOR_MODE) { - if ((s32)blockInfo->C1ErrNum + 17 < info->sectorNum) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_GOOD; -#else - blockInfo->errStatus = LEO_ERROR_GOOD; -#endif - __osLeoAbnormalResume(); - return 1; - } - if ((stat & LEO_STATUS_DATA_REQUEST) == 0) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_17; -#else - blockInfo->errStatus = LEO_ERROR_23; -#endif - __osLeoAbnormalResume(); - return 1; - } - } else { - blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr + blockInfo->sectorSize); - } - bmstat = IO_READ(LEO_BM_STATUS); - if ((bmstat & LEO_BM_STATUS_C1SINGLE && bmstat & LEO_BM_STATUS_C1DOUBLE) || bmstat & LEO_BM_STATUS_MICRO) { - if (blockInfo->C1ErrNum > 3) { - if (info->transferMode != LEO_SECTOR_MODE || info->sectorNum > 0x52) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_17; -#else - blockInfo->errStatus = LEO_ERROR_23; -#endif - __osLeoAbnormalResume(); - return 1; - } - } else { - s32 errNum = blockInfo->C1ErrNum; - blockInfo->C1ErrSector[errNum] = info->sectorNum + 1; - } - blockInfo->C1ErrNum++; - } - - if (stat & LEO_STATUS_C2_TRANSFER) { - if (info->sectorNum != 87) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_6; -#else - blockInfo->errStatus = LEO_ERROR_24; -#endif - __osLeoAbnormalResume(); - } - if (info->transferMode == LEO_TRACK_MODE && info->blockNum == 0) { - info->blockNum = 1; - info->sectorNum = -1; - info->block[1].dramAddr = (void *)((u32)info->block[1].dramAddr - info->block[1].sectorSize); -#if LIBULTRA_VERSION > OS_VER_F - blockInfo->errStatus = LEO_ERROR_22; -#endif - } else { - IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); - __OSGlobalIntMask |= OS_IM_PI; -#if LIBULTRA_VERSION > OS_VER_F - info->cmdType = LEO_CMD_TYPE_2; - blockInfo->errStatus = LEO_ERROR_GOOD; -#endif - } - osEPiRawStartDma(__osDiskHandle, OS_READ, LEO_C2_BUFF, blockInfo->C2Addr, blockInfo->sectorSize * 4); -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_GOOD; -#endif - return 1; - } - if (info->sectorNum == -1 && info->transferMode == LEO_TRACK_MODE && info->blockNum == 1) { - __OSBlockInfo *bptr = &info->block[0]; - if (bptr->C1ErrNum == 0) { - if (((u32 *)bptr->C2Addr)[0] | ((u32 *)bptr->C2Addr)[1] | ((u32 *)bptr->C2Addr)[2] | ((u32 *)bptr->C2Addr)[3]) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_6; -#else - bptr->errStatus = LEO_ERROR_24; -#endif - __osLeoAbnormalResume(); - return 1; - } - } -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_GOOD; -#else - bptr->errStatus = LEO_ERROR_GOOD; -#endif - __osLeoResume(); - } - info->sectorNum++; - if (stat & LEO_STATUS_DATA_REQUEST) { - if (info->sectorNum > 0x54) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_6; -#else - blockInfo->errStatus = LEO_ERROR_24; -#endif - __osLeoAbnormalResume(); - return 1; - } - osEPiRawStartDma(__osDiskHandle, 0, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize); -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_GOOD; -#else - blockInfo->errStatus = LEO_ERROR_GOOD; -#endif - return 1; - } - if (info->sectorNum <= 0x54) { -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_6; -#else - blockInfo->errStatus = LEO_ERROR_24; -#endif - __osLeoAbnormalResume(); - return 1; - } - return 1; - } - -#if LIBULTRA_VERSION == OS_VER_F - info->errStatus = LEO_ERROR_75; -#else - blockInfo->errStatus = LEO_ERROR_4; -#endif - - __osLeoAbnormalResume(); - return 1; -} - -static void __osLeoAbnormalResume(void) { - __OSTranxInfo *info = &__osDiskHandle->transferInfo; - u32 pistat; - - WAIT_ON_LEO_IO_BUSY(pistat); - IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); - WAIT_ON_LEO_IO_BUSY(pistat); - IO_WRITE(LEO_BM_CTL, info->bmCtlShadow); - __osLeoResume(); - IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); - - __OSGlobalIntMask |= OS_IM_PI; -} - -static void __osLeoResume(void) { - __OSEventState *es = &__osEventStateTab[OS_EVENT_PI]; - OSMesgQueue *mq = es->messageQueue; - s32 last; - - if (mq == NULL || MQ_IS_FULL(mq)) { - return; - } - - last = (mq->first + mq->validCount) % mq->msgCount; - mq->msg[last] = es->message; - mq->validCount++; - - if (mq->mtqueue->next != NULL) { - __osEnqueueThread(&__osRunQueue, __osPopThread(&mq->mtqueue)); - } -} diff --git a/lib/ultra/io/pidma.c b/lib/ultra/io/pidma.c deleted file mode 100644 index b93f7b48..00000000 --- a/lib/ultra/io/pidma.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "piint.h" - -s32 osPiStartDma(OSIoMesg *mb, s32 priority, s32 direction, uintptr_t devAddr, void *dramAddr, size_t size, OSMesgQueue *mq) { - register s32 ret; - - if (!__osPiDevMgr.active) { - return -1; - } - - if (direction == OS_READ) { - mb->hdr.type = OS_MESG_TYPE_DMAREAD; - } else { - mb->hdr.type = OS_MESG_TYPE_DMAWRITE; - } - - mb->hdr.pri = priority; - mb->hdr.retQueue = mq; - mb->dramAddr = dramAddr; - mb->devAddr = devAddr; - mb->size = size; -#if LIBULTRA_VERSION > OS_VER_D - mb->piHandle = NULL; -#endif - - if (priority == OS_MESG_PRI_HIGH) { - ret = osJamMesg(osPiGetCmdQueue(), mb, OS_MESG_NOBLOCK); - } else { - ret = osSendMesg(osPiGetCmdQueue(), mb, OS_MESG_NOBLOCK); - } - - return ret; -} diff --git a/lib/ultra/io/pigetcmdq.c b/lib/ultra/io/pigetcmdq.c deleted file mode 100644 index 3606701a..00000000 --- a/lib/ultra/io/pigetcmdq.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "PR/os_internal.h" -#include "piint.h" - -OSMesgQueue *osPiGetCmdQueue(void) { - if (!__osPiDevMgr.active) { - return NULL; - } - return __osPiDevMgr.cmdQueue; -} diff --git a/lib/ultra/io/piint.h b/lib/ultra/io/piint.h deleted file mode 100644 index d43ea128..00000000 --- a/lib/ultra/io/piint.h +++ /dev/null @@ -1,198 +0,0 @@ -#ifndef _PIINT_H_ -#define _PIINT_H_ - -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "PR/os_pi.h" -#include "PR/os.h" - -//https://github.com/LuigiBlood/64dd/wiki/Memory-Map - -#define LEO_BASE_REG 0x05000000 - -#define LEO_CMD (LEO_BASE_REG + 0x508) -#define LEO_STATUS (LEO_BASE_REG + 0x508) - -#define LEO_BM_CTL (LEO_BASE_REG + 0x510) -#define LEO_BM_STATUS (LEO_BASE_REG + 0x510) - -#define LEO_SEQ_CTL (LEO_BASE_REG + 0x518) -#define LEO_SEQ_STATUS (LEO_BASE_REG + 0x518) - -#define LEO_C2_BUFF (LEO_BASE_REG + 0x000) //C2 Sector Buffer -#define LEO_SECTOR_BUFF (LEO_BASE_REG + 0x400) //Data Sector Buffer -#define LEO_DATA (LEO_BASE_REG + 0x500) //Data -#define LEO_MISC_REG (LEO_BASE_REG + 0x504) //Misc Register -#define LEO_CUR_TK (LEO_BASE_REG + 0x50C) //Current Track -#define LEO_ERR_SECTOR (LEO_BASE_REG + 0x514) //Sector Error Status -#define LEO_CUR_SECTOR (LEO_BASE_REG + 0x51C) //Current Sector -#define LEO_HARD_RESET (LEO_BASE_REG + 0x520) //Hard Reset -#define LEO_C1_S0 (LEO_BASE_REG + 0x524) //C1 -#define LEO_HOST_SECBYTE (LEO_BASE_REG + 0x528) //Sector Size (in bytes) -#define LEO_C1_S2 (LEO_BASE_REG + 0x52C) //C1 -#define LEO_SEC_BYTE (LEO_BASE_REG + 0x530) //Sectors per Block, Full Size -#define LEO_C1_S4 (LEO_BASE_REG + 0x534) //C1 -#define LEO_C1_S6 (LEO_BASE_REG + 0x538) //C1 -#define LEO_CUR_ADDR (LEO_BASE_REG + 0x53C) //Current Address? -#define LEO_ID_REG (LEO_BASE_REG + 0x540) //ID -#define LEO_TEST_REG (LEO_BASE_REG + 0x544) //Test Read -#define LEO_TEST_PIN_SEL (LEO_BASE_REG + 0x548) //Test Write -#define LEO_RAM_ADDR (LEO_BASE_REG + 0x580) //Microsequencer RAM - -#define LEO_STATUS_PRESENCE_MASK 0xFFFF - -#define LEO_STATUS_DATA_REQUEST 0x40000000 -#define LEO_STATUS_C2_TRANSFER 0x10000000 -#define LEO_STATUS_BUFFER_MANAGER_ERROR 0x08000000 -#define LEO_STATUS_BUFFER_MANAGER_INTERRUPT 0x04000000 -#define LEO_STATUS_MECHANIC_INTERRUPT 0x02000000 -#define LEO_STATUS_DISK_PRESENT 0x01000000 -#define LEO_STATUS_BUSY_STATE 0x00800000 -#define LEO_STATUS_RESET_STATE 0x00400000 -#define LEO_STATUS_MOTOR_NOT_SPINNING 0x00100000 -#define LEO_STATUS_HEAD_RETRACTED 0x00080000 -#define LEO_STATUS_WRITE_PROTECT_ERROR 0x00040000 -#define LEO_STATUS_MECHANIC_ERROR 0x00020000 -#define LEO_STATUS_DISK_CHANGE 0x00010000 - -#define LEO_STATUS_MODE_MASK (LEO_STATUS_MOTOR_NOT_SPINNING | LEO_STATUS_HEAD_RETRACTED) -#define LEO_STATUS_MODE_SLEEP (LEO_STATUS_MOTOR_NOT_SPINNING | LEO_STATUS_HEAD_RETRACTED) -#define LEO_STATUS_MODE_STANDBY (LEO_STATUS_HEAD_RETRACTED) -#define LEO_STATUS_MODE_ACTIVE 0 - -#define LEO_CUR_TK_INDEX_LOCK 0x60000000 - -#define LEO_BM_STATUS_RUNNING 0x80000000 //Running -#define LEO_BM_STATUS_ERROR 0x04000000 //Error -#define LEO_BM_STATUS_MICRO 0x02000000 //Micro Status? -#define LEO_BM_STATUS_BLOCK 0x01000000 //Block Transfer -#define LEO_BM_STATUS_C1CORRECTION 0x00800000 //C1 Correction -#define LEO_BM_STATUS_C1DOUBLE 0x00400000 //C1 Double -#define LEO_BM_STATUS_C1SINGLE 0x00200000 //C1 Single -#define LEO_BM_STATUS_C1ERROR 0x00010000 //C1 Error - -#define LEO_BM_CTL_START 0x80000000 //Start Buffer Manager -#define LEO_BM_CTL_MODE 0x40000000 //Buffer Manager Mode -#define LEO_BM_CTL_IMASK 0x20000000 //BM Interrupt Mask -#define LEO_BM_CTL_RESET 0x10000000 //Buffer Manager Reset -#define LEO_BM_CTL_DISABLE_OR 0x08000000 //Disable OR Check? -#define LEO_BM_CTL_DISABLE_C1 0x04000000 //Disable C1 Correction -#define LEO_BM_CTL_BLOCK 0x02000000 //Block Transfer -#define LEO_BM_CTL_CLR_MECHANIC_INTR 0x01000000 //Mechanic Interrupt Reset - -#define LEO_BM_CTL_CONTROL_MASK 0xFF000000 -#define LEO_BM_CTL_SECTOR_MASK 0x00FF0000 -#define LEO_BM_CTL_SECTOR_SHIFT 16 - -#define LEO_CMD_TYPE_0 0 //TODO: name -#define LEO_CMD_TYPE_1 1 //TODO: name -#define LEO_CMD_TYPE_2 2 //TODO: name - -#define LEO_ERROR_GOOD 0 -#define LEO_ERROR_3 3 -#define LEO_ERROR_4 4 //maybe busy? -#define LEO_ERROR_6 6 -#define LEO_ERROR_17 17 -#define LEO_ERROR_22 22 // -#define LEO_ERROR_23 23 //unrecovered read error? -#define LEO_ERROR_24 24 //no reference position found? -#define LEO_ERROR_29 29 // -#define LEO_ERROR_75 75 - -extern OSDevMgr __osPiDevMgr; -extern OSPiHandle *__osCurrentHandle[2]; -extern OSPiHandle __Dom1SpeedParam; -extern OSPiHandle __Dom2SpeedParam; -extern OSMesgQueue __osPiAccessQueue; -extern u32 __osPiAccessQueueEnabled; - -int __osPiDeviceBusy(void); -void __osDevMgrMain(void *); -void __osPiCreateAccessQueue(void); -void __osPiRelAccess(void); -void __osPiGetAccess(void); -// These functions had underscores before being removed in 2.0J -s32 osPiRawStartDma(s32, u32, void *, size_t); -s32 osPiRawReadIo(u32, u32 *); -s32 osEPiRawWriteIo(OSPiHandle *, u32 , u32); -s32 osEPiRawReadIo(OSPiHandle *, u32 , u32 *); -s32 osEPiRawStartDma(OSPiHandle *, s32, u32, void *, size_t); -OSMesgQueue *osPiGetCmdQueue(void); - -s32 __osLeoInterrupt(void); - -#define WAIT_ON_IO_BUSY(stat) \ - stat = IO_READ(PI_STATUS_REG); \ - while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \ - stat = IO_READ(PI_STATUS_REG); - -#if LIBULTRA_VERSION == OS_VER_F -#define WAIT_ON_LEO_IO_BUSY(stat) \ - stat = IO_READ(PI_STATUS_REG); \ - while (stat & PI_STATUS_IO_BUSY) \ - stat = IO_READ(PI_STATUS_REG); -#else -#define WAIT_ON_LEO_IO_BUSY WAIT_ON_IO_BUSY -#endif - -#define UPDATE_REG(reg, var) \ - if (cHandle->var != pihandle->var) \ - IO_WRITE(reg, pihandle->var); - -#if LIBULTRA_VERSION >= OS_VER_J -#define EPI_SYNC(pihandle, stat, domain) \ - \ - WAIT_ON_IO_BUSY(stat) \ - \ - domain = pihandle->domain; \ - if (__osCurrentHandle[domain]->type != pihandle->type) \ - { \ - OSPiHandle *cHandle = __osCurrentHandle[domain]; \ - if (domain == PI_DOMAIN1) \ - { \ - UPDATE_REG(PI_BSD_DOM1_LAT_REG, latency); \ - UPDATE_REG(PI_BSD_DOM1_PGS_REG, pageSize); \ - UPDATE_REG(PI_BSD_DOM1_RLS_REG, relDuration); \ - UPDATE_REG(PI_BSD_DOM1_PWD_REG, pulse); \ - } \ - else \ - { \ - UPDATE_REG(PI_BSD_DOM2_LAT_REG, latency); \ - UPDATE_REG(PI_BSD_DOM2_PGS_REG, pageSize); \ - UPDATE_REG(PI_BSD_DOM2_RLS_REG, relDuration); \ - UPDATE_REG(PI_BSD_DOM2_PWD_REG, pulse); \ - } \ - cHandle->type = pihandle->type; \ - cHandle->latency = pihandle->latency; \ - cHandle->pageSize = pihandle->pageSize; \ - cHandle->relDuration = pihandle->relDuration; \ - cHandle->pulse = pihandle->pulse; \ - } -#else -#define EPI_SYNC(pihandle, stat, domain) \ - \ - WAIT_ON_IO_BUSY(stat) \ - \ - domain = pihandle->domain; \ - if (__osCurrentHandle[domain] != pihandle) \ - { \ - OSPiHandle *cHandle = __osCurrentHandle[domain]; \ - if (domain == PI_DOMAIN1) \ - { \ - UPDATE_REG(PI_BSD_DOM1_LAT_REG, latency); \ - UPDATE_REG(PI_BSD_DOM1_PGS_REG, pageSize); \ - UPDATE_REG(PI_BSD_DOM1_RLS_REG, relDuration); \ - UPDATE_REG(PI_BSD_DOM1_PWD_REG, pulse); \ - } \ - else \ - { \ - UPDATE_REG(PI_BSD_DOM2_LAT_REG, latency); \ - UPDATE_REG(PI_BSD_DOM2_PGS_REG, pageSize); \ - UPDATE_REG(PI_BSD_DOM2_RLS_REG, relDuration); \ - UPDATE_REG(PI_BSD_DOM2_PWD_REG, pulse); \ - } \ - __osCurrentHandle[domain] = pihandle; \ - } -#endif - -#endif diff --git a/lib/ultra/io/pimgr.c b/lib/ultra/io/pimgr.c deleted file mode 100644 index 391d8143..00000000 --- a/lib/ultra/io/pimgr.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rdb.h" -#include "piint.h" -#include "macros.h" - -FORCE_BSS ALIGNED8 OSThread piThread; -FORCE_BSS ALIGNED16 u8 piMgrStack[OS_PIM_STACKSIZE]; -FORCE_BSS ALIGNED8 OSMesgQueue piEventQueue; -FORCE_BSS OSMesg piEventBuf[1]; - -OSDevMgr __osPiDevMgr = { 0 }; -#if LIBULTRA_VERSION >= OS_VER_F -OSPiHandle *__osPiTable = NULL; -#endif -#if LIBULTRA_VERSION >= OS_VER_J -ALIGNED8 OSPiHandle __Dom1SpeedParam; -ALIGNED8 OSPiHandle __Dom2SpeedParam; -OSPiHandle *__osCurrentHandle[2] = { &__Dom1SpeedParam, &__Dom2SpeedParam }; -#elif LIBULTRA_VERSION >= OS_VER_H -extern OSPiHandle CartRomHandle; -extern OSPiHandle LeoDiskHandle; -OSPiHandle *__osCurrentHandle[2] = { &CartRomHandle, &LeoDiskHandle }; -#endif - -void osCreatePiManager(OSPri pri, OSMesgQueue *cmdQ, OSMesg *cmdBuf, s32 cmdMsgCnt) { - u32 savedMask; - OSPri oldPri; - OSPri myPri; - - if (__osPiDevMgr.active) { - return; - } - osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt); - osCreateMesgQueue(&piEventQueue, (OSMesg*) piEventBuf, 1); - - if (!__osPiAccessQueueEnabled) { - __osPiCreateAccessQueue(); - } - - osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg) 0x22222222); - oldPri = -1; - myPri = osGetThreadPri(NULL); - - if (myPri < pri) { - oldPri = myPri; - osSetThreadPri(NULL, pri); - } - - savedMask = __osDisableInt(); - __osPiDevMgr.active = TRUE; - __osPiDevMgr.thread = &piThread; - __osPiDevMgr.cmdQueue = cmdQ; - __osPiDevMgr.evtQueue = &piEventQueue; - __osPiDevMgr.acsQueue = &__osPiAccessQueue; - __osPiDevMgr.dma = osPiRawStartDma; -#if LIBULTRA_VERSION >= OS_VER_F - __osPiDevMgr.edma = osEPiRawStartDma; -#endif - osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, &piMgrStack[OS_PIM_STACKSIZE], pri); - osStartThread(&piThread); - - __osRestoreInt(savedMask); - - if (oldPri != -1) { - osSetThreadPri(NULL, oldPri); - } -} diff --git a/lib/ultra/io/pirawdma.c b/lib/ultra/io/pirawdma.c deleted file mode 100644 index c3b2fa75..00000000 --- a/lib/ultra/io/pirawdma.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "piint.h" - -s32 osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, size_t size) { - register u32 stat; - - WAIT_ON_IO_BUSY(stat); - - IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS((uintptr_t) osRomBase | devAddr)); - - switch (direction) { - case OS_READ: - IO_WRITE(PI_WR_LEN_REG, size - 1); - break; - case OS_WRITE: - IO_WRITE(PI_RD_LEN_REG, size - 1); - break; - default: - return -1; - } - return 0; -} diff --git a/lib/ultra/io/pirawread.c b/lib/ultra/io/pirawread.c deleted file mode 100644 index 6ee1393f..00000000 --- a/lib/ultra/io/pirawread.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "piint.h" - -s32 osPiRawReadIo(u32 devAddr, u32 *data) { - register u32 stat; - - WAIT_ON_IO_BUSY(stat); - *data = IO_READ((uintptr_t) osRomBase | devAddr); - - return 0; -} diff --git a/lib/ultra/io/sirawread.c b/lib/ultra/io/sirawread.c deleted file mode 100644 index 2010bf8a..00000000 --- a/lib/ultra/io/sirawread.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" - -s32 __osSiRawReadIo(u32 devAddr, u32 *data) { - if (__osSiDeviceBusy()) { - return -1; - } - - *data = IO_READ(devAddr); - return 0; -} diff --git a/lib/ultra/io/sirawwrite.c b/lib/ultra/io/sirawwrite.c deleted file mode 100644 index 96d1178a..00000000 --- a/lib/ultra/io/sirawwrite.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" - -s32 __osSiRawWriteIo(u32 devAddr, u32 data) { - if (__osSiDeviceBusy()) { - return -1; - } - - IO_WRITE(devAddr, data); - return 0; -} diff --git a/lib/ultra/io/spgetstat.c b/lib/ultra/io/spgetstat.c deleted file mode 100644 index 97751ec9..00000000 --- a/lib/ultra/io/spgetstat.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" - -u32 __osSpGetStatus() { - return IO_READ(SP_STATUS_REG); -} diff --git a/lib/ultra/io/sprawdma.c b/lib/ultra/io/sprawdma.c deleted file mode 100644 index 8f40dfda..00000000 --- a/lib/ultra/io/sprawdma.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "../os/osint.h" - -s32 __osSpRawStartDma(s32 dir, u32 devAddr, void *dramAddr, size_t size) { - if (__osSpDeviceBusy()) { - return -1; - } - - IO_WRITE(SP_MEM_ADDR_REG, devAddr); - IO_WRITE(SP_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - - if (dir == 0) { - IO_WRITE(SP_WR_LEN_REG, size - 1); - } else { - IO_WRITE(SP_RD_LEN_REG, size - 1); - } - - return 0; -} diff --git a/lib/ultra/io/sptask.c b/lib/ultra/io/sptask.c deleted file mode 100644 index b08d2e93..00000000 --- a/lib/ultra/io/sptask.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/sptask.h" -#include "PR/rcp.h" -#include "../os/osint.h" -#include "macros.h" - -#define _osVirtualToPhysical(ptr) \ - if (ptr != NULL) { \ - ptr = (void *) osVirtualToPhysical(ptr); \ - } - -FORCE_BSS static OSTask tmpTask; - -static OSTask *_VirtualToPhysicalTask(OSTask *intp) { - OSTask *tp; - tp = &tmpTask; - bcopy(intp, tp, sizeof(OSTask)); - - _osVirtualToPhysical(tp->t.ucode); - _osVirtualToPhysical(tp->t.ucode_data); - _osVirtualToPhysical(tp->t.dram_stack); - _osVirtualToPhysical(tp->t.output_buff); - _osVirtualToPhysical(tp->t.output_buff_size); - _osVirtualToPhysical(tp->t.data_ptr); - _osVirtualToPhysical(tp->t.yield_data_ptr); - return tp; -} - -void osSpTaskLoad(OSTask *intp) { - OSTask *tp; - tp = _VirtualToPhysicalTask(intp); - - if (tp->t.flags & OS_TASK_YIELDED) { - tp->t.ucode_data = tp->t.yield_data_ptr; - tp->t.ucode_data_size = tp->t.yield_data_size; - intp->t.flags &= ~OS_TASK_YIELDED; -#if LIBULTRA_VERSION >= OS_VER_H - if (tp->t.flags & OS_TASK_LOADABLE) { - tp->t.ucode = (u64 *) IO_READ((uintptr_t)intp->t.yield_data_ptr + OS_YIELD_DATA_SIZE_EX - sizeof(uintptr_t)); - } -#endif - } - - osWritebackDCache(tp, sizeof(OSTask)); - __osSpSetStatus(SP_CLR_YIELD | SP_CLR_YIELDED | SP_CLR_TASKDONE | SP_SET_INTR_BREAK); - - while (__osSpSetPc(SP_IMEM_START) == -1) { - } - - while (__osSpRawStartDma(1, (SP_IMEM_START - sizeof(*tp)), tp, sizeof(OSTask)) == -1) { - } - - while (__osSpDeviceBusy()) { - } - - while (__osSpRawStartDma(1, SP_IMEM_START, tp->t.ucode_boot, tp->t.ucode_boot_size) == -1) { - } -} - -void osSpTaskStartGo(UNUSED OSTask *tp) { - while (__osSpDeviceBusy()) { - } - - __osSpSetStatus(SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT); -} diff --git a/lib/ultra/io/vi.c b/lib/ultra/io/vi.c deleted file mode 100644 index bdc2446d..00000000 --- a/lib/ultra/io/vi.c +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include -#include -#include - -ALIGNED8 __OSViContext vi[2] = { 0 }; -__OSViContext *__osViCurr = &vi[0]; -__OSViContext *__osViNext = &vi[1]; - -#if LIBULTRA_VERSION == OS_VER_E || LIBULTRA_VERSION == OS_VER_F -u32 osViClock = VI_NTSC_CLOCK; -u32 osIsNtscEnabled = FALSE; // OS_TV_PAL -#elif LIBULTRA_VERSION == OS_VER_D -u32 osIsNtscEnabled = TRUE; // OS_TV_NTSC -u32 osViClock = VI_NTSC_CLOCK; -#endif - -void __osViInit(void) { -#if LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION >= 1 - osIsNtscEnabled = osTvType; -#endif - - bzero(vi, sizeof(vi)); - __osViCurr = &vi[0]; - __osViNext = &vi[1]; - __osViNext->retraceCount = 1; - __osViCurr->retraceCount = 1; - -#if LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION == 0 - if (osIsNtscEnabled != FALSE) { - __osViNext->modep = &osViModeNtscLan1; - osViClock = VI_NTSC_CLOCK; - } else { - __osViNext->modep = &osViModePalLan1; - osViClock = VI_PAL_CLOCK; - } -#elif LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION >= 1 - if (osIsNtscEnabled == TRUE) { - __osViNext->modep = &osViModeNtscLan1; - osViClock = VI_NTSC_CLOCK; - } else { - __osViNext->modep = &osViModePalLan1; - osViClock = VI_MPAL_CLOCK; - } -#elif LIBULTRA_VERSION == OS_VER_E || LIBULTRA_VERSION == OS_VER_F - if (osTvType == OS_TV_PAL) { - __osViNext->modep = &osViModePalLan1; - osViClock = VI_PAL_CLOCK; - } else if (osTvType == OS_TV_MPAL) { - __osViNext->modep = &osViModeMpalLan1; - osViClock = VI_MPAL_CLOCK; - } else { - __osViNext->modep = &osViModeNtscLan1; - osViClock = VI_NTSC_CLOCK; - } -#else - __osViNext->framep = (void *) K0BASE; - __osViCurr->framep = (void *) K0BASE; - if (osTvType == OS_TV_PAL) { - __osViNext->modep = &osViModePalLan1; - } else if (osTvType == OS_TV_MPAL) { - __osViNext->modep = &osViModeMpalLan1; - } else { - __osViNext->modep = &osViModeNtscLan1; - } -#endif - __osViNext->state = VI_STATE_BLACK; - __osViNext->control = __osViNext->modep->comRegs.ctrl; - -#if LIBULTRA_VERSION > OS_VER_D || (LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION >= 1) - while (IO_READ(VI_CURRENT_REG) > 10) { //wait for vsync? - } - - IO_WRITE(VI_STATUS_REG, 0); //pixel size blank (no data, no sync) -#endif - __osViSwapContext(); -} diff --git a/lib/ultra/io/vigetcurrcontext.c b/lib/ultra/io/vigetcurrcontext.c deleted file mode 100644 index 31602d60..00000000 --- a/lib/ultra/io/vigetcurrcontext.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "PR/os_internal.h" - -__OSViContext *__osViGetCurrentContext(void) { - return __osViCurr; -} diff --git a/lib/ultra/io/vimgr.c b/lib/ultra/io/vimgr.c deleted file mode 100644 index 5cdb34d5..00000000 --- a/lib/ultra/io/vimgr.c +++ /dev/null @@ -1,118 +0,0 @@ -#include -#include -#include -#include "../os/osint.h" - -OSDevMgr __osViDevMgr = { 0 }; -#if LIBULTRA_VERSION >= OS_VER_J -u32 __additional_scanline = 0; -#endif -static OSThread viThread; -static ALIGNED16 u8 viMgrStack[OS_VIM_STACKSIZE]; -static OSMesgQueue viEventQueue; -static ALIGNED8 OSMesg viMgrMesgBuff[5]; -static ALIGNED8 OSIoMesg viRetraceMsg; -static ALIGNED8 OSIoMesg viCounterMsg; - -static void viMgrMain(void *arg); - -void osCreateViManager(OSPri pri) { - u32 savedMask; - OSPri oldPri; - OSPri myPri; - - if (!__osViDevMgr.active) { - __osTimerServicesInit(); -#if LIBULTRA_VERSION >= OS_VER_J - __additional_scanline = 0; -#endif - osCreateMesgQueue(&viEventQueue, &viMgrMesgBuff[0], ARRAY_COUNT(viMgrMesgBuff)); - viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE; - viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL; - viRetraceMsg.hdr.retQueue = NULL; - viCounterMsg.hdr.type = OS_MESG_TYPE_COUNTER; - viCounterMsg.hdr.pri = OS_MESG_PRI_NORMAL; - viCounterMsg.hdr.retQueue = NULL; - osSetEventMesg(OS_EVENT_VI, &viEventQueue, &viRetraceMsg); - osSetEventMesg(OS_EVENT_COUNTER, &viEventQueue, &viCounterMsg); - oldPri = -1; - myPri = osGetThreadPri(NULL); - - if (myPri < pri) { - oldPri = myPri; - osSetThreadPri(NULL, pri); - } - - savedMask = __osDisableInt(); - __osViDevMgr.active = TRUE; - __osViDevMgr.thread = &viThread; - __osViDevMgr.cmdQueue = &viEventQueue; - __osViDevMgr.evtQueue = &viEventQueue; - __osViDevMgr.acsQueue = NULL; - __osViDevMgr.dma = NULL; -#if LIBULTRA_VERSION > OS_VER_D - __osViDevMgr.edma = NULL; -#endif - osCreateThread(&viThread, 0, viMgrMain, (void *) &__osViDevMgr, &viMgrStack[OS_VIM_STACKSIZE], pri); - __osViInit(); - osStartThread(&viThread); - __osRestoreInt(savedMask); - - if (oldPri != -1) { - osSetThreadPri(NULL, oldPri); - } - } -} - -static void viMgrMain(void *arg) { - __OSViContext *vc; - OSDevMgr *dm; - OSIoMesg *mb; - static u16 retrace; - u32 first; - u32 count; - - mb = NULL; - first = FALSE; - vc = __osViGetCurrentContext(); - retrace = vc->retraceCount; - if (retrace == 0) { - retrace = 1; - } - dm = (OSDevMgr *) arg; - - while (TRUE) { - osRecvMesg(dm->evtQueue, (OSMesg)&mb, OS_MESG_BLOCK); - switch (mb->hdr.type) { - case OS_MESG_TYPE_VRETRACE: - __osViSwapContext(); - retrace--; - - if (retrace == 0) { - vc = __osViGetCurrentContext(); - if (vc->msgq != NULL) { - osSendMesg(vc->msgq, vc->msg, OS_MESG_NOBLOCK); - } - retrace = vc->retraceCount; - } - - __osViIntrCount++; - - if (first) { - count = osGetCount(); - __osCurrentTime = count; - first = 0; - } - - count = __osBaseCounter; - __osBaseCounter = osGetCount(); - count = __osBaseCounter - count; - __osCurrentTime = __osCurrentTime + count; - break; - - case OS_MESG_TYPE_COUNTER: - __osTimerInterrupt(); - break; - } - } -} diff --git a/lib/ultra/io/visetevent.c b/lib/ultra/io/visetevent.c deleted file mode 100644 index 984019e3..00000000 --- a/lib/ultra/io/visetevent.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "PR/os_internal.h" - -void osViSetEvent(OSMesgQueue *mq, OSMesg m, u32 retraceCount) { - register u32 saveMask = __osDisableInt(); - - __osViNext->msgq = mq; - __osViNext->msg = m; - __osViNext->retraceCount = retraceCount; - __osRestoreInt(saveMask); -} diff --git a/lib/ultra/io/visetmode.c b/lib/ultra/io/visetmode.c deleted file mode 100644 index be766532..00000000 --- a/lib/ultra/io/visetmode.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -void osViSetMode(OSViMode *modep) { - register u32 saveMask = __osDisableInt(); - -#ifdef BBPLAYER - if (__osBbIsBb) { - modep->comRegs.ctrl &= ~VI_CTRL_PIXEL_ADV_2; - } -#endif - - __osViNext->modep = modep; - __osViNext->state = VI_STATE_MODE_UPDATED; - __osViNext->control = __osViNext->modep->comRegs.ctrl; - __osRestoreInt(saveMask); -} diff --git a/lib/ultra/io/visetspecial.c b/lib/ultra/io/visetspecial.c deleted file mode 100644 index d9f21efb..00000000 --- a/lib/ultra/io/visetspecial.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include - -void osViSetSpecialFeatures(u32 func) { - register u32 saveMask = __osDisableInt(); - - if (func & OS_VI_GAMMA_ON) { - __osViNext->control |= VI_CTRL_GAMMA_ON; - } - - if (func & OS_VI_GAMMA_OFF) { - __osViNext->control &= ~VI_CTRL_GAMMA_ON; - } - - if (func & OS_VI_GAMMA_DITHER_ON) { - __osViNext->control |= VI_CTRL_GAMMA_DITHER_ON; - } - - if (func & OS_VI_GAMMA_DITHER_OFF) { - __osViNext->control &= ~VI_CTRL_GAMMA_DITHER_ON; - } - - if (func & OS_VI_DIVOT_ON) { - __osViNext->control |= VI_CTRL_DIVOT_ON; - } - - if (func & OS_VI_DIVOT_OFF) { - __osViNext->control &= ~VI_CTRL_DIVOT_ON; - } - - if (func & OS_VI_DITHER_FILTER_ON) { - __osViNext->control |= VI_CTRL_DITHER_FILTER_ON; - __osViNext->control &= ~VI_CTRL_ANTIALIAS_MASK; - } - - if (func & OS_VI_DITHER_FILTER_OFF) { - __osViNext->control &= ~VI_CTRL_DITHER_FILTER_ON; - __osViNext->control |= __osViNext->modep->comRegs.ctrl & VI_CTRL_ANTIALIAS_MASK; - } - - __osViNext->state |= VI_STATE_CTRL_UPDATED; - - __osRestoreInt(saveMask); -} diff --git a/lib/ultra/io/viswapbuf.c b/lib/ultra/io/viswapbuf.c deleted file mode 100644 index 3751da56..00000000 --- a/lib/ultra/io/viswapbuf.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "PR/os_internal.h" - -void osViSwapBuffer(void *frameBufPtr) { - u32 saveMask = __osDisableInt(); - - __osViNext->framep = frameBufPtr; - __osViNext->state |= VI_STATE_BUFFER_UPDATED; - __osRestoreInt(saveMask); -} diff --git a/lib/ultra/io/vitbl.c b/lib/ultra/io/vitbl.c deleted file mode 100644 index 8b41e534..00000000 --- a/lib/ultra/io/vitbl.c +++ /dev/null @@ -1,1750 +0,0 @@ -#include "PR/os.h" -#include "PR/rcp.h" - -OSViMode osViModeTable[] = { - { - OS_VI_NTSC_LPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LAN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_LAF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_HPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_HPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_HAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_HAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_HPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_NTSC_HPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - -#if LIBULTRA_VERSION > OS_VER_D || (LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION == 0) - { - OS_VI_PAL_LPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LAN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_LAF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_HPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_HPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_HAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_HAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_HPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_PAL_HPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(93, 567), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, -#endif - -#if LIBULTRA_VERSION > OS_VER_D || (LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION >= 1) - { - OS_VI_MPAL_LPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3089, 4), // hSync - OS_VI_LEAP(3097, 3098), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3089, 4), // hSync - OS_VI_LEAP(3097, 3098), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3089, 4), // hSync - OS_VI_LEAP(3097, 3098), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LAN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3089, 4), // hSync - OS_VI_LEAP(3097, 3098), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_LAF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_HPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_HPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_HAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_HAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { //[0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { //[1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_HPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_MPAL_HPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(524), // vSync - OS_VI_HSYNC(3088, 0), // hSync - OS_VI_LEAP(3100, 3100), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(35, 509), // vStart - OS_VI_BURST(2, 2, 11, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, -#endif - -#if LIBULTRA_VERSION >= OS_VER_J - { - OS_VI_FPAL_LPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LAN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_LAF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.25), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0.75), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_HPN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_HPF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_HAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_HAF1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_SERRATE_ON | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(1280), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_HPN2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_3 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(1280), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - }, - { - OS_VI_FPAL_HPF2, // type - { // comRegs - VI_CTRL_TYPE_32 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_SERRATE_ON | VI_CTRL_ANTIALIAS_MODE_2 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(640), // width - OS_VI_BURST(58, 30, 4, 69), // burst - OS_VI_VSYNC(624), // vSync - OS_VI_HSYNC(3177, 23), // hSync - OS_VI_LEAP(3183, 3181), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(1, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(2560), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(45, 615), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(5120), // origin - OS_VI_SCALE(0.5, 0.5), // yScale - OS_VI_HSTART(47, 617), // vStart - OS_VI_BURST(105, 2, 13, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } - } -#endif -}; diff --git a/lib/ultra/ld.inc b/lib/ultra/ld.inc deleted file mode 100644 index c74afbdf..00000000 --- a/lib/ultra/ld.inc +++ /dev/null @@ -1,9 +0,0 @@ -#include "PR/os_version.h" - -#if LIBULTRA_VERSION >= OS_VER_K -#include "K_L.inc" -#elif LIBULTRA_VERSION >= OS_VER_F -#include "F_I.inc" -#elif LIBULTRA_VERSION >= OS_VER_D -#include "D.inc" -#endif diff --git a/lib/ultra/libc/bcopy.s b/lib/ultra/libc/bcopy.s deleted file mode 100644 index ed8fca42..00000000 --- a/lib/ultra/libc/bcopy.s +++ /dev/null @@ -1,219 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -#ifdef BBPLAYER -.set mips2 -#endif - -.text -LEAF(bcopy) - move a3, a1 - beqz a2, ret - beq a0, a1, ret - blt a1, a0, goforwards - - add v0, a0, a2 - bge a1, v0, goforwards - b gobackwards - -goforwards: - - blt a2, 16, forwards_bytecopy - - andi v0, a0, 0x3 - andi v1, a1, 0x3 - beq v0, v1,forwalignable - - -forwards_bytecopy: - beqz a2, ret - addu v1, a0, a2 -99: - lb v0, 0(a0) - addiu a0, a0, 1 - sb v0, 0(a1) - addiu a1, a1, 1 - bne a0, v1, 99b -ret: - move v0, a3 - jr ra - -forwalignable: - beqz v0, forwards - beq v0, 1, forw_copy3 - beq v0, 2, forw_copy2 - - lb v0, 0(a0) - addiu a0, a0, 1 - sb v0, 0(a1) - addiu a1, a1, 1 - addiu a2, a2, -1 - b forwards - -forw_copy2: - lh v0, 0(a0) - addiu a0, a0, 2 - sh v0, 0(a1) - addiu a1, a1, 2 - addiu a2, a2, -2 - b forwards - -forw_copy3: - lb v0, 0(a0) - lh v1, 1(a0) - addiu a0, a0, 3 - sb v0, 0(a1) - sh v1, 1(a1) - addiu a1, a1, 3 - addiu a2, a2, -3 - -forwards: -forwards_32: - blt a2, 32, forwards_16 - lw v0, 0(a0) - lw v1, 4(a0) - lw t0, 8(a0) - lw t1, 12(a0) - lw t2, 16(a0) - lw t3, 20(a0) - lw ta0, 24(a0) - lw ta1, 28(a0) - addiu a0, a0, 32 - sw v0, 0(a1) - sw v1, 4(a1) - sw t0, 8(a1) - sw t1, 12(a1) - sw t2, 16(a1) - sw t3, 20(a1) - sw ta0, 24(a1) - sw ta1, 28(a1) - addiu a1, a1, 32 - addiu a2, a2, -32 - b forwards_32 - -forwards_16: - blt a2, 16, forwards_4 - lw v0, 0(a0) - lw v1, 4(a0) - lw t0, 8(a0) - lw t1, 12(a0) - addiu a0, a0, 16 - sw v0, 0(a1) - sw v1, 4(a1) - sw t0, 8(a1) - sw t1, 12(a1) - addiu a1, a1, 16 - addiu a2, a2, -16 - b forwards_16 - -forwards_4: - blt a2, 4, forwards_bytecopy - - lw v0, 0(a0) - addiu a0, a0, 4 - sw v0, 0(a1) - addiu a1, a1, 4 - addiu a2, a2, -4 - b forwards_4 - -gobackwards: - add a0, a0,a2 - add a1, a1,a2 - blt a2, 16, backwards_bytecopy - - andi v0, a0, 0x3 - andi v1, a1, 0x3 - beq v0, v1,backalignable - -backwards_bytecopy: - beqz a2, ret - addiu a0, a0, -1 - addiu a1, a1, -1 - subu v1, a0,a2 -99: - lb v0, 0(a0) - addiu a0, a0, -1 - sb v0, 0(a1) - addiu a1, a1, -1 - bne a0, v1,99b - - move v0, a3 - jr ra -backalignable: - beqz v0, backwards - beq v0, 3, back_copy3 - beq v0, 2, back_copy2 - lb v0, -1(a0) - addiu a0, a0, -1 - sb v0, -1(a1) - addiu a1, a1, -1 - addiu a2, a2, -1 - b backwards - -back_copy2: - lh v0, -2(a0) - addiu a0, a0, -2 - sh v0, -2(a1) - addiu a1, a1, -2 - addiu a2, a2, -2 - b backwards - -back_copy3: - lb v0, -1(a0) - lh v1, -3(a0) - addiu a0, a0, -3 - sb v0, -1(a1) - sh v1, -3(a1) - addiu a1, a1, -3 - addiu a2, a2, -3 - -backwards: -backwards_32: - blt a2, 32, backwards_16 - lw v0, -4(a0) - lw v1, -8(a0) - lw t0, -12(a0) - lw t1, -16(a0) - lw t2, -20(a0) - lw t3, -24(a0) - lw ta0, -28(a0) - lw ta1, -32(a0) - addiu a0, a0, -32 - sw v0, -4(a1) - sw v1, -8(a1) - sw t0, -12(a1) - sw t1, -16(a1) - sw t2, -20(a1) - sw t3, -24(a1) - sw ta0, -28(a1) - sw ta1, -32(a1) - addiu a1, a1, -32 - addiu a2, a2, -32 - b backwards_32 - -backwards_16: - blt a2, 16, backwards_4 - lw v0, -4(a0) - lw v1, -8(a0) - lw t0, -12(a0) - lw t1, -16(a0) - addiu a0, a0, -16 - sw v0, -4(a1) - sw v1, -8(a1) - sw t0, -12(a1) - sw t1, -16(a1) - addiu a1, a1, -16 - addiu a2, a2, -16 - b backwards_16 - -backwards_4: - blt a2, 4, backwards_bytecopy - lw v0, -4(a0) - addiu a0, a0, -4 - sw v0, -4(a1) - addiu a1, a1, -4 - addiu a2, a2, -4 - b backwards_4 - -END(bcopy) diff --git a/lib/ultra/libc/bzero.s b/lib/ultra/libc/bzero.s deleted file mode 100644 index c9b599f3..00000000 --- a/lib/ultra/libc/bzero.s +++ /dev/null @@ -1,55 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -LEAF(bzero) - negu v1, a0 - blt a1, 12, bytezero - - andi v1, v1, 0x3 - subu a1, a1, v1 - - beqz v1, blkzero - swl zero, 0(a0) - addu a0, a0, v1 -blkzero: - and a3, a1, ~31 - subu a1, a1, a3 - beqz a3, wordzero - - addu a3, a3, a0 -1: - sw zero, 0(a0) - sw zero, 4(a0) - sw zero, 8(a0) - sw zero, 12(a0) - addiu a0, a0, 32 - sw zero, -16(a0) - sw zero, -12(a0) - sw zero, -8(a0) - sw zero, -4(a0) - bne a0, a3, 1b - -wordzero: - and a3, a1, ~3 - subu a1, a1, a3 - beqz a3, bytezero - - addu a3, a3, a0 -1: - addiu a0, a0, 4 - sw zero, -4(a0) - bne a0, a3, 1b - -bytezero: - blez a1, zerodone - #nop - addu a1, a1, a0 -1: - addiu a0, a0, 1 - sb zero, -1(a0) - bne a0, a1, 1b -zerodone: - jr ra -END(bzero) diff --git a/lib/ultra/libc/sprintf.c b/lib/ultra/libc/sprintf.c deleted file mode 100644 index da48bfa5..00000000 --- a/lib/ultra/libc/sprintf.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include "xstdio.h" - -static char *proutSprintf(char *dst, const char *src, size_t count); - -int sprintf(char *dst, const char *fmt, ...) -{ - s32 ans; - va_list ap; - va_start(ap, fmt); - ans = _Printf(proutSprintf, dst, fmt, ap); - if (ans >= 0) - { - dst[ans] = 0; - } - return ans; -} -static char *proutSprintf(char *dst, const char *src, size_t count) -{ - return (char *)memcpy((u8 *)dst, (u8 *)src, count) + count; -} diff --git a/lib/ultra/libc/string.c b/lib/ultra/libc/string.c deleted file mode 100644 index 2bd09550..00000000 --- a/lib/ultra/libc/string.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "PR/os_version.h" -#include - -// Functions swapped from 2.0I onwards -#if LIBULTRA_VERSION >= OS_VER_I -char *strchr(const char *s, int c) { - char ch = c; - while (*s != ch) { - if (*s == 0) { - return NULL; - } - s++; - } - return (char *) s; -} - -size_t strlen(const char *s) { - const char *sc = s; - while (*sc) { - sc++; - } - return sc - s; -} -#endif - -void *memcpy(void *dst, const void *src, size_t size) { - u8 *_dst = dst; - const u8 *_src = src; - while (size > 0) { - *_dst++ = *_src++; - size--; - } - return dst; -} - -#if LIBULTRA_VERSION < OS_VER_I -size_t strlen(const char *s) { - const unsigned char *sc = (const unsigned char *) s; - while (*sc) { - sc++; - } - return (const char *) sc - s; -} - -char *strchr(const char *s, int c) { - unsigned char ch = c; - while (*(unsigned char *)s != ch) { - if (*(unsigned char *)s == 0) { - return NULL; - } - s++; - } - return (char *) s; -} -#endif diff --git a/lib/ultra/libc/syncprintf.c b/lib/ultra/libc/syncprintf.c deleted file mode 100644 index 123b1799..00000000 --- a/lib/ultra/libc/syncprintf.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "stdarg.h" -#include "macros.h" - -#if LIBULTRA_VERSION >= OS_VER_J -void __osSyncVPrintf(UNUSED const char *fmt, UNUSED va_list args) { - // these functions intentionally left blank. ifdeffed out in rom release -} -#endif - -#if LIBULTRA_VERSION > OS_VER_D -void osSyncPrintf(UNUSED const char *fmt, ...) { - UNUSED int ans; - UNUSED va_list ap; - // these functions intentionally left blank. ifdeffed out in rom release -} - -void rmonPrintf(UNUSED const char *fmt, ...) { - UNUSED int ans; - UNUSED va_list ap; -} -#endif diff --git a/lib/ultra/libc/xlitob.c b/lib/ultra/libc/xlitob.c deleted file mode 100644 index 703a176c..00000000 --- a/lib/ultra/libc/xlitob.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include "xstdio.h" - -#define BUFF_LEN 0x18 - -static char_x ldigs[] = "0123456789abcdef"; -static char_x udigs[] = "0123456789ABCDEF"; - -void _Litob(_Pft *args, char_x type) { - char buff[BUFF_LEN]; - const char_x *digs; - s32 base; - s32 i; - unsigned long long ullval; - - if (type == 'X') { - digs = udigs; - } else { - digs = ldigs; - } - - base = (type == 'o') ? 8 : ((type != 'x' && type != 'X') ? 10 : 16); - i = BUFF_LEN; - ullval = args->v.ll; - - if ((type == 'd' || type == 'i') && args->v.ll < 0) { - ullval = -ullval; - } - - if (ullval != 0 || args->prec != 0) { - buff[--i] = digs[ullval % base]; - } - - args->v.ll = ullval / base; - - while (args->v.ll > 0 && i > 0) { - lldiv_t qr = lldiv(args->v.ll, base); - - args->v.ll = qr.quot; - buff[--i] = digs[qr.rem]; - } - - args->n1 = BUFF_LEN - i; - - memcpy(args->s, buff + i, args->n1); - - if (args->n1 < args->prec) { - args->nz0 = args->prec - args->n1; - } - - if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { - i = args->width - args->n0 - args->nz0 - args->n1; - - if (i > 0) { - args->nz0 += i; - } - } -} diff --git a/lib/ultra/libc/xprintf.c b/lib/ultra/libc/xprintf.c deleted file mode 100644 index 96c6d6ae..00000000 --- a/lib/ultra/libc/xprintf.c +++ /dev/null @@ -1,247 +0,0 @@ -#include -#include -#include "xstdio.h" - -#define isdigit(x) ((x >= '0' && x <= '9')) -#define LDSIGN(x) (((unsigned short *)&(x))[0] & 0x8000) - -#define ATOI(dst, src) \ - for (dst = 0; isdigit(*src); ++src) \ - { \ - if (dst < 999) \ - dst = dst * 10 + *src - '0'; \ - } - -#define PUT(s, n) \ - if (0 < (n)) \ - { \ - if ((arg = (*prout)(arg, (char*) s, n)) != NULL) \ - x.nchar += (n); \ - else \ - return x.nchar; \ - } - -#define MAX_PAD ((sizeof(spaces) - 1)) -#define PAD(s, n) \ - if (0 < (n)) \ - { \ - int i, j = (n); \ - for (; 0 < j; j -= i) \ - { \ - i = MAX_PAD < (unsigned int)j ? (int)MAX_PAD : j; \ - PUT(s, i); \ - } \ - } - -static char spaces[] = " "; -static char zeroes[] = "00000000000000000000000000000000"; - -static void _Putfld(_Pft *pf, va_list *pap, char_x code, char_x *ac); - -int _Printf(outfun prout, char *arg, const char *fmt, va_list args) { - _Pft x; - const char_x *s; - char_x c; - const char *t; - static const char fchar[] = {' ', '+', '-', '#', '0', '\0'}; - static const int fbit[] = {FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAGS_ZERO, 0}; - char_x ac[32]; - - x.nchar = 0; - - while (1) { - s = (char_x*) fmt; - -#if LIBULTRA_VERSION >= OS_VER_H - // new version: don't point fmt_ptr beyond NUL character - while ((c = *s) != 0 && c != '%') { - s++; - } -#else - while ((c = *s++) > 0) { - if (c == '%') { - s--; - break; - } - } -#endif - - PUT(fmt, s - (char_x*) fmt); - - if (c == 0) { - return x.nchar; - } - - fmt = (char*) ++s; - - for (x.flags = 0; (t = strchr(fchar, *s)) != NULL; s++) { - x.flags |= fbit[t - fchar]; - } - - if (*s == '*') { - x.width = va_arg(args, int); - - if (x.width < 0) { - x.width = -x.width; - x.flags |= FLAGS_MINUS; - } - s++; - } else { - ATOI(x.width, s); - } - - if (*s != '.') { - x.prec = -1; - } else if (*++s == '*') { - x.prec = va_arg(args, int); - ++s; - } else { - ATOI(x.prec, s); - } - - x.qual = strchr("hlL", *s) ? *s++ : '\0'; - - if (x.qual == 'l' && *s == 'l') { - x.qual = 'L'; - ++s; - } - - _Putfld(&x, &args, *s, ac); - x.width -= x.n0 + x.nz0 + x.n1 + x.nz1 + x.n2 + x.nz2; - - if (!(x.flags & FLAGS_MINUS)) { - PAD(spaces, x.width); - } - - PUT(ac, x.n0); - PAD(zeroes, x.nz0); - PUT(x.s, x.n1); - PAD(zeroes, x.nz1); - PUT(x.s + x.n1, x.n2); - PAD(zeroes, x.nz2); - - if (x.flags & FLAGS_MINUS) { - PAD(spaces, x.width); - } - - fmt = (char*) s + 1; - } - return 0; -} - -static void _Putfld(_Pft *x, va_list *args, char_x type, char_x *buff) { - x->n0 = x->nz0 = x->n1 = x->nz1 = x->n2 = - x->nz2 = 0; - - switch (type) { - case 'c': - buff[x->n0++] = va_arg(*args, int); - break; - case 'd': - case 'i': - if (x->qual == 'l') { - x->v.ll = va_arg(*args, int); - } else if (x->qual == 'L') { - x->v.ll = va_arg(*args, s64); - } else { - x->v.ll = va_arg(*args, int); - } - - if (x->qual == 'h') { - x->v.ll = (s16)x->v.ll; - } - - if (x->v.ll < 0) { - buff[x->n0++] = '-'; - } else if (x->flags & FLAGS_PLUS) { - buff[x->n0++] = '+'; - } else if (x->flags & FLAGS_SPACE) { - buff[x->n0++] = ' '; - } - - x->s = (u8*) &buff[x->n0]; - - _Litob(x, type); - break; - case 'x': - case 'X': - case 'u': - case 'o': - if (x->qual == 'l') { - x->v.ll = va_arg(*args, int); - } else if (x->qual == 'L') { - x->v.ll = va_arg(*args, s64); - } else { - x->v.ll = va_arg(*args, int); - } - - if (x->qual == 'h') { - x->v.ll = (u16)x->v.ll; - } else if (x->qual == 0) { - x->v.ll = (unsigned int)x->v.ll; - } - - if (x->flags & FLAGS_HASH) { - buff[x->n0++] = '0'; - - if (type == 'x' || type == 'X') { - buff[x->n0++] = type; - } - } - - x->s = (u8*) &buff[x->n0]; - _Litob(x, type); - break; - case 'e': - case 'f': - case 'g': - case 'E': - case 'G': - //... okay? - x->v.ld = x->qual == 'L' ? va_arg(*args, f64) : va_arg(*args, f64); - - if (LDSIGN(x->v.ld)) - buff[x->n0++] = '-'; - else if (x->flags & FLAGS_PLUS) - buff[x->n0++] = '+'; - else if (x->flags & FLAGS_SPACE) - buff[x->n0++] = ' '; - - x->s = (u8*) &buff[x->n0]; - _Ldtob(x, type); - break; - - case 'n': - if (x->qual == 'h') { - *(va_arg(*args, u16 *)) = x->nchar; - } else if (x->qual == 'l') { - *va_arg(*args, unsigned int *) = x->nchar; - } else if (x->qual == 'L') { - *va_arg(*args, u64 *) = x->nchar; - } else { - *va_arg(*args, unsigned int *) = x->nchar; - } - - break; - case 'p': - x->v.ll = (long)va_arg(*args, void *); - x->s = (u8*) &buff[x->n0]; - _Litob(x, 'x'); - break; - case 's': - x->s = (u8 *) va_arg(*args, char_x *); - x->n1 = strlen((char *)x->s); - - if (x->prec >= 0 && x->n1 > x->prec) { - x->n1 = x->prec; - } - - break; - case '%': - buff[x->n0++] = '%'; - break; - default: - buff[x->n0++] = type; - break; - } -} diff --git a/lib/ultra/mgu/mtxf2l.s b/lib/ultra/mgu/mtxf2l.s deleted file mode 100644 index 1aba6cb7..00000000 --- a/lib/ultra/mgu/mtxf2l.s +++ /dev/null @@ -1,80 +0,0 @@ -/************************************************************************ - Copyright (C) 1998,1999 NINTENDO CO,Ltd, - Copyright (C) 1998,1999 MONEGI CORPORATION, - All Rights Reserved -This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. -and it is not to be reproduced, published, disclosed to others, copied, -adapted, distributed, or displayed without the prior authorization of -NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed -this Notice on all copies of the program, including partial copies or -modified versions thereof. -*************************************************************************/ -/************************************************************************ - $Date: 1999/06/16 09:15:38 $ - $Revision: 1.1 $ - $Author: doseki $ -************************************************************************/ - -#include "guasm.h" - -#if LIBULTRA_VERSION >= OS_VER_K && defined(TARGET_N64) - -/* - * void guMtxF2L(float mf[4][4], Mtx *m) - * - * Input - * float mf[4][4] - * Output - * Mtx *m - */ - -#define MASK_LOW 0x0000FFFF -#define MASK_HIGH 0xFFFF0000 - -#define ptr_fl a0 /* argument */ -#define ptr_mtx a1 /* argument */ -#define end_mtx t8 -#define mask_hi t9 -#define magni fv0 - - .text - .align 5 -LEAF( guMtxF2L ) - .set reorder - - li.s magni, FLOAT_0x10000 - li mask_hi, MASK_HIGH - addu end_mtx, ptr_mtx, HALF_SIZE_MTX -label_loop: - l.s ft0, 0(ptr_fl) /* FTOFIX32( ) */ - mul.s ft1, ft0, magni - trunc.w.s ft2, ft1 - - l.s ft3, 4(ptr_fl) /* FTOFIX32( ) */ - mul.s ft4, ft3, magni - trunc.w.s ft5, ft4 - - mfc1 t0, ft2 /* t0 <- FIXED */ - mfc1 t1, ft5 /* t1 <- FIXED */ - - and t2, t0, mask_hi /* integral part */ - srl t3, t1, 16 - or ta0, t2, t3 - sw ta0, 0(ptr_mtx) - - sll ta1, t0, 16 /* decimal part */ - and ta2, t1, MASK_LOW - or ta3, ta1, ta2 - sw ta3, HALF_SIZE_MTX(ptr_mtx) - - addu ptr_mtx, ptr_mtx, 4 - addu ptr_fl, ptr_fl, 8 - - bne ptr_mtx, end_mtx, label_loop -/* loop-end */ - - j ra - END( guMtxF2L ) - -/* End of file */ -#endif diff --git a/lib/ultra/mgu/normalize.s b/lib/ultra/mgu/normalize.s deleted file mode 100644 index 96c6f806..00000000 --- a/lib/ultra/mgu/normalize.s +++ /dev/null @@ -1,60 +0,0 @@ -/************************************************************************ - Copyright (C) 1998,1999 NINTENDO CO,Ltd, - Copyright (C) 1998,1999 MONEGI CORPORATION, - All Rights Reserved -This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. -and it is not to be reproduced, published, disclosed to others, copied, -adapted, distributed, or displayed without the prior authorization of -NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed -this Notice on all copies of the program, including partial copies or -modified versions thereof. -*************************************************************************/ -/************************************************************************ - $Date: 1999/06/16 09:15:39 $ - $Revision: 1.1 $ - $Author: doseki $ -************************************************************************/ - -#include "guasm.h" - -#if LIBULTRA_VERSION >= OS_VER_K && defined(TARGET_N64) - -/* - * void guNormalize(float *x, float *y, float *z) - */ - .text - .align 5 -LEAF( guNormalize ) - .set noreorder - - l.s ft0, 0(a0) /* ft0 = x */ - l.s ft1, 0(a1) /* ft1 = y */ - l.s ft2, 0(a2) /* ft2 = z */ - - mul.s ft3, ft0, ft0 /* ft3 = x*x */ - lui t0, 0x3f80 /* t0 = 1.0f */ - mul.s ft4, ft1, ft1 /* ft4 = y*y */ - add.s ft5, ft3, ft4 - mul.s ft4, ft2, ft2 /* ft4 = z*z */ - - add.s ft3, ft4, ft5 /* ft3 = x*x + y*y + z*z */ - mtc1 t0, ft5 - sqrt.s ft4, ft3 /* ft4 = sqrt(x*x + y*y + z*z) */ - - div.s ft3, ft5, ft4 /* ft3 = 1/sqrt(x*x + y*y + z*z) */ - - mul.s ft4, ft0, ft3 /* ft4 = x * 1/sqrt(x*x + y*y + z*z) */ - nop - mul.s ft5, ft1, ft3 /* ft5 = y * 1/sqrt(x*x + y*y + z*z) */ - nop - mul.s ft0, ft2, ft3 /* ft0 = z * 1/sqrt(x*x + y*y + z*z) */ - - s.s ft4, 0(a0) /* x = ft4 */ - s.s ft5, 0(a1) /* y = ft5 */ - j ra - s.s ft0, 0(a2) /* z = ft0 */ /* Use delayed slot */ - - END( guNormalize ) -/* end of file */ - -#endif diff --git a/lib/ultra/mgu/scale.s b/lib/ultra/mgu/scale.s deleted file mode 100644 index 8af24003..00000000 --- a/lib/ultra/mgu/scale.s +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************************************ - Copyright (C) 1998,1999 NINTENDO CO,Ltd, - Copyright (C) 1998,1999 MONEGI CORPORATION, - All Rights Reserved -This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. -and it is not to be reproduced, published, disclosed to others, copied, -adapted, distributed, or displayed without the prior authorization of -NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed -this Notice on all copies of the program, including partial copies or -modified versions thereof. -*************************************************************************/ -/************************************************************************ - $Date: 1999/06/16 09:15:40 $ - $Revision: 1.1 $ - $Author: doseki $ -************************************************************************/ - -#include "guasm.h" - -#if LIBULTRA_VERSION >= OS_VER_K && defined(TARGET_N64) - -/* - void guScale(Mtx *m, float x, float y, float z) - m: a0 - x: a1 - y: a2 - z a3 - */ - - .text - .align 5 -LEAF( guScale ) - .set reorder - - li.s ft0, FLOAT_0x10000 /* (float)0x00010000 */ - - FTOFIX32(a1, t1) /* t1 = FTOFIX32(x) */ - srl t2, t1, 16 - sll t0, t2, 16 - sw t0, 0(a0) /* t0 = x integral part */ - sll t2, t1, 16 - sw t2, 32(a0) /* t2 = x decimal part */ - - FTOFIX32(a2, t1) /* t1 = FTOFIX32(y) */ - srl t0, t1, 16 - sw t0, 8(a0) /* t0 = y integral part */ - andi t2, t1, 0xffff - sw t2, 40(a0) /* t2 = y decimal part */ - - FTOFIX32(a3, t1) /* t1 = FTOFIX32(z) */ - srl t2, t1, 16 - sll t0, t2, 16 - sw t0, 20(a0) /* t0 = z integral part */ - sll t2, t1, 16 - sw t2, 52(a0) /* t2 = z decimal part */ - - li t0, 1 /* t0 = 1.0 integral part */ - sw t0, 28(a0) - - sw zero, 4(a0) - sw zero, 12(a0) - sw zero, 16(a0) - sw zero, 24(a0) - sw zero, 36(a0) - sw zero, 44(a0) - sw zero, 48(a0) - sw zero, 56(a0) - sw zero, 60(a0) - j ra - - END( guScale ) -/* end of file */ - -#endif diff --git a/lib/ultra/mgu/translate.s b/lib/ultra/mgu/translate.s deleted file mode 100644 index 775a41bd..00000000 --- a/lib/ultra/mgu/translate.s +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************ - Copyright (C) 1998,1999 NINTENDO CO,Ltd, - Copyright (C) 1998,1999 MONEGI CORPORATION, - All Rights Reserved -This program is a trade secret of NINTENDO CO,Ltd and MONEGI Corp. -and it is not to be reproduced, published, disclosed to others, copied, -adapted, distributed, or displayed without the prior authorization of -NINTENDO CO,Ltd. and MONEGI Corp. Licensee agrees to attach or embed -this Notice on all copies of the program, including partial copies or -modified versions thereof. -*************************************************************************/ -/************************************************************************ - $Date: 1999/06/16 09:15:40 $ - $Revision: 1.1 $ - $Author: doseki $ -************************************************************************/ - -#include "guasm.h" - -#if LIBULTRA_VERSION >= OS_VER_K && defined(TARGET_N64) - -/* - void guTranslate(Mtx *m, float x, float y, float z) - m: a0 - x: a1 - y: a2 - z a3 - */ - - .text - .align 5 -LEAF( guTranslate ) - .set reorder - - li.s ft0, FLOAT_0x10000 /* (float)0x00010000 */ - - FTOFIX32(a1, t1) /* t1 = FTOFIX32(x) */ - - FTOFIX32(a2, t3) /* t3 = FTOFIX32(y) */ - - /* Save t1 and t3 values until fraction process is finished! */ - - srl t2, t1, 16 /* x integeral part for t0 interger */ - sll t0, t2, 16 - srl t2, t3, 16 /* y integral part for t2 fraction */ - or t0, t0, t2 /* Compose in t0 */ - sw t0, 24(a0) - - sll t0,t1,16 /* x fraction part for t0 interger */ - sll t2,t3,16 - srl t2,t2,16 /* y fraction part for t2 fraction */ - or t0,t0,t2 /* Compose in t0 */ - sw t0,24+32(a0) - - - FTOFIX32(a3, t1) /* t1 = FTOFIX32(z) */ - - srl t2,t1,16 - sll t0,t2,16 /* z integral part for t0 integer */ - addiu t0,t0,1 /* enter 0x0001 in t0 fraction */ - sw t0,28(a0) - - sll t2,t1,16 /* z fraction part for t2 integer */ - sw t2,28+32(a0) - - sw zero, 0(a0) - sw zero, 4(a0) - sw zero, 8(a0) - sw zero, 12(a0) - sw zero, 16(a0) - sw zero, 20(a0) - sw zero, 0+32(a0) - sw zero, 4+32(a0) - sw zero, 8+32(a0) - sw zero, 12+32(a0) - sw zero, 16+32(a0) - sw zero, 20+32(a0) - - lui t0,0x0001 - ori t0,0x0000 - sw t0,0(a0) - sw t0,20(a0) - - lui t0,0x0000 - ori t0,0x0001 - sw t0,8(a0) - - j ra - - END( guTranslate ) -/* end of file */ - -#endif diff --git a/lib/ultra/os/createmesgqueue.c b/lib/ultra/os/createmesgqueue.c deleted file mode 100644 index 87d43753..00000000 --- a/lib/ultra/os/createmesgqueue.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg, s32 msgCount) { - mq->mtqueue = (OSThread *) &__osThreadTail.next; - mq->fullqueue = (OSThread *) &__osThreadTail.next; - mq->validCount = 0; - mq->first = 0; - mq->msgCount = msgCount; - mq->msg = msg; -} diff --git a/lib/ultra/os/createthread.c b/lib/ultra/os/createthread.c deleted file mode 100644 index 00add987..00000000 --- a/lib/ultra/os/createthread.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/R4300.h" -#include "osint.h" - -void osCreateThread(OSThread *t, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri p) { - register u32 saveMask; - OSIntMask mask; - - t->id = id; - t->priority = p; - t->next = NULL; - t->queue = NULL; - t->context.pc = (u32) entry; - t->context.a0 = (s64) (s32) arg; // Double cast gets rid of compiler warning - t->context.sp = (s64) (s32) sp - 16; - t->context.ra = (s64) (s32) __osCleanupThread; - mask = OS_IM_ALL; - t->context.sr = (mask & (SR_IMASK | SR_IE)) | SR_EXL; - t->context.rcp = (mask & RCP_IMASK) >> RCP_IMASKSHIFT; - t->context.fpcsr = (u32) (FPCSR_FS | FPCSR_EV); - t->fp = 0; - t->state = OS_STATE_STOPPED; - t->flags = 0; - - saveMask = __osDisableInt(); - t->tlnext = __osActiveQueue; - - __osActiveQueue = t; - __osRestoreInt(saveMask); -} diff --git a/lib/ultra/os/exceptasm.s b/lib/ultra/os/exceptasm.s deleted file mode 100644 index 78074f22..00000000 --- a/lib/ultra/os/exceptasm.s +++ /dev/null @@ -1,943 +0,0 @@ -/* Enforce registers to be 64 bits on modern GCC */ -#if !defined(__sgi) && !defined(EGCS_GCC) -.set gp=64 -#endif - -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" -#include "PR/os.h" -#include "PR/rcp.h" -#include "PR/rdb.h" -#include "exceptasm.h" -#include "threadasm.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -#define KMC_CODE_ENTRY 0xBFF00014 -#define KMC_WPORT 0xBFF08000 -#define KMC_STAT 0xBFF08004 - -#ifdef BBPLAYER -#define XOR_VALUE 0xFFFFFFFF -#else -#define XOR_VALUE ~0 -#endif - -#if LIBULTRA_VERSION >= OS_VER_J -#define INT_TABLE(arg1, arg2) .word arg1, arg2 -#else -#define INT_TABLE(arg1, arg2) .word arg1 -#endif - -#if LIBULTRA_VERSION <= OS_VER_D -#define IP_H(arg) panic -#else -#define IP_H(arg) arg -#endif - -.rdata - -#define REDISPATCH 0x00 -#define SW1 0x04 -#define SW2 0x08 -#define RCP 0x0c -#define CART 0x10 -#define PRENMI 0x14 -#define IP6_HDLR 0x18 -#define IP7_HDLR 0x1c -#define COUNTER 0x20 - -__osIntOffTable: - .byte REDISPATCH - .byte PRENMI - .byte IP6_HDLR - .byte IP6_HDLR - .byte IP7_HDLR - .byte IP7_HDLR - .byte IP7_HDLR - .byte IP7_HDLR - .byte COUNTER - .byte COUNTER - .byte COUNTER - .byte COUNTER - .byte COUNTER - .byte COUNTER - .byte COUNTER - .byte COUNTER - .byte REDISPATCH - .byte SW1 - .byte SW2 - .byte SW2 - .byte RCP - .byte RCP - .byte RCP - .byte RCP - .byte CART - .byte CART - .byte CART - .byte CART - .byte CART - .byte CART - .byte CART - .byte CART - -__osIntTable: - .word redispatch, sw1, sw2, rcp, cart, prenmi, IP_H(IP6_Hdlr), IP_H(IP7_Hdlr), counter - -.data - -EXPORT(__osHwIntTable) - INT_TABLE(0, 0) - INT_TABLE(0, 0) - INT_TABLE(0, 0) - INT_TABLE(0, 0) - INT_TABLE(0, 0) - -#if LIBULTRA_VERSION > OS_VER_D -EXPORT(__osPiIntTable) - INT_TABLE(0, 0) -#endif - -#if LIBULTRA_VERSION <= OS_VER_D || !defined(_FINALROM) -__os_Kdebug_Pkt: - .word 0 - -__osRdb_Mesg: - .word 0 -#endif - -.text - -LEAF(__osExceptionPreamble) - la k0, __osException - jr k0 -END(__osExceptionPreamble) - -LEAF(__osException) - la k0, __osThreadSave - /* save AT */ -.set noat - sd $1, THREAD_GP1(k0) -.set at - /* save sr */ -STAY2(mfc0 k1, C0_SR) - sw k1, THREAD_SR(k0) - /* clear interrupts */ - and k1, k1, -4 -STAY2(mtc0 k1, C0_SR) - /* save other regs */ - sd $8, THREAD_GP8(k0) - sd $9, THREAD_GP9(k0) - sd $10, THREAD_GP10(k0) - /* say fp has not been used */ - sw zero, THREAD_FP(k0) - /* this instruction is useless, leftover because of bad placement of an ifdef for the debug version */ -STAY2(mfc0 t0, C0_CAUSE) -#if LIBULTRA_VERSION <= OS_VER_D || !defined(_FINALROM) - andi t1, t0, 0x7c - li t2, 0 - bne t1, t2, savecontext - and t1, k1, t0 - andi t2, t1, 0x4000 - beqz t2, rdb_message - li t1, 1 - sw t1, __os_Kdebug_Pkt - b gp_threads -rdb_message: - andi t2, t1, 0x2000 - beqz t2, savecontext - li t1, 1 - sw t1, __osRdb_Mesg - b gp_threads -savecontext: - sw zero, __os_Kdebug_Pkt - sw zero, __osRdb_Mesg -#else -savecontext: -#endif - move t0, k0 - lw k0, __osRunningThread - ld t1, THREAD_GP1(t0) - sd t1, THREAD_GP1(k0) - ld t1, THREAD_SR(t0) - sd t1, THREAD_SR(k0) - ld t1, THREAD_GP8(t0) - sd t1, THREAD_GP8(k0) - ld t1, THREAD_GP9(t0) - sd t1, THREAD_GP9(k0) - ld t1, THREAD_GP10(t0) - sd t1, THREAD_GP10(k0) -gp_threads: /* Only referenced on 2.0D but required for instruction ordering to match */ - sd $2, THREAD_GP2(k0) - sd $3, THREAD_GP3(k0) - sd $4, THREAD_GP4(k0) - sd $5, THREAD_GP5(k0) - sd $6, THREAD_GP6(k0) - sd $7, THREAD_GP7(k0) - sd $11, THREAD_GP11(k0) - sd $12, THREAD_GP12(k0) - sd $13, THREAD_GP13(k0) - sd $14, THREAD_GP14(k0) - sd $15, THREAD_GP15(k0) - sd $16, THREAD_GP16(k0) - sd $17, THREAD_GP17(k0) - sd $18, THREAD_GP18(k0) - sd $19, THREAD_GP19(k0) - sd $20, THREAD_GP20(k0) - sd $21, THREAD_GP21(k0) - sd $22, THREAD_GP22(k0) - sd $23, THREAD_GP23(k0) - sd $24, THREAD_GP24(k0) - sd $25, THREAD_GP25(k0) - sd $28, THREAD_GP28(k0) - sd $29, THREAD_GP29(k0) - sd $30, THREAD_GP30(k0) - sd $31, THREAD_GP31(k0) - - mflo t0 - sd t0, THREAD_LO(k0) - mfhi t0 - sd t0, THREAD_HI(k0) -#if LIBULTRA_VERSION > OS_VER_D - lw k1, THREAD_SR(k0) - andi t1, k1, SR_IMASK - beqz t1, savercp - -/*if any interrupts are enabled*/ - la t0, __OSGlobalIntMask - lw t0, 0(t0) -#if LIBULTRA_VERSION <= OS_VER_F - xor t0, t0, XOR_VALUE /* not except not using not */ - andi t0, t0, SR_IMASK - or t1, t1, t0 - and k1, k1, ~SR_IMASK - or k1, k1, t1 - sw k1, THREAD_SR(k0) -#else - xor t2, t0, XOR_VALUE /* not except not using not */ - andi t2, t2, SR_IMASK - or ta0, t1, t2 - and t3, k1, ~SR_IMASK - or t3, t3, ta0 - sw t3, THREAD_SR(k0) - andi t0, t0, SR_IMASK - and t1, t1, t0 - and k1, k1, ~SR_IMASK - or k1, k1, t1 -#endif -#endif -savercp: - -#if LIBULTRA_VERSION > OS_VER_D - lw t1, PHYS_TO_K1(MI_INTR_MASK_REG) - beqz t1, endrcp - - la t0, __OSGlobalIntMask - lw t0, 0(t0) - - srl t0, t0, 0x10 - xor t0, t0, XOR_VALUE - andi t0, t0, 0x3f - lw ta0, THREAD_RCP(k0) - and t0, t0, ta0 - or t1, t1, t0 -endrcp: - sw t1, THREAD_RCP(k0) -#endif -STAY2(mfc0 t0, C0_EPC) - sw t0, THREAD_PC(k0) - lw t0, THREAD_FP(k0) - beqz t0, 1f -STAY2(cfc1 t0, fcr31) - NOP - sw t0, THREAD_FPCSR(k0) - sdc1 $f0, THREAD_FP0(k0) - sdc1 $f2, THREAD_FP2(k0) - sdc1 $f4, THREAD_FP4(k0) - sdc1 $f6, THREAD_FP6(k0) - sdc1 $f8, THREAD_FP8(k0) - sdc1 $f10, THREAD_FP10(k0) - sdc1 $f12, THREAD_FP12(k0) - sdc1 $f14, THREAD_FP14(k0) - sdc1 $f16, THREAD_FP16(k0) - sdc1 $f18, THREAD_FP18(k0) - sdc1 $f20, THREAD_FP20(k0) - sdc1 $f22, THREAD_FP22(k0) - sdc1 $f24, THREAD_FP24(k0) - sdc1 $f26, THREAD_FP26(k0) - sdc1 $f28, THREAD_FP28(k0) - sdc1 $f30, THREAD_FP30(k0) -1: -STAY2(mfc0 t0, C0_CAUSE) - sw t0, THREAD_CAUSE(k0) -#if LIBULTRA_VERSION <= OS_VER_D - lw t1, PHYS_TO_K1(MI_INTR_MASK_REG) - sw t1, THREAD_RCP(k0) -#endif -.set noreorder - li t1, OS_STATE_RUNNABLE - sh t1, THREAD_STATE(k0) -.set reorder -#if LIBULTRA_VERSION <= OS_VER_D || !defined(_FINALROM) - lw t1, __os_Kdebug_Pkt - beqz t1, no_kdebug - la t2, RDB_WRITE_INTR_REG - sw zero, (t2) - lw a0, K2BASE - jal kdebugserver - b __osDispatchThreadSave -no_kdebug: - lw t1, __osRdb_Mesg - beqz t1, no_rdb_mesg - la t2, RDB_READ_INTR_REG - sw zero, (t2) - lw t1, __osRdbSendMessage - beqz t1, rdb_write - li a0, 120 - jal send_mesg -rdb_write: - lw t1, __osRdbWriteOK - addi t1, t1, 1 - sw t1, __osRdbWriteOK - b __osDispatchThreadSave -no_rdb_mesg: -#endif - andi t1, t0, CAUSE_EXCMASK - li t2, EXC_BREAK - beq t1, t2, handle_break - - li t2, EXC_CPU - beq t1, t2, handle_CpU - - li t2, EXC_INT - bne t1, t2, panic - -handle_interrupt: - and s0, k1, t0 -next_interrupt: - andi t1, s0, SR_IMASK - srl t2, t1, 0xc - bnez t2, 1f - - srl t2, t1, SR_IMASKSHIFT - addi t2, t2, 16 -1: - - lbu t2, __osIntOffTable(t2) - - lw t2, __osIntTable(t2) - jr t2 -#if LIBULTRA_VERSION > OS_VER_D -IP6_Hdlr: - and s0, s0, ~CAUSE_IP6 - b next_interrupt - -IP7_Hdlr: - and s0, s0, ~CAUSE_IP7 - b next_interrupt -#endif -counter: -STAY2(mfc0 t1, C0_COMPARE) -STAY2(mtc0 t1, C0_COMPARE) - li a0, MESG(OS_EVENT_COUNTER) - jal send_mesg - and s0, s0, ~CAUSE_IP8 - b next_interrupt - -cart: -#if LIBULTRA_VERSION > OS_VER_D - and s0, s0, ~CAUSE_IP4 -#endif -#if LIBULTRA_VERSION >= OS_VER_J - la t1, __osHwIntTable - add t1, HWINTR_SIZE - lw t2, HWINTR_CALLBACK(t1) - - beqz t2, 1f - - lw sp, HWINTR_SP(t1) -#else - li t2, HWINTR_SIZE - lw t2, __osHwIntTable(t2) -#if LIBULTRA_VERSION >= OS_VER_F - la sp, leoDiskStack - li a0, MESG(OS_EVENT_CART) - - addiu sp, sp, OS_LEO_STACKSIZE-16 # Stack size minus initial frame -#endif - beqz t2, 1f -#endif - jalr t2 -#if LIBULTRA_VERSION >= OS_VER_H && LIBULTRA_VERSION < OS_VER_J - li a0, MESG(OS_EVENT_CART) -#endif -#if LIBULTRA_VERSION > OS_VER_D - beqz v0, 1f - b redispatch -#endif -1: -#ifndef BBPLAYER -#if LIBULTRA_VERSION <= OS_VER_D - li a0, MESG(OS_EVENT_CART) -#endif - jal send_mesg -#else - lw s1, PHYS_TO_K1(MI_38_REG) - -flash: - andi t1, s1, 0x40 - beqz t1, flashx - - andi s1, s1, 0x3f80 - li t1, 0 - sw t1, PHYS_TO_K1(PI_48_REG) - li a0, MESG(OS_EVENT_FLASH) - jal send_mesg -flashx: - -md: - andi t1, s1, 0x2000 - beqz t1, mdx - - andi s1, s1, 0x1fc0 - li t1, 0x2000 - sw t1, PHYS_TO_K1(MI_38_REG) - li a0, MESG(OS_EVENT_MD) - jal send_mesg -mdx: - -aes: - andi t1, s1, 0x80 - beqz t1, aesx - - andi s1, s1, 0x3f40 - li t1, 0x4000 - sw t1, PHYS_TO_K1(MI_3C_REG) - li a0, MESG(OS_EVENT_AES) - jal send_mesg -aesx: - -ide: - andi t1, s1, 0x100 - beqz t1, idex - - andi s1, s1, 0x3ec0 - li t1, 0x10000 - sw t1, PHYS_TO_K1(MI_3C_REG) - li a0, MESG(OS_EVENT_IDE) - jal send_mesg -idex: - -pi_err: - andi t1, s1, 0x200 - beqz t1, pi_errx - - andi s1, s1, 0x3dc0 - li t1, 0x40000 - sw t1, PHYS_TO_K1(MI_3C_REG) - li a0, MESG(OS_EVENT_PI_ERR) - jal send_mesg -pi_errx: - -usb0: - andi t1, s1,0x400 - beqz t1, usb0x - - andi s1, s1, 0x3bc0 - li t1, 0x100000 - sw t1, PHYS_TO_K1(MI_3C_REG) - li a0, MESG(OS_EVENT_USB0) - jal send_mesg -usb0x: - -usb1: - andi t1, s1, 0x800 - beqz t1, usb1x - - andi s1, s1, 0x37c0 - li t1, 0x400000 - sw t1, PHYS_TO_K1(MI_3C_REG) - li a0, MESG(OS_EVENT_USB1) - jal send_mesg -usb1x: - -#endif -#if LIBULTRA_VERSION <= OS_VER_D - and s0, s0, ~CAUSE_IP4 -#endif - b next_interrupt - -rcp: - lw s1, PHYS_TO_K1(MI_INTR_REG) -#if LIBULTRA_VERSION > OS_VER_D - la t0, __OSGlobalIntMask - lw t0, (t0) - srl t0, t0, 0x10 - and s1, s1, t0 -#else - andi s1, s1, 0x3f -#endif - andi t1, s1, MI_INTR_SP - beqz t1, vi - - andi s1, s1, 0x3e - lw ta0, PHYS_TO_K1(SP_STATUS_REG) -#if LIBULTRA_VERSION >= OS_VER_I - li t1, (SP_CLR_INTR | SP_CLR_SIG3) -#else - li t1, (SP_CLR_INTR) -#endif - sw t1, PHYS_TO_K1(SP_STATUS_REG) - andi ta0, ta0, 0x300 - beqz ta0, sp_other_break - - li a0, MESG(OS_EVENT_SP) - jal send_mesg - - beqz s1, NoMoreRcpInts - - b vi - -sp_other_break: - li a0, MESG(OS_EVENT_SP_BREAK) - jal send_mesg - - beqz s1, NoMoreRcpInts - -vi: - andi t1, s1, 0x8 - beqz t1, ai - - andi s1, s1, 0x37 - - sw zero, PHYS_TO_K1(VI_CURRENT_REG) - li a0, MESG(OS_EVENT_VI) - jal send_mesg - beqz s1, NoMoreRcpInts - -ai: - andi t1, s1, 0x4 - beqz t1, si - - andi s1, s1, 0x3b - - li t1, 1 - sw t1, PHYS_TO_K1(AI_STATUS_REG) - - li a0, MESG(OS_EVENT_AI) - jal send_mesg - beqz s1, NoMoreRcpInts - -si: - andi t1, s1, 0x2 - beqz t1, pi - - andi s1, s1, 0x3d - /* any write clears interrupts */ - sw zero, PHYS_TO_K1(SI_STATUS_REG) - li a0, MESG(OS_EVENT_SI) - jal send_mesg - beqz s1, NoMoreRcpInts - -pi: - andi t1, s1, 0x10 - beqz t1, dp - - andi s1, s1, 0x2f - - li t1, PI_STATUS_CLR_INTR - sw t1, PHYS_TO_K1(PI_STATUS_REG) -#if LIBULTRA_VERSION >= OS_VER_J - la t1, __osPiIntTable - lw t2, (t1) - beqz t2, 1f - - lw sp, 4(t1) - move a0, v0 - jalr t2 - - bnez v0, 2f -#endif -1: - li a0, MESG(OS_EVENT_PI) - jal send_mesg -#if LIBULTRA_VERSION >= OS_VER_J -2: -#endif - beqz s1, NoMoreRcpInts - -dp: - andi t1, s1, 0x20 - beqz t1, NoMoreRcpInts - - andi s1, s1, 0x1f - - li t1, MI_CLR_DP_INTR - sw t1, PHYS_TO_K1(MI_INIT_MODE_REG) - - li a0, MESG(OS_EVENT_DP) - jal send_mesg - -NoMoreRcpInts: - and s0, s0, ~CAUSE_IP3 - b next_interrupt - -prenmi: - lw k1, THREAD_SR(k0) - - and k1, k1, ~CAUSE_IP5 - sw k1, THREAD_SR(k0) - la t1, __osShutdown - lw t2, 0(t1) - beqz t2, firstnmi - - and s0, s0, ~CAUSE_IP5 - b redispatch - -firstnmi: - li t2, 1 - sw t2, 0(t1) /* __osShutdown */ - li a0, MESG(OS_EVENT_PRENMI) - jal send_mesg - - and s0, s0, ~CAUSE_IP5 - lw t2, __osRunQueue - lw k1, THREAD_SR(t2) - and k1, k1, ~CAUSE_IP5 - sw k1, THREAD_SR(t2) - b redispatch - -sw2: - and t0, t0, ~CAUSE_SW2 -STAY2(mtc0 t0, C0_CAUSE) - - li a0, MESG(OS_EVENT_SW2) - jal send_mesg - - and s0, s0, ~CAUSE_SW2 - b next_interrupt - -sw1: - and t0, t0, ~CAUSE_SW1 -STAY2(mtc0 t0, C0_CAUSE) - - li a0, MESG(OS_EVENT_SW1) - jal send_mesg - - and s0, s0, ~CAUSE_SW1 - b next_interrupt - -handle_break: - li t1, OS_FLAG_CPU_BREAK - sh t1, THREAD_FLAGS(k0) - li a0, MESG(OS_EVENT_CPU_BREAK) - jal send_mesg - b redispatch - -redispatch: - lw t1, THREAD_PRI(k0) - lw t2, __osRunQueue - lw t3, THREAD_PRI(t2) - - bge t1, t3, enqueueRunning - - move a1, k0 - la a0, __osRunQueue - - jal __osEnqueueThread - - j __osDispatchThread - -enqueueRunning: - la t1, __osRunQueue - lw t2, MQ_MTQUEUE(t1) - sw t2, THREAD_NEXT(k0) - sw k0, MQ_MTQUEUE(t1) - j __osDispatchThread -panic: - sw k0, __osFaultedThread - li t1, OS_STATE_STOPPED - sh t1, THREAD_STATE(k0) - li t1, OS_FLAG_FAULT - sh t1, THREAD_FLAGS(k0) - -STAY2(mfc0 t2, C0_BADVADDR) - - sw t2, THREAD_BADVADDR(k0) - - li a0, MESG(OS_EVENT_FAULT) - jal send_mesg - j __osDispatchThread -END(__osException) - -LEAF(send_mesg) - move s2, ra - la t2, __osEventStateTab - addu t2, t2, a0 - lw t1, OS_EVENTSTATE_MESSAGE_QUEUE(t2) - beqz t1, send_done - - lw t3, MQ_VALIDCOUNT(t1) - lw ta0, MQ_MSGCOUNT(t1) - - bge t3, ta0, send_done - - lw ta1, MQ_FIRST(t1) - addu ta1, ta1, t3 - - rem ta1, ta1, ta0 - lw ta0, MQ_MSG(t1) - mul ta1, ta1, 4 - addu ta0, ta0, ta1 - lw ta1, OS_EVENTSTATE_MESSAGE(t2) - sw ta1, 0(ta0) /* msg[ta1] = */ - addiu t2, t3, 1 - sw t2, MQ_VALIDCOUNT(t1) - lw t2, MQ_MTQUEUE(t1) - lw t3, THREAD_NEXT(t2) - beqz t3, send_done - - move a0, t1 - jal __osPopThread - - move t2, v0 - - move a1, t2 - la a0, __osRunQueue - jal __osEnqueueThread -send_done: - jr s2 -END(send_mesg) - -LEAF(handle_CpU) /* coprocessor error */ - and t1, t0, CAUSE_CEMASK - srl t1, t1, CAUSE_CESHIFT - li t2, 1 /* cp1 error */ - bne t1, t2, panic - - /* enable cp1 (fpu) for this thread */ - li t1, 1 - sw t1, THREAD_FP(k0) - lw k1, THREAD_SR(k0) - or k1, k1, SR_CU1 - sw k1, THREAD_SR(k0) - b enqueueRunning -END(handle_CpU) - -LEAF(__osEnqueueAndYield) - lw a1, __osRunningThread -STAY2(mfc0 t0, C0_SR) - ori t0, t0, SR_EXL - sw t0, THREAD_SR(a1) - sd s0, THREAD_GP16(a1) - sd s1, THREAD_GP17(a1) - sd s2, THREAD_GP18(a1) - sd s3, THREAD_GP19(a1) - sd s4, THREAD_GP20(a1) - sd s5, THREAD_GP21(a1) - sd s6, THREAD_GP22(a1) - sd s7, THREAD_GP23(a1) - sd gp, THREAD_GP28(a1) - sd sp, THREAD_GP29(a1) - sd s8, THREAD_GP30(a1) - sd ra, THREAD_GP31(a1) - sw ra, THREAD_PC(a1) - lw k1, THREAD_FP(a1) - beqz k1, 1f - cfc1 k1, fcr31 - sw k1, THREAD_FPCSR(a1) - sdc1 $f20, THREAD_FP20(a1) - sdc1 $f22, THREAD_FP22(a1) - sdc1 $f24, THREAD_FP24(a1) - sdc1 $f26, THREAD_FP26(a1) - sdc1 $f28, THREAD_FP28(a1) - sdc1 $f30, THREAD_FP30(a1) -1: -#if LIBULTRA_VERSION > OS_VER_D - lw k1, THREAD_SR(a1) - andi t1, k1, SR_IMASK - beqz t1, 2f - - la t0, __OSGlobalIntMask - lw t0, 0(t0) - xor t0, t0, XOR_VALUE - andi t0, t0, SR_IMASK - or t1, t1, t0 - and k1, k1, ~SR_IMASK - or k1, k1, t1 - sw k1, THREAD_SR(a1) -2: -#endif - lw k1, PHYS_TO_K1(MI_INTR_MASK_REG) -#if LIBULTRA_VERSION > OS_VER_D - beqz k1, 3f - - la k0, __OSGlobalIntMask - lw k0, 0(k0) - - srl k0, k0, 0x10 - xor k0, k0, XOR_VALUE - andi k0, k0, 0x3f - lw t0, THREAD_RCP(a1) - and k0, k0, t0 - or k1, k1, k0 -3: -#endif - sw k1, THREAD_RCP(a1) - beqz a0, noEnqueue - jal __osEnqueueThread -noEnqueue: - j __osDispatchThread -END(__osEnqueueAndYield) - -/*__osEnqueueThread(OSThread **, OSThread *)*/ -LEAF(__osEnqueueThread) - move t9, a0 - lw t8, 0(a0) - lw ta3, THREAD_PRI(a1) - lw ta2, THREAD_PRI(t8) - blt ta2, ta3, 1f -2: - move t9, t8 - lw t8, THREAD_NEXT(t8) - lw ta2, THREAD_PRI(t8) - bge ta2, ta3, 2b -1: - lw t8, THREAD_NEXT(t9) - sw t8, THREAD_NEXT(a1) - sw a1, THREAD_NEXT(t9) - sw a0, THREAD_QUEUE(a1) - jr ra -END(__osEnqueueThread) - -LEAF(__osPopThread) - lw v0, 0(a0) /* a0 is OSThread** */ - lw t9, THREAD_NEXT(v0) - sw t9, 0(a0) - jr ra -END(__osPopThread) - -#if LIBULTRA_VERSION >= OS_VER_K -LEAF(__osNop) - jr ra -END(__osNop) -#endif - -LEAF(__osDispatchThread) - la a0, __osRunQueue - jal __osPopThread - sw v0, __osRunningThread - li t0, OS_STATE_RUNNING - sh t0, THREAD_STATE(v0) - move k0, v0 - -__osDispatchThreadSave: -#if LIBULTRA_VERSION > OS_VER_D - lw k1, THREAD_SR(k0) - la t0, __OSGlobalIntMask - lw t0, 0(t0) - andi t0, t0, SR_IMASK - andi t1, k1, SR_IMASK - and t1, t1, t0 - and k1, k1, ~SR_IMASK - or k1, k1, t1 -STAY2(mtc0 k1, C0_SR) -#endif -.set noat - ld $1, THREAD_GP1(k0) -.set at - ld $2, THREAD_GP2(k0) - ld $3, THREAD_GP3(k0) - ld $4, THREAD_GP4(k0) - ld $5, THREAD_GP5(k0) - ld $6, THREAD_GP6(k0) - ld $7, THREAD_GP7(k0) - ld $8, THREAD_GP8(k0) - ld $9, THREAD_GP9(k0) - ld $10, THREAD_GP10(k0) - ld $11, THREAD_GP11(k0) - ld $12, THREAD_GP12(k0) - ld $13, THREAD_GP13(k0) - ld $14, THREAD_GP14(k0) - ld $15, THREAD_GP15(k0) - ld $16, THREAD_GP16(k0) - ld $17, THREAD_GP17(k0) - ld $18, THREAD_GP18(k0) - ld $19, THREAD_GP19(k0) - ld $20, THREAD_GP20(k0) - ld $21, THREAD_GP21(k0) - ld $22, THREAD_GP22(k0) - ld $23, THREAD_GP23(k0) - ld $24, THREAD_GP24(k0) - ld $25, THREAD_GP25(k0) - ld $28, THREAD_GP28(k0) - ld $29, THREAD_GP29(k0) - ld $30, THREAD_GP30(k0) - ld $31, THREAD_GP31(k0) - ld k1, THREAD_LO(k0) - mtlo k1 - ld k1, THREAD_HI(k0) - mthi k1 - lw k1, THREAD_PC(k0) -STAY2(mtc0 k1, C0_EPC) -#if LIBULTRA_VERSION <= OS_VER_D - lw k1, THREAD_SR(k0) -STAY2(mtc0 k1, C0_SR) -#endif - lw k1, THREAD_FP(k0) - beqz k1, 1f - lw k1, THREAD_FPCSR(k0) -STAY2(ctc1 k1, fcr31) - ldc1 $f0, THREAD_FP0(k0) - ldc1 $f2, THREAD_FP2(k0) - ldc1 $f4, THREAD_FP4(k0) - ldc1 $f6, THREAD_FP6(k0) - ldc1 $f8, THREAD_FP8(k0) - ldc1 $f10, THREAD_FP10(k0) - ldc1 $f12, THREAD_FP12(k0) - ldc1 $f14, THREAD_FP14(k0) - ldc1 $f16, THREAD_FP16(k0) - ldc1 $f18, THREAD_FP18(k0) - ldc1 $f20, THREAD_FP20(k0) - ldc1 $f22, THREAD_FP22(k0) - ldc1 $f24, THREAD_FP24(k0) - ldc1 $f26, THREAD_FP26(k0) - ldc1 $f28, THREAD_FP28(k0) - ldc1 $f30, THREAD_FP30(k0) - - -/* IDO assembler throws an error due to eret instruction without noreorder */ -/* These were added only for IDO because iQue doesn't match with them */ -1: -#ifdef __sgi - .set noreorder -#endif - lw k1, THREAD_RCP(k0) -#if LIBULTRA_VERSION > OS_VER_D - la k0, __OSGlobalIntMask - lw k0, 0(k0) - srl k0, k0, 0x10 - and k1, k1, k0 -#endif - sll k1, k1, 0x1 - la k0, __osRcpImTable - addu k1, k1, k0 - lhu k1, 0(k1) - la k0, PHYS_TO_K1(MI_INTR_MASK_REG) - sw k1, 0(k0) - nop - nop - nop - nop - eret -#ifdef __sgi - .set reorder -#endif -END(__osDispatchThread) - -LEAF(__osCleanupThread) - move a0, zero - jal osDestroyThread -END(__osCleanupThread) diff --git a/lib/ultra/os/getcurrfaultthread.c b/lib/ultra/os/getcurrfaultthread.c deleted file mode 100644 index e0ff512c..00000000 --- a/lib/ultra/os/getcurrfaultthread.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -OSThread *__osGetCurrFaultedThread() { - return __osActiveQueue; // should be __osFaultedThread -} diff --git a/lib/ultra/os/gettime.c b/lib/ultra/os/gettime.c deleted file mode 100644 index 74c74200..00000000 --- a/lib/ultra/os/gettime.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -OSTime osGetTime() { - u32 tmpTime; - u32 elapseCount; - OSTime currentCount; - register u32 saveMask; - - saveMask = __osDisableInt(); - tmpTime = osGetCount(); - elapseCount = tmpTime - __osBaseCounter; - currentCount = __osCurrentTime; - __osRestoreInt(saveMask); - return currentCount + elapseCount; -} diff --git a/lib/ultra/os/initialize.c b/lib/ultra/os/initialize.c deleted file mode 100644 index e0d4b52a..00000000 --- a/lib/ultra/os/initialize.c +++ /dev/null @@ -1,203 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/R4300.h" -#include "PR/rcp.h" -#include "../io/piint.h" -#include "macros.h" -#ifdef BBPLAYER -#include "PR/bcp.h" -#endif - -typedef struct { - u32 inst1; - u32 inst2; - u32 inst3; - u32 inst4; -} __osExceptionVector; -extern __osExceptionVector __osExceptionPreamble; - -u64 osClockRate = OS_CLOCK_RATE; -#if LIBULTRA_VERSION >= OS_VER_H -u32 osViClock = VI_NTSC_CLOCK; -#endif -u32 __osShutdown = 0; -#if LIBULTRA_VERSION >= OS_VER_F -u32 __OSGlobalIntMask = OS_IM_ALL; -u32 __osLeoPresent = 0; -#endif -#ifdef _FINALROM -u32 __osFinalrom; -#endif - -#if LIBULTRA_VERSION >= OS_VER_K -void __createSpeedParam(void) { - __Dom1SpeedParam.type = DEVICE_TYPE_INIT; - __Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG); - __Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG); - __Dom1SpeedParam.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); - __Dom1SpeedParam.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); - - __Dom2SpeedParam.type = DEVICE_TYPE_INIT; - __Dom2SpeedParam.latency = IO_READ(PI_BSD_DOM2_LAT_REG); - __Dom2SpeedParam.pulse = IO_READ(PI_BSD_DOM2_PWD_REG); - __Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG); - __Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG); -} -#endif - -void __osInitialize_common(void) { - u32 pifdata; -#if LIBULTRA_VERSION < OS_VER_K - u32 clock = 0; -#endif - -#ifdef _FINALROM - __osFinalrom = TRUE; -#endif - __osSetSR(__osGetSR() | SR_CU1); - __osSetFpcCsr(FPCSR_FS | FPCSR_EV); -#if LIBULTRA_VERSION >= OS_VER_K - __osSetWatchLo(0x4900000); -#endif -#ifdef BBPLAYER - { - u32 x = IO_WRITE(MI_3C_REG, 0x22000); - u32 y = IO_WRITE(MI_3C_REG, 0x11000); - __osBbIsBb = ((x & 0x140) == 0x140) && ((y & 0x140) == 0); - } - - if (__osBbIsBb && (IO_READ(PI_60_REG) & 0xC0000000)) { - __osBbIsBb = 2; - } - - if (__osBbIsBb) { - osTvType = OS_TV_NTSC; - osRomType = DEVICE_TYPE_CART; - osResetType = 0; - osVersion = 1; - osMemSize = 4 * 1024 * 1024; // 4MB RAM - } - - if (__osBbIsBb == 0) { -#endif - while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)) { //last byte of joychannel ram - } - while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8)) { //todo: magic constant - } -#ifdef BBPLAYER - } -#endif - - *(__osExceptionVector *) UT_VEC = __osExceptionPreamble; // TLB miss - *(__osExceptionVector *) XUT_VEC = __osExceptionPreamble; // XTLB miss - *(__osExceptionVector *) ECC_VEC = __osExceptionPreamble; // cache errors - *(__osExceptionVector *) E_VEC = __osExceptionPreamble; // general exceptions - - osWritebackDCache((void *) UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); - osInvalICache((void *) UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); -#if LIBULTRA_VERSION >= OS_VER_J - __createSpeedParam(); - osUnmapTLBAll(); -#endif - osMapTLBRdb(); - -#if LIBULTRA_VERSION < OS_VER_J - osPiRawReadIo(4, &clock); - clock &= ~0xf; - if (clock) { - osClockRate = clock; - } -#endif - osClockRate = osClockRate * 3 / 4; - - if (osResetType == 0) { // cold reset - bzero(osAppNMIBuffer, OS_APP_NMI_BUFSIZE); - } - -#if LIBULTRA_VERSION >= OS_VER_H - if (osTvType == OS_TV_PAL) { - osViClock = VI_PAL_CLOCK; - } else if (osTvType == OS_TV_MPAL) { - osViClock = VI_MPAL_CLOCK; - } else { - osViClock = VI_NTSC_CLOCK; - } -#elif LIBULTRA_VERSION == OS_VER_F - { - u32 leoStatus, status; - WAIT_ON_IO_BUSY(status); - - if (!((leoStatus = IO_READ(LEO_STATUS)) & LEO_STATUS_PRESENCE_MASK)) { - __osLeoPresent = 1; - __osSetHWIntrRoutine(1, __osLeoInterrupt); - } else { - __osLeoPresent = 0; - } - } -#endif -#if LIBULTRA_VERSION >= OS_VER_J - // Wait until there are no RCP interrupts - if (__osGetCause() & CAUSE_IP5) { - while (TRUE) { - } - } -#endif -#ifdef BBPLAYER - if (!__osBbIsBb) { // On iQue these are set before the game runs - __osBbEepromSize = 0x200; // 4K EEPROM size - __osBbPakSize = 0x8000; // SRAM size - __osBbFlashSize = 0x20000; // FlashRAM size - // iQue doesn't have a physical save chip, so store them in RAM - __osBbEepromAddress = (u8 *) (0x80400000 - 0x200); - __osBbPakAddress[0] = (u32 *)(0x80400000 - 0x8000 - 0x200); - __osBbPakAddress[1] = NULL; - __osBbPakAddress[2] = NULL; - __osBbPakAddress[3] = NULL; - __osBbFlashAddress = 0x80400000 - 0x20000; - __osBbSramSize = __osBbFlashSize; // 0x20000 - __osBbSramAddress = __osBbFlashAddress; // 0x80400000 - 0x20000 - } - if (__osBbIsBb) { - IO_WRITE(PI_64_REG, IO_READ(PI_64_REG) & 0x7FFFFFFF); - IO_WRITE(MI_3C_REG, 0x20000); - IO_WRITE(SI_0C_REG, 0); - IO_WRITE(SI_1C_REG, (IO_READ(SI_1C_REG) & 0x80FFFFFF) | 0x2F400000); - } -#endif -#if LIBULTRA_VERSION >= OS_VER_K - IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); - IO_WRITE(AI_DACRATE_REG, AI_MAX_DAC_RATE - 1); - IO_WRITE(AI_BITRATE_REG, AI_MAX_BIT_RATE - 1); -#endif -} - -#if LIBULTRA_VERSION >= OS_VER_K -void __osInitialize_autodetect(void) { -#ifndef _FINALROM - if (__checkHardware_msp()) { - __osInitialize_msp(); - } else if (__checkHardware_kmc()) { - __osInitialize_kmc(); - } else if (__checkHardware_isv()) { - __osInitialize_isv(); - } else { - __osInitialize_emu(); - } -#endif -} -#endif - -#if LIBULTRA_VERSION == OS_VER_J -void createSpeedParam(void) { - __Dom1SpeedParam.type = DEVICE_TYPE_INIT; - __Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG); - __Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG); - __Dom1SpeedParam.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); - __Dom1SpeedParam.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); - - __Dom2SpeedParam.type = DEVICE_TYPE_INIT; - __Dom2SpeedParam.latency = IO_READ(PI_BSD_DOM2_LAT_REG); - __Dom2SpeedParam.pulse = IO_READ(PI_BSD_DOM2_PWD_REG); - __Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG); - __Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG); -} -#endif diff --git a/lib/ultra/os/interrupt.s b/lib/ultra/os/interrupt.s deleted file mode 100644 index a063c2bd..00000000 --- a/lib/ultra/os/interrupt.s +++ /dev/null @@ -1,50 +0,0 @@ -#include "PR/R4300.h" -#include "PR/os.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -#ifdef BBPLAYER -.set mips2 -#endif - -.text -.set noreorder -LEAF(__osDisableInt) -#if LIBULTRA_VERSION >= OS_VER_J - la t2, __OSGlobalIntMask - lw t3, (t2) - andi t3, SR_IMASK -#endif - mfc0 t0, C0_SR - and t1, t0, ~SR_IE - mtc0 t1, C0_SR - andi v0, t0, SR_IE -#if LIBULTRA_VERSION >= OS_VER_J - lw t0, (t2) - andi t0, SR_IMASK - beq t0, t3, ret - la t2, __osRunningThread - lw t1, 280(t2) - andi t2, t1, SR_IMASK - and t2, t0 - and t1, ~SR_IMASK - or t1, t2 - and t1, ~SR_IE - mtc0 t1, $12 - nop -#endif - nop -ret: - jr ra - nop -END(__osDisableInt) - -LEAF(__osRestoreInt) - mfc0 t0, C0_SR - or t0, t0, a0 - mtc0 t0, C0_SR - nop - nop - jr ra - nop -END(__osRestoreInt) diff --git a/lib/ultra/os/invaldcache.s b/lib/ultra/os/invaldcache.s deleted file mode 100644 index 5b984fb8..00000000 --- a/lib/ultra/os/invaldcache.s +++ /dev/null @@ -1,55 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -LEAF(osInvalDCache) - blez a1, 3f - - li t3, DCACHE_SIZE - bgeu a1, t3, 4f - - move t0, a0 - addu t1, a0, a1 - bgeu t0, t1, 3f - - addiu t1, t1, -DCACHE_LINESIZE - andi t2, t0, DCACHE_LINEMASK - beqz t2, 1f - - subu t0, t0, t2 - CACHE((C_HWBINV|CACH_PD), (t0)) - bgeu t0, t1, 3f - - addiu t0, t0, DCACHE_LINESIZE -1: - andi t2, t1, DCACHE_LINEMASK - beqz t2, 2f - - subu t1, t1, t2 - CACHE((C_HWBINV|CACH_PD), 0x10(t1)) - bltu t1, t0, 3f - -2: - CACHE((C_HINV|CACH_PD), (t0)) - .set noreorder - bltu t0, t1, 2b - addiu t0, t0, DCACHE_LINESIZE - .set reorder -3: - jr ra - -4: - li t0, KUSIZE - addu t1, t0, t3 - addiu t1, t1, -DCACHE_LINESIZE -5: - CACHE((C_IINV|CACH_PD), (t0)) - .set noreorder - bltu t0, t1, 5b - addiu t0, t0, DCACHE_LINESIZE - .set reorder - - jr ra - -END(osInvalDCache) diff --git a/lib/ultra/os/invalicache.s b/lib/ultra/os/invalicache.s deleted file mode 100644 index 6c9e5b33..00000000 --- a/lib/ultra/os/invalicache.s +++ /dev/null @@ -1,41 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -LEAF(osInvalICache) - blez a1, 2f - - li t3, ICACHE_SIZE - bgeu a1, t3, 3f - - move t0, a0 - addu t1, a0, a1 - bgeu t0, t1, 2f - - addiu t1, t1, -ICACHE_LINESIZE - andi t2, t0, ICACHE_LINEMASK - subu t0, t0, t2 -1: - CACHE((C_HINV|CACH_PI), (t0)) - .set noreorder - bltu t0, t1, 1b - addiu t0, t0, ICACHE_LINESIZE - .set reorder -2: - jr ra - -3: - li t0, KUSIZE - addu t1, t0, t3 - addiu t1, t1, -ICACHE_LINESIZE -4: - CACHE((C_IINV|CACH_PI), (t0)) - .set noreorder - bltu t0, t1, 4b - addiu t0, t0, ICACHE_LINESIZE - .set reorder - - jr ra - -END(osInvalICache) diff --git a/lib/ultra/os/maptlb.s b/lib/ultra/os/maptlb.s deleted file mode 100644 index 84d2bf38..00000000 --- a/lib/ultra/os/maptlb.s +++ /dev/null @@ -1,58 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -#define index a0 -#define pm a1 -#define vaddr a2 -#define evenpaddr a3 -#define oddpaddr 16(sp) -#define asid 20(sp) -.text -LEAF(osMapTLB) - STAY2(mfc0 t0, C0_ENTRYHI) - STAY2(mtc0 index, C0_INX) - STAY2(mtc0 pm, C0_PAGEMASK) -.set noreorder - lw t1, asid - beq t1, -1, 7f - li ta0, TLBLO_G -.set reorder - li t2, TLBLO_NONCOHRNT | TLBLO_D | TLBLO_V - or vaddr, vaddr, t1 - b 8f - -7: - li t2, TLBLO_NONCOHRNT | TLBLO_D | TLBLO_V | TLBLO_G -8: - STAY2(mtc0 vaddr, C0_ENTRYHI) - beq evenpaddr, -1, 9f - srl t3, evenpaddr, TLBLO_PFNSHIFT - or t3, t3, t2 - STAY2(mtc0 t3, C0_ENTRYLO0) - b 10f -9: - STAY2(mtc0 ta0, C0_ENTRYLO0) -10: - lw t3, oddpaddr - beq t3, -1, 11f - srl t3, t3, TLBLO_PFNSHIFT - or t3, t3, t2 - STAY2(mtc0 t3, C0_ENTRYLO1) - b 12f -11: - STAY2(mtc0 ta0, C0_ENTRYLO1) - bne evenpaddr, -1, 12f - li t3, K0BASE - STAY2(mtc0 t3, C0_ENTRYHI) -12: - .set noreorder - nop - tlbwi - nop - nop - nop - nop - STAY2(mtc0 t0, C0_ENTRYHI) - jr ra -END(osMapTLB) diff --git a/lib/ultra/os/maptlbrdb.s b/lib/ultra/os/maptlbrdb.s deleted file mode 100644 index c004362b..00000000 --- a/lib/ultra/os/maptlbrdb.s +++ /dev/null @@ -1,30 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -.set noreorder -LEAF(osMapTLBRdb) - mfc0 t0, C0_ENTRYHI - li t1, 31 - mtc0 t1, C0_INX - mtc0 zero, C0_PAGEMASK /*4k*/ - li t2, TLBLO_UNCACHED | TLBLO_D | TLBLO_V | TLBLO_G - li t1, K2BASE - mtc0 t1, C0_ENTRYHI - li t1, KUSIZE - srl t3, t1,TLBLO_PFNSHIFT - or t3, t3,t2 - mtc0 t3, C0_ENTRYLO0 - li t1, TLBLO_G - mtc0 t1, C0_ENTRYLO1 - nop - tlbwi - nop - nop - nop - nop - mtc0 t0, C0_ENTRYHI - jr ra - nop -END(osMapTLBRdb) diff --git a/lib/ultra/os/osint.h b/lib/ultra/os/osint.h deleted file mode 100644 index a0c54d04..00000000 --- a/lib/ultra/os/osint.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _OSINT_H -#define _OSINT_H -#include "PR/os_internal.h" -typedef struct __OSEventState -{ - OSMesgQueue *messageQueue; - OSMesg message; -} __OSEventState; -extern struct __osThreadTail -{ - OSThread *next; - OSPri priority; -} __osThreadTail; - -//maybe should be in exceptasm.h? -extern void __osEnqueueAndYield(OSThread **); -extern void __osDequeueThread(OSThread **, OSThread *); -extern void __osEnqueueThread(OSThread **, OSThread *); -extern OSThread *__osPopThread(OSThread **); -extern void __osDispatchThread(void); -extern void __osCleanupThread(void); - -extern void __osSetTimerIntr(OSTime); -extern OSTime __osInsertTimer(OSTimer *); -extern void __osTimerInterrupt(void); -extern u32 __osProbeTLB(void *); -extern int __osSpDeviceBusy(void); - -extern OSThread *__osRunningThread; -extern OSThread *__osActiveQueue; -extern OSThread *__osFaultedThread; -extern OSThread *__osRunQueue; - -extern OSTimer *__osTimerList; -extern OSTimer __osBaseTimer; -extern OSTime __osCurrentTime; -extern u32 __osBaseCounter; -extern u32 __osViIntrCount; -extern u32 __osTimerCounter; -extern u32 __osShutdown; - -extern __OSEventState __osEventStateTab[]; - - -//not sure if this should be here -extern s32 osViClock; -extern void __osTimerServicesInit(void); -extern s32 __osAiDeviceBusy(void); -extern int __osDpDeviceBusy(void); -#endif diff --git a/lib/ultra/os/parameters.s b/lib/ultra/os/parameters.s deleted file mode 100644 index d6b3d048..00000000 --- a/lib/ultra/os/parameters.s +++ /dev/null @@ -1,51 +0,0 @@ -#include "PR/R4300.h" -#include "PR/os.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text - -ABS(leoBootID, 0x800001a0) -ABS(osTvType, 0x80000300) -ABS(osRomType, 0x80000304) -ABS(osRomBase, 0x80000308) -ABS(osResetType, 0x8000030c) -ABS(osCicId, 0x80000310) -ABS(osVersion, 0x80000314) -ABS(osMemSize, 0x80000318) -ABS(osAppNMIBuffer, 0x8000031c) - -#ifdef BBPLAYER -ABS(__osBbEepromAddress, 0x8000035c) -ABS(__osBbEepromSize, 0x80000360) -ABS(__osBbFlashAddress, 0x80000364) -ABS(__osBbFlashSize, 0x80000368) -ABS(__osBbSramAddress, 0x8000036c) -ABS(__osBbSramSize, 0x80000370) -ABS(__osBbPakAddress, 0x80000374) -ABS(__osBbPakSize, 0x80000384) -ABS(__osBbIsBb, 0x80000388) -ABS(__osBbHackFlags, 0x8000038c) -ABS(__osBbStashMagic, 0x80000390) -ABS(__osBbPakBindings, 0x80000394) -ABS(__osBbStateName, 0x800003a4) -ABS(__osBbStateDirty, 0x800003b4) -ABS(__osBbAuxDataLimit, 0x800003b8) - -/* padding */ -.fill 0x64 -#else -/* padding */ -/* JP is the only version without padding even though 2.0D has it (US) */ -#if (LIBULTRA_VERSION > OS_VER_D) || (LIBULTRA_VERSION == OS_VER_D && LIBULTRA_REVISION >= 1) -.repeat 0x34 -.byte 0 -.endr -#endif -#if LIBULTRA_VERSION >= OS_VER_H -.repeat 0x20 -.byte 0 -.endr -#endif - -#endif diff --git a/lib/ultra/os/probetlb.s b/lib/ultra/os/probetlb.s deleted file mode 100644 index 98a9a15a..00000000 --- a/lib/ultra/os/probetlb.s +++ /dev/null @@ -1,54 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -.set noreorder -LEAF(__osProbeTLB) - mfc0 t0, C0_ENTRYHI - andi t1, t0, TLBHI_PIDMASK - and t2, a0, TLBHI_VPN2MASK - or t1, t1, t2 - mtc0 t1, C0_ENTRYHI - nop - nop - nop - tlbp - nop - nop - mfc0 t3, C0_INX - and t3, t3, TLBINX_PROBE - bnez t3, 3f - nop - tlbr - nop - nop - nop - mfc0 t3, C0_PAGEMASK - addi t3, t3, DCACHE_SIZE - srl t3, t3, 0x1 - and ta0, t3, a0 - bnez ta0, 1f - addi t3, t3,-1 - mfc0 v0, C0_ENTRYLO0 - b 2f - nop -1: - mfc0 v0, C0_ENTRYLO1 -2: - andi ta1, v0,TLBLO_V - beqz ta1, 3f - nop - and v0, v0, TLBLO_PFNMASK - sll v0, v0, TLBLO_PFNSHIFT - and ta1, a0, t3 - add v0, v0, ta1 - b 4f - nop -3: - li v0, -1 -4: - mtc0 t0, C0_ENTRYHI - jr ra - nop -END(__osProbeTLB) diff --git a/lib/ultra/os/seteventmesg.c b/lib/ultra/os/seteventmesg.c deleted file mode 100644 index da0908e1..00000000 --- a/lib/ultra/os/seteventmesg.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" -#include "macros.h" - -ALIGNED8 __OSEventState __osEventStateTab[OS_NUM_EVENTS]; -#if LIBULTRA_VERSION >= OS_VER_J -u32 __osPreNMI = FALSE; -#endif - -void osSetEventMesg(OSEvent event, OSMesgQueue *mq, OSMesg msg) { - register u32 saveMask; - __OSEventState *es; - - saveMask = __osDisableInt(); - - es = &__osEventStateTab[event]; - - es->messageQueue = mq; - es->message = msg; - -#if LIBULTRA_VERSION >= OS_VER_J - if (event == OS_EVENT_PRENMI) { - if (__osShutdown && !__osPreNMI) { - osSendMesg(mq, msg, OS_MESG_NOBLOCK); - } - __osPreNMI = TRUE; - } -#endif - - __osRestoreInt(saveMask); -} diff --git a/lib/ultra/os/setfpccsr.s b/lib/ultra/os/setfpccsr.s deleted file mode 100644 index f96ab33a..00000000 --- a/lib/ultra/os/setfpccsr.s +++ /dev/null @@ -1,11 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -LEAF(__osSetFpcCsr) - STAY2(cfc1 v0, fcr31) - STAY2(ctc1 a0, fcr31) - jr ra -END(__osSetFpcCsr) -.globl __osSetSR diff --git a/lib/ultra/os/settime.c b/lib/ultra/os/settime.c deleted file mode 100644 index 5bae2a24..00000000 --- a/lib/ultra/os/settime.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -void osSetTime(OSTime time) { - __osCurrentTime = time; -} diff --git a/lib/ultra/os/thread.c b/lib/ultra/os/thread.c deleted file mode 100644 index 31f0f91e..00000000 --- a/lib/ultra/os/thread.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -struct __osThreadTail __osThreadTail = { NULL, -1 }; -OSThread *__osRunQueue = (OSThread *) &__osThreadTail; -OSThread *__osActiveQueue = (OSThread *) &__osThreadTail; -OSThread *__osRunningThread = { 0 }; -OSThread *__osFaultedThread = { 0 }; - -void __osDequeueThread(register OSThread **queue, register OSThread *t) { - register OSThread *pred; - register OSThread *succ; - - pred = (OSThread *) queue; - succ = pred->next; - - while (succ != NULL) { - if (succ == t) { - pred->next = t->next; - return; - } - pred = succ; - succ = pred->next; - } -} diff --git a/lib/ultra/os/threadasm.h b/lib/ultra/os/threadasm.h deleted file mode 100644 index dfd91b6f..00000000 --- a/lib/ultra/os/threadasm.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _THREADASM_H_ -#define _THREADASM_H_ - -/* Offsets of members in the OSThread struct */ -#define THREAD_NEXT 0 -#define THREAD_PRI 4 -#define THREAD_QUEUE 8 -#define THREAD_TLNEXT 12 -#define THREAD_STATE 16 -#define THREAD_FLAGS 18 -#define THREAD_ID 20 -#define THREAD_FP 24 -#define THREAD_GP1 32 -#define THREAD_GP2 40 -#define THREAD_GP3 48 -#define THREAD_GP4 56 -#define THREAD_GP5 64 -#define THREAD_GP6 72 -#define THREAD_GP7 80 -#define THREAD_GP8 88 -#define THREAD_GP9 96 -#define THREAD_GP10 104 -#define THREAD_GP11 112 -#define THREAD_GP12 120 -#define THREAD_GP13 128 -#define THREAD_GP14 136 -#define THREAD_GP15 144 -#define THREAD_GP16 152 -#define THREAD_GP17 160 -#define THREAD_GP18 168 -#define THREAD_GP19 176 -#define THREAD_GP20 184 -#define THREAD_GP21 192 -#define THREAD_GP22 200 -#define THREAD_GP23 208 -#define THREAD_GP24 216 -#define THREAD_GP25 224 -/* k0 and k1 are reserved for the kernel */ -#define THREAD_GP28 232 -#define THREAD_GP29 240 -#define THREAD_GP30 248 -#define THREAD_GP31 256 -#define THREAD_LO 264 -#define THREAD_HI 272 -#define THREAD_SR 280 -#define THREAD_PC 284 -#define THREAD_CAUSE 288 -#define THREAD_BADVADDR 292 -#define THREAD_RCP 296 -#define THREAD_FPCSR 300 -#define THREAD_FP0 304 -#define THREAD_FP2 312 -#define THREAD_FP4 320 -#define THREAD_FP6 328 -#define THREAD_FP8 336 -#define THREAD_FP10 344 -#define THREAD_FP12 352 -#define THREAD_FP14 360 -#define THREAD_FP16 368 -#define THREAD_FP18 376 -#define THREAD_FP20 384 -#define THREAD_FP22 392 -#define THREAD_FP24 400 -#define THREAD_FP26 408 -#define THREAD_FP28 416 -#define THREAD_FP30 424 - -#endif diff --git a/lib/ultra/os/unmaptlball.s b/lib/ultra/os/unmaptlball.s deleted file mode 100644 index 4846b004..00000000 --- a/lib/ultra/os/unmaptlball.s +++ /dev/null @@ -1,35 +0,0 @@ -#include "PR/R4300.h" -#include "PR/os.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -.text -.set noreorder -LEAF(osUnmapTLBAll) - mfc0 t0, C0_ENTRYHI -#if LIBULTRA_VERSION >= OS_VER_I - li t1, NTLBENTRIES-1 /* last reserved for rdb */ -#else - li t1, NTLBENTRIES -#endif - li t2, KUSIZE - mtc0 t2, C0_ENTRYHI - mtc0 zero, C0_ENTRYLO0 - mtc0 zero, C0_ENTRYLO1 -1: - mtc0 t1, C0_INX - nop - tlbwi - nop - nop - addi t1, t1,-1 -#if LIBULTRA_VERSION >= OS_VER_I - bgez t1, 1b -#else - bnezl t1, 1b -#endif - nop - mtc0 t0, C0_ENTRYHI - jr ra - nop -END(osUnmapTLBAll) diff --git a/lib/ultra/os/writebackdcache.s b/lib/ultra/os/writebackdcache.s deleted file mode 100644 index e7b1daa4..00000000 --- a/lib/ultra/os/writebackdcache.s +++ /dev/null @@ -1,34 +0,0 @@ -#include "PR/R4300.h" -#include "sys/asm.h" -#include "sys/regdef.h" - -LEAF(osWritebackDCache) - blez a1, 2f - li t3, DCACHE_SIZE - bgeu a1, t3, 3f - move t0, a0 - addu t1, a0, a1 - bgeu t0, t1, 2f - addiu t1, t1, -DCACHE_LINESIZE - andi t2, t0, DCACHE_LINEMASK - subu t0, t0, t2 -1: - CACHE( (C_HWB|CACH_PD), (t0)) - .set noreorder - bltu t0, t1, 1b - addiu t0, t0, DCACHE_LINESIZE - .set reorder -2: - jr ra -3: - li t0, KUSIZE - addu t1, t0, t3 - addiu t1, t1, -DCACHE_LINESIZE -4: - CACHE( (C_IWBINV|CACH_PD), (t0)) - .set noreorder - bltu t0, t1, 4b - addiu t0, t0, DCACHE_LINESIZE - .set reorder - jr ra -END(osWritebackDCache) diff --git a/lib/ultra/vimodes/vimodempallan1.c b/lib/ultra/vimodes/vimodempallan1.c deleted file mode 100644 index bd70a2a4..00000000 --- a/lib/ultra/vimodes/vimodempallan1.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "PR/os.h" -#include "PR/rcp.h" - -OSViMode osViModeMpalLan1 = { - OS_VI_MPAL_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 30, 5, 70), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3089, 4), // hSync - OS_VI_LEAP(3097, 3098), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } -}; diff --git a/lib/ultra/vimodes/vimodentsclan1.c b/lib/ultra/vimodes/vimodentsclan1.c deleted file mode 100644 index b7aae9c1..00000000 --- a/lib/ultra/vimodes/vimodentsclan1.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "PR/os.h" -#include "PR/rcp.h" - -OSViMode osViModeNtscLan1 = { - OS_VI_NTSC_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(57, 34, 5, 62), // burst - OS_VI_VSYNC(525), // vSync - OS_VI_HSYNC(3093, 0), // hSync - OS_VI_LEAP(3093, 3093), // leap - OS_VI_HSTART(108, 748), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(37, 511), // vStart - OS_VI_BURST(4, 2, 14, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } -}; diff --git a/lib/ultra/vimodes/vimodepallan1.c b/lib/ultra/vimodes/vimodepallan1.c deleted file mode 100644 index 15cbd6ed..00000000 --- a/lib/ultra/vimodes/vimodepallan1.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "PR/os.h" -#include "PR/rcp.h" - -OSViMode osViModePalLan1 = { - OS_VI_PAL_LAN1, // type - { // comRegs - VI_CTRL_TYPE_16 | VI_CTRL_GAMMA_DITHER_ON | VI_CTRL_GAMMA_ON | - VI_CTRL_DIVOT_ON | VI_CTRL_ANTIALIAS_MODE_1 | VI_CTRL_PIXEL_ADV_3, // ctrl - OS_VI_WIDTH(320), // width - OS_VI_BURST(58, OS_VI_BURST_CW_PAL, 4, OS_VI_BURST_CS_PAL), // burst - OS_VI_VSYNC(625), // vSync - OS_VI_HSYNC(3177, OS_VI_HSYNC_LEAP_PAL), // hSync - OS_VI_LEAP(3183, OS_VI_LEAP_LOWER_PAL), // leap - OS_VI_HSTART(128, 768), // hStart - OS_VI_SCALE(2, 0), // xScale - OS_VI_VCURRENT(0), // vCurrent - }, - { // fldRegs - { // [0] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - }, - { // [1] - OS_VI_ORIGIN(640), // origin - OS_VI_SCALE(1, 0), // yScale - OS_VI_HSTART(95, 569), // vStart - OS_VI_BURST(107, 2, 9, 0), // vBurst - OS_VI_VINTR(2), // vIntr - } - } -}; diff --git a/libultra.mk b/libultra.mk deleted file mode 100644 index 527fdd87..00000000 --- a/libultra.mk +++ /dev/null @@ -1,175 +0,0 @@ -ifeq ($(VERSION),jp) - LIBULTRA ?= D -else ifeq ($(VERSION),us) - LIBULTRA ?= D - LIBULTRA_REVISION ?= 1 -else ifeq ($(VERSION),eu) - LIBULTRA ?= F -else ifeq ($(VERSION),sh) - LIBULTRA ?= H -else ifeq ($(VERSION),cn) - LIBULTRA ?= BB -endif - -# Libultra number revision (only used on 2.0D) -LIBULTRA_REVISION ?= 0 - -# Special define for exclusive libultra files (driverominit) -LIBULTRA_EXCLUSIVE ?= 0 - -# LIBULTRA - sets the libultra OS version to use -$(eval $(call validate-option,LIBULTRA,D F H I K L BB)) - -ULTRA_VER_D := 1 -ULTRA_VER_E := 2 -ULTRA_VER_F := 3 -ULTRA_VER_G := 4 -ULTRA_VER_H := 5 -ULTRA_VER_I := 6 -ULTRA_VER_J := 7 -ULTRA_VER_K := 8 -ULTRA_VER_L := 9 - -ifeq ($(LIBULTRA),BB) - ULTRA_SRC_DIRS := $(shell find lib/ultra -type d) - ULTRA_VER_DEF := -DLIBULTRA_VERSION=$(ULTRA_VER_L) -DBBPLAYER -DLIBULTRA_STR_VER=\"L\" - LIBGULTRA ?= 1 -else - ULTRA_SRC_DIRS := $(shell find lib/ultra -type d -not -path "lib/ultra/bb/*") - ULTRA_VER_DEF := -DLIBULTRA_VERSION=$(ULTRA_VER_$(LIBULTRA)) -DLIBULTRA_REVISION=$(LIBULTRA_REVISION) -DLIBULTRA_STR_VER=\"$(LIBULTRA)\" -endif - -DEF_INC_CFLAGS += $(ULTRA_VER_DEF) - -ifeq ($(NON_MATCHING),1) - LIBULTRA_EXCLUSIVE := 1 - DEF_INC_CFLAGS += -DLIBULTRA_EXCLUSIVE -endif - -# LIBGULTRA - whenever to compile libultra using IDO or GNU -# 1 - uses egcs to match iQue (uses gcc if COMPILER is gcc) -# 0 - uses ido, used to match JP, US, EU and Shindou -LIBGULTRA ?= 0 -$(eval $(call validate-option,LIBGULTRA,0 1)) - -ULTRA_C_FILES := $(foreach dir,$(ULTRA_SRC_DIRS),$(wildcard $(dir)/*.c)) -ULTRA_S_FILES := $(foreach dir,$(ULTRA_SRC_DIRS),$(wildcard $(dir)/*.s)) - -ULTRA_O_C_FILES := $(foreach file,$(ULTRA_C_FILES),$(BUILD_DIR)/$(file:.c=.o)) -ULTRA_O_AS_FILES := $(foreach file,$(ULTRA_S_FILES),$(BUILD_DIR)/$(file:.s=.o)) - -ULTRA_O_FILES := $(ULTRA_O_C_FILES) $(ULTRA_O_AS_FILES) - -DEP_FILES += $(ULTRA_O_FILES:.o=.d) - -LIBULTRA_AR := $(BUILD_DIR)/libultra.a - -libultra: $(LIBULTRA_AR) - -REG_SIZES := -mgp32 -NOABICALL := -mno-abicalls - -OPT_FLAGS_LIBC := -ifeq ($(LIBULTRA),BB) - OPT_FLAGS_LIBC := -O2 -else - ifneq ($(LIBULTRA),D) - OPT_FLAGS_LIBC := -O3 - endif -endif - -ULTRA_CC := $(CC) -ULTRA_CFLAGS = -non_shared -Wab,-r4300_mul -Xcpluscomm -Xfullwarn -G 0 -signed -32 -ULTRA_ASFLAGS = -non_shared -Wab,-r4300_mul -Xcpluscomm -Xfullwarn -G 0 -nostdinc -o32 -c - -GULTRA_CC := COMPILER_PATH=$(EGCS_PATH) $(EGCS_PATH)/gcc -GULTRA_CFLAGS = -mcpu=r4300 -fno-pic -Wa,--strip-local-absolute -G 0 -GULTRA_ASFLAGS = -mcpu=r4300 -fno-pic -x assembler-with-cpp -c -DEGCS_GCC - -ifeq ($(LIBGULTRA),1) - $(ULTRA_O_C_FILES): CC := $(GULTRA_CC) - $(ULTRA_O_C_FILES): CFLAGS = $(GULTRA_CFLAGS) $(NOABICALL) $(REG_SIZES) - - $(ULTRA_O_AS_FILES): AS := $(GULTRA_CC) - $(ULTRA_O_AS_FILES): ASFLAGS = $(GULTRA_ASFLAGS) - $(ULTRA_O_AS_FILES): MIPSISET := -else - $(ULTRA_O_C_FILES): CC := $(ULTRA_CC) - $(ULTRA_O_C_FILES): CFLAGS = $(ULTRA_CFLAGS) - - $(ULTRA_O_AS_FILES): AS := $(ULTRA_CC) - $(ULTRA_O_AS_FILES): ASFLAGS = $(ULTRA_ASFLAGS) - $(ULTRA_O_AS_FILES): OPT_FLAGS := - $(ULTRA_O_AS_FILES): MIPSISET := -mips2 -endif - -# Libultra specific flags -ifneq ($(LIBULTRA),BB) - $(BUILD_DIR)/lib/ultra/os/exceptasm.o: MIPSISET := -mips3 - $(BUILD_DIR)/lib/ultra/libc/%.o: ASOPT_FLAGS := -O2 - $(BUILD_DIR)/lib/ultra/libc/ll.o: MIPSISET := -mips3 -32 - $(BUILD_DIR)/lib/ultra/libc/ll%.o: MIPSISET := -mips3 -32 -endif - -ifeq ($(NON_MATCHING),0) - $(BUILD_DIR)/lib/ultra/%.o: OPT_FLAGS := - - $(BUILD_DIR)/lib/ultra/audio/bnkf.o: OPT_FLAGS := -O3 - $(BUILD_DIR)/lib/ultra/gu/%.o: OPT_FLAGS := -O3 - - $(BUILD_DIR)/lib/ultra/libc/ldiv.o: OPT_FLAGS := -O2 - $(BUILD_DIR)/lib/ultra/libc/string.o: OPT_FLAGS := -O2 - - $(BUILD_DIR)/lib/ultra/libc/sprintf.o: OPT_FLAGS := $(OPT_FLAGS_LIBC) - $(BUILD_DIR)/lib/ultra/libc/syncprintf.o: OPT_FLAGS := $(OPT_FLAGS_LIBC) - $(BUILD_DIR)/lib/ultra/libc/xlitob.o: OPT_FLAGS := $(OPT_FLAGS_LIBC) - $(BUILD_DIR)/lib/ultra/libc/xldtob.o: OPT_FLAGS := $(OPT_FLAGS_LIBC) - $(BUILD_DIR)/lib/ultra/libc/xprintf.o: OPT_FLAGS := $(OPT_FLAGS_LIBC) - - ifeq ($(LIBULTRA),BB) - $(BUILD_DIR)/lib/ultra/%.o: MIPSISET := - - $(BUILD_DIR)/lib/ultra/bb/os/%.o: MIPSISET := -mips3 - $(BUILD_DIR)/lib/ultra/bb/os/%.o: REG_SIZES := -mgp64 - - $(BUILD_DIR)/lib/ultra/bb/wrapper.o: NOABICALL := - $(BUILD_DIR)/lib/ultra/bb/wrapper.o: OPT_FLAGS := -O2 - - $(BUILD_DIR)/lib/ultra/gu/%.o: MIPSISET := -mips2 - $(BUILD_DIR)/lib/ultra/gu/%.o: OPT_FLAGS := -O2 - - $(BUILD_DIR)/lib/ultra/io/%.o: MIPSISET := -mips2 - $(BUILD_DIR)/lib/ultra/io/%.o: OPT_FLAGS := -O2 - - $(BUILD_DIR)/lib/ultra/libc/%.o: MIPSISET := -mips2 - - $(BUILD_DIR)/lib/ultra/os/%.o: MIPSISET := -mips2 - $(BUILD_DIR)/lib/ultra/os/%.o: ASOPT_FLAGS := -O2 - endif -endif - -$(BUILD_DIR)/lib/ultra/%.o: lib/ultra/%.c - $(call print,Compiling:,$<,$@) - $(V)$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/lib/ultra/$*.d $< - $(V)$(CC) -c $(CFLAGS) $(TARGET_CFLAGS) $(OPT_FLAGS) $(MIPSISET) $(DEF_INC_CFLAGS) -o $@ $< -ifeq ($(LIBGULTRA),1) - $(V)$(TOOLS_DIR)/patch_elf_32bit $@ -endif - -$(BUILD_DIR)/lib/ultra/%.o: lib/ultra/%.s - $(call print,Assembling:,$<,$@) - $(V)$(AS) $(ASFLAGS) $(ASOPT_FLAGS) $(MIPSISET) $(DEF_INC_CFLAGS) -o $@ $< - -ifeq ($(LIBULTRA_EXCLUSIVE),0) -# Exclusive file due to being in audio alongside using IDO and different optimization flags -$(BUILD_DIR)/lib/ultra/io/driverominit.o: lib/ultra/io/driverominit.c - $(call print,Compiling:,$<,$@) - $(V)$(CC_CHECK) $(CC_CHECK_CFLAGS) -MMD -MP -MT $@ -MF $(BUILD_DIR)/lib/ultra/io/$*.d $< - $(V)$(ULTRA_CC) -c $(ULTRA_CFLAGS) $(TARGET_CFLAGS) $(DEF_INC_CFLAGS) -mips2 -g -o $@ $< -endif - -# Link libultra -$(LIBULTRA_AR): $(ULTRA_O_FILES) - @$(PRINT) "$(GREEN)Linking libultra: $(BLUE)$@ $(NO_COL)\n" - $(V)$(AR) rcs -o $@ $(ULTRA_O_FILES) - $(V)$(TOOLS_DIR)/patch_elf_32bit $@ diff --git a/sm64.ld b/sm64.ld index a5364b84..ddd65ced 100755 --- a/sm64.ld +++ b/sm64.ld @@ -2,86 +2,12 @@ OUTPUT_ARCH (mips) /* include/segments.h defines SEG_POOL_START, SEG_POOL_END, SEG_BUFFERS, * SEG_GODDARD, SEG_ENGINE, SEG_FRAMEBUFFERS */ + +#define _LD #include "segments.h" + #include "config.h" - -#ifndef USE_EXT_RAM -#define ADDR_OR_ALIGN(addr) (addr) -#else -#define ADDR_OR_ALIGN(addr) ALIGN(0x1000) -#endif - -#if defined(VERSION_US) || defined(VERSION_JP) -#define AUDIO_DIR BUILD_DIR/src/audio/us_jp -#elif defined(VERSION_EU) -#define AUDIO_DIR BUILD_DIR/src/audio/eu -#elif defined(VERSION_SH) || defined(VERSION_CN) -#define AUDIO_DIR BUILD_DIR/src/audio/sh -#endif - -#define BEGIN_SEG(name, addr) \ - _##name##SegmentStart = ADDR(.name); \ - _##name##SegmentRomStart = __romPos; \ - .name (addr) : AT(__romPos) - -#define END_SEG(name) \ - _##name##SegmentEnd = ADDR(.name) + SIZEOF(.name); \ - _##name##SegmentRomEnd = __romPos + SIZEOF(.name); \ - __romPos += SIZEOF(.name); - -#define BEGIN_NOLOAD(name) \ - _##name##SegmentNoloadStart = ADDR(.name.noload); \ - .name.noload (NOLOAD) : - -#define END_NOLOAD(name) \ - _##name##SegmentNoloadEnd = ADDR(.name.noload) + SIZEOF(.name.noload); - -#define MIO0_SEG(name, segAddr) \ - BEGIN_SEG(name##_mio0, segAddr) \ - { \ - BUILD_DIR/bin/name.mio0.o(.data); \ - . = ALIGN(0x10); \ - } \ - END_SEG(name##_mio0) - -#define MIO0_EU_SEG(name, segAddr) \ - BEGIN_SEG(name##_mio0, segAddr) \ - { \ - BUILD_DIR/bin/eu/name.mio0.o(.data); \ - . = ALIGN(0x10); \ - } \ - END_SEG(name##_mio0) - -#define STANDARD_LEVEL(name) \ - BEGIN_SEG(name##_segment_7, 0x07000000) \ - { \ - BUILD_DIR/levels/name/leveldata.mio0.o(.data); \ - . = ALIGN(0x10); \ - } \ - END_SEG(name##_segment_7) \ - BEGIN_SEG(name, 0x0E000000) \ - { \ - BUILD_DIR/levels/name/script.o(.data); \ - BUILD_DIR/levels/name/geo.o(.data); \ - } \ - END_SEG(name) - -#define STANDARD_OBJECTS(name, segAddr, geoAddr) \ - BEGIN_SEG(name##_mio0, segAddr) \ - { \ - BUILD_DIR/actors/name.mio0.o(.data); \ - . = ALIGN(0x10); \ - } \ - END_SEG(name##_mio0) \ - BEGIN_SEG(name##_geo, geoAddr) \ - { \ - BUILD_DIR/actors/name##_geo.o(.data); \ - } \ - END_SEG(name##_geo) - -#define CREATE_LO_HI_PAIR(name, value) \ - name##Hi = (value) >> 16; \ - name##Lo = (value) & 0xffff; +#include "ld.h" SECTIONS { @@ -99,387 +25,61 @@ SECTIONS BEGIN_NOLOAD(zbuffer) { BUILD_DIR/src/buffers/zbuffer.o(.bss*); } + END_NOLOAD(zbuffer) + + . = _zbufferSegmentNoloadEnd; -#ifdef VERSION_CN - gZBufferEnd = .; -#endif - - . = SEG_BUFFERS; BEGIN_NOLOAD(buffers) { BUILD_DIR/src/buffers/buffers.o(.bss*); -#if defined(VERSION_SH) || defined(VERSION_CN) +#ifdef VERSION_SH AUDIO_DIR/port.o(.bss*); -#else +#endif AUDIO_DIR/globals_start.o(.bss*); AUDIO_DIR/synthesis.o(.bss*); AUDIO_DIR/heap.o(.bss*); AUDIO_DIR/load.o(.bss*); AUDIO_DIR/data.o(.bss*); -#endif + AUDIO_DIR*.o(.bss*); -#ifdef VERSION_EU - . = ALIGN(0x200); -#else - . = ALIGN(0x1000); -#endif -#if defined(VERSION_SH) || defined(VERSION_CN) - . += 0xB000; -#endif BUILD_DIR/src/buffers/gfx_output_buffer.o(.bss*); } END_NOLOAD(buffers) - - /* lib/src/__osDevMgrMain.c and lib/src/osCreateViManager.c contain infinite - * loops compiled without -g, which cause the return statements and the .o - * files themselves to be aligned to 32-byte boundaries. But the linker - * Nintendo used did not respect .o file alignment, and aligned the files - * only to 16 bytes, in some cases misaligning them. We force the same to - * happen using the SUBALIGN directive. This is harmless; the alignment is - * just an optimization. */ - BEGIN_SEG(main, ) -#ifndef VERSION_CN - SUBALIGN(16) -#endif + . = _buffersSegmentNoloadEnd; + BEGIN_SEG(main, .) { BUILD_DIR/asm/entry.o(.text); - BUILD_DIR/src/game/crash_screen.o(.text); - BUILD_DIR/src/game/main.o(.text); - BUILD_DIR/src/game/game_init.o(.text); -#ifdef VERSION_CN - . += 0x10; -#endif - BUILD_DIR/src/game/sound_init.o(.text); -#if ENABLE_RUMBLE - BUILD_DIR/src/game/rumble_init.o(.text); -#endif - BUILD_DIR/src/game/level_update.o(.text); - BUILD_DIR/src/game/interaction.o(.text); - BUILD_DIR/src/game/mario.o(.text); - BUILD_DIR/src/game/mario_step.o(.text); - BUILD_DIR/src/game/mario_actions_cutscene.o(.text); - BUILD_DIR/src/game/mario_actions_automatic.o(.text); - BUILD_DIR/src/game/mario_actions_stationary.o(.text); - BUILD_DIR/src/game/mario_actions_moving.o(.text); - BUILD_DIR/src/game/mario_actions_airborne.o(.text); - BUILD_DIR/src/game/mario_actions_submerged.o(.text); - BUILD_DIR/src/game/mario_actions_object.o(.text); - BUILD_DIR/src/game/level_geo.o(.text); - BUILD_DIR/src/game/mario_misc.o(.text); - BUILD_DIR/src/game/memory.o(.text); - BUILD_DIR/src/game/save_file.o(.text); - BUILD_DIR/src/game/area.o(.text); - BUILD_DIR/src/game/rendering_graph_node.o(.text); - BUILD_DIR/src/game/profiler.o(.text); BUILD_DIR/asm/decompress.o(.text); - BUILD_DIR/src/game/camera.o(.text); - BUILD_DIR/src/game/debug_course.o(.text); - BUILD_DIR/src/game/object_list_processor.o(.text); -#ifndef VERSION_EU - BUILD_DIR/src/game/object_helpers.o(.text); -#endif - BUILD_DIR/src/game/behavior_actions.o(.text); - BUILD_DIR/src/game/platform_displacement.o(.text); -#ifndef VERSION_EU - BUILD_DIR/src/game/object_collision.o(.text); - BUILD_DIR/src/game/spawn_object.o(.text); -#endif - BUILD_DIR/src/game/spawn_sound.o(.text); - BUILD_DIR/src/game/debug.o(.text); - BUILD_DIR/src/game/screen_transition.o(.text); - BUILD_DIR/src/game/shadow.o(.text); - BUILD_DIR/src/game/skybox.o(.text); - BUILD_DIR/src/game/moving_texture.o(.text); - BUILD_DIR/src/game/geo_misc.o(.text); - BUILD_DIR/src/game/paintings.o(.text); - BUILD_DIR/src/game/print.o(.text); - BUILD_DIR/src/game/ingame_menu.o(.text); - BUILD_DIR/src/game/envfx_snow.o(.text); - BUILD_DIR/src/game/envfx_bubbles.o(.text); - BUILD_DIR/src/game/macro_special_objects.o(.text); - BUILD_DIR/src/game/hud.o(.text); - BUILD_DIR/src/game/obj_behaviors.o(.text); - BUILD_DIR/src/game/obj_behaviors_2.o(.text); - AUDIO_DIR/synthesis.o(.text); - AUDIO_DIR/heap.o(.text); - AUDIO_DIR/load.o(.text); -#if defined(VERSION_SH) || defined(VERSION_CN) - AUDIO_DIR/port.o(.text); -#endif - AUDIO_DIR/playback.o(.text); - AUDIO_DIR/effects.o(.text); - AUDIO_DIR/seqplayer.o(.text); -#ifndef LIBULTRA_EXCLUSIVE -#if defined(VERSION_SH) || defined(VERSION_CN) - BUILD_DIR/libultra.a:driverominit.o(.text); -#endif -#endif + BUILD_DIR/src/game*.o(.text); + AUDIO_DIR*.o(.text); + ULTRA_BUILD_DIR/libgultra_rom.a:*.o(.text); BUILD_DIR/src/audio/external.o(.text); -#ifdef VERSION_EU - AUDIO_DIR/port.o(.text); -#endif - -#define SECTION text -#ifdef VERSION_JP -// JP has an additional 0x40 of weird padding space in text -#define JP_PADDING_TEXT -#endif - #include "lib/ultra/ld.inc" -#undef SECTION -#ifdef VERSION_JP -#undef JP_PADDING_TEXT -#endif - -#ifdef VERSION_CN - BUILD_DIR/libgcc.a:_divdi3.o(.text); - BUILD_DIR/libgcc.a:_moddi3.o(.text); - BUILD_DIR/libgcc.a:_udivdi3.o(.text); - BUILD_DIR/libgcc.a:_umoddi3.o(.text); - BUILD_DIR/libgcc.a:_cmpdi2.o(.text); - BUILD_DIR/libgcc.a:_floatdidf.o(.text); - BUILD_DIR/libgcc.a:_floatdisf.o(.text); - BUILD_DIR/libgcc.a:_fixunsdfdi.o(.text); - BUILD_DIR/libgcc.a:_fixdfdi.o(.text); - BUILD_DIR/libgcc.a:_fixunssfdi.o(.text); - BUILD_DIR/libgcc.a:_fixsfdi.o(.text); -#endif BUILD_DIR/lib/rsp.o(.text); - /* data */ - BUILD_DIR/src/game/crash_screen.o(.data*); - BUILD_DIR/src/game/main.o(.data*); - BUILD_DIR/src/game/game_init.o(.data*); - BUILD_DIR/src/game/sound_init.o(.data*); -#if ENABLE_RUMBLE - BUILD_DIR/src/game/rumble_init.o(.data*); -#endif - BUILD_DIR/src/game/level_update.o(.data*); - BUILD_DIR/src/game/interaction.o(.data*); - BUILD_DIR/src/game/mario.o(.data*); - BUILD_DIR/src/game/mario_step.o(.data*); - BUILD_DIR/src/game/mario_actions_cutscene.o(.data*); - BUILD_DIR/src/game/mario_actions_moving.o(.data*); - BUILD_DIR/src/game/mario_actions_submerged.o(.data*); - BUILD_DIR/src/game/mario_actions_object.o(.data*); - BUILD_DIR/src/game/mario_misc.o(.data*); - BUILD_DIR/src/game/memory.o(.data*); - BUILD_DIR/src/game/save_file.o(.data*); - BUILD_DIR/src/game/area.o(.data*); - BUILD_DIR/src/game/rendering_graph_node.o(.data*); - BUILD_DIR/src/game/profiler.o(.data*); - BUILD_DIR/src/game/camera.o(.data*); - BUILD_DIR/src/game/object_list_processor.o(.data*); -#ifndef VERSION_EU - BUILD_DIR/src/game/object_helpers.o(.data*); -#endif - BUILD_DIR/src/game/behavior_actions.o(.data*); - BUILD_DIR/src/game/platform_displacement.o(.data*); - BUILD_DIR/src/game/spawn_sound.o(.data*); - BUILD_DIR/src/game/debug.o(.data*); - BUILD_DIR/src/game/screen_transition.o(.data*); - BUILD_DIR/src/game/shadow.o(.data*); - BUILD_DIR/src/game/skybox.o(.data*); - BUILD_DIR/src/game/moving_texture.o(.data*); - BUILD_DIR/src/game/geo_misc.o(.data*); - BUILD_DIR/src/game/paintings.o(.data*); - BUILD_DIR/src/game/print.o(.data*); - BUILD_DIR/src/game/ingame_menu.o(.data*); - BUILD_DIR/src/game/envfx_snow.o(.data*); - BUILD_DIR/src/game/envfx_bubbles.o(.data*); - BUILD_DIR/src/game/macro_special_objects.o(.data*); - BUILD_DIR/src/game/hud.o(.data*); - BUILD_DIR/src/game/obj_behaviors.o(.data*); - BUILD_DIR/src/game/obj_behaviors_2.o(.data*); -#ifndef VERSION_EU - /* wildcard doesn't match on EU due to files being moved to engine/ */ + BUILD_DIR/asm/entry.o(.data*); + BUILD_DIR/asm/decompress.o(.data*); BUILD_DIR/src/game*.o(.data*); -#endif - AUDIO_DIR/synthesis.o(.data*); - AUDIO_DIR/heap.o(.data*); -#if !defined(VERSION_SH) && !defined(VERSION_CN) - AUDIO_DIR/load.o(.data*); -#endif - AUDIO_DIR/playback.o(.data*); - AUDIO_DIR/effects.o(.data*); - AUDIO_DIR/seqplayer.o(.data*); -#if defined(VERSION_SH) || defined(VERSION_CN) - AUDIO_DIR/data.o(.data*); - AUDIO_DIR/debug_prints.o(.data*); - AUDIO_DIR/port.o(.data*); -#endif + AUDIO_DIR*.o(.data*); + ULTRA_BUILD_DIR/libgultra_rom.a:*.o(.data*); BUILD_DIR/src/audio/external.o(.data*); -#if defined(VERSION_SH) || defined(VERSION_CN) - AUDIO_DIR/audio_session_presets.o(.data*); -#else -#ifdef VERSION_EU - AUDIO_DIR/port.o(.data*); -#endif - AUDIO_DIR/data.o(.data*); -#endif - -#define SECTION data* - #include "lib/ultra/ld.inc" -#undef SECTION - - /* rodata */ - BUILD_DIR/src/game/crash_screen.o(.rodata*); - BUILD_DIR/src/game/main.o(.rodata*); - BUILD_DIR/src/game/game_init.o(.rodata*); - BUILD_DIR/src/game/sound_init.o(.rodata*); - BUILD_DIR/src/game/rumble_init.o(.rodata*); - BUILD_DIR/src/game/level_update.o(.rodata*); - BUILD_DIR/src/game/interaction.o(.rodata*); - BUILD_DIR/src/game/mario.o(.rodata*); - BUILD_DIR/src/game/mario_step.o(.rodata*); - BUILD_DIR/src/game/mario_actions_cutscene.o(.rodata*); - BUILD_DIR/src/game/mario_actions_automatic.o(.rodata*); - BUILD_DIR/src/game/mario_actions_stationary.o(.rodata*); - BUILD_DIR/src/game/mario_actions_moving.o(.rodata*); - BUILD_DIR/src/game/mario_actions_airborne.o(.rodata*); - BUILD_DIR/src/game/mario_actions_submerged.o(.rodata*); - BUILD_DIR/src/game/mario_actions_object.o(.rodata*); - BUILD_DIR/src/game/mario_misc.o(.rodata*); - BUILD_DIR/src/game/memory.o(.rodata*); - BUILD_DIR/src/game/area.o(.rodata*); - BUILD_DIR/src/game/rendering_graph_node.o(.rodata*); - BUILD_DIR/src/game/camera.o(.rodata*); - BUILD_DIR/src/game/object_list_processor.o(.rodata*); -#ifndef VERSION_EU - BUILD_DIR/src/game/object_helpers.o(.rodata*); -#endif - BUILD_DIR/src/game/behavior_actions.o(.rodata*); -#ifndef VERSION_EU - BUILD_DIR/src/game/object_collision.o(.rodata*); - BUILD_DIR/src/game/spawn_object.o(.rodata*); -#endif - BUILD_DIR/src/game/spawn_sound.o(.rodata*); - BUILD_DIR/src/game/debug.o(.rodata*); - BUILD_DIR/src/game/screen_transition.o(.rodata*); - BUILD_DIR/src/game/shadow.o(.rodata*); - BUILD_DIR/src/game/skybox.o(.rodata*); - BUILD_DIR/src/game/moving_texture.o(.rodata*); - BUILD_DIR/src/game/geo_misc.o(.rodata*); - BUILD_DIR/src/game/paintings.o(.rodata*); - BUILD_DIR/src/game/print.o(.rodata*); - BUILD_DIR/src/game/ingame_menu.o(.rodata*); - BUILD_DIR/src/game/envfx_snow.o(.rodata*); - BUILD_DIR/src/game/envfx_bubbles.o(.rodata*); - BUILD_DIR/src/game/macro_special_objects.o(.rodata*); - BUILD_DIR/src/game/hud.o(.rodata*); - BUILD_DIR/src/game/obj_behaviors.o(.rodata*); - BUILD_DIR/src/game/obj_behaviors_2.o(.rodata*); -#if defined(VERSION_JP) || defined(VERSION_US) + BUILD_DIR/lib/rsp.o(.data*); + + BUILD_DIR/asm/entry.o(.rodata*); + BUILD_DIR/asm/decompress.o(.rodata*); BUILD_DIR/src/game*.o(.rodata*); -#endif - AUDIO_DIR/synthesis.o(.rodata*); - AUDIO_DIR/heap.o(.rodata*); - AUDIO_DIR/load.o(.rodata*); -#if defined(VERSION_SH) || defined(VERSION_CN) - AUDIO_DIR/port.o(.rodata*); -#endif - AUDIO_DIR/playback.o(.rodata*); - AUDIO_DIR/effects.o(.rodata*); - AUDIO_DIR/seqplayer.o(.rodata*); - BUILD_DIR/src/audio/external.o(.rodata*); -#ifdef VERSION_EU - AUDIO_DIR/port.o(.rodata*); -#endif AUDIO_DIR*.o(.rodata*); - -#define SECTION rodata* - #include "lib/ultra/ld.inc" -#undef SECTION - -#ifdef VERSION_CN - BUILD_DIR/libgcc.a:_divdi3.o(.rodata*); - BUILD_DIR/libgcc.a:_moddi3.o(.rodata*); - BUILD_DIR/libgcc.a:_udivdi3.o(.rodata*); - BUILD_DIR/libgcc.a:_umoddi3.o(.rodata*); - BUILD_DIR/libgcc.a:_cmpdi2.o(.rodata*); - BUILD_DIR/libgcc.a:_floatdidf.o(.rodata*); - BUILD_DIR/libgcc.a:_floatdisf.o(.rodata*); - BUILD_DIR/libgcc.a:_fixunsdfdi.o(.rodata*); - BUILD_DIR/libgcc.a:_fixdfdi.o(.rodata*); - BUILD_DIR/libgcc.a:_fixunssfdi.o(.rodata*); - BUILD_DIR/libgcc.a:_fixsfdi.o(.rodata*); -#endif - /* audio blobs, should really be moved into a separate file */ -#if defined(VERSION_SH) || defined(VERSION_CN) - AUDIO_DIR/load.o(.data*); -#endif + ULTRA_BUILD_DIR/libgultra_rom.a:*.o(.rodata*); + BUILD_DIR/src/audio/external.o(.rodata*); BUILD_DIR/lib/rsp.o(.rodata*); } END_SEG(main) BEGIN_NOLOAD(main) { - BUILD_DIR/src/game/cn_common_syms_1.o(.bss*); - BUILD_DIR/src/game/crash_screen.o(.bss*); - BUILD_DIR/src/game/main.o(.bss*); - BUILD_DIR/src/game/game_init.o(.bss*); - BUILD_DIR/src/game/sound_init.o(.bss*); -#if ENABLE_RUMBLE - BUILD_DIR/src/game/rumble_init.o(.bss*); -#endif - BUILD_DIR/src/game/level_update.o(.bss*); - BUILD_DIR/src/game/interaction.o(.bss*); - BUILD_DIR/src/game/mario.o(.bss*); - BUILD_DIR/src/game/mario_actions_cutscene.o(.bss*); - BUILD_DIR/src/game/mario_actions_moving.o(.bss*); - BUILD_DIR/src/game/mario_actions_submerged.o(.bss*); - BUILD_DIR/src/game/mario_misc.o(.bss*); - BUILD_DIR/src/game/memory.o(.bss*); - BUILD_DIR/src/game/save_file.o(.bss*); - BUILD_DIR/src/game/area.o(.bss*); - BUILD_DIR/src/game/rendering_graph_node.o(.bss*); - BUILD_DIR/src/game/profiler.o(.bss*); - BUILD_DIR/src/game/camera.o(.bss*); - BUILD_DIR/src/game/object_list_processor.o(.bss*); -#ifndef VERSION_EU - BUILD_DIR/src/game/object_helpers.o(.bss*); -#endif - BUILD_DIR/src/game/behavior_actions.o(.bss*); - BUILD_DIR/src/game/debug.o(.bss*); - BUILD_DIR/src/game/shadow.o(.bss*); - BUILD_DIR/src/game/skybox.o(.bss*); - BUILD_DIR/src/game/moving_texture.o(.bss*); - BUILD_DIR/src/game/geo_misc.o(.bss*); - BUILD_DIR/src/game/paintings.o(.bss*); - BUILD_DIR/src/game/print.o(.bss*); - BUILD_DIR/src/game/ingame_menu.o(.bss*); - BUILD_DIR/src/game/envfx_snow.o(.bss*); - BUILD_DIR/src/game/envfx_bubbles.o(.bss*); - BUILD_DIR/src/game/macro_special_objects.o(.bss*); - BUILD_DIR/src/game/hud.o(.bss*); - BUILD_DIR/src/game/obj_behaviors.o(.bss*); - BUILD_DIR/src/game/obj_behaviors_2.o(.bss*); -#if !defined(VERSION_EU) && !defined(VERSION_CN) BUILD_DIR/src/game*.o(.bss*); -#endif BUILD_DIR/src/audio/external.o(.bss*); -#ifdef VERSION_EU - AUDIO_DIR/port.o(.bss*); -#endif -#if defined(VERSION_SH) || defined(VERSION_CN) - AUDIO_DIR/globals_start.o(.bss*); - AUDIO_DIR/synthesis.o(.bss*); - AUDIO_DIR/heap.o(.bss*); - AUDIO_DIR/load.o(.bss*); - AUDIO_DIR/data.o(.bss*); -#endif - -#define SECTION bss* -#ifdef VERSION_SH -// osPfsIsPlug bss section is located slightly different in Shindou. -#define SH_PFS_BSS -#endif - #include "lib/ultra/ld.inc" -#undef SECTION -#ifdef VERSION_SH -#undef SH_PFS_BSS -#endif - - BUILD_DIR/src/game/cn_common_syms_2.o(.bss*); + AUDIO_DIR*.o(.bss*); + ULTRA_BUILD_DIR/libgultra_rom.a:*.o(.bss*); . = ALIGN(0x8); } @@ -500,76 +100,35 @@ SECTIONS #endif CREATE_LO_HI_PAIR(_mainSegmentNoloadSize, SIZEOF (.main.noload)) + . = _mainSegmentNoloadEnd; - BEGIN_SEG(engine, ADDR_OR_ALIGN(SEG_ENGINE)) + BEGIN_SEG(engine, .) { - BUILD_DIR/src/engine/math_util.o(.text); - BUILD_DIR/src/engine/graph_node.o(.text); - BUILD_DIR/src/engine/graph_node_manager.o(.text); - BUILD_DIR/src/engine/geo_layout.o(.text); - BUILD_DIR/src/engine/level_script.o(.text); - BUILD_DIR/src/engine/surface_collision.o(.text); - BUILD_DIR/src/engine/surface_load.o(.text); - BUILD_DIR/src/engine/behavior_script.o(.text); -#ifdef VERSION_EU - BUILD_DIR/src/game/object_collision.o(.text); - BUILD_DIR/src/game/spawn_object.o(.text); - BUILD_DIR/src/game/object_helpers.o(.text); -#endif BUILD_DIR/src/engine*.o(.text); - /* data */ - BUILD_DIR/src/engine/graph_node.o(.data*); - BUILD_DIR/src/engine/graph_node_manager.o(.data*); - BUILD_DIR/src/engine/math_util.o(.data*); - BUILD_DIR/src/engine/geo_layout.o(.data*); - BUILD_DIR/src/engine/level_script.o(.data*); - BUILD_DIR/src/engine/behavior_script.o(.data*); -#ifdef VERSION_EU - BUILD_DIR/src/game/object_collision.o(.data*); - BUILD_DIR/src/game/spawn_object.o(.data*); - BUILD_DIR/src/game/object_helpers.o(.data*); -#endif BUILD_DIR/src/engine*.o(.data*); - /* rodata */ - BUILD_DIR/src/engine/math_util.o(.rodata*); - BUILD_DIR/src/engine/level_script.o(.rodata*); - BUILD_DIR/src/engine/surface_collision.o(.rodata*); - BUILD_DIR/src/engine/surface_load.o(.rodata*); -#ifdef VERSION_EU - BUILD_DIR/src/game/object_collision.o(.rodata*); - BUILD_DIR/src/game/spawn_object.o(.rodata*); - BUILD_DIR/src/game/object_helpers.o(.rodata*); -#endif -#ifdef VERSION_CN - BUILD_DIR/src/engine/stub.o(.rodata*); -#endif BUILD_DIR/src/engine*.o(.rodata*); + . = ALIGN(0x100); } END_SEG(engine) BEGIN_NOLOAD(engine) { - BUILD_DIR/src/engine/math_util.o(.bss*); - BUILD_DIR/src/engine/geo_layout.o(.bss*); - BUILD_DIR/src/engine/level_script.o(.bss*); - BUILD_DIR/src/engine/surface_collision.o(.bss*); - BUILD_DIR/src/engine/surface_load.o(.bss*); - BUILD_DIR/src/engine/behavior_script.o(.bss*); -#ifdef VERSION_EU - BUILD_DIR/src/game/object_collision.o(.bss*); - BUILD_DIR/src/game/spawn_object.o(.bss*); - BUILD_DIR/src/game/object_helpers.o(.bss*); -#endif BUILD_DIR/src/engine*.o(.bss*); } END_NOLOAD(engine) - . = ADDR_OR_ALIGN(SEG_FRAMEBUFFERS); + . = _engineSegmentNoloadEnd; BEGIN_NOLOAD(framebuffers) { BUILD_DIR/src/buffers/framebuffers.o(.bss*); + . = ALIGN(0x100); } END_NOLOAD(framebuffers) + __mainPoolStart = .; + __mainPoolSize = RAM_END - .; + + ASSERT((. <= (SEG_POOL_START + POOL_SIZE)), "Error: extended past pool end.") + BEGIN_SEG(entry, 0x10000000) { BUILD_DIR/levels/entry.o(.data); @@ -620,35 +179,9 @@ SECTIONS /* 0x8016F000 21D7D0-255EC0 [386F0] */ BEGIN_SEG(goddard, SEG_GODDARD) { - BUILD_DIR/src/menu/title_screen.o(.text); - BUILD_DIR/src/menu/intro_geo.o(.text); - BUILD_DIR/src/menu/file_select.o(.text); - BUILD_DIR/src/menu/star_select.o(.text); BUILD_DIR/src/menu*.o(.text); - BUILD_DIR/libgoddard.a:gd_main.o(.text); - BUILD_DIR/libgoddard.a:gd_memory.o(.text); - BUILD_DIR/libgoddard.a:sfx.o(.text); - BUILD_DIR/libgoddard.a:draw_objects.o(.text); - BUILD_DIR/libgoddard.a:objects.o(.text); - BUILD_DIR/libgoddard.a:skin_movement.o(.text); - BUILD_DIR/libgoddard.a:particles.o(.text); - BUILD_DIR/libgoddard.a:dynlist_proc.o(.text); - BUILD_DIR/libgoddard.a:old_menu.o(.text); - BUILD_DIR/libgoddard.a:debug_utils.o(.text); - BUILD_DIR/libgoddard.a:joints.o(.text); - BUILD_DIR/libgoddard.a:skin.o(.text); - BUILD_DIR/libgoddard.a:gd_math.o(.text); - BUILD_DIR/libgoddard.a:shape_helper.o(.text); - BUILD_DIR/libgoddard.a:renderer.o(.text); BUILD_DIR/libgoddard.a:*.o(.text); /* data, rodata, per file */ - BUILD_DIR/src/menu/title_screen.o(.data*); - BUILD_DIR/src/menu/title_screen.o(.rodata*); - BUILD_DIR/src/menu/intro_geo.o(.data*); - BUILD_DIR/src/menu/file_select.o(.data*); - BUILD_DIR/src/menu/file_select.o(.rodata*); - BUILD_DIR/src/menu/star_select.o(.data*); - BUILD_DIR/src/menu/star_select.o(.rodata*); BUILD_DIR/src/menu*.o(.data*); BUILD_DIR/src/menu*.o(.rodata*); /* goddard subsystem data */ @@ -680,9 +213,6 @@ SECTIONS END_SEG(goddard) BEGIN_NOLOAD(goddard) { - BUILD_DIR/src/menu/intro_geo.o(.bss*); - BUILD_DIR/src/menu/file_select.o(.bss*); - BUILD_DIR/src/menu/star_select.o(.bss*); BUILD_DIR/src/menu*.o(.bss*); BUILD_DIR/libgoddard.a:gd_main.o(.bss*); BUILD_DIR/libgoddard.a:gd_memory.o(.bss*); @@ -813,8 +343,8 @@ SECTIONS *(*); } - ASSERT((_goddardSegmentNoloadEnd <= SEG_POOL_END), "Error: menu segment extended past pool end") + ASSERT((_goddardSegmentNoloadEnd <= SEG_POOL_START + POOL_SIZE), "Error: menu segment extended past pool end") ASSERT((_mainSegmentNoloadEnd <= _engineSegmentStart), "Error: main segment extended into engine.") ASSERT((_engineSegmentNoloadEnd <= _framebuffersSegmentNoloadStart), "Error: engine segment extended into framebuffers.") - ASSERT((_framebuffersSegmentNoloadEnd <= SEG_RAM_END), "Error: framebuffers segment extended past RDRAM end") + ASSERT((_framebuffersSegmentNoloadEnd <= RAM_END), "Error: framebuffers segment extended past RDRAM end") } diff --git a/src/audio/external.c b/src/audio/external.c index fc8b5905..769ad02d 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -392,9 +392,6 @@ s32 D_SH_80343CF0; s8 D_SH_80343CF8_pad[0x8]; struct UnkStruct80343D00 D_SH_80343D00; s8 D_SH_8034DC8_pad[0x8]; -#ifndef LIBULTRA_EXCLUSIVE -ALIGNED8 OSPiHandle DriveRomHandle; // used in osDriveRomInit.c. Why here? -#endif s8 D_SH_80343E48_pad[0x8]; #endif diff --git a/src/game/crash_screen.c b/src/game/crash_screen.c index 574b1103..330267cc 100644 --- a/src/game/crash_screen.c +++ b/src/game/crash_screen.c @@ -4,9 +4,8 @@ #include "sm64.h" -#if defined(TARGET_N64) && (defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN)) #include "PR/os_internal.h" -#include "lib/ultra/libc/xstdio.h" +#include "lib/hackerlibultra/src/libc/xstdio.h" u8 gCrashScreenCharToGlyph[128] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -113,16 +112,12 @@ void crash_screen_print(s32 x, s32 y, const char *fmt, ...) { va_list args; va_start(args, fmt); - size = _Printf(write_to_buf, buf, fmt, args); + size = _Printf((void*)write_to_buf, buf, fmt, args); if (size > 0) { ptr = buf; -#if defined(VERSION_SH) || defined(VERSION_CN) while (size > 0) { -#else - while (*ptr) { -#endif glyph = gCrashScreenCharToGlyph[*ptr & 0x7f]; @@ -130,9 +125,7 @@ void crash_screen_print(s32 x, s32 y, const char *fmt, ...) { crash_screen_draw_glyph(x, y, glyph); } -#if defined(VERSION_SH) || defined(VERSION_CN) size--; -#endif ptr++; x += 6; @@ -189,16 +182,11 @@ void draw_crash_screen(OSThread *thread) { cause = 17; } -#if defined(VERSION_SH) || defined(VERSION_CN) osWritebackDCacheAll(); -#endif crash_screen_draw_rect(25, 20, 270, 25); crash_screen_print(30, 25, "THREAD:%d (%s)", thread->id, gCauseDesc[cause]); crash_screen_print(30, 35, "PC:%08XH SR:%08XH VA:%08XH", tc->pc, tc->sr, tc->badvaddr); -#ifdef VERSION_EU - osWritebackDCacheAll(); -#endif crash_screen_sleep(2000); crash_screen_draw_rect(25, 45, 270, 185); crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0, @@ -221,9 +209,6 @@ void draw_crash_screen(OSThread *thread) { (u32) tc->sp); crash_screen_print(30, 140, "S8:%08XH RA:%08XH", (u32) tc->s8, (u32) tc->ra); crash_screen_print_fpcsr(tc->fpcsr); -#ifdef VERSION_EU - osWritebackDCacheAll(); -#endif crash_screen_print_float_reg(30, 170, 0, &tc->fp0.f.f_even); crash_screen_print_float_reg(120, 170, 2, &tc->fp2.f.f_even); crash_screen_print_float_reg(210, 170, 4, &tc->fp4.f.f_even); @@ -240,9 +225,6 @@ void draw_crash_screen(OSThread *thread) { crash_screen_print_float_reg(120, 210, 26, &tc->fp26.f.f_even); crash_screen_print_float_reg(210, 210, 28, &tc->fp28.f.f_even); crash_screen_print_float_reg(30, 220, 30, &tc->fp30.f.f_even); -#ifdef VERSION_EU - osWritebackDCacheAll(); -#endif osViBlack(FALSE); osViSwapBuffer(gCrashScreen.framebuffer); } @@ -277,38 +259,20 @@ void thread2_crash_screen(UNUSED void *arg) { } void crash_screen_set_framebuffer(u16 *framebuffer, u16 width, u16 height) { -#ifdef VERSION_EU - gCrashScreen.framebuffer = framebuffer; -#else gCrashScreen.framebuffer = (u16 *)((uintptr_t)framebuffer | 0xa0000000); -#endif gCrashScreen.width = width; gCrashScreen.height = height; } void crash_screen_init(void) { -#ifdef VERSION_EU - gCrashScreen.framebuffer = (u16 *) (osMemSize | 0x80000000) - SCREEN_WIDTH * SCREEN_HEIGHT; -#else gCrashScreen.framebuffer = (u16 *) (osMemSize | 0xA0000000) - SCREEN_WIDTH * SCREEN_HEIGHT; -#endif gCrashScreen.width = SCREEN_WIDTH; -#ifdef VERSION_EU - gCrashScreen.height = SCREEN_HEIGHT; -#else gCrashScreen.height = 0x10; -#endif osCreateMesgQueue(&gCrashScreen.mesgQueue, &gCrashScreen.mesg, 1); osCreateThread( &gCrashScreen.thread, 2, thread2_crash_screen, NULL, (u8 *) gCrashScreen.stack + sizeof(gCrashScreen.stack), -#ifdef VERSION_EU - OS_PRIORITY_APPMAX -#else OS_PRIORITY_RMON -#endif ); osStartThread(&gCrashScreen.thread); } - -#endif diff --git a/src/game/libgcc.c b/src/game/libgcc.c new file mode 100644 index 00000000..16adaf37 --- /dev/null +++ b/src/game/libgcc.c @@ -0,0 +1,266 @@ +/* --------------------------------------------------------------------------------*/ +/* Depending on the toolchain used, an appropriate precompiled libgcc library */ +/* may not exist and cannot be linked against. Until we have a better work around, */ +/* necessary gcc functions are hosted here in order to properly compile. */ +/* This file is NOT a part of the original game and only exists to help gcc work. */ +/* --------------------------------------------------------------------------------*/ + +#include + +// Self-hosted libc memory functions, gcc assumes these exist even in a freestanding +// environment and there is no way to tell it otherwise. + +void *memset(void *dest, int val, size_t len) { + unsigned char *ptr = dest; + while (len-- > 0) + *ptr++ = val; + return dest; +} + +int memcmp(const void *s1, const void *s2, size_t n) { + const u8 *m1 = s1; + const u8 *m2 = s2; + size_t i; + + for (i = 0; i < n; i++) { + if (m1[i] < m2[i]) { + return -1; + } else if (m1[i] > m2[i]) { + return 1; + } + } + + return 0; +} + +void *memmove(void *dest, const void *src, size_t len) { + char *d = dest; + const char *s = src; + if (d < s) + while (len--) + *d++ = *s++; + else { + char *lasts = (char *) s + (len - 1); + char *lastd = (char *) d + (len - 1); + while (len--) + *lastd-- = *lasts--; + } + return dest; +} + +// Conversions involving 64-bit integer types required by the O32 MIPS ABI. + +// f32 -> u64, negative values become 0 +u64 __fixunssfdi(f32 a) { + if (a > 0.0f) { + register union { + f64 f; + u64 i; + } m; + + __asm__("cvt.l.s %0, %1" : "=f"(m.f) : "f"(a)); + return m.i; + } + return 0; +} + +// f64 -> u64, negative values become 0 +u64 __fixunsdfdi(f64 a) { + if (a > 0.0) { + register union { + f64 f; + u64 i; + } m; + + __asm__("cvt.l.d %0, %1" : "=f"(m.f) : "f"(a)); + return m.i; + } + return 0; +} + +// f32 -> s64 +s64 __fixsfdi(f32 c) { + register union { + f64 f; + s64 i; + } m; + + __asm__("cvt.l.s %0, %1" : "=f"(m.f) : "f"(c)); + return m.i; +} + +// f64 -> s64 +s64 __fixdfdi(f64 c) { + register union { + f64 f; + s64 i; + } m; + + __asm__("cvt.l.d %0, %1" : "=f"(m.f) : "f"(c)); + return m.i; +} + +// s64 -> f32 +f32 __floatdisf(s64 c) { + register union { + f64 f; + s64 i; + } m; + register f32 v; + + m.i = c; + __asm__("cvt.s.l %0, %1" : "=f"(v) : "f"(m.f)); + return v; +} + +// s64 -> f64 +f64 __floatdidf(s64 c) { + register union { + f64 f; + s64 i; + } m; + register f64 v; + + m.i = c; + __asm__("cvt.d.l %0, %1" : "=f"(v) : "f"(m.f)); + return v; +} + +// u64 -> f32 +f32 __floatundisf(u64 c) { + register union { + f64 f; + u64 i; + } m; + register f32 v; + + m.i = c; + __asm__("cvt.s.l %0, %1" : "=f"(v) : "f"(m.f)); + if ((s64) c < 0) { + // cvt.s.l assumes signed input, adjust output + v += 4294967296.0f; // 2^32 + } + return v; +} + +// u64 -> f64 +f64 __floatundidf(u64 c) { + register union { + f64 f; + u64 i; + } m; + register f64 v; + + m.i = c; + __asm__("cvt.d.l %0, %1" : "=f"(v) : "f"(m.f)); + if ((s64) c < 0) { + // cvt.d.l assumes signed input, adjust output + v += 18446744073709551616.0; // 2^64 + } + return v; +} + +// Compute x^m by binary exponentiation + +f32 __powisf2(f32 x, s32 m) { + u32 n = (m < 0) ? -m : m; + f32 y = (n % 2 != 0) ? x : 1.0f; + + while (n >>= 1) { + x = x * x; + + if (n % 2 != 0) { + y = y * x; + } + } + return (m < 0) ? (1.0f / y) : y; +} + +int __ucmpdi2(unsigned long long a, unsigned long long b) { + if (a == b) { + return 1; + } + return (a < b) ? 0 : 2; +} + +// Compute division and modulo of 64-bit signed and unsigned integers + +__asm__(" \n\ + .set push \n\ + .set noreorder \n\ + .set gp=64 \n\ + \n\ +.global __umoddi3 \n\ +__umoddi3: \n\ + .type __umoddi3, @function \n\ + .ent __umoddi3 \n\ + sw $a0, 0x0($sp) \n\ + sw $a1, 0x4($sp) \n\ + sw $a2, 0x8($sp) \n\ + sw $a3, 0xC($sp) \n\ + ld $t6, 0($sp) \n\ + ld $t7, 8($sp) \n\ + dremu $v0, $t6, $t7 \n\ + dsll32 $v1, $v0, 0 \n\ + dsra32 $v1, $v1, 0 \n\ + jr $ra \n\ + dsra32 $v0, $v0, 0 \n\ + .end __umoddi3 \n\ + .size __umoddi3, . - __umoddi3 \n\ + \n\ +.global __udivdi3 \n\ +__udivdi3: \n\ + .type __udivdi3, @function \n\ + .ent __udivdi3 \n\ + sw $a0, 0x0($sp) \n\ + sw $a1, 0x4($sp) \n\ + sw $a2, 0x8($sp) \n\ + sw $a3, 0xC($sp) \n\ + ld $t6, 0($sp) \n\ + ld $t7, 8($sp) \n\ + ddivu $v0, $t6, $t7 \n\ + dsll32 $v1, $v0, 0 \n\ + dsra32 $v1, $v1, 0 \n\ + jr $ra \n\ + dsra32 $v0, $v0, 0 \n\ + .end __udivdi3 \n\ + .size __udivdi3, . - __udivdi3 \n\ + \n\ +.global __moddi3 \n\ +__moddi3: \n\ + .type __moddi3, @function \n\ + .ent __moddi3 \n\ + sw $a0, 0x0($sp) \n\ + sw $a1, 0x4($sp) \n\ + sw $a2, 0x8($sp) \n\ + sw $a3, 0xC($sp) \n\ + ld $t6, 0($sp) \n\ + ld $t7, 8($sp) \n\ + drem $v0, $t6, $t7 \n\ + dsll32 $v1, $v0, 0 \n\ + dsra32 $v1, $v1, 0 \n\ + jr $ra \n\ + dsra32 $v0, $v0, 0 \n\ + .end __moddi3 \n\ + .size __moddi3, . - __moddi3 \n\ + \n\ +.global __divdi3 \n\ +__divdi3: \n\ + .type __divdi3, @function \n\ + .ent __divdi3 \n\ + sw $a0, 0x0($sp) \n\ + sw $a1, 0x4($sp) \n\ + sw $a2, 0x8($sp) \n\ + sw $a3, 0xC($sp) \n\ + ld $t6, 0($sp) \n\ + ld $t7, 8($sp) \n\ + ddiv $v0, $t6, $t7 \n\ + dsll32 $v1, $v0, 0 \n\ + dsra32 $v1, $v1, 0 \n\ + jr $ra \n\ + dsra32 $v0, $v0, 0 \n\ + .end __divdi3 \n\ + .size __divdi3, . - __divdi3 \n\ + \n\ + .set pop \n\ + \n"); diff --git a/src/game/main.c b/src/game/main.c index 34e8986f..46bd6978 100644 --- a/src/game/main.c +++ b/src/game/main.c @@ -130,7 +130,7 @@ void setup_mesg_queues(void) { void alloc_pool(void) { void *start = (void *) SEG_POOL_START; - void *end = (void *) SEG_POOL_END; + void *end = (void *) (SEG_POOL_START + POOL_SIZE); main_pool_init(start, end); gEffectsMemoryPool = mem_pool_init(0x4000, MEMORY_POOL_LEFT); @@ -329,11 +329,15 @@ void handle_dp_complete(void) { sCurrentDisplaySPTask = NULL; } +extern void crash_screen_init(void); + void thread3_main(UNUSED void *arg) { setup_mesg_queues(); alloc_pool(); load_engine_code_segment(); + crash_screen_init(); + create_thread(&gSoundThread, 4, thread4_sound, NULL, gThread4Stack + 0x2000, 20); osStartThread(&gSoundThread); diff --git a/src/game/memory.c b/src/game/memory.c index 0d081568..5dd5f3de 100644 --- a/src/game/memory.c +++ b/src/game/memory.c @@ -367,8 +367,8 @@ void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) { } void load_engine_code_segment(void) { - void *startAddr = (void *) SEG_ENGINE; - u32 totalSize = SEG_FRAMEBUFFERS - SEG_ENGINE; + void *startAddr = (void *) _engineSegmentStart; + u32 totalSize = _engineSegmentEnd - _engineSegmentStart; UNUSED u32 alignedSize = ALIGN16(_engineSegmentRomEnd - _engineSegmentRomStart); bzero(startAddr, totalSize); diff --git a/textures/crash_screen/crash_screen_font.ia1.png b/textures/crash_screen/crash_screen_font.ia1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9a899e721f22af060ffbc5e9f3cd64fbb2f950 GIT binary patch literal 739 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSV6f+4VPIg;{>)^^z`(T1)5S5QA}%>4;m7~^ zj2se@k_R6AuV>*_>|58?$heGam2BFX|NjM+@@PC-k)$B!)6&@3$;f)(tm}=2Csq@J zTDTRZA|*aBOt2MD4&2+YhP9vZMA^Zf#1xkbu~$(!b!`@+iTt~yTsRn+g-yi-{9IXt zmEC+AzZ`Jt=Db|O#>5~P%=2STSB`<6nTI`hl@k+Z)13B>fIoamEuPJXWYUC{yEG2X zJrQ{7Ktmd9(Jv*{v>5^m&pL=WgrD!wmQv(XpR;j>LY?DRS!SC$g>Qe|PpywwB>S-X zPhfkF#G&mz6GYCR=+M>?NbHT}jY|8~AG9NZKQzQt=Y%A)*!CBda#t0u{9tESQdWLf z(*8lJEV;0X@maFVp9OB3XSRAYw$I8<{N|W(W<%p{cFQk?uF6>%Q>ya%UzLD|zU1 zr|o4Ba;s<$U`up7KdmRCnEjB%mmLX73j`LpC}&+!oXx`(cg2ODTYU%P1R>7q4-4Hi zS500RcVOBng>8#|3oH?uQj{2Yj-@j=$E?|=W!^6X<{r+SlMcwv+p*c&!dOs`+hJmF ztf;Wc%?CzIH+^p~OGt4W{6EBVXzq-Qi)RUjp02Oxbn%dx*Hrk_A*oo+(^GQx@eN_? zCMH!W{-PQLOeZQGe2W$$^HLddAoPOmkCnb zCtf*<1;i{6NM%sb*$}Q%!RzotRB($#+rnR*f;9$WE^?L;fs5y9=r5SoCb5)lorY5> zZxNGIpWBvQf_F=5j%v<|%2~-9$&;Vu!Y9_^RHA#MH=*$d@5I2u>8=Lq|K0Q17S8fn z#VzsSXYUMy1#UVIPOjo{VVGfjF*ApgJwN1;F~cK1n~NQ5>smC}Cr;=%I&Y?=!P#SS spDJYgtrvV~ #include #include - +#include #include #include #include diff --git a/tools/asm-processor/.gitignore b/tools/asm-processor/.gitignore deleted file mode 100644 index cc5bba4b..00000000 --- a/tools/asm-processor/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.o -*.py[cod] diff --git a/tools/asm-processor/README.md b/tools/asm-processor/README.md deleted file mode 100644 index 009147c0..00000000 --- a/tools/asm-processor/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# asm-processor - -Pre-process .c files and post-process .o files to enable embedding MIPS assembly into IDO-compiled C. - -## Usage - -Let's say you have a file compiled with `-g` on the IDO compiler, that looks like this: -```c -float func4(void) { - "func4"; - return 0.2f; -} -``` - -This script enables replacing it by: -```asm -GLOBAL_ASM( -.rdata -.word 0x66756e63 # func -.word 0x34000000 # 4\0\0\0 - -.late_rodata -glabel rv -.word 0x3e4ccccd # 0.2f - -.text -glabel func4 -lui $at, %hi(rv) -jr $ra -lwc1 $f0, %lo(rv)($at) -jr $ra -nop -jr $ra -nop -) -``` - -To compile the file, run `python3 build.py $CC -- $AS $ASFLAGS -- $CFLAGS -o out.o in.c`, where $CC points to an IDO binary (5.3/7.1 and recomp/qemu all supported), $AS is e.g. `mips-linux-gnu-as`, $ASFLAGS e.g. `-march=vr4300 -mabi=32` and $CFLAGS e.g. `-Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -g`. build.py may be customized as needed. - -In addition to an .o file, build.py also generates a .d file with Makefile dependencies for .s files referenced by the input .c file. -This functionality may be removed if not needed. - -Reading assembly from file is also supported, by either `GLOBAL_ASM("file.s")` or `#pragma GLOBAL_ASM("file.s")`. - -### What is supported? - -`.text`, `.data`, `.bss` and `.rodata` sections, `.word`/`.incbin`, `.ascii`/`.asciz`, and `-g`, `-g3`, `-O1`, `-O2`, `-framepointer` and `-mips1`/`-mips2` flags to the IDO compiler. - -### What is not supported? - -* complicated assembly (.ifdef, macro declarations/calls other than `glabel`, pseudo-instructions that expand to several real instructions) -* non-IDO compilers -* `-O3` (due to function reordering) - -C `#ifdef`s only work outside of `GLOBAL_ASM` calls, but is otherwise able to replace `.ifdef`. - -### What's up with "late rodata"? - -The IDO compiler emits rodata in two passes: first array/string contents, then large literals/switch jump tables. - -Data declared within `.rdata`/`.section .rodata` will end up in the first half, and `.late_rodata`/`.section .late_rodata` in the second half. - -### How does it work? - -It's a bit of a hack! -The basic idea is replace `GLOBAL_ASM` blocks with dummy C functions/global vars of the same sections sizes as the assembly. -Then the C file gets compiled, and the dummy contents overwritten with the injected assembly. - -To accomplish this, asm-processor has logic for guessing the size of assembly contents -(which assumes the assembly isn't too complicated, e.g. no macros), -and for emitting C code of exact sizes for a bunch of different IDO compiler flags. - -The assembler code is padded with nops to line it up with its correct position in the C; -this allows C and asm ELF files to be merged easily without having to fix up e.g. symbol addresses. - -The most difficult part is `late_rodata`, which is hard to create programmatically. -asm-processor does that by emitting code that uses dummy float literals/double literals/jump tables, -assembles the late_rodata at another location of the .rodata section, then overwrites the dummy rodata. -This does require some movement of symbols and relocations, and quite a bit of care in what code to -emit and how to preserve .double alignment. - -It's worth noting some alternative ways in which asm-processor would have been implemented: -- One idea to get rid of the C/asm size estimations is to emit arbitrary code, and then move code, -symbols and relocations to the correct place after the sizes are known. -Given the machinery for `late_rodata` this wouldn't have been too difficult, and it would have the upside of improved portability. -There is a big downside, however: using dummy code of incorrect size throws off alignment and can introduce unintended padding. -Fixing this would require running multiple passes of asm-processor, with one compile per `ASM_GLOBAL`. -- Another idea is to run the compiler with -S to emit assembly, modify the emitted assembly, then run the assembler -(which in IDO's case may perform additional instruction reordering etc.). -This option has not been investigated in much detail, and would perhaps be superior to the current implementation. -It does have a few unknowns to it, e.g. instruction encoding differences between GNU `as` and IDO's assembler, -how to avoid reordering the injected assembly, and how .rodata/.late_rodata are implemented. - -### Testing - -There are a few tests to ensure you don't break anything when hacking on asm-processor: `./run-tests.sh` should exit without output if they pass, or else output a diff from previous to new version. - -Tests need the environment variable `MIPS_CC` set to point to the IDO 7.1 compiler, with Pascal support enabled. - -For example if asm-processor is cloned in the same directory as [ido static recomp](https://github.com/decompals/ido-static-recomp) and the working directory is asm-processor, tests can be run using: - -```sh -MIPS_CC=../ido-static-recomp/build/7.1/out/cc ./run-tests.sh -``` - -Or using [qemu-irix](https://github.com/zeldaret/oot/releases/tag/0.1q) (don't forget `chmod u+x qemu-irix`) to emulate IDO: - -```sh -MIPS_CC='./qemu-irix -silent -L ../ido-static-recomp/ido/7.1/ ../ido-static-recomp/ido/7.1/usr/bin/cc' ./run-tests.sh -``` - -To skip running Pascal tests, remove the `tests/*.p` glob from `run-tests.sh`. diff --git a/tools/asm-processor/add-test.sh b/tools/asm-processor/add-test.sh deleted file mode 100644 index 708548e5..00000000 --- a/tools/asm-processor/add-test.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -for A in "$@"; do - OBJDUMPFLAGS="-srt" - ./compile-test.sh "$A" && mips-linux-gnu-objdump $OBJDUMPFLAGS "${A%.*}.o" > "${A%.*}.objdump" -done diff --git a/tools/asm-processor/asm_processor.py b/tools/asm-processor/asm_processor.py deleted file mode 100644 index ff53a272..00000000 --- a/tools/asm-processor/asm_processor.py +++ /dev/null @@ -1,1472 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import tempfile -import struct -import copy -import sys -import re -import os -from collections import namedtuple -from io import StringIO - -MAX_FN_SIZE = 100 -SLOW_CHECKS = False - -EI_NIDENT = 16 -EI_CLASS = 4 -EI_DATA = 5 -EI_VERSION = 6 -EI_OSABI = 7 -EI_ABIVERSION = 8 -STN_UNDEF = 0 - -SHN_UNDEF = 0 -SHN_ABS = 0xfff1 -SHN_COMMON = 0xfff2 -SHN_XINDEX = 0xffff -SHN_LORESERVE = 0xff00 - -STT_NOTYPE = 0 -STT_OBJECT = 1 -STT_FUNC = 2 -STT_SECTION = 3 -STT_FILE = 4 -STT_COMMON = 5 -STT_TLS = 6 - -STB_LOCAL = 0 -STB_GLOBAL = 1 -STB_WEAK = 2 - -STV_DEFAULT = 0 -STV_INTERNAL = 1 -STV_HIDDEN = 2 -STV_PROTECTED = 3 - -SHT_NULL = 0 -SHT_PROGBITS = 1 -SHT_SYMTAB = 2 -SHT_STRTAB = 3 -SHT_RELA = 4 -SHT_HASH = 5 -SHT_DYNAMIC = 6 -SHT_NOTE = 7 -SHT_NOBITS = 8 -SHT_REL = 9 -SHT_SHLIB = 10 -SHT_DYNSYM = 11 -SHT_INIT_ARRAY = 14 -SHT_FINI_ARRAY = 15 -SHT_PREINIT_ARRAY = 16 -SHT_GROUP = 17 -SHT_SYMTAB_SHNDX = 18 -SHT_MIPS_GPTAB = 0x70000003 -SHT_MIPS_DEBUG = 0x70000005 -SHT_MIPS_REGINFO = 0x70000006 -SHT_MIPS_OPTIONS = 0x7000000d - -SHF_WRITE = 0x1 -SHF_ALLOC = 0x2 -SHF_EXECINSTR = 0x4 -SHF_MERGE = 0x10 -SHF_STRINGS = 0x20 -SHF_INFO_LINK = 0x40 -SHF_LINK_ORDER = 0x80 -SHF_OS_NONCONFORMING = 0x100 -SHF_GROUP = 0x200 -SHF_TLS = 0x400 - -R_MIPS_32 = 2 -R_MIPS_26 = 4 -R_MIPS_HI16 = 5 -R_MIPS_LO16 = 6 - -MIPS_DEBUG_ST_STATIC = 2 -MIPS_DEBUG_ST_STATIC_PROC = 14 - - -class ElfFormat: - def __init__(self, is_big_endian): - self.is_big_endian = is_big_endian - self.struct_char = ">" if is_big_endian else "<" - - def pack(self, fmt, *args): - return struct.pack(self.struct_char + fmt, *args) - - def unpack(self, fmt, data): - return struct.unpack(self.struct_char + fmt, data) - - -class ElfHeader: - """ - typedef struct { - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; - } Elf32_Ehdr; - """ - - def __init__(self, data): - self.e_ident = data[:EI_NIDENT] - assert self.e_ident[EI_CLASS] == 1 # 32-bit - self.fmt = ElfFormat(is_big_endian=(self.e_ident[EI_DATA] == 2)) - self.e_type, self.e_machine, self.e_version, self.e_entry, self.e_phoff, self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx = self.fmt.unpack('HHIIIIIHHHHHH', data[EI_NIDENT:]) - assert self.e_type == 1 # relocatable - assert self.e_machine == 8 # MIPS I Architecture - assert self.e_phoff == 0 # no program header - assert self.e_shoff != 0 # section header - assert self.e_shstrndx != SHN_UNDEF - - def to_bin(self): - return self.e_ident + self.fmt.pack('HHIIIIIHHHHHH', self.e_type, - self.e_machine, self.e_version, self.e_entry, self.e_phoff, - self.e_shoff, self.e_flags, self.e_ehsize, self.e_phentsize, - self.e_phnum, self.e_shentsize, self.e_shnum, self.e_shstrndx) - - -class Symbol: - """ - typedef struct { - Elf32_Word st_name; - Elf32_Addr st_value; - Elf32_Word st_size; - unsigned char st_info; - unsigned char st_other; - Elf32_Half st_shndx; - } Elf32_Sym; - """ - - def __init__(self, fmt, data, strtab, name=None): - self.fmt = fmt - self.st_name, self.st_value, self.st_size, st_info, self.st_other, self.st_shndx = fmt.unpack('IIIBBH', data) - assert self.st_shndx != SHN_XINDEX, "too many sections (SHN_XINDEX not supported)" - self.bind = st_info >> 4 - self.type = st_info & 15 - self.name = name if name is not None else strtab.lookup_str(self.st_name) - self.visibility = self.st_other & 3 - - @staticmethod - def from_parts(fmt, st_name, st_value, st_size, st_info, st_other, st_shndx, strtab, name): - header = fmt.pack('IIIBBH', st_name, st_value, st_size, st_info, st_other, st_shndx) - return Symbol(fmt, header, strtab, name) - - def to_bin(self): - st_info = (self.bind << 4) | self.type - return self.fmt.pack('IIIBBH', self.st_name, self.st_value, self.st_size, st_info, self.st_other, self.st_shndx) - - -class Relocation: - def __init__(self, fmt, data, sh_type): - self.fmt = fmt - self.sh_type = sh_type - if sh_type == SHT_REL: - self.r_offset, self.r_info = fmt.unpack('II', data) - else: - self.r_offset, self.r_info, self.r_addend = fmt.unpack('III', data) - self.sym_index = self.r_info >> 8 - self.rel_type = self.r_info & 0xff - - def to_bin(self): - self.r_info = (self.sym_index << 8) | self.rel_type - if self.sh_type == SHT_REL: - return self.fmt.pack('II', self.r_offset, self.r_info) - else: - return self.fmt.pack('III', self.r_offset, self.r_info, self.r_addend) - - -class Section: - """ - typedef struct { - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; - } Elf32_Shdr; - """ - - def __init__(self, fmt, header, data, index): - self.fmt = fmt - self.sh_name, self.sh_type, self.sh_flags, self.sh_addr, self.sh_offset, self.sh_size, self.sh_link, self.sh_info, self.sh_addralign, self.sh_entsize = fmt.unpack('IIIIIIIIII', header) - assert not self.sh_flags & SHF_LINK_ORDER - if self.sh_entsize != 0: - assert self.sh_size % self.sh_entsize == 0 - if self.sh_type == SHT_NOBITS: - self.data = b'' - else: - self.data = data[self.sh_offset:self.sh_offset + self.sh_size] - self.index = index - self.relocated_by = [] - - @staticmethod - def from_parts(fmt, sh_name, sh_type, sh_flags, sh_link, sh_info, sh_addralign, sh_entsize, data, index): - header = fmt.pack('IIIIIIIIII', sh_name, sh_type, sh_flags, 0, 0, len(data), sh_link, sh_info, sh_addralign, sh_entsize) - return Section(fmt, header, data, index) - - def lookup_str(self, index): - assert self.sh_type == SHT_STRTAB - to = self.data.find(b'\0', index) - assert to != -1 - return self.data[index:to].decode('latin1') - - def add_str(self, string): - assert self.sh_type == SHT_STRTAB - ret = len(self.data) - self.data += string.encode('latin1') + b'\0' - return ret - - def is_rel(self): - return self.sh_type == SHT_REL or self.sh_type == SHT_RELA - - def header_to_bin(self): - if self.sh_type != SHT_NOBITS: - self.sh_size = len(self.data) - return self.fmt.pack('IIIIIIIIII', self.sh_name, self.sh_type, self.sh_flags, self.sh_addr, self.sh_offset, self.sh_size, self.sh_link, self.sh_info, self.sh_addralign, self.sh_entsize) - - def late_init(self, sections): - if self.sh_type == SHT_SYMTAB: - self.init_symbols(sections) - elif self.is_rel(): - self.rel_target = sections[self.sh_info] - self.rel_target.relocated_by.append(self) - self.init_relocs() - - def find_symbol(self, name): - assert self.sh_type == SHT_SYMTAB - for s in self.symbol_entries: - if s.name == name: - return (s.st_shndx, s.st_value) - return None - - def find_symbol_in_section(self, name, section): - pos = self.find_symbol(name) - assert pos is not None - assert pos[0] == section.index - return pos[1] - - def init_symbols(self, sections): - assert self.sh_type == SHT_SYMTAB - assert self.sh_entsize == 16 - self.strtab = sections[self.sh_link] - entries = [] - for i in range(0, self.sh_size, self.sh_entsize): - entries.append(Symbol(self.fmt, self.data[i:i+self.sh_entsize], self.strtab)) - self.symbol_entries = entries - - def init_relocs(self): - assert self.is_rel() - entries = [] - for i in range(0, self.sh_size, self.sh_entsize): - entries.append(Relocation(self.fmt, self.data[i:i+self.sh_entsize], self.sh_type)) - self.relocations = entries - - def local_symbols(self): - assert self.sh_type == SHT_SYMTAB - return self.symbol_entries[:self.sh_info] - - def global_symbols(self): - assert self.sh_type == SHT_SYMTAB - return self.symbol_entries[self.sh_info:] - - def relocate_mdebug(self, original_offset): - assert self.sh_type == SHT_MIPS_DEBUG - new_data = bytearray(self.data) - shift_by = self.sh_offset - original_offset - - # Update the file-relative offsets in the Symbolic HDRR - hdrr_magic, hdrr_vstamp, hdrr_ilineMax, hdrr_cbLine, \ - hdrr_cbLineOffset, hdrr_idnMax, hdrr_cbDnOffset, hdrr_ipdMax, \ - hdrr_cbPdOffset, hdrr_isymMax, hdrr_cbSymOffset, hdrr_ioptMax, \ - hdrr_cbOptOffset, hdrr_iauxMax, hdrr_cbAuxOffset, hdrr_issMax, \ - hdrr_cbSsOffset, hdrr_issExtMax, hdrr_cbSsExtOffset, hdrr_ifdMax, \ - hdrr_cbFdOffset, hdrr_crfd, hdrr_cbRfdOffset, hdrr_iextMax, \ - hdrr_cbExtOffset = self.fmt.unpack("HHIIIIIIIIIIIIIIIIIIIIIII", self.data[0:0x60]) - - assert hdrr_magic == 0x7009, "Invalid magic value for .mdebug symbolic header" - - hdrr_cbLineOffset += shift_by - hdrr_cbDnOffset += shift_by - hdrr_cbPdOffset += shift_by - hdrr_cbSymOffset += shift_by - hdrr_cbOptOffset += shift_by - hdrr_cbAuxOffset += shift_by - hdrr_cbSsOffset += shift_by - hdrr_cbSsExtOffset += shift_by - hdrr_cbFdOffset += shift_by - hdrr_cbRfdOffset += shift_by - hdrr_cbExtOffset += shift_by - - new_data[0:0x60] = self.fmt.pack("HHIIIIIIIIIIIIIIIIIIIIIII", hdrr_magic, hdrr_vstamp, hdrr_ilineMax, hdrr_cbLine, \ - hdrr_cbLineOffset, hdrr_idnMax, hdrr_cbDnOffset, hdrr_ipdMax, \ - hdrr_cbPdOffset, hdrr_isymMax, hdrr_cbSymOffset, hdrr_ioptMax, \ - hdrr_cbOptOffset, hdrr_iauxMax, hdrr_cbAuxOffset, hdrr_issMax, \ - hdrr_cbSsOffset, hdrr_issExtMax, hdrr_cbSsExtOffset, hdrr_ifdMax, \ - hdrr_cbFdOffset, hdrr_crfd, hdrr_cbRfdOffset, hdrr_iextMax, \ - hdrr_cbExtOffset) - - self.data = bytes(new_data) - -class ElfFile: - def __init__(self, data): - self.data = data - assert data[:4] == b'\x7fELF', "not an ELF file" - - self.elf_header = ElfHeader(data[0:52]) - self.fmt = self.elf_header.fmt - - offset, size = self.elf_header.e_shoff, self.elf_header.e_shentsize - null_section = Section(self.fmt, data[offset:offset + size], data, 0) - num_sections = self.elf_header.e_shnum or null_section.sh_size - - self.sections = [null_section] - for i in range(1, num_sections): - ind = offset + i * size - self.sections.append(Section(self.fmt, data[ind:ind + size], data, i)) - - symtab = None - for s in self.sections: - if s.sh_type == SHT_SYMTAB: - assert not symtab - symtab = s - assert symtab is not None - self.symtab = symtab - - shstr = self.sections[self.elf_header.e_shstrndx] - for s in self.sections: - s.name = shstr.lookup_str(s.sh_name) - s.late_init(self.sections) - - def find_section(self, name): - for s in self.sections: - if s.name == name: - return s - return None - - def add_section(self, name, sh_type, sh_flags, sh_link, sh_info, sh_addralign, sh_entsize, data): - shstr = self.sections[self.elf_header.e_shstrndx] - sh_name = shstr.add_str(name) - s = Section.from_parts(self.fmt, sh_name=sh_name, sh_type=sh_type, - sh_flags=sh_flags, sh_link=sh_link, sh_info=sh_info, - sh_addralign=sh_addralign, sh_entsize=sh_entsize, data=data, - index=len(self.sections)) - self.sections.append(s) - s.name = name - s.late_init(self.sections) - return s - - def drop_mdebug_gptab(self): - # We can only drop sections at the end, since otherwise section - # references might be wrong. Luckily, these sections typically are. - while self.sections[-1].sh_type in [SHT_MIPS_DEBUG, SHT_MIPS_GPTAB]: - self.sections.pop() - - def write(self, filename): - outfile = open(filename, 'wb') - outidx = 0 - def write_out(data): - nonlocal outidx - outfile.write(data) - outidx += len(data) - def pad_out(align): - if align and outidx % align: - write_out(b'\0' * (align - outidx % align)) - - self.elf_header.e_shnum = len(self.sections) - write_out(self.elf_header.to_bin()) - - for s in self.sections: - if s.sh_type != SHT_NOBITS and s.sh_type != SHT_NULL: - pad_out(s.sh_addralign) - old_offset = s.sh_offset - s.sh_offset = outidx - if s.sh_type == SHT_MIPS_DEBUG and s.sh_offset != old_offset: - # The .mdebug section has moved, relocate offsets - s.relocate_mdebug(old_offset) - write_out(s.data) - - pad_out(4) - self.elf_header.e_shoff = outidx - for s in self.sections: - write_out(s.header_to_bin()) - - outfile.seek(0) - outfile.write(self.elf_header.to_bin()) - outfile.close() - - -def is_temp_name(name): - return name.startswith('_asmpp_') - - -# https://stackoverflow.com/a/241506 -def re_comment_replacer(match): - s = match.group(0) - if s[0] in "/#": - return " " - else: - return s - - -re_comment_or_string = re.compile( - r'#.*|/\*.*?\*/|"(?:\\.|[^\\"])*"' -) - - -class Failure(Exception): - def __init__(self, message): - self.message = message - - def __str__(self): - return self.message - - -class GlobalState: - def __init__(self, min_instr_count, skip_instr_count, use_jtbl_for_rodata, prelude_if_late_rodata, mips1, pascal): - # A value that hopefully never appears as a 32-bit rodata constant (or we - # miscompile late rodata). Increases by 1 in each step. - self.late_rodata_hex = 0xE0123456 - self.valuectr = 0 - self.namectr = 0 - self.min_instr_count = min_instr_count - self.skip_instr_count = skip_instr_count - self.use_jtbl_for_rodata = use_jtbl_for_rodata - self.prelude_if_late_rodata = prelude_if_late_rodata - self.mips1 = mips1 - self.pascal = pascal - - def next_late_rodata_hex(self): - dummy_bytes = struct.pack('>I', self.late_rodata_hex) - if (self.late_rodata_hex & 0xffff) == 0: - # Avoid lui - self.late_rodata_hex += 1 - self.late_rodata_hex += 1 - return dummy_bytes - - def make_name(self, cat): - self.namectr += 1 - return '_asmpp_{}{}'.format(cat, self.namectr) - - def func_prologue(self, name): - if self.pascal: - return " ".join([ - "procedure {}();".format(name), - "type", - " pi = ^integer;", - " pf = ^single;", - " pd = ^double;", - "var", - " vi: pi;", - " vf: pf;", - " vd: pd;", - "begin", - " vi := vi;", - " vf := vf;", - " vd := vd;", - ]) - else: - return 'void {}(void) {{'.format(name) - - def func_epilogue(self): - if self.pascal: - return "end;" - else: - return "}" - - def pascal_assignment(self, tp, val): - self.valuectr += 1 - address = (8 * self.valuectr) & 0x7FFF - return 'v{} := p{}({}); v{}^ := {};'.format(tp, tp, address, tp, val) - -Function = namedtuple('Function', ['text_glabels', 'asm_conts', 'late_rodata_dummy_bytes', 'jtbl_rodata_size', 'late_rodata_asm_conts', 'fn_desc', 'data']) - - -class GlobalAsmBlock: - def __init__(self, fn_desc): - self.fn_desc = fn_desc - self.cur_section = '.text' - self.asm_conts = [] - self.late_rodata_asm_conts = [] - self.late_rodata_alignment = 0 - self.late_rodata_alignment_from_content = False - self.text_glabels = [] - self.fn_section_sizes = { - '.text': 0, - '.data': 0, - '.bss': 0, - '.rodata': 0, - '.late_rodata': 0, - } - self.fn_ins_inds = [] - self.glued_line = '' - self.num_lines = 0 - - def fail(self, message, line=None): - context = self.fn_desc - if line: - context += ", at line \"" + line + "\"" - raise Failure(message + "\nwithin " + context) - - def count_quoted_size(self, line, z, real_line, output_enc): - line = line.encode(output_enc).decode('latin1') - in_quote = False - has_comma = True - num_parts = 0 - ret = 0 - i = 0 - digits = "0123456789" # 0-7 would be more sane, but this matches GNU as - while i < len(line): - c = line[i] - i += 1 - if not in_quote: - if c == '"': - in_quote = True - if z and not has_comma: - self.fail(".asciiz with glued strings is not supported due to GNU as version diffs") - num_parts += 1 - elif c == ',': - has_comma = True - else: - if c == '"': - in_quote = False - has_comma = False - continue - ret += 1 - if c != '\\': - continue - if i == len(line): - self.fail("backslash at end of line not supported", real_line) - c = line[i] - i += 1 - # (if c is in "bfnrtv", we have a real escaped literal) - if c == 'x': - # hex literal, consume any number of hex chars, possibly none - while i < len(line) and line[i] in digits + "abcdefABCDEF": - i += 1 - elif c in digits: - # octal literal, consume up to two more digits - it = 0 - while i < len(line) and line[i] in digits and it < 2: - i += 1 - it += 1 - - if in_quote: - self.fail("unterminated string literal", real_line) - if num_parts == 0: - self.fail(".ascii with no string", real_line) - return ret + num_parts if z else ret - - def align2(self): - while self.fn_section_sizes[self.cur_section] % 2 != 0: - self.fn_section_sizes[self.cur_section] += 1 - - def align4(self): - while self.fn_section_sizes[self.cur_section] % 4 != 0: - self.fn_section_sizes[self.cur_section] += 1 - - def add_sized(self, size, line): - if self.cur_section in ['.text', '.late_rodata']: - if size % 4 != 0: - self.fail("size must be a multiple of 4", line) - if size < 0: - self.fail("size cannot be negative", line) - self.fn_section_sizes[self.cur_section] += size - if self.cur_section == '.text': - if not self.text_glabels: - self.fail(".text block without an initial glabel", line) - self.fn_ins_inds.append((self.num_lines - 1, size // 4)) - - def process_line(self, line, output_enc): - self.num_lines += 1 - if line.endswith('\\'): - self.glued_line += line[:-1] - return - line = self.glued_line + line - self.glued_line = '' - - real_line = line - line = re.sub(re_comment_or_string, re_comment_replacer, line) - line = line.strip() - line = re.sub(r'^[a-zA-Z0-9_]+:\s*', '', line) - changed_section = False - emitting_double = False - if line.startswith('glabel ') and self.cur_section == '.text': - self.text_glabels.append(line.split()[1]) - if not line: - pass # empty line - elif line.startswith('glabel ') or line.startswith('dlabel ') or line.startswith('endlabel ') or (' ' not in line and line.endswith(':')): - pass # label - elif line.startswith('.section') or line in ['.text', '.data', '.rdata', '.rodata', '.bss', '.late_rodata']: - # section change - self.cur_section = '.rodata' if line == '.rdata' else line.split(',')[0].split()[-1] - if self.cur_section not in ['.data', '.text', '.rodata', '.late_rodata', '.bss']: - self.fail("unrecognized .section directive", real_line) - changed_section = True - elif line.startswith('.late_rodata_alignment'): - if self.cur_section != '.late_rodata': - self.fail(".late_rodata_alignment must occur within .late_rodata section", real_line) - value = int(line.split()[1]) - if value not in [4, 8]: - self.fail(".late_rodata_alignment argument must be 4 or 8", real_line) - if self.late_rodata_alignment and self.late_rodata_alignment != value: - self.fail(".late_rodata_alignment alignment assumption conflicts with earlier .double directive. Make sure to provide explicit alignment padding.") - self.late_rodata_alignment = value - changed_section = True - elif line.startswith('.incbin'): - self.add_sized(int(line.split(',')[-1].strip(), 0), real_line) - elif line.startswith('.word') or line.startswith('.gpword') or line.startswith('.float'): - self.align4() - self.add_sized(4 * len(line.split(',')), real_line) - elif line.startswith('.double'): - self.align4() - if self.cur_section == '.late_rodata': - align8 = self.fn_section_sizes[self.cur_section] % 8 - # Automatically set late_rodata_alignment, so the generated C code uses doubles. - # This gives us correct alignment for the transferred doubles even when the - # late_rodata_alignment is wrong, e.g. for non-matching compilation. - if not self.late_rodata_alignment: - self.late_rodata_alignment = 8 - align8 - self.late_rodata_alignment_from_content = True - elif self.late_rodata_alignment != 8 - align8: - if self.late_rodata_alignment_from_content: - self.fail("found two .double directives with different start addresses mod 8. Make sure to provide explicit alignment padding.", real_line) - else: - self.fail(".double at address that is not 0 mod 8 (based on .late_rodata_alignment assumption). Make sure to provide explicit alignment padding.", real_line) - self.add_sized(8 * len(line.split(',')), real_line) - emitting_double = True - elif line.startswith('.space'): - self.add_sized(int(line.split()[1], 0), real_line) - elif line.startswith('.balign') or line.startswith('.align'): - align = int(line.split()[1]) - if align != 4: - self.fail("only .balign 4 is supported", real_line) - self.align4() - elif line.startswith('.asci'): - z = (line.startswith('.asciz') or line.startswith('.asciiz')) - self.add_sized(self.count_quoted_size(line, z, real_line, output_enc), real_line) - elif line.startswith('.byte'): - self.add_sized(len(line.split(',')), real_line) - elif line.startswith('.half'): - self.align2() - self.add_sized(2*len(line.split(',')), real_line) - elif line.startswith('.'): - # .macro, ... - self.fail("asm directive not supported", real_line) - else: - # Unfortunately, macros are hard to support for .rodata -- - # we don't know how how space they will expand to before - # running the assembler, but we need that information to - # construct the C code. So if we need that we'll either - # need to run the assembler twice (at least in some rare - # cases), or change how this program is invoked. - # Similarly, we can't currently deal with pseudo-instructions - # that expand to several real instructions. - if self.cur_section != '.text': - self.fail("instruction or macro call in non-.text section? not supported", real_line) - self.add_sized(4, real_line) - if self.cur_section == '.late_rodata': - if not changed_section: - if emitting_double: - self.late_rodata_asm_conts.append(".align 0") - self.late_rodata_asm_conts.append(real_line) - if emitting_double: - self.late_rodata_asm_conts.append(".align 2") - else: - self.asm_conts.append(real_line) - - def finish(self, state): - src = [''] * (self.num_lines + 1) - late_rodata_dummy_bytes = [] - jtbl_rodata_size = 0 - late_rodata_fn_output = [] - - num_instr = self.fn_section_sizes['.text'] // 4 - - if self.fn_section_sizes['.late_rodata'] > 0: - # Generate late rodata by emitting unique float constants. - # This requires 3 instructions for each 4 bytes of rodata. - # If we know alignment, we can use doubles, which give 3 - # instructions for 8 bytes of rodata. - size = self.fn_section_sizes['.late_rodata'] // 4 - skip_next = False - needs_double = (self.late_rodata_alignment != 0) - extra_mips1_nop = False - if state.pascal: - jtbl_size = 9 if state.mips1 else 8 - jtbl_min_rodata_size = 2 - else: - jtbl_size = 11 if state.mips1 else 9 - jtbl_min_rodata_size = 5 - for i in range(size): - if skip_next: - skip_next = False - continue - # Jump tables give 9 instructions (11 with -mips1) for >= 5 words of rodata, - # and should be emitted when: - # - -O2 or -O2 -g3 are used, which give the right codegen - # - we have emitted our first .float/.double (to ensure that we find the - # created rodata in the binary) - # - we have emitted our first .double, if any (to ensure alignment of doubles - # in shifted rodata sections) - # - we have at least 5 words of rodata left to emit (otherwise IDO does not - # generate a jump table) - # - we have at least 10 more instructions to go in this function (otherwise our - # function size computation will be wrong since the delay slot goes unused) - if (not needs_double and state.use_jtbl_for_rodata and i >= 1 and - size - i >= jtbl_min_rodata_size and - num_instr - len(late_rodata_fn_output) >= jtbl_size + 1): - if state.pascal: - cases = " ".join("{}: ;".format(case) for case in range(size - i)) - line = "case 0 of " + cases + " otherwise end;" - else: - cases = " ".join("case {}:".format(case) for case in range(size - i)) - line = "switch (*(volatile int*)0) { " + cases + " ; }" - late_rodata_fn_output.append(line) - late_rodata_fn_output.extend([""] * (jtbl_size - 1)) - jtbl_rodata_size = (size - i) * 4 - extra_mips1_nop = i != 2 - break - dummy_bytes = state.next_late_rodata_hex() - late_rodata_dummy_bytes.append(dummy_bytes) - if self.late_rodata_alignment == 4 * ((i + 1) % 2 + 1) and i + 1 < size: - dummy_bytes2 = state.next_late_rodata_hex() - late_rodata_dummy_bytes.append(dummy_bytes2) - fval, = struct.unpack('>d', dummy_bytes + dummy_bytes2) - if state.pascal: - line = state.pascal_assignment('d', fval) - else: - line = '*(volatile double*)0 = {};'.format(fval) - late_rodata_fn_output.append(line) - skip_next = True - needs_double = False - if state.mips1: - # mips1 does not have ldc1/sdc1 - late_rodata_fn_output.append('') - late_rodata_fn_output.append('') - extra_mips1_nop = False - else: - fval, = struct.unpack('>f', dummy_bytes) - if state.pascal: - line = state.pascal_assignment('f', fval) - else: - line = '*(volatile float*)0 = {}f;'.format(fval) - late_rodata_fn_output.append(line) - extra_mips1_nop = True - late_rodata_fn_output.append('') - late_rodata_fn_output.append('') - if state.mips1 and extra_mips1_nop: - late_rodata_fn_output.append('') - - text_name = None - if self.fn_section_sizes['.text'] > 0 or late_rodata_fn_output: - text_name = state.make_name('func') - src[0] = state.func_prologue(text_name) - src[self.num_lines] = state.func_epilogue() - instr_count = self.fn_section_sizes['.text'] // 4 - if instr_count < state.min_instr_count: - self.fail("too short .text block") - tot_emitted = 0 - tot_skipped = 0 - fn_emitted = 0 - fn_skipped = 0 - skipping = True - rodata_stack = late_rodata_fn_output[::-1] - for (line, count) in self.fn_ins_inds: - for _ in range(count): - if (fn_emitted > MAX_FN_SIZE and instr_count - tot_emitted > state.min_instr_count and - (not rodata_stack or rodata_stack[-1])): - # Don't let functions become too large. When a function reaches 284 - # instructions, and -O2 -framepointer flags are passed, the IRIX - # compiler decides it is a great idea to start optimizing more. - # Also, Pascal cannot handle too large functions before it runs out - # of unique statements to write. - fn_emitted = 0 - fn_skipped = 0 - skipping = True - src[line] += (' ' + state.func_epilogue() + ' ' + - state.func_prologue(state.make_name('large_func')) + ' ') - if ( - skipping and - fn_skipped < state.skip_instr_count + - (state.prelude_if_late_rodata if rodata_stack else 0) - ): - fn_skipped += 1 - tot_skipped += 1 - else: - skipping = False - if rodata_stack: - src[line] += rodata_stack.pop() - elif state.pascal: - src[line] += state.pascal_assignment('i', '0') - else: - src[line] += '*(volatile int*)0 = 0;' - tot_emitted += 1 - fn_emitted += 1 - if rodata_stack: - size = len(late_rodata_fn_output) // 3 - available = instr_count - tot_skipped - self.fail( - "late rodata to text ratio is too high: {} / {} must be <= 1/3\n" - "add .late_rodata_alignment (4|8) to the .late_rodata " - "block to double the allowed ratio." - .format(size, available)) - - rodata_name = None - if self.fn_section_sizes['.rodata'] > 0: - if state.pascal: - self.fail(".rodata isn't supported with Pascal for now") - rodata_name = state.make_name('rodata') - src[self.num_lines] += ' const char {}[{}] = {{1}};'.format(rodata_name, self.fn_section_sizes['.rodata']) - - data_name = None - if self.fn_section_sizes['.data'] > 0: - data_name = state.make_name('data') - if state.pascal: - line = ' var {}: packed array[1..{}] of char := [otherwise: 0];'.format(data_name, self.fn_section_sizes['.data']) - else: - line = ' char {}[{}] = {{1}};'.format(data_name, self.fn_section_sizes['.data']) - src[self.num_lines] += line - - bss_name = None - if self.fn_section_sizes['.bss'] > 0: - if state.pascal: - self.fail(".bss isn't supported with Pascal") - bss_name = state.make_name('bss') - src[self.num_lines] += ' char {}[{}];'.format(bss_name, self.fn_section_sizes['.bss']) - - fn = Function( - text_glabels=self.text_glabels, - asm_conts=self.asm_conts, - late_rodata_dummy_bytes=late_rodata_dummy_bytes, - jtbl_rodata_size=jtbl_rodata_size, - late_rodata_asm_conts=self.late_rodata_asm_conts, - fn_desc=self.fn_desc, - data={ - '.text': (text_name, self.fn_section_sizes['.text']), - '.data': (data_name, self.fn_section_sizes['.data']), - '.rodata': (rodata_name, self.fn_section_sizes['.rodata']), - '.bss': (bss_name, self.fn_section_sizes['.bss']), - }) - return src, fn - -cutscene_data_regexpr = re.compile(r"CutsceneData (.|\n)*\[\] = {") -float_regexpr = re.compile(r"[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?f") - -def repl_float_hex(m): - return str(struct.unpack(">I", struct.pack(">f", float(m.group(0).strip().rstrip("f"))))[0]) - -Opts = namedtuple('Opts', ['opt', 'framepointer', 'mips1', 'kpic', 'pascal', 'input_enc', 'output_enc']) - -def parse_source(f, opts, out_dependencies, print_source=None): - if opts.opt in ['O1', 'O2']: - if opts.framepointer: - min_instr_count = 6 - skip_instr_count = 5 - else: - min_instr_count = 2 - skip_instr_count = 1 - elif opts.opt == 'O0': - if opts.framepointer: - min_instr_count = 8 - skip_instr_count = 8 - else: - min_instr_count = 4 - skip_instr_count = 4 - elif opts.opt == 'g': - if opts.framepointer: - min_instr_count = 7 - skip_instr_count = 7 - else: - min_instr_count = 4 - skip_instr_count = 4 - elif opts.opt == 'g3': - if opts.framepointer: - min_instr_count = 4 - skip_instr_count = 4 - else: - min_instr_count = 2 - skip_instr_count = 2 - else: - raise Failure("must pass one of -g, -O0, -O1, -O2, -O2 -g3") - prelude_if_late_rodata = 0 - if opts.kpic: - # Without optimizations, the PIC prelude always takes up 3 instructions. - # With optimizations, the prelude is optimized out if there's no late rodata. - if opts.opt in ('g3', 'O2'): - prelude_if_late_rodata = 3 - else: - min_instr_count += 3 - skip_instr_count += 3 - - use_jtbl_for_rodata = False - if opts.opt in ['O2', 'g3'] and not opts.framepointer and not opts.kpic: - use_jtbl_for_rodata = True - - state = GlobalState(min_instr_count, skip_instr_count, use_jtbl_for_rodata, prelude_if_late_rodata, opts.mips1, opts.pascal) - output_enc = opts.output_enc - - global_asm = None - asm_functions = [] - output_lines = [ - '#line 1 "' + f.name + '"' - ] - - is_cutscene_data = False - is_early_include = False - - for line_no, raw_line in enumerate(f, 1): - raw_line = raw_line.rstrip() - line = raw_line.lstrip() - - # Print exactly one output line per source line, to make compiler - # errors have correct line numbers. These will be overridden with - # reasonable content further down. - output_lines.append('') - - if global_asm is not None: - if line.startswith(')'): - src, fn = global_asm.finish(state) - for i, line2 in enumerate(src): - output_lines[start_index + i] = line2 - asm_functions.append(fn) - global_asm = None - else: - global_asm.process_line(raw_line, output_enc) - elif line in ['GLOBAL_ASM(', '#pragma GLOBAL_ASM(']: - global_asm = GlobalAsmBlock("GLOBAL_ASM block at line " + str(line_no)) - start_index = len(output_lines) - elif ((line.startswith('GLOBAL_ASM("') or line.startswith('#pragma GLOBAL_ASM("')) - and line.endswith('")')): - fname = line[line.index('(') + 2 : -2] - out_dependencies.append(fname) - global_asm = GlobalAsmBlock(fname) - with open(fname, encoding=opts.input_enc) as f: - for line2 in f: - global_asm.process_line(line2.rstrip(), output_enc) - src, fn = global_asm.finish(state) - output_lines[-1] = ''.join(src) - asm_functions.append(fn) - global_asm = None - elif line == '#pragma asmproc recurse': - # C includes qualified as - # #pragma asmproc recurse - # #include "file.c" - # will be processed recursively when encountered - is_early_include = True - elif is_early_include: - # Previous line was a #pragma asmproc recurse - is_early_include = False - if not line.startswith("#include "): - raise Failure("#pragma asmproc recurse must be followed by an #include ") - fpath = os.path.dirname(f.name) - fname = os.path.join(fpath, line[line.index(' ') + 2 : -1]) - out_dependencies.append(fname) - include_src = StringIO() - with open(fname, encoding=opts.input_enc) as include_file: - parse_source(include_file, opts, out_dependencies, include_src) - include_src.write('#line ' + str(line_no + 1) + ' "' + f.name + '"') - output_lines[-1] = include_src.getvalue() - include_src.close() - else: - # This is a hack to replace all floating-point numbers in an array of a particular type - # (in this case CutsceneData) with their corresponding IEEE-754 hexadecimal representation - if cutscene_data_regexpr.search(line) is not None: - is_cutscene_data = True - elif line.endswith("};"): - is_cutscene_data = False - if is_cutscene_data: - raw_line = re.sub(float_regexpr, repl_float_hex, raw_line) - output_lines[-1] = raw_line - - if print_source: - if isinstance(print_source, StringIO): - for line in output_lines: - print_source.write(line + '\n') - else: - newline_encoded = "\n".encode(output_enc) - for line in output_lines: - try: - line_encoded = line.encode(output_enc) - except UnicodeEncodeError: - print("Failed to encode a line to", output_enc) - print("The line:", line) - print("The line, utf-8-encoded:", line.encode("utf-8")) - raise - print_source.write(line_encoded) - print_source.write(newline_encoded) - print_source.flush() - - return asm_functions - -def fixup_objfile(objfile_name, functions, asm_prelude, assembler, output_enc, drop_mdebug_gptab, convert_statics): - SECTIONS = ['.data', '.text', '.rodata', '.bss'] - - with open(objfile_name, 'rb') as f: - objfile = ElfFile(f.read()) - fmt = objfile.fmt - - prev_locs = { - '.text': 0, - '.data': 0, - '.rodata': 0, - '.bss': 0, - } - to_copy = { - '.text': [], - '.data': [], - '.rodata': [], - '.bss': [], - } - asm = [] - all_late_rodata_dummy_bytes = [] - all_jtbl_rodata_size = [] - late_rodata_asm = [] - late_rodata_source_name_start = None - late_rodata_source_name_end = None - - # Generate an assembly file with all the assembly we need to fill in. For - # simplicity we pad with nops/.space so that addresses match exactly, so we - # don't have to fix up relocations/symbol references. - all_text_glabels = set() - func_sizes = {} - for function in functions: - ifdefed = False - for sectype, (temp_name, size) in function.data.items(): - if temp_name is None: - continue - assert size > 0 - loc = objfile.symtab.find_symbol(temp_name) - if loc is None: - ifdefed = True - break - loc = loc[1] - prev_loc = prev_locs[sectype] - if loc < prev_loc: - # If the dummy C generates too little asm, and we have two - # consecutive GLOBAL_ASM blocks, we detect that error here. - # On the other hand, if it generates too much, we don't have - # a good way of discovering that error: it's indistinguishable - # from a static symbol occurring after the GLOBAL_ASM block. - raise Failure("Wrongly computed size for section {} (diff {}). This is an asm-processor bug!".format(sectype, prev_loc- loc)) - if loc != prev_loc: - asm.append('.section ' + sectype) - if sectype == '.text': - for i in range((loc - prev_loc) // 4): - asm.append('nop') - else: - asm.append('.space {}'.format(loc - prev_loc)) - to_copy[sectype].append((loc, size, temp_name, function.fn_desc)) - if function.text_glabels: - func_sizes[function.text_glabels[0]] = size - prev_locs[sectype] = loc + size - if not ifdefed: - all_text_glabels.update(function.text_glabels) - all_late_rodata_dummy_bytes.append(function.late_rodata_dummy_bytes) - all_jtbl_rodata_size.append(function.jtbl_rodata_size) - late_rodata_asm.append(function.late_rodata_asm_conts) - for sectype, (temp_name, size) in function.data.items(): - if temp_name is not None: - asm.append('.section ' + sectype) - asm.append('glabel ' + temp_name + '_asm_start') - asm.append('.text') - for line in function.asm_conts: - asm.append(line) - for sectype, (temp_name, size) in function.data.items(): - if temp_name is not None: - asm.append('.section ' + sectype) - asm.append('glabel ' + temp_name + '_asm_end') - if any(late_rodata_asm): - late_rodata_source_name_start = '_asmpp_late_rodata_start' - late_rodata_source_name_end = '_asmpp_late_rodata_end' - asm.append('.section .late_rodata') - # Put some padding at the start to avoid conflating symbols with - # references to the whole section. - asm.append('.word 0, 0') - asm.append('glabel {}'.format(late_rodata_source_name_start)) - for conts in late_rodata_asm: - asm.extend(conts) - asm.append('glabel {}'.format(late_rodata_source_name_end)) - - o_file = tempfile.NamedTemporaryFile(prefix='asm-processor', suffix='.o', delete=False) - o_name = o_file.name - o_file.close() - s_file = tempfile.NamedTemporaryFile(prefix='asm-processor', suffix='.s', delete=False) - s_name = s_file.name - try: - s_file.write(asm_prelude + b'\n') - for line in asm: - s_file.write(line.encode(output_enc) + b'\n') - s_file.close() - ret = os.system(assembler + " " + s_name + " -o " + o_name) - if ret != 0: - raise Failure("failed to assemble") - with open(o_name, 'rb') as f: - asm_objfile = ElfFile(f.read()) - - # Remove clutter from objdump output for tests, and make the tests - # portable by avoiding absolute paths. Outside of tests .mdebug is - # useful for showing source together with asm, though. - mdebug_section = objfile.find_section('.mdebug') - if drop_mdebug_gptab: - objfile.drop_mdebug_gptab() - - # Unify reginfo sections - target_reginfo = objfile.find_section('.reginfo') - if target_reginfo is not None: - source_reginfo_data = list(asm_objfile.find_section('.reginfo').data) - data = list(target_reginfo.data) - for i in range(20): - data[i] |= source_reginfo_data[i] - target_reginfo.data = bytes(data) - - # Move over section contents - modified_text_positions = set() - jtbl_rodata_positions = set() - last_rodata_pos = 0 - for sectype in SECTIONS: - if not to_copy[sectype]: - continue - source = asm_objfile.find_section(sectype) - assert source is not None, "didn't find source section: " + sectype - for (pos, count, temp_name, fn_desc) in to_copy[sectype]: - loc1 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_start', source) - loc2 = asm_objfile.symtab.find_symbol_in_section(temp_name + '_asm_end', source) - assert loc1 == pos, "assembly and C files don't line up for section " + sectype + ", " + fn_desc - if loc2 - loc1 != count: - raise Failure("incorrectly computed size for section " + sectype + ", " + fn_desc + ". If using .double, make sure to provide explicit alignment padding.") - if sectype == '.bss': - continue - target = objfile.find_section(sectype) - assert target is not None, "missing target section of type " + sectype - data = list(target.data) - for (pos, count, _, _) in to_copy[sectype]: - data[pos:pos + count] = source.data[pos:pos + count] - if sectype == '.text': - assert count % 4 == 0 - assert pos % 4 == 0 - for i in range(count // 4): - modified_text_positions.add(pos + 4 * i) - elif sectype == '.rodata': - last_rodata_pos = pos + count - target.data = bytes(data) - - # Move over late rodata. This is heuristic, sadly, since I can't think - # of another way of doing it. - moved_late_rodata = {} - if any(all_late_rodata_dummy_bytes) or any(all_jtbl_rodata_size): - source = asm_objfile.find_section('.late_rodata') - target = objfile.find_section('.rodata') - source_pos = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_start, source) - source_end = asm_objfile.symtab.find_symbol_in_section(late_rodata_source_name_end, source) - if source_end - source_pos != sum(map(len, all_late_rodata_dummy_bytes)) * 4 + sum(all_jtbl_rodata_size): - raise Failure("computed wrong size of .late_rodata") - new_data = list(target.data) - for dummy_bytes_list, jtbl_rodata_size in zip(all_late_rodata_dummy_bytes, all_jtbl_rodata_size): - for index, dummy_bytes in enumerate(dummy_bytes_list): - if not fmt.is_big_endian: - dummy_bytes = dummy_bytes[::-1] - pos = target.data.index(dummy_bytes, last_rodata_pos) - # This check is nice, but makes time complexity worse for large files: - if SLOW_CHECKS and target.data.find(dummy_bytes, pos + 4) != -1: - raise Failure("multiple occurrences of late_rodata hex magic. Change asm-processor to use something better than 0xE0123456!") - if index == 0 and len(dummy_bytes_list) > 1 and target.data[pos+4:pos+8] == b'\0\0\0\0': - # Ugly hack to handle double alignment for non-matching builds. - # We were told by .late_rodata_alignment (or deduced from a .double) - # that a function's late_rodata started out 4 (mod 8), and emitted - # a float and then a double. But it was actually 0 (mod 8), so our - # double was moved by 4 bytes. To make them adjacent to keep jump - # tables correct, move the float by 4 bytes as well. - new_data[pos:pos+4] = b'\0\0\0\0' - pos += 4 - new_data[pos:pos+4] = source.data[source_pos:source_pos+4] - moved_late_rodata[source_pos] = pos - last_rodata_pos = pos + 4 - source_pos += 4 - if jtbl_rodata_size > 0: - assert dummy_bytes_list, "should always have dummy bytes before jtbl data" - pos = last_rodata_pos - new_data[pos : pos + jtbl_rodata_size] = \ - source.data[source_pos : source_pos + jtbl_rodata_size] - for i in range(0, jtbl_rodata_size, 4): - moved_late_rodata[source_pos + i] = pos + i - jtbl_rodata_positions.add(pos + i) - last_rodata_pos += jtbl_rodata_size - source_pos += jtbl_rodata_size - target.data = bytes(new_data) - - # Merge strtab data. - strtab_adj = len(objfile.symtab.strtab.data) - objfile.symtab.strtab.data += asm_objfile.symtab.strtab.data - - # Find relocated symbols - relocated_symbols = set() - for sectype in SECTIONS + ['.late_rodata']: - for obj in [asm_objfile, objfile]: - sec = obj.find_section(sectype) - if sec is None: - continue - for reltab in sec.relocated_by: - for rel in reltab.relocations: - relocated_symbols.add(obj.symtab.symbol_entries[rel.sym_index]) - - # Move over symbols, deleting the temporary function labels. - # Skip over new local symbols that aren't relocated against, to - # avoid conflicts. - empty_symbol = objfile.symtab.symbol_entries[0] - new_syms = [s for s in objfile.symtab.symbol_entries[1:] if not is_temp_name(s.name)] - - for i, s in enumerate(asm_objfile.symtab.symbol_entries): - is_local = (i < asm_objfile.symtab.sh_info) - if is_local and s not in relocated_symbols: - continue - if is_temp_name(s.name): - assert s not in relocated_symbols - continue - if s.st_shndx not in [SHN_UNDEF, SHN_ABS]: - section_name = asm_objfile.sections[s.st_shndx].name - target_section_name = section_name - if section_name == ".late_rodata": - target_section_name = ".rodata" - elif section_name not in SECTIONS: - raise Failure("generated assembly .o must only have symbols for .text, .data, .rodata, .late_rodata, ABS and UNDEF, but found " + section_name) - objfile_section = objfile.find_section(target_section_name) - if objfile_section is None: - raise Failure("generated assembly .o has section that real objfile lacks: " + target_section_name) - s.st_shndx = objfile_section.index - # glabel's aren't marked as functions, making objdump output confusing. Fix that. - if s.name in all_text_glabels: - s.type = STT_FUNC - if s.name in func_sizes: - s.st_size = func_sizes[s.name] - if section_name == '.late_rodata': - if s.st_value == 0: - # This must be a symbol corresponding to the whole .late_rodata - # section, being referred to from a relocation. - # Moving local symbols is tricky, because it requires fixing up - # lo16/hi16 relocation references to .late_rodata+. - # Just disallow it for now. - raise Failure("local symbols in .late_rodata are not allowed") - s.st_value = moved_late_rodata[s.st_value] - s.st_name += strtab_adj - new_syms.append(s) - make_statics_global = convert_statics in ("global", "global-with-filename") - - # Add static symbols from .mdebug, so they can be referred to from GLOBAL_ASM - if mdebug_section and convert_statics != "no": - strtab_index = len(objfile.symtab.strtab.data) - new_strtab_data = [] - ifd_max, cb_fd_offset = fmt.unpack('II', mdebug_section.data[18*4 : 20*4]) - cb_sym_offset, = fmt.unpack('I', mdebug_section.data[9*4 : 10*4]) - cb_ss_offset, = fmt.unpack('I', mdebug_section.data[15*4 : 16*4]) - for i in range(ifd_max): - offset = cb_fd_offset + 18*4*i - iss_base, _, isym_base, csym = fmt.unpack('IIII', objfile.data[offset + 2*4 : offset + 6*4]) - for j in range(csym): - offset2 = cb_sym_offset + 12 * (isym_base + j) - iss, value, st_sc_index = fmt.unpack('III', objfile.data[offset2 : offset2 + 12]) - st = (st_sc_index >> 26) - sc = (st_sc_index >> 21) & 0x1f - if st in [MIPS_DEBUG_ST_STATIC, MIPS_DEBUG_ST_STATIC_PROC]: - symbol_name_offset = cb_ss_offset + iss_base + iss - symbol_name_offset_end = objfile.data.find(b'\0', symbol_name_offset) - assert symbol_name_offset_end != -1 - symbol_name = objfile.data[symbol_name_offset : symbol_name_offset_end + 1] - emitted_symbol_name = symbol_name - if convert_statics == "global-with-filename": - # Change the emitted symbol name to include the filename, - # but don't let that affect deduplication logic. - emitted_symbol_name = objfile_name.encode("utf-8") + b":" + symbol_name - section_name = {1: '.text', 2: '.data', 3: '.bss', 15: '.rodata'}[sc] - section = objfile.find_section(section_name) - symtype = STT_FUNC if sc == 1 else STT_OBJECT - binding = STB_GLOBAL if make_statics_global else STB_LOCAL - sym = Symbol.from_parts( - fmt, - st_name=strtab_index, - st_value=value, - st_size=0, - st_info=(binding << 4 | symtype), - st_other=STV_DEFAULT, - st_shndx=section.index, - strtab=objfile.symtab.strtab, - name=symbol_name[:-1].decode('latin1')) - strtab_index += len(emitted_symbol_name) - new_strtab_data.append(emitted_symbol_name) - new_syms.append(sym) - objfile.symtab.strtab.data += b''.join(new_strtab_data) - - # Get rid of duplicate symbols, favoring ones that are not UNDEF. - # Skip this for unnamed local symbols though. - new_syms.sort(key=lambda s: 0 if s.st_shndx != SHN_UNDEF else 1) - old_syms = [] - newer_syms = [] - name_to_sym = {} - for s in new_syms: - if s.name == "_gp_disp": - s.type = STT_OBJECT - if s.bind == STB_LOCAL and s.st_shndx == SHN_UNDEF: - raise Failure("local symbol \"" + s.name + "\" is undefined") - if not s.name: - if s.bind != STB_LOCAL: - raise Failure("global symbol with no name") - newer_syms.append(s) - else: - existing = name_to_sym.get(s.name) - if not existing: - name_to_sym[s.name] = s - newer_syms.append(s) - elif s.st_shndx != SHN_UNDEF: - raise Failure("symbol \"" + s.name + "\" defined twice") - else: - s.replace_by = existing - old_syms.append(s) - new_syms = newer_syms - - # Put local symbols in front, with the initial dummy entry first, and - # _gp_disp at the end if it exists. - new_syms.insert(0, empty_symbol) - new_syms.sort(key=lambda s: (s.bind != STB_LOCAL, s.name == "_gp_disp")) - num_local_syms = sum(1 for s in new_syms if s.bind == STB_LOCAL) - - for i, s in enumerate(new_syms): - s.new_index = i - for s in old_syms: - s.new_index = s.replace_by.new_index - objfile.symtab.data = b''.join(s.to_bin() for s in new_syms) - objfile.symtab.sh_info = num_local_syms - - # Fix up relocation symbol references - for sectype in SECTIONS: - target = objfile.find_section(sectype) - - if target is not None: - # fixup relocation symbol indices, since we butchered them above - for reltab in target.relocated_by: - nrels = [] - for rel in reltab.relocations: - if (sectype == '.text' and rel.r_offset in modified_text_positions or - sectype == '.rodata' and rel.r_offset in jtbl_rodata_positions): - # don't include relocations for late_rodata dummy code - continue - rel.sym_index = objfile.symtab.symbol_entries[rel.sym_index].new_index - nrels.append(rel) - reltab.relocations = nrels - reltab.data = b''.join(rel.to_bin() for rel in nrels) - - # Move over relocations - for sectype in SECTIONS + ['.late_rodata']: - source = asm_objfile.find_section(sectype) - if source is None or not source.data: - continue - - target_sectype = '.rodata' if sectype == '.late_rodata' else sectype - target = objfile.find_section(target_sectype) - assert target is not None, target_sectype - target_reltab = objfile.find_section('.rel' + target_sectype) - target_reltaba = objfile.find_section('.rela' + target_sectype) - for reltab in source.relocated_by: - for rel in reltab.relocations: - rel.sym_index = asm_objfile.symtab.symbol_entries[rel.sym_index].new_index - if sectype == '.late_rodata': - rel.r_offset = moved_late_rodata[rel.r_offset] - new_data = b''.join(rel.to_bin() for rel in reltab.relocations) - if reltab.sh_type == SHT_REL: - if not target_reltab: - target_reltab = objfile.add_section('.rel' + target_sectype, - sh_type=SHT_REL, sh_flags=0, - sh_link=objfile.symtab.index, sh_info=target.index, - sh_addralign=4, sh_entsize=8, data=b'') - target_reltab.data += new_data - else: - if not target_reltaba: - target_reltaba = objfile.add_section('.rela' + target_sectype, - sh_type=SHT_RELA, sh_flags=0, - sh_link=objfile.symtab.index, sh_info=target.index, - sh_addralign=4, sh_entsize=12, data=b'') - target_reltaba.data += new_data - - objfile.write(objfile_name) - finally: - s_file.close() - os.remove(s_name) - try: - os.remove(o_name) - except: - pass - -def run_wrapped(argv, outfile, functions): - parser = argparse.ArgumentParser(description="Pre-process .c files and post-process .o files to enable embedding assembly into C.") - parser.add_argument('filename', help="path to .c code") - parser.add_argument('--post-process', dest='objfile', help="path to .o file to post-process") - parser.add_argument('--assembler', dest='assembler', help="assembler command (e.g. \"mips-linux-gnu-as -march=vr4300 -mabi=32\")") - parser.add_argument('--asm-prelude', dest='asm_prelude', help="path to a file containing a prelude to the assembly file (with .set and .macro directives, e.g.)") - parser.add_argument('--input-enc', default='latin1', help="input encoding (default: %(default)s)") - parser.add_argument('--output-enc', default='latin1', help="output encoding (default: %(default)s)") - parser.add_argument('--drop-mdebug-gptab', dest='drop_mdebug_gptab', action='store_true', help="drop mdebug and gptab sections") - parser.add_argument('--convert-statics', dest='convert_statics', choices=["no", "local", "global", "global-with-filename"], default="local", help="change static symbol visibility (default: %(default)s)") - parser.add_argument('--force', dest='force', action='store_true', help="force processing of files without GLOBAL_ASM blocks") - parser.add_argument('-framepointer', dest='framepointer', action='store_true') - parser.add_argument('-mips1', dest='mips1', action='store_true') - parser.add_argument('-g3', dest='g3', action='store_true') - parser.add_argument('-KPIC', dest='kpic', action='store_true') - group = parser.add_mutually_exclusive_group(required=True) - group.add_argument('-O0', dest='opt', action='store_const', const='O0') - group.add_argument('-O1', dest='opt', action='store_const', const='O1') - group.add_argument('-O2', dest='opt', action='store_const', const='O2') - group.add_argument('-g', dest='opt', action='store_const', const='g') - args = parser.parse_args(argv) - opt = args.opt - pascal = any(args.filename.endswith(ext) for ext in (".p", ".pas", ".pp")) - if args.g3: - if opt != 'O2': - raise Failure("-g3 is only supported together with -O2") - opt = 'g3' - if args.mips1 and (opt not in ('O1', 'O2') or args.framepointer): - raise Failure("-mips1 is only supported together with -O1 or -O2") - if pascal and opt not in ('O1', 'O2', 'g3'): - raise Failure("Pascal is only supported together with -O1, -O2 or -O2 -g3") - opts = Opts(opt, args.framepointer, args.mips1, args.kpic, pascal, args.input_enc, args.output_enc) - - if args.objfile is None: - with open(args.filename, encoding=args.input_enc) as f: - deps = [] - functions = parse_source(f, opts, out_dependencies=deps, print_source=outfile) - return functions, deps - else: - if args.assembler is None: - raise Failure("must pass assembler command") - if functions is None: - with open(args.filename, encoding=args.input_enc) as f: - functions = parse_source(f, opts, out_dependencies=[]) - if not functions and not args.force: - return - asm_prelude = b'' - if args.asm_prelude: - with open(args.asm_prelude, 'rb') as f: - asm_prelude = f.read() - fixup_objfile(args.objfile, functions, asm_prelude, args.assembler, args.output_enc, args.drop_mdebug_gptab, args.convert_statics) - -def run(argv, outfile=sys.stdout.buffer, functions=None): - try: - return run_wrapped(argv, outfile, functions) - except Failure as e: - print("Error:", e, file=sys.stderr) - sys.exit(1) - -if __name__ == "__main__": - run(sys.argv[1:]) diff --git a/tools/asm-processor/build.py b/tools/asm-processor/build.py deleted file mode 100644 index efbaade4..00000000 --- a/tools/asm-processor/build.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -import sys -from pathlib import Path -import shlex -import subprocess -import tempfile -import uuid -import asm_processor - -# Boolean for debugging purposes -# Preprocessed files are temporary, set to True to keep a copy -keep_preprocessed_files = False - -dir_path = Path(__file__).resolve().parent -asm_prelude_path = dir_path / "prelude.inc" - -all_args = sys.argv[1:] -sep0 = next(index for index, arg in enumerate(all_args) if not arg.startswith("-")) -sep1 = all_args.index("--") -sep2 = all_args.index("--", sep1 + 1) - -asmproc_flags = all_args[:sep0] -compiler = all_args[sep0:sep1] - -assembler_args = all_args[sep1 + 1 : sep2] -assembler_sh = " ".join(shlex.quote(x) for x in assembler_args) - - -compile_args = all_args[sep2 + 1 :] - -in_file = Path(compile_args[-1]) -del compile_args[-1] - -out_ind = compile_args.index("-o") -out_file = Path(compile_args[out_ind + 1]) -del compile_args[out_ind + 1] -del compile_args[out_ind] - - -in_dir = in_file.resolve().parent -opt_flags = [ - x for x in compile_args if x in {"-g3", "-g", "-O0", "-O1", "-O2", "-framepointer", "-KPIC"} -] -if "-mips2" not in compile_args: - opt_flags.append("-mips1") - -asmproc_flags += opt_flags + [str(in_file)] - -# Drop .mdebug and .gptab sections from resulting binaries. This makes -# resulting .o files much smaller and speeds up builds, but loses line -# number debug data. -# asmproc_flags += ["--drop-mdebug-gptab"] - -# Convert encoding before compiling. -# asmproc_flags += ["--input-enc", "utf-8", "--output-enc", "euc-jp"] - -with tempfile.TemporaryDirectory(prefix="asm_processor") as tmpdirname: - tmpdir_path = Path(tmpdirname) - preprocessed_filename = "preprocessed_" + uuid.uuid4().hex + in_file.suffix - preprocessed_path = tmpdir_path / preprocessed_filename - - with preprocessed_path.open("wb") as f: - functions, deps = asm_processor.run(asmproc_flags, outfile=f) - - if keep_preprocessed_files: - import shutil - - keep_output_dir = Path("./asm_processor_preprocessed") - keep_output_dir.mkdir(parents=True, exist_ok=True) - - shutil.copy( - preprocessed_path, - keep_output_dir / (in_file.stem + "_" + preprocessed_filename), - ) - - compile_cmdline = ( - compiler - + compile_args - + ["-I", str(in_dir), "-o", str(out_file), str(preprocessed_path)] - ) - - try: - subprocess.check_call(compile_cmdline) - except subprocess.CalledProcessError as e: - print("Failed to compile file " + str(in_file) + ". Command line:") - print() - print(" ".join(shlex.quote(x) for x in compile_cmdline)) - print() - sys.exit(55) - - asm_processor.run( - asmproc_flags - + [ - "--post-process", - str(out_file), - "--assembler", - assembler_sh, - "--asm-prelude", - str(asm_prelude_path), - ], - functions=functions, - ) - - deps_file = out_file.with_suffix(".asmproc.d") - if deps: - with deps_file.open("w") as f: - f.write(str(out_file) + ": " + " \\\n ".join(deps) + "\n") - for dep in deps: - f.write("\n" + dep + ":\n") - else: - try: - deps_file.unlink() - except OSError: - pass diff --git a/tools/asm-processor/compile-test.sh b/tools/asm-processor/compile-test.sh deleted file mode 100644 index 65516629..00000000 --- a/tools/asm-processor/compile-test.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -set -o pipefail -INPUT="$1" -OUTPUT="${INPUT%.*}.o" - -rm -f "$OUTPUT" - -CC="$MIPS_CC" # ido 7.1 via recomp or qemu-irix -AS="mips-linux-gnu-as" -ASFLAGS="-march=vr4300 -mabi=32" -OPTFLAGS=$(grep 'COMPILE-FLAGS: ' $INPUT | sed 's#^.*COMPILE-FLAGS: ##' | sed 's#}$##') -ASMPFLAGS=$(grep 'ASMP-FLAGS: ' $INPUT | sed 's#^.*ASMP-FLAGS: ##' | sed 's#}$##') -ISET=$(grep 'COMPILE-ISET: ' $INPUT | sed 's#^.*COMPILE-ISET: ##' | sed 's#}$##') -if [[ -z "$OPTFLAGS" ]]; then - OPTFLAGS="-g" -fi -CFLAGS="-Wab,-r4300_mul -G 0 -Xcpluscomm -fullwarn -wlint -woff 819,820,852,821 -signed -c" -if [[ -z "$ISET" ]]; then - CFLAGS="$CFLAGS -mips2" -fi -if [[ "$OPTFLAGS" != *-KPIC* ]]; then - CFLAGS="$CFLAGS -non_shared" -fi - -set -e -python3 build.py --drop-mdebug-gptab $ASMPFLAGS $CC -- $AS $ASFLAGS -- $CFLAGS $OPTFLAGS $ISET -o "$OUTPUT" "$INPUT" diff --git a/tools/asm-processor/prelude.inc b/tools/asm-processor/prelude.inc deleted file mode 100644 index 3e58ff14..00000000 --- a/tools/asm-processor/prelude.inc +++ /dev/null @@ -1,43 +0,0 @@ -.set noat -.set noreorder -.set gp=64 -.macro glabel label - .global \label - \label: -.endm - - -# Float register aliases (o32 ABI, odd ones are rarely used) - -.set $fv0, $f0 -.set $fv0f, $f1 -.set $fv1, $f2 -.set $fv1f, $f3 -.set $ft0, $f4 -.set $ft0f, $f5 -.set $ft1, $f6 -.set $ft1f, $f7 -.set $ft2, $f8 -.set $ft2f, $f9 -.set $ft3, $f10 -.set $ft3f, $f11 -.set $fa0, $f12 -.set $fa0f, $f13 -.set $fa1, $f14 -.set $fa1f, $f15 -.set $ft4, $f16 -.set $ft4f, $f17 -.set $ft5, $f18 -.set $ft5f, $f19 -.set $fs0, $f20 -.set $fs0f, $f21 -.set $fs1, $f22 -.set $fs1f, $f23 -.set $fs2, $f24 -.set $fs2f, $f25 -.set $fs3, $f26 -.set $fs3f, $f27 -.set $fs4, $f28 -.set $fs4f, $f29 -.set $fs5, $f30 -.set $fs5f, $f31 diff --git a/tools/asm-processor/run-tests.sh b/tools/asm-processor/run-tests.sh deleted file mode 100644 index 5cae0a74..00000000 --- a/tools/asm-processor/run-tests.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -for A in tests/*.c tests/*.p; do - OBJDUMPFLAGS=-srt - echo $A - ./compile-test.sh "$A" && mips-linux-gnu-objdump $OBJDUMPFLAGS "${A%.*}.o" | diff - "${A%.*}.objdump" || echo FAIL "$A" -done diff --git a/tools/asm-processor/tests/ascii.c b/tools/asm-processor/tests/ascii.c deleted file mode 100644 index bb27d252..00000000 --- a/tools/asm-processor/tests/ascii.c +++ /dev/null @@ -1,19 +0,0 @@ -void foo(void) { "abcdef"; } - -GLOBAL_ASM( -.rdata - .ascii "AB" - .ascii "CD", "EF" - .ascii "GH\n\n\n\0\11\222\3333\44444\x1234567\n\nIJK" -) - -void bar(void) { "hello"; } - -GLOBAL_ASM( -.rdata - .asciiz "12" - .asciiz "34", "56" - .asciiz "78\n\n\n\0\11\222\3333\44444\x1234567\n\n9A" -) - -void baz(void) { "ghijkl"; } diff --git a/tools/asm-processor/tests/ascii.objdump b/tools/asm-processor/tests/ascii.objdump deleted file mode 100644 index bf42638a..00000000 --- a/tools/asm-processor/tests/ascii.objdump +++ /dev/null @@ -1,29 +0,0 @@ - -tests/ascii.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000030 .text -00000000 l d .rodata 00000050 .rodata -00000000 g F .text 00000010 foo -00000010 g F .text 00000010 bar -00000020 g F .text 00000010 baz - - -Contents of section .text: - 0000 03e00008 00000000 03e00008 00000000 ................ - 0010 03e00008 00000000 03e00008 00000000 ................ - 0020 03e00008 00000000 03e00008 00000000 ................ -Contents of section .rodata: - 0000 61626364 65660000 41424344 45464748 abcdef..ABCDEFGH - 0010 0a0a0a00 0992db33 24343467 0a0a494a .......3$44g..IJ - 0020 4b000000 68656c6c 6f000000 31320033 K...hello...12.3 - 0030 34003536 0037380a 0a0a0009 92db3324 4.56.78.......3$ - 0040 3434670a 0a394100 6768696a 6b6c0000 44g..9A.ghijkl.. -Contents of section .options: - 0000 01200000 00000000 80000000 00000000 . .............. - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000000 00000000 00000000 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/comments.c b/tools/asm-processor/tests/comments.c deleted file mode 100644 index 4c936699..00000000 --- a/tools/asm-processor/tests/comments.c +++ /dev/null @@ -1,6 +0,0 @@ -const char before[] = "^"; -GLOBAL_ASM( -.rdata -.asciz "aaaa /* bbbb */ # cccc", /**//**//**//**/ /*/ "xxxx" /*/ /* dddd " eeee */ "# ffff" # gggg "hhhh" /* iiii */ -) -const char after[] = "$"; diff --git a/tools/asm-processor/tests/comments.objdump b/tools/asm-processor/tests/comments.objdump deleted file mode 100644 index 246df209..00000000 --- a/tools/asm-processor/tests/comments.objdump +++ /dev/null @@ -1,21 +0,0 @@ - -tests/comments.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .rodata 00000030 .rodata -00000000 g O .rodata 00000002 before -00000024 g O .rodata 00000002 after - - -Contents of section .rodata: - 0000 5e000000 61616161 202f2a20 62626262 ^...aaaa /* bbbb - 0010 202a2f20 23206363 63630023 20666666 */ # cccc.# fff - 0020 66000000 24000000 00000000 00000000 f...$........... -Contents of section .options: - 0000 01200000 00000000 00000000 00000000 . .............. - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/force.c b/tools/asm-processor/tests/force.c deleted file mode 100644 index 03b630c1..00000000 --- a/tools/asm-processor/tests/force.c +++ /dev/null @@ -1,17 +0,0 @@ -// COMPILE-FLAGS: -O2 -// ASMP-FLAGS: --convert-statics=global-with-filename --force -static int xtext(int a, int b, int c); -const int rodata1[] = {1}; -static const int rodata2[] = {2}; -int data1[] = {3}; -static int data2[] = {4}; -int bss1; -static int bss2; - -static int xtext(int a, int b, int c) { - return 1; -} - -void baz(void) { - xtext(bss2, rodata2[0], data2[0]); -} diff --git a/tools/asm-processor/tests/force.objdump b/tools/asm-processor/tests/force.objdump deleted file mode 100644 index 7ef70247..00000000 --- a/tools/asm-processor/tests/force.objdump +++ /dev/null @@ -1,47 +0,0 @@ - -tests/force.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000050 .text -00000000 l d .rodata 00000010 .rodata -00000000 l d .data 00000010 .data -00000000 l d .bss 00000010 .bss -00000000 g O .rodata 00000004 rodata1 -00000000 g O .data 00000004 data1 -00000000 g O .bss 00000004 bss1 -00000014 g F .text 00000034 baz -00000004 g O .rodata 00000000 tests/force.o:rodata2 -00000004 g O .data 00000000 tests/force.o:data2 -00000004 g O .bss 00000000 tests/force.o:bss2 -00000000 g F .text 00000000 tests/force.o:xtext - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -0000001c R_MIPS_HI16 .bss -00000034 R_MIPS_LO16 .bss -00000020 R_MIPS_HI16 .rodata -0000002c R_MIPS_LO16 .rodata -00000024 R_MIPS_HI16 .data -00000028 R_MIPS_LO16 .data -00000030 R_MIPS_26 .text - - -Contents of section .text: - 0000 afa40000 afa50004 afa60008 03e00008 ................ - 0010 24020001 27bdffe8 afbf0014 3c040000 $...'.......<... - 0020 3c050000 3c060000 8cc60004 8ca50004 <...<........... - 0030 0c000000 8c840004 8fbf0014 27bd0018 ............'... - 0040 03e00008 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 00000001 00000002 00000000 00000000 ................ -Contents of section .data: - 0000 00000003 00000004 00000000 00000000 ................ -Contents of section .options: - 0000 01200000 00000000 a0000074 00000000 . .........t.... - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a0000074 00000000 00000000 00000000 ...t............ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/kpic-o1.c b/tools/asm-processor/tests/kpic-o1.c deleted file mode 100644 index 4d3346d2..00000000 --- a/tools/asm-processor/tests/kpic-o1.c +++ /dev/null @@ -1,93 +0,0 @@ -// COMPILE-FLAGS: -O1 -KPIC -GLOBAL_ASM( -glabel foo -addiu $a0, $a0, 1 -addiu $a0, $a0, 2 -addiu $a0, $a0, 3 -addiu $a0, $a0, 4 -addiu $a0, $a0, 5 -addiu $a0, $a0, 6 -addiu $a0, $a0, 7 -addiu $a0, $a0, 8 -addiu $a0, $a0, 9 -addiu $a0, $a0, 10 -addiu $a0, $a0, 11 -addiu $a0, $a0, 12 -) -GLOBAL_ASM( -.late_rodata -.float 1 -.text -glabel float_fn -addiu $a0, $a0, 13 -addiu $a0, $a0, 14 -addiu $a0, $a0, 15 -addiu $a0, $a0, 16 -addiu $a0, $a0, 17 -addiu $a0, $a0, 18 -addiu $a0, $a0, 19 -addiu $a0, $a0, 20 -addiu $a0, $a0, 21 -addiu $a0, $a0, 22 -addiu $a0, $a0, 23 -addiu $a0, $a0, 24 -addiu $a0, $a0, 25 -addiu $a0, $a0, 26 -addiu $a0, $a0, 27 -addiu $a0, $a0, 28 -addiu $a0, $a0, 29 -addiu $a0, $a0, 30 -) -GLOBAL_ASM( -.late_rodata -.late_rodata_alignment 4 -.float 2 -.double 1 -.double 2 -.double 3 -.double 4 -.double 5 -.double 6 -.double 7 -.double 8 -.text -glabel doubles -addiu $a0, $a0, 31 -addiu $a0, $a0, 32 -addiu $a0, $a0, 33 -addiu $a0, $a0, 34 -addiu $a0, $a0, 35 -addiu $a0, $a0, 36 -addiu $a0, $a0, 37 -addiu $a0, $a0, 38 -addiu $a0, $a0, 39 -addiu $a0, $a0, 40 -addiu $a0, $a0, 41 -addiu $a0, $a0, 42 -addiu $a0, $a0, 43 -addiu $a0, $a0, 44 -addiu $a0, $a0, 45 -addiu $a0, $a0, 46 -addiu $a0, $a0, 47 -addiu $a0, $a0, 48 -addiu $a0, $a0, 49 -addiu $a0, $a0, 50 -addiu $a0, $a0, 51 -addiu $a0, $a0, 52 -addiu $a0, $a0, 53 -addiu $a0, $a0, 54 -addiu $a0, $a0, 55 -addiu $a0, $a0, 56 -addiu $a0, $a0, 57 -addiu $a0, $a0, 58 -addiu $a0, $a0, 59 -addiu $a0, $a0, 60 -addiu $a0, $a0, 61 -addiu $a0, $a0, 62 -addiu $a0, $a0, 63 -addiu $a0, $a0, 64 -addiu $a0, $a0, 65 -addiu $a0, $a0, 66 -addiu $a0, $a0, 67 -addiu $a0, $a0, 68 -) diff --git a/tools/asm-processor/tests/kpic-o1.objdump b/tools/asm-processor/tests/kpic-o1.objdump deleted file mode 100644 index 6e336753..00000000 --- a/tools/asm-processor/tests/kpic-o1.objdump +++ /dev/null @@ -1,46 +0,0 @@ - -tests/kpic-o1.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000110 .text -00000000 l d .rodata 00000050 .rodata -00000000 g F .text 00000030 foo -00000030 g F .text 00000048 float_fn -00000078 g F .text 00000098 doubles -00000000 O *UND* 00000000 _gp_disp - - -RELOCATION RECORDS FOR [.text]: (none) - -Contents of section .text: - 0000 24840001 24840002 24840003 24840004 $...$...$...$... - 0010 24840005 24840006 24840007 24840008 $...$...$...$... - 0020 24840009 2484000a 2484000b 2484000c $...$...$...$... - 0030 2484000d 2484000e 2484000f 24840010 $...$...$...$... - 0040 24840011 24840012 24840013 24840014 $...$...$...$... - 0050 24840015 24840016 24840017 24840018 $...$...$...$... - 0060 24840019 2484001a 2484001b 2484001c $...$...$...$... - 0070 2484001d 2484001e 2484001f 24840020 $...$...$...$.. - 0080 24840021 24840022 24840023 24840024 $..!$.."$..#$..$ - 0090 24840025 24840026 24840027 24840028 $..%$..&$..'$..( - 00a0 24840029 2484002a 2484002b 2484002c $..)$..*$..+$.., - 00b0 2484002d 2484002e 2484002f 24840030 $..-$...$../$..0 - 00c0 24840031 24840032 24840033 24840034 $..1$..2$..3$..4 - 00d0 24840035 24840036 24840037 24840038 $..5$..6$..7$..8 - 00e0 24840039 2484003a 2484003b 2484003c $..9$..:$..;$..< - 00f0 2484003d 2484003e 2484003f 24840040 $..=$..>$..?$..@ - 0100 24840041 24840042 24840043 24840044 $..A$..B$..C$..D -Contents of section .rodata: - 0000 3f800000 40000000 3ff00000 00000000 ?...@...?....... - 0010 40000000 00000000 40080000 00000000 @.......@....... - 0020 40100000 00000000 40140000 00000000 @.......@....... - 0030 40180000 00000000 401c0000 00000000 @.......@....... - 0040 40200000 00000000 00000000 00000000 @ .............. -Contents of section .options: - 0000 01200000 00000000 92000002 00000000 . .............. - 0010 000f0ff0 00000000 00000000 00000000 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 92000012 00000000 000f0ff0 00000000 ................ - 0010 00000000 00000000 ........ diff --git a/tools/asm-processor/tests/kpic-o2.c b/tools/asm-processor/tests/kpic-o2.c deleted file mode 100644 index f037341c..00000000 --- a/tools/asm-processor/tests/kpic-o2.c +++ /dev/null @@ -1,92 +0,0 @@ -// COMPILE-FLAGS: -O2 -KPIC -GLOBAL_ASM( -glabel foo -addiu $a0, $a0, 1 -addiu $a0, $a0, 2 -addiu $a0, $a0, 3 -addiu $a0, $a0, 4 -addiu $a0, $a0, 5 -addiu $a0, $a0, 6 -addiu $a0, $a0, 7 -addiu $a0, $a0, 8 -addiu $a0, $a0, 9 -addiu $a0, $a0, 10 -addiu $a0, $a0, 11 -addiu $a0, $a0, 12 -) -GLOBAL_ASM( -.late_rodata -.float 1 -.text -glabel float_fn -addiu $a0, $a0, 13 -addiu $a0, $a0, 14 -addiu $a0, $a0, 15 -addiu $a0, $a0, 16 -addiu $a0, $a0, 17 -addiu $a0, $a0, 18 -addiu $a0, $a0, 19 -addiu $a0, $a0, 20 -addiu $a0, $a0, 21 -addiu $a0, $a0, 22 -addiu $a0, $a0, 23 -addiu $a0, $a0, 24 -addiu $a0, $a0, 25 -addiu $a0, $a0, 26 -addiu $a0, $a0, 27 -addiu $a0, $a0, 28 -addiu $a0, $a0, 29 -addiu $a0, $a0, 30 -) -GLOBAL_ASM( -.late_rodata -.float 2 -.double 1 -.double 2 -.double 3 -.double 4 -.double 5 -.double 6 -.double 7 -.double 8 -.text -glabel doubles -addiu $a0, $a0, 31 -addiu $a0, $a0, 32 -addiu $a0, $a0, 33 -addiu $a0, $a0, 34 -addiu $a0, $a0, 35 -addiu $a0, $a0, 36 -addiu $a0, $a0, 37 -addiu $a0, $a0, 38 -addiu $a0, $a0, 39 -addiu $a0, $a0, 40 -addiu $a0, $a0, 41 -addiu $a0, $a0, 42 -addiu $a0, $a0, 43 -addiu $a0, $a0, 44 -addiu $a0, $a0, 45 -addiu $a0, $a0, 46 -addiu $a0, $a0, 47 -addiu $a0, $a0, 48 -addiu $a0, $a0, 49 -addiu $a0, $a0, 50 -addiu $a0, $a0, 51 -addiu $a0, $a0, 52 -addiu $a0, $a0, 53 -addiu $a0, $a0, 54 -addiu $a0, $a0, 55 -addiu $a0, $a0, 56 -addiu $a0, $a0, 57 -addiu $a0, $a0, 58 -addiu $a0, $a0, 59 -addiu $a0, $a0, 60 -addiu $a0, $a0, 61 -addiu $a0, $a0, 62 -addiu $a0, $a0, 63 -addiu $a0, $a0, 64 -addiu $a0, $a0, 65 -addiu $a0, $a0, 66 -addiu $a0, $a0, 67 -addiu $a0, $a0, 68 -) diff --git a/tools/asm-processor/tests/kpic-o2.objdump b/tools/asm-processor/tests/kpic-o2.objdump deleted file mode 100644 index abf87aeb..00000000 --- a/tools/asm-processor/tests/kpic-o2.objdump +++ /dev/null @@ -1,46 +0,0 @@ - -tests/kpic-o2.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000110 .text -00000000 l d .rodata 00000050 .rodata -00000000 g F .text 00000030 foo -00000030 g F .text 00000048 float_fn -00000078 g F .text 00000098 doubles -00000000 O *UND* 00000000 _gp_disp - - -RELOCATION RECORDS FOR [.text]: (none) - -Contents of section .text: - 0000 24840001 24840002 24840003 24840004 $...$...$...$... - 0010 24840005 24840006 24840007 24840008 $...$...$...$... - 0020 24840009 2484000a 2484000b 2484000c $...$...$...$... - 0030 2484000d 2484000e 2484000f 24840010 $...$...$...$... - 0040 24840011 24840012 24840013 24840014 $...$...$...$... - 0050 24840015 24840016 24840017 24840018 $...$...$...$... - 0060 24840019 2484001a 2484001b 2484001c $...$...$...$... - 0070 2484001d 2484001e 2484001f 24840020 $...$...$...$.. - 0080 24840021 24840022 24840023 24840024 $..!$.."$..#$..$ - 0090 24840025 24840026 24840027 24840028 $..%$..&$..'$..( - 00a0 24840029 2484002a 2484002b 2484002c $..)$..*$..+$.., - 00b0 2484002d 2484002e 2484002f 24840030 $..-$...$../$..0 - 00c0 24840031 24840032 24840033 24840034 $..1$..2$..3$..4 - 00d0 24840035 24840036 24840037 24840038 $..5$..6$..7$..8 - 00e0 24840039 2484003a 2484003b 2484003c $..9$..:$..;$..< - 00f0 2484003d 2484003e 2484003f 24840040 $..=$..>$..?$..@ - 0100 24840041 24840042 24840043 24840044 $..A$..B$..C$..D -Contents of section .rodata: - 0000 3f800000 40000000 3ff00000 00000000 ?...@...?....... - 0010 40000000 00000000 40080000 00000000 @.......@....... - 0020 40100000 00000000 40140000 00000000 @.......@....... - 0030 40180000 00000000 401c0000 00000000 @.......@....... - 0040 40200000 00000000 00000000 00000000 @ .............. -Contents of section .options: - 0000 01200000 00000000 92000002 00000000 . .............. - 0010 000f0ff0 00000000 00000000 00000000 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 92000012 00000000 000f0ff0 00000000 ................ - 0010 00000000 00000000 ........ diff --git a/tools/asm-processor/tests/label-sameline.c b/tools/asm-processor/tests/label-sameline.c deleted file mode 100644 index a35b43d8..00000000 --- a/tools/asm-processor/tests/label-sameline.c +++ /dev/null @@ -1,7 +0,0 @@ -GLOBAL_ASM( -.rdata -.word 0x12345678 -glabel blah -.word blah2 - /*a*/ blah2: /*b*/ .word blah /*c*/ -) diff --git a/tools/asm-processor/tests/label-sameline.objdump b/tools/asm-processor/tests/label-sameline.objdump deleted file mode 100644 index 1f1aacff..00000000 --- a/tools/asm-processor/tests/label-sameline.objdump +++ /dev/null @@ -1,25 +0,0 @@ - -tests/label-sameline.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .rodata 00000010 .rodata -00000000 l d .rodata 00000000 -00000004 g .rodata 00000000 blah - - -RELOCATION RECORDS FOR [.rodata]: -OFFSET TYPE VALUE -00000004 R_MIPS_32 -00000008 R_MIPS_32 blah - - -Contents of section .rodata: - 0000 12345678 00000008 00000000 00000000 .4Vx............ -Contents of section .options: - 0000 01200000 00000000 00000000 00000000 . .............. - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/large.c b/tools/asm-processor/tests/large.c deleted file mode 100644 index 4ffb4ac1..00000000 --- a/tools/asm-processor/tests/large.c +++ /dev/null @@ -1,164 +0,0 @@ - -GLOBAL_ASM( -glabel test - -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 -addiu $sp, $sp, -24 - sw $zero, 4($sp) -lw $t6, 4($sp) -addu $t7, $a0, $t6 -sb $zero, ($t7) -lw $t8, 4($sp) -addiu $t9, $t8, 1 -slt $at, $t9, $a1 - sw $t9, 4($sp) - nop -jr $ra - addiu $sp, $sp, 24 - -) - -void foo(void) {} diff --git a/tools/asm-processor/tests/large.objdump b/tools/asm-processor/tests/large.objdump deleted file mode 100644 index 17409a7a..00000000 --- a/tools/asm-processor/tests/large.objdump +++ /dev/null @@ -1,58 +0,0 @@ - -tests/large.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000280 .text -00000270 g F .text 00000010 foo -00000000 g F .text 00000270 test - - -Contents of section .text: - 0000 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0010 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0020 afb90004 00000000 03e00008 27bd0018 ............'... - 0030 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0040 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0050 afb90004 00000000 03e00008 27bd0018 ............'... - 0060 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0070 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0080 afb90004 00000000 03e00008 27bd0018 ............'... - 0090 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 00a0 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 00b0 afb90004 00000000 03e00008 27bd0018 ............'... - 00c0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 00d0 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 00e0 afb90004 00000000 03e00008 27bd0018 ............'... - 00f0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0100 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0110 afb90004 00000000 03e00008 27bd0018 ............'... - 0120 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0130 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0140 afb90004 00000000 03e00008 27bd0018 ............'... - 0150 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0160 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0170 afb90004 00000000 03e00008 27bd0018 ............'... - 0180 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0190 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 01a0 afb90004 00000000 03e00008 27bd0018 ............'... - 01b0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 01c0 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 01d0 afb90004 00000000 03e00008 27bd0018 ............'... - 01e0 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 01f0 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0200 afb90004 00000000 03e00008 27bd0018 ............'... - 0210 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0220 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0230 afb90004 00000000 03e00008 27bd0018 ............'... - 0240 27bdffe8 afa00004 8fae0004 008e7821 '.............x! - 0250 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0260 afb90004 00000000 03e00008 27bd0018 ............'... - 0270 03e00008 00000000 03e00008 00000000 ................ -Contents of section .options: - 0000 01200000 00000000 80000000 00000000 . .............. - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a300c032 00000000 00000000 00000000 ...2............ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_align.c b/tools/asm-processor/tests/late_rodata_align.c deleted file mode 100644 index 7367c792..00000000 --- a/tools/asm-processor/tests/late_rodata_align.c +++ /dev/null @@ -1,80 +0,0 @@ -GLOBAL_ASM( -.late_rodata - .float 4.1 - .float 4.2 - .float 4.3 - .float 4.4 -.text -glabel a - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float foo(void) { "foo"; return 1.1f; } - -GLOBAL_ASM( -.late_rodata -.late_rodata_alignment 4 - .float 5.1 - .float 5.2 - .float 5.3 - .float 5.4 -.text -glabel b - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float bar(void) { "bar"; return 1.2f; } - -GLOBAL_ASM( -.late_rodata -.late_rodata_alignment 8 - .float 6.1 - .float 6.2 - .float 6.3 - .float 6.4 - .float 6.5 -.text -glabel c - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - diff --git a/tools/asm-processor/tests/late_rodata_align.objdump b/tools/asm-processor/tests/late_rodata_align.objdump deleted file mode 100644 index 87c05e86..00000000 --- a/tools/asm-processor/tests/late_rodata_align.objdump +++ /dev/null @@ -1,51 +0,0 @@ - -tests/late_rodata_align.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000000f0 .text -00000000 l d .rodata 00000050 .rodata -00000040 g F .text 0000001c foo -00000090 g F .text 0000001c bar -00000000 g F .text 00000040 a -0000005c g F .text 00000034 b -000000ac g F .text 00000038 c - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000040 R_MIPS_HI16 .rodata -00000048 R_MIPS_LO16 .rodata -00000090 R_MIPS_HI16 .rodata -00000098 R_MIPS_LO16 .rodata - - -Contents of section .text: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00000000 00000000 00000000 ................ - 0020 00000000 00000000 00000000 00000000 ................ - 0030 00000000 00000000 00000000 00000000 ................ - 0040 3c010000 03e00008 c4200018 03e00008 <........ ...... - 0050 00000000 03e00008 00000000 00000000 ................ - 0060 00000000 00000000 00000000 00000000 ................ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 3c010000 03e00008 c420002c 03e00008 <........ .,.... - 00a0 00000000 03e00008 00000000 00000000 ................ - 00b0 00000000 00000000 00000000 00000000 ................ - 00c0 00000000 00000000 00000000 00000000 ................ - 00d0 00000000 00000000 00000000 00000000 ................ - 00e0 00000000 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 666f6f00 62617200 40833333 40866666 foo.bar.@.33@.ff - 0010 4089999a 408ccccd 3f8ccccd 40a33333 @...@...?...@.33 - 0020 40a66666 40a9999a 40accccd 3f99999a @.ff@...@...?... - 0030 40c33333 40c66666 40c9999a 40cccccd @.33@.ff@...@... - 0040 40d00000 00000000 00000000 00000000 @............... -Contents of section .options: - 0000 01200000 00000000 80000002 00000000 . .............. - 0010 000005f1 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000002 00000000 000005f1 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_doubles.c b/tools/asm-processor/tests/late_rodata_doubles.c deleted file mode 100644 index 0a27b414..00000000 --- a/tools/asm-processor/tests/late_rodata_doubles.c +++ /dev/null @@ -1,83 +0,0 @@ -GLOBAL_ASM( -.late_rodata - .float 4.1 -.text -glabel a - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float foo(void) { - return 4.15f; -} - -GLOBAL_ASM( -.late_rodata - .float 4.2 - .word 0 - .double 4.3 -.text -glabel b - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float bar(void) { - return 4.4f; -} - -GLOBAL_ASM( -.late_rodata - .float 4.55 - .double 4.6 -.text -glabel c - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float baz(void) { - return 4.6f; -} diff --git a/tools/asm-processor/tests/late_rodata_doubles.objdump b/tools/asm-processor/tests/late_rodata_doubles.objdump deleted file mode 100644 index 84d7e67f..00000000 --- a/tools/asm-processor/tests/late_rodata_doubles.objdump +++ /dev/null @@ -1,55 +0,0 @@ - -tests/late_rodata_doubles.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000120 .text -00000000 l d .rodata 00000030 .rodata -00000040 g F .text 0000001c foo -0000009c g F .text 0000001c bar -000000f8 g F .text 0000001c baz -00000000 g F .text 00000040 a -0000005c g F .text 00000040 b -000000b8 g F .text 00000040 c - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000040 R_MIPS_HI16 .rodata -00000048 R_MIPS_LO16 .rodata -0000009c R_MIPS_HI16 .rodata -000000a4 R_MIPS_LO16 .rodata -000000f8 R_MIPS_HI16 .rodata -00000100 R_MIPS_LO16 .rodata - - -Contents of section .text: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00000000 00000000 00000000 ................ - 0020 00000000 00000000 00000000 00000000 ................ - 0030 00000000 00000000 00000000 00000000 ................ - 0040 3c010000 03e00008 c4200004 03e00008 <........ ...... - 0050 00000000 03e00008 00000000 00000000 ................ - 0060 00000000 00000000 00000000 00000000 ................ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 00000000 00000000 00000000 3c010000 ............<... - 00a0 03e00008 c4200018 03e00008 00000000 ..... .......... - 00b0 03e00008 00000000 00000000 00000000 ................ - 00c0 00000000 00000000 00000000 00000000 ................ - 00d0 00000000 00000000 00000000 00000000 ................ - 00e0 00000000 00000000 00000000 00000000 ................ - 00f0 00000000 00000000 3c010000 03e00008 ........<....... - 0100 c4200028 03e00008 00000000 03e00008 . .(............ - 0110 00000000 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 40833333 4084cccd 40866666 00000000 @.33@...@.ff.... - 0010 40113333 33333333 408ccccd 4091999a @.333333@...@... - 0020 40126666 66666666 40933333 00000000 @.ffffff@.33.... -Contents of section .options: - 0000 01200000 00000000 80000002 00000000 . .............. - 0010 000000f1 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000002 00000000 000000f1 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_doubles_mips1.c b/tools/asm-processor/tests/late_rodata_doubles_mips1.c deleted file mode 100644 index b97261f6..00000000 --- a/tools/asm-processor/tests/late_rodata_doubles_mips1.c +++ /dev/null @@ -1,86 +0,0 @@ -// COMPILE-FLAGS: -O2 -// COMPILE-ISET: -mips1 -// exact copy of late_rodata_doubles.c except for the -mips1 -O2 additions -GLOBAL_ASM( -.late_rodata - .float 4.1 -.text -glabel a - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float foo(void) { - return 4.15f; -} - -GLOBAL_ASM( -.late_rodata - .float 4.2 - .word 0 - .double 4.3 -.text -glabel b - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float bar(void) { - return 4.4f; -} - -GLOBAL_ASM( -.late_rodata - .float 4.55 - .double 4.6 -.text -glabel c - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -float baz(void) { - return 4.6f; -} diff --git a/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump b/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump deleted file mode 100644 index 8fac85f4..00000000 --- a/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump +++ /dev/null @@ -1,52 +0,0 @@ - -tests/late_rodata_doubles_mips1.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000000f0 .text -00000000 l d .rodata 00000030 .rodata -00000040 g F .text 00000010 foo -00000090 g F .text 00000010 bar -000000e0 g F .text 00000010 baz -00000000 g F .text 00000040 a -00000050 g F .text 00000040 b -000000a0 g F .text 00000040 c - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000040 R_MIPS_HI16 .rodata -00000044 R_MIPS_LO16 .rodata -00000090 R_MIPS_HI16 .rodata -00000094 R_MIPS_LO16 .rodata -000000e0 R_MIPS_HI16 .rodata -000000e4 R_MIPS_LO16 .rodata - - -Contents of section .text: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00000000 00000000 00000000 ................ - 0020 00000000 00000000 00000000 00000000 ................ - 0030 00000000 00000000 00000000 00000000 ................ - 0040 3c010000 c4200004 03e00008 00000000 <.... .......... - 0050 00000000 00000000 00000000 00000000 ................ - 0060 00000000 00000000 00000000 00000000 ................ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 3c010000 c4200018 03e00008 00000000 <.... .......... - 00a0 00000000 00000000 00000000 00000000 ................ - 00b0 00000000 00000000 00000000 00000000 ................ - 00c0 00000000 00000000 00000000 00000000 ................ - 00d0 00000000 00000000 00000000 00000000 ................ - 00e0 3c010000 c4200028 03e00008 00000000 <.... .(........ -Contents of section .rodata: - 0000 40833333 4084cccd 40866666 00000000 @.33@...@.ff.... - 0010 40113333 33333333 408ccccd 4091999a @.333333@...@... - 0020 40126666 66666666 40933333 00000000 @.ffffff@.33.... -Contents of section .options: - 0000 01200000 00000000 80000002 00000000 . .............. - 0010 000c0011 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000002 00000000 000c0011 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_jtbl.c b/tools/asm-processor/tests/late_rodata_jtbl.c deleted file mode 100644 index 3c2a5bba..00000000 --- a/tools/asm-processor/tests/late_rodata_jtbl.c +++ /dev/null @@ -1,153 +0,0 @@ -// COMPILE-FLAGS: -O2 -GLOBAL_ASM( -.late_rodata -.double 1 -.double 2 -.double 3 -.double 4 -.double 5 -.double 6 -.double 7 -.double 8 -.text -glabel doubles1 -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -) - -float a(void) { return 1.1f; } - -GLOBAL_ASM( -.late_rodata -.float 1 -.double 2 -.double 3 -.double 4 -.double 5 -.double 6 -.double 7 -.double 8 -.double 9 -.float 10 -.text -glabel doubles2 -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -) - -GLOBAL_ASM( -glabel a2 -move $a0, $a0 -nop -nop -nop -jr $ra -move $a0, $a0 -) - -GLOBAL_ASM( -.late_rodata - -glabel jtbl -.word case0, case1, case2, case3, case4, case5, case6, case7, case8, case9, case10 -.word case11, case12, case13, case14, case15, case16, case17, case18, case19, case20 -.word case21, case22, case23, case24, case25, case26 - -.text -glabel foo -sltiu $at, $a0, 0xa -beqz $at, .L756E659B - sll $t7, $a0, 2 -lui $at, %hi(jtbl) -addu $at, $at, $t7 -lw $t7, %lo(jtbl)($at) -jr $t7 - nop -case0: addiu $a0, $a0, 1 -case1: addiu $a0, $a0, 1 -case2: addiu $a0, $a0, 1 -case3: addiu $a0, $a0, 1 -case4: addiu $a0, $a0, 1 -case5: addiu $a0, $a0, 1 -case6: addiu $a0, $a0, 1 -case7: addiu $a0, $a0, 1 -case8: addiu $a0, $a0, 1 -case9: addiu $a0, $a0, 1 -case10: addiu $a0, $a0, 1 -case11: addiu $a0, $a0, 1 -case12: addiu $a0, $a0, 1 -case13: addiu $a0, $a0, 1 -case14: addiu $a0, $a0, 1 -case15: addiu $a0, $a0, 1 -case16: addiu $a0, $a0, 1 -case17: addiu $a0, $a0, 1 -case18: addiu $a0, $a0, 1 -case19: addiu $a0, $a0, 1 -case20: addiu $a0, $a0, 1 -case21: addiu $a0, $a0, 1 -case22: addiu $a0, $a0, 1 -case23: addiu $a0, $a0, 1 -case24: addiu $a0, $a0, 1 -case25: addiu $a0, $a0, 1 -case26: -jr $ra - addiu $v0, $a0, 1 - -.L756E659B: -addiu $v0, $zero, 2 -jr $ra - nop -) - -GLOBAL_ASM( -glabel b2 -move $a0, $a0 -nop -nop -jr $ra -move $a0, $a0 -) - -float b(void) { return 1.2f; } diff --git a/tools/asm-processor/tests/late_rodata_jtbl.objdump b/tools/asm-processor/tests/late_rodata_jtbl.objdump deleted file mode 100644 index 44bb6e84..00000000 --- a/tools/asm-processor/tests/late_rodata_jtbl.objdump +++ /dev/null @@ -1,110 +0,0 @@ - -tests/late_rodata_jtbl.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000001a0 .text -00000000 l d .rodata 00000100 .rodata -00000000 l d .text 00000000 -0000005c g F .text 0000000c a -0000018c g F .text 0000000c b -00000000 g F .text 0000005c doubles1 -00000068 g F .text 0000005c doubles2 -000000c4 g F .text 00000018 a2 -000000dc g F .text 0000009c foo -0000008c g .rodata 00000000 jtbl -00000178 g F .text 00000014 b2 - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -0000005c R_MIPS_HI16 .rodata -00000064 R_MIPS_LO16 .rodata -0000018c R_MIPS_HI16 .rodata -00000194 R_MIPS_LO16 .rodata -000000e8 R_MIPS_HI16 jtbl -000000f0 R_MIPS_LO16 jtbl - - -RELOCATION RECORDS FOR [.rodata]: -OFFSET TYPE VALUE -0000008c R_MIPS_32 -00000090 R_MIPS_32 -00000094 R_MIPS_32 -00000098 R_MIPS_32 -0000009c R_MIPS_32 -000000a0 R_MIPS_32 -000000a4 R_MIPS_32 -000000a8 R_MIPS_32 -000000ac R_MIPS_32 -000000b0 R_MIPS_32 -000000b4 R_MIPS_32 -000000b8 R_MIPS_32 -000000bc R_MIPS_32 -000000c0 R_MIPS_32 -000000c4 R_MIPS_32 -000000c8 R_MIPS_32 -000000cc R_MIPS_32 -000000d0 R_MIPS_32 -000000d4 R_MIPS_32 -000000d8 R_MIPS_32 -000000dc R_MIPS_32 -000000e0 R_MIPS_32 -000000e4 R_MIPS_32 -000000e8 R_MIPS_32 -000000ec R_MIPS_32 -000000f0 R_MIPS_32 -000000f4 R_MIPS_32 - - -Contents of section .text: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00000000 00000000 00000000 ................ - 0020 00000000 00000000 00000000 00000000 ................ - 0030 00000000 00000000 00000000 00000000 ................ - 0040 00000000 00000000 00000000 00000000 ................ - 0050 00000000 00000000 00000000 3c010000 ............<... - 0060 03e00008 c4200040 00000000 00000000 ..... .@........ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 00000000 00000000 00000000 00000000 ................ - 00a0 00000000 00000000 00000000 00000000 ................ - 00b0 00000000 00000000 00000000 00000000 ................ - 00c0 00000000 00802025 00000000 00000000 ...... %........ - 00d0 00000000 03e00008 00802025 2c81000a .......... %,... - 00e0 10200022 00047880 3c010000 002f0821 . ."..x.<..../.! - 00f0 8c2f0000 01e00008 00000000 24840001 ./..........$... - 0100 24840001 24840001 24840001 24840001 $...$...$...$... - 0110 24840001 24840001 24840001 24840001 $...$...$...$... - 0120 24840001 24840001 24840001 24840001 $...$...$...$... - 0130 24840001 24840001 24840001 24840001 $...$...$...$... - 0140 24840001 24840001 24840001 24840001 $...$...$...$... - 0150 24840001 24840001 24840001 24840001 $...$...$...$... - 0160 24840001 03e00008 24820001 24020002 $.......$...$... - 0170 03e00008 00000000 00802025 00000000 .......... %.... - 0180 00000000 03e00008 00802025 3c010000 .......... %<... - 0190 03e00008 c42000f8 00000000 00000000 ..... .......... -Contents of section .rodata: - 0000 3ff00000 00000000 40000000 00000000 ?.......@....... - 0010 40080000 00000000 40100000 00000000 @.......@....... - 0020 40140000 00000000 40180000 00000000 @.......@....... - 0030 401c0000 00000000 40200000 00000000 @.......@ ...... - 0040 3f8ccccd 3f800000 40000000 00000000 ?...?...@....... - 0050 40080000 00000000 40100000 00000000 @.......@....... - 0060 40140000 00000000 40180000 00000000 @.......@....... - 0070 401c0000 00000000 40200000 00000000 @.......@ ...... - 0080 40220000 00000000 41200000 000000fc @"......A ...... - 0090 00000100 00000104 00000108 0000010c ................ - 00a0 00000110 00000114 00000118 0000011c ................ - 00b0 00000120 00000124 00000128 0000012c ... ...$...(..., - 00c0 00000130 00000134 00000138 0000013c ...0...4...8...< - 00d0 00000140 00000144 00000148 0000014c ...@...D...H...L - 00e0 00000150 00000154 00000158 0000015c ...P...T...X...\ - 00f0 00000160 00000164 3f99999a 00000000 ...`...d?....... -Contents of section .options: - 0000 01200000 00000000 80004002 00000000 . ........@..... - 0010 000000f1 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 8000c016 00000000 000000f1 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_jtbl_mips1.c b/tools/asm-processor/tests/late_rodata_jtbl_mips1.c deleted file mode 100644 index 505f4c1d..00000000 --- a/tools/asm-processor/tests/late_rodata_jtbl_mips1.c +++ /dev/null @@ -1,155 +0,0 @@ -// COMPILE-FLAGS: -O2 -// COMPILE-ISET: -mips1 -// exact copy of late_rodata_jtbl.c except for the -mips1 addition -GLOBAL_ASM( -.late_rodata -.double 1 -.double 2 -.double 3 -.double 4 -.double 5 -.double 6 -.double 7 -.double 8 -.text -glabel doubles1 -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -) - -float a(void) { return 1.1f; } - -GLOBAL_ASM( -.late_rodata -.float 1 -.double 2 -.double 3 -.double 4 -.double 5 -.double 6 -.double 7 -.double 8 -.double 9 -.float 10 -.text -glabel doubles2 -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -) - -GLOBAL_ASM( -glabel a2 -move $a0, $a0 -nop -nop -nop -jr $ra -move $a0, $a0 -) - -GLOBAL_ASM( -.late_rodata - -glabel jtbl -.word case0, case1, case2, case3, case4, case5, case6, case7, case8, case9, case10 -.word case11, case12, case13, case14, case15, case16, case17, case18, case19, case20 -.word case21, case22, case23, case24, case25, case26 - -.text -glabel foo -sltiu $at, $a0, 0xa -beqz $at, .L756E659B - sll $t7, $a0, 2 -lui $at, %hi(jtbl) -addu $at, $at, $t7 -lw $t7, %lo(jtbl)($at) -jr $t7 - nop -case0: addiu $a0, $a0, 1 -case1: addiu $a0, $a0, 1 -case2: addiu $a0, $a0, 1 -case3: addiu $a0, $a0, 1 -case4: addiu $a0, $a0, 1 -case5: addiu $a0, $a0, 1 -case6: addiu $a0, $a0, 1 -case7: addiu $a0, $a0, 1 -case8: addiu $a0, $a0, 1 -case9: addiu $a0, $a0, 1 -case10: addiu $a0, $a0, 1 -case11: addiu $a0, $a0, 1 -case12: addiu $a0, $a0, 1 -case13: addiu $a0, $a0, 1 -case14: addiu $a0, $a0, 1 -case15: addiu $a0, $a0, 1 -case16: addiu $a0, $a0, 1 -case17: addiu $a0, $a0, 1 -case18: addiu $a0, $a0, 1 -case19: addiu $a0, $a0, 1 -case20: addiu $a0, $a0, 1 -case21: addiu $a0, $a0, 1 -case22: addiu $a0, $a0, 1 -case23: addiu $a0, $a0, 1 -case24: addiu $a0, $a0, 1 -case25: addiu $a0, $a0, 1 -case26: -jr $ra - addiu $v0, $a0, 1 - -.L756E659B: -addiu $v0, $zero, 2 -jr $ra - nop -) - -GLOBAL_ASM( -glabel b2 -move $a0, $a0 -nop -nop -jr $ra -move $a0, $a0 -) - -float b(void) { return 1.2f; } diff --git a/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump b/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump deleted file mode 100644 index d37c8bb9..00000000 --- a/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump +++ /dev/null @@ -1,110 +0,0 @@ - -tests/late_rodata_jtbl_mips1.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000001a0 .text -00000000 l d .rodata 00000100 .rodata -00000000 l d .text 00000000 -0000005c g F .text 00000010 a -00000190 g F .text 00000010 b -00000000 g F .text 0000005c doubles1 -0000006c g F .text 0000005c doubles2 -000000c8 g F .text 00000018 a2 -000000e0 g F .text 0000009c foo -0000008c g .rodata 00000000 jtbl -0000017c g F .text 00000014 b2 - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -0000005c R_MIPS_HI16 .rodata -00000060 R_MIPS_LO16 .rodata -00000190 R_MIPS_HI16 .rodata -00000194 R_MIPS_LO16 .rodata -000000ec R_MIPS_HI16 jtbl -000000f4 R_MIPS_LO16 jtbl - - -RELOCATION RECORDS FOR [.rodata]: -OFFSET TYPE VALUE -0000008c R_MIPS_32 -00000090 R_MIPS_32 -00000094 R_MIPS_32 -00000098 R_MIPS_32 -0000009c R_MIPS_32 -000000a0 R_MIPS_32 -000000a4 R_MIPS_32 -000000a8 R_MIPS_32 -000000ac R_MIPS_32 -000000b0 R_MIPS_32 -000000b4 R_MIPS_32 -000000b8 R_MIPS_32 -000000bc R_MIPS_32 -000000c0 R_MIPS_32 -000000c4 R_MIPS_32 -000000c8 R_MIPS_32 -000000cc R_MIPS_32 -000000d0 R_MIPS_32 -000000d4 R_MIPS_32 -000000d8 R_MIPS_32 -000000dc R_MIPS_32 -000000e0 R_MIPS_32 -000000e4 R_MIPS_32 -000000e8 R_MIPS_32 -000000ec R_MIPS_32 -000000f0 R_MIPS_32 -000000f4 R_MIPS_32 - - -Contents of section .text: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00000000 00000000 00000000 ................ - 0020 00000000 00000000 00000000 00000000 ................ - 0030 00000000 00000000 00000000 00000000 ................ - 0040 00000000 00000000 00000000 00000000 ................ - 0050 00000000 00000000 00000000 3c010000 ............<... - 0060 c4200040 03e00008 00000000 00000000 . .@............ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 00000000 00000000 00000000 00000000 ................ - 00a0 00000000 00000000 00000000 00000000 ................ - 00b0 00000000 00000000 00000000 00000000 ................ - 00c0 00000000 00000000 00802025 00000000 .......... %.... - 00d0 00000000 00000000 03e00008 00802025 .............. % - 00e0 2c81000a 10200022 00047880 3c010000 ,.... ."..x.<... - 00f0 002f0821 8c2f0000 01e00008 00000000 ./.!./.......... - 0100 24840001 24840001 24840001 24840001 $...$...$...$... - 0110 24840001 24840001 24840001 24840001 $...$...$...$... - 0120 24840001 24840001 24840001 24840001 $...$...$...$... - 0130 24840001 24840001 24840001 24840001 $...$...$...$... - 0140 24840001 24840001 24840001 24840001 $...$...$...$... - 0150 24840001 24840001 24840001 24840001 $...$...$...$... - 0160 24840001 24840001 03e00008 24820001 $...$.......$... - 0170 24020002 03e00008 00000000 00802025 $............. % - 0180 00000000 00000000 03e00008 00802025 .............. % - 0190 3c010000 c42000f8 03e00008 00000000 <.... .......... -Contents of section .rodata: - 0000 3ff00000 00000000 40000000 00000000 ?.......@....... - 0010 40080000 00000000 40100000 00000000 @.......@....... - 0020 40140000 00000000 40180000 00000000 @.......@....... - 0030 401c0000 00000000 40200000 00000000 @.......@ ...... - 0040 3f8ccccd 3f800000 40000000 00000000 ?...?...@....... - 0050 40080000 00000000 40100000 00000000 @.......@....... - 0060 40140000 00000000 40180000 00000000 @.......@....... - 0070 401c0000 00000000 40200000 00000000 @.......@ ...... - 0080 40220000 00000000 41200000 00000100 @"......A ...... - 0090 00000104 00000108 0000010c 00000110 ................ - 00a0 00000114 00000118 0000011c 00000120 ............... - 00b0 00000124 00000128 0000012c 00000130 ...$...(...,...0 - 00c0 00000134 00000138 0000013c 00000140 ...4...8...<...@ - 00d0 00000144 00000148 0000014c 00000150 ...D...H...L...P - 00e0 00000154 00000158 0000015c 00000160 ...T...X...\...` - 00f0 00000164 00000168 3f99999a 00000000 ...d...h?....... -Contents of section .options: - 0000 01200000 00000000 80004002 00000000 . ........@..... - 0010 000000f1 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 8000c016 00000000 000000f1 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/late_rodata_misaligned_doubles.c b/tools/asm-processor/tests/late_rodata_misaligned_doubles.c deleted file mode 100644 index a453dbdd..00000000 --- a/tools/asm-processor/tests/late_rodata_misaligned_doubles.c +++ /dev/null @@ -1,77 +0,0 @@ -GLOBAL_ASM( -.late_rodata - .float 4.01 - .word 0 - .double 4.02 -.text -glabel a - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -double foo(void) { return 4.03; } - -GLOBAL_ASM( -.late_rodata - .float 4.04 - .double 4.05 -.text -glabel b - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - -double bar(void) { return 4.06; } -float baz(void) { return 4.07f; } - -GLOBAL_ASM( -.late_rodata - .double 4.08 -.text -glabel c - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -) - diff --git a/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump b/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump deleted file mode 100644 index cdba84de..00000000 --- a/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump +++ /dev/null @@ -1,56 +0,0 @@ - -tests/late_rodata_misaligned_doubles.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000120 .text -00000000 l d .rodata 00000040 .rodata -00000040 g F .text 0000001c foo -0000009c g F .text 0000001c bar -000000b8 g F .text 0000001c baz -00000000 g F .text 00000040 a -0000005c g F .text 00000040 b -000000d4 g F .text 00000040 c - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000040 R_MIPS_HI16 .rodata -00000048 R_MIPS_LO16 .rodata -0000009c R_MIPS_HI16 .rodata -000000a4 R_MIPS_LO16 .rodata -000000b8 R_MIPS_HI16 .rodata -000000c0 R_MIPS_LO16 .rodata - - -Contents of section .text: - 0000 00000000 00000000 00000000 00000000 ................ - 0010 00000000 00000000 00000000 00000000 ................ - 0020 00000000 00000000 00000000 00000000 ................ - 0030 00000000 00000000 00000000 00000000 ................ - 0040 3c010000 03e00008 d4200010 03e00008 <........ ...... - 0050 00000000 03e00008 00000000 00000000 ................ - 0060 00000000 00000000 00000000 00000000 ................ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 00000000 00000000 00000000 3c010000 ............<... - 00a0 03e00008 d4200028 03e00008 00000000 ..... .(........ - 00b0 03e00008 00000000 3c010000 03e00008 ........<....... - 00c0 c4200030 03e00008 00000000 03e00008 . .0............ - 00d0 00000000 00000000 00000000 00000000 ................ - 00e0 00000000 00000000 00000000 00000000 ................ - 00f0 00000000 00000000 00000000 00000000 ................ - 0100 00000000 00000000 00000000 00000000 ................ - 0110 00000000 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 408051ec 00000000 4010147a e147ae14 @.Q.....@..z.G.. - 0010 40101eb8 51eb851f 00000000 408147ae @...Q.......@.G. - 0020 40103333 33333333 40103d70 a3d70a3d @.333333@.=p...= - 0030 40823d71 00000000 401051eb 851eb852 @.=q....@.Q....R -Contents of section .options: - 0000 01200000 00000000 80000002 00000000 . .............. - 0010 000000f3 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000002 00000000 000000f3 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/line-continuation-separate-file.s b/tools/asm-processor/tests/line-continuation-separate-file.s deleted file mode 100644 index e1301804..00000000 --- a/tools/asm-processor/tests/line-continuation-separate-file.s +++ /dev/null @@ -1,4 +0,0 @@ -.rdata - label: .asciiz "1\n\ -2", \ - "34", "56" diff --git a/tools/asm-processor/tests/line-continuation.asmproc.d b/tools/asm-processor/tests/line-continuation.asmproc.d deleted file mode 100644 index 687dd1ae..00000000 --- a/tools/asm-processor/tests/line-continuation.asmproc.d +++ /dev/null @@ -1,3 +0,0 @@ -tests/line-continuation.o: tests/line-continuation-separate-file.s - -tests/line-continuation-separate-file.s: diff --git a/tools/asm-processor/tests/line-continuation.c b/tools/asm-processor/tests/line-continuation.c deleted file mode 100644 index d5ab0937..00000000 --- a/tools/asm-processor/tests/line-continuation.c +++ /dev/null @@ -1,22 +0,0 @@ -void foo(void) { "abcdef"; } - -GLOBAL_ASM( -.rdata - .ascii "AB" \ - "CD", "EF" - .ascii "GH\n\n\n\0\11\222\3333\44444\x1234567\n\nIJK" -) - -void bar(void) { "hello"; } - -GLOBAL_ASM( -.rdata - .asciiz "1\ -2" - .asciiz "34", "56" - .asciiz "78\n\n\n\0\11\222\3333\44444\x1234567\n\n9A" -) - -void baz(void) { "ghijkl"; } - -GLOBAL_ASM("tests/line-continuation-separate-file.s") diff --git a/tools/asm-processor/tests/line-continuation.objdump b/tools/asm-processor/tests/line-continuation.objdump deleted file mode 100644 index 038766fd..00000000 --- a/tools/asm-processor/tests/line-continuation.objdump +++ /dev/null @@ -1,30 +0,0 @@ - -tests/line-continuation.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000030 .text -00000000 l d .rodata 00000060 .rodata -00000000 g F .text 00000010 foo -00000010 g F .text 00000010 bar -00000020 g F .text 00000010 baz - - -Contents of section .text: - 0000 03e00008 00000000 03e00008 00000000 ................ - 0010 03e00008 00000000 03e00008 00000000 ................ - 0020 03e00008 00000000 03e00008 00000000 ................ -Contents of section .rodata: - 0000 61626364 65660000 41424344 45464748 abcdef..ABCDEFGH - 0010 0a0a0a00 0992db33 24343467 0a0a494a .......3$44g..IJ - 0020 4b000000 68656c6c 6f000000 31320033 K...hello...12.3 - 0030 34003536 0037380a 0a0a0009 92db3324 4.56.78.......3$ - 0040 3434670a 0a394100 6768696a 6b6c0000 44g..9A.ghijkl.. - 0050 310a3200 33340035 36000000 00000000 1.2.34.56....... -Contents of section .options: - 0000 01200000 00000000 80000000 00000000 . .............. - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000000 00000000 00000000 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/o0.c b/tools/asm-processor/tests/o0.c deleted file mode 100644 index 6f8e5e41..00000000 --- a/tools/asm-processor/tests/o0.c +++ /dev/null @@ -1,28 +0,0 @@ -// COMPILE-FLAGS: -O0 - -int a(void) { return 1; } -GLOBAL_ASM( -glabel foo -addiu $a0, $a0, 1 -addiu $a0, $a0, 2 -addiu $a0, $a0, 3 -jr $ra -addiu $a0, $a0, 4 -) -float b(void) { return 1.2f; } -GLOBAL_ASM( -.late_rodata -glabel float1 -.float 12.34 - -.text -glabel bar -addiu $a0, $a0, 5 -addiu $a0, $a0, 6 -addiu $a0, $a0, 7 -addiu $a0, $a0, 8 -lui $v0, %hi(float1 + 1) -jr $ra -addiu $v0, $v0, %lo(float1 + 1) -) -float c(void) { return 1.3f; } diff --git a/tools/asm-processor/tests/o0.objdump b/tools/asm-processor/tests/o0.objdump deleted file mode 100644 index f94ec7a0..00000000 --- a/tools/asm-processor/tests/o0.objdump +++ /dev/null @@ -1,44 +0,0 @@ - -tests/o0.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000090 .text -00000000 l d .rodata 00000010 .rodata -00000000 g F .text 0000001c a -00000030 g F .text 00000020 b -0000006c g F .text 00000020 c -0000001c g F .text 00000014 foo -00000050 g F .text 0000001c bar -00000004 g .rodata 00000000 float1 - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000030 R_MIPS_HI16 .rodata -00000034 R_MIPS_LO16 .rodata -0000006c R_MIPS_HI16 .rodata -00000070 R_MIPS_LO16 .rodata -00000060 R_MIPS_HI16 float1 -00000068 R_MIPS_LO16 float1 - - -Contents of section .text: - 0000 24020001 03e00008 00000000 03e00008 $............... - 0010 00000000 03e00008 00000000 24840001 ............$... - 0020 24840002 24840003 03e00008 24840004 $...$.......$... - 0030 3c010000 c4200000 03e00008 00000000 <.... .......... - 0040 03e00008 00000000 03e00008 00000000 ................ - 0050 24840005 24840006 24840007 24840008 $...$...$...$... - 0060 3c020000 03e00008 24420001 3c010000 <.......$B..<... - 0070 c4200008 03e00008 00000000 03e00008 . .............. - 0080 00000000 03e00008 00000000 00000000 ................ -Contents of section .rodata: - 0000 3f99999a 414570a4 3fa66666 00000000 ?...AEp.?.ff.... -Contents of section .options: - 0000 01200000 00000000 80000006 00000000 . .............. - 0010 00000011 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000016 00000000 00000011 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/o2.c b/tools/asm-processor/tests/o2.c deleted file mode 100644 index 144a604e..00000000 --- a/tools/asm-processor/tests/o2.c +++ /dev/null @@ -1,26 +0,0 @@ -// COMPILE-FLAGS: -O2 - -int a(void) { return 1; } -GLOBAL_ASM( -glabel foo -addiu $a0, $a0, 1 -addiu $a0, $a0, 2 -addiu $a0, $a0, 3 -jr $ra -addiu $a0, $a0, 4 -) -float b(void) { return 1.2f; } -GLOBAL_ASM( -.late_rodata -glabel float1 -.float 12.34 - -.text -glabel bar -addiu $a0, $a0, 5 -addiu $a0, $a0, 6 -lui $v0, %hi(float1 + 1) -jr $ra -addiu $v0, $v0, %lo(float1 + 1) -) -float c(void) { return 1.3f; } diff --git a/tools/asm-processor/tests/o2.objdump b/tools/asm-processor/tests/o2.objdump deleted file mode 100644 index 61e3fb0e..00000000 --- a/tools/asm-processor/tests/o2.objdump +++ /dev/null @@ -1,40 +0,0 @@ - -tests/o2.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000050 .text -00000000 l d .rodata 00000010 .rodata -00000000 g F .text 00000008 a -0000001c g F .text 0000000c b -0000003c g F .text 0000000c c -00000008 g F .text 00000014 foo -00000028 g F .text 00000014 bar -00000004 g .rodata 00000000 float1 - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -0000001c R_MIPS_HI16 .rodata -00000024 R_MIPS_LO16 .rodata -0000003c R_MIPS_HI16 .rodata -00000044 R_MIPS_LO16 .rodata -00000030 R_MIPS_HI16 float1 -00000038 R_MIPS_LO16 float1 - - -Contents of section .text: - 0000 03e00008 24020001 24840001 24840002 ....$...$...$... - 0010 24840003 03e00008 24840004 3c010000 $.......$...<... - 0020 03e00008 c4200000 24840005 24840006 ..... ..$...$... - 0030 3c020000 03e00008 24420001 3c010000 <.......$B..<... - 0040 03e00008 c4200008 00000000 00000000 ..... .......... -Contents of section .rodata: - 0000 3f99999a 414570a4 3fa66666 00000000 ?...AEp.?.ff.... -Contents of section .options: - 0000 01200000 00000000 80000006 00000000 . .............. - 0010 00000011 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80000016 00000000 00000011 00000000 ................ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/pascal.objdump b/tools/asm-processor/tests/pascal.objdump deleted file mode 100644 index cb3740f0..00000000 --- a/tools/asm-processor/tests/pascal.objdump +++ /dev/null @@ -1,137 +0,0 @@ - -tests/pascal.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000000e0 .text -00000000 l d .rodata 00000030 .rodata -00000000 l d .data 00000010 .data -00000000 l d .bss 00000010 .bss -00000000 l O .bss 00000000 $dat -00000000 g F .text 0000000c foo -000000d0 g F .text 0000000c bar -0000000c g F .text 00000004 test -00000048 g F .text 00000004 test2 -0000008c g F .text 00000044 test3 -00000000 *UND* 00000000 get -00000000 *UND* 00000000 put -00000000 *UND* 00000000 pascal_close -00000000 *UND* 00000000 fflush -00000000 *UND* 00000000 filesize -00000000 *UND* 00000000 curpos -00000000 *UND* 00000000 seek -00000000 *UND* 00000000 eof -00000000 *UND* 00000000 eoln -00000000 *UND* 00000000 page -00000000 *UND* 00000000 reset -00000000 *UND* 00000000 rewrite -00000000 *UND* 00000000 cos -00000000 *UND* 00000000 exp -00000000 *UND* 00000000 sqrt -00000000 *UND* 00000000 log -00000000 *UND* 00000000 atan -00000000 *UND* 00000000 sin -00000000 *UND* 00000000 __random_float -00000000 *UND* 00000000 clock -00000000 *UND* 00000000 exit -00000000 *UND* 00000000 __date -00000000 *UND* 00000000 __time -00000000 *UND* 00000000 get_arg -00000000 *UND* 00000000 new -00000000 *UND* 00000000 dispose -00000000 *UND* 00000000 initfile -00000000 *UND* 00000000 peek_char -00000000 *UND* 00000000 next_char -00000000 *UND* 00000000 readln -00000000 *UND* 00000000 read_int64 -00000000 *UND* 00000000 read_card64 -00000000 *UND* 00000000 read_integer -00000000 *UND* 00000000 read_cardinal -00000000 *UND* 00000000 read_integer_range -00000000 *UND* 00000000 read_real -00000000 *UND* 00000000 read_double -00000000 *UND* 00000000 read_extended -00000000 *UND* 00000000 read_string -00000000 *UND* 00000000 read_enum -00000000 *UND* 00000000 read_char -00000000 *UND* 00000000 read_char_range -00000000 *UND* 00000000 read_boolean -00000000 *UND* 00000000 read_set -00000000 *UND* 00000000 writeln -00000000 *UND* 00000000 write_int64 -00000000 *UND* 00000000 write_card64 -00000000 *UND* 00000000 write_integer -00000000 *UND* 00000000 write_cardinal -00000000 *UND* 00000000 write_boolean -00000000 *UND* 00000000 write_char -00000000 *UND* 00000000 write_real -00000000 *UND* 00000000 write_double -00000000 *UND* 00000000 write_extended -00000000 *UND* 00000000 write_string -00000000 *UND* 00000000 write_enum -00000000 *UND* 00000000 write_set -00000000 *UND* 00000000 caseerror -00000000 *UND* 00000000 __pc_nloc_goto -00000000 *UND* 00000000 memcpy -00000000 *UND* 00000000 __in_range -00000000 *UND* 00000000 __ll_mul -00000000 *UND* 00000000 __ll_div -00000000 *UND* 00000000 __ull_div -00000000 *UND* 00000000 __ll_mod -00000000 *UND* 00000000 __ll_rem -00000000 *UND* 00000000 __ull_rem -00000000 *UND* 00000000 __ll_lshift -00000000 *UND* 00000000 __ll_rshift -00000000 *UND* 00000000 __ll_to_f -00000000 *UND* 00000000 __ull_to_f -00000000 *UND* 00000000 __ll_to_d -00000000 *UND* 00000000 __ull_to_d -00000000 *UND* 00000000 __f_ll_ll -00000000 *UND* 00000000 __f_to_ull -00000000 *UND* 00000000 __d_to_ll -00000000 *UND* 00000000 __d_to_ull -00000000 *UND* 00000000 round64 -00000000 *UND* 00000000 trunc64 -00000000 *UND* 00000000 max64 -00000000 *UND* 00000000 min64 -00000000 *UND* 00000000 abs64 -00000000 *UND* 00000000 odd64 -00000000 *UND* 00000000 trapNaN -00000000 *UND* 00000008 input -00000000 *UND* 00000008 output -00000000 *UND* 00000008 err -00000000 *UND* 00000008 __Argc - - -RELOCATION RECORDS FOR [.text]: (none) - -RELOCATION RECORDS FOR [.rodata]: (none) - -Contents of section .text: - 0000 00041080 03e00008 00441023 27bdffe8 .........D.#'... - 0010 18a00009 afa00004 8fae0004 008e7821 ..............x! - 0020 a1e00000 8fb80004 27190001 0325082a ........'....%.* - 0030 1420fff9 afb90004 10000001 00000000 . .............. - 0040 03e00008 27bd0018 00000000 00000000 ....'........... - 0050 00000000 00000000 00000000 00000000 ................ - 0060 00000000 00000000 00000000 00000000 ................ - 0070 00000000 00000000 00000000 00000000 ................ - 0080 00000000 00000000 00000000 00000000 ................ - 0090 00000000 00000000 00000000 00000000 ................ - 00a0 00000000 00000000 00000000 00000000 ................ - 00b0 00000000 00000000 00000000 00000000 ................ - 00c0 00000000 00000000 00000000 00000000 ................ - 00d0 00041080 03e00008 00441023 00000000 .........D.#.... -Contents of section .rodata: - 0000 00123123 00456456 00789789 00000001 ..1#.EdV.x...... - 0010 3ff19999 9999999a 00000002 00000003 ?............... - 0020 4000cccc cccccccd 00000000 00000000 @............... -Contents of section .data: - 0000 00002323 00003434 00000000 00000000 ..##..44........ -Contents of section .options: - 0000 01200000 00000000 80004016 00000000 . ........@..... - 0010 000000f0 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a300c036 00000000 000000f0 00000000 ...6............ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/pascal.p b/tools/asm-processor/tests/pascal.p deleted file mode 100644 index 0886126a..00000000 --- a/tools/asm-processor/tests/pascal.p +++ /dev/null @@ -1,95 +0,0 @@ -{ COMPILE-FLAGS: -O2 } - -function foo(x: integer): integer; -begin - foo := x * 3 -end; - -GLOBAL_ASM( -.section .data -.word 0x2323 - -.late_rodata -.word 0x123123 -.word 0x456456 -.word 0x789789 -.text -glabel test -/* 000090 00400090 27BDFFF8 */ addiu $sp, $sp, -24 -/* 000094 00400094 18A00009 */ blez $a1, .L004000BC -/* 000098 00400098 AFA00004 */ sw $zero, 4($sp) -.L0040009C: -/* 00009C 0040009C 8FAE0004 */ lw $t6, 4($sp) -/* 0000A0 004000A0 008E7821 */ addu $t7, $a0, $t6 -/* 0000A4 004000A4 A1E00000 */ sb $zero, ($t7) -/* 0000A8 004000A8 8FB80004 */ lw $t8, 4($sp) -/* 0000AC 004000AC 27190001 */ addiu $t9, $t8, 1 -/* 0000B0 004000B0 0325082A */ slt $at, $t9, $a1 -/* 0000B4 004000B4 1420FFF9 */ bnez $at, .L0040009C -/* 0000B8 004000B8 AFB90004 */ sw $t9, 4($sp) -.L004000BC: -/* 0000BC 004000BC 10000001 */ b .L004000C4 -/* 0000C0 004000C0 00000000 */ nop -.L004000C4: -/* 0000C4 004000C4 03E00008 */ jr $ra -/* 0000C8 004000C8 27BD0008 */ addiu $sp, $sp, 24 -) - -GLOBAL_ASM( -.section .data -.word 0x3434 - -.late_rodata -.word 0x1 -.double 1.1 -.word 0x2, 0x3 -.text -glabel test2 -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -) - -GLOBAL_ASM( -.late_rodata -.double 2.1 -.text -glabel test3 -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -nop -) - -function bar(x: integer): integer; -begin - return x * 3 -end; - diff --git a/tools/asm-processor/tests/static-global.c b/tools/asm-processor/tests/static-global.c deleted file mode 100644 index a7f61690..00000000 --- a/tools/asm-processor/tests/static-global.c +++ /dev/null @@ -1,33 +0,0 @@ -// COMPILE-FLAGS: -O2 -// ASMP-FLAGS: --convert-statics=global -static int xtext(int a, int b, int c); -const int rodata1[] = {1}; -static const int rodata2[] = {2}; -int data1[] = {3}; -static int data2[] = {4}; -int bss1; -static int bss2; - -GLOBAL_ASM( -glabel bar -lui $a0, %hi(rodata2) -lw $a0, %lo(rodata2)($a0) -lui $a1, %hi(data2) -lw $a1, %lo(data2)($a0) -lui $a2, %hi(bss2) -lw $a2, %lo(bss2)($a0) -jal xtext -nop -jr $ra -nop -nop -nop -) - -static int xtext(int a, int b, int c) { - return 1; -} - -void baz(void) { - xtext(bss2, rodata2[0], data2[0]); -} diff --git a/tools/asm-processor/tests/static-global.objdump b/tools/asm-processor/tests/static-global.objdump deleted file mode 100644 index a519e4f4..00000000 --- a/tools/asm-processor/tests/static-global.objdump +++ /dev/null @@ -1,58 +0,0 @@ - -tests/static-global.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000080 .text -00000000 l d .rodata 00000010 .rodata -00000000 l d .data 00000010 .data -00000000 l d .bss 00000010 .bss -00000000 g O .rodata 00000004 rodata1 -00000000 g O .data 00000004 data1 -00000000 g O .bss 00000004 bss1 -00000044 g F .text 00000034 baz -00000000 g F .text 00000030 bar -00000004 g O .rodata 00000000 rodata2 -00000004 g O .data 00000000 data2 -00000004 g O .bss 00000000 bss2 -00000030 g F .text 00000000 xtext - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -0000004c R_MIPS_HI16 .bss -00000064 R_MIPS_LO16 .bss -00000050 R_MIPS_HI16 .rodata -0000005c R_MIPS_LO16 .rodata -00000054 R_MIPS_HI16 .data -00000058 R_MIPS_LO16 .data -00000060 R_MIPS_26 .text -00000000 R_MIPS_HI16 rodata2 -00000004 R_MIPS_LO16 rodata2 -00000008 R_MIPS_HI16 data2 -0000000c R_MIPS_LO16 data2 -00000010 R_MIPS_HI16 bss2 -00000014 R_MIPS_LO16 bss2 -00000018 R_MIPS_26 xtext - - -Contents of section .text: - 0000 3c040000 8c840000 3c050000 8c850000 <.......<....... - 0010 3c060000 8c860000 0c000000 00000000 <............... - 0020 03e00008 00000000 00000000 00000000 ................ - 0030 afa40000 afa50004 afa60008 03e00008 ................ - 0040 24020001 27bdffe8 afbf0014 3c040000 $...'.......<... - 0050 3c050000 3c060000 8cc60004 8ca50004 <...<........... - 0060 0c00000c 8c840004 8fbf0014 27bd0018 ............'... - 0070 03e00008 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 00000001 00000002 00000000 00000000 ................ -Contents of section .data: - 0000 00000003 00000004 00000000 00000000 ................ -Contents of section .options: - 0000 01200000 00000000 a0000074 00000000 . .........t.... - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a0000074 00000000 00000000 00000000 ...t............ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/static.c b/tools/asm-processor/tests/static.c deleted file mode 100644 index c265021e..00000000 --- a/tools/asm-processor/tests/static.c +++ /dev/null @@ -1,32 +0,0 @@ -// COMPILE-FLAGS: -O2 -static int xtext(int a, int b, int c); -const int rodata1[] = {1}; -static const int rodata2[] = {2}; -int data1[] = {3}; -static int data2[] = {4}; -int bss1; -static int bss2; - -GLOBAL_ASM( -glabel bar -lui $a0, %hi(rodata2) -lw $a0, %lo(rodata2)($a0) -lui $a1, %hi(data2) -lw $a1, %lo(data2)($a0) -lui $a2, %hi(bss2) -lw $a2, %lo(bss2)($a0) -jal xtext -nop -jr $ra -nop -nop -nop -) - -static int xtext(int a, int b, int c) { - return 1; -} - -void baz(void) { - xtext(bss2, rodata2[0], data2[0]); -} diff --git a/tools/asm-processor/tests/static.objdump b/tools/asm-processor/tests/static.objdump deleted file mode 100644 index dd62c94c..00000000 --- a/tools/asm-processor/tests/static.objdump +++ /dev/null @@ -1,58 +0,0 @@ - -tests/static.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 00000080 .text -00000000 l d .rodata 00000010 .rodata -00000000 l d .data 00000010 .data -00000000 l d .bss 00000010 .bss -00000004 l O .rodata 00000000 rodata2 -00000004 l O .data 00000000 data2 -00000004 l O .bss 00000000 bss2 -00000030 l F .text 00000000 xtext -00000000 g O .rodata 00000004 rodata1 -00000000 g O .data 00000004 data1 -00000000 g O .bss 00000004 bss1 -00000044 g F .text 00000034 baz -00000000 g F .text 00000030 bar - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -0000004c R_MIPS_HI16 .bss -00000064 R_MIPS_LO16 .bss -00000050 R_MIPS_HI16 .rodata -0000005c R_MIPS_LO16 .rodata -00000054 R_MIPS_HI16 .data -00000058 R_MIPS_LO16 .data -00000060 R_MIPS_26 .text -00000000 R_MIPS_HI16 rodata2 -00000004 R_MIPS_LO16 rodata2 -00000008 R_MIPS_HI16 data2 -0000000c R_MIPS_LO16 data2 -00000010 R_MIPS_HI16 bss2 -00000014 R_MIPS_LO16 bss2 -00000018 R_MIPS_26 xtext - - -Contents of section .text: - 0000 3c040000 8c840000 3c050000 8c850000 <.......<....... - 0010 3c060000 8c860000 0c000000 00000000 <............... - 0020 03e00008 00000000 00000000 00000000 ................ - 0030 afa40000 afa50004 afa60008 03e00008 ................ - 0040 24020001 27bdffe8 afbf0014 3c040000 $...'.......<... - 0050 3c050000 3c060000 8cc60004 8ca50004 <...<........... - 0060 0c00000c 8c840004 8fbf0014 27bd0018 ............'... - 0070 03e00008 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 00000001 00000002 00000000 00000000 ................ -Contents of section .data: - 0000 00000003 00000004 00000000 00000000 ................ -Contents of section .options: - 0000 01200000 00000000 a0000074 00000000 . .........t.... - 0010 00000000 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a0000074 00000000 00000000 00000000 ...t............ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/test1.c b/tools/asm-processor/tests/test1.c deleted file mode 100644 index 475555a7..00000000 --- a/tools/asm-processor/tests/test1.c +++ /dev/null @@ -1,71 +0,0 @@ - -GLOBAL_ASM( -.rdata -.word 0x1212 -) - -GLOBAL_ASM( -.late_rodata -.word 0x123123 -.text -glabel test -/* 000090 00400090 27BDFFF8 */ addiu $sp, $sp, -24 -/* 000094 00400094 18A00009 */ blez $a1, .L004000BC -/* 000098 00400098 AFA00004 */ sw $zero, 4($sp) -.L0040009C: -/* 00009C 0040009C 8FAE0004 */ lw $t6, 4($sp) -/* 0000A0 004000A0 008E7821 */ addu $t7, $a0, $t6 -/* 0000A4 004000A4 A1E00000 */ sb $zero, ($t7) -/* 0000A8 004000A8 8FB80004 */ lw $t8, 4($sp) -/* 0000AC 004000AC 27190001 */ addiu $t9, $t8, 1 -/* 0000B0 004000B0 0325082A */ slt $at, $t9, $a1 -/* 0000B4 004000B4 1420FFF9 */ bnez $at, .L0040009C -/* 0000B8 004000B8 AFB90004 */ sw $t9, 4($sp) -.L004000BC: -/* 0000BC 004000BC 10000001 */ b .L004000C4 -/* 0000C0 004000C0 00000000 */ nop -.L004000C4: -/* 0000C4 004000C4 03E00008 */ jr $ra -/* 0000C8 004000C8 27BD0008 */ addiu $sp, $sp, 24 -) - -char bss1[3]; -GLOBAL_ASM( -.bss -bss2: -.space 3 -) -char bss3[3]; -char bss4[3]; -const int rodata1[2] = {1}; -extern int some_rodata; - -unsigned g(float, int); -unsigned f(void) { - return g(1.1f, some_rodata); -} - -GLOBAL_ASM( -.rdata -glabel some_rodata -.word 0x1313 -.text -.late_rodata -.word 0x321321 -.text -glabel g -/* 0000C0 004000C0 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 0000C4 004000C4 AFBF0014 */ sw $ra, 0x14($sp) -/* 0000C8 004000C8 240E0004 */ addiu $t6, $zero, 4 -/* 0000CC 004000CC 3C010041 */ lui $at, %hi(D_410100) -/* 0000D0 004000D0 AC2E0100 */ sw $t6, %lo(D_410100)($at) -/* 0000D4 004000D4 0C10002C */ jal func_004000B0 -/* 0000D8 004000D8 00000000 */ nop -/* 0000DC 004000DC 10000001 */ b .L004000E4 -/* 0000E0 004000E0 00000000 */ nop -.L004000E4: -/* 0000E4 004000E4 8FBF0014 */ lw $ra, 0x14($sp) -/* 0000E8 004000E8 27BD0018 */ addiu $sp, $sp, 0x18 -/* 0000EC 004000EC 03E00008 */ jr $ra -/* 0000F0 004000F0 00000000 */ nop -) diff --git a/tools/asm-processor/tests/test1.objdump b/tools/asm-processor/tests/test1.objdump deleted file mode 100644 index b97ae46e..00000000 --- a/tools/asm-processor/tests/test1.objdump +++ /dev/null @@ -1,54 +0,0 @@ - -tests/test1.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000000b0 .text -00000000 l d .rodata 00000020 .rodata -00000000 l d .bss 00000010 .bss -00000000 g O .bss 00000003 bss1 -00000008 g O .bss 00000003 bss3 -0000000c g O .bss 00000003 bss4 -00000004 g O .rodata 00000008 rodata1 -0000003c g F .text 0000003c f -00000000 g F .text 0000003c test -0000000c g .rodata 00000000 some_rodata -00000078 g F .text 00000004 g -00000000 *UND* 00000000 D_410100 -00000000 *UND* 00000000 func_004000B0 - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000044 R_MIPS_HI16 .rodata -00000054 R_MIPS_LO16 .rodata -00000048 R_MIPS_HI16 some_rodata -0000004c R_MIPS_LO16 some_rodata -00000050 R_MIPS_26 g -00000084 R_MIPS_HI16 D_410100 -00000088 R_MIPS_LO16 D_410100 -0000008c R_MIPS_26 func_004000B0 - - -Contents of section .text: - 0000 27bdffe8 18a00009 afa00004 8fae0004 '............... - 0010 008e7821 a1e00000 8fb80004 27190001 ..x!........'... - 0020 0325082a 1420fff9 afb90004 10000001 .%.*. .......... - 0030 00000000 03e00008 27bd0018 27bdffe8 ........'...'... - 0040 afbf0014 3c010000 3c050000 8ca50000 ....<...<....... - 0050 0c000000 c42c0014 10000003 00000000 .....,.......... - 0060 10000001 00000000 8fbf0014 27bd0018 ............'... - 0070 03e00008 00000000 27bdffe8 afbf0014 ........'....... - 0080 240e0004 3c010000 ac2e0000 0c000000 $...<........... - 0090 00000000 10000001 00000000 8fbf0014 ................ - 00a0 27bd0018 03e00008 00000000 00000000 '............... -Contents of section .rodata: - 0000 00001212 00000001 00000000 00001313 ................ - 0010 00123123 3f8ccccd 00321321 00000000 ..1#?....2.!.... -Contents of section .options: - 0000 01200000 00000000 a0000022 00000000 . .........".... - 0010 00001010 00000000 00000000 00007ff0 ................ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a300c032 00000000 00001010 00000000 ...2............ - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/test2.c b/tools/asm-processor/tests/test2.c deleted file mode 100644 index 15969feb..00000000 --- a/tools/asm-processor/tests/test2.c +++ /dev/null @@ -1,69 +0,0 @@ -const char buf1[1] = {1}; -float func1(void) { - "func1"; - return 0.1f; -} -const char buf2[1] = {2}; -void func2(void) { - *(volatile float*)0 = -3.5792360305786133f; - *(volatile float*)0 = -3.5792362689971924f; - // "func2"; - // return 0.2f; -} -const char buf3[1] = {3}; -int func3(int x) { - switch(x) { - case 0: - return 1; - case 1: - return 2; - case 2: - return 3; - case 3: - return 4; - case 4: - return 5; - case 5: - return 4; - case 6: - return 4; - case 7: - return 4; - default: - return 3; - } -} - -#if 1 -GLOBAL_ASM( -.rdata -.word 0x66756e63 # func -.word 0x34000000 # 4\0\0\0 -.word jumptarget + 4 - -.late_rodata -glabel rv -.word 0x3e4ccccd # 0.2f -.word jumptarget + 8 - -.text -glabel func4 -lui $at, %hi(rv) -glabel jumptarget -jr $ra -lwc1 $f0, %lo(rv)($at) -jr $ra -nop -jr $ra -nop -jr $ra -nop -jr $ra -nop -) -#else -float func4(void) { - "func4"; - return 0.2f; -} -#endif diff --git a/tools/asm-processor/tests/test2.objdump b/tools/asm-processor/tests/test2.objdump deleted file mode 100644 index 276ed9f1..00000000 --- a/tools/asm-processor/tests/test2.objdump +++ /dev/null @@ -1,76 +0,0 @@ - -tests/test2.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000000f0 .text -00000000 l d .rodata 00000060 .rodata -00000000 g O .rodata 00000001 buf1 -00000000 g F .text 0000001c func1 -0000000c g O .rodata 00000001 buf2 -0000001c g F .text 00000028 func2 -00000010 g O .rodata 00000001 buf3 -00000044 g F .text 0000007c func3 -000000c4 g F .text 00000000 jumptarget -000000c0 g F .text 0000000c func4 -0000004c g .rodata 00000000 rv - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000000 R_MIPS_HI16 .rodata -00000008 R_MIPS_LO16 .rodata -0000001c R_MIPS_HI16 .rodata -00000020 R_MIPS_LO16 .rodata -00000028 R_MIPS_HI16 .rodata -0000002c R_MIPS_LO16 .rodata -00000054 R_MIPS_HI16 .rodata -0000005c R_MIPS_LO16 .rodata -000000c0 R_MIPS_HI16 rv -000000c8 R_MIPS_LO16 rv - - -RELOCATION RECORDS FOR [.rodata]: -OFFSET TYPE VALUE -0000002c R_MIPS_32 .text -00000030 R_MIPS_32 .text -00000034 R_MIPS_32 .text -00000038 R_MIPS_32 .text -0000003c R_MIPS_32 .text -00000040 R_MIPS_32 .text -00000044 R_MIPS_32 .text -00000048 R_MIPS_32 .text -0000001c R_MIPS_32 jumptarget -00000050 R_MIPS_32 jumptarget - - -Contents of section .text: - 0000 3c010000 03e00008 c4200020 03e00008 <........ . .... - 0010 00000000 03e00008 00000000 3c010000 ............<... - 0020 c4240024 e4040000 3c010000 c4260028 .$.$....<....&.( - 0030 e4060000 03e00008 00000000 03e00008 ................ - 0040 00000000 2c810008 10200017 00000000 ....,.... ...... - 0050 00047080 3c010000 002e0821 8c2e002c ..p.<......!..., - 0060 01c00008 00000000 03e00008 24020001 ............$... - 0070 03e00008 24020002 03e00008 24020003 ....$.......$... - 0080 03e00008 24020004 03e00008 24020005 ....$.......$... - 0090 03e00008 24020004 03e00008 24020004 ....$.......$... - 00a0 03e00008 24020004 03e00008 24020003 ....$.......$... - 00b0 03e00008 00000000 03e00008 00000000 ................ - 00c0 3c010000 03e00008 c4200000 03e00008 <........ ...... - 00d0 00000000 03e00008 00000000 03e00008 ................ - 00e0 00000000 03e00008 00000000 00000000 ................ -Contents of section .rodata: - 0000 01000000 66756e63 31000000 02000000 ....func1....... - 0010 03000000 66756e63 34000000 00000004 ....func4....... - 0020 3dcccccd c0651234 c0651235 00000068 =....e.4.e.5...h - 0030 00000070 00000078 00000080 00000088 ...p...x........ - 0040 00000090 00000098 000000a0 3e4ccccd ............>L.. - 0050 00000008 00000000 00000000 00000000 ................ -Contents of section .options: - 0000 01200000 00000000 80004016 00000000 . ........@..... - 0010 00000051 00000000 00000000 00007ff0 ...Q............ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 80004016 00000000 00000051 00000000 ..@........Q.... - 0010 00000000 00007ff0 ........ diff --git a/tools/asm-processor/tests/test3.c b/tools/asm-processor/tests/test3.c deleted file mode 100644 index d74bb4cb..00000000 --- a/tools/asm-processor/tests/test3.c +++ /dev/null @@ -1,70 +0,0 @@ - -GLOBAL_ASM( -.rdata -.word 321321 -.text -glabel test -/* 000090 00400090 27BDFFF8 */ addiu $sp, $sp, -24 -/* 000094 00400094 18A00009 */ blez $a1, .L004000BC -/* 000098 00400098 AFA00004 */ sw $zero, 4($sp) -.L0040009C: -/* 00009C 0040009C 8FAE0004 */ lw $t6, 4($sp) -/* 0000A0 004000A0 008E7821 */ addu $t7, $a0, $t6 -/* 0000A4 004000A4 A1E00000 */ sb $zero, ($t7) -/* 0000A8 004000A8 8FB80004 */ lw $t8, 4($sp) -/* 0000AC 004000AC 27190001 */ addiu $t9, $t8, 1 -/* 0000B0 004000B0 0325082A */ slt $at, $t9, $a1 -/* 0000B4 004000B4 1420FFF9 */ bnez $at, .L0040009C -/* 0000B8 004000B8 AFB90004 */ sw $t9, 4($sp) -.L004000BC: -/* 0000BC 004000BC 10000001 */ b .L004000C4 -/* 0000C0 004000C0 00000000 */ nop -.L004000C4: -/* 0000C4 004000C4 03E00008 */ jr $ra -/* 0000C8 004000C8 27BD0008 */ addiu $sp, $sp, 24 -) - -// static -> no symbols -// bss -char globalBuf[4]; -const char constBuf[4]; - -// data -char globalBufInit[4] = {1}; - -// rodata -const char constBufInit[4] = {1}; -const char constBufInit2[1] = {2}; -const char constBufInit3[1] = {3}; - -unsigned g(void); -unsigned f(void) { - // aligns to 4 or 8 byte boundary (char -> 4, double -> 8) - double x = 5.1; - float y = 5.2f; - float z = 5.3f; - "Hello "; - "World"; - return g(); -} - -GLOBAL_ASM( -.rdata -.word 123123 -.text -glabel g -/* 0000C0 004000C0 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 0000C4 004000C4 AFBF0014 */ sw $ra, 0x14($sp) -/* 0000C8 004000C8 240E0004 */ addiu $t6, $zero, 4 -/* 0000CC 004000CC 3C010041 */ lui $at, %hi(D_410100) -/* 0000D0 004000D0 AC2E0100 */ sw $t6, %lo(D_410100)($at) -/* 0000D4 004000D4 0C10002C */ jal func_004000B0 -/* 0000D8 004000D8 00000000 */ nop -/* 0000DC 004000DC 10000001 */ b .L004000E4 -/* 0000E0 004000E0 00000000 */ nop -.L004000E4: -/* 0000E4 004000E4 8FBF0014 */ lw $ra, 0x14($sp) -/* 0000E8 004000E8 27BD0018 */ addiu $sp, $sp, 0x18 -/* 0000EC 004000EC 03E00008 */ jr $ra -/* 0000F0 004000F0 00000000 */ nop -) diff --git a/tools/asm-processor/tests/test3.objdump b/tools/asm-processor/tests/test3.objdump deleted file mode 100644 index bfa7f6e3..00000000 --- a/tools/asm-processor/tests/test3.objdump +++ /dev/null @@ -1,64 +0,0 @@ - -tests/test3.o: file format elf32-tradbigmips - -SYMBOL TABLE: -00000000 l d .text 000000d0 .text -00000000 l d .rodata 00000040 .rodata -00000000 l d .data 00000010 .data -00000000 l d .bss 00000010 .bss -00000000 g O .bss 00000004 globalBuf -00000004 g O .bss 00000004 constBuf -00000000 g O .data 00000004 globalBufInit -00000004 g O .rodata 00000004 constBufInit -00000008 g O .rodata 00000001 constBufInit2 -0000000c g O .rodata 00000001 constBufInit3 -0000003c g F .text 00000054 f -00000000 g F .text 00000004 test -00000090 g F .text 00000004 g -00000000 *UND* 00000000 D_410100 -00000000 *UND* 00000000 func_004000B0 - - -RELOCATION RECORDS FOR [.text]: -OFFSET TYPE VALUE -00000044 R_MIPS_HI16 .rodata -00000048 R_MIPS_LO16 .rodata -00000050 R_MIPS_HI16 .rodata -00000054 R_MIPS_LO16 .rodata -0000005c R_MIPS_HI16 .rodata -00000060 R_MIPS_LO16 .rodata -00000068 R_MIPS_26 g -0000009c R_MIPS_HI16 D_410100 -000000a0 R_MIPS_LO16 D_410100 -000000a4 R_MIPS_26 func_004000B0 - - -Contents of section .text: - 0000 27bdffe8 18a00009 afa00004 8fae0004 '............... - 0010 008e7821 a1e00000 8fb80004 27190001 ..x!........'... - 0020 0325082a 1420fff9 afb90004 10000001 .%.*. .......... - 0030 00000000 03e00008 27bd0018 27bdffd8 ........'...'... - 0040 afbf0014 3c010000 d4240028 f7a40020 ....<....$.(... - 0050 3c010000 c4260030 e7a6001c 3c010000 <....&.0....<... - 0060 c4280034 e7a80018 0c000000 00000000 .(.4............ - 0070 10000003 00000000 10000001 00000000 ................ - 0080 8fbf0014 27bd0028 03e00008 00000000 ....'..(........ - 0090 27bdffe8 afbf0014 240e0004 3c010000 '.......$...<... - 00a0 ac2e0000 0c000000 00000000 10000001 ................ - 00b0 00000000 8fbf0014 27bd0018 03e00008 ........'....... - 00c0 00000000 00000000 00000000 00000000 ................ -Contents of section .rodata: - 0000 0004e729 01000000 02000000 03000000 ...)............ - 0010 48656c6c 6f202000 576f726c 64000000 Hello .World... - 0020 0001e0f3 00000000 40146666 66666666 ........@.ffffff - 0030 40a66666 40a9999a 00000000 00000000 @.ff@........... -Contents of section .data: - 0000 01000000 00000000 00000000 00000000 ................ -Contents of section .options: - 0000 01200000 00000000 a0000002 00000000 . .............. - 0010 00000170 00000000 00000000 00007ff0 ...p............ - 0020 07100000 00000000 00000000 00000000 ................ - 0030 08100000 00000000 00000000 00000000 ................ -Contents of section .reginfo: - 0000 a300c032 00000000 00000170 00000000 ...2.......p.... - 0010 00000000 00007ff0 ........ diff --git a/tools/egcs/as b/tools/egcs/as deleted file mode 100755 index fac563c2eceee331b99d46d547bcbfd236625253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148960 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 `s-fF=%8?|~)`3(o>HahUoFG;vsX zEkBK-KR+6Ni;o575MKLDj!N6Njl6xPt26hfwtr zXyP#cI-rTe)O(|F!LMG#HFF;cc6*G;&%g@ zI86NxG;vsY{s2uJrv3$*IIKJuxQ^;yMW}lu(8SfC;tpuyF!dg2;xP3EXyP#S6=>ox z^$XC%HK6vcKoi%4ieEqzH-L)YKod8IiZk3m^{*vVoC8hV4k~VdCJs|?fhO(%RiA(+ z?gAChKof_VKLJe~rhW#RIL!P5XyP#SC(y(_p!R-16Ze9O|3DLmsaLp(8b1C|^%`j6 zF!u+biNn-Kpos@T&1par4}pqzpozoG-+(3#Q@;aE9A^FlH1RN~`7hAKBcb8~w^03? z02P-&6NjmHKod`as`o$>Plt*ZpozoOSD=aKLDern6Njl^fhJxAReu3Z9H#yTns_Bt zJ;QBO|29CyInczLq2dN;;$2X23p8<<`UEubKB)Q(G;vseVFH@?M5y{1XyQ|#;s?;g zVd_tyiNnS-KcI=j)c-&epA9u%;SOr}z|?D?i7$ex4?q)N2^Eh(6NkCK0Zn`@RDB1U zI6VEMiEo0c-+?9$Q~v->d^=SA3pDXPP;r5~sQ!himp~Ig09EgRCVm7e?tvx_tG^1+ z#7{ugSD=Z*+G7jQ#Lq(2uRs%rslR|Gei^F%2AVi*yqe)2s(-IT)pMYU!_*s~iQk5* zw?GqzxhDZl{2o+&2AVjmy*B|(9HxE-nm8;x51@%Zf|`Efi5B^%7{}u=bk+n)n~6dJi;lh6|8(ZvmP(Onn8KIL!P7XyR;8b5@{< zb3?^1po#NC#c!aA!_p_iLsb95)N`PT!^}586BmY>Z-FKbQ=fn)E(ukifi4d1Uraz3 zhpL}}CJrCe=nek!_?nE6Ssic%kTu%zxGgZ4m5FC zeu+R6_kgNTz#(3MCcdMAjR6EI(8OgMA>s?r#1o+AuRs&ego!#nnz#p4oZ%^I zd?iA~Incx#pyC2(;wzxy5@_N#pyCQ>;*X%>8ffAlq2dN;;{TxH4rt;Tmm%TcfhJxB z6%RlYZ-;w#X^jiKTj(8OJ#;ycj9W1!*((8P6@P&yeithK0ZsfXRQv~;ILB2;_%J*}P3Q7ZaSk+bGpM)#nz%1i zTmnrz87i)TCSDE|*FY2RhKd`Yi7$kTTcC+=hl)F(iJymxd!UIwf{F*AiT{L(N1%xd zT!Vy90-CrwR6GMs+y*LMfF>RY6|X=O&wz?Ipo!N*#XHc%XF$a#poy=6iqAk3-vt$4 zfF^z#D!u|u{2^3)1Dg1EsQ3;vao+2Y@Hv1cE&~-mfhMjE6~BNcZVMH^fhO(`6@P#x zo&ptrfhJxI75{)H-VGK1fhIl|D$ej6HT|!LigTceABBnwpo!mxic6r0e}sxFpoz2H zfP|X{nz%Gn+yG772r6!YChiUucR&+QfQoydiC03!1JJ}LLB%7`#FsLB%uB z#IHid3(&-0K*cN2#D7D@8_>iBZ$iSS15I2FDn0>C+!`uA15G>tD!u?sJOe7e0!_RD zD!u_tdsQ3Xi@e@$-6KLYMpyC(M#NR;0Z=i|)gNi>u6BoG!37;2e;#yGg z4`|{JQ1KsV;vrCRh8L*mKLaYxfhJx96&FAgp9&S1KoegL6<0tLKMobwKofrq6*oW= z{{q2eph#BHGB8_>i9q2fEx z#M7bT2hhapq2edd#HT~WFQAEUfQsKh6F&(Re}E=_2P*yoP5cW~`~#Xe&s|73{6G^| zfr>M{L{0w|P;m}4aUZC-0GfC_R9pg0ybLO?fF|At71ux$UkVjBKoj2u6}LbWKL-_e zKofrg756|B{|yxnKob|b2MM1DG;uwscmkTZH&i?WO*{iCUVtWE4;8OK6Q2$hZ$J}Y z4;Ak~6F&nLpMWO*3MxJWO`PLC#9s^0#O0ylE6~KvpyC_Q#QmV+JJ7__pyCJ6#Ot8q zC(y*FLB%hiiLZc)-#`=J4HbWYCVn0&{sK+>AyoVWn)q+1_zyI3u?LXwVR(g_{xzZE z9BAS$P;mh?@dT*21e$m;R9pc~ybCI>fhN8XDsF%#z5^<5fhK+dD(-+L{t7DYfhNxK z5aQneG;u|!cm$fb9aKC4O*|SZo`EJ_0u?Vn6YqnHSD=ZnfQmPui64N9cc6*igo;l< z6aNAgpMfUM{|MsW1!&@0Q1KOL;;vBf4QS%=Q1KmT;uTQw18CyyQ1KIJ;)|f-7tq9a zLB(&NiC>3`KR^@z02P0MCeHB~;@=Nw;!;rYA86uwP;rLWsOjGwD$ao>9t#y0Koc*9 zic6r0cS6M#(8T9M#Wm2xcS6Mt(8Mo7#VydpUqZzl(8L*^K*GTTOh@dZ%v1~l<4Q1K2l@zYT8325REpyD&o#J@nr z7odsrJcWeM3N&$5sQ3mnadW8n4m5EesQ3Xi@kFTj2{iFysQ3jm@eZi?4K(q&Q1J(7 z;@hF(FVMsrXyVVI;sI#lKcV6gXyU@pA>ojKCawz= z&p;Emhl&@ViHAeQE6~IWuRs%j z2NmCdCeHQ(5)M1i#1)|82hhZgpyDUc#J!;67tq9GpyD^s#7m&!575MWpyDsk#Fs$D zKcI>4fr|e?6Tbo#XLyU6{$D`FInc!aLd6Bp#6@00!bbv4+yE-BfF>RQ71ux$FMx_0 zpovd_id&$GZ-9zBpoyP@ihH1mzk!Mepot5-g1A2dP22z~o`5Fq2Nlmi6EA>@7odsH zfQnb3i64N9H=v0>fQomZi8H;1xN`!UxGYqB2Aa49RD1!NxDQl(1)6vqRD1)PcmY&= z2by>rRQv#%_#CMC2{iFdQ1J_B;wPcvH_*f%K*b-RiT{9#zd#e0cmoNa4`|}%Q1KsV z;-OG+hIgpxzW^%EfhIl~DlUK~z8oqpfhK+cDz1Pgegi6=fhNA>EyVpR(8O0k#Sfr~ zH@t_q`v#i$2B`WEXyOeYAnG}w`Zz$7qYMlT+o0+d(8L=)LeyKJiSL1`4?q)d_ykd( zfF`~G>JFHDVfMoObplO2OkD)by-;_;%t=5KhuK$wCVl~CFPbTj4k zVdf;DiNoxxKoe(x`Ue(%Fmqtxd;(29OkD&t{9x)~<|Lqr!|ba-6E}d_izW_>uM=qE zu=tAj42d_Gy)bhU(8OW(HK2(RW6<>fR-tZL?ZY$8lCql(Hpoy=9ia$UTpW4I@&Vet`#OuC6 z%y;;T8lGR8A?iKQ#O=OA)Gt62KiC3MzXDC%3#y*u8>;z{P;mz|@maqh=6j%tXa9qU z2cU@;Ld7G{#1}x#Nk9{ifvV3y6TkBpVtxUd_+zMe1)BIWsQC?O;t4GL;Bf9h6HkYV zPe2pTgNn~U6K{lyFF+ITgNh$O6JH7yKY=E`1}c65O?)#{{05r%4yd@mchvZ*>w}am z5@_Ndq2dZ?;?p`I>NU{BEsG%H2591DvmxRZXyW}7AmR>a;=k)4;vQ(?iS-ci1~l;# z9ME_{6Tb)*pMWNQ4=O$bP5dQPd;yyH7pV9OH1WSs@eOF=Y@87H>_8J2f{GtN6PJdH zpFk5=gNk236W4=^-#`<$fQo-W6K59X2B+H}XyRp1afTnL=|MsOqMidy-1R3H*c<^g z@e_&=^%7{}pT!{J3TWb;tPpVxH1U^E@eVX`ds#?$UO*FfhL{;RiA(+K0zI# zJ_AiW3#xttnmA1T4m9xssCtJ#sP2LJ*8@$w0;+xjnmC^}#62_6#2cXMAE1fv(1ECb zfhOJtRiE%5)jd!2AnG&F#CxFXPoRlkP=lls4F*AQx`31x3=Hp~;t6Qt2|W;X8EE1Q zpyCB+;t!zW6=>oLy%2L6(8Lp<;vHz>3!vf)(8M!BAobJ=H1V(P%wYfQKoie{sy~1x zUe^s#e*sOr1gic9n)tbM5cMz6#H*m{KcI=j)H5(b{0$4|2B>-tH1SxddnC}r+o9?e z(8OWt4ba5L2O#KQp@r_XR8_>kvCqm3WfF`~Ts{RC;ILyB{(8PB_)jvQJhpGR7 zCcY1<{s)@)f@2W(a4?~!hr>|y0%+ne^A*sa+gQ1uMVsPPUnUjR+~KUBR0nmEjS z4K#74P)K=bfF=%8?|>%G4pr}gCJs{{fhNuaRiA(+4pU!%CN2n7Ux6kLQ{RCmE(TRU z0ZkmHegT@eG*tZxG;x^v9cbbTQ1u7U#9`_$poyzO)!#r9-|zsE-d>=IYeUt4Kof`M z7X}v8csGKo=Rgy`YYH)60!`cks$Kz2yv>pcT;Ca>iQ7WeTcC-<)O(o08Ko0GQ|83XyO@A^*_+W-!Flv=U_!m4|!1a0%+o} z^rnC&UJ6yOfhN8PTHjfqiPu8aJD`c@LE|?7O}rJVJ_1d=7wX>(H1RH|`T{g@n0p$~ z#QUM@JJ7@(ra;1H2AcR3sQLwH;;{U+0Zn`sRQ(P#aaeesKoegGReu3Z9F{&GpouSo zs(*ndK6e_#{Xfve*Fx1Zu%X5~OuYb__-3ej2{dt7eXW5ez7wk608RXj0VF>KV=G0AAu%*0IEI#O}tPKqP_r4{1{Yy1)4a_JsoJ`r=jX6pouG4L(E@*CVmmB zeg&F1%={f_;@6<+51@&|)L%dozYSG?15F&J{so%&1E~5BXyP#S4D6`!{uHX715F$j z{t{^7ub}D`(8OWkZ-6HL5vtw-O&sPP4>a*_Q1t<5;;`^fKokE1RiA+-4s%ZhnmB71 zqC0GfCTRJ{b6IIRBCKoie|sy9FrhpBf!6EA|Q_dpYe#cu?fcqLSQ0-E@CX#5tS zi8nyiSD=Z*;RDA}T_ztM~6=>qeq3RpZ#9`@S0-E?4sQMXb;x#KE z?q7i>egUd}1DZHY{Q)%bt5EeP(8Rr=<6Sq<#BV~?KR^>d4^96c(8TXU)&D>fhxIQw zxKY!?W2kxoG;vt?D4>bIgsRs-6Nj~jEzrb2K-D{-iNpH80chgipz0&g#9`_)(8Pa3 z)fb?NXFj=!y)Z~4m5FCc{Kw~oE@ru0h;*BSCI6u0Zp72s(uHWI86NsG;v|5 z`U_~{F!c}6#3iBXU!aM@#(RIDi7PJ!k!Vd=jBO}q)Jz5-1groIDBybY>;0-881{VYHe z?}MsefhGNlW?!_*%@6Ay=~KY=C=3;!Ev;_*=R575L7Z$sSk0Zlvu zs{RL>_(rID4nEZQ%7>~KKofs-2V%Ygns_Bty#|{2>bns27HHxPQ1uRI;^*!`)CZu6 zw?WlMpotgUhp5j$6YqwqFF+HAl~)aD;*+52JJ7^o@ihZYd>T~!0yJ^h_}B(C@mWyy zJJ7_xUWB;+1e*AKsQL?N;xP3O(8QNQ)xSU!KMoC_A86uhq3RjLt*`VeZjD6W;+9%$kPmmuzmKodU#RiA(+4pU!%CVmR4z5-4B zH`M$NH1P{i^%Ky4RUx6kL3!fcm;&-9y51@&kho*-MXyT8d>TjTl!_0qy zCjK0%{sWpgOg)1DYP`RJs^>rxhpCr96aNTRuYe{FQ*VGK{tc?$0!(8OWxKY%7K3{`&uO?)yF z~?+i3? zd#L&aXyP#UY(NutfvVquCJrKTMk;}ND_08RW4 zRJ{b6cx)ELd<`^lrri+t7@&#k2SL<3pow!p)q9|c%fvy{N1%xdLe(driO-0Ds4qYh zmxQXXKof_l??4k*hN_={CJs}-08Ly2s(uBUI86NxG;w{X`U7ae^Vgp4ba3Rpz1Bq z#Cd}u>OIiJW1;E;(8NvRA?g#*#FL=vGtk6ipz15o#51Al8_>k(#X`)VfF@o7RX+nw zTp>n4Ic$G@#RqU8ffBiQ1uCD;%lJlGtk62iXih-6=>ocpz0gY#5;;1 z>L;LyZ-J_xfhNvd1yR2OO?($r{RTAgxy=yu2hha#L)D)^6MtC(QGWwX{4iAg12pmd z6%h3w(8P~J)&D>f537Wz=MY7WuhUTV0%+nnr4aQBXyO;4>NU{B&z3>dTcC+whpKl# z6SpmZs1HCBzYA3#fhNvV2vMJbCjJPjz5q>}wE?2O0ZsfFRDB1Ucv~Yx{R}kmS5Wl} z(8L8=AnG@uiGP5q-+?B+6RQ3Mn)o-U`U_~{DQyt*AE1fKof_lcR&*tgsS&I6NjmfKob{(s!u=@ zhp8_>6PJRjuRs%rsqa7&SAwdafF=%8zW_~K8>)Tkz^#Yps8L0XhXyWjC0Zsf8RQ(1tad^FeCVm~N{sfvhyk0;PzYSIY08JcLZht@% ze*jhg15F&JoCcQnw% z6`|@4(8OW&jsu#w22{NVnmDXnjX)FEg{n_L6NjlUKod8Ds;@v3hpAtICjPVrQjTpv z6Za~Gh`&G+hn15b(8OWoiP)FI*r(8Omz_tl<26NiP*1vK#`Q1uVc#J57lU!aM@;_CyN_z9@`A86vRcxRA? zxEHoB<_1)~0Gjv{sJH~0I4m9&(8Rw&)oY-M!~AQ2CeHF6Qm$H{iNoCKfF>>sRquf& z4pSe1CawfkpMWN=2Nlmi6NkC808QK)s=fkE9A<9=nz$EK{RA}e2&niBG;x@{3(&+f zpz1fEiI+pg51@&6K*dj>iNnvK&5Q1uVc#8*JYKcI9|6NiNZ12mt(($xv5 zdJZ&kn0f&;@vBhv3TWc5q2d~7;xK<1po#y7s&_yW7y1B6ZyspkF!#X937Gq3KSI~*8?}2iNpN$0Zkm{uODdQFn=+~qLx=M ze{rCR!~7+HCZ0PR5}p!h;#{nda|0C6#9`_+aEKeAiM!2$m~Vk5e(F0!+yPDez#+Z@hxi5@;yZANAHX4g0!>^SnocgDiTgmsZ=i{@LB$`SiNnJA z1rG5KIK+RTiGPR23xgbL`iGg%fhJxBRWE=;Tmpx<0-E>_SxEZPKof`AYk($x37QTq z(8NDO#U0SZr$WU&(8Nn6A?YUoP23$S9)Tuqu?CW^641n9;gEqQ4s(A2nm9~-1)BJl z2N3fc(8SL?got;bi64Z9{{$T3Gtk6g_AWpZPvL=t!wNL+zH1U_KAmR_u#P=MAh`&G+e+{+w1Dg01Xt@2r zAzRmtiFpt6NlAz325T5`Yr=a z99G{Ipozoky9zXMSbf)kCJw9bI?%*n{+fU$4)fOxG;x@}7NCj4{Ivp29OkbLXyPz` z?LZTU`Rf3hILu!s(8OW>x_~AQtCw$}iA%CU^2-A>ahUoSIK)4oiNnf=A86vRdYnN4 zwH$`k;~Z$>FmnWOh)bY}$3XM10-89i9@jt;;wNy3!^YcS>1{Ez9%oQOEr((C9S52?tiBUK z6NlAz5@_PE`c45&99G|HpozokI|DRvSbb-KCJw9b9MHsJ^_>TrILu!GXyPz`MWBhp z{FQ(v4)a$AnmEi~1!&?he^sD~!~E5NCJysg2bws{UlY*8VfFG1G;tm&NIkv)O&q3v z1rG5IXyUN)VF#M{PiQ~l0Gc>V{Rtf67jTH*Kof`6gAdTeVdlTUA^rhP9A?fB9O4Yh zsOcZ3o&!z%4>UXl(8OW&xCELw%p3(A;u<)_4RDBC;1GAfA?|@D4y(rl(8OW&cm$d_ ztR7E56NiO=1`hE89O4yd;;?$W0Zklceg~R3tX`OaLwp7f@daq&uzGw2nmEkf4QS%2 z(vW<#15Mmt1|og{OhSC#}m-RVfA@p}0ZkmHJ_Cn%0h&0he5gPZXM~#HfF=&>k9VMn!_1k0 zLwp9Bc$gu?{R_~eC%K#1G&QKY=Emr2}!#1vGJ3J$?gC9A@tW z9O5rhjuX1)iSIILa>z#$%iLp%XZ99EBKpozomEkF~0pb3fh3N-O>sCWaK_zzQv`VKVl zGBb$y1T=9EsQ3&taacXR08Jbg4lB^aVea36CJs}-15F%Oj~_r2ht=aJ(8OW&(FGjh zH_*gk_C7!pKMl=CFVMt)Ld8Fzi9dpd=MOY-SUt`FUH1X2*I@NH2bwsn9v46pht=Z} zXyUMXTmelSR*!3-iNoq~12l11xLM#3cfcX;fkPa&&IRUQN9cL)4QT3N^<4*=IIO;# zfF=&B?`EKh!|J;QXyUN?ZUve+tiIcTCJw9bcA$yF>bnDI;;{Pe1e!R^Ul-8CVg9;- zCJyu012l1%zh0n;!~FFDO&sR0A86t*e=%sFmcuZAaiEFA{3U=U4y%_X(8RC1Ldp#V zG;x@E4IJVIXyUN)!2(U((i~#G1DZIj9``^KhnW+ALp%aae4;Z@?kmfhNx74ROx|G;vrxJ_Ai0X72(V;wx~7Z@?kG1Bdtl9O5U?#9{UL z1vGJ3J$?gC99EA%Kof_B^9vl}A8?5OKof`6;|!Xp=^ti32bwsnUJ$?`E`dW_0ZklM zk87Zb!|XLc6NmLfEpUiCpoymjL(+){nmEkA0XW1X(8OWxNk9{ag+m6KI81#3nm9~- z1)4alerZ4xhpF#C6NiPv1RUZs(8OWpEI<=q1Pz}RXyPZK`D+83_%o>b9cbdPdi(&I zIIJE&fhG>C$1k9X!|L%HXyUMX`~jLctR8=XCJw8|KcI=j!ubadaRx2a^bb?dfkWH@ zP5e&js+mH>i3A9aQ(6Er+PrKoe(z-d|IICcd;5qP_x6oDZu0 z0Gc>V{RuR2S*UseT~zlRse+g(8OW>azGP@`O5=M9Okb8G;!E?O9Yy@Py-~U6VSxP*&*w1Gtk5v=0VgKpozo! zeHCcpu7!|(K?9mNY<#8zO}rnfegc{}%={T>;u9Z0%wK>e4jZ3YfhNxS7@~dynz#V8 z{@sBl4jVr?fF?d|F2tM@XyQ9pLFRccpozoAXKtX0f1U}+*ALLdZ_I*-zd#dz@)=_9 z2Q=}RuMqJcXyT<%^BJsA)4$L{i1{37;uGgW;#UAod?Qp`0!{n^R9pc~Tu}g$el*a; zw~Ii;4ba3{Bp~7zXyQ@w5OD`Iac&ccxCff}lmC!?F#%}eGua^OBhbV@utLNW(8OWm zGZ|>&u=G%XCeHUC68;rv;+Gg8^?L)F_!%yUcn6wzbt}Z2325R1+z|CM(8O8KLE>=% zn)o%S`W0y64p8+Q(8OWmBsQ1Jt3;#Z*JC(y)U{aag@CfhG>C_Z85@VfDTSnmDZ9H$W4I)yo!W;;?$( z0ZklM?|Yz$!|MG2G;x^u5oqGDdOrb899HjVpozok{Q@*`SiN6?CJrm-8_>jI^?nDM zIIP~EfF=&B_h+Dq!|MG7XyUMXe+8O2tlr;%CJw9jcc6*G>iq*~;;?%E1e!Rk-oJn* z4y*TXpozok{Re2`uzLRmnmDZ9|9~bAtM`APiNorB23yqh53Bb%(8OW&z5tpytlpPE z6NlCN3TWc6dS3%g9F`so(8OW&z6F{%tloD(6NlCN9%$mQdOrY799Hi~pozok{RA{| zSiPTtCJw9j3(&-2^?n7KIIP}pKof`6`yFWFuzG(2nmDZ9pMfS0tM?b6iNoss6=>qH zdVd3&IIP~^fhG>C_Ya_n!|MGLXyUMX{{osgtlqzYCJw9jAE1fD>irjJ;;?%E1DZIj z-v5Cn4y*SW>`>D`tlsB96NlCN0%+o}{=5X5cmlNEcR&+|jf;Aqi7SXf?j4?hCJs|S z15I29s{R3*I86NuG;uSidINh@|H9N;pou#`)i2AcaH^{_)Dnz1~hS)`5kEDKcVU`pozoO-#`=R6o=$51y}6u z(LfWIgsLw<6Ni~!fhMjAReu0Y9H#yRnz$uYy?`5b_eh|LyFk?^pozoG&p;CofvVqt zCJs}-15G>ys-D3eyL&j$#EYQn1JJ}_=0~83H$c@dKof_lUx6mx4^{sGO&q5F2b%Z- zsCowv?C$qK6W<6`KLJe~X8sH`@qR+IVpM$D5@Wk#O3pDY^Q1uOH;xO|& z(8NDL)n7mphpE4TCjJkqUcn2ydo<9*Vf9e~nmEk-3N&$8eRKd#9H#yRnmDXJ67a_E z9tkvYSbda$CJr+{15F%OA8kMrhpFFzCJw8Q7<{n1hXYL%Caaeui;EUb;9%$mQ`e*{0IL!PRXyUN?=mDBItUh{yCJw8Q z6#TKfM*~e9Rv#6hiNoAefhG>Cj}D-T!_=QZ6NlAD0s+|FBY`FktB(@U#9`)Vpozok zqYY@{F!ejo#9{RjLm+ndaG;69>Z1TOahUlLXyUN?XaSlyO#KQpaaeuy0ZkmH{s)>k ztUhuG!tQ<#G;vscGyzQqG;vsc)PN=qGrt2( z99AD)Kof_lzkwzWtB({yu)9YCO&nGq6`+a3%&$Nbht)?1(8OWtPoRmz>LY*qSXyTjiL&P1>#3Ro`#68f& z-(7=<2cU^hy$cbKKodWH6e6C0Ce962pMfSm=N3eL0h%~$-9-hOIBeZT1Dg2p0}yjM z(8OgPK*T4YiN{`sh|fS1XSoRxUw|e)?;b>a1)BJeQxNeDXyO4-|L#B&XSxGXe*jG! zw(jBtnmBCT#RW8R*t&}kXyVMG+~D<%KhVU>pyCYSsOhBc4a7YhXyUFvA>smP;$g2L z;u2`$pT!{dDxisXvO>f)(8OOt#SPHJ9Unu?w?Gp=`vfBHfF}MCs@?-l-0&$x{RA{| z_<9mFark-?G;#QP5;Sr6dJ;5o_<9mFark-?G;#QP5;Sr6dJ;5o_<9mFark-?G;#QP z5;Sr6dJ^b)x3KvX_<9mFark-?G;#QP5;Sr6dJ;5o_<9mFark-?G;#QP5;Sr6dJ;5o z_<9mF@dwayvjSZlnonTo{=&jRN)pn~J%FYjw(jBtnmBCT#RW8R*t&}wXyUMS7Z1?H zVe2klpozoQU3@?jhpoH#fhG=Hcfk;en%`mTE;!J{Vg3?86NmXr0!3P2Nw%_~KqiBDmJluHR{;;?z83^Z{eRfzfm zG;!FxPX(GdY+k7WO&m6_)PW`rn^&5ECJr-y2AVi*UTFcEIBZ^N1)4Z)UTFiGIBZ^N z2bwr+9^n9*IBZ_&1e!Q(Ug-jwIBZ_&2AVi*Ug-gvIBZ_&1)4Z)Ug-mxIBZ_&2bwr+ zUWp+JHT}cpl{nDEl~o||D}W~M3>B9^6HkJQE1-!V{s5_WG|XyUMWr3f@}*t}8#nmBA;DFaO$mL3Yw#9{MF6=>qHd8Gz4 zaoD_42bwr+UTFfFIBZ^N2Aa4Xblu1TG;!Fx(h4+j*u2sPG;!Fx(hf9n*u2sKG;!Fx z(g`$inP-rAxqv1Pn^(GlCcY5bK6!v94x3kcfhG={SNeb^4x3l{fhG>y@52B+w;oon z!RD1X(8OW$N&;x&_cb8-LIO=3Hm{_BCJvid(m)eWe+ejs)Q%wG@C#9{t= zfhG>~*9SCln7@9YiNpNG5QAE7!~Dg8CJytL0Gc?g-j_fVht>NEXyUMXUjt1XR_`02 ziNoq;3p8<9z3+e~4y*S)(8OW&egK*{%=`#6aag^dfF=&B_cPGMVfB6inmDZ9uRs%r zmGcc~;;?$Z15F%O?@vGzht>Nt(8OW&{sJ^{SiQdjO&nJ5Z$J}=)%!cp#9{UR0W@(~ zy?+8t99HjNKof`6`!~?UVfFq4G;vtH{{l@MR_}j66NlCNKhVTs^*%!^YWj!O`y6QE zuzFtrO&nJ5OQ4Cv>U{+?aag^tfhG=14+d!BuzKGDO&nJ5JD`cf>U|G1aag?{fF=&B z_ao56VfB6jnmDZ9&p;E0)%yi#;;?$Z0!C@{!|MGGG;vtHKLJe~R`1V16NlCN z3(&-2_5KPpaag^-0ZklM@9#hpht>NB(8OW&{s}a3SiOG%O&nJ5-#`U{w;aaey|0!=&tTJI~MiNp4rYv2$! zz#(pdL)-y}xCajL036~GXyTTiAnm9GH1XG8A>tWm;$MG4#2286fBpawUx6k*?K4Dt z1Dbg04~X~yH1QBQ$U62DXySZP5b+CW;y1z|;y2L5JL4hZ575M6@$v#qe0d>6eMUT5 zI#Ga(+ccnwGyD_)kBiEHM^IxEe*YQKdKcI=95rK&RKobv@hKMsj z?}LK1GYi-t;v8t=r==j`0%+oO5)g3-G;!ECxdNIvY@A#JO+1JZVvYft_#LQ!Ezrcj z3qsU8pou>ggNS>eiO0!6!~@X81-T*O5oqE9(C|q>6MrBHQJ;Y(4jU&gKof_JlUJaL zS0_Wv=|B_z3Qe~Y(8SLxK-AAb6JMYN5nq5NzF!$4z5-2rks(BU2b%as7RWvh*u7G) z^w0rKw-36G;vt_oFNf4zrfn(9BAUO_PGF>IIMjxfhG=X zpDUn=!`kN>XyPz`8K8;7{AGbA4)d1-nmEi~9%$k)e+8h4!~7M2CJysg0-89?Um0lP zFn<-GiNpFG6=>quZ6WdAfF>Ss1d>iV(8OWpOh6Nd^$TX8iT6Rv)dgtcuztr1G;x?Y z8*qs4KokG66ynYUXyUMb#|boXnE4mb#9{5p8#u%tpowcnK41DZIj-_e04 z4vUuwXyUs|A?}%hCazQl5nq5N9+eFdUx6lmtpy^!0ZqIeD!v0vd@EG^0Gc?gA8`Ur zTz3-0{0nH}F!eXk#9{r82WaB3e#Z+m@d>$*c>I7SZZ{EP?+-L_ZheS21N6R1SiQpm z%|{$);*1L+>IKlmL!jy<(8OW=4h1yv)$R~;G|OlZBo08Kq?K5hk? zIBY&{1DZH&K5hq^IBY)d0Gc>#KJEmXIBY)d0-88%KJEsZIBY)d0h%~$KJEpYILu!k z(8OW>`hg}6^A|%3YPk*b7YCX+%wGa%;xKWO@IRR+mu=+FtO&nJ5C!mSL>irBfahN#;IK(T^#9{S*1DZIj-tRyY zhnYVCO&nI9&%hzR08JcL@2@};{{St2HlT^a>ir#P;;?%E0Gc?=JtuI8U%(-L1Bdtn z9O5s~#9{UR2Q+b5z5fGE99Hi$q@t#OSiR4ICJw9j1<=G{^}Ym}IIP}RKof`6`xU{?^aag_YfhG=%mjEir35;xP3y(8OW&{sJ^{SiQdjO&nJ5Z$J}=)%!cp#9{UR z0W@(~y?+8t99HjNKof`6`!~?UVfFq4G;vtH{{l@MR_}j66NlCNKhVTs^*%!yYWj!O z`y6QEuzFtrO&nJ5OW+V!z#*=IL)-vO9M+$=Kof`6`wnR0%c1pt0-89iUz~v^4(k^e zpozo!#T97cuzqm^nmDXq+<_(z>laTz6NmMSXP}A0`o#;-#9{s76=>qHdVd3&IIP~^ zfhG>C_Ya_n!|MGLXyUMX{{osgtlqzYCJw9jAE1fD>irjJ;;?%E1DZIjzW#wG4y*SW z(oxebtlsB96Ni~2fF=&BPbJXAVfDTOnmDZ9*FY18nPY%M+yYG;R_{BYiNorB4>WO@ z`2lF+u<|?thj;>-IIP~!Kof`6`vqv?uzJ4&O&nJ5H=v2b+|z+Wd;$*f892lj;1FMd zCJw9jH=v2b>ir#P;;?%E0Gc?g-ammR4y*Sspozok{TpcFuzLRinmDZ9e}N_rtM@;k ziNossA86vRdY>T!HT}cteGW8nSiA_JiNorB2{dt7y{~{K4y*Sy(8OW&z5$vztlqak z6NlCN4rt=AdfWp|99HiKpozoON1%zr>iq;Xaag^dfhG>C_Y2U(VfB6mnmDZ9Z$J}= z)%zW2;;?#u0-89i-k*Uc4y*SUpozok{S|29uzG(3nmDZ9-+?9$tM?C}iNoss6KLYF zdjA5NIIP~kfkXTO4)GT_#DAcP!|Hd5Ow@F42)*}Q0Zlv{DlUCPYck*VfASRnmDXJZ9o%;)u$b3;;{O30-89iKAnLk4y#WWpozok z(-mmqFn?`86NmY02bws{UkA{{Vg5RSCJyu01vGJ(ziyz3!~FFCO&sR07ii)ze|a*K=y`DgXyWj80-89y zoq#3|ZzrIM!_K!UKof_pN2)**|8Wj-9$EvMIBY#q2b%af==pUM(8OWuk!GNY!`lgH z;;{8dE6~JY_YQ186NlY9umepTcJIIeG;w%40ZkmX9_a#_IBY%A4K#7sdZY(v;;{8d zFVMtc>ybX7i8JIv()SN^acKJhCJ&nzcm%EY6`=ZH;;``n4K#7s_<#YLIBa~t0!C_aC5%!|MGPXyUMX{{xyh%={l{;;?$3ArF$SVd)cA?{lDu!|HtjG;vtH zFM%cwE9Vu^#9{Tm2AVjm-ZwxKht>NQXyP#Q9dL+ypozok{Qxv^SiK*CCJr+{0ZklM z?`NQi!|MG4G;vtHUx6kLtM?nw#9{S*2bwsn-k*Rb4y*TPpozok{RL>^uzG(5nmDZ9 z-+(3#tM_-HiNoss18Cx~djABPI4nFbpozok{TpcFuzLRinmDZ9e}N_rtM@;kiNoss zA86vRdY>U5HT}cteGW8nSiLWRCJw9jCD6oS^}Yg{IIP~+Kof`6`vz#@uzKGDO&nJ5 zJD`cf>U|G1aag?{fF=&B_ao56VfB6jnmDZ9&p;E0)%yi#;;?$Z0!C@{!|MGG zG;vtHKLJe~R`1V16NlCN3(&-2_5KPpaag^-0Zkm%pWlHd&H%0VZ=i|SLdORlpouSr zir*+eO>eOC@EHnG#lOSa4`|}B{Ut6Gw!}`|_XyUN`wFjCwtbZMV zCJyUgN1%zr`qv3);;{a82AVj`Uj=C5Fn?8`iNpNWfF=&}R|lFn%wH4G#9{uLfhG>~ z*8((gn7>w_iNpN00Zkm4iO9A^FxG;w(Qp$IkI!rKpM;_&tZnmD}ufF=&BFBH(k;q3=Bad`UyO&s2SKof_V z?|?(x15F&>en1n4w;#~NVdf{GiNo6uXyUMQaSPDIVdvsjpozoI#ce_5+$Yy#0VC4sSo8iNo6uXyWkp1DZIz{eUJ8I~R8X znmD}ufF=%aKcI=j+Ye~s@b&|m_yH(?2b6~OvkpMp2QYb?Uo(`TrdwG5ngdN7*1r}&6NmM$CD6oS{c8m@aajLa15F&}F9S4j zn7=I0#9{t&Kof`g%L7du=C1%WahSg%(8OW>N^uzG(5nmDZ9-+(3#Gk*t~IIP}3fF=&B_fMdS z!|MGDXyUMX{|1^ktek&irLB;;?%E2bws{e1=lg^bZr~Kof`6`vPd< zuzFttO&n&90-89i-q%1Aht>NAXyUMX-vUh>R_{BYiNorB4>WODy&r%k4y*Sg(8OW& zegc{}tlrN+6NlCN1!&^1dcOiq99Hi)pozok{SGv7Sa?oA6NlCNGtk6g_5K1haag^- z0!N#(8OW&{sA;`SiOG&O&nJ5UqBOw)%!Ql#9{UR12l11z5fDD99Hjt zKof`6`#;dcVf8*k8EX26)%zT1;;?#O08JcL?@OSG!|HtnG;vtHuYo2GtM?7i#9{Tm z1)4al-giI~ht>NYXyUMXKLAY}R_{lkiNoss1T=A2y`O<54y*SI(8OW=`3f{~SiL_3 zO`H!}?=L_T7lw*&Koj550GapMfhI272oXPkCVm3Se*mRn?G2c{FVMtgq4xej6NlN$ zP>z~@VD@sLi3>pa8c-VDUIR37b*Q}#XyPz?J0VIG`hVH(8QCW_I^MUhuQlBO&n$~LnUfFazObC zP#WD{4K(pwsJ#|w;xKz1(8OW(dZ391K=~O^8r|LkH1Tq%y$xvMFnc@D#9{VMKog$< z()0Lt%x(&+Y1Koeg8wRZuUILzJ^ zXyPz?Z=i|8%B2T5#6O^k!_5DICJr;7p&B(_8esKS1FAR&l)s<_Ra`@h4}8AF3N&#; zsQ3mnaWkm+4m5E`sQ3XiaX+Z|2{iF=sQ3jm@g%7D4K(pQsQ3dk@j9sZ3pDX=sJKQe zs(&X43W5D=fF?czDxQEQu44>QpMfSG1QmDaKsCR7CL}x)(8L>{;tgoxZBX$AXyRGr z5OWToiPu8KAE1dphl(?FqPnLCYQ6%R_(Z6<1Dg1JsCWXJ_!6ji1Dd#W1H_#R(8Sk5 z)gM3;-wG9ffF`~JD$dY_>i*qOaRoH-gHUk?H1ShV@dPyS3sCU}H1V5I@daq&_o3nk z(8Rw$!}$T4_zS3dhHg~%e}alDpo#y0iaVf*GtPp9X9Aiy8&tdjO`IDlz5q>J04ja} zOl{s2u}9V*VygX(@QsCWjN__4zfcNUNhb__5P!qM8FtT_0-E@-zmRayKoi&a2@y9y z6L*7(TcC*_fSTigE)L!AX3>x49(_o?;D9DRLkBXB?SUpPpbHTXKodU%6~9mqF(2gn zIB*Vv5I2y-AuDeo;t!C-RUtxP@&%H(K3D`od_WQphX{emA4uZaU=awB0CguT0|P@Y zLf-yot43>HY@pg4euJ0OXJ+yoQ%KoWx7z~llXaS^Zxgjj(jE(#F>lN*r4#lRvEVh57AI7A3c z9zYV80E<9~6G-Bc5Fs#m0ZCj6ECL~JAc;#uguvtjBykzA2!wcnBrXdP0+Sz*#O1&u z5aI`txI9D%Le@b-7nF7sAR=Ir14&#FECL|}ki?ZBLSRw?Nn9B$0wENT#8n_dU{V7~ zTn#J&AqA8j!?|AVOfW14-N%ECL}WAc>nmguvts zBym%)2!vRGByI)~0+TC{#LdAX5Ml$8xCKNAOzuDuw*-qohyzICRuCaDc>+n?8Y}`K zE+C29K!m{L4J2_}un2^BfFy1Q5dxDhki_l5A`s#OlDGpz2u%J!5_bfPKnZC50!sf* zP$3Y-fh6t>5`ba>Bykt07>JTU5_bg&K(PXnxEoXqL}?(2yMqLv*Z@h~11bihERe)K zK>|?hfF$k(6$4QoNaEfg0VobY68C|Mfv5;1abJ)C6el2w`$5G(R0fi`KS%(I3y{PE zpkg4Z0!cg&Bml(?Na8_IF%Z>(BpwVBfZ_>A;vrBm5H$lyJQO4V#S4(c!=PdyY6X&b z1V{jiHz0{eLd8JT4kYm?kN^}PKoXCJih-yTNa8Udfl)jf0;3@?8Ui#5fzSMMzdV}X zaCmgH-ki_R;L&=Zgz5hUkLDvBhru@fH@!87pW)Mg)!TFU8TjQHKP{Qv*| z1TY`eq51UkBAgHE$b5Qv5Y7j6U_QOv27#F9qRz zPzU7GOGY>!)baTA^5Z|4e?c9NPcI+B`JkrorE%W^AJn1v z^l~Ab59&yKdN~o!2X!Dmy=;W@K^=!rFAL#(P>12u%S1RI)KU2KG7!!Obr3$ibcFLk z9fMCV4dHxHhv3soMK~YS5%}~{5Y7j606x8Bg!4fS|4%PJ{)PD;)ZqX0@*$iLYUqD@ zc@fSBHSj;ZJP7B58up)FZiMqe4f;E*{iF#m%Z=$~Fbg!4fS^G`1?!ug;E`KOl$;e1d-{L{;ga6YI3{^{jHI3LvT z{`7JpoDXVne|p&n=YtyBpI#Qi`Je{&r180C4{A_E%N>AJj1Z^ztH{4{8v9 zdU+7e2Q`F0z1#@rgBrk}UM__5K@HzeFDJtJpa$=!myK{fsG!+8Da6YJ^`swAz zUoiiJ8mOOMK7{i@4bx9AFT(kt2I;4l2jP5BL-f7mYs^jo*vLZ$;zRBJ&O3dUjrn^XPo!(fs5?K!{H- z>os{E29I9ecrazlWXQnqUo>e7Kf{*^9=)~~7xOcC^s=4;QI^%d}j{gtR z_~l&~7-0HA?ezxRwTt-~7)rH6J(_JlP3C7{@aTM6!sF3x`)x8m!;6(a|NnoH^8f$; zW2~)<`572v5A(~T=zm%M|NnoGL7^UBAremyq5ULwO zH7@37;5x>-dNDr(^D)-Ni}@Kin`_@Nl=2;8ty|2`z;TSVW-&hlw?{AQI%OUPk51Pg zuVp;CU4QUzW8mL*z+;9-uc#@=bQS?dk7m~&j8M6j1En{QyM6%$&ufux*Dqj&JWz$r zu3s1%Yrp(wU|^_w?9t2W+JVF5+l%-ajp%|Mf?n%jso4R??4P^6_0M#7a;l81EpLZ$DKhk6=m2HmXw3;7v3 zolQKtS(hpafE;AOzm0W~k^n=8v%_&#-$kH)76XIFan>vtv-1Y1D;kaJUkQ)S+7}+( zu`jxrJ6WX{@iTNgvvjhGL9FKR=w#&wF~MGC^ym%*iLio1Iz`z)iX8n~-;l=VsMuu)@ z0}qg&L7qM4(QA8YAwR>5+Moabd-Sp%TL=no*5wO9ZZqg)T?XQVZ0S7y!s^@q|J}|e zove-v_!&I9oh>{%S*IxqFz|14cIaT8qA0-N(e3&I6nX;R{{Nrg(R@S#$^V_Tf0}Fm zl++hD*ZxVWD48B=~iFx9gwg7fH=OgvvuY4|w#7w1OP&(aSntfrp`+ zg~1dD2dEqUT6YJiH~d;{2dLBhT7CzpFZ^0!2dGQ^T5t!b=k=Ov z2dG2$nz`Hc4;r|qN3U(=0)B@7 z7dllM%-NN)h6N2ln?`TPu^B528nqdktZ7R`sGK4kA#&4+s5qn9-gL?-=n$w3}9)H8~4e5&k*@GL_sI;%}*z28FUdf8TNj5W|wce;xzaRWG3Nik7x+GBPl{%p%6&;#eFm zkK}M+N*rDy=8=5ZqgS+VHYm%m2-q<3w`BeQ|G)XS5`XJ2kPndKp_|ohHa|n_ff50a zUe+`jP=(1FGl!qyHJ?W>Ya)d2GY6Ep?B?(@fCm4Lvl`6dX8@&Sk8V-JIiU8E6Qf5b zs~U(2DlL0G7(F_DU+`}eLe6Aw zmvA=!=HhP!wVIBzrXy^^5vQLe7#Lno13CSr1k~xBt`}Y_dvv>A0F@Q{ZZ!XnDUoab ztyCh}{9C<5r1>{j3BO0P>jhBD=mN-}MVCQ}J+xgPbh@7Dc0B_r8#j1pyT0(SJXFW+ z(d`Q6bh@5tu06w0rwvo%`v9EdA+`60PyhdeBxZOpf=cx>9v}ut0sgRDI}0-`x6VRj zk(IM32+Pu7k6v4UDISIwiZ74~G4WDHhHh5jS)h!~2{Ip)-XIwpQij2cG$pVHK}A~A z1aSt2m%5-Z1}EN&GoXo=qg20}_4rJXS$k)K>S$LSG35_3;Egyar^b}(9%t>I$NEqK2W&vau6Z|WIM_a4kbNMx!^$jVqmD7CgSpnO8;Ueu zmWYEB2M(ug5o2I@83?j%l^6rVan=tr_!&UM?4U3Kr4XD|(EAyfvG;ujBKBU-AV2mh z>T8>SE7b}#|NhV4(gQBxxJqVqV*fbnn`!(EpmrZP3IrhT!r}Bz5e9~rd{FPgA*aU7!SjX#K%bKEWCh`;W(=|!X0owAveOBQbAs-1{ne_ zvE)Ic4%=7+`1c)X{=v=Pt}2Aq%x#lEvE;FcQpLQw&c(;o>kFuaTwVqkzY zNB&QO+Q3pG-uxTX90Uj33z#r-sckpwu1O%f_*+2JXT;gk1hVC;AjqL}C-XBj|6nTN z?q;0?W^$K$LhNpaS;ARr-pv{cwggm1q)&!=2&uF}EiyDg#!mwqZwE1xzrBhPEoSeC zA!7D|7%XPHS$RM@KqVscWPXO1wSWKrKhFAP5>gkX`2eGbrR#<=NI3?rq>eEl0T zWWV#@|Nn^#4N*`N^tk{iH1a1xf|8AB&G#4>7+$UdYc>LFF0nk$>H>2wsH`U#=LW?5N6Q$8KO3sQNYOXaveVd!-SVBz$9oaW5UZh zU^b}G0@Yr4tKgi8n7OZHA|m%?fE+_c?sM!s;@JF0i@&uUG?YQ8FZyf(rYqh}K)B-3 z1o8?+h%5e=D0(Iz@#qze?uX`4u2TMP*1`#(PCH{KYsLhA2FK<<|M^=w7#Kh-E&f)| z|NsBLt|1tFx>y`;isW!jiX5)R-%|De|9_C%N+cbd|LB(pgHw`A=Od8IIs{%W`UjCN zmGtPf?GfN%cu{s2si@D%Vr1A2nn8bg|0hIY2_LEn-K=i?pkjp+RIFHonOvn@$60my zp(z(<(eZ@`RQ~aT@**=tAAjp^^zPSj*2jIA2B8)KyhPNRNBb}n$k{$b0y)@6UIOVn ze4N!4>cZE`-K>^<;J_&5InJsF6Xxk=Rq6vZ&=vYX{Y0TYNc#p{6F|!})I#+EHv_{< zM;=hfyzB*;$5mHp5%HqseoXL&k%>O-ia|-;SULw@|`+o^9N@DTowcXs!&+ua1Lr^XGgRxWtIpy(h6P?=4&wxA< zk;}=z@bVBRDEVb|gOVR7C^^S>LsHypo^ICQZcuU#>;@%g=Wc$;U`H>jPd6wESZzU6 zx2PG2>IDydXoHyGf&lB#2NTG`K(K{ByTBHL3X^wWCKt%=`(04GMY~zAgN2z(xQ?@) z=z`Rg$o@giN$WTm7+!wo0D0wb7pT53k?CgL2{PdYV<+o|F6gKlB43qu!D9#Bszo(2 z5oF{N4p2W@pU9-^fiM(4P#n;Oh;kQ@JIJpiOC^u99_)mK&~etyo%{^{{{R2~@;W;M zWXup=+IO?g>I4S@e>dxdPEbHI^0%fiF)(z-t{|9hn>*nl1NTICC&Cl;ouJ4kZ;DQjLzM(^xG#!kS4C5PD<7+!(~1$Ug^S3-=U|@J%O)vx+J1|3_vjY(VwH;Ilfgf$q z5a8l(g^Wu62iMIjIC&Ue+`5Vs0vD1%-LNC=a7V!tEJ`&W@7m)R( ztPG$rj9%O9Y#xRep?ClP_h>y(D$~vSsug4*e~TasC_gEJ1|PNfTbWrv@pKL>SEAYc zTd{p$wRsqloTmIH+FyHlo zN2lw7*9IQlt_S$HF}Uz=djM$@ySG66%fIhHr|XjD+9eDnY|XVx7)u2`nq3coMtKi_ z>cgUAuNgsoc@XD88LLNgE>sRY?z;yz$m`L0sM~dq#|#h4L-l+x!R8l?ovwSDYxgkl z_q~O52jD@4QaCqrFf%YT*Y4q{GXR+anx{hMS|I&8w43!@6DTtT=>aC4z@!bBGy{_cU{VWAs(?v3Few2hg}@{am}CQ!3}EutLy(zYz~nnH`2tKn z0+V;Zj;OQ3D z-HrSVuem*rvo33dN8<|*ZCB7lenGTj3}ObooAo*)Xn>+L;yCL`Mghn$SFddpD-Xj9 zm-C=P?U+Y5>+gDg2A^Kma#m2on70f}iDrT**zont8=xjK>!o^7vN*OMGywAA>Gl8r zUo)bu6M?Rqklg`VW6*1B39{(+IgmvM!G7($1zENMX?Z(=jP13x2C3Q#R&@xX>Kc6D zTppri0~-&+i%Hm({J9QV5Mg_kgNNZoK6WKHAxgM-co<&zU{|sYqy$tUb{>Bby_y-c z4r4c{XCaGSdHZ$Dg%cjlZwxwX?|5{UUhp{X`U13w;JE7_(9q&*<8IeKptTVqM?s?C znKQ-<9^DMPKy|rCCung;CCD~`tN;JE9w^~!cKyTH?fS>s^-j%EP-X%%`CGa`O(Eyk?x>(Omn2p;W-5*Y++*>Ep{_n_obLL5r;}^MINo zt`HIamgx)(498vnfPw%$M0#0G-|;bcfR>PSJ8*b(hraOW1f_x({~#eE01A;EpqVdA z*FQCfUo%dCaY~gvdTlE}_7|N2ITf0Oj(K!mhorKsSVjhj_hDY|Wj*m0YFQ`iS$P4- zwD6WnQ0ivgD-T*8!@3PjISBl}FySP8DHLRx4l}4S>$Oz{*?BFF5z>uBWIB&-)=G$G z1CLJDI53knT^_Xj#zCR^0gnwwsewl~t1Co=rTGD4=OHM+`4MyTBj#QnP?MK|e_Mb; z^P|t4r#b=@Ji1v`A?g*HA0*f~lt_7WvkF5+4!mG(e!vXs-?9djfC>uMpK>5SIB0;{ zYZe~etS{x@wznJrE#hFk4pPx8n#K)^pa6~6LLS|$haqBNP%)IO-S`GHNaoSGx8gr2 zlD8IssBYGT5`G47pg_{_MnN7(XuNp14-^-!pmi-WAUCl-0JTRtkH0v094v7Glm~W! z1$#|@Y4S0ElJ24_;9}-=F~}347d(2qzzV?Kb}^7Co#$WFfz`BvoYBqD>3YVayA|RV z(5k)z-L7XqX?%vq!3WGB6N4eP?EtlZJi0+EW_EaV3LJNR1Im@%u5VEC7mj+vCygd%>eS^oB=wDac&U&L5q}U-)1C|G(39OLOg(|E1<0-L5x4ww$^Ea<}UR z5PKh(4RK%Sn@$0^`$9oBzl>*RU}&t}0vbChSLt@$g0zH6fCtfLVF6_v@DeJIZc*nd zeg=@z&TE~=U%Z&j%+Pv(zx5LvsP(g@td#2o->?7wUox^YFzg5U>O~Bw0O)4rtpcrK zFzp5R0FJ-db_rCnl!Dej)PRLp-&BH(ebXDj*cplu5TF!!8k`}R@C4J#ZZ>eMvl6WG z_=}G}|Nq|)3cwfFuYeYJX2=LIFuqJ<1C5+pg4m$?I2_F7f^j`SM)cag02SXGPJjlz zP2c_lr4eYE^A;4Ky|(v2@)JPvuuAC)MB*z*q8wRbH$+J*H#>)DG9Dg5~K;W?mY$%1RYSZ-OYNp9OQG?2d_bEP9K1J z0H9@KEeA?KwE~D~V_W(Z)E+@p5QjiP|K}J|Wc>>VR}kj)0u(3`#HQAR$nV)p`7dmjVkY zYqlhVd$p`SV5tZWk6zo4pkCzVqaaTu`)kv-*M69Di|Ioq^${ z3Nt7N?N5WWmtTs4xf{|TBhoL~m>C$3vFb>G^4c#ZkjkqdHYl&X29>(qtc*~@1TX&o z-^uzto1dXu^ec#DeVxtEV0nnYcPkU9mw7iEG(vbgo1fw35{S;@rJz)C{KfSPpmJ|R zH|s8t2GxDZ2>?weT0#V$mw-AN44~=l7q-nm%=p`%GN8?aDsUpoWf4%e1DDI) ztOeo%49zDLI$6`j1sGml2Q|%DW58kpovgtiG0^_jZdMPl7)K|oJxFXlSe*%2jIond z8zeRxET#Y!bLeCh2Z@2kxw=_-z+x<&tjyv946n<&S$~UxEM@9s{Uj#9@H!RLE&zE8 zROxjde-U^Hl*CvMeFY_CS#FR_H|rJ;_Yt;!aGk$=2TS;It226&5$pA3v1twj7{QvLKcm&i|L0ZuaT1ITqS$oE# zv-H4=pdBD;hk(aE|~1XQ80ZURxA$6ss)HHLaw&$ELX zTdXpo0t_$Yc5pMikga6_joEZVm95SOaYI3k4G(Z#zxeb2|1TCOGBLa`yu-loBKis= zgGX=Z0gqnSGtfFJ`rH5iFV2NAGQ42=%E0g<`4j^K|2Ec7A_5F82TFK6dTn1ZGBCWb z*vriT?~ptJ6~o=8&qM?mxf)f%t=Cqak%!?0Q!pdLi$x2W8D2QavM{_(@#tpt`wU8Z0iZnq&S0hkhet2(4q*WX zk6zQl%Y5L5UeP^9P;>1DtN}IQCDq1YctEA{}gCo%V}7Fr!rIMW`1eL+4?SUfUO-Jaub7N}lraXJmNc3|3kv#J`R8 zj}X{lFlT^VP|EMo&H6!Y$0u=@ZNQ+Bh z4>x$LCTPcuV<=?pyaYt5>IA6G?t0@z*j8=^k8aUjANd(PG(ijJFMu1lyKb9oyWVt9 z+S#M?gva++9tVF3fmjEB*n4zd_Ru`+k$Kp`38dwqN9SomIy4V?c3$=AR^2KHigH^q zPzc-rWq?l5SVMn4KZ9rI4WG`JKAn%?y?jfM1A9e-@<_HQf zz{C?k;%6Y@B1qzXAn`3waRG24;R=f8ZU>HT2Z>JCAKk7$nje^hI)uD3AkTNRs)FPp zt7R8%Wnlm-a0e^c4KaWPp`Zb#0NkbI-NX;J;W5Y{hzapqK}8JfOprw9@fU747(v}k zj^CfxR6ofbjMdkoZ-IxGKnwZq_ik zbm#FGJ=Yl-UW7$3F}!e8XJPPYc74Fnoco6HwF;Cp`uxh@d~_4Hx<&f_oKLl_|{ zyItS(2K?^~ebaiN^n7#eABIv;0k{4SH^U2MP&I| z-ds0yf-FRGZsVH*P-~=f?}~q*jJkCJn3_5RO!ZCxQQfT|LH=zFHhQH(9uS^K^8rS1 zW4uHh(!kCI&B*uKs)1r5-4~RqyIa9Vc7w{)4<6mFpwXQU*Ygdv=XFci8fwpLm-6v% zb3NbTdfx*)PQ-G|^}aS#9jHz8BdY;;YPF@BTvW7^rq*;NKQ{o`2gV55`L#j2HN~ zGw^RepbA<=+j^iRwYl~LLn$b>4C;8BUEeSscRc~>=z}|IA3*yRA*=HFw=qDXmZ8MB zq4qojID+*`)WPiO{QE-Bdvv#g(iCK1t@R*yK99ep613)taRNvge+y{jsiF3~9)D{$ zD8@i5{$G2)s60x@k;2WcFBltY&l}W9z?{bqcDDmG1YVoNw+|pWR1;)t$$SjQy*L1N zTuCc#EXQ1rYrhVEp?ri;s9J+(tU51v9DKk88k}N0;L&-=17sVB*Zji3qto>Pn(-i? zmM(q`iqPY_r7RxbV;>;W=>?BY0eBd?E`Zi+&9w^{O0A(e1S3x}c=QJRgGqw(B{=`^ zZwtNO5uosL8E60mnw`5r9cQpCs4xc?lO7j;fR@j@&gpiYlX-wahb-fNA>{$P#8BpV)y_miywMuUi9cZ!85x*_Sq17!g0@8-fW(?>11P0*wtD>k{~wfYKxt+MXvd^Sw`&7v5azXyN4M(= zaEWul13jgI_V9oOqH4AvE8C1rA=9Qak4>0hz@`6eumgd|YjNPs~ zKvT#EJbFbyqe38$@NZ{GYduiP)?B-TvHUi~3#|`8-A~sY9*k&SegUaB!Bl7K2N3Ug z>yLl`K^wLij}_^gv5V`;b!7H@c;y)(o5u8knTrngDXpR8Tm1bc0<7PvZrj`L#K$UuQwr&7L6-1*)XX^n_^n$}59>ZY$kaWG{-~a!|S}*+j|6kjq8*H&h zXR83nel#s0H$k*WfMi*Z$?!0Aw#I-q1wdn()1#L)K!lIsHM>VIYr7bzr`j6u|NsBv zu1i4G?aLNW_0aA5p!oqK=nS)hZr3H&U<2v|kGuW>O=QDr`PU)cu1i20;t=@>JRfn$ zqZ@3ZM=uYPNAFaSGd+4C-t9c*(Ruzw^GVR=jj7-O=mmQN+RuLkYJ^^_ebDT>gwdn9 z_5lNbYauw*P6f57JbHUUnE-AUXbky7!P!UYnsm56CR!ad^+F1Ubw9hpzk!--eIWpJnni2)Eav2 z(0K!9V|VEZkaaV5{r~T1d8ba^rSpL%Nb(S9T>#?&AI2B(w4|~V6gOZKx?S&hG#}B3 zM(w}_dq8HbI`=|yI4ct?sG-haqX23`vwmR_U;s6tJvv!mf|%X1k61wRpqVt#ypSk! zIB0YXviIcyQ|p1!e2-q+f8V(oUT|zcD$1(tLBlevTbV)Kbyv_-(+-br2MO?QT5yNK zLBYfFP#GwwcI*SCBv3!(_%2XJ0I3G4^kDSp2K7_CB#tpKyg1mx$nbJGXyE3{5e9}1 z*Y_Ts_g}Q#Vg!%vceC1nT^ahmL%^dKRE8ga0a}~d?Yg1$K&hZd>uvt22l%%gumq?7 zQuZAn8(*`6OWjV_H6FdJJP?P1R=_;)=ybht-1Q3Rv@h^jOm~1px9b&9UkEgfdc&g| z>h|u?DJR_zTrAP`tW+@aSeuW&$NYSn>>If+tTe5VMD$u6##}`xfxzauSH7iy*7*t-K`*BHNOyT{=v%M-Usq0sFDV)vjLql zWAK$5eiVetS8nK05a3l|tq1t0fD&h?>z~&pFcENa1&JhqMWB_i>z~&_V1DZX{&_Gx z4q%b*7hpBD>z~)UV4>Cn{PSUoq`_^ueW1;s9=*0Rzi>0WFtBH2cnK=SJ$j*a#PJv5 zpq2Wr6CllrKMd$OrN^U}71Xo?Ep>n_N^yN~-1QDLr#t{9Gf=5B!-El&Qyw7Ylsllo z3rJ3RxDAw3?m%)1NR5O?Z!fqef(*xO+zQStn5IF}=?hRF5mdr@Kr#y`<6HojEtak) zz?tO&N@jt`fiuemq|5?hqhyu~(0p(KL}>w zn@2aR$A3_&g=Gz^|DYA%2SD5N^+C*TRt*pZTJ+KlZa@D3olgYSqR!uX1XOcFj`d;v z_Ybc3^FMwDP$Cn31rh_V3uL_yVs^X!fG!RE0o(5X1Jqdn4Zop^6)^dmf8wLK>2_V;Xv!;S{LJWxl zIjqK`n>7$2<_2PRv)V)S@$Wle>G}p#Il%=Gpfe|5TmWqZ1RV(zx}n>3jpdKPyl5|aJCZc4m|_PW{`w_W)rATfF76t zQUfX!z-w3_g~FVT;6ee@G)SRv1GJ(SGSvjGK|u|U1JFWY2e?o;fKn(xxkSQbTrw79qJ}DuNUWJ3KmBOKyS+g{WUhg~A+Yp)dhfC`>>p z6!iXqCY@t`fs>6W|2Eg{kP_hsB%oqJ6D2{_j0{LCuwZNKx>;Fof@?$Yod1V++zc;@ zmm#H{r>2YyFG2afoAty`n2W4Dx>?WN;Aa3kqD04|oAtmA(2RqF0?2)!B~Tlne6WgA z=tN8VU(kRf>lBb2c+8l!6T}3yjXGKDK+Im&?VzO#;AHLk16pN#@Bpm~uylPtFEfU;tuv zvugeV=OkEhyhh-06g)Qo8g7gQltP}V#3JqQXV|2 z%R1{iD9kiKbLY*V!m8JHFGxKTvicGeP%GGWKS<)`5|BZlB}54zogNY%-K=3C+qxYD zz-b)Z8hycT3f8g$q-7gii!N9TXl;cuSPKJ^j;kO?ffhk}bhEO8WP3r4KGt8?zyTrv z?JNb}1IO2sYamw}v>qt+_2_232IlF2S|A{Y9lr(&qD!3tI^C?xzrzv;=t#1)FomT& zka@O_-wX_|xgc%6n%`ifJFoFG9Cy$FHLbf@=X^(soB5zcACOXf3W(Xw+WP}!6a1LD zb>1K@G;T^OP~)cY4X84J_E&mc_kc>#$XU=*w42olVidIhVgfQBVwEO{+0Cj1mDec& zt%=Nf!_Dv_ZZRk-ptEEbj2IbSBv&vpyaXNUW)+FK80s2ehf5yb4>H`Uci3`36}a0x3}6SmW%E)O-UMsO0xYs@H-F zR2=;gzct{}bjbBb)UJR^Q=YG|q)E6x^56#p!wcmyfvjH; z1J7JFzW_}i+31zHfZGP3wHL1NMu1+4o<}$9g3I7C0yL?`I^{AbKk2j{DB%KkDqjjS zGC)>)zT^a#6X4?%Z8E_N#y}@4+IW_Nj!5~j3)Efm=rw)&5}X!aXs-sP8~&DMpt7Xf z^#^2*rPuTVRGu3u-v*NhE&KK8HQff4e+^D|C0QU(fSP2f2pe5Xqd}sOW!1f=-B2An zAv!F;a^M-AUegk&++2tp_&7+IzBs5{BUrAK9b8_$R`cj)?Y{&G5YQ2t&6i*Sg3`-I zv|qu&-&qTqW&E)V)JTAjU1Y2Pr^+85y`T|uP?Z5L?5E!Z6)&P%AWJ}v&`waL%PI}x zwjKZ<+sTixa~G)idCdy$?SMSi8DP*Y`WUomqTBUHXMhQ6tqCpk&tC+)pT7mvJ@x2j z-G33}2NO%zKm7e`K~sCRe;6u2&9Sr>+zc-i=7VDl?EM#$^cWdlgL;M8ASqU4sd7DV zNnQk!cry>A2UNx;gUt2-mE@5iTf316NQr|+>wywuk6zm>kp4Ar{mLLo zaOEKh){jzooYF%rIw5QCU)Oqcv%bCnE>J+7fCnHZsN(Hpy$WLXvhsnKbb$KXpip;( zv=OOMQEy!iic;1*kTtCbN`yVSS(7e61NRPpALz7G7ef|^zC(aov`VuKp;YM{7=tYwC+k-xPJl%Yz3AuVnrnYBlwO7`dGwhD ziWBg3H~82`%{icTAfZ1zI+;AWMNgjxHG)9F0ZWXmJI?bnK=$#Vq-Fz;&e|K`{SBaj zy-wF3$6ddG+WugRAv4P?NzhGJR|3B!=RS(c~AgDR* zVeR^&m>=9ZhZbcqCC3_SpEH!QcDsIg9f!@3{YxQ+yq1N?3V|F7UgZs5akT&{ja9N4 zDmmdL&;S4bF#_fVXr)MJD7gC%ax^GlUhMw|S~m$gP?G_Y=ek)_&VkztF5RM0=Rhm4 z|1e%?{^43@0`^GfL2wxa87J(u?S9J5@M89I&=D(|=Rk8#3=GY+cN9w5p+l!&jsmF3 z2pWt4d*SX9P=oRRS?DPj-_C*}HxyL6!jg+NXhdD~?pdhiovfEYifiv!l`5l{G#PBt zR*)pngZRCsSDt_p-SHPT%Rm!ppn1yL z2MnNX?6N^%1-4tCa5KEv3r?DdvrRUrg9blA8%0>n&q93c(arnfEyx$H4|aj>9e_4J zYC%28ZdP89VW30pzc! zxi8ou_Ocvv{m;O^&GkQ*>p#$B)A1K)_JYn)AdJV?GMm=TRA9ucOHN7 zU=OI1{eyqoht3Zk%?D&W5L-5XTJnR24SPKpF{JKU@-uYuFui1lG&A7l>%IexLLe+j z+z&c;>_s)m5>`u?qYc2025sI*0!e^cDVVlb#u9c)uIu;Xl|s%z@j=w-#Uzzm|mbKvsbaVfBI8=WNN3 zG)U%goOPQ8B%>T>-C_YbTj4nCIyh?uRF;1m>rxAThUOED9jtRKK)n#wsUZG?za6YS z5PmC&e}bihwZ;OyP692c+5zf6zl2n--K-N{@iTO~e(4s?wgCB`H3sBpa5HA zTm1?wJ_n=&JiP(h=JxIZH^YmfE#MBui|)`b;DiCzl@Hd%YWf;v!SNS~7Ay>)RRXS0 zAnUM}?gAx6XOIg)rID2dC@DSx^?$%eMOXj%{~r=NHDHBGFolv}uesi6e$dc-g1G}c za041xJ>YTN^#Z7j?hbw8(d&8uGUl+m5WQIe8t!W}hqjuwgQnL-t3cdt)@*Zr28gaL z8yFd09No#l0IqqvSsOuK29E}?hMDs->;pG|LF?Z(fC7e93#8xD^+O40-P;dPvY8Ai zqkedFvc5F~g&JrWlaZ?M*vW>BpU%=n=@iPV4p{|`xl8ao*n zUUY$Ot3j#uVCy46Wd~@tH>jlx+A7lF`n{Vq!;GK7()C9z8>l5x$=S^sYz9g&Ke}1{ z%s@3@U7SZZtG^jPLwD#8kK{`p2OqJ3CTP1IIQX|QSh#*KwF4K?pk_rkt2#)X?+=gU zlO6{jvUo6_01vK!VjmI%*XM!?ZP3u&kLCl6FO?Y)I}Niz=Zu?ztoei08h0dX4uI78 z{=sQY0mK>+Q08WB1}S#^1F~;3sOjwbhq0Tr$Q0!3KQ&$5qUj)c)>M$dp&IjU)@V~u z2=jKb27x7fO!*l+W0nif85?zQ^(8|wJ#coy;6L9Di*?RQavfSl{ zbT41bk!NIh=>%GL-tBq-w6X})*f50i1wgwy!EGPVeNCONpusKmr=U{A^+Px7%cr1J z_XgB2fQUT+jr$oxGIT3wJPXn*>$N>~hnwMr_!>~r#5y0OpqqCFm||V{jGti_XmJO$ zNg>h20@@%v6Qtqo9*_pt8;~ZWJZK&dtZBjxaBB!ONDMCC{68=0NAz=eXYF;eDC2Dze}l@p}Y()B|rcQ-4mF(_!>lqB$PW4&tx8Wvz_IZ!J4 z0(2)4|2EcBAR$oEeb9)X;kfG$Q0EXl?AXbA*a%cqzUgE=WCV&F&{6)&t;~?F%6P8-o1L2%6?TRH6X005nYSq7H0<3Csd*xCJ83pgDYmYS5w2 zF9N`-xnQap!R{}ITgzj4h`$BYJAqo^(ao9%lC*SvPy#yL@C3;B*Fk$uz%$USh9F7M zc_y8#ZeS*>JeUeSfmCvX_AGeubc+fY@-t{&>^$Ysd93sLi>z<||MPESWd{4~ZwKoy z1DM}=I$57WIH1TnX80W8G{3 z3aQ^6tg8&rTJIjsZyX>sYw~(<#q|K%ii7s)Uh0EeTdZrr7Jfl3Izj6OKnnu)f$l8> z1w#6Ca3lYMM|1532L2XEPr&uUF;FoKp8N(EvY`H}rw6FK2Q3_cxL;>j!JsH#O^_bU4UCAT`w>HQ=hj6*Oad zqVxERhIL>s9`NW6J>k*q3)*;c0GgL|XMlQyZx}tgSr6%h!WQAxL!fI%m_S|4V+{Hp z-K>kyvEn|K!21 zb>OuqXjR6=SD>X*oQFU{hd%K~9O!0k(BlU!*@P)PfvND+C;o_&pZMcI`y`WWLESG? zyX&CZ@HlwT@dY0!a=TgGK~kLucY*F1gmspUuX8iJ$eZ#1zX!D5dbt!FzM$D$=%EL_ ztbE`Cfdw?~!3;J7TsZHT0xoubcp#1lcnZ$BEKHzy(3}G5#eaDX>g}Gj0o5$W_Jewu zFCI(*1=SbE=Grg(b&o)8S+rh_vMxVEw+NF*H|tc8zFyPS$j4zhg5wu--%NAu4^I9z z&~h`6Zq_W2($0gsK$jT8JXd#(o8iSoNNjpRBi5k8V~) z8&I@=@#r2A}j0`X8e*ORd0(8yci)kR`j9_I(+WgSH zHl4>`WGrE1fb5Juy%L<&Z@kEcD|LMUK48E31s8N_$ODgFk3XP-4?JuH&Gbdl%%CkZ zH(0UO<>tj`K63DE~?LF@z7{Gc2l50wJ#3%>y#d4~Io1w+c? z_%Tot1nGMo1#t?JKG4;tAgME$QlPOIkkm#@DNs)hBsC3F3gl3bR5fm?1l&@txTUl( zrC`qB$1U|G62r?dT{khMV2{~3*7n!jdeZ%`4p6jP=?|_qeY-` zoNiXRJD{FDY^96%g3s}@MrpBj)E=^!(@Sqq@9fvm_(x(%O>48P6K@Zus^sRKl*D~eKcgi;-l(q&+! zk{}BdqCp3=@o7LtLb_Q`+ywPDOL)6kzp3+swz*z;fLw8kl*xGX+UnorW_amLzNZ!Q$n z!h8Tt5k=tk^fELVN@aP2XWdjSjbUtFd03K3t zeUa7~0GjoD0Wt#Q5U4Q3HfHFg2&lN}>H@Wnz^9a-iB~?nR85le}kNCDeDN*z2 zwY9y$&G6!V6R4>MI_v8Ocz-WwRXb$%@QE;J8)xkW(2-Q&$s-AmZf6dU<|7IyCzd&e zJBGoQre}a|{^~59(iu9zqtmy;r_;5;r?VGy@{c2=%YNK-1p_!dSv7WoD{SzYoA*G? zz%;N!pz9toKz4VtGJ_QL&H!~s__qhk@NajPO0zsv$^lwl?f4huMNlw$2=H%rmgx;( zOzQ-xIRIMs(0Kv0@SPF94-2%KpYeo8r|Sui=Gqwyr7|APwH*wg30l_)iz!ob~AST>%NZV=sdLfHMSQ#v2qM0Uq7X0+3bw z&Y;n#6WtC82Vd~0GW_Rfux0qn!BENx3YV9y;D(&*3eZ9?t>)S(j3pAywNsc%gqmxo zu$J&N*G^#r9e_E7uM||4gX{#E4pPHcV%1zbg^#~omI*ZZHif$cq@SC=ofpDqFXsm7 zE*5zSI_j;tb_xf73up`KOVF8@FP4UZO2ES&-K?$Kz<(;3vQ zNCQcC&Hza_*G}OsVRHmGut047mZhM*wzU(u`CDd#wgp^|0_D7;p2uCG^$M%UHqf?u zR|cO>UE6K^3@=N-A;~HTGPE0Ps7LE<@KU)OSGXBoc+`WkDKvL@2{1CebOCE{7U19J zkkI@9ybTJpzd0BjrXHOE8qKvwz>WePumEO9H`h+!E(!JN);+zIpTV=+6?E{$fvx-u zzTK$;uMIrAT~xr!>NtElpTBVBWMJ^^u2GQy33GUMho}gE3ne>ND-?6$nBl3J0MjU zXa}4}cQ7RVVM%+CEg2lpI%Ws7Anx_}4^Bz2@#RwgoWGEA>+ z)+T<27kj{Bpp~unUlfKiK&Q(+x>@IJ;b-Wc0NUpZS}(GNpTULkQzw)UDlm>@fcL35 z#yQ3#mefLOA5c34)U%HS+1h#lT%7S==4N;?y%s6LX7YiG3RV-4qTU%G-(wVKMc^?h zti{<3(1^27uL`5%aTXPD^S;~lg=eRW3I{jArk+E;JuT~H|#BwZ(=x=uoLSs>{;3DtG7xpoT! ze+zVp){brmmF6GJCB+a88X$H$gslT&gBE4&=yoswvHc<9CLp#mglz$0gHF=}1=^$nR zYvO_1{G5CKPVnh`0UE0S?Z|t<=8=7%&{OlMPv;BI&ZAzvB5y$^fcLI4UhwHw0IjkO zJpnGNJS-2DaQk+vsDR3+m#-NofSNl3&9z$?OSwP_1YQ;}F))B6onHJ80u{?g(9HAb zX7KD}0nPNCfafw0LjX;kPp1M#HeUUOxGVy7KEeWcYVULfZLxp^8#FK-1bPEN4S^k? zA>HOfd>-8_;FAjre}gQ8gf>r!6gY?(nt$+?fV!RFnBn7Z1vR)pGN1+LKHUWd2zG|W zi{-)K0Pt;nTf*nr?P>w?w{K^v1$g)tvMH|HK>;KR*VdV!un*Kw*bmw-{h}Z21W=LS zAOH!BOU!l(25i=*J#3;YTNplf8H<5#RK>p?Y218A=lXx#_cLOHO7 ztf0$uJh~geYvMYOzexWD8|{n*+vB>UJM<3770rh@z@Y_Rr*!;ApP-?|JD`D+9o-H*macdBdq5YXf`+3# znvXa@D-lE$0vgbVtIs-I3x>*;k1sOE~9E{)v{RK*M#Qk?!L!<`sin3F^*(yHT)ZODuK& z|G&8I2X$UIYsgBFZJ|Frx_x1z-Jq*XAx9$AK42(O_vp3#f0~=&MPwPsz=Pn!6u=V? zh;E55J17u9om|j~vjQ(J_=C*{4WWNP>g9sg>%%&aKRmiYz6H(DgS%RA|0DSn95|q* zxBY8Cjs&Ny*X$n04}h9a9^msroIuTs31Df6F_7LaYb{s^bfO4Y_yRa zW9@N+#-LMIBND6hDQ<=ri%USU25qD+Wd+3(tHWy0QPm3s7#SEG`L~Ct$bj1dkZv5P zFn58nrGe;LZi8+!63N?koU~zT?iIE#&__jyp#{`JgR*pd$4KD0Cjq1&^D6 zf)hMg_v#`eLwA5g^C)4xQ(ss&zyrm81^ zg+ML$Z%aXvtnWcoCu;>*oV5^4f#dO#$8pwcOCjrwCV2Fwen4p*dUUg{1!YI@jl12f z3qkB|2GAM}Xo-d>rXVd{&^XJD&eAKLp`ao{wVFy!R;Zq`FbLDD6l z-W@oWn9hPVgN{R#UI`k7;#~<=kmS)V3sU>y+f-0V09u%F`v_?C|0d)Vp!dhQ8D4Da z2SqVxY~}_iGBa8}bD(52kIswW5*^ZE=sf;H_B|wXM;|=1axuJqJ8ycw`=U0XljW zGzh}FdO1j`>=F>wc@JFD?3xQI+dIE|bYA@Iu^Q~)6AB&96%bZKhjT^R@n+Bo>5L3% z$D3b)9IKFaycv8BABe%h$iR>RlHy`yVDJMmcwh|BuA2&wh!!IQgA0hE17mnFGB5~$ zM7%(K2Bx&*%|2j8H>=5VuopT-wLy-Y;nCR)siau*#o!q$MGQ2Bexb7&6nro4P60)K zGh|3&Gnnda1`SDo3sH|=(O2N(T#vul^BNRhkXnqf;{SgS+kc<|LQon$b(EXo#hrYl zG<*+q<^`z8#!<|IoVyQHK!XaB7oeB`6#>VcLE*vR(cKJLQ{n(Flsr1YNd`1;EecAY z5+1$H;K=S|-3SusW)%YEba>|#WH#u&tVR3`FaCo{@XlsPYmW65DBq#0V+E`_KShxwIR4h!APxezk`|t5Wic!f)sHc-K?_?!u`&d%*gPf&k@bxwJrf596Su?;oV6#?H2jQ90AH?it^#D0S6DbTFQ@fYkRAm2mUulF)Q4q-jB2vjVx9tBhIj9^y`I%Zb% z_#)`_b34UAc6VO??6LYdYwTi31$&$|9L@@avOJEn`XQL!2&M;u=?Y_Zvx*&n#{s_s z`kGc~+S39#4VsnK9Ri(`kPUJFbaH|sVm0MUXu{gQA7nf%!dC8wN7%gm z{0uK75*ZmlR|5U;@)OlhJhw`jT zv^{!lT|thUoQ34L&hHEiufdl>G}r!NORARFNZGQtJ4c5p_wOY4JfQTv791)0g0JV5=tULMeSa10*3qS7GoP8Pv# zR#}jN2N*k9ML>+)Ka8L?jFr<~thK|Ez&*NIPc8tb(Na+1v-Kc1!;ABoNPal_je+4s zksTw$YquBA;z2D6P^%fdS_O8NhQeO(SsILGDF z6`{UsFEoxDp(-G8Tnyzw;+P5Kxb@(y15JQSzY-D0ee)4C5wZAmZ43KB(vi#j!2OKu{c;fEb84K52s-$DqA0;3K8GS)a^A_UIG({BG|!Ep|#^)Z888eV}L#XeBM(#Y2OfTzY z5Y_4W;3a4b!K0UTHHdHN`T)G2CJDspwKWD=o(r}dv7aX43j@PT&;`bzg1q^Gfk*QX z0njC1xeq|AJRX1!;bLHT4eIB=fXFJK$buG+fU+m(bW@OC0~A@%9ue@Cz_js&^@4*Q=c^Di5UP>u?9Dmn_sYWgKo?& z)j7^8G7nb8fEMV!V1X=~2958z-tg!RU;)kYLc~0JS@WUhlsL>#fi z;`1CxgoARmILPBaQ;|IW{u2Yki#b+|46ma=V1=9z5eFi~AUSKtK5m8=NyyHM06B{l zUeHD-=%GKK3c!c{{D2(#qs_k!bO3R^4RZ;|cPl~0NFy853rf!WKubo9VM>`wc|ogD zJvv!;&EaQw4H~8eEhXLxat>%jqLX#g9Daruot9|M4(P1i^P<=i+^=6S8xo|TIywYo z>9Q11m_Q4HIUgAqUhV*&Gs#*8QVAMjIL?|r8&X?>&W8b6)_R~sA)A`Q^_4xSvDnQrAi8_MC>}T^cfQ~8abiLEfsyCaT0dxeR z>zi&?H4ys;Bk1hGI}DW|cV6Gi&G6!1GLk#Ld|+UBDZmQ4q2T*0h})WL?=bMUIDjkA z7odjX>%eZ;7uv3OS`SnxLRcO%Jem*iA+0=IJqy%uU}1uGok4dYf$JpX@~R!Arjtbw zv=9&8m6)txc@sf!Yu@AgH;>MPuUWyJqi*oMI;eiSJ`M z*jnAJg&_C-;4GEz7Ckf*6fFm4LZYA_tH~b~k{#IGwH^UVZ?@GOPbgP<6pmBG%370%r1pjI#tY`AS1Q zx>?_X^tB!+)$r)G7OPS)=;Kwg?S6XY!Z7I)B`VK?h3uzJzcAgYs9W*R7HL}fu#H|su-V7KUg5Y@>l z021sJ6$DY;teZfB-J+X8R3|G7NU&3s6-0HjE&~a6i!KLIovc5mg3bI1qPkgUfdson zXM?Ct);A!*PSLj@s++YBB-kz55289*AAkfqMIVBwZq_D{V7F*9i0Wj$0ut;Ly$Yhb zS<66z-J<0ns+08uNU&4%B#7!}%>oH_i)MqUPS!mj!A{Y=AgY@+4kXwu8V{m6SvP=v96kQ6Ux>?g8g7c^HGrU|22}a}T$aAyM?rq+5euftc zPe4lrTt9TP3eNz=Hz$9~V$j_24^IB}LtqAb30LzEj*`@upq)G2q8`&h(PTFrl=8Y+ zA#~@3<{ymU?uF7WZiW{k2}n7e>n#JrOEriyazM`LWZerk;`20+eO%CE&R7pj=Vy2g zT9^*r<+Ugcu{PP`IBWZKNEvaQbt;tgTBn=!>@-kX0d0n9o(^V#5_1B`4$!KTPS#M6 zk<6fDqx=( zbiL5c3UM!cX>7Ns2{<8vS3JQ^_*nQH9FCw>^cOrJ1HBKx1HBI*gNvZ58O&@wPzoC8 z1s$vhT9fhsvg``91O>cK3^8tv)NU%73MunJ?WPBy>o7LOA%*aY*9;6VLX8<2UfMu{ z*%wLqOOWzrWaX70CU4|tcrm>ZG`<8HUaZ*w%B#@f#R;3a8D0cegIXUr#~ToR?qj#0 zae16oYYHSWd33W%BOEGX1gc(Rf1pNy2I!W;Zr0C}ArXMF3NR2R!9u$wD!LjY2q}k1?4_D&R&8h_Ez&fQOAonzby5y{!AZ9l!6I5OY zd}`YlP`E?nUxJw3tdBN;?1SmQ0uqGCpWMLD@S-FGG!g)s)Y%152Rd$v@c`%$a^&;c zK}T@0&VZ<}(Jf_t!5zfN@S@uQ6s1QrP#cucK3W#YCeY{xOCjid@&lc&;BB!WZ%%0i zCoIsS5SI<$#r)7a-#d@LXa{W|>t@w~+NA?N)l?2-7R1%UAXoQ74q*f3RPg#iTkvkP z&wA-%N^$p0W z8z44)=yv@BUQOfr0o*hIAK&!i-}C?fU$p5XHvvIK0W>8RLhJGsrejtEw}=!lPUE%LIOg7ij^YaCUZh@d$L33Fs_Y#Eb=^<$rPlIBdXUkDVZU z|3@OZ^XoGPh8K(U7#UuI>KMqzS=kt72GH4StbG&s8PYlf0zA4|tJfhXvs}<5EhNH{ zK+JB|Xb=Tnha(yQRjLEJWfRhK5DS2NT^8ho8e}IFJp+4P5@Z6z>wN3@8D8*$j&1?X zH*$bH09iNd0U5TdiH17xZ9mw7LHo5B7#LoBkHQgE$NC{b0O}rW+QQB7;!gxp5PW*d z!0=+eE+fNhcvPkN!`(Xrr2Y)D`a@5_?#%>E97Eh2x0avbMJ&h!P*g>LY=cCVf=9Qk zXFor~i`{911XS4E02MGE-K>4R zpb!eEXnu6RBcKAb4iaQe>w!{3k6zZ!PDqsjZd1S~EJ1ZD_%0Z5n*y{}`vz!TH)shB zXu8e^q^XL1V*t{^)>vz;J`!(b8g$_{cRF=Wk}AV_QLff5(c`EejN=h_CcMg(_(9N=F~)Q}XaWp$PvCDph8G_%LE;9vbcP(b3B7)` zb887`xTJF`=-~IxUeM8zE}gBQ1BP5WA*aiBvx@hCL-vOU^v03ntRLGUZfV{N(p_9) z1YzWrXnOS8T5SZK{}&3%$%i0k+k*}yhhCsN^9cjP%W!4}2B?lwZja;OBiKQ%Zr%&B zn4v_)qt{jlWXhWm?513Q2udTYb={EiLmo2W4Kf0fBth3@dvvqLf#g9KA+gqUgM*O^ zB0cTj|NqT14`7#JWN#A3j1*A396fSs-zx?MLM ze8FQ0J_EQ!-=o*IV*@wC3oEdT4|ao3tcU0a`Tjh3Ci8{-Lk5PIk>F`t)`Kg+p?cs& zbS9{Yvmd;99W+S*-US0%|G_$M1t`6T?(YzQ-2n|d75=#E9Z&{5?s@~%Re{*!0lJIf z!pnAW-&7vr9~Fo@U3iq?G{1H+4F@vzp24%kNU0fSgtBQhS{ ztXvQkHo7Hz9^I^emV;c#V542C16?6?+!Zvh$N=k0zlih%7fCN*E`NCq+|*?~1knj< z_ssC<6@C1ZkAZ(1QezI3lG@gDGrV{aggp&hzR$q$64XG4+6c8Da$+EKKq@f~JRmg# zJRnsn1#^@~x9bG(p%>7bbY8piZ*v7JVlD-(RRdjS@c|y>5XBE(D?p4s{^FGtDAT$k zR6vb^+#bvd%A1h5fLxmmT9*F-6xMv;LrEMIKx_Sdzy(w71CMUs58a_Rx=ZiC?ks2q zmAMxXeJs86kSvU5*uf2;)_5prWjUyq1Ul^_zXSOc22k|{DX&0Qbsm4QYaZyXI{udR z;PeM+`&fexgan;{Fbhdg4I~KK5yJX)DJYE|e-Zwl8MMdO@-TmUAy^@6FsQ@>jkba= z-t_2ZeVhm?K}DZ{s7_W>kZh-@8Hnm;y$%xW7QF$YI$1SAf}NsTAgY`7G)S;p^bCmV zWR(R8c8bb@sBYH%Ai-|Y10brC6i0Wot4ifAZ zT>+vxS$~2`-cHe9AgY^nHb}5rbPkB>WPJ+~>=bqC%Wr|2UP z)y>)r66_Xj0a2Z-S3!cEqSruFH)}aauv@eOM0K*B1POMEo&r(btl1#JZqXbN)ycXS zB-kms4@7md#)AaAMH4_&C+kL#V5jIN5Y^2Z3=-@X4FOS|tV=t=#b>vF&mVG!DI8_4#;x|UmMnuQ<)DcY(SSKHm~Mpc(K+GWCddWLgpR=1D2ZB zz@xJkeBc^r1RuIj3*3MJUD&M&x}OcSC=Gn*KsSSjHt0@4*9#tvwHH8}tI9dRXa6XG zDkRVbTu=i7tQo2iG}d5ue0bgq@Zou&Rf-_(A7JOegLdM< z1b=uiUO@D`q3bhITZLGY6vU4Uhn|r@zvmx7c`9Xg3$vc2x`1T zoe8RMK#ew#{SUy$uee?Sos0vKwsiearU?lEkb(;yy*5l9AYXKsLN}*f^yvHrD&v+y z4j*~|IaKfh_;wQTz&&)sL+AMyJ3>LVjq3*wMpw{!trL*FPH-LIGw@G927Qox9PH8f z2D}fVb8iH=#j+K=!M$^;2bk9j+LGkc*$Um4ol_4=Jgz%Dn)iZ47(kU3L=M&@gi{14{G`3LcC%K)Z}Uw-@$w(|+#6;O&_xuWs~|ixbfFi;dbdJXc55`mAOa~F~1hu!okqfsJwA0{$N2luyun733wAvXAC7{it zGd#M%Ym;YqbURppO#!(gz~D7#ec%HR#4frAU}tttfVddyT}N;*bh<)@`$~*Fx`Sa} zj=<_eP-iFu94OtPkR#Ngx8gy(>v{lkHXyGDbVuXMdT{81O$C(=8lZsc1WlW+c$or{ zYR=sNx(8?je?91o%nhBcOF&71fq{YHHP3O^C7_`|kLKJB{2tAh@083Ei$sKqDBgD-J$j0bN`K zYFmLvCqgH5o&q;>L3s#t;J^jOm&d^66^b>G;;8utQ$04@KvT#d+Y}JC^?HDgPMiSQ z!vM9Uv33PR!~g%ag2!DKfEXT)t}7TC7#Ln_c{J9p_+QV!0J?=~0f^zzm&MxTVJ!_(4+quR#r0xTr^W=mv0bf>zr>f)jj$T78p8v+D^)kIvW^pe3B$ z(vXeBzd=n*&?%{yxejzeR0*`~$C=ka6(2Y;A~KmYJd=UUJOIuY@Z8l~JHewHG&=w( zy}Kc0d3P(QWQR^I2toV}+HrEhqwxr+=tt@wgK7iNO%WcQdqL}`Jvz67mQ#ClPUV2q z2A~VsJi1%Ka-batouI41q1*;gU(BP^wZo$uaxE69>;hlm1}fM<3)!IUd5><^o;RSY zyIgO)Jk1TR;6b+-ae#_Te*W#O-Ea6ncWZXKUU|*Szn!%T&V}So@Qn&5AXgw|UH~s~ z1?{Q@-GS%Y@G=2nAZRx)sB{9g;UB=Sk2~Sf-2mEJ47#4-B@aX;=ne(2)u4shC-}EF zfL5{cZ$ALK*$|X*K|-Jvt`H$`Z?YTggbm%U-~-pOZ9E2N#tmS9gKLtPO8510fQf$6p))iC7*6FWr84myE< z`ywbN;MyyD(Y2?8L^KbBHkX60@8}GOcx?mgTy-9Q;Q^8c^={xsgn;Y=9qimI0@~XS za;^Y4y@EDm21Fp~<(SCG06K@LJ9Im!R@F6pE(%#TUbHLAOa7-0$-R=0@(=MPJuR= zpcI1#HR=a@Qw_m1Oa2kiQ5Vz-9|Oca*XK@I-@7hgt$>Rg!E@fRxKpePAJa@DdfM$k5i z5)&k`Ngy#$s%1@ty6f{UekW?0qVzJ9Pt7#xt4;}UA?9?P?=R=8BpNQ z0JRie*CUi9LY1^5l<F4|KcEfgCol0n1?nGa!czY`}Ba06f`N_h2Mj&R(z(a9IU&wE=2>N z%>k%aK&Mr=nt(6N1d-e&oXvYd4EEA$P@}i=5agCr(CVq?1B_t1L9Pay+IjKdL!Rz{ z1jucYz6R|RT<|&&bRLICH*A;a z0?_F*;PX(rT^}IQ5ct}~ZU>3RN1)xo(B#8`NIsxbd=`M(C!qE{`2Ok@pu7j`&$oix zl;Dw{7ao?b6Uvl4x_u{rPPg~y-U^X}q`uDMFP6Opx7I-mQa3=;*ha`S=?f27Is=bB zGlIr-KoJ6-J%`*y2x@|~9w-6rg9hbFa4=iCZYY(9rc2O8WFRdL3Lf3Q51^MxgYL{~ zc74F;0dJmxX3CLDl^LMXT#(V0t{eDU!F#Dd`4w_DhYcHO7XqRw$5(0&@;c}s732^E z9l(dkg{~W*VThUqL8DLL&8eWA>bjvbzz4|{y6qT6=WehNXk-R-kO6#Fui142sC&D? z!y4Qo!7=fVa1;T^snD zCP5TKn(wgAHh-%YMEC);r~u`7aL<7e)a3y6FQO4M_n-lx;u@2#&jgP96cZ^g)#dXeTVV$KeW52nq4l z1EsJY2WWE~xO=e!d|5B3#{t?n2N6Q;aqPg{9t%kp;J$|IgqNUkI7oQ{-rDH_?vFuE zJX+QWEdU|ht)1XT8h9+M)3u?wb`L{|5Xc7}-JuO0odU;QLHn7Yo?rkAg34}iwZj2R zg7ECS0-Sw8hw{Ae=-vu$YC_|r^Z1MBFHy2D=(?Ftpvh0rs)26b1sD z1kQD?8!Euwuy&om-=qyL4ngNigRh5xB~|bp%-|vkd}0p0d(khybm<0^MQ%QW9ct2dF~O1`U?~U@n&hpYhgR z+5rluo#2CRI*-5D30gJ=T0Y+GdZ3%3`3F0H`&mW?(3!M|jWyYm!Fw;jO9bO5b0aRW zo#D~l@c`U^0G&GEdcdQ%fTP=W4=9C!r*J*GL1T>_pna_n%TbkpM()5l0d(pbXkY&U zkM1B2$eQ98PyRDAyo3y@f_4FgBFhOdus~Lu;?%tiq?-j&1fZLI2_y${6HeV3AQh02 zI}E$0faE}DD&f?v1yTVSzs1lU_Me&Ibv{_DBzQL^X#5l5>G%Jb8D4{~c}91$97vxz zPJP=!`oysq`0O7uXtv1p2a5;jglLau*8`yD^#KoS*A@ItHz8RObmt~$wgohkae;xq zH4`EX%D55Wqzf*JKx4KE9*wRyptaHs4{O&A{7sAy#h_7HkQtEe_57_fL5GupCQV?; zsN1yxG6Wym;n7_>0hBZ#t3E(&%a>2l?hgVTJp{Q}sS`9k3>x4DWgU>)Pe3vrXyzJJ zyMf9~@EQ1>t}k9r0VhUKvjmc%Kw}UGpeI^^&cOf=fr132__rSb2|zLvXhQ6Rho$R- zG8u5I1TrfG8ny#(jh_l#J&h<0U`JE}8^Quetv4Xmou5O%o41tX*#uErB`!lpa2Sr~LU_?ZLGQxR}@gO$R$X zx=X>=og>o0!^ddpAi<-vc85o2=?3r_RGq#HK1pksZI zfxZ{~+XE8P8XwvJNCWq6U0;BDyQdgF{QnQ;vxYVEGx&5TWPnWF3F>lzoYQ>316=&y zcl>_^G`8P)|3yve^Jc|uGDvc=i5OC`;@Nn=w@A?3YyG4{^AZ7NS3t&%mvl_tgR5{36JBfWvQUy zC$NI@7La<^2QNXBAE4m`P%$|X)DZ=R6KGfzIxr1BQl$bSApx3aErh9V>H!Zus)9z; zS`U;)!o5Bai9rg1oUPz{#I8=>IB`=upk8##;zAUI$3*DK=*NgPqy&rX01;E`}4!g zyRZ_jlQlbqpW$^F==>9~F7Sbe9^I@VV4e{C1jIKCrJ%DiZBzIex*I@eRJ0xdFPOg5 z#m(@dOc$w(p0f)yA@Bw?Zs^g?$^$kBGK1230CbER>(6A6^B_Wym6na5^*~6Xtp`f< zL8}(AodpCkcOPOCg5xSkz(7jD2FMWobcHhsSz`*cgzb443pfbyKg9j@} z2-JoHRgmBbVDL&y*BKtY6&xPjz6U&dLsxk8mTvIqcI|*pGtIpZE?YolDQNyy0;~;O zXU~9~nCd#i193nxhz&lV7&JZ{2MT>qoP$(?I_;owBhZX2=y0kP9^Jkhz=koN^3a5o zFRaHvTKLzy-te$IR16CLt#AQQ8x*7g)XKAA^yn>J0lDcMwywhWE+`kVw!k$of_fRC zCL(y=%>&(gpd^1DQuo6A<^gt2=S9$&`ruq%pn-H+7`Qj#3i1kQFk*&Bw}%CCaDmMG z1Ug0t)GR&j5CAQ>Kmh_P#9-dfz~+{;&nV%X0d@;yHW$1w02Yp*<6dC~RbVsdALyh< z&?o@NA>9rYNCttz5bT2jZ~{P_T?6HUr3!0P!abMJeCO*4eXQUl>VB!X?vH>O636S+L z2N1Or>hivW4|qW_v_TD&9Ux~pgN0zLZtlNuG6F@w4fHDpyICs}Aw|5R$8pxoM1BT) za0sy`frLTVjDZTGPF8Oax0}@mM1j^6b+S5wnBA;KAgXr)BM$hCU9tR(=dN3Y#=~UGMtI>d|kq4W}`UT{wZqctGs*~BH zGZ@sBe-Gkyi+%u6oz4Otoxu_woi|X=p6aaq(am}<7HZ?wSWwv}x(`f&woHIluY+jT z)v+iCqdSHKcgr4+1y#$c8)EqxT5p#s?*{v3(m(K7-#(qHGh#u$SqC$FDTwi!(IfdV z$TOadM>=KOz$#im5(gMNS*yX;vU-5r+b!yu2s)ORMa8o-1a!PAH2g)Kz``yn0w8e- zpUwv;{&5TmcIj3P0~;i39}5rYN#K1Mpza4apjE*ZTf;0iiiHLA6{OoZKwAdELCy|V z%?eZfCk7NqtOr50QMc$J5CsqNJs@7U=w1*73-WH(Z6I#9=ynj*>8#+<30j=Ox&gv9 zK#vn}*zS%2hwYLWXxN5=4nQ#b3k%zx7*NN8xZW9LdAF!b0%{=JfcY*e0$2jpqg&P$q`CDrsIkNB(aCBS15MecAn|Tl zxfpnWgUW&zZJ>@FIKWxJj*x;mLNEpv;GmSv21(f;qCtLo7Y+5((`axo?}`UeqPsy9 zJeaqFc-^AgKolaF*Mqp-q8mUIBA8c#xZR?wKvbu*fk$Vs1$u~sZZPO(t$^8_54Kq} z0!)EYKd65IT5#+ZjhP9OqQMd69Sw~ra3<*e4T~sau%|p>MmvBQpol_b0!6S2d5{Ds ze#F4GvND65+bzlxj~YLJz}a2&ZyZP%PbTo_mVFroD(4Wz(9I}*hS#Ak-KsZ065X-~ zqu`MRPFy#^i-}ub0g4D#u>GvNz-5W(?pRQWBTA#q5aBIgVOT_Xbc4%Dk8aU5 zP;muNDW!p)nLu}&ch-Wg+S?KdilhT2;U3+rDO3qD)q-wa_`y(;1@3}&2MB;v%mB?Lbzbmj{=r-q2V!b{BYa@P2y%iviW7X8K%G3$xGqDp>l;Q2T~ca&oOORBvKK+!N6>*iKRC*z zkz5nP6apFtnb8r#da2p<1tZ9AkV8>p2+jR12THeKD5_z7nGPD@0GU9k>qU;UGNQO% zj}dh5@(Yg{$6Q!1f$rPB)N+8o44?H)-`ZF9<`+W}QXHW$-Vn9p9yIG%vgSN|+ z3La;@7LIHvTQ}>;aO7P`pe{i38}JFO9-XBZx>?tOb(W}mbh9oG2Ne*$7mRg9&erQ>k3nMy(3 zYtZz7fJgHWmQthRtV^KAK{k26v;dX!tlc1QcCt?QtICI}Z{7k?}0?#$z?PGOK>ec}2GbobyJ@S!;!kcDU3OXq7mQW z{xdM}_d~X?h&F(U;|BcHoxHr_U(M=*?9oGfC@5-2dZuMbAtL$rq&D$ zpt~)=zI-iuob^@+#L(9)pd(elJ$lU3jUl<=#fzOkKyd+^>QI1Gj-AI}Z1)Ba1bzSw ze^zoHcl`sh@O2VsGfy(;@RSdr5QoK*99S6As+j5V{U11nK$<`ejMuszjkO=Z;SCZ3 z4Yj?N0t@|TV5kQPfdUP*ToPviIgI645z3B9%zW!wxeR;^-S zm;hD_as^oJ|K<}8pd=gmqucchB&EK*4=T>PT|q7Y9Tw&3(OCNe6m)fB5F?L5j8p{~ z84kK-tsANvmUKa$67c8_ebIRlblnvw`M>N!Hk7F}9Bk-+1_qd+ry+)3DCK5&!Gvxo zC}Bf3toM3_fQBuz2SkT5R`JD3Rk~m0?qc_ zfL>Jt@@6MwQ9gK6KB#$jjphdp%_o>TTyKE)+=0)ycD>R3pdKXB>v{lGR8N*=VDJF5U3Yl&vR(%t{0^FN zK)8mfgcCGBn8DBRn%$$9RYMch$gTb1(aRf~$WXwGE!<+0O$`7+|&rrYcYg*US57 z7a!=9*3+xFK`o4Vpd;gZZN)SB8D7ke0F_98K!>!JI5pS)VFI7b)KbLF@WM?56wlB; z=#Iq<46hYEdTn=tq_n|Ohq_(=bRP47o%S|$F{p}n1x@-%G(T!+KE>7nO%TT&K-*Z5 zFOlWn&Z?CGI$Zt0!3P4JhxoU%Ny1AnVOc#S%Aa~+=`SU{ zW^mXFl!QYW^>q*iS4kX{QJ({0FqLpa7#t;nuOmRw#l&#j^@1bF9i9+_L9PTzaDXJl zK@tWK36Nt!5&|Fz&=!N&NZ|{T-~vg2_91w5vpxY$j)FH`vEBqR!F&8f&!zG+K*Aih zzxK6BH#m+wW`L&QZ-6GD`1iZ^LDnAJ0FC<~bWecm=HKS}oPQhW>VRI+RiMPWjYS}B zMp~z9AOCjOzBFssYc(r8x>@5vdbL4ozz>0LiJakKd5C`=xKrbL1QHAa{H@;^85kOB zpU3mJg6`NutR8%Fl4j^?5w>m*w1HR*Z~Uu=Gr|% z{C=)`nh!8`y6$*w(CxaT`2`bb1)2zhM=$HmWKgld!qgoKzO<>AN64dB^hh%3z$VZU zpgS0wYj-f#gRTa{@)C58O6?wD(8XDM zgh6Y_YxgkMLmNzoL2ZCuTT_rj)fR%TJKV!jBJa^_YXA}vLUww~JkXVQ&AEFRyIuEy zW|u&x7lYiY3w3K+>w!|X=Gr}s^|zX9_b}CqzPJM(oprr&-1P{kUHft=sEn!I!%{E$ z;wPF^7r4YZ!oUFP#qR-^nm1mSg4G{k;BUx#7FtXq>n&G@wAtm|Nm zkkkGNd|9|K+y&&R9=E+SUh@Jvq6%bt_xnxnJiYor~ zkTjnRTD39*lGYnMx?LN<6POFqz}x;CJP!TM=9?h;RKuTtS4Ojs-fHe^$4RKZ&+*!zJtN@(ySOh%y_kq@P&G6vg?|RL{ z(sc%Zk29!j?`7Qtnt1}-@FE8^E7=JT@7ER{y{yv_(yeIHk{-RH1t95e*A<}Y?~6Ym z_iDP{=w^*c096Ym2H<_lpsl5>+dwKo@eV4rK^Isq1qndhJ}VIxq|LQQ82DR29leIy z=Slpn8=;MBj~Vd3Qxo{uIOw8l2-SJ~#dLFULk=|3cY*=5tIG8RsHG?y1?tq7fVSU( zDlz_T0g&358C)Af7S?uyR?rE&2KRY8LFY=W&gN!#5z52O(1|!!;^=HpeGb+DH-rhv z5a_MTFRLI$OWbgNS#P2UsX`;TwH-6@V$u`Rjoe4PVzINWQH zPy^l61rANf3Jliipt&DV^5|skiRWhk#Rga!t_{+DLf4jn&=v|}Vp$>m1~f4B!lRqj zBp#f~Y}89lJi1xcK+2mBfNNy+5@^!|nmQm(1T{P%7jeH#1&s;0{s9$#;5E11u7BWV zZEhStL)vi`unN#92m^FU66=vTn0=tT&bEOjf?)RXw?Y;rur7d#dUUc*1x<1znJWs? zzMX~X-~*1%gUA;Ci3OG8JWR-9FJeIjz6g^?H>)p5-!_J{8NH}VjzYD0bhCoy(;<14 z6*QL)T29wo`-73c&+Y&J|F6NfA_&!6zBWX*0W@#TkIgx`P;+6X)SdL`W<3FN&o%}d zb?_OJ;Q1t&-%ABR*DZkB*!-PaK%3>k_Ayj~4hW3T;AVJnn**uF^PK@|Z2kci>>w?5 zAv;7E7#Or&|8%;3IPMDC0Lk#$s5|sex9b;1P;0ptQvbz(f&*0leE}Wa53T=VK;gzB z*zEd+vD@{Fwd;qPW8JPFI$c2xex^D_NNW+A1VG6R1Le|nni}3?l&a{c~BL! z_Co`FJzqB~Xui>-S2S4)v?uaHsVXRU!!riRAs*eVejtOubpvQ2vcT&Qk8WA5Xnuwl zaoV7htUw3Hg60c7UvK>G zy!l5Re|tSQ+7kPmbi@+-1kjBIj2G<^z@x>j)TO63Wy1I=kXU;Km7my;;Wv=mlY3i&fw;4E9;zF^pS@;1cu2ZFkW4 z#RKqh9&F9E513%vlo@Q&O58z9twH_Iq!JrY{Rc7>lmWY4H+WbcDh+%My8eG#DGS~6j1veH0BMuw-_|514-@oKul-|fx~s%`~UyJcL_}BW(@^TVu1Dv zyCRb8)c24RQdk#*v_e9C28anZ<@gKFcmMytFy|*WExzT!l@`I*c7W{#I}CKE-h`JI zI6w_KBi*+|h2PCvMfSBE^E1?=8rQ>XnAS4_n zfSBE`J6^8j0F_aq;8_m-mPj_RK}Aq)>in(lAdz0%86Z1XF(TP1GZCcmP6#-6wJ3v> zb+cL`GzvmQ)IknH`?s*Ij@S$}~hVjv;%J{0U_5B`0i+HM7?_4cxs z9ppMtkRE^0^6mfsmpMoR7k~c$|1z2#Z7(vpVS=enhu;JgOf#_=6IrT|Vo;44s}?yv6%ka+o! z4czsw0}sG zh{E%=3je;?=N`Sb$K$yfUTpl&h1^G3+QY!`@&hXa!^_vKpzyvP1W5#-Tid%?Pl9=% zt`VzN2sjd96`VIXb$}{3&|+^;h(HV8*RTKoe>oo<7p&icQS^u}Ly9v-P@M6B?so)7 z!tod8-~a!AnFi6g7ggiErKlRgBkSO>V*+V1glOsr=4aRiE>L?-h2p`<`-KW8Xbu=$ z+hzuX@0Q|#4iSP57i~i`x5VG0o7E9y4CodWk6zO&kR$qE+~oin!{3?+n*Hl$m4g_? zj%1WIno<0%rVzECg22{-`wS(Z{i&=EkVHaC*>`}(DWKP|bh_U0=w{s?1iEeW4nqk$ z*gLOTcY&P)+7ZmU7^JzIbxsgCWNjdYK_5sEk};b>%x=~isJsUFZV9nCZiW{-{&Iol ztifaaFSL3Y7+(H_xG(^u1)|#(#O!9ZgX)HuZU7R5$g6^w-K=sTs?+tt3(&Yyhb!pb z1MuzMX{?}C`Uki`SQ_ zM|g62+NkPb$$sc-#2 zHkWvT`T+r;z=1bj^B19IH#Jbn1&Y+kpr-I4Mo`O9c*1Le39or4yylwlnjPAZL>@)b zS`0A+)FyfJ@Be>fIX+|yK!tb9XV8E$%ovYu);<29H~}}pHiDSltgAp2D9yPDfR06m zr@8AY@N@y5=bI0iCI`*&rSpRNKCU}TwLtC%cQue2mtfVw&LG{OHFMx<>2pR5VO~|IEtI$#f_gxDb%YIQoW*k8lELUn?=DTXf-%dv3i4D1(+OdN zdONUbYfy$^co_?BT!Z?l;3?M|AfH$sf-c$uoiq>H!QOfNg_b`kU4S-BfR%I}e<1-9 zu{_M*DhW3NRGhxh_XOP-E&7`al-4frxBLQ!C&&h{v;ai<4kuLlHmdYT574BsXstIW z$z9-Y0i9R?c01^b_2VxtL8R@xpwiG&I&MIYUpxL{iUYbcn?NF#hfB+lOvwX@flglm zxe9au!SNT-AR*BCDWIub@Cpm`l!7>@O?q( zz5Q<1RxfZlBYuo^!CXED)?=)*Ak-8P^;+~8Yv)`(2KHmD%@C>HbW-lVzqhhmLIx9gAQ7mCe4WXp9?I@GV@5J~Jls1*QCV$HQbYWQ1b zGlFIeet^1OBH)wWJbGDoM}gJ9WQEiUe?Tz?>Aitks6XsVOqze#)pIrfuqjb&{$X39 z2U?&5n$Cb3Pz5yrG;ML*^$++!EWzWhe?V8azUDaY`bUBRT(Ph&gc|M9$vVvober^_ zmlMEAlC>Qw1M0BZmdK#nAOW=@38Fd@s@kKI)z6EcVF&2YvX^cUIa{b4sDZQZ0LZ;s z%|GlgjXW9&@ijkqD&-IOBrcF!C82Kp>Iur|;Hv1AC&aB!z!`w`HdF@WR>cy7Zq_&t za5CZA0h(iZ2^xn+cYg%bGSDhYk8akPP!l{lS^GTs8FqlC9$!K>aI)4y|3m20A69S2TPUq)G+N%k+jW@aVkOdHlsR&{#+(=%gIi9iZdv8B6UvdTp10+APOD zBh?6d8o(W>9k8V`J79;odVo$l1w{(o7L16CIH&A2RbwbbX@;S@N7meYdOTg z7bWT*y{uUf!(M>a~`40-|DYsUJ)1#HNRQZASQuVX!WSuG*DPm~0B^s?$ebe|}3 z_ULB454E+#%%hui6GZn3&;*t13lD486D9J^wNFG!K(nu@(cBC#{68TD`@u%g{ky+G z(R&0G?a=O^4O?j`hznYk?$LSxyz(glq*(}AGeib6|bKlm1EBFcM#r6ab z=&&o;bkJcs5Op5MAw@XV8O=B-^vOR z0v)>ZqS+l*|4jhZb_GaS(vlrxQR!Bp^{Nu?ud~yu8B#2{7ED3*M^?Ht6Mgh+^SV z(D_;LpkykIgvJbb24F(x#pZ|gPzyOvfg8J_praumTTDYi!}TEJK!>7Xi$hpmdg%!1 z(zo09L zVAq++D=trTIDt+vfM)3cj^^4Y!l1EhP*Mj+J93Hqx)x+ZX*ncJpwfsU1$;ou1W@t$ z?J{T>CUgSmqKaNfY5N#1A^;3BwWM${QhC2XMH3V2O#$X{O2()s^#^}DXfYIo zU91DyE&y774?0AN0krD?bSE@;)ul)0DNv69T#Zir`0szW>mSf6HqZP@bra(jdm$0gctB{a{!5h*40DU+Mvd)>x^R# z3JfnxAXN)!2nrN?UKE`Ulc07WQ5 z3Um%2NEg^8;5$G-gVCUP0-ZDhj^Y`pI(Br29_V)6!+4?7bxXJF4sF*hkTnwwm4cu} z&#q@c3ngZFXu3WC?K1)05D2;&47}42wuT>ipUO*UOYQ||(K&2s>v31`y1mzh-L5CJ zL1o2;Zr3B$t_SL4x?ML|yY8tEX|CPCPyyPk1oCBf=n>GG4scomueAfs(}4U4I*bJx zohQH&2R!)K9|9j31v+T$;0pl{(21;#sUQCTXJBY{J;DgK=R{pQXcLhKH)xBlE98tf z&_cvB43%olwPzSAK$k9nLZmzN4BTSSv2SUe0?n>x7+-TXyZ&MHXm)+T*z9_OvD@{8 zwd)rCJ~2>V4s_FcNi}%k3aGt|#grFmodU08A-Z$VFoI7N>1IH&s?+txYtW$N4XCG} zmkfdH?i=8BfMA!u@MzAx0bU^piakr$8^xzzvovEh6V%E8odN?Y6+ow?fYULeusP0J zY602(cAWLKIfR8eicjYaKxeE% zf&sKL)$$N17(lu30AyGBn|I(~0I8Pfb_FQ`2LtGoAy6=!08jgaX6Zrg8Ssg-ptF#` z!LR}x44_*C5WxUCRu~!#8<2tl#6}5*4bXCQ11R{x4GyGW011ME0aFnq7*=?I&Qb1m zozWe7r4xKJ&VpSaU&BlG?XSU}T7cNo0=mwsv-XTfH>QyfbLu$PZ{RfwpUd zg2|)vg0<@z{$}VBxl}XI_JQLs+*lbHAnR$)f`ga!jX7u|jRVM-58bY37!QDQ1nV`B zX!D^EkIn##*ODIHtg2A`Y;gV1dz#jORUQE82aTG7s!5QSUx3R*aCzD3`lQ?SiM8vQ zqU|2ttTiC@pra4L*8sETg1C@7&Osdq(5@?xcF=e(!WYG$9*}k*H^U3oN1z_ip>EeR zNV`P-7lB7NKl97|0*`PuzX5Nv>1GuG84j**SyN3xz0yOl!Otav{L3{#@ z574kMC>MivoPZPB2XI3Bfs)@K@dXNW*B?j;4a7!CXrLn$K?xZY&rlk4X(}YYfdoOp zhN%eRes+-CV29~}2lS!Gr@{PF5An}qe{O~si;KYiF*X5(nCk;rkb$-|d-U2K04Zqz zD{%#F#;^djdDTJJ;&ieyfV6b8{xk-+(m=2g3cxc-E{rW5EQhaiiGtuh>3`LBMDGg zfE*hF3Jb6g(HB8t^`S>Ms|P4bA^w_ci01GfumIHI^(~DGqb^Y)~j;INYQ22W&eibStRGaR<=U1OsYquK`-B199a;cV3@S@O zjRR1Z(DG0@sDTGMex${apW(G5#9Yvx-sU$PSq$)#7CR3@PF?}6wAc@xU7rLx;;Q)w zXd}fBP@)30A%1iSAmt#)W%X}7I!hmPhQ8?Zy#qG^ufB z*b>!XaBB1gEdl)jJ=Rv~*+1lcd>-Ab5A?vHv-2G!bU=Ghw;J$+w!C(;+JOD+5a7`* zIuR6zph`;f0;1Uk>cv5_xe!PtN`VYYz|g`NTr)NQU@Qk!ZXO_mI*-55{P+Jqq;lK< zUM|IY-T+?5g0@dXT4JCjT%e{fw4w(sHTnRKC{Rh5`V3rSLsfb(f||GNOw z)8V-5pUeCV4Er-cTjb?$fC?Yi58bRqy!@cE**|#nR)Nm8VXon0@a(+c(JT7rI!MVy z@IX@Mu@_N~!QH-t512c_C%Alo?2-ldK|mMq-2fea18!uY*Q$`4wjfO?P$TRHqzSe1 zDcJ2G)e;aT;3gDkE)!JafXoDKt3TlZX+nW|M<6z+C3yf`vz5%ElH3dsAj`d1g_aY2X=$n?cie>z>$I|t*ah^z4M_v^bfe6 z!P?gcr(4kGV&rq&!D$3^^vH)Y(0~=FidOKjbp22)2RS$fyg?b%&IQ%G5V|u!;I4P(if#wc&3v6Vz-h|k`$vz?3!Sc@X&G1_@!%t7@E|6*k zj@+O&y9a1T9Qf+T6Cme8Hmoyvbh=)64L(W&oIorOgU|E00G^re22aj`GRTsL|Ngfg zC^hkDu06p}0@{#&0er^;XiXC+D0e`37a$9kc7PW`f!8iwcr6d^VRnKpvH+cF3%1as zx%L7>X%~1N&ZGHAM6_d!V=PK(fO@!dFZgWJ6CT~*vrTt^T$BM?oeb)MfzFXA;qmBY zb#~`wcnR9!5B3>&?>V>~_rasn^~G`5Ckmie2Pox0dM2>8E~uD=bnj?c%ZdxGQ+~)N3D5zV-l(E&cI; zmW`l=NvxZ45gRA!(HHmVmK^a{}ip5 zfZWpRto`B9S^B}FGxP;=Bl0-wDPBmg0!b8!xdU`JD^lUt%{mX%mS{b|KlK3rwgU(m zPVGn4#qm$XAo3#L>tJ9gIn>CD=pP|!Ppqtf~7rYpS^F_?VfB!u? zoh4qRfrjS5tzizNxdV{N65vtv?${SEK(~~F?nv%r6$KdyI(eg$Rfw0Lq1#!Yll3PL zXvzF%9x2KudN@*td5JIpkfUI33anNgQ(U6rFI_Ovi2Z$udO9WRT5Yg zV$bWv1dt0@Wk5>6yNUEbs+3|F7+!t_*CVVyxgldSnRoyF?{o#7Ii(D{EsgaqRL&PJ z=Lfp@P4p;8yw`QYz5tLJoyT9u-1_(5qt|tUN3ZDx2Z--1Z-J{?uH&rT+>m4gQm_xS zjRO?Wzi#~d4?2rR%%hvN3}jsAvHi-Rrl{iWfB#>Dt{zN)ih^{!;0B4hHP^o3Dh26q zL6&=e>)-#^S{~i3dQefYIX6L~A|BnM65OCAJ8vM%a}I+X+I*w}DM~%MS-)~YjoqQjb3li$Jy>ACv{dW$OZoz(C9SI(sXy$|jDQxlpT&Q7s9GsE&7l6`4!)cHi zpyi)0JUX30d*Gr$Hh_zZNH7ajT!eE%i;FNY12koq1Caz>L7E9+YIL)vgQX3+S(CsF zlWx|lC43B>&K971I6UV<5y%&|B zS_V{pbvq=0ve_e0^#tK(fNyI6vl%=(StY@CfX)h&=wwxaa=^Djbh4TvxEdavta?x` zXxyAt6V5T|WL1E3EIL{Hi$Mo8`M&Vzc69LQ4)pNoWWB-;DqKXbf~aoC0FO@AOJF8w z8VoT|{^#f5=zX_hNw9pz{qb{rm56oOKQx#LO2v ze*8z#)%->PbfPo=HdaA-eukC<@EuG)!1efx3h=N1Xt6Cr3#iN6Yuj(l&F~`sG#A5b z7I5FNleL-+l)f6FRvc%whq64nSv5e;Xg-xW6zGUr)<{-<(5htE zxc!T_KT%=>(nAKd{cd!#ZY|(rXg$E+0lGxATa+DSDC@!kke}-lJ$h~5vG6mzn0yxG z&2Twzf+*Me|G%5nOOBtR`2}MqtD_u0XjFC;3nb<}x>;YdK+*@OGP@6AcOHMC4+;(N zkRj*{fJPR6hL;n;6Um~zETB;C2dRUcL&BQO0*dEExPhWsU?n^Sd907HH$~{YexQU%r;!5Up<-+GroKPYEg8vRx|T6cxoQ;>3q=X z`sT&VumAsdi`FyqGcaE0WGx5Tz*@)*PEgP(BX5v>kZjU_44lm^K_cC(Mj#5|O^~O0drVsfJd)wrUf^{3+WReGoT4rFce&Ey001uaZ=oA3myu^Bw0h05TJ-S8Dg4oC!bh<@PLc~DI zAp?HUMZ=(u8+aMY2Z+FHF#;AdA4W5#W;V`U}vJOURvN zSQXl9+X>R}=rFnlA<%i(NNEXruB=Bl>-&G8PM+(J*ZSbf8#FTti5XDC?bjJl;w_~@I!hOJfi9!>=rw%=mFot}fd)KTXNd7L9CrX+X~p2t8@k1#*L4RpSl)nI z`OUQ}82DR3hd_6SZs}&-mH}!8lv;aqvzGtm11)~!Z+QZ)VO@8CuWP>!=7>gtB)j28 zNuLI}g}-Gd69dD3(9KLQ=In#UW3O$n5jVq&8Q?SyN_sHspPvHjX*C76@mVz>;lSUb z3f}DlS*z8}DhLt=uSRtJ0ABI>0kmUA3B1_pvu5576G z+ZCj?9?B^MfMUgEBNxZZ&3y}`dN^n8avbM6~P(4pDjI|*+bgSHRBWlw+v zcmdWA*!1XYDM+xZLL3TRGy&T64;q=>(#d)^4b)@;MHuV6-+T-&L_jl%-KexWx?QRtxA92WXZT#`J*A^me=cKrCST0ln?(MfM+1+w+(ZEYC!N?t>EoIRP|h z0UAd?0LvM7^&vT<_ZTQ;fpf+ISk5>Bl`90xm5PAe4b2wt4aO+N8mL2T@(Y>;mVmNe zx2Ot;-_7a@3IWSQ{4Jotu@|SnUS{P0$#uH^cnvy^7&Q2)0PUcH=CwdQc7BL1(C{tm zVGtXfwV{dHqdNdpy}t%|%<@nv$PCa4z@RAt(7kS;DNqj3iZ*aXTzb}{oAm%lX}9Q2 zK~Nzj@WSOc_?#?+7eG~!1$eNfv-Cn|=$Yg2wQ!JAal1i>PRoF=OzdSnsK?FlvL2EV z^?!mrT>?rH${@C->ka;vwcrq7l>!O09sq4mV&wy|yJi3X0G0d4U$`F!b>*Ew;r0b8 zH03BL!Gm@Ku-*g-fyQh=^+K;{pdKWu9-RPbVm%C&W!(d!S`U@WDpfK^JqrI0JG@H)}4)IMDg2M?qs(FF-2~ zU+Z_fzOi;aQw*9BfoIk3&=(y7pi3M;>ouU7RzNk?zW5K?I`V?6^k{SKi~psd=zzNo zwC)Df8t)8!aEt+TbpqT-tlS&j4iX^c-L5ylD@9z9l!NM@3m(l!ERe_YptWl^>#6Uc zc4w(bH|ve>d<@;9T*-V4mKXS&d_kKE#&cU}T0DNk{(u z@8^uRw^{!V`O9y?*GaMUap>e$%FA?=OK??Qwy+1&OK46}z{k+ddLe<2fq(slZr1$?d<=|-Ixif2z|44|`GA0> z>mUBUvj6}8ce_66biD#5AG|Kb?yd)@?o!8a*8(k207Ko?aTMk*&?;n*+d%as(%N_j z2@l2-9+rn{*t%V>bh0dm^Pk-W}etI2` z#ZOkCJ}4w9gUU_F?Yp4!QNTlWpt!lg-%RJ7pM3!(WRQWN67Kj5H&9I_8WYdQ01aU99+M0I`CF%h%P!Wp zpFuHs#iQ4>8hn8$G&%n}`0qb#N(?m0d+amF++&dTu;W2+FfxMoF+3@H0GaA%10_Q6 zmJ@c6N!`4Yz0`HVMH-kqvZzxy~DDd8b1Ym)eb^sK3 z8K0nm7Y|Yes=+#szla8pj({s83(yU|cHq7qqz-2Xsp~a81U3p9gwh~CLiNi30ySs^ zVa9TN;$wgo)-RueW|H^sVPSt@A4=GRA{R3M#{mu14v%hDVW=FPK5xu4hRgp5DD>&7Jp77}Po#6rA{swB@K#G0M1ONVm z4nHad?HZr*9#mo+1RDaG4C}Q`P~~QLp$tyKOW#AIV$OR|TDt?SzrjA4&&3Go{760rIn-K^Fi<2w)T0v)pp3s_4P&;@|tH0}d4+!>^n*y@FI0DCf=6%a3(OU2C`)lVeL*WSUvxXj zfR2L$1+23tA-h0=j1Q)F;p##h@W4P+jf;O203_`*2uoKrZVp{o&d90kqHo z+1H-CKyLGfxy=cz5;Syo{Ds{YaL_@_a0PAru{;DR=O7Mgsl+jc23nK@Ud0m7dH{4= z-p|*N@(w(V`!bdZG!0JScV0sptgk^Q#6DnrF$0uox0 zC}fA0D(Ir*)&rmke$W;r1{=K+Z_pmF5^K<|BXD_M3Mvditt|ymg{BND=RpnnZU?Ai za!?#|fsp}nUdPL0pb`zV)eL0PE>L6Iqt`T55uBZ0FmDI-#7ns#K9~(s+U@!Prpg(r z>h3mVRiHESks9ND5^AJHbTe8?m<;$qo`trsRAwD z_UJX;2UX>Yq6&K5{exXl8)rjR$)l)(p0oy6RRvY`b1SkRp@l6xBqE`zE<;p7w|s*( zUBi`FL6vMkQQ{2_1E}w$p-OsDlz@up2e4s~fAWxE%0f}X3a(QSV+S71Z=jbhu^PSv zWlq-*urbc#uAo~L8M;{;Lcnu#oyT8nTm>E+yU{J05&~+OCxt*;=7Aw7EprjjB?!k~ zG=Y_~zIegMaGdqs3rG_8=w?0s0%8+r*Yj==8?+|8)Ahs4lc0nzDgZW{F9b9`$?tav zvg7RoXw5As*SdZH_fpx)1Ht=gVaFcH%Y%>60iW3*4Dveo%m&a!EUz6wqie50=^r$> z0_yMPz2IX2ExZ9OWCM4AQ$Yff;N`sgctKN2y|zc>xEWq7v1ecapGp3Pq2B&AXj%hg zgaE8$f$R}3c?T|4KH5>x(i_dk4w~4ZeT}CBaT-Ddhm2^b8t>0FC+a_iY2E z%HyukJ8Qs>(g0;mSf3MgF)3uhUkPZ${X@5d0camhH|wnbd<@`wX-dSqK?NXaQlS*G zys-25iwlsZE65EJ;1OL>@DM^OSQBVa8gw8jV(lGd5;E{N=!8npVY85#?wcR}{|E1- zMkwrd5a@Q0XgvTP;|IkHcnA?>4M^OhyY@rpu@_50MJ;G*z8kdW@%W42O`x7UD0M-0 zdAx+&wg>hsT6n6w#TuTR$6cR*dgZSn0Snq51ah0}lWx{Y|3KjY@{+g*=tc#Qy%6s- z{Q`Rj5px9+-M&u{ijKed^ATKz!<-L_Inc?dP(G+SX$ggNF`)^slw>0Sd`<0*^4jR0F0i8EmZvq;PW_51aIwI!2JS0L1P* z{z70Q$_yQNIt((Kl=p-WdD5}7_D?r!+#k?L8fXxQHU2Lj!*K@((5ws6Vwld_KcGXL zSt~&kAmHgI);tiin>8IofkyW_MPvSgrWQbpB>6z+KR|dkT&2g63V+^rkVh+cyIFnw_!w+o zFf%aJDIaIG_Jbr5k6zm&AS3gZgAyCGlI&!HK(APz|aF}qo#K@_O&5(i)S^9Q^FpVbv+3jdS?pbZ$TCJ+Ho zV+}MT73v3a1&crnXpJ$bnLiUW9>99)Cn(%X3P9@;K;~+LZioQQ9fQVm!RL(XF9rn} zXbA0%N4GDisDA)$+X`*?_aCyu{ecJLg=3JOK?yr}8QyDF$eoVetR=tr7$Cb9vp};L zklADpa05}uqnouCBna_e(=R@T7mZa646lPcAo@Vlaa^UKt1`4DxEWq-SPF6qH1?EC z85mv!gH)?{bhEl4jIjnWyIDc=E8xZ_f9v&s=&Q28nd96Ku;0aBq=1hY0fz;650b%) zphy3ax4MDmJHTrOx>;vJHF-GDfAmeX+22MO@p}ZTQqdHii^P(VQEL}g; z8i9rpJ-P)zH6v*B6BL&UC7=_-K>JXTMLA23yhhg@^Fn0ppr)NbH~3N^MzE*~e=Deo3$hVna&G`*XDC<~*nIG* z{x2Zywi%$iS~ZDMn!5}f7@&rzrR$&CgclWSiSq%tJ9 zSmW=2Qb`HuG;5fxpmSQ#LqQFcM*e`t^HDEYOaSq0Hq=D3M1wf3=EyF zZ(a(67hZrC2?>DYVA<7%zx6q20t>RG2Go0a2|2+OL#1M=K1dqWVFU;C8*o5_7Y-r< z8oGN`e<=gQ>sW|V6zl9jE!sbzLt#LN9icb`;xC9Ej&4_c#$Q+hjvRC&>`K|dbq=UN zc>qp+Z}@wRKtn~YZx~++f%-$B30F{g1$H(#{V0J`6}nOC{H>25c@#~i!}T{P6kdXE zRqSS6eG43Ct`JwF_>`33Vpzh!03Lrwv&_Qvcd0taI*|Dg57k1}h@kiZqzrV+1)6T~ zl!+@eM&>RC9T4;e9P$v8_re-kfR#`+g&-ZSZxCr1vclK_be>9Q=>d<<&>fw=CtNyRK`TVS zOG6GW0!2FL+@>>-%`2KqK`Hx;N4M(%u#e90_xgg)S%&bNe=za)i9!544U!}dfIWQ%yaX0h&?NDtH3*>JB zos5S?Pew^07EzCqXe^>BC7?uxZng`5s}Umu1E{6#dH|d&&wz6!*e{4&xdT%C&0Giy zL6Aa$Zdb4pa6l;Vw}^n6pEu4_liykC4{4H+S&9dWfz54I}|CgY#b`bYf5s!8=})Zx@B)(12x#rxb!A4di2`P=H+I1!8;q=MD^$meE~M6^P)%RA(zf) z|1WpCo&hac>~+21(Q7(|7u-n(4~@OpwG6Z)47?U|2Xy&d$N~n2mvi6=6eUWON`k;f zgR(gyqHI9xH!Q#|EH&z8HG;4-x>;4gEdG{G?CDvZzcrr`H2C}HD%f}a-K@XBtWsC7 zKkY$VtM@5^l5gkn7sc~IsU&oVN4M_*P%`N}*LnQKB+xz*S5RKt0axfXpMl}!ZLpPS zs#74UUxG&CvG@a0p9k_ItlX#t ztrtRbj)m*{Qc%$YEm}%JcE9`xcOQt0C#UJ7n9tw46|NCAn)zGqg4YmW{d)63MgJA>BttLg+#=r- zphGgiNj38;=s0VzT(^S&Xwvi>IP{UUzn=%!4psuXW(3^swRF8w3!00EG~=(pYXn=+ z9X+luJbD8Zx?QjIR)DI}6Of}-c7jI6JUWlPFa{@ju)QA52f+UF0VMD*c_P;rpmT=0ksP=H?m&zsU!XnSFCbf_L1zwvg8YXEWDPvLKXQe? zrym-BtUQ-MQOn=5nE@69j+4PL09sD-0OryIGr<`G#0ST~1_U1*0}Ez?%8w%#L1vZk zdi1jH1Yc?C`r$RVM=$FpC zA>bdREC>1R0mN?)pnmFhy@F^XfEG+6H4r>HeK+`Yx~|x709s$4H3{r3NPu)6fAMw( z1A_;sDDFJ|;vt9)ULOiR3<$J%(*wS;6sbvZZ4M}5fQmVgQ#OE>kbzfBU1JBWBD1~1 z&du5|qNO$hOD@(ZbpjQ3;4^DL{oWstAglZXO4}g!p=V`H@P%z@AP41w93%~L5a^Uk zUyy33b}NYX*KV&}JbFQu5mE_n^a*M-QgBGZf+O@mH?ldOz$eC^IqnKR8S{1gi|7TQ z&Jlx0H)wSaxShp#ihr9B#=Z2AI~TP<2Z?}67HB7gf8T-5<1fC?{Rf^C2)zK4>O2Kn zRe6T7+x3Q}>zSIFu-N=M3%u~*gGV>3(s|J63Fz1W-w)6sE3v(xJ*Q8f^FemKfflHP zueMwPJ`tu<09+xXq$$wo4QT%!sOQ@03yS#{pkxZ_Wr9l-@sFUO`2*^_fg75CYMnrA zaN7{v(F8T4`1c*Kbp27P(ak#R95|P7b+b-^utd69yC5vK=Gq?)kd98b>mL+HI3Rc6 zI(;v=bh^Iq>GVC(4cb8p>eH2i`gEPg!CNjsr@ykALCiF6u6^N9stdmV^-YO1I1hr( zL;&9t+x&{r1JX}+DB*(5!GT6UAyWsdLD?KMGY?vN0#2JJ_JW44pyy1KfUf`k0X}T6 z1a!3P5075ZGGoy3Fkr=8(-;_DgW9kl3CJ)Dq^0?BDg(poi00ZCYT*0gPV7?y6~Udy zUx-a-V0dlcTr0p(BI*I!+y_2l5^UIBkRBCK8MZG5s`|w=P^kp+Jlx9ZQ$Z{2z90o% zoN<|G!ITFX#*e=xQkFnkkRtt{*^y*O2uw z$6sup!ocwI2^Yv-==IVleRwtgRu)js>V+I8tvd}=EUr8Qig5lG(5(;Mu75yd_}yU5 zpwx1xHo*hJ19w9HfR1@XbVAfX`TS3B1(QcN#Npjw7khv%(17X!o#e&n+4<3NhdS7w z$6g!*^{<+b2z0vsd1;C4RM3(taH|BID&g(_R#1>YB4*lD28NfcT%a)g1FpvK*~$R6 z6%uvFUIZZ7dKi2Y2-uIPxxgldzqOwk)YSxa^06oYWfO30lsYu;1;q+Oi8*K#4z3&& zX0Ctud!50Jcq}H^aFt$osftrpgTHkGXx78^4Zxp!Gn0BRi{7;n_Q=P^qL+=zWcIi z7P#Lq&7&I}iO{ZtBq)*EgRFt35l}w?9Os~t$VRQy5UL)YljcnZ`wo;4;CZoYG9;c} zeq{%x;>RZ;ski|&Ue^V(7ql7#Df~dKA#j?)GC0fM0y=H~MKJN&R2euxBYmKSqfk4L zLm70^_zQzh*Eg?=U;LX1s$2x%fewmG9BxqsmHCj>sJIL@2N@~{Hw?qlaL}nApyQ9b zTOmb=>jTieYoK*F0o|c*nqM(mUMO`2m9mg>5ww2_v<%+@8syL@dOv}I;k7YH8K}{S zDt8$q2kLV`&gX_5|2gYr4jTi*%XIKv5Rmfa>_kws?FB`f2Xe`<6;#%N>L*a)z~I^W z6H+*I9)Gb4v_BPEHpsFuFidzU&IXEI#uK2}1@)hQ9|y7cTR4~*7+x%zK|(_OrVLQ9}FdC-K-5@>q~S%BX#_J&EWnoG_GLF)R8JJ{?A-eq-C>%@pK-(HhI2?C4fM!V8AQ9owO(4z~Jv)DP9)I!YJLpPE zNJ$P_*^lBs5Adza&XYh*(myYS;XSCvc96F~r>=n(9YT5<41J)40_KC;?;m>Md~o~y z0hE8-0aT2G4xhgOZ4N<}F@lEGL8BI+zEm$Pae*5@QZK-bpKjLMN1^NJE*%B!AUSgs zTw*nN^qMLl-`#m(Dkw#P&9d<5b!`C8LtKB6)(>|OxNBqxO4*>U5vUp33aX`{&A0H) z;0DME$U=3{hR+i(A%jp;;qC(6ELA%Z94_!UMb5}JT>LExxM~P^4FtIh`{j3V0s~h? z{4J2JrO@<L zX4O0bPKi-)N1zy>Ug`+47&2o6-XsF`9;h6}-&)A%Wng%D9n{`|kA6Hz1<89B(-;X zy1{Njimx6{(1KfNfL!imV0aC>6Z!*Wmo;d?E9g*DaON!ml_sFf3l0PD0yk*xow**| zr-!TTf!y>7;)Bbj8U!C)F6F@ZoyT9a^?*wb(4CKvWlp6H=zTRvTfcK}4!Ci@6;fgKWv2)Cex_L8AZ%V8byO8^bp`Hl^9m)^tx*Y)Z?YhD40Cx<)PD2~w3V8Pa zer{lIQS)2RvDyoyay zgTDpT+vsLpxDOQDrCi;tv%#zqBkWe$lq6%9uq*NEW{rpF1@%0z1dV!$dN->DSV<|U zv4us6Eq`ktc(fSoSXgL-3eaxWe|tergxy*PR)FSJTmIJH;K^XfR!-0fcAdvxcz_a9 zZ|DSQ3ltKu9^l5o-}{IJ0XGnmK%iqgHnt_8kut8YTnsO+G;%S#>;p|TK~2^H<$iEk z3e8y>&|=VOEx0`0;Q<;_D+L+w@(UNki^(7Zd_e|)jt+q4)|GAGw7vsR`UQ9JJCD7X z@EGA-*B#&zmcOqMw8YBw1LMmK@Yc#Rpz&PLVh6ChXMwDh0a<$u)SdukbN<#V;FU3( z_ke;E?6~{L)e1J1Ty2tGL5TEX~`@!aFC zcR)*1VYwGF#{K}j#2D0b=ynLObiGp#p6v!TJRAZ*3%Wpew1ejEK}8p2h!=b{a_On& z+B^SC+2I>UKx#l|zksy==nlOD9)bpq`#{RT;8v(p!6QE4k`@y2NJT>D@fUWFkU|tP zQd9?C!vY>+1@Cf&l%Jp_k)UI&0$LALJbukMp_{dMH#q#{u@of>+hIis=n_;M2}`Gx zy&0U;Kus}NRsajY%Ta}rP^8R;D#ux336%ro60lsYI#dLdEx;l$lfaEQPeD&!K_4IZEyi%LMv@eR;P{G1RXKLcwrxi4QZ!+|K^bmI%EBiN8=-g51=&m&_na0 zN9QRI%PS>99*u7p1Q-}RntN1!fX?@N{nDfJP~)Tj{0s~pnpY6))=MPzfu{>#2m9P!2J$~_`~?~_pj+QOdR;+_BVVipT{8=69f1b889h2f!I84>0!SV* zpz7KHPQD=VmIEcAI}brj8!m8^gPFXg`@we+bsm2aRmZ^4UAo2tbgvg^k!-K)0mse{ z9-YS^J5ohK?Qihu>`WjFK-tfyjsbEC7fK?9oH*Fcssiy2>;$i{Whg6JJsRI!U|?YA z1P`-zZUtx1&Z(dr?$O!n@&EsSpUzeXaGSXov=Rt591EJ=d-E1jd4Xs5oz2K%UC?P>RIa?Ni)k6;j0F{X^UY=%R zU^wmy+Q-Y_aUARyaHFHU6%^2*m}CN9iHs3~+Zx~@*xd?>8*ps|a&fJ)2Sfy18-YYn zY9mmTmAZEC1<|0{D!4PZf^7sPE%2$_&~p6jGbA_jxBLgUqFrCS1T71M#yo!u$oaS| zwNc`41>NM{46ZO3U$%gnP2i-(P-+SbIY?sx>LRDz3GaDDkg zvi{%y*NjN}M7ml1Hu53eW8cl{gu(~ykMZaY{o>IJI%*2+B5R0?!0j4YP{RPUkEa!M z0)+1u5741g-K?Kf!43>XcHq1^)Ez+3Lv=uR@4V;(8^gLAqzzP}gJx^N6&%FX$#wt! zzo?dB2AzsKTZS3bCja5l&DsM|4k{TxzX16d8WbiV<@c-q{fD&wA+>^!3^Ve{tR9VT zz=wi%?$rR<4KLThE#S^xP&>}26Wl)Z=>(7Dwj3x?;Ma6*;Meq>z^@s)fL}9q1HWeK z0e;Qg3;dd;5BN1}KfE~h@Bjbftrq|P|K|X809!#h2RyXY>nh*@sU|#nA-SXzQlxdW z9#a8@)l`rskM3TGYd{AKyyykRXgBLJkUVTRyJs!7K>X2J`UN!W-p$&$9-5>o)`OGO z4_J~yj=(BVw-6L*oyT9qfTklsY}5!e1Xf!r?9@~TnsM)ia`>f6vhrx ziIl>&gH&~keozM64{IVUtOm6~SZ{$uVScFvs{|$V<1a3*L$7l;fac{o_eOw*_Nfy) z-K?L%BfO<)q(xCLEN;MV>1|B_I|&>`UA3Sffr=agU#bR4ZPEYG{c`}}pU$lzU?Zk_ zfGIK)TQ{o;#5>s#?|_!%948{h!My{v9mPAlK{3)h739J0Ua%XxTS1-%XT=xoe^LDe z$-s!T$GH}o_88WJ;~s0;`v>Zefzn&&@fQyudtgE8N|Zo%?m`NWt%{%wVJh(yl*FJ} zI~>jtSrN_*BIRo$W`AYsss4zSb<)k<*Mivx+m(jFsNB_!>& ztwHry;~VOyJxCN0TPVPz2o(6BniiZ+z$s1wl#yVOhMeM3X`kXCo}fZH3kHQg&U7{# zEuGP%q?Y+fYDwK|yX+Ac!;7#ySnA`I2W^Z6Rf&*VYHv9>oqdx7C0|&XfmELFg`~r4 zAbD6itStZcA9U&`!;4i}Tnw;d!$I4CKs#ii#rlhU&>1_uwk9C^ujRt*?*$u#u-_JB zKWN`^324W#JV^0Muwu}m+X-@f4BfR~Jh~wZvmnh`h`U+K!8cv>+KPa*l)<&=g0w)Z zblBj?%`$L4Ml0jmV%LuNFWY%YWO>PjYVU(E!iYPfr^KjdO~@iPbHIgood$b!m{ z+85Ab!4o`;0&#C>8PvU3Kw6H$wbaV;fp6{xl_D_rYC_x_15!B$tPaG@5wAx_2{*g0=fTAHppVo_U|8%*v{8}QLCP+3r-c;ROcYALbm z9RP(St2&5kJy5FQ(QEta0T;uIUUcJLB!2r3O^ivPq}0v&c|RWmXz@At{M~t~%%H>X z@9zg0=fL67-QfTpd|^GipAT~E<34uK7*^-;{};PiE5PIHC7>PfYxnapbO(Tr(p|it zkD=ilOJ_g`QVSH^!UUa#-ObtzGQ0Emi(GqV2JnSypb+mo{(@VWnZcvi)(hn9YguTa z@M6_hn6p=dV*5C&#eT?EQ8Y_lm^pl!C0 z6RyEWdbz%MT@4=b=?2|4yJsoL6QQt!bq-Gi_nSb+u03EV@#|(?vJ}(<0mTjIkP`~shOY3fn>oVgen`ZQq~uj7W@ZY z3gW&8k`cODpMrYet0j9`G7n9K*_vIu~di#=chEw@&IsFMPj+v(cT&3XoG z0PJM{#wGv%zj$yIoL<~ti+gm7e%KB2CaWaKx1ck5pYVYO1Xyo^ghAsEoucPZ5%UKFqxD4icbh3Wi1@gHo+#nyQL49C@!0Sao2Zwin>zfxf@eB+v zkMn{8$Mptmg_SH+OEg#u_8udD^`Kirz+6tyAOP4YATBHd7x99^7L+7P*pItD zfy})xbSaNaBTR)St97z z@JFG9+p*yfPYJ7Q%MFh z$P7u}Pf+dB&DsVwBI5sRY3RiRpfej5@_<|l3V>2x(A@+4+n8Gpl-_&I2s*|n1f&Br zg0Bg>YqZm~p<9%7Cn#e#fKFd!f}Dp`ln5&3zzbcvS)c9TV*r;6VE#Tkkj|IS*t` z;|@NC-T=mK*9OK52+P3cF~HU!bsm2qy72%1*U%d^I2VG}Uq66F`)V$TuMzn+i;aQd zh5I3J@`hy0aF9E?SsUi_F?fJ7rZ+bz?Xfz5gdwqJx&veiJY$A&gSeoeEIIH}7NS}R zq#6{0oviF2X16TE4nBq#^D6%TckDdk*zm`Szm*3ZSvA{0bqjyXMo^G-v)8qL7)VuKk219;H~{0_6u*b}c^U%2FfIu@V_94zaG zVQY0k6F6Y$eV|<+AG4toI48gpI43}X4Uz>-;B>QI-vWvx(Ao;t33EZ681O}EBH%h2 zw0*4h1$bWpXm^{H@kZ3=E)~cJ%mL4M24USYFDbH<;0* zo7EU>IJhyoy$93)aDCCuDmE8nIe$wos5J&s&ffxBZVYL@IBwr5DEP>U0EDE5QdkZK%s-@z8hsqn@g-J+?R!R2onNC;B7yxPjZ@S?pL z6w;t>jt@d+_DaxfWbF&^B!lhd8=&@oJSbm*Vjj|u`120b9${7A!pGp!p#T}ivPxuN zcqz#aE;0BZ5=aRebSTXakRu=||1F3K4t>z_SI`}B0-eYIUqbRMr!d&F{H>sL|1yak zG}m(kGQq>TelytK*XG@<7MnmRq(s`In|0=9NLEuX}3P#1s7ziL7GdKdUUgTfUM!)2D%Brb~7kLGrU+33!2dW54M!QWfmyT zdZ$8Wf1pFPkmf(Q({=xa*hA3dTS=)0bW#d*NFvnDcos!ngdV3S7p&G#G(J6Xi z6WDtm-J-|9f>4vedE@&e(9{7`4aBB3as$JW_|gbg@NHkUnZ#3VsPnvgt31O zyk&vEWimKhvTg;r3o_RJqGva_kcU)Vb3hW^tVd@+tF8&)B}=TWAYq7Osy2dbg;!m( zSwLKHj30QJ#KOSf$iMGMZ^VVy`kglpK44TiJ5c%TyAsx-x;oAoM0 zgvq0m^%RJid>GUsyEYTNZ$sLn*Vgtb7sHEx(Oe9mz7=#};U8$h2t?&p&_2E7!{E_n zkj}n2ptjuc7Zwc+3@>Xyv%cM|g&>0=VUh-Qj#a6K2gCqo(EeE@10okd4ESEp!0^%< zYyfzs!=sZ`a|0iPYs(Yog z*A*V1U5flI+dx^k+jWIUCu=9j#BSCq5Y@@*4W1NX%>nUxO&?wcnS1=j)iflxfYu(c zdV>^zHk(2_jT69K99ys`s~(7gNpy!!>2{sKcmcdvVg_{CU2+7-V331BtUbpp|+hTpp0sN*u2tM}m5EvQAhB zD(qutbh}RRU<9r0-2pyo5p;Pthes!CAxOGY_SRI8D)99(*I`V}8=bC8x?Puml1^_J z*kv0aD=A!8bcZehGZ`;=o9=)~;Km7myVpG6U6(W;NCAh*256Z0Ln3hll8v3NE1F%Gq`WK# zO~7@#f^Yaa84t>Ltf!`cS|zNPK~y*E6wrJ^C+k@VZySi}WIYa|x?MMTbh6GtFf&0) z!A@uGn*zFFptH(B4CQZf11$&YW)%bRTMv{(d33Y> znhf&K@fWY+{{4Sp3L1~;X8i{eYduf`YEixdu{&8WgQ#xSCm^bmbuPr*dl24!5Oth& z&typ1{_^&FP^Dp8u?Cd>!7Vq|IUpt7tW!Z0Xw}yC_y7M-cu~*`I;FYs2xyc7^#Fp- z+7}+(tY#o;K>uUYLM-N+9S! zLyult(+gY-FV2HgGPJO~_#AZxr}+)+9H-9E7oEO$Jeq4CFqG|FIIrA3U~vlZ{HthK%RpJ4dO*~)~@L+ z1>Ic+xoYdUD`;App_{dTCCK6u0gqnS^PsHj23l(Xx>T#1wPh7bh%NmK4>6(U+BFQ7 z?4VWg46k*%W7oV^e{t2DfuR$08M-e-n+@c2Mf+9oh%i~j#{eohOKe+jmslQm1ue{F zc+Gb4b+hXg#?Bkf4?xF-er*2DSR(1sYkTt?7sHEyP*6bv4gNz<{{Qcez0&-fzf55_ zXt|q5uk8hpDy>kII&IbyaF85b33k4XPKoewSI~iY4A9lIFCpz^)+L}wf>g#cLCkK} zNiZ#?oKP*V4PN~50##$61-Pt5PgQb3v@`Xg6@j$OS0icyblR&S^>9nkracR=;m zYblRzRuhDJ&6Ru%FBW@&*2mmwuD!ufY6T8akiX?XK8grI^0(i^|NlGhce~!{Jcwwx zzbO0r|NqM-2GCZ$H4GJ;$6Y~(bTho>=yqN6{YIzjh347|jP(i{)N8xvEEmIz4bMP9==-2M6r^PXbS2ekRVD@` zlQw`%djIGD{}*u@peCcsa&S@-1zmy$In4@skelltP|?tQBm(uaBTzo;cKritq=Qym z_@d3nHNSx=0EJ-Z@fV;|bdkoU9YaCGqRnqCI&1fMK%=Xhb^kK3BjD+|40K;tCuk^7 zcFS@;h8IB@ps|FbKHaKIm-8{WcIbf4s+_ePl2jn^+Or&#}8}|sA#(YuG6nWdQn#Q|NnpC3AXVpc$l5P#SEK` zr+)qa{}Obwmg6xN6$X#a`!7CMgX}pB_Ic<17d7+2B~$`P>hC-dyEFvEwga8t)p^*X z*H#qdjN^eI?;?6}W)J`We{oU`aY|!Wf_6yB_MIG4q|q*DuAd?*B392$ADTS;7SiVXM?hO7TlF7<$WQ^iV9r5U9T?$dr;riU8n{~z#a3>XX4<^XS z)&nKk9^I@(Aa>{R7lzQ5{H1V^BSo`8!rGyrCBPnF%a6a9?E^|5plrr!3z7xxmYoku zXa~W^=zwOAdQDA`Z`KZr2AKsq*a9>#0$CyvUJ23yI$nvD9qhW$=b&+=+8Yeu%VWWZ zrt*b>^szo)4ECRm4)~x9(8^f`(6%tv^Prglu%lRyEaqc)Vdn}q5;QapZsqsP0i|(J zYYDPum=nw|^#Y&j0=f+y>}pWD?>z~s|NTJzLZo}Ud;kBxxTp-y+xsDT`vj!Y1+8Xz z$q3Hd5R+$u0u6LLRwt_z*ip3?7{G%Ke-?roavm0-b5$VLg1YDbFM4#dGJ+I>t_S7c z=DMQ!K|}Ki<_^~t5Jj#NJdV49&fEeG(A-!A>hgz9fHr%NF9wgD90H4){$2oSeK>&+ zUKI5Kal2WUf+Qhs)dhL7n|1LbXc&Tr+^2%%n-75ck6j>UH)}JBd?`o}BA>O0kKsk8 z5|&Vi`Uc)2U4c~6gR+rEXYHLAo1H-|1paNT#~1K1v>YfA_ULAP0diZX>x;(2paY^o zhsd)|g$jWNbih5;7i<{}3@?5uGBBXe_rZ*YtYbX>BEkg}*@rz^Z}Ydz0auN87)sc8 zfX*v=&AJ1$I|sBZ^!|(RHqh7#Xsib;5307IT_Dgkpsex>z$FH#+1{`a5=82t>2lU0 zP|QJQ%t09oG$YXe1<@+<=w=Oos_^J!bzR8E@WMqAR6)OCC=~#ePA5U>`ZJVkKpZNo7xh8L5(L74~Idh57>-gpL8@1Tw!NNGB<(wn#b|9`;+ z@&jTD)C1huz5_cHrYze3?1+C)u=!Dj#@2>y<|619j*H#0h=&l#Y(HM$cL2fFO2URFB5Su~mocE9- z;0GjI#ePQdA}Do2>kn{SAKYAiA!E%1I_PQx$ju+@!P!=NJ|r4+KqpnO@`9#NAkn}y zpO4{1jRV*}pgz>6c`${b_T-a!@OH}0d3+2ng24(8do>5-ZsLp$B$G^?>MDv4s8>Ujw zIT;5$S`XBNHqU?_DxP8$J>Z2cjvB?me3~qod zWGo4Sm!nLOaujq3+X9GJ8k$dVb$}{qa2>S41G?|15Msa%57=cKP=g~O;-H~yxYH5T`eE?wJOHNmgI1`#sLDjR5#%GVt_Se(HPJxOy;rp_Sn9!d5Op4U%?cUX z>bwbRwL{z7;ZjTtFaF7Z@^g1A+Es<1!_}a>rMp>=fdduXk-HB{TeYC!flkm#5v;pG z3rIkXjL_Ks|M~YF=yV00js-p?{b?aMae?~W4?wz}fR32zX6>8<>Q4Rvb-!6_=Rgu2 zq>#u5nFUFmDIjJyYb-<_Vs3NoADvQnk8W0XkR(K%4T#yzY6?*Y?H8(p1R?S=AZ9nK zC{&)Sl>NBtAJC;*Aj9}utpET2|Kg7{DCa$z1xh$2pqzIflJh=5a^7Rm5ClqLkOK+}f~sGHd9y8(1mTes^PNP_U`WmV&3fK0V?9)BTl2Anvd zdn}c@OF?J9e*iCL@4V>IE6RTeDf`U?WgqY{bjM$O_5?XY^wTVmV?hZW>>;&ku!q1! z$wiQgUfT<^_!wS%1&MdEerZHGpdM5lS%8vEH|wfdV4p&xVh+euNK{Om1?tCw@BH!T zW^INjgBAZv-okv%-+Bzv{!9dE?R0(c;&&9NT?)GY^npjOsnus z?*m*6FGO8IZUB|z50E=fjF&(?ThUg0-!Zvpc3s4 z$e433AY-5<;*pDB&DGOES8_;znk~LBKpL8B->{T;fXH%*=Gr&RCB`7KoTs_=4P%LA zbL|_Z5(!8rI{`Gw)oUBRkBi}jH>lo`ZUh;j!0=ia%y3|M%>`y8fbJaf=;r004ssjo zg&Cj>30rFAX~PV1r1pz*ubDty=XbA}7(BrJrFf8=rNC}RG+H|^|NsADmjtK`LA`O< zG2Af>){XY)tew+YI>V!zbq;9cxzlw+H*4H}FMk%Ikoye-Q@> zLgaZs%x+dzs63?H`3?#Pi2NH6vzztlbcp#};HzR9_H!}3P;^F$tjU-D|9^QKv}4T5 zl7Ydo^N4HflS)vvm>`f@iBBWH2+`* z-6PBD0p+nkZrtgazi>#p0`u!z1TE$;6F?eq%AYlxNgJO`IA#soaVs^78LgjTzK>02n8p?sDhZ?ta4BzAXW%~1R?UQAZ9l!XkG&}$pwjK zF_0Bj$X2Ym@c;iy&(r z6(8z$Jp<}ZKpT-O&;I}aS`B1tr2;JcdTkei)OUl`LyM5cv;Y621ijNH1_sAt;9lze z7hzeTWOLZHqZB+=BR>%|k?ne*L=n_`xY!Hoy7ISz`~IExUpxjKBLW(L2emms2@R40 zJCDD(8U>2ZGYlmn-L7XK1rNCSbo|A#Bv1`>|HaV>5R)POk`B1{^Y{y{-zZIUBn6;M(RuvE%U>u85apsl zXYC%JZr$?9d<-u{LqO%+5sz-!jLD#Rc4d!l*0{;YStJ1DMM(N}1u?r>?V$2HB|68L zLCcHR?&e~6QEmsy%kSWM`Pte3|6MwiUz7JxJ$^tR~V%E<|;EEpI^Vx|nGPCo zJLc2*{lzxWF-g6mP5$6pMN3^kVlAK*O05S<&0&T!fi^?3%1z{h9Fq_l09wlj)_xbH z9ekTCm^-zdf#J1`N3ZP%P~PgXMfK|MGZ3$83W3&&95H~#A4=?j7uSNuLqPt9EK9Wk zEjUdq169DHuO@;kMd3>DjD3-&N3ZSmiF^z%{uF^yH|y^Tu=E!Y)q0>5x>Fo9KHAOd zJOR{%ECtQTC_!dqj=BD0=w{UhiwJ%H)~1QzxV3Qo3)1kH;k8La z?O%pcJ&$hIbePotQcnJDuKzn+|GpOU=w|hYiT^8Q=ilb~ufz4PM>ne_$ia}=KRt*7 zP%E?B6*@q^4%B7sW)+4?L0g$7PvGsXmi+(!|AXuXo$<>0dIH#4HeCFz;h_0k(2B3? z6F{B87of%b;E*ye1%(vr0kAOW&;r)2AZEAdIxxk0y&N2N#d03qtg|8J!PeS{ zUA6<1Jx(5m?HB>IA;DeR-q1T9y`T$F!41&~Aj_az%2hzuC8~LJv$}#Tg811AY60?A z{9T~lYB#GqR0`^62e{qfmh}QqpX8DqsPW7Cv>&o233NC4O%S{D_=_2!W3fPIK7$Tm z1UqF7$XM_V%ApHD+wwg-Pk8k5E(C2qgl*i90j-DzO>u$xz9s72rFXz>O3<_#xE0>H z4JqdcpZ@><wyvnk8aj*5WCkjzz38Gj=#7Ka!5C;V?Q6Hu@7>0ANYJ2 zR$Yk7v|h-d+}a7Cp3I(JP%;D!2Zn;0T!m#INw5dLrvCpAS_@~=%{m>d2s}1915^d- zfma^R@BjsBH>)i|&q0VD(CM79Gdy~2CvE3qcp+j1@&=+5Wj_w?Er3Ts7u!M_gUI7_ zuriS~ppOsKs0^A7Uinbh2b!wN|Nq~klXX!kN{<4xf2gze&5K+5po;fTH>*=GsJ-~3 zx%Ll3iP&*g{a(oWdPtZ3@|6GoU&|e5mF$H~Egxsy+yh}jinPsB{{Md===A^p3w}P7 z`Af(&59q4j8y=md7dk-=7uN6Hp!Dl{qr}#um-Uo4sN8bBQDWfH&3d<+kHM!KbPU7| zk8TN%UfV6(xENlrS%OL-(98k6%q=E&EfI<;k zj2<}((&2i6f185@q~rySErHc7LslmNHre%p$8iVHQ68W^&js+k*qyBEy?hL>-N92C z-2tHCe(H*;6Xmc?)9FF`v%oFRcFk|Np{~2VTyjl<|-q zOue>ew{k&Fc6sse*#G}8N_bErADYHIdR@PO^3)%&wV=b^K>Ngxzc^s`@BfSY+}O0d zFf;(QmrA%^?B`}+cnKOg_vmI_-wp8Hy^_bDQ@IT3_*ADcGm8BQLh8eT9C5#_>1F~;8XG+c=Ym~18vp=6@8|gw{U^l z6&ts3F}!G<2p-u6E%#am;`5s!MR()T|Nmd-gGxn^kE$&h7+!;p0eAor0hd0{EEyQO zLFY66?+pFZdY~R82ObzI1limzTF?b+h=7$Z0S&`J3x0o)ie6j4E0(Aio64cHc8yQBt};mJK`&67>X=Wrsz?{8?`Q&=kmc+`j-}t7@U-^<#O!8$*$I)? zDba^aZ1&oQZQ^2hpd=-0rDm{^9WO0#qr97yyB(ayML-hZRyDMF8~ht$%S%Z{25`%& zD;}%^G!M}V8k_{@5ik#Q6?8Z2vv$zl1JEU?X^>L`V+=vj1e!i`y|F8T0Xkv?ilz59 zpy@8x8^;|SKvl6vx9HXmQ0oRXXbC>u{e}m0S%62c=^FSvA@+l&-8v%_Udws( z@;+-rY{QrZRW}=|uJis2(Am?VkZP`7!%*T5YLq86g0qh`h&>Hlm5C~~g9_aXCE!N8 zObeu>=(Y6&1^rTEP|zbf)FOvLN#Onq0WJoH7q*~X>5!XA9Ah2hkjjC^H=v9OJtGqB zl=l}OltD$J9emk4|Gw$_8zaDh7Aw?T%xe&}W`21`QLZ8w8Ynq=hfGlWF+M>SymsAaO(lk`f64O5WDmEi*WF)I_O+1*9*-L7{OO9LvJ^}0Ijb@!Ail|rUZP9 z39B$j1Y~U^#9(F+zw`Ku9?%hf;Q3?F@U(*f!~oEt`T+v3BOv`RP=5~Gxq(!!8K3~^ zW7X zjQlOV;LvlO01kA}xzPOETz7!YDFIy~e0Dt-!wYtB27^}Pl?VR+f0+h8NEoyRk)f39 zICz~QB!jtb=sW~DJdc0N7JFSAAmM2buGw54fOb7>@UV1!P;>Vs zKX{`8)PDX}NJ<2a*t*_;I2hC^2ipeP$P;?QgMa-Y5AgaF*Bc(M4~ZkXo; z$qiB--J-KvphXGe1&>bFo)$iam;MmN86cU~1E5`+tT7;V=kXWC6`*!_=nW4>Q0j35 zi-ME$(n#9ssjz#BI|UP2btvPwW4 z`_U2NSY3}^+tzhl3@_~Uk%D34K5*Jx(uCCLzU2vWBsJua`!;7t!pqh`tqg(WMBdGpA#E9*V z8t^Ii;33+pU{&Dt3#UNLZq~z%5IvmlOIr}zA2-K*$)9rev^#Fe-XoT>^ zKXB@8Y5>I(f6F}vEIzBh`v3n+&^8heaOW3v8P6KXxvC5PGJ>{TLr)mX_vp3tTLU`( zR0kA(;HEmbp#U8z{Js1C{}+8=`-H&um6Y;tLkmUWtN;JMjsq?EJN}~72UK9YJ^=9! zdGvy>4~AX%tY`+BL(Kib=m9$GwDQ~w(3;9_)?M`=f0TfhJfX(U?kh-3o)F!7SR)%+ z|8}!hLJR;+u73x$LJY2e-SFeZdqq%+Vohv-Ww~BkUprog7s+m*Egs;LR&61AK}Gy` zNHT^_kK0{ANyebD1PM_0ake68T?lAhejOiVZ^8=^ka3{-Y0!!fl-rxTS>M(}Vil5x z?$?9T2Do2x1;p%TJqwYCjb^;N1RKpL5dpRTL5d)0Zb>~K!)sR1x)bD!;X%#782;9SpbM@l_q~+1gY6VrX?}kUOt?w$(_@5TaGLGjv z|Nnn&L z(M5Pz?DgnoT@2Cy35ywZeBc!+97qdyzzeDC5o$_6%x=+KFvU6z$(krsYpPMLu>om- zSYrsX2GRNhg|&xAXYCG14+Pre5HN+0ZMGZ$*MO5&axuJc(FA2DXbre+2dD~%6hPoX zP)4xAi6Dj2$O?Nw3T=@TvXz3a=Dgt1dY}%}I%ojtc&UM8bTmi@H>d>bwQU5+o<^3n z1x;E@>}h};iLs2pg8FHD~RNUmFSPBkckFO+1##D9P*X3>-?h&bdj%Fg32Hi8Z@ z1g*&iH64$?SOnr)9xgS44CppApJ3_$cR9coPb~oDY`DYQKwR)fX3(Bmh>m*xZ3miv zu<^H-GcquA9`NWDX$3VyJ$hMNS8y?OvoLvpRzy{<;9~G#ykPhLfyZ%I@WMRsHj`dc z6)VVC*?O>ZLG$pSvJrN{Wh-?KWZ5mUJ8Q6MQ4D- zK+=$wSPWJpc|nUCK#F=zUx0>+JCDE62bpmWDZKZTgL>4W9Twp5E&&}62}&C!5}+Cb z>~M$;sh|$PRJcaOn#F360pJQB=9BXv5%6d@C^W&#EG+Utwumqz8CU=cV9++k&f_mQ zKu2Sun9&aIA%ITd1MRW_x3bO_FfhCpLvz--Y6j3mF{qgIK+3wHj1|%OyR&o+to8b0 zi5RFawV)DQGk^+qa8n`t9JpYA@Pb7iTw3YAnDh&DVsZso9e)ex8fHZ8^Z*hTrRVmrv!%At3cCyjG*Ag zv6vkc9-y=eIxhsJf(5O1Lt5<~gsK2BHj?1cS=-TB+5*cw-KO>%PdOxkF&C#^rZz>Vl+Z8*cr@S5v5YsndigFy2EaCi4Cfw=p!4$R$C;~_2am-oT$?urNb zxYPt}ClhWvn|}zF@*ignkB3C(OVFLp-K;+Gd<@M$7)uSI+BHG`M0i^Y#07h_`G-&` z&v90Xcs>U3OnGWIs{mLp6DYZ~H2+`$N&k%FV*t;qyLGdEi~||XOpMVMAiaCz_&{e) zgM(sY9K?^^tgFGMfDJE*gE$=&Rw+;g9=)M0U^hZ?n;0u-NRPjj4YWT45rO>M4s?P} zk7s>b0`AuxGXa-irS8qOcbG~+hj_!{1w5E7znF{R1)~x;;2~@0i#LL%xm!TR4(miv z+<-fQ?PYunFXym;GU^?6{#MW#DPXsBI|zXK*R7W!MPLW$OmNUuon@d>8!{Ts#@`CP zITt2-xD3=8gXrv=iK=rsNUqbh1GLT#)D47An!gV2b_Ly`+$+N1(aSoql#hXbI|~#4 z_5|G4WNaGFVP zuD!!nYK;^|^?Dw?wjK*X>tB%#VA%lbtb+UtnG=8+pw?V_hqV+mK7R$ICk|Op$lCw^ zq3XI_TRM-w$aDY|*M~t-%-;$+%Do$uvpM+NK;w!aH$akkL(2i^nJkcKtK@)r7o-N9 z_B&m79CzIUDy=|uQs=>L*Davh8yxD=CD33zn7c!u*>wx3cd>(^6m*h#2miJJiRMQQ z&8OHp0zd~c!O9azas-(II_Jo>!=p1m0OCy0-mmhg_UhwF2UGZ8UBIj}Z5GcC9Ql6bxA%fU6_;$YY{0??1 z$e*5_M|>5Z`E)+;QGDUidZ5G%!t}H}TFT?o`M^Wjbp>d$P2Qu|wsrv*!;AZJpi#_E zK1eHr&aZ~%6Q9m+ps~=S9~dD+$)K3$Z`A=eNFXVT@c?)aY>TDqk}@@y?$j2KURyVi zu^n=#tBtCmX1XrvX7xP|Dx^y)UV{$~*#$~f;O^r67ttRW89-t6f~nKB#iRK!Q@1O~ z=%VZ0u1hYy05`xunIxx(57glD=yaX&THT{LcLpf^&*0zAz`y+fvT-~g7#W&#moR}$ zYOYB8&Wz_kE)jw=ei`p{jq343H5O zkLDu@IF}7{g3jb(JzfZD45*j5cyzPwECibj8rio|2hV3MhsryafaV)!LV2zwV%?!n zJm3@aZHx>IFYCZJjev%RLCf0mph_J}LEXs&sKFkctf7T`46iLcx>dl?1G+2(3~eW;d%ah=O#KI0``vG5>&a3+Pe})*l5>@05a^`wA2) zkbMX?>Y)A%>kX)gMBY9|s?BfbM)^-3O9^G>|q!4B_8*fb&GB>yKvFKa7xL z%8KT`=AQ7H<6!C!4kW=3pm2cacczX23DA*;;3g|*=8`o9Vw{b7Dd?DsFgVW+bp8d% zR=5j6TVlJOOSD1EZdR27(4HfZoD@i)`2gcF26fQ>X;v;M-=mZDe?A|>1f*Sm zpq8zLM`!Jc&e9{0P8PJ+cuNf&s^{||0cBNM?$OP9Fdq`{9-XY)Kuqv*TBwGVYT$0> z3-CyBDX8K90JNxG+N0O@)*R6JuTn^Hc4|3jc^7D%K=TX6&cm-oxgjSUl5{{Ii&_44vKA_>2Q3`w&t z%Yy_|d@1Pg#2I<;fa=ZTV|WQZWy$r2wdH5W^o7EU$iAEkD19*Hv9w86VU?U5b=Fc;yQYB?8jFBUGJoq@(5C5b)?kPVn|S_~+5bS5 z1}OY$y}MbnAhxQ*Yyjn>vwSM{PV(15Zrs?dU53qY&GN-4kl1>wLb?Oem0QNvW+?L@K^?7cC*fh%7aE+ zomD_XTA&fvPLO0Xp%K?)uqyC~YXped%^C3sg;0r+b3 z7u~KeS`Souzi0rt8hnpfZ|Do?`T>wK_ZOgn)x#dGw@W|^cYjRdVt8RI4oZcHWi4x# z{r~^M9%R5@aNi*<6V!KrT*(Gqcka>6x+5DB3|6Hz9^I^~vf;rnAH?hhP0&D#g-J@_ zVgb4-1yn46wz$-TiUr|WTnsPvih=Bh4nu8T3>r@bjl+PhPE!Qc8^>Q9F#|W!K%7HR z&w%Q=QiXs2n{(eVf_HUY_2_0*fw~D2HDVx#Kmv;!#O!8e0a1{W`)3x!`8xb98j!U1 zJPYK77mOaAtaq~b7+&0d1)hm;0IvoK_2_&GN*$fGFCbIT-L9Zw&av}|$HCec?9GQk zExH#BrCctZ55Q;Ol?a0N%lt3B1{XNf30hbgdl+O?ut#U@2Z%ujb3Z_}e_$y6*m(nK z%mK812zr_@_(Co|*wTqS&>A%!7;p9e|Nl>djfJ=nyr##eI~BCC=0fv>de9`;!P*P# z;C;}gT;OiIL+gPO36Q{lgg_}fcx@VN-`?TY+a>IczHdPDe;%NDZ*ahc-slc}(;?7$ zyL2H)&`0wDJbXMr$5M2bf_A=uHU)tyy9Z$F|9BkCeE_ol0RzayKTs22fM;PlLtk`< zg7(FLk9q)I=<~uu+w}utNYkVFjRYtZKsVHPhJv^7f$vTSnGd`9<^R9`|3UR!D6$~v zDga2hcy!i+0|mU$2{g~|`U1A?4SGf5YnJBRGmM~xN_8@j{tqMQLco9EWkrk^__s5p zfx7g!nrpwX)$4%OflgxtN$_vK06Ht<;N?f17d&QoaDtivUj#tLc{ICT0JR){fJ5O! zbM6;*kAt~C*g@J$?ZFcapwRySNigc&u3u0a>)&s9aD#3n`|-b2u-g@?jJ?tK12_P| zYwftZT|a>Oo31xN+j?DZFm}6sPz6bYRx$g7=Jr7`r|tRzlI}=>^t<`(&Ub2=3axfpl%%CUY^o_#uc?h`pN!YB{;? zKy+>2fI1@M1f%0h$Z38=%%)`v%gr{Rz_3jI5_} z9;j;zwg|L8rqmPUZm>0-t~a_vLEeBKAu#7R=tkEo-L6+UkH5%(?7}+%R^baOGfqG^ zPgMW;{~tU61a@^e%(%`&-L6|e*8-Wkrt&dBmLL@W1DOb_eL9c75QCTqDhI&c>^ufG z+x0=`#m-M2y{3Gic@EIsd7w<|0yehu_zUl!|NeV+9_fzV;&J>qsAKx#GWe8Y#FVjb z=Y!6hpizH@&SU#Q&9@g>Ae)+xU|F>X+uRCXQ46hyxMV6CNbAp=;GLUk;n{^sk zJ9r|kJB5$o<#t8}hTS?03=A*VLK=9bP}?BYRXRd>42apy8VZpI9TNJ(hQ9@L;!5)m z8~%Pr(A7gfluG!Tf9UYH$bouPdJq$pK^h@do&<>5%_<0@I$dA9=Ip%DdHh9^@&ErX zB0!T3hZ}!`mVlJKaBY230zIYF#Tbp#vr~qX50(j)U8?=eDo3#Qe(|M~y;B_Hr z{Wn+u99%KUd<-uxtNj1pc^K^KHAY}}xh6wm#|}LH#tF&+jeKASLdM@dgYL2FW|c!2 zB%I90@LCkKzX~DtKZy@Czz;hAEeT>CB>bNzf!q$Z{|<=R&3Y9g&%f_R^KTvg7O#K* z|2O}(;csySGnDvSEI_LNgjElRnsz3jTIAFhhyINtTI$q1X9d^N%q8 zc0nez*(c$Ni0%{nMA+=pZcwIs$;!mQup88Adifiaph4S8Uw#C!ctJ_~If%sxV%-I? zxIwJT;Jy-Q;FAG%9O-LAP*>RF-~;B)TON!TJepq^K<>+9O#mf6NPvYVg5w7i{;p3L zUwo4QH>Nvpc_d%*V7vsnxgIp!VQ4f5EmZ;~ zQP&&D=7ocVJ-S(g65wT%JKT*g-iYH02?0%#D<+ENA@xzZ(>rFMM78|9`FM(QA7Lq(}}~5h(5Lwg>f?89@tiI&XM1A3;7Z z9#kfF{`Tm+2dNjPi~R=`>ipZBL94q#7X(6?HjE|QFeV%5{xn;L384G0xR4yAG7Hpi z0Ori zkw-T(XvESPM0Xy4Ash`FOBbz=flTu1K!vA8!B%0;?dM{6AnZ{r~UNtJ)_6S`&cH-DnO5jblL8Awz4Z3{jAeT|wSK+{%sH@WLsT4 z$i9i3NCCt=6MXEz2hf-n=z2cX*)dR?`Nc$VLIB-!%LLm06bDaDKV!iu9-##kdd+V@ zOUPe~lFVxk zBv;1H`2XLr`3<9M>y!FJ9^e#%T2w-82Di4rrh0ULZSgf4~*zJda-1WQYx*rp^P8 zZU>kRAhv=B)P@Ie8?Fk0Z2-x_YG zcY}XhKmd5lYXG^|93kWfKGD+EdaRD?O*_!-0@Jn-~o~J=mbwK-0nO3S3{j28|Y&^>Q)1;AcmQTUO8^qQ_mqC*Zx{xdW=DU3YYX zW-(rPKo%z>_2ar(TcW{<4jQdx(eP-^1~I!?Qy}vE(5*|Y>p&R^JmQ5g1}U|G+U8Kp zJ-S)dL1sWwfDDM)%_<5p&c?PBw0nvjBnXlJ69pYB`y2&#!V3_yoAqH7)QRA+vdd5& zXUU~*)@_lXwhnkv;B!!d$z2B;l>o0>fZT0cY6ou2LI!DD4wULc7U3L!5d}Un?Ql1% zbOgwV(i)HixFrjnmqt6QH!kGpjhg>|Kj>>@KL4RtZ%^1D3N**c?(?NJcq0* zgYKPsu@=&xfsA~>N>}I_$!^wQux8Nwn(H1=Fqr-U2LoiaCV%TMP;(Tt0@I_LbxI^O zFu}(mwMD`MyE+my7!O(}$nd(rqnA}06!@SGWT3HdP?`oc03d8|ItAs_7w~-4%MZ#& zqGllTAc`bBdJ7mmz?TmeO7L$J>Hw`G69dUZBAh!CG=jeebTX~$9*=I;-w|Mk!4jIx z8c0HGIRGAbzYCGIQ2?)kJP+k@^0x+oO4DA}T#&(?pz{ksm{6|2&j)fXOeMHnLCW=t z5VHnluKxiZPd*Sy$%|t-Q$rAx|3%$F9WDd0v+Yg z3Q8)+|8s(tb$)>Wrzy*Zfeo#Z_#q@um@M1Lu8_B8%qIyLSwu8JNaGcdDj1RKP z!lIkiC=7aqpJo_nP+l3NbcRQ-2xy-rXwdpoC?5kfIRA5lyw3UnB+|`#Gn9{^Tl6!C zlYGeo6#UJvIKb=CK?lfzMz6q~HZ9J7|3P=~uzp?1%V6pHr;fAR^-m}3^Od~F=c0DA zDlOt=04ClyII*6fhGz{9x>{a()Je*W54u-~IO=GJ}bE z;w)%w5U6R?c^tAL717p#jSh5{UTChp!%zb1eiqn(*SD8~CT9}bxENljF@VAuIxIb- z|Ns9N+MxBy_ZUIDO|8IgWGa>P=oYmD>Fj3J2T_oLg(rdx3?9c>6>T7WWsh!FDX=6f zw+$b|%ju97%YSRIh2Z_=%peQ5f^!GdLUoXZyRQ8I{}O!NLN}{N2q*?!f4q1kg0hV+ z0h~s_E7Da%K=~57l}-Z8fo-MZ0_ld7h5v&=36%9mFi0_jjZO*ZoRtd}E}Yx(U)D4+9B8u%#^u$EiXmJ+!h9=OM zAZwKsC@?@toweKwv~4|y##Y)IduTlBmo*lN%vxVkOikb2Rfg)+bdD;7FSpETD#k*i~Uv6%%lV+Fe8 z8J4wsS?`0*VPW#<1dSEf{$St-?~v* z1w}tRx*0%g13-7}@PO8|FnIKe3W5ynWC2z9KRkK^K$9FVJUT(u!He$DC!G+1;|`#a z2+$_r7vQ44Ge7`oLK_jru0Qs%g8MMXU#vh~9SG_ifxOiXHt+|yy^Z3IP76@%hzLUL z{()0nB1l~)iy&I@12!Lg{h;fIZqV^GuFxg>ULf~$yM6#&bdn5e-+utD`vT`YLr~u7 z_T=zLK8ZMQej+QRrhym&(#8mC;{WIj;6U{$`gAbWwfDM1L6=%X*Qq9fcKvsU-hlL4 z!4(`Eq*?@@Bsvc~pb8#DegMvMos1rxfuO_KK6rFGqQnvS-aywM(3r#$dY~&byIp^P z-44p*f)IOtcyxo7)cojn;DGeeesp?qfEpPez;n*1VFEey0x~59-gBGG1gXYC!N;|A zf;|8_%(C0{4`eyp3lGpme4r~(z=lFE&pQU1NoHpO$HWV8;Qj#z?hA}q0NMD%qqFow zXXqR7ECVdwL90`{UEe@#`2n#749&#Zbcytz&_CUq_!Fq7n18!2i z*v$0r|8dtJpcDX284o}gtGoWGS&F=51XO>5X8S-3gE~WRKyKuFtqw{^=++#7q=Rdq zgJ7Bd{fC-*18VA7G*dyt4?jTp5-~>)PH~{>4QbyqN)88A@t_2<8>$kNGQi6XK;Z^5 z%cC1fYiI2rQ1rl4J}5_7y8fxv0S%y_I^IU1*NHvIi0-wV=NE z2Q-)HlyZSWj*71KfXr{5@aQZ(0PczIivpEQy|!CwxfotBb%DF`;5M=T|G)o1RZBPP zRZnme>bT81c6ri*A4!~pTfdHu23hL*8PBA(D;ti+~)a~HW>G}tBd_`$CWMAzM zF;D{-yi4K+XyBt8qIw@l^>GIeP|`c@`UgaLbhB!EgGyoF2fG9qK|yY*bUgs7-66*VhkfM)wfrA=bTWbSfor$x4^WTq_=^^}ouMbdi4>CaxBmSL>NbE& z20M`b-2tE?xcMMs=SdI7Qy!fG9qgYM=xuB4JdQDet2E#(d&8#luCO+*TaB&4XkBe;5GzwG$g|d-o}UpF}qpA zpz=E4b#WdbK}egz){Bn;e7ve)4Hv_UI*_+vCy|yk{r~@>`PBdaFY`gIOz`yA@fS~D z|Nn2JQvzDs^rf1M;e|I?%b{-9HK0SIpu6ZSL0UaPT1`M&yImiEVjXJ2VuT5sKqhcv zGvRyV|Nk%8KqhD;R3%o8wLe-I z7#K>Fp^SRX=Gq@FB^=GQKT=BgUQ2^kdL4hU%MWz?FDN^LV(UJL$2g(8_Dy%`A8;id z`T=wlW#>=F&JVEDZzAXY`~PC?3FL+&sDSFM{R662dPQecfliY!omIsJTKj(z<4}Hs z&e}U3y{>OS7UqE#oq)oE}65<(Dfd3wN;haHI7&1w#n*8z`NXo3VG-j)L~yIHRr zK>8QX;H08d#l`R<_%kSkp*@VFp!kkB@&EtJ>yVIL2GRgpNCn9q?SKCM2W_Q?ggdC2 zcl?F&@4x>&nh&smocilM$S}}xsG*=D8`fJ-_yx{X#P!yXGZdE;f%+3#AiG-+lzm7C?P$)}LUe=qE76`&b_|&T|K{i8THXdX#wd zhJNwr1sMUZ`L%Vxr5xx|=KU$49f+V!3CJx7l%o_nw64K6vzoK7kw?4i4ONTHwG1H$*`B?!_|D0zT1Lka4}P2f#tFtQ;H!J3$mI2qydi z1%a6!GzfI{KzaDJE+`N4w?Otvus+cRS$X`$6p)LX52SeX25{^EjhJ|VX1N$IfJaZj zwVKEG?;hEpj?W>F#zzd`1AHHPXkPT_Jmq0|r9{Z1@eKp0+G_4m`2jkR^Yu%Q&O?ol z{)0M*npY6))=MPGSHN8>>st}+#aOv;A|6i_SU|>MFz4<`SPLM~Sj{k`6_-7uP z*E~8u(Zcbdt{7x5^bZs#8z4LR6C`*4@aSaS?##!qKM$0|*g(VE&@*ddKxYVoN6A>H zIin{Ra32M9;*>`>YlSl?4qbnAv-;_PBDYk@qnGtUDJXbYV?aiOQ}60u|NkFn)zE?L z=|M|k*&3j+#wU=W-wPhy;C{&m&(4#Moga3pKmvRU*hFZ6t3Zm74<4PYKb>G1!~?X< z1nlDDFPOiAvH+-nV7=i4E@Li$GR>bi;H;3V&Bt(@HCh|u803NisWIiz%{mvPwbS)S zw`jRGXu{3)0ywqrC;_K-QDhe_`Uy(y0ou^i?haKCvQ!9knqRl?0nqWs9=)y~K`Tx>-3vR43~%EtFvv(CP~bkIvtnA3Qo`|A}{b@)Nuz1 zP-_v)?u@Vi)5jegz+%0uC16_*gZGlX@aSaSqshncTHT|UHTo~eIS7f>APLZX-wTgU zu-hPu;F0(3L*~H(JUVMvbe1mhIL^xK01e4*Ru+&aq1Dn1P@uOS04+AUgm!{mc%cMzQll$K2Y5h& zbr#4d%R?pN-~wykT~ILg+WHlNPJpfX|9=AH*0>dr`Y;YOJkZOU2R6!eMX91kFRP;_ z$Stg&KrZfOoeZ+9lhwtJj{$P|U^nXxkWA|Vuvst7&c(b)t^z93gLfSB;(yg(w* zv<>PPf(PFYcz}}#h!67J0nbhr70?=UkIo1Xe+9^B8_+4$ozR;tOF#>Cc7TTFEDx7* zdw{mQgYHrQ4MfHs@aU9v0;R<6W{|}movc$pL;2mTx?n+&g{(~=5z9j*(3`;Q!AZr| zET4&F2S8W!uqJ@m-3-uG*`Nuh=GrR^r6wND zwI3KjrwO@!@UV8h0djCCXciIH4nOe$)c7pr@#toiwc=xV3338hr;JB8>t&GhK=mag z1^&DZI_=!`2Pj*xZby~VxdV{{kEDQZHD>~M^C3sGz_+u4Mo>LGEM0$q+zcA60WCQR z@PL$|7aoJ67m`Cz%h2Ta;F!i;hJw2z0Tv#;tQJ2(Ws>U;c;Q*E!pHDh)1#MF?gyGo zE=YzS>|pQ_q!YlUJ7}gDx=aPkgrrIj5W717G^Y5%qccDQ%!ifOAi3iX3ZT>rG7Y7_ z4<3U94S;pKzJS*Wx}XvcRP%$kyupTiAq|WlphO1lYJt1|ppFv*Xs0BfN4Mx_a3q5| zG@#^&dMO2pMc{Ff&f_nRfLitF7CnU2_+X1b4Kq+;0rzCP;TCn_u?Rf)1|D{0eQgd} zUEunol)IaCwFMu8rR$dx!S2v6piqD$nNpBl$65O_;s`OQ2Alc-M@Q%J7xO_~FHpFFQhg~jS8;=qVz2Fk zY%Ycu0p*~A0TieX4xmL|ybzB&IJ^YiA>Pfp(F)YaEP=#tH-kra=?jluUS)IG5q_P= zU;Kj<06$(rPY8M8(aivlSshT90Ms!D4K0C=WCJBkw0-OsSKvGC)7drIb?I6+oK%w;j z|I`Eg+YX=vJ*1ru+Bwj9a2IG3i{S+yIMcGagJ(Wmf4l_McF=7UAe*`! z6j~2}Zd3*p0}c`%-3*|UcC|{nwbS**Yk_9hFQ7x-UU+~eLSPNA(wC6Yxnujm z>kwOCgG&cc*&^Z5&Cy-@1w7l+?Rvuz-1+^V3F<8zhYVf+c>NbT6AZD(0kl^gwkRd` z|NsAJL(L#Rg2&K3Izw-GboyTK=mud>84BCNa{R?>Xk2!)7FvMQ4>aY)LfRHnGPxLD zTq^;kJktZ<_;LN=(aXCP#OxJa2BJETzbN7ZM+a)I1~uGvfa{gc<1fy<{QDm?QtA4| zqnDK*tj+aBx9gWqSMbhRPz4Q{MguntKw$=16$9$Bfi^{flTrDbzyCq1z_UsqH4+}( zzB{06`Mn@P`2xcz(3-Da*4f~62N{$F&xLh@niwFy1E`rXpli=gbhCDJf|m|NLAIy5 z{&?;B;^iAq+5nf9py>?sOTL-F3#KGNNdY3=dHlt-=YRi$n?*l51Uw*H5M6)pZ)0dV zPzt(N`2+oq;*F}#=x-W~vI<$?zDPk4aqWbg>%325<_ZUo9tq2M@!3ataJ znClJ&-RlQam81bu1v#fF0CcP*c;RR00*}rB3y*HrlZGHS22_Au0&$ru!4$yiEDIln zwE!_e?Lt^5TpqR#u9wvZ>|K;J0cs9|i*BOQ#OfEIfE=P}!UNvQIsq=PVLgWK&c5}KfvO$oGA{tU`@ zy|(|7xfot#<$?8q3Ovx+bGtwzsg{SJjmK^WiI*Eeio01WK~_S>&GSG^aJKaTISix~ z)CGFs(Om$V!Ukny0Z*@PqvW8v zw7UZ|ee2Q9`W|czXbm%{diZ~_)AbH$u~RAQi?5O(cR;d+AseVU4_f2R-*OVvo&v9t zFIDpB4hDr=6KJ^B@(`#C6fFU+XkYUn?-Fe}zz^B`(-{jYm_U6`4v${Z?l<73PDv`H zUkO@t%$g513cPO;(jQ}O1`Xs|9s(^7b-m!zouKfd>EFNqo|Z?zb5#*ZTnsPf-vV_W zKx-aOfEUX`XRFvj=VW)@cAY6$T`u{*P;Gq{hI-L|= z7J>ZOdH=;Vb#M&F9qpk;I5D{G>?^7ucBuqNyc={H zcDE=y$T-Uj{H@c#DN{5Z#P4Rk0irAqm56|pCP0+>fWStQ$d;<)IQ? zkTPi{@Ot1Erhota?>qq7|IiF-)4ote_`zA30krfMYCgz=90*A@Wl#cPeF`311AEX{ zi-F;_BgpLiiXgL(f|!>y85ltK0`%IRPT*pA@%08Mra+eppYZ8?3BFYL7&ytic$NA8 z|4Yzu9}`|eW(I>nMQ|L%$)#W?XMl}8@}lVvIQ}6aQ>Y1YhbU-_5Ik51J`AbX)&XQ& zJJ>dibWsno3Uq#PH|sTRP?N1R*rS{EF~};E+;I^sg2)}M2THU&x@Avk^D(^m_Zt+| zhdjDXAA<%iK@~^mO;85D_Y*XCefYJ3N4M+(kjg7?l{-;YPW}p32?{0X`MVh)3qkW~ z;4uT#TqXkwXuP?sgd1ekPf$;?^DzH5X9e(4&&(appkk93WOS!9D8Dj+na5v9DuA-J zvxG-4t3AkNoz9>Tp8_6i14n3$2I!b6XNTq!3LVZ4Aj4;V22HU;HuQil07CQ#AVZCy z?jdAr2&CfHgA~A^{Kgs$vcvKacrG4PPD+3_bAjU?y|^ez1Z(R&{z6Y3-K@K!Y21wX}?wke1Buv9!HBibs;?Zl{6UW8yqU{4M%TJYsRD1Jd@UI}Cy8tD9UxZ(OB!!`fDf+( zZ<~Q^JL+cj(FCW&c#m$@NKi+KR&kIoyf9l<{8@J^D^bcPQ! zIplidwd0HQ2cR|@1OK+r_o%xOA$<=%{%x-BJCDCexc&EkhwFP#PXxUGs5A5jNDF9( zg6jvU$Oryy3>~iT8*1M(l!Epz{s1qGVLdAZ&KEbJja*%DvUPpn0Xiw6gbg%+47#bE zbsnlRw*UYBBM-+kzX3Iuz>Cs6Izh?I7qndowD=O#Z~^7wAJE!(sv2n22a<~+o$gN8 zAJ}s-w8gawROR*B_C#?pyf_ECG6ys~QxXXodjZ#>AoD*!%{N6d{{witRHy3)yymZg zn6CpeKM!VpDQK|n2htEThz%ZM_5ii2z(agTwkz5Qfs!|~BK5U-F7ssHXBSa|;i{Gs(q`Kuf#4T$gxENl%O9s0Iyk6DP z^+zdmfE64rA0W$QK_h0ML14HXD5jvxcR>jX904NWtk4aOfbJjzPHmGrqWY1|3zx6=reXx=bpk|sj$ZF7FF(~djkH3%x@j*(! zxfkp{P*wZl+&`4%_Mm1?;~Q}EtaC5u@R-i6DWGBJ?p6>7G;#^LyUzp01vh+>6d?&r z5-#i@;n4}!fW2VLgemNFodG%;5L^tl9sqYtXMi@QzLeqyHF`m^putm+zro_5ZBd=B z51RLa+{91<>MhOypLYeBew*Qen0kKj@){S&46rl!w>da8KVWJ(P@)61ntz*v0_2D` z0jLPb5ib{UF))DL{Bi~t1H*C1LBucxoyT81kp(rUK;uwI=CZULDDj55Ne@YN09f^5 zk6v5;P%efSH_w0?Ylt(ZJYv9Gmmh!{4bU^CUS@J4IU3Y=W&!t|!L~t%i7&ux0G+}K znyZ6F1}M})g*aF-)Pww>^IW$y*KUz1SLt@$f^@j{gHXir23JC1#~Xl-9_h865W>aq zLJQ>FUfwOiTnxMVKFkEkxa(nc$ z*4zWNqFisle459>z|cJv6p^6*F=QC93^Jp00%{s0+7wz2fX>(l?ZG|%;cE1Vb6{P<5Pk*BVZmS*bsm4QRvMIS4ne&IZOZ%u z2}0tIe_Mb8`1n)i4$wR@I08MoLA`a54?-WnH3mq)PTqzYeM=1zAfQ=dn6hpM3lH$_ z!4sei1Br{dGLX0cFUkFI8#FZGdZQHXVQ!FPAQ#4fz0wRd_5>SdEL{LCb?S6I(OkQQ zy_C)4d+dqV(#^G7I7>mteVt(7p8}do@#u6t@tVcsJ7}>n)IV5U#g6Q%D4452$;I~$ zB)P!+`AHSxPjf5|vWGedo}6|-;z}JN4!SNG>?t)VP&BxLMo2-!*e}E&`~}UmTZBO; zXKWEEt?=k&y##T`f>IrjL@5_|lAO`?!E4Y6*Z~hs*9XU4w}6&OdK`BJr=yoXpmf{I zIuoLCMX3>3qYg|NsPhbt1<rd zUj*ptN7lsIPl&(*{uU{)fNdbi zoJmk~e8CO^`wilrec}KAzXTlw;nB;=2hqBs)EyoO$6p)}hjgAHnGRB%9)Gb)9Ohp^ zknzUHIT^s?Hi*)0ei+!JyKaC(YypayIp}7By&eWPbFV+>{NH03W_m-+OoN!YqQu&x zmo*Z?SpZsK1c{Q)<1e`3MlAvvHRTv66cKJ?4g+1+y@k7ktGRXy4}a@2P`|gi_5cIq ztU`}oR%S?0EZ}bijeo()rb>_AsWqUQz1Oz^9z@`D;qdTk>?HY$N_Jk;F_ zR^IK}fE45)U%W=H@?yncfoTHL`|K#HYePZTgdKN10G`5!L<6FtYJS1h{6mPp{T%3M zCggh{R{C>+HqwF4&=j5P538!cvljg8A$jTLdQb`hWwegDM4Wtp@S^V0=T@6E8uhPl1aCMb{HA zp<4wGcrd!2c&QFkrs;a(B{2KdfC3lweZ; zoz*_!VeNXL7Mp_Yp!kMbQIAalWF*xUY(fnd1+O8~Kh~}X>afX1!FGp((o_k`>4+XP zKz?{_0aj58I>YV&16CE#R&y?B=)c!C*_(^u#Zpl6ha>kV*q<#-jG z@gVI8lWV9I!%fH)6Ogq^oyT9Cgz!;Z3OYuU5mp?6=OiBe?g(&zc^5!_hz76IRj0n=9uI&`x{7@B>+=AL5e2yl2E1r-7nryIeGfkkD(9=cFs zk0fOPk^)~)uJ6Oe@M7m7)Xbt01nPl+?MIjm?nyKr0kzQ47f(UD;Ghkc;1LMW7Pt?P zMGK(z{}+^YzDGA}F(YW5qv>u?A<%jJ#q@Xo{v&Te1RZ4A&6);M1X{>p3F)1Jwi~@D zRrly-jRDDYi@Jg--yhHgRGj2vX6_ItfHs9)i>tp!>=}{N@8(9-XY^AZ9mf0f>Tao9PN zKvNzsJUT(=Ih_Fsc8gvGQDC_X9>>9lD0p;>?f?mPv+e{@j2DhEFnV;et^si%lbs9y z@gnVtgv}-@ICg&Z=~b2a4?bPXr#FG|7=w>TZ|n(=&Kn-R5saX5$76T@F^UxJP!V10t+z6#`6 z-3JV%6JE1;HXmX1XnxJezm3_kgGI%We;bQR%Yo7tpz8;~?qo!D=Zi&u{{Qz(z6x?c zr|SSX8RS@~f~X1SqaK!-K;Vo2eck2$pGDt z24XiK2mtM00bQ5|8gqe^bfA0Iet~p$i@pX^@O%p@bzqtMr7FlwXx2RpRwsG}L_rgz zrR$HPl^)%!D?nnc2THB>gN|Z*v1cbZvrPKK%K#Br4H4)BDLc;E_lFm>F$Z*tM)e;^ zrhQ%N(Jfj8lI~_L22qxWNv!# zv+9B`~|1yiEmKor7=}hD8%bz|(l!7M3K+Czox8A$}mu5s*kFzu*LNBV*aTg7Teu9ez z1N8O{XgS&nk6znX&Rh&Hdcau)G|c3>0yLH81HNQ!#Y-h7(74?f(3l#yy9`cxu0LL@ zc87lHym0UV6XONO1E5MDv{Z!wbfo`<<`)K_n*>0s;a*HT3YyRY4U2$Q#et4CLAiX9 z12o_RJ`EWpZNpd!+Th&e%mq5p=>_<{60kVvrlelhLYO${xc3z=JHRJ^g8HWnpmq@> z$VngYIq3sf*$ZakoYc#Dix=E(0xf{Q0lHof+*Aauy*vO~St-})dImh00$F?o83_X| z$OGMr1X+*=mWO11y~Chz0F70E7UY4HfEVP!wnBi+2MwznfG(5-t>Of+K?@~!fcIk@ zK-rH0kpl<&0nk|b49Mw9AU4W=j05n^6OcptK>EPTJV7x6+Q0x>jD)EOvbt)AN2lus zkM7zR-M*lMFg&`!YgjjUc7n#t!L7d+<`8dfKn%7Adq9p>hm5u(COJSWpFj<kZdosv3^L4f1&vg*+J1wy7s0wfC)70`L77np zEvg1}KR~k!h>(QMyjgQ1LJ~Bq0vdpKDz5G@J#ygY6ft>hruMWFNtN=7fLZh%LIK~tUJSwQGuGi**Q49Q3Wb7CMP z!BaKr5Fi`2nD60$ zI=A!xBJyk)xIYJ4O$ncph9&Vu?1*3hr!m|MSJ=VX=rw305;V`*?H~a<5Y6>Z^8*2_ zi|7&aScvohvsRmAYe846qFKw>dZ0w18{`0{)&sCLkiDSP+-v*Gii_cejT>lx?4RZb zOfUx`@;+?Y2GXPfEV1^nA;N?}VugkYXaE8neGU?^%LmXm6@c;w_PilavUQ*+09gl` zE(4_#h6Yd$$Job!+sZYpMEel5#R3!vpjC}q4}->HEgbnn&(tKuY&m z6W}pO0<5&)VtBFJ8B(}|5*fJaWi^6Y4K){3S#-0ivVfLHm1x7#aw+KEHc(;*MX*P& zs4XODOQD)TJLbW~aOd$CFF`c|XsQ=9?8D#E2jYU<*?Ig$)j!ZJkEL~>^&ar*X3~zo z|3S-MK&#L`>;o-T0#yMuP*Lx0)`iR{Q4318cq$su+zv>I0C=$hC|QAK1&|UEZd-Clw}k`Q7SgJ!f1sf= z=;A_PfBay+{xR0y2#EL}g8 zs6*B)2!k$)?X_KE%Ej>FnFI8M7)X$T*8?daMGkTdV@42o9FREAfGSC_`yTdBlYRbOs^3?nXB z;TERAE%g22(Ovq%qnpj6JB-7l(~-lYGf=>z+fBfuJ50i((^0~sGf;u}RK-TTV~|so z#B0!@nXoQ|1yYj2U7*kY1L|u*dU~K#fv1RtRT~oEB>^DC#93iMv=!i$8K6#&L-Q%n z_L<#p{Qz~254>P$ ze!z&n^%gRbh265Rzle?{c;X1lj~f z3O;5MgKryXY>mXU(S8y=_!Ni^J~yK6Lk_OCN(TOUypMVCzh)dDJ zkhTwaw<4rJ0bVZ)E{QI@Ai;wL#M=o?bI79upxH^-U<6TKWF*--uutLRfDpeDW!1E= zBqR{fDjv{{lb``O=yF;NtMFG<>cm?IFU@}(K@>+Q$J!Dx;B8e2&V98D8vu_#bW6259yUeB&v2 z)}!3?TE-p!KG|G{KWNpeEx5@YZY4$sfI@Z^6RQ<27c2-36Ky zfsdhr&WHj{6U2d>0xg9gQ!AaW*cTb|w}8$Hfw&2@uLguc*Qbci{s@Y=3nd2NK@`yN zdh3A_(0(-NI5KF$^@c~UX)3al*dR`VC}}-V3K|`|;n8_;7wGyq$cRs`t*s^(!;6?z zpg;xfEIYW1je&syCaDFIv|si2|I3q*0WOg9Ej)TfxuNa>IRPRDp1%P(;gJR?u%MyR zyc}%s1!yJFa-an62+#@jFndmFa522Nz7kn2XhFU_Os)W_u0=7K1KAaz(|KTO!$E2TQPc_`s|6jE4^wLeQmYD83mPI@_!=~t zhVUM8Fg{l2VtDZb5*y&f#(Zy46@yOkf|>jbr1&(F;!Cek6(gH`5Ttk>l45x@#mJ#N z8>F}pNwLveP@fZ&(?Jo}s*V(KrIKfn$EEo=h2{x{@^<`*8ltcTZvMtogg z@VB^w69{Y2J5WLe37CNeAdBHwKLO<~SRz$GwkUDw-~TT`I~%)2`#$nAbh93C;RRhM z)B6oHwg=v#e*8rz$i`mLP_S(m_*-s)@7<33$jbma6^1nwtkM4?FGDZ%f(38}<=vwO zIyS>}8;F9PLh*44)MJQI9auiy26j87lLt!FpiUn4d=OpyTK5K<6hOTnswka`FdWhUOQHovd9SKr1RhIq~=l zv!#F0HY$QUKgU@UKR^r6Zq_7kkb2PmJFxMRpjGYNtUe&oPUtB?@r%)o0nNO?_d9m8 zih(RYz}U&k`vDXI>>qd;dU;wQv*eJuG@oA90#$HW)`BQlST0=*4$Bvi4F#~I|Y_CM3g60BvRfZ5;)BBM7vQ8`Q_^JhmSkO0yS%LMit> zG?Y@_qg<j%U|#mzrt_}gV!(QfwaRYj~PZUi}%@q*od z$cE6)gS(J3YPSj(!wV%)^8F85yb5+MYVlbJQo#UHaTlTjG!qEQZlF6&)R0{lz3A`% zmpfQMH|KP`gQn{Gcc9p)e1{&6&y>M2A&snG8tOaLnBWF&#|OI$8jK+eA%Os%nQuK% z0$L*V!K2$lpqo_?)gI7cs=d6`5UcipC|HzjSO|)WM{l7~aq}%N!%OhVV4%%p-3|ia ziU8!nK4e{03;+Iqc^$M<2<)DNyFhy+U`1Y`G8e;(8;k$`f4LP&1#&GF3{tTToK-SF zHiJ@Y{991c2UU@fAcagpi2neUX`qw@^>f04zyDvdgBG$vZAOkmR*<=IAe*hhHpA1- z7bS4od2#H||Nk%LQRN;&km$x%H@WeNZ_oklbWcxhklf97wJlRW1!G#{`m#MwJVK%02u2|Nl#SR5?qi+$oTp zGOC;cRBjzejvZBw9V#~oBnLhj4B@|bijeRu1Ie8S7lQDxz6zBC-2(V>GpgJksGJ>0 zALL>vxV|+|IVF%>H6tkVc)x~b9;er!%wzK!J@c$o0B4>Wh*t27^^1G+V7UT0A)WgQ zD#m`jLN_5DY66IY<%v0P6Htn=ZqOkYpty$>V^`+>{r?hlZFo29!dFn2&UgiK=_Cw$ z{>y`1dK=ju6SzIdE>!`$Gyubdy$};Ffhd?uKh1^t6~(0wzo6wBEs#quf@>33M41UX z!UmMJLy#Rcf9~J^6FjhK21kUat>ti9-zo2zJ-)9E{-n>Ft;G`dnR^D=n!vUa@yc@{K@1S)D=KOA>`lK^S3 zfXaB#N+d|L8?=b(4g64B(1jq-D>7apB0>Um?+tX-6KIwLv~?A9a~`PH0UeDCI;an{ za0|o+Euy*sUPSc(Wf2ub4qWy=Kw3lvVxuggf*qO*K1>(92n^{^TaX~g>6nTji>N>= zyFf_*wDoZZ=%^~tuF+(ONN0dRx9bM511@v~fQ~K%HO)c8x0bFOO3XcaZU4)0F}(OV z5wv>f5J>4Uk51@WMbV1?|3l^xK{u#*^xA$0DV?VRPLm+ZK<8h9LIuPI9Z;s=(H#of z9SmA>rqS&x(EI>&8|{VW2aKHu`L{VSH9z>rd7{G!bc`D4>|dtlM}Ip4z`X8IiB9l= zQ&92GP;t=0ZBS$LxPt|x;p2M2bbtMbMcZ;6tb9KL#bG<1g;4{tvo40zBQ!%JdAh&hdZ-XctX4 z>zfO3)rC;i>maHnK-0#oSDu1ZgRTe%t-J#{9d_Qs0npll)&t;GWneaB>nP+@2hiDK z7r+}3K!*Z@_LPFkl?#YL1?aK6KRQdlbb>}Vd|&u)?}Yny9&`lfFHqlM0qD@T<|6_qMuM&~1|4|P39`}mgiELE5tmNi10Jx` zR*t(uRzkw>u5~?u+-wu!Z-2{x)@(Z`gJ`xLl0n%9)_ME|e+6iC0lXme1pl@G3D|yG zP?|d70li}jyw|Eb^Z_J1K*FGl1{hqrT@Q5E9`We*J<%O{p&N36m}}=jNAS|Y7pnjN z|9?3flJ!r3!Wy#m9(0E?DBr#~?s`BAbfQ2Y#CXtRP|#v7xcqC-8R#G$2WT5VLJ?@{ z86*rg1U!%izHG>~9PE=HuNf!!bo;*W=?1lbe19NZ)?Irbyu0>DI4JOyLFG4k;G;DD zJwV5~gAe%u&5c9OUG@C{JzCCe2Dq;H0cljefGo=d9~go@O%6H~x0iL>0&r*W2l&|4 zAKd`~-L79O4;Aym&czJ~K%J=qtvUmZRe{bI1$EdUA@>8csKoUF^bb~U~1!zI%4_Zau>CADQRr3tw>Qc~HphYxd ztQlkl=zKni72U2Ex*Z&ve{k}*A4lKiIbRZyy(dc|Wp7YFodc3UK|8%b`)WYNIOzBT zP0)A)NM6FD^PorP1#k`H@%(Hjr~ zra^A(NVCGefMgC4kuD-EPToq%3j7jZ6z7oswto3TM5(0Tkt$C`itUz>o8>2`1c?_^vGQuDr( zlfk2xS45nPVV4z1FVfKwkEFoIoq*Db22wf!U9Amjn8A;m?RMP&KT}n6E;tf4K-S%P zbh~Z<1%3Y#aL_}}g5qyk0QNVi0sxK9^0$DtNJ3ga44^U_eDWr^O?nWt?GjwIfh9U! zKfIQQuAJQfP1kmy9r@sL7hHUN03S48dJD-okS@>~15gtXRKkD?dg#=kYVCr!(1jm)1mk+>U4-Q4pVYv`4xP}BT(EtSxYVcXQo+y0=sUtxLb-}_=1D2(=U0;BM6O>^< zEornPe*(Z~fp(T2@aPPM>`Lf7{vve|N=o4c_vfLZ+v)n_<$I71yTQ{~OwA7zS`P5H zUVsXLj)n069a*>(Spc@$65QlMY_i?91MGXyf)EAJDNdrGIR?-=I>;zU=kXU)Kq^4% zG)s!WX{7V`i{FpIL$66NzQYwTAL8-O<1hAJ2J@X@@<(oiEC~R~gDld3*V(W-=lF|- zU?t#ChPVLKt_zR=r(*C~D&TeJ^B;f==5KunDbm1V%-6vob;F~%_67s2u6zdadatdk zFc-s%Hxl5p5Z28Aw*zjJYJx53JpLjgi;)2oPSYT!ft)4*%B3pz{{Mg32omgNt(Xqc z1zweQ1GI(@vTPaDMh5k>9Kbq0-TnXnWdKMAsKo%<8J`dHyF55-O5=~iPUdlin8F~y z09pwQJzEAm7Te7LKDFJW*ECNUGA^;J2Yed@J5&{T^ENDoz!q16EC%0B0LuEE$6tJW z2nr!o*M)!-ZGx0F;2>Lf5mS*qND=hhM)2ypbCW@#16_^@s=+&tzu>z2|NrZ3nAfsF zOQ=8{XV76^;LSFmb`0ncHn1&OS3wbT{KftGpx6fu20MW&Vt6p`z4QP7XMVX~ucbVC zZ3U+DFud4`q!MyHI5?_6Jx5S0415w+E8AaiX^d#PLw3G_`p7dpI!h;bbcS|7&iy$4 zLLOvbr|Svuet-U!AV@BPG+?_!CqRqNG-1#NtQXK;6+{-a_f(+S^#!QQ2j7}KW%TF-$y*`{(;uKv?X|th&&BX!mB|19&8}A%F^vUnJ_XfsrM(d6 zIdDLm9H7vJRyUwh9n{+g6%?SL0`=29AdL}_Dh`isa2Wz+J7|DPRm+2Qx*ol@0Ro`& zpPE2104io5bbElVTmY#IKsx-xPw4-DsMlYDd<=IAxHSP%&Ee5o5dw8R^vZ0|Y2l0~ zJU|y1vj$${W$@{BUEtB}JHfZ}AZR?g^P)%RFHrpNNCj1DYnp4u$6$}fHx;1LuygMWaC3X>1TZzV14MPV zLU_ktG|UE-5U!vuHYE2ogHC~IVFM*7h$?V_3qF~XzXe+5L52%J8RNmr^U&-AZlS}Q z5;34@jb2+1UM_|gl0xtR0QH9WTR<0)RD9Rn!Z@2P_>wq-R3i%59%+FJ90&cCh)#W-j`+KVc#|NkME z=vH@wyRM*gCg8ycZh=3*nF~NQ3;5tCkaEz73#5jtgf?MvA)ZX;;bM4UA_y9zsa?Uq z-?9-D?4X*EzhxPS*;u;*w0MWV4SaxLu?IMcS-U{Ph26C)JU~s%Zm4&`rT&LKd=bMqd}km-c|?q=tNGKM<;cGJ-Pzw$r~QM0sp}lcC;SgZ><20O>lx7 z*Ic`Tu~Zk7AsIn8^Im~mv%LX)7RL#X-qr>G{{IK(-WMO+{{DY?3Uucp$T!eFQ|XFM z*DKwwS3tL3Koo<(^O)hmzupyexfC?CVn746y;DK1@jwZz!)36*Vl0vL=(P<8MaI%vP=G*J z8Z74nWi(I`3pSDwRAGR4ny!%8m(Tx2i#EIgiF8pp1mn>j3pmIY9Tn zUEl@Bip>mA0+;aUW?c#u(E^JwfVPErbPIz9L_NA$J)n}jU`dejGN{P!=^z6bz$eFp zhc{SdpfV3ZGLTyVKz$z$G*@WAD>~L9PzZslFOg=~H=sZU*H2N94G<8YmOcfwUie!; zGq{kEWq8fP`WtK^xTmu>6nt;h1JM0fP(wlK12k6U0*NfRHrEFpy)vMVD%djHTcEOp z8CDnGy9TL)^x?QhWyS}N}0`Ay=Mr#k`>g8Kl7pyOrPN2#%g_zm!aiANqTeb8HQ4>=Gqes{4Jn%Vsq^o z#!^n7Ue(2%Tnw+-eR@@Ab8;~>*PdW3<@D&4?FEZ^^vbq!f+mA(TR6EGUaYGEC;RTu zGu^Hyd^;b2s>NHK(39k+u>b%6IvQj_NhsWKH?T22y{dM|h8uuIJ$hv|Acn_-3=hO- zxHC66Ah&@+r1?MwXe;RJV#r1?a4i8k?F(E3f&vIMdjYEC9)QPFSsTysGIR$NG{0i( z41gTUSOTgHoz8;Si##Yf>e0}2TDvq_dkNzpd1O>>vjX) znLEA;6jqRh9J|kg+yE_zN^iWFyzT%07we-y11_wYNVWui1gSgzf&pSn8^~l(x2XVJ z`LdRQ_?@m7UWS6tG1vg{EM!pb{UvY<6?ASbc(iBA5ilRLJsQk^cmiZJ=-|E$?4a8} zDnMxnRB3`o>R;Ss2fG$@k*Ng8mR?g%5Y>77#m;5_|G&Hfszac|I@7@>xgPKUH6cnu zLE}51%DDk7eEdbmK9EJOpzie!(7|LSpxsVjC$t;|IjL0Hqt`Y8bB0~FJ6QDc%Xx_Al^0rn+Z+|U^~`AybW472J(v!D0TIk+JdOg z<1gMW{r~?Z2a;btf|Zx5z&ycx;6G^hBY1q}f=93ElXlQ5!{aaVL7wYo-FgbtX7S+g z=mlS{10Cr6e-WnL{5aT$peZ z5Y>77g~!tW|6iwp+(~GEOiN*g6;B{7+$QN2-aK=Q7i#gT!p0A95g-NdHjW79uoto z+H*i@+In>U==`(~bSPfu#mmn+KYhRCk$lOc6Liy2=ns!x9s%&_*WWLBD4y~F%}s&U z8h}q#LX0m%PHk#@18#{zjx6@*gx*pPzQ!9qi1?)A|9{6lkPI~!bei$YAVvlTpH5|u zZf5~c#v|R%kb!A-^nvMFtcZc>K32rQbg%~ahE)FbhdddNykrEYIcJT|V?LeFUr2!( zBAu=`x}9BG50nUZJG*oq@UV2fQO4nM+!b`F9|Kr#=Rr`F3Ms5Wqt+Kdqed=1-PxcP zVHOJ)!;2*)px6g1^XYsA&P3-S`I(ai6!*^Hk?(HT8_0%$8bsZ$H+&c$cy=Cno#oLD z4hgX4`!9YqFfw?|@MJvlI?&^|vj%7pw@0_L21o#W2L^A{zyA<$Ihc3y|(8W zL9Ks~Q+j#r7`YgBfllxB>3j#j42*{rJdWVe9nImDX4F9-1P(`xIx$KfJPf3 z!L9)6ksNnD0Fh(%=mhluK`YiTfV!Za%s$I_%J?zNJT-UHbCM}4Hkbp z!0`tTf0)n)un?@E-r%7PKIHWP_#hfkZ_lICb%jTB?F^urS z`WkdQ0%(6tH-l$y2rFoKeg!xbK%EuPZ6*vJo!~Y;_%Iu72orSeEU09z4D{%=tzqI~ zcu`jbN+pN7y#qYDoguAsup?irV*3C8xU&OjllO6F(EaNSpg4zwJlHTF%?BQxuu=jv zL+pCNL(}!Z%Vbb;205F*1$?AvH^k{jcY#V3u(}zbDq#tz)a(_#e*{#kUjQFC0v6}k z4=(>er4N{&4dJVL^xA#~rKPilI2`juGk9(TT>bEOf=A?fZ6Aa5O$F!5~Y>xMu7|4*3U(Rc(@ z&Y_)|<{0i61}g?Z7YuoH{`TnH`T{uz_OkwM0#$Ra8@gGg4}%sO@VES9V_-z$v#Ilx;v6)O7{4bG-nPK4P z9iZaGqqDW(|NsB|+nkvo8*4gU_kcLCeKwu0E#T-a0UeTk0F;yjPJxn4i8J_I)z0HD zqCi9C-BUrPfNcbu=g|$JI-NlyqhNhoK-(oiV|&gLaEE|H6_ohED)c~AKIm+q=GqPh z{uW_S`P1#%0dIZ$UjXj$A7Cf}oxFUx5j;q}fxq=4D6N2v(uFzd=yp({i|#0Bvhz6Z z47>Tf1LUJ^pendmva?7BbXlV%OmLPUN zMh4H$Bd~zIvlXZ7kGt*xRhppG+`GTqwgeTe;BpImuO7I{GU9Jp3R=ewYFZe= zPIUqm?Vz-|05k;L3th+n?ynbtZheCKu5$1H|DcP-pj?){puh#qE`yVFG*}k2t^~|| zwg)5&s;N`|ax%Qg&jBTau~@$!)G}VJHP%UkkQx-xfp=BVx7l{)>Y?p!Ogne;|iF zQcUXyKw^3|1GbocIR%u~dRcwzAc?Qk5oCWU=;SJ}%`UiXzTpotwlo5fWFRe!*KQuY ztp95urh$7AplM`P=)@B{xcqyq1g2mK`N3u^z5_X<#08X6?s{YQBRBv{6+L=wC)DyV zyfAG8RV=VV>G%t2&?YNT`3_DvpjpOJ1CL%ve&__>NA}hqWUw>%GDT5{D#n%rrCeYp z=#DZbk8WoR&}?L@Ej*hzfMzT8Ku5sWPGR8hQvnbDO=BU3Q`0sXO+RaK~}ba1`N@JEy1$zn2u9OZ1F;kSANaGQJI zOVC9ly|!xKI2m4?{r&I%Yw%)E@S4dVpqi^Y^h1Y$$HCkW9N?*-|DB<4S`U=oMjlnd zXNx|>mLCvX4t(Wgc##gW1+t|Sv~&v6VZvs~9W+b8t8}|XTULPjdZ1-grq_Rh!w(WL zI|@-&=7L5?B|ztN9%sF@7cx2r8VTwy0L`hq@aXmkfUG8CJs`o$0J)BO3bJvTh2Vi} z(7AV@MnKB}&}md&<-`^JxE;DuyWsjiaf8tO5^SgF2vbAWgldUdYCC zp%~8tHQofIvh(0Bj(FwW$614eJ!?P2#SQ8Xhpb{S>!~trPLJsX?^XO(}-^t6+&49?QFCP5=|G)VMOG!ZU4;KFZP6h^s<{ykD?9D%zOB7$% zcC(uCff~OhJRZHQ+`l;)AlKaYvhw}rWO!ZK%_xmFR{H9zip1SI3p%ev|hD7}F?>8_xa%uF7= zrgOkT$6qw%g4a#x?*}FN7wm~(g`mYeCyq1ZW)>75b6^4WTTgg2A7Fy4u|5GhezcpF z6C7gvoz9R3_XUq$Q)j4|dJr?qx>=9#fC96U|2XS49$tnW+zbpaK@Ie7*3~?`49!27 zO8Jko?&0BOC=h30c=?kFv;$-!ScVxSvxtY6VF5n_!^`_%nR2iU3rMDehnK-Yo`K=z zQP4;#YbDI^ZICuF$T9nVgS>M5#ljqr2TMQ&DoA)ORJaQ)3^L1xhnK+yWJ@JN^8~1> z6tF6|=6a~GFIX6)`9C+*@iqv}@laLjU{&Ce0g%o9P+5H{sRd8p2h6+yu3xlli;O1rc z0n*%x(0m!HssOG^iJO-}ONfEtWjsRFW~eGJxT-%~ybNaq7#Ln!B2>+Ss#1Zgy2i!J zzz$im21K5WaX^WvM7^8U0>lADWQkNat2T%ON+BR?U@efoOa)3lZAqi6dn}e6Z7L+4F>feDlpfCWdX93MfvLAN^-;dJGx{(8v z^Z%DhH`gBcU&7t(dZ3eaE(b3IC@>~+KpG<5totZ^WAuc&C;&(0L1VPXqXzZ;yiySUf<>lR$Hw6FjSuf^#mzg3|0u0So#*!bK#wU)pXE8(_Ns+6c5V_poLDkAQ|Unh!H}vl?^rGFToiHumV|HNdX18+1k=Z1G!8Dk#bG zx8(i@?Vg4lJ-wf~Hi^LK)P%V_ojd!{E`)!UP)YM~{YH z(N2&oBdB#NKL;Gxu%%M#n&E+MgRTv1uD>%6gHN{(lSi+u9;m|<7tIN})C+mWBI?b* z|5)`JgKX_)VS)uEf6GbGP9$v3|KS93J`WRCa~^{wS(rQ&4`P+y4U@M#SdxWR#Y88F zFR)7HfF)HxUd;T$$?&2&3YMUZxIqaDa``+o-P}+9`yV;3H+yq|;@SkO$wDxPfi~bl zI`H+$kjOs$4;0y@VBP#pn*Ts|j~!tEm!NY#b27a67720$)Y2cX{{07Mw%3jxy{_Gz zw>)}HUwlSVurl>8CBDiD=(K`N!;D%XNk20>L;Kve!(4GJaRVi0xw5ICcQeLoAN zRt>7wr|~~D(0w~^fQvJ5hG5&z4Z1=N)G;;Pw3?RzS?)Ptk%WDH-b{>E6w*=xZ z%&Z58aPx0@{x;B7L&!=cQ56Qz%`c2=VQm{$F$7Z>!4yC+d11_M)@Lhu8Q@1do1Xap z|HZKnpq?>v3D=7~U=~ZMc(-Wwe^3F&dSVqX10_D-wJ8^v(8+}%W&Kw z0MttJ=w|gs;f1b1mfOAp6h5vyx>+k%@-lR~ZaMC{Apq3=@ZG@N&8j#J)ZQxfhs?e8 z+J1P?$?#%rJ}5pwW8$oit9Ti}YbbqJKx@@)zMvI7t}Bi^1b~{Z`$5wyFLsrJtC!PL zc^O_#2c2XDZu9lpt^yeshcNEbN_6AW5ypXyAuZ+i93;+NBuaS1Vwdnu<|DaF@ z4{L%<-47Z?df^GS5HtzKIu8_g-JuISdV9eWQ;-F28#$O6_JfB0U&w)#vg%LeWq|oo z5#+4nd2nAwgN^WAu}c8dAA}fi&IiSx-Jx4RtH&Wx0`d`P=|ly1bP_RCfV@`{a#zg_ z{%x#pr$Ud(V(egjIF*;-IP3qZybLm+yGL06PKBf;{%x$!kd)m5E4u?#*3D}6mj|?) zLe!%dyxRQ+bYcHHUPgx3!f1kmZ$S6tv9?b^G>xl4>~7G4c~H@;{f-lIqwcRHvKu&>yg!f*!rD4?t6A8h05OUM>VFh6->6FfhCXZRz6Q#>xqH ze7y~0iFP-y&QxB8Zc(|Zpt8~Rfn(>1&Wj$sqUS)4=sX6=O3f?`46noax3PYh0ty_E zMvZRK_aG&`t`8s^nZdetfP`SWd_lStK@Nhb*a-?m@E{K8U>{KGc%j9@fOLVF2lOa7 z$VTes+7C>n_T8*6euI1l+e%Xenp^F)<$cM?@Z$87fB(B(zaZVo{Np7jxRiGN0^J@B z+9^~j&|Le4p_B{MRA+cO9XvJofswxzwBN0pwG(VSY~NQc#Q1eDI2m5#JOQ;8!HXn0 zKutqc&|+WE`VuwB5=RD)gD<$7AIN!h9_n`e(){3`hvgyI@$!bCqzO9J0=zlUK|vL~ zFAcO#O$aUn(l3CfpTG4JBLf5Ey!^MInF!XGzrfxHT`~#Us{(dO^8*KvJ3t4Efwv?d zd?DKWKpx@_BuA`)3hUOp4^`M#mAF2!tj3Dz%)w)@Cf+ZO1t-4vy{orA+1r2VL=z{zNo~{EqR35V0 zxm#2hWca~X0?m))JuEMvIs{Qhg0f^cYbx04k{XY0);5qf&@$qT7h7L~Dnyo2&^Q6a zyPd~hxUBvE|Coa(Xg4QZ?BewQ|C=8$g0_FFgB$~13l3T~IUQ8_gU`W$ss)c|zXdM} z2jx3ZClb1bcp}nK%8+qc_>wj7bX(_ENOdw5v@or+7j!MUODA~M)^XP}pt7c$b^doy z0G6=6kO!?T>t;3X=VkEePEdeNmw~ftgn~!&UXY0l{H@;Xpuy4{h&Ip~>dby{Db3$v z2$t~!%kZ~?HZydy+I$Dc3V%Q7Sbd+)2e60%jn+7P=V7n~jr)|UcC!kD6*AUGce84M z#KE!T2iDO5Nh*%rtXg2RK?9qt&3(METnbw52Cj3##VDle+xH8!?1R5$2B=_jJ;V62 zA3Tz~@f*mu{H>t%Y2B>zzd;=*30|@Xa-0At)qotg_#4b|3f-(_V1}&OqdCjb0Hqs2_B@n@&)8u{ua;@fNs`*U>?*JkkWu3yn7oQK9KvaSY3M{g^4Ny zg9F$#Mcu3`zwj{Ff?Z?Y%{m9f!E}vmH|soz`7qajGI9wUC^%p1b+dXxBvrau%ONbN zGH{_(!V7Z3YxW6{{gd6S(mkLSYzaF&Q*wbdl?HdS{`m|Ea1W1e)*an&$3l{+u}3%S zVz?kQe&xWS1_|~O!EV-DpP^C1-#Q6gU$7RywLqi51gwRD0UV<0-K@(&TEHP7)y+B! z!~usu7*rW3K1w`2x>?l`20=p47ODaq7zW*}aUi{5gOs~j13?_HLD0Z}L@eiV*At+G z{F)s;m@3>23lH#0Pw==a7kC2%3n=73tUBXv))${Z@eSH549@)?-2&aL7rv2-3*kmjzDKtHBESTR|z@qnlL+H15{vy5U7kE~p#ex&k_f_1dGG zwFa!TL~cK*v+!b4=D+{DK&*WXsi0fQkH1KeW@LCRvmexvc~JtA1+gIQ^v>fioTM2U znq7}DcDo+2c0E(Gp__He9I*HJUubmw`@bJ__QDI6G*GLG)vgQD(RsNT98;jR@Sr{J z$6p+p2^uL7T{j!FI_d(fUB(QG@?Kl9`FO*BmeA{r~@>H3#G^ z&`QJ|kctK@HDeNJ;APH7P&k%=Y9XlP@fXGu;k6J{46Gr26387O<3Y914v*&A9Sr=f zLEx$*bOq!H1+c>FAOHS;sQ_xzbhCPNLMsRXaL9Xhg1lcE35tzU2aj%64Ul|yfIv5^ z5X2?yJ3-<5nsp~AAVKr7AO)JIJUT&Ym^z{72mb8fWq6&@E&8>Cm!aGB4C94P)>j~* zP*8dS8+^V4lwm-cc76bR5#8W*AO$dkS9U-RUH~$MzngUqNZeqs-XgyFO4z8T`8AGBh`7S5J3&orN z{!eJ!3#yetodEu}o8V%M7vfefkLJCgYMY@Hs?`djRRg5;*^PgolheSrc!N4N8T#Pp z?QR7brVBQ0+lg-0tPW66gK`5SJU4J2>}Cyvi!&jK`*c3=IQW8Hm4StU0i>#+9W*(R zTFSnIfdirJ1jy439?fq!vKSme1uugqXoU~Nd!Pv04_fr_LNgt@{;SjV#>=^&= zfEG)Ed%_+dnP#w;rQU<1#}L}+=ynijJy5C)xez_IL<(Z!gQS1|Az6?glv_X>XFR%D z@4o|UHRxu&31O*$t0o2}aB&VA$LD;&$?#&cE7Ew*%1i(LL$d49R8Y9N-ayRpK*F5A z`Q+Yg|s1b4Zhm(q7T2sA%n234b4NG5~UkoVgDzQ@V% zqSgg8z>Qds|K>8Nkiq7fgFl!+gG|h*mQ9AZ9+Zqhj=^bJAILHRG|TF7TlRoim4N}Y zqyHe1yFCv6U{_^ekZ17VL=$ELhr$U|w|xht$zEGCkkwP2K})Jd&)(!@*jEqAX0SsK zyRZEF|MDyY0|V$HB}5w-G&%{3rzr>cx1I3lW_>jcG*$pUq34E&<^|B0DC@OpybRr2 zL3z@n8{7tW?EL5mUO2W3lv6tYf%2{_XkB2Z>xJgM37~N}lxs?rVM(YPe9|!3QP456ZV^U?m!LJg5Z9!Z`oPtK+uh)O*{(OhH6c_> zga~M%AvAR`fWjO!UeoKv1XXm*qx1X=V-ZG%*WpmJz!@FXTLo+4-|iri#>?=5e>-Ry z2#V2vg&9HD+umS;YV?3Q7*tO{ZNDYV$k5Gt;T6bZ{H@nPDX;Seq=N-I{2Xip=+qeS z@Ps^gpuO|p2{I0ws{v18ABBnjc_l-UiYF*1QJ9 z0@(|0BpJY+3koyPa0G_E)gTREt%V>KNGl5{M~ZlKv&Mr&AjNGbYY>P7lI8$O>w9#I zW`IPX>mR#87O*uxkOwb6?>u<bFFc1e63(#gg$OI>l7)U{bM<=T(hy!vRIN3R(Bs-ADK#TccIiUH01m^_| z=Y9qaQi7fP62t;U8#Kyw5T;@C=PrJE76UME5ro&O1m-P(@mW_mRu-^q71+d5VNiRn zj+X&^lm#1q%X3zcb+HghnQm79XCQYl*F)S0i7WorgJ4zWa8;TxRp5pShalJ|t+T`f!hAIQ-#=_PE{H;G(U;+%FJiy=j0(|Ot9K;+; zpUwx(55PT0(1MF6HCV(Fo2ypaun~ zaRsi)AR1$!8Xqx(gQfWaC{V!TJ};`leg~Bb*lbjWYFr7^2rkeSp}7pwjt0$0f!YS& zpF=!Z3sVaoWaNdz_Fz5(ark13hY?{@Ooibb_dM?co<#)4Znj% z_d%_8ur6>ANqBU#9);=xsc8No&))*tg4xX~glrqw3N+h#A^N!S*%k;Yw?J-$+ZGPh z1-DHPJQ%p-5y)>PzF?<;1J()bO%Rj6m5T`)ui#+R@aSe0fEWV`MzH;?|0}`a2&!el zo&YsEx>VOnBLKTAcEO)ckg3T_i?qkB-(S+y%cElbeE1!QckRJWVeA1u#U zAJEO3@(@<`ID2%n{;Pl~hLl0zZ1NB!c<=?N@qoxC;BWz-KltYf#Dm~w7^nh(l&2-U z;NlNbQ@rs0>6|sb4qikq6*FfoM!qV_;|iHJR$VS<4_wprb%N;pn44QJjcTpgfQ)sD%$71+w7;wT&UO zyWNZ)-GLk)ovioELBls=7Dm$mIIsBzD_yquTe<#KRr{kRYE3uJl@ zlz+hLK%EWNLm(z-x0LGy(8l0yhECTW(DrXoH_&xLr$BconA-^&s$T|D3u(o%&H}N! zMUBBjPN2R6s|JYK>j64rsTM35dcy-UI0D(--|`hy(sYY@fF(gE5`eUcIwH6NkVO>T zthOLA#MS9fIYD~?ZFA3XGQ7|}0qR4tGJ{lr4>VeuSgHP4~tssY(bR!KE z46dNFj+pqjyLP2@GJ(BTBInU9T37~3q;PL#A-Dn_-DokV3X<#;RRd9wm{TqT&5C=L zL6%K|lO?3ZQX=Eg%ewV6I6}Xbg8GQ8%OSiIAl`9S-ZD@t4z%d-i;@`Evtdb$K_J(3iUxxyh?fFD z%wE=?r@(HP0`ZQs#+Sle>kD^nG*s**D7k}LTy+8-y{rcz`j|?28D497bhBP80fn#V zB@org`WQ@!J^@kPtVcmqC+j^Bg&x*3L4uv4vp^KYVbe=MVSTp*;u7#W>`vBGCAkBX?`VvHS zvz`J`ove>R6uQ^vfdo56=YuGS*XI-?e0c%HX1!Moa_@s;P>`G}hFJeX>fHbTu<-;* zk8W09kb66izt9W)_aCx)VQT`z2IPcZ z*0&Iz9*B3GHM@z$svynm(%f#=GKk^2-K-g4!x`(9x>;*M+CWWo&}p8m z-wR=eL#nw_vu;*ApC3(?Bo4>|pS^(b5iwAtO#3mPtT{lnPJ$_myAs#m|? zg!o3Oo0SJ-A!yDNY+)N*JERH(Rd26u!nzQk)^7@21!RJ&6y!aBgdk)Nj-?rF$od8P+!+{v)0@Mg*C__c?gFzgRFr&L>6u$!Xb$u72qJX0JRefU}1ygkY@-% zh(q|gS;fGPCp1c+J-B`sd&Srq1Ip z_WOWqmPF8)S10SG0?@R;pH9|`1)!{Px&W3|k3w0Xshx!oqo9@gc7OD8w3QK2j?M(h zqLicQjEoG;xqlcz&aB@A+Pn!)V-K1@MaA(K2LoZ5&BGV$vUrepL5Isjr+1*o6d!-_ z7_{K8Tl9P*%Jj}*P}jHD*8C_Z!;7!rYe_^~K}Lg)kp)f5Ll$yzw*LSBVp$Mq92+#f z12q#o3A3{TG`+L;IyksM(>qYf<1a!$t6D*uJW4FKB$KES@4_1ZPCmkm9d!H!@kRrly_1-YXev~dr-xp7C9^DXMc0>H! z-3kf;@DZfoa~q#?GBCV+z{$XHyw&Ib|No#i3}`(|E+}J61%(TAN!KvslU-pAhp+H=y)dix3wgC*GI{C$w3 z{N)uM23sv51_sc04U#iJt13$KyID_yUnmnl6RO;W&x)LN0-nGQr%{m9f0qt5s zQw-`9mMV3#)_~+e6#(cg0k~zbHDx7g-K*#*#T7u{1qnYZ(j2jc|@v-uE5Cs^#Y5bSD--T)4dPVgNT-3$jG z2zYdZ50`+BV1o~{cxeS1ildd`cR^!fR4|+yo68$$X}B_#3}?gU@?)UEH7W!PR>L!C zX*drp4POr$8>2$7h++$K&A-3*TP?Zjw3>N{N(k03Z9u;EU2cj$wmGVN& z%I0q=V`6}up1H3GQWPcb;beFrzvJKkm!SIvspVgf=Di?CF@TFy5DVr!rjlw8R0lJc zsz6+qQIY^*q?d$482KfB5Jq8%E1E8mQW=kKQ8myQQ8(*#5M_C&loO&ls|31IqXFW@ zy4{=%FKo7h`dO$}Gx4{A`}NR54k8JfAon=W0Y>JGnr1p4bMi8&LdTY79$jDAqxy#xHnuqFeX!G`O(^N0#EB^&<)Cg1rI8B0oCo4Ac!0b%_vp24+Q-T8;-NBl&R%jC zC&RvVAcw%_?5}V6_y4u%gx5k7Uh4e(|9`?uH8830^Z)-wa1H=9yh?dtp5dQz;59d# zGxb0V{4%G_AX9s7x9{X+cu~6b-~aAjP-ws!dA(bqH72N$2U*Jx8nMs4^8Y_#$uji* znG+tct3x_{H~4hAuJGyfU2xp>56C5;eXq%&CSWM+9+mlip!T0DP=AYLFn-4wR{2WC643PRTxOz}C4soPU8n1pZr3jdA22mPkO6N(IrxLQ`2jQMg-+KmAS=O=%!mj8A8rU*$OtRe zqU-E1))lGujSBJtENU`hyjeaXVfAKuSf>gmph%!cFPI?! zW(2|(%E3yBi=Br+Bc%+GkvNwZ3=AI4M-)7cyMj04K+A>K$y5pCgAY(s@@t;PT5!2j z!tq*Q!pm;RVURl*K*b;jWIZQx8E6Ozi_Kd&8D11_`1ilt_m4++=njwGQqbj{CtyB0 z{-X3e>L@_-kp_>>TKH`*oxUv|y{zB%fco36A3S;q9gFEZcQpF8op%chL zh7F(|dF>2_QdN&`-wqGh#EC2D8m1E-pb^pTK=57bpo)&U+tIsRfvE@&C8DI3_c$6xfRfeTP*Ga(jY zLO93-(e?lSPdM)SCj&gfC3XxPB--E;UcrY;A@*r+Gy@`|IMdvzjnqL8~ ze_df3FR6mv4ppBIQ9m1`J`%1TT=>6$+O!ZwLjgoX7D$5zLW4lJYYV8q2Q6q9Koe)F zAt>>Kaw}+ZwbOM0=zg-^(gmQyZ6Rr{^CGyG168@d&iw!XS{9TtdqWR+pr`^#-#&wu zGT(sDD}(H()k1tpFw&^TobFN23IL&N|7HK0=_-hjFP>lqm8eL&mhNUE*EV>91?mP$%32vI7!>WJ(UxThT1l{rjR>=fj zA`UritQ&NcbU8>AeR^5bcYvCgyazxObnhl4a794Z0yG~H04)<_ zKsL7ZKm}-BBgh|MYi&Whe(MQXlLj)smp2tep;)u_6(p&=G~fm8g++J}G-?Ezljd)k z2pJiJTL_V{Wnf@vD5>aXJ$Mi_Yrs^;37rTkl|^F1Q7A?yLXCd;fE%=?WyJw-z|_Zj z^xA&d#>wzvnmAIr=U5JE=|k7-qF4q?8a^Pm_wp_UQ7HEOd;#&o%NkJA7%fSIj<@ZF zm_10DxofLg_%L;g_Mod-Y%LVI+hnKQwo6LhIH+?)lV z<};`O1*=~Gy+#X>gqnXa)kDj1Cs69@wY|KCli|h06{uOM`3G|;ciM5*Jz1cs6Y!ue z#QhEe9?d^k>OhO@PlFmsVPZ((cVg+k|NPrrSHLRb75v*-%d&Vu>w)>Vi{^n@mkvG> zU<9>+J6#v>Z*x5XQ+tAcJF6d9#R2~9qHbUol3GZ3v>pH*It8AcdbyDulsQ}vz&jSL zzrdNob%83V2;T)FKpQz7AqmB!H*^9i;TF?rEZjhOf}3B0I`38j!WYF;L+*Y@LCL{7UCYbRHthLBtSfRAqN3N zHZdSdZ0XJ5c$5NBC?S;e6cXehXVh_YyZ-16c<`FJI~3Hhl&=F-=n9*m^{m`xP6ntg z-CIH17J|B`f{KD5Na4i-HXEb9WrSMrvW1<2q1p8ZV{`2f1OC1;(2Q5N>w)G6|3Met zfMOiNgj^t15^>!13ut8LHHXK=+y~9BUqH7qJ%BD^wo6acQr|fSUUPW-jOeRF6*A2Pl`umI{LJTWdbR z=%MWT0JP#sWe22KcYVO$$_QGx3_4x`BL4!kTfX%TGbHP!?EoG6#NV0$Nel-zfbQ#T zg`VAep!vav)&r%{pfix0AN*-O0B+bFXnydo^#Euj&GkU*fl@B8cV4D5F)-`^EpdAp z3u1xJ;dvPh>B1gpe((dV5On0uOFNJ>=t!NHCU9wxIiR~+4m3Y_09FY)^yZ}qNG0f? zoR^^0d=N)8fTbltgH&HZd-_33EnmKdI$o9G18CJ*sXs`qD#ITz2egRjfGWd3Fo$c0 zI7lmK{qzno5NiWm>kp^`QIPOVkl7+2RzF<90k8t7aSy;8t{uW4HJ~#Eb_ju3iEz~o zPz8b@VbHqP9iW?}UOK=PFfjZFt;+>%cZE2Y;luyd12DHU`~h*GmNEPTakzGXX53!> z1KrWa2Qn3u{GeKYKoo#V`j>Y>3V1*YE<;Mw1F8%R2S5s7#ytRWxIhQFF}wst^$yT! zsxLu@l0%JafGFSu8PW$b4s_(n%NB%j44`!33{}klN*U5H4k&G~?*JWH_d09`XfxSs zXml_zfKmbb4$z6AudR20rxHzIx4IDK18f0ixfTVpAOgPyI@m4Hgj(=& z4K$yrg4&j#(gAeA?Ew!&8xk}=>v{lmyHWR6P0X|s`vIe_z zDrjj1$m`&n7CT)Vpm**zfaVxLl`J%(&{BA}?;mJ`}^ zHb_@5@A=hO!{OpxNH`$7egUL0RN?}27g9?N;V5&6xn>{=#Zh%oBOzPrQ3l`xKzDa{ zmL7p#-HkMq2fC>q&Sfsq^60fSSEe|K)NuJ^3|Nk#nfRDtO?hP6k;&07|6y2Z=)dC*2pX(VI%0ag+ z@9^kG^#8N@K^G2`@Om6~1r1CxyxhdVz_1@wk-WIC4sr==VLW7c(cCqR49!0jO1QgO zuWg3(Xh4Mu-zsRK(y)q?q1*Qec(|^+^hB0nmJFm7)3Xxfy@N;t1`c;15du0M3cQVe z>Spi&6#EXrMh>RetUCl6Iheqi1ar$Ts9=X|&^6Nr4MQCP^;~`+Sqwhhr1SWThv1HL z?GJ_$R*z=aA1of-tjppcUb(ay?iFq%uQ;!SdS&ZMP6n55SGZq1x@$pWF1|+sT{{o@ z^s??+0rnB3JSYZTQx58&Yl9XHuu6G>b}=*Yw+ez6{quW4;({4cq(R~W)Eokh;zBQL zgamhi8aTL_pl;MdxG{YbBDfV{Zj@e$8r(8jxsc#y#R%?;pnEVucVl$Bp77~qeGPJb zFYnV8SToBKkYbSIK*t;W-3W~r#zGeG@dkw~3^?KiR69cAWu7J?UOc*44M78foyT9q zu7U^pw2cT4om&nKbcYrA1Ko8wQlS642~RcKYe;x=Pv`oRCMD?O1V(;a#QT1OrOn~l*%NJCg)3AG>j2Ne2LhmWBwOb}FyGoyQ=F_$DYfg7OTw?e>MC zP8Sr@pt8lMmvtq`^S!)_m%?)pG*P8r2Zb-Bu(6DS1aRtdcmU5^hX~+^rO*HlS_%zd z(AZ4r32<2h&&(Den>r6dVviGSI_QoYuni!!u0KEnQ6NRVydoIRxp58QoK=w!=UiI` zcMd<2bKI9eowIWZ{%p8!F(^?%T~rRX0DPqbBpZSnxZtiGWY7~m8He@bM z@aSgkhuXJ$DLiPttU=hP1G8`5Vw9Ld)Nrd7fqaCVPUE1qy_N*0s(owuz;k@JXM*lE zn)dJiYeuA1=7@{WKnH(&bnXSMUxO@e0QJ|Qw+_Ll>%e!%9(M(ea5Eft1?`z<=w@|a z14`kr5$jtJ>vBNWX-x&yE8x{bpjjg54yeN(kmV8(A<(8r$IfFYVxXPUj-5wcJKw;C z9XLF?9V9wiL%?^UfmaMdi%&4y<2ZOdEXd6s$6FOZrwf2OV8_90DnN4;je9{lFM_U2 zYM<53z|ajg3F+Xvg`l#4g$caGZz?GBgO~UncLkrt2e~jk@d9X(am;EShGx)NDZ#6G z7>={9b%Ja}@POC_Y9n~`P6fHZqZhm|$+h#LPcN%JD4u$GbwCtKb8h|R|NmVrpOuby3}1w3I)`18^JPdv1Wf^h zr*~E_gr?`^V0~Lbt3DhdBXvIvE(i)4<@62A^`d$q{K5iy1U1*&PbHARZKY zS&T5#r#Zc zFic#`qnDKn!U37X0%3x}NX8KwM*OY!KzX8@l?mkA)&u+2NDC^#Iqn7u!nBgqIl>t z=+1Iba<6NJ2a?Be*9HIo|F7?6)m{p&$m^s$4yG;;@M!d10Lo%09R6*rwYJbC!Qc7` zl0B1cL3?9d7x4FkPCcFQnrj0506mbaOA}ElMbPZD=NwLk7rTFRFnDw#W~bM6{QD1$ zba|vvF_W%Evk6J*3-OxH4RO^B)-~d?=g=T>-!U9-;f$CqMURF@pd-U>7 z0NW1#r7w8fOaPs8e#%cf(2Ax+`8tBo@Dg{#CdH^Y@an6QD_L5nkM1quP`#}QW zIR0Xd636^!{{Me@wi)csi`GzgmIirrv+lO$WdQFdL1YRUnE8@muOpeS4>x}bs`=|r z|Ns9ow;6P5HZ0+MT0}76czh3Cz`u>v0q&qGQ2hsTkfrN_n%oJmc~R00MvAGM1zP>` z6BNdX6jRd%Pcc5dtR)~9_wwe0DbagY=#lvC)c^l4w=}`?Ah@D)>3jxS+EH~Ebg{u6 z25=*zVJ0-ti)X?E9hP7~O*5Zf)@+arIP}Y`P(pv=DQHTOX@cjl*4z9oa{vGT2bCg$ zpd10VMG9sMFUTxJJ`RQ_em0N<*b+fhOLSnCJZpse2DwBDoepw0uj_QICCWR{?bFRi z1mG^2Fazq}<{2P;;6#At-)fKy*ePw6DE?gtHSDEMBiz5Ptxxz{e*6ZtJ#Q=kr;K`K z{%x!-maxPK+UTff$;+?{G@S2Yd4a#>)Njzu!K{ifCE$FOGJ})h#nkVhIEUsd_I7Z- z`eXr0$Ok~@^E|iUWoQQHD?a3Wbps>}&R3wl^@l*}L8}#J{{>sK3oZ+4g)ITeg0@-t z!$YKfIy6M8z#)kgB9Iy*2P6y*j&ci>;Ftuu9UD}@`hd2XLfUVj`6vcxIup8$l+Gkz zws3=tL!JCeB#ST!Qr&UGO)5Y&sT*XHXFWV|I)((pE2kY(K#7cZ?G&tuGw?Vh z|G=Z-&s1nsyq^lvhZGfX6Yqg!z=8DA48=n%P{UsK*C7WIBA(~N44(ut0uo4&ln)82 z7LYL5SAi}u1jTbo9XPo7Tev~Dib5hB*|(=AgIvwKYcf{fCPR&Z`<4&pAV!eQ z$PR-0_5&#Vz;60&isD-_s9`S`)*|~BQP>}v0u9RjAR{1#L;UFk5&)aI9M#N2NB{qS z*-#7iBT}_g1T%>jq!D5gBuV@L`4?PXsq9mQnJob_3Su@|9I}IC zz?KN1TA~ZSSNVv*%N(BilgLxnKV@j;!(RUes$t7!f|D$`hJ9oRi&0Pwd&UsChF$p$oH+Nxlzirry6qNECUIH6DO#KO#rC})v)Yez}7^-WkEHp6G#@6wh&Py zGXWY!{1ZSSi4jFyAYpKDh#I0qk-gd)dvlv zUXW!F+tIRO4M+wYNbUM4fwTx}*h}4Vq(I_tVg7{P+% ztkt8Jl>_W_*9)(O5Cece!DhH#XuZwfIvdnc?zMg0%gONK$Qz{WwyP4fJ3&epH1S#D z2<`pC0w3BrJqj|Ym-i6%=v08Y=vFB_a2$7nR_OTjvQC0%?ZvM3>E8eUUoI|XV1SGk z8}9;@Cwfz%qs6LIL8Ha>I*`%gZq`yAkRu@{kf1sgJT@s0u}TKJRaJXok+1{O$6|m* z!XI$t!6P9Ul7n7>L@`&-8$*qG2^!tSIe-lfKd`e7b%WE!CJ==(9`#}mnv3#!pvfW& zWH(X*g}5jJB#P;xg-~OlAp#G136Sz$USaHMG8?1|GX4(g0>Ov3GrFK|c+v@SHgr@T z95~>`l(1b4sUT^T$v#PtiQqBrvs$2dDiHx2%Dw}%R_wLp4$v_FYayr@XvqR-HFkkq!dnQUPy%rIZbSg`w}1`{heimfFh-qGKymxZ4zPi>U@st# zU4}soga&1nd=?|TlvV?&?&THk#G1urpgLcBfhPYNU^`|p{ge(jkQ?F(1`vhftqZ## z-s)y;(F6yiFVsDdK!GF%BT#7c^6GbCbxtqbh=&uQ^9?s9@-Vyv4R=Dr2oxQtVT5cv zFT}ThF&qcVq8^}`R%k~9WFmu4FRKekWiPK?2Uhp|-3iLrp)j}jOypsJ`pI!8XbqoF zFKZ^m#uV(~yJsiLkSt`f#TTRn>mYRR&j0^k$`pc%BUV|kD)5xRV~`^|T~E9O-5deB zBpo4j0w%Qax|c=F8)@?dQa9M4RBK( zUhaQx=VW+s<{47Cf2bH#?klN-Qy7kN|7<%rqnv8T8mSsPAnEkwqkK?6Lt3b?a(@;? z>s0Jo-){f^|K;j@a3^5BI^6L~Kw;m_I#nIi^!vfc-wHa?$)nr#gh#KbI>^Az<1aGa zgO{$_LDLT?(ZXi(*xSI)Wog6e+{*1x=NcoN3(^gnx;xnl)_trMt8QzU?yq@ZSN~Ll zyP6NYaEtZ68raqU`CI>jy#YEa@c4_&w}1Y7^alI~?brj)r9Ey0B(HXmky6!-F`V)xOwAskRH+W=vn zcnz8@d<@}$#OFeoCm;=%s*RxXt+WT)aLMTbHC&DBSmmolt$;mx>PjG2lloAT(dOWw zF4_pvhSf#iL3bH6gJ!|KVJ>p&Myd&*O~!bT0lmCY%~%uKCXgZM$-o(;1*@ISoB#iR z>6i^~DtEK0D}mRN@V9~v$K~I~>aPsR$s+u%f#94h3La1CW)(994XYgDZ?ysovx+H$ z#`BNA(6k3H^pf-FW@Uy7IT(SeC($RM0Ts&&{8J9R23^VYR0*P?*AA>f*Q1;D5>%+z z45WbpH1N*?(Ypeo7xh-T<_C-|2l!h+m8@&)TmDwiDiV)w)+r!UK&$%~fXWf1jFbgw zF>R;^$J|mdB^m}&jncx%+XPEetd1a0b{>C`+XP=tv#b-+p9f7@-m8Z;2Ll>FMnc+w z+0aSmM3DL5KFViBls*a{)cltxGQoxA8%0PEGnZKLZ)3d&HcA}@oBDuFlvy$6arLx+(nISX;q5 zKzntSyFp8C??AH)cm+a$A|x`}K%;;s`9WL#WEH^Kvb7Nszjh!M@P)Um@`^~M)~Cmy zeJtRGw-Z3NfiJO#tOQN_^Y_0;H|r13=vC+O7b=bLfQ;=x1mx5@Xh5>pb24;?-tmAm z?;)#_F8cJciqwI!8EE2mnF2~+9^3$nEYThX(DfW*9pJ@7q%FVQ{{QcPaJ#M3bppbA z(86$V=ol$LLMIA5I_Q`|R5Hdg)S3dsr_dmGK1SQ!GFb6HEMG0x}Dm_q0Pl7weMjj=k!=di+ z=!RGW%3*PgprMktrJToIdq5EnTE+lw>G<@r27nCe<@Kt?T2OJW|NsBEYY%8Gs7JTx zMLAvua2H71wdddifzE?FY#10Az#LA_gF9Sc945|#uB~rN1-n`G+n~`5PU(pcD< zxDFogJ*|j%KT-{ice5H!2A6KvJMhi~xR8LxzwaIBB5c!YaQs6e{@q%THAe(qI)e6U zLqi+929du9vfu_10pJzE{QaQAhM-y5r$fRE0E7fqvBiBunK}L78W*LA|%kdY} zYT=GQ--2*FJIwKw)u2U*Xl~ES?Do9_T_Ids1$H;6w+~IVh9Db2J)myZKQf>uAM#yS z2X=nQfSqN<09u<5>fOAs0u>R>M+7Fk4B%#9aJ0Nz!gJiU10??vGA;v4QU5@;_459x z!s@r}Ye1C-Yo9*EZ@X&Xe*4^v@Y~xeXvDk(8wQRI$IvWjXL?U1*gxP=aU@U0fQ)WF zBH*|e6X)q^;g6X9SdBnMYjLLK}DZK?^n$1_p)~ zT;Klw-w$40F4_rhLvS8u-24h?2{;)Zmz>8+k{jm(lMe|mWLA|`7Z~#Xr zEO|o8pS+czqPYPSkRIKlW|E+2ZDiY~U!JwSPd;g-56BgqPdF8w()5f);@);Pwbq2(%cJzaPAr8q(17 z>1DlM29Dl~Wmt=e2`j+GM7lO4VkcL?Blb)^B4Sy}pb=YEMxY3+Dn-wCdLSFXMWEu<&M|OAPKs2E@&$r#1o()xo+0vIz)jRTt~RTUA_%b;HuYw z3)~z{h=XU8!5w_D7U5vd5~zc#L2koc;5HV6osQ&cQ>d#wx>-4(c95u=VWkB#ZVI2y}yE zp7F!M2ZXZflNzjP?pU{LORopa9LSy=M3(LR2zC=}i%HoRMCyYU=*_h)40UKtD;tn^ zdU?%?;Ry=bwEDFKy%-t|zl)F?s^FFrys`SU2pk6ZwK~q9cV+*P9g))&464`vX$`zFQ0m3sCzHl8gCULE_CwIaX5`oMR(1I2m4ur-0Vj zA-n%N$gp1Ci-qX!p9(e@;{J5dcwFc47n6(O?mtt7aQ`uw`wxK)gBo8u0g-bj7J!`$ zP6Z(MF}yGX8xIZm&e%JU))Krm1U18T0<=YR`~^2?u%a2_p6jZROv#LJj}4N0N(!Li z`3z(&N~Q#-2;`Q~i+r%lAdXtN2ojhcPmC3=EFV zejgaRpgR?RncY+$xKE15dK(Z*)mPzxWfguwP>$r7864;$&PKFl+3IG1TWDEyI z_&Z+o2!96gx*Iq_iN51Qk8rm6|Np-{5(d(|krxzOO#H2nSr`}~*Lv%|`uo3|bq?56 z*hyNf8$p9moyT9?&4YVW49S}pa-iNkl>_o7xWvhl$;xxw2|BaHr1 zi>l^9{E0}e6G2LQdAoD4Mw}N&eK)Hl$WtiSIUm@`P{;x~YGEI!1r6DO8U7YgJ-+N? zVqk!DTjFZK-4>qXttJ2e{|6}t9q$ifgZi0Jw}4VpRw3LApRzz+<9!aML}&1#hw6s8 zP@iqQA7Q9R0qhSt4okdd&^l7w5e4rB*r*ToNEgCf)hUxW>9NH#dY zY_LMIK{BfdZi6aF92_6#c~Iix)f}iV;B8SxkkVe>-&t7WV;4w$w`eC1s4)ZzKu9MA z)LZ1}JlG8mUwCH)$^-XTKpSYGe7t*Tr@ltSVDny(4H%7^cu;Wl@2`-C0dPQe)!&*H%XF~%F zY!9UThPG#pgOvC39?XP?9MoN{U_FrfHyrA&=4`mT_7ox9^(6!9t~9V=2zO;>A<|2J z2FzWIaCa$!?KmO;P0a9^H-SXwF+^Y?m%*=Rfx8x2MTj!-S{5h63yqUVC9Yi9zyB{= zfIGjatP0uEYU8F0*t?&Acx1KH8n zX8!;GGBprZ4zr1Xs!H3CI8KHaFQWeae_0s_5@3A*GN#k@!pk~PN4b~vGK`-G;e(R{ zNFFqJ>(R@)3nuRek?&3i#iHwlmv#{TJgEF}*Dav2)|cRI(Y>raXu{wdl6zUJ(1d@2 zTHL*?8EC?fAi`mAVbD=f4B&&)J$hN4(S$*}gu7XN3SgI$fa*xKOiqRu633C!Ll-DL zlmvhSK_6}c*wL>`J$hLc(8LlwdRYb0#C$z^S()HsU`M^S^yp>%1ddP8xwa57RgYfQ zM^LfX5+1#*H((rYk6zaEP!4!3v$=K)Ln&Kx?FNPtVblqlm#K^l4B*j3@Epy{Fi3z; zh3bB30pWMR_!q zpsm>+y{u9&{v3#Dd@w#}_}`_EvVF@x;d1}y_A(SisD zl_)|4K{w2lh(ZKCOL!oHpi#t9UQm*Rn0w&094J0ZKtkp)A&|Y%Dd1dlfPWjS3>#!V zj|n`V#|PyxgXi-EQaBl2BppEtg)70}`Ml?>AWe|@yxXjxiLALSpaxZm5dSvTQ((z@ z8z%l%Yi97U9)GJlD3-ffm$QPl+QQDmVeMc=nwE<`fi^9-5;W!xT3q(x`~%RmobLgo zN$M<_EJMf6o1UE~JiwD)wjh&HCPqW2LhG1rQ3bFQSLJ|;-BJNi>%T;>n{^tPU&0Pv zcKI4IDZ@+L`8Q7x)hl$$63aZ?Di%KjBa7P?@9@2q(^rt)O+CW1=wqlsQLi$+9YO> z{m6C2D!5kGQjjEC8&#o^hXve~+Xq^H2x+5keuRhuEMcz)GN$wRi!g96A35wv^mG!`|INtO5fRl*Okf8=OqmZg z<>g%Pfl_Xapo*7?zcmhgrja!xD3|fK1~7r=;uDxa*|6RQepI=VD5!k0eHX^b@L~<< zrnqia6R_!!ai!y|N=%?eCa7Zu5dn`<*YLw;Nx_qJ;A4AS6F3=Oq#r=a`ZxXm{fEqw zJKP1Qqe~)Scfa_T2oFf}OhiC_jE4r~>v+_31UfDWG_i3l9vp-oy`l|_D9!2F6QLmq zZ%%IlDedK56VD0hte{Q-WP{Xqvsy7?&fsC|-c*1}6VQlvr|SfdZdPunH_Q>L|OYsc09JPfcEvd38u{|DtzB9hm$SWbo)9Q%-xSC#KS z==9jPTv$I7bYVHHp9x}v`kDJxK$B^EZ~grb&h}s*f;*ki>9U3xQ1_6x6ikV#ft`o! zXS;q#q~r4ggWIuI z5Msy8IJg}`NOqiwf!c8_2H6hKNEU1!Z9T*ek6zKpe>})%%$LAz5w-uv!_W;r4-nCl z1Rcr*6@t#+KzWFsBq&Uq58&-ddV}&hG_y4C1!=(ONs59T*vrcw1J9h$9^2(!P%uDx zY)iqzVaH!wjD?2-S1KZ`k3>VmVP7=UmoZTem>X^=rAsH zRs!0StOY6Wj!cb7F-55!%(PR4=6(~XzL!Rfpg!L1 zUm$NY^SAPXk4j}_{=)-4Tn1jbOortCi29^I_1ps}gW<1aQw!$ap)639VJ;Jo-G5*iN=B9YSvqEWIT0&Ca=Ky4$~ zDEa#f-JzmTt+1i$Wf1RA^5Xd6R6q+7e%1ueGDGGqP@R( z7{I4dym&b8|NocWNGd@6QjcEIY`BX3AQhQT;4(KC6blbP>)sNe!vioAt$*<#4v*{s zjp#wDM^NF1*bf~JN%SFzM2{T!j$M$ze|g3cY@0mPHfGRi&8$Cvg2LeV3p-BGcm{(< zuc;8oG|+{+2SE#(OL;uHS)YIuwH|=ofOY^9Dm8wb3@@y_Ko>$lT$Lr0l>-@z-ww(f zy}VptN^~knJ4!o!Z70-C=@2(%|AeGFCU9pW7RqDeZ`A@P(<=$!R8gk{3m#~2%KU@{ zc){HN|6d9?g3@$*0;tJfBG@@M=l}ozz0QoC;3H>W^MjcnvCg@m!@ryNg4pu)irrg5 z44BcN`o^PI^xzLjxQNdM-L(x;FVEk<-T@qfcYi=!%UJ5tJryJc)eDLh&@}>}hK_YO zxJt4JhZjW1ak91p>i<}XiQP~W;g?{%h6J&sFDJu`>mL99L(VIQ+5<}+woo?~&-wrV zrLY6Y^IYFSo-b8}se}fUFjytT1ux8I{Qv(_796m*zkvg`G!r!c!v!g;lq2A|F(w`? z4bF{XVbI(t5C-xYxEqrN9`gg);nU0dI~1H7LGwS~QR=J%?NHBxI(OZy>0mpV`CCCf zSC4MidZ@jt!{PQmi9^^c6AHDr4`e=M*buzx568rxi=@n3u{n_v&KPOQ3so#$zlYzsC;@^1;9?> zWdl>9+rEL43M6nL4f=C!P#;6a9KeMHLiZ(*gL`?8f+^7o4BZo;x|@H?m-u;fv!;Pm zG#_B`=wyxl#>3DX%m|HLh>@VwRu49dw+Kv$s)972l~o21?3JznY9U=ig?$DVa*@CtJ<1fOQA;moCusYCvSiPpkAd5SXzqqg)T---@v!+FZBAF49?%~Dy z191A{Edf)a`#z(m`)kcmXHKwYU~t?EnzK9ZIwJ>kO#Eg>28I`9KL7tW|6nX}eUSrZ zF_##C{di1jPg>W*w7Vzk0?FBJFS2T5l zTmssR(s|6I^ZE-OupeNnhM-1Wb?0PwG1(ckTk6e6kk6P(LDStFY><3l5)3bPa-+b~ z;NnglWGToB#X#)E9S=wxJTbKG6H0M+u?Z3guN9yPA6!s*^osU< zM#j2us8UFdzUkA;S{e+pmX{Mui3THSg%mN_P+L5@S^YpGL!HN8=wF8A=xyiz{(pJb z5)=oZ!uh!Cj7$awhSx^jtg9lCM?71CI2m4)Z9wXgy|DlH|K%l1&~^*3o^I9%s1u=y zy#W$G4Q`waFYKKD{qGK)(akCn395BUSbM!0Uo&;ygnGs?6uLxcWf0gee?TGDE86}M z5eyK&%x{E*m`68j6-W|N*5!ZXVE~)HEdpeEDK68!A*RoRn63#j0Hy46M3}Au9U)@9 z1PiI2vw#0PHveVhZ&_u*!0_^h1*j5jjX(~h_&`pE7lG@M0_m{bzyB}ST7UuxJa*sB zY8(NHM^NGn133gVd$9m?VNfqCE0pii%enxyYe;2HE2Z zcG9JAgaytJQ!c#R1-kjDmsJ$X_vmG{hcFMo2B}lJS!aNCGSz{c7U~D8DqSzUWQ91* z3Cagub_QV{cx~9tnu?@FA7bK#m%b3o76d?y0G+)E)xy7x_4Ip4nF!e+vKPvOY!KNG zYQqR3`>WX&JfJ)ctPD~qcfIFf=w>|=299a=vtdlaHB8-tQtJRd=$Lo zlGX1$4+G+$byofNNaZZkCh&-;h{thP@O}^Iim#UrOyI%kQgz7aXx6E}|Bt)g0T)!Q zpsNi)H3F=c0&1T?Mjo6`fd{{?f(Dy9kH28_hZh-EVW4<{^jA!Lp)C~yUr>67wvZe{ z;X8&Id_ZA`F^IaL4wC#~69Qm|fQCSzjs_3sv-TE)^42{_hc6UX`NBq8KYDgT2az@2 zp=U1#sQIAtK|zv`>?QCH6yn=L5sMX(_bj-hvRr)O?y)u=GcyzO}g1pfDg2SVe_17C7hSzc)$64RL z;Q?I`^Phhk>$^7~#gKIR=nZJU8#rn~BMz{leKSb7^Z1L~;O;eIEEqHnkn7RSIvYGB zb^OI~A9%`P2tlNrUtZ9Z^UVvMa=^nNj7X{HkS8MbK+4VZ8c0BUAdNnQA`ejzgU1Fz zi3RRrNDXrmo?L#u21Orq@J0-afgatgPeE!Rspi&e9tMyVrL4Wxp!9ejF&2Pk#ZUM& z%`}j9*!|6$t08WF*#cfnAN2|x3jD2Y;IVH1SD-lNZ>?Yg6|UetVxaSpzy?4DuaC0^ zzlJp2;p5k!g_B6b*}v-<7{J5XWuOMxjFm_QDwic>1cT>zE9hQAP-X`$X92N6`K=o) z+I&Ew^Z1K^W8f_R=r1^UUhsLtBhEbt>|}5&fzcBhalbv_5r@(#dIk~)w-P42LTM$e zu7ZREw665&WjzE^+RMAg18WPgx(ak0%G;78k8W09sG};q;Evi9h;Y;z52&M7fK3F) zOBQlUs&Gf7B%~2#38<4m@mqqL|Ivq+A*l#b=pc7|u2w>Q1zo`kPBh?%>t^*1L=-jF zfha`{EGdB|k+56!)3fsf>I6U*)GAmh^CkdX%4ojiVc1~++KmN{OwdM;N1&EA=tMkF ze0z3YfR5cFZS;sb0Vy3`z6W0_ar8MjF!@_2u_7nKdoMs~0qh%(zGMEw-0lOSIqI4=?5yko+JPLOFg|-JgHKq820|1=F0@(o#Q>4^%svK^^T&N8v-QhMcA=$9U6>7sakV()UK4Vq^+%pS7;^0i= z{Tw9|rNQigj6eDGvetr>_VSjyV$DQm<%mqg0d)0S_I3TxWGJXI{FmZw__G8^(wcrK( zU=s)|;NN-#l1V|kZkqRk491w1sCNb>QQk^tc@>mx?NDiDLcRqoQ{ogDB*@1Od;<*#pT@Rhm-L({~$8`b= zsG$Jrl@@^pr#g?nnCAj_+;wk+<1RWu9d{ONBEoUVDRZVHB4t7v3U**?piYCPOh}pQ z(+#@!5h=MqjdYy=DdK;6bV7shS242pu$1rF-iV|b?TwT)*<5;^8DBFycHV$AUUAvx z+IbM%EP-0s3AGTGHo3id7+!)_fOWH~JOTv?Gk>clbayXkUpcrD57|rpy1=8GRUJGE zcKk)KGdw7Jyg>ROt@SoXXizqRf(u&efYv*J+jKs?tU(TlU_>g{J{3X20oGcF>|}=q zDsmnKHM_tgf0%9bmPeqP1i3t(12xs7o3$Jy3C{DZIUs-5Zec)bZGoyt43iTfdqJ*bH5oU!;4^J*p$Y4O$LUSw=_XgtU6$iyIugVR@wkcXyDNz z)@#r)Bqk?FfGTyfT6=;6v<`abxh=%(WRTg4M&OYrxLX}VVWX#)>_Gtwa&65+^l+F` z2nk(}Zq|H|BqSVC9`Z2sdNU#|1%j9cT9nZOH%$+u0mbibP}5#AKzx=8^~`I~;<#uS z2ed*f5XJ$mlyZl1;73SvAld8*zCcH&4xuNiCBj@7hw4Ju`7U+fpvG|GgM2JbECi|TMe*EOJl zD$uT2aG*g>WqFbf8Y8>!20fMKnj7d;7K3{{3?Q}5wQCqk6wv&}jqJCWW{}_3FqE=% z-g?anK0_HE8D$R8++Pe1N=T{K{Dvb4ayr)(J5UnE@aeZaEIw@qsqN);x5FA4hx0&= zfCex(%vMf>ty%JpVUSpDvB7F-BdVqFRuMnM-Yd3P?e)$Bg&p%?}Fd7D5KN+vv*ixOz?v&k=6 zgB@_j8ms%eLAoGm-Vt`h7#qaNjM#k~nG5pqMi=N=IV)U1J#}ya3<=)*AeZ&>&bPs8 zpLFj3|1Vdm5J-_hnIJoSL3SKq>|}Lu0j0=!xACON$~#E8?NkFOFYov*Arnh&w1et-uMy07RjrsC=kt(7rP~MKxH0HB?z*jbTfW zE{Lb$DQXMI>|WmWR#I{Z$+PVq}?wi;n%nwyp79*^PsWS&V^Q;9{|B6Gk zy_3qrb?WCO%PU+nH& zmI)1)Zq~$`JPhA&G(SKw29h{)AZGAlHzNsV1|(_`ew}0n_Ul7)tbWyoYJ0g&0c(VY zKy+tdPZ@7Bpbm#yinxr$3X-PmuOy#Ottr@(f6TCY(haKZ zD^e+@JMf72FZb}3G?bHRr48iFZNZ;*DBvM?EH z_Dfkg(9Fh@Qd`t2Ix906l8Z`=!J(G~qEJjwgqd(#mVu%5cBvh@0kAU12&A=_R{=z! zm~cN8;=h+OWkEp)DI8(CxIxN$dDBd=rqCr&tr&Jf<9weH*wt%56pEeMP>nBDWx+{X z^C~FKg4R%Zd33W1Uj@&I~(Of2zsBK3B>n?##nv7ECm{H2{K?$q+Ee{A^|k7dj;%?iV%-(RwoeK z7Ic|Xy(={Rfi4+?MD2e=a3K8yd8SvC9i$Y+Pxer2U=v$hki~xAE<p$U5c~TLk51OjAXYc)k!PT!e*DD;V@QvX zyPH+h8kCtJUF<|dXp`nL*n!|C4Z_ur4ZzJ^k6zKx%P6CI6OtjJ0(I`|IH-qV3o6tu zBQ>eYK|_G>k^*`q;B=7Dy}X|cv4*+(8Lsf%RDIt zhL?p>poGsV4OR>7IdeieNPS0mY5z?h~`dyvKmxBBqpy*FfhDa4j#f_4FqWc-FgQa53q-FkYds? z1X`@>faS2oOGd zT+qNBBNU*?c41>9t z6{78{CRQKMgKB#jAp(xKm@}}{2ReqSh~^_t*toR8g9516S;BH(c3Zv`!d z!D!Ar*X3k*QP_proJkP}_XHl_gH-VRI`9hK!x&M)H)ui&?N4BbAa6AX9oP>^vcEMz z`5yVY=JnB#PDQTu4WGh*iv40aL|ehfRv)7Q4gp! z&?@OAwAu6j6x23&v*+n4P{u%M_FMu9L7P3tKx}ZcXAg+g&3g7OBvgKC!9&H!2oWk- z8qiR=1M)d~4f;kM92_3KqH(8CYS5WckWhg-7o*vue+nsEHGszF(6iM7kkP%opa93x zH?u^T52-A{3EL5#M3W%8gVeDm(ch5}*Fmbv^@0oxFKYzhqhp%F zldvGI0j+;&26Gu27#Ql~Ji1v+KwNN$W`T6oLWf6{U;!t9E#Nk*!2(Y8Buc;~K%Mqd zN)Y4d@?R&A0?j)YH2em&Y_U2tmga-~jn?1@g;)j-Mx@D~uMvh~6YaND8;6mFmp74?AdZnoFY8el2Qucx|qG2 zb($V1Z^HZc3E;N6?LKKvh8H#9Vh(!qD}%?u7m%yjkH8B_kQiI@19`{JV~{zCfMC!F zus6s^&xibZ1+L}NR4jX9_q zeR^4&Rls#YtqN9)Y(VNEs+GH@A?m5Eq~zF8S;%q9?pQkwn>g*p{t3KJGn zkQRmHfb{qBW`i7sV$5ckF_1`y1{G{Dv=KrSpRbhCIL-c*Yp4@%WbTLA8)hU2&JFAE_@Wr9JUM}JS zmvFN|jsh1@tWzM&6USZWfNnW>E$h+CY7G$s-6mlIVS=Q=*{fT0;~~(xkOt5Z;d4A@ zcvv2)0ga(wSK(xM!Ph502MOEn5GF_(9C(ma z;?XM_dl0Dt<0wI_-SPnsaUFkAp$Kn)ZPWl2@{n<-)$-8lZMi%sy1|(od@Lj^(Ur@A zt5ftEP8{lmZdPXvaD4DVA_8*$(ra$$%}b!QcplwIt5_g~D13L=C$Q*8=<;h+OUBRO<--`hf;oT zQQ%~F@u&u=hzQ{U6%iX$!QKWHtDztrkn-CL#DruRL^dsi*#90JiK5~lB`Chthq?gf zZVp8C&j8W7P#&w(zxhHu+|8;4aSf>8KfafT!2?q8@7W72_&0;azy<#b5EIFTu(&uQ z4Gvl_h$D+Ys!$x+1-0v?C@Uywv&MiFLJEvf2oqFbz{?YPh#06amVhup(%|x>TU2E) zw!+v;9yI?|jTF+axIiK8rUDA-Qc%J8dJjrrd}j~1V1#YHK!o^zDNw!uEooW_Qi9@< zgFdi8d#emK7*rTff*TAgj2req3*&OQ6u2Uy4<6z={^GSX zyi8G1MwBUXQqVF*3gliaWy&iFP}pItwdwMP1=}_yaIleA7^g~tOh+z^4dDjILJTIa zFy_H9_=Xq6#V?bYKq(eh7*F4Y6mU+th=2o)lYuS}+9U-JxYvq^fO{$d4Y-G(0KyV* z8^u9h!w9%Qs581*YZbu(hg=xrs#@&8cJS^2#SuzMVuqTAR91kS0@p#7_wrUqV=XAo zdP0JtoAsvx*bT5SCZ@Coo4*!fzBYz~ir_}iLp2&yEyF7UkUd!Z3M+j4A*M%R#Gwe( zbad~&5CfN1tx{OMd(Q*nU6?LdMZgcy6(^2W*9xev*JkkUCTxoFfD|Xgi@Rl@q6sm@ z=)?B!|7)%Zuh}QOW|{DsaY8ri33*W9mZ*C4+HM5tSPj+zZT2r@Mpf?7oBANyF~%|0 zF)sG-XMVX~p&p%2J(}MXcy!jz@aT4(;n5AU-a(?%^$LUw>ilvvKVa{4{euu-1q=K@ z2rz*KE*y6SUCPM7zs+?=^8@f^Dc2ny$6Z%|q6Kt4I+O+B+Y_gSuLca?sU<6>^}S z{H3jso_urd7lsnhbl5C0XfB*4#>vp_`^TfV6ueHoJM;&1ck5zsiHVU7Pq{(U#BtXR zpw4o)?+=gO&;=g7t|uJ9OGu%$bRJkcasf2~q!XkJb{As+NJ%d*rx?~`l;{TX$4*&j zmvMtE4+E%i+8z1=VV3~N1gv8v%5MMvzuW_EJ+kf>1r;c+FFbl#DjH9ks0=iWePm!^`~VTgYd|Job>@DT|Nmb`uz^Ml!ATLGxE_l_6W2pg9EmFu zY$!(J%5{Nw9NcpUB`DA`6mVJD%ezk)s~4<5j=0PUcfIKgEoi%frLKD^Hw0MdU@Xo zfXZo6W{^UZ2)B0r|NrF`7O-u9Hz9l50c2YtvTctUz}`N$3Fhr1n?SbxK-hKxQeFOr z*ftfU5XH8$PXGVEOoOz&R)ExYf^*eE2=l?qkKoZW)?Nr7lu>#h%m**8L8LD5!}DSx zOlmhoY6C(l3?>D+NRV|FLdp~>^}5WXm$eolE(;Tn^XO&GLWr}%#3MXZhf&jf(-=+yB37`z@wMd0K&ZSvITTF zX)miZg#QAxogKmisp5h#Z@h#aKy1thkBldfIs~K&+$QLBy#YG~mmQ&MA41h32=m5E zA&8C7dEsWwfJlMNnge0pc)1x8$GZ`#iXc)TRb>$7jhDR;RkIPQ+#pgQRRIv@jhE0w zk&jTN0FeTz(tC z;7Q>qIKV-@E@KR(-uD0hzkC7;rsJ-lTQ?an>R(Ne(|dWtc|h@jT>lE#|Nr0Z`p4S! zM~OAK#&<=l@jr`z3K`xQUaSS}MLTGkg;xBqS|4;rB*?+Nyt6?1Q9L%+?*D%jt6(K) z4@hY*uO%N=tJ0uWorJgN977#Lf<2nwSa@{S?(pb#-2raYb-LbwvL!q~-8_i6fQK^Z zj^jg6DFF}5L;Nkapxo2#y2GbCfde8T;n8dRS`2jhV-5#{Pv;{K@DXQ_HrLMIfB%D7 zFVi6UZg}(tFnV-`-r(QH(BXQXf1m65<`){xKZ5w%SAdR^K7iEDvlB zZ#lr<`sVNd|2zKw|Nq~^()B`#6U0zNvI3ny^!8BFUG*5vlf)dL3Z1ylyE^(C1~CU{(T2L7!PkE*&S35!N2+=ao@Qme! zQazaXmW}`Zce+05c73ACAOJe2q?8BDW(2WO&!$G?Y>(zQsD3QvhxrV2DR~;q%Ns!n zqucd{NAm$Dk4}V_Ka^17Wv9t_y=(>Z+V>q`FE{VzVeqiLP^ttIKez$mWhQ*y1QlP6 zZ@@?OckX@h@Be>~&aDsrfv)?z0O}qdb3M;++;s}LlXsleVFh##{&CkAAX$&@R)`kY z2jG}~!06HK`hb5ML(72@^%w7oVIcq#;@^f6=c)_}U}v3tahw=sl2C&?T+f48&{FRK zIFYc(^9&{Y9?iKhM~0s75WwdFBalU) zsMae{f1yN-BljV62!l?>7Y5aIto+M)7+!jUc0F{vK0tN&lV#`*|2PrJ;iVu`t_Xom zIk}97;U%*Is5>zQ67;SQJUU%Fz!Bcf;L(lj{gQmp*~_RpPd`e>fOk{QeF) zX2bP`N4JAU^8BKUPE#4wl)6Ice+mj)M5NP3vTGNAFw*NUimSimx% z6B9st3s3NaZ@p^e<6*FLJyFkd-1P{^qL2!Z0UvBb z0jSsjDb;9xAmGt@pfs(UH5eqhil2d@6iHG6Buat(!oc4Ou4X{xRBwTSM>lVgFlaMEiZBm@NAd;G>>#)}^f>r{#e?yL zhvl(iZLoFC2Mi#^<_nK*29Hi~+Mb>Ziri8zk7m~w1}|U9GB7mPp5O=Fa3#wN31?6X zLXwS>;RSaJs6EKqyM%|~<#9+Vm0LnmM;Z9gQaCkr(KcFmcqfiPe z|G^m!R8R2lJJ9^2ioZQjhJm3Ixn=S~2+=aR14{3ZmI5!d2k-`fO@`D;N@S?5Ezu(4N)V2uI47D8g6toTfu6;)dnM|kVz_WL9Sj*OH7fu zx+QAJToc&QgLR-F>9tMz!NKrC;mhCu6QCtf%K`qDs}LLDMGi`EwaQB~FuXK?Dd{}s z(Q9kBn1|uT0z*)}3kic>Q|-l|RB-$Si#wGx6w_l?QQpZL>igk41@~ z1cewno%#+`%&`7h1nQ#5dvvmXS_CTTAjX19E76A_frF3OP(qh~8|y`|mWJjNj2)~; zL29~L+dx#O>w}k#pp`_RLKN)W{zW_tFFqO|JGTa`^7xBT(1>0)Yb}V|{6n6@OAXw^^f(I5i*&?~g5Tve~_0vL7z_>nm`4+T$3GSxf3wan`#G<(A z1z6?r7Y9KjVBM@QL0nJ}f>xT|S;)iS*$G zsp)2A08yY=_zhZK5BD)A$j90G$g%Kk0Vr&azc>#XH0x&lzJQ0p_CGTNLz$UJx9m%h zWUp-=4=2NmoOsk!6aNOBYK|@7VNeBW@aSaS1yT;rZXVsDD?tM2zT)4;I&%RiOdu}q z1*z#~^#f5L7ki?(ID7#Q!;77I$S!sPt33Wf7UE)86c?L=BztXdaC0)e*cFHB;Y%55z*VYx}Vh%JH|9%AuW2A&10aA=5(R&~{&jzHX zoAvKJP{g`Ec=-dglpgLpHjwi&bddw}Gg#&E7iXNn<;E8f*A~=$1gC+gAa1YiF)q;f zXDn)nMuXkQdT1Uf4gCKPTHdq`q#QX!mx2V4OJz{}&qIV}FG#+d)el60Lemq)x#9Cb z@vnpIToC(x-@{4K(uUNT4w()-#0Zjn%=foaK zN^!}*|D9mn-Cz>dG2@4EA$>C*2p6?Kuukh8N1w zptv~H?Ro`#E-kn(`l9#M-~TVaLxKd<7O-*UZ!rR&WC`vt+qm<$C_}gpK;2bPC7f2O z-~kCgCJ?uvRM4Z@^#Sv7*DG?MGj&%%41+5##;IHuq`VqUc{)zzprdqN`k*OKL{(mb za16K&4LVR9>R50CBD+){$_2Z<1g@JICoE@(ECzvTgv!#z4%IY6nT7eaL&f6>1mG-udq0T!Lg0HV4fJVwywMk8TJXywb(>!D~(+081<1ac-gbRfx~Lh@cphd2sHyxQ0+fWH^Dx(*g7Pvr znRK|egMt;L8o4zKNim@IC#a!oai~P2p|-uKgr}jly{v?-p|-ueRIJ zA9#RTrVX|2Ri#|bwO1JUTjvTgF!1klZEt?z()`1Wza2Cqi_$Q5=0dbl&AB)kJTTg* zS1{YCuN@I}e0S)TgOAV~pRX0r6ri_YCxCL2>xGvBf(#6Z`EO9DLHnIJdHhA> zJ4ku=0aOHl#31F}25@<|f$>FYGOWDYfVaE@$#%3VgOjA|2Bh-tNF%tslYq+bZ<`8I z1S;=D5ak_6mZ8KOww9pt_=~LN;PURNs0aWAWd6h^Po~gZF?9v z_l4uieem2S%-_C@0j(RlksXoSma^l>ZER>gxz|Z(nF%Aep=U?*WR8&?(enx{J2vuy zvXv|Hm_IlZhLvzN{|GP9d>IQ?0BhWVJFw`kd1-^G2Him~CBSMx`3}@CRGZ4f@S;N* zJe6xS71UU%w_z($-+yC{RP@7-&sB zD64|IZeOPGFuX8RW?(qZ$~qNta-Byv>pYm^nGnUGLdM3egd0@ufXZK=Qk1iZJ6mhO z`IGe;X!x%aeDM;fsP^b&J+hpKp?NPznxTY!XA0;ncGjI~pp@M^^$Tc>v$ypJi0VAn zdH%&6WpD)rx>uyT6(rl~y2hiMwE=7@xIzKl$mG$0+!7k%K#gzcn6wt^(9C{H*~H?jMNTK#u-(iN7DTLY;pbs}CqxAd9M49VYQG@NZ*{L=y6y z1oCG8Pp~(QVBQ3uGIIO{GsHiPlfcJefub7}$#2EL0l+kWNw0Fx>+xQsMZ7gt&Wgu<4#S4hB{*h>%NIR3@;R*fZ~vyzYjcz z*UNhPBSgo``5*`7fE9xrlmuph925a&!5y>^;vg}QgI0kvE9?AsPzSYqggU4h!~i*{ z5o-KvmlpzHb3i$Z4a{OGRqAHl`W@sP=6dK!jY}Yg?|j0+@S^+yXrQi_RT5?dBWT!e z0mvJm)palIGr+BnfdBvhzu58u6p$>Xavt5R$3PL$-3t=m6$~oOI?sWUmYEwP12i&h za!T2EfCubZcYsFcLCKi`Y;NcA7fTEN{(q4IHBZa~a?IyGP(cGSW$XTb|6gk$nX?OG z&MuHSP{oi2d-r}&D~GiJG|piOP8Ox0tu_*%>4jOopg@PVqIvHA1s&%u-w#cy%pI)4 z{h(?=mIpLwNw=l&8iAAs`DnOwCuJ0_nU*^#h)xt5U`%<1796ZD%McYN&0`De>js#%kUN@(1X| z8*z_rRz;B04*n3}-+sWOlU2BnhvBt*Lv4FTsn~H=!#*B{3xkW|*KyH|v#N9?(3fMP=W4{UC%2m!eft*PMJ z&|KTVP{QSL+;s+MXYgwdFpGha0TjvL(2eMU#fTQ@{GT4sCJ}~)|Nm=vJ-S(qL0n7M z8TCp0+gSDBDnme~^0(fHl)Yjw@e*bJZLAzn9$Sg1N3ZP;&dVY^?*6Cm_$Sbws-K>#a;2NL5)ehq5MyOU1{#G5ZWunvPfRZ4q2WSk+@(_Qk zC|H=)17u9+@fWSLK-phZ6D)m!zx5jvXl}JV1KjTRC{+jD{{%IYiNEzYqz(}VX@=(( z)^5-`RQ_&Q=3`yb1@-TI&^-jKU%Pl1bU_6iyuo<5i-+L_D|o1#wH&6n2y8a2mD&JO zvP2XdILBGnbwLaVMK4kwE(ZA?wC=GKl!s$MCc$0h4~iCe9?tE8<>BluL>>4l7$#K>LojeSnmhQ`FsN!AVqP^GD1los- z_XlMR{#J94e6#BV&{z;?Ub8#&O6P@x511G)FdhJpSAb{m`S)GucD=%Qq4|XYNU+)U z0pknV5Lmw&H0Z&PKB3P68ptW#&|G_k9o&08_Kkz#MTa}cUub>1PuD>HgOqZ9$kP_! z;R+$N9@a}}pA<4j!T?sofu`nl2DIwp-*>~K*R}{`HLp7dUevC2mxEznJ!onkcIx(v>wo{hR-5ozdBSUj39n@*yq22qT71H5kqNH_C%opH z@S1x9co65M)Z_pELACY^4@iNv=qspDo$?iDp=yA$P(2Qgmr{Q4e6B~gYX@iu;5Dew z*!z`(;e|WMshzAR+jtmWv%Tbf0J6972x!4Zv||inNe*ZoNAsHm@ZN&X(h0|1!OJ&1 zjkII}$qU98HbJlme!;(u0V9IJLl&i=%?e;?&}^<= ziC*&$J^ucQ44}y8Zvl-AHvdrIZv{`Ig9~)<`m`6v7#LoHhPR->03Na|DOHDZ!9$h` zr4k_SF;K<%s|}LrK!L*i+8-ni8FFK=NyV+}1d1+D-qHh=yDYAtG|1Z4%ERzdnva2D zLN_blJ8p*710^EetTWoc!-HJMS=(T`yIF%y}?ils^08A zaxlDD;{rBU4`l9PNSFDAM<-|vAZYy`gGV>qfXBX|ya(>?M7MUfVUdI2c}Jfl_5R z=#uQv8y=8}^&60hb=L_V;92zv#~lPf`ILVf>y}nfIS-lSTG0wBM31%dFo60n{M%T! zBT23XORj}Vg0cp5UE%{!NP;@kkipCspowyDX5M$8({)R8?UpM3b}JqRhHlp_NGk_3 zzH`8Lh{S-36X-CcD<~a+R-Wncfa@UDp2LIiZdk4JBTfJe9QglyA5Sv?{axpNx{0!O=-wh658Mw#!K+!d8!QHlAXT= zv@i#hAsLUmf<_!cB{5pf0r3Y~&GCZq1t|SP7qWoD75-X6WS2A?<>Ufi++r8j6R?8524|3QN_wh1>m7+&lLN%e|;zrw+=Z-OFd z$PlV*>-oPZ+XS0yuPE@hsIr3#(dHKh%|E>O+wY?La4C`xXTp65E&@S0{K~;cC^`Hk zXek-8EJ`MS2^z{qmSsXIY&syxc!Ec_04NASGw0w^=yf4P51MF9x9gRI515)C$aI2o z-oY2l%@3G4A#+)viVBqP4?bc>w&JyhN3X5r4GxAEGi<>vs|%Mo81`*M4yL|yfB%Cv zQMz6M-PI@z-iz=00y4bNYg%;?9Plr8xqvE4{??bEP3X<8FPL9~S;**b7HL%eCV-p-vK`zP69k!D3^5s`ulYf}4QpvI z$a+wI(%^5^gs6v4v1;(Qia~Z?y{!eg1Ttj$uogVTajq89HtTlX!V0S0I$1x|@-V!7 z!vao4P@%gZwcV^`Aga^##mjS`kyN;g=GXEtym-hBu83EIZK$_lgvg0pU6~W6mbV1zaANFOgpnHvLp=*~wNdmNy71S)M z0u4k@wZ>Su)C#)rtDE&r4anp69-XX@YCzRGNGpR!x9AlR@8Ba=@G>ND(&XR9dK|16 z(%9JzQqav>1EN6Az5?!(y1szK^3oa}h8NGlbsB3VRLODH^));Ush~sxsiHj&J`nKe z1Z}!%Yc6tWXyn5*k>U+AL0bTU<(jL^cY<2}Vk3e;rjY7!>Sk&s2 zJcTh;O5{9xZKd9EFuYh`1x|;Mu7=R5zyDwIqMMNhT2l(%wELRpxGQ+cEvQ6igsu~P ztvF6$n3?<+$3n($Cm9m5Fehu=i+glEX7n>}Re5-Qu@Bf$b zjG(2-2S6bS^2h-sj~swH2Ii3iV8dRVcO}LnV3){)*3gzpHrF0tC>3t5-QrWq+njpl zc(d;rjhCR+&|pO}U`1lhwFekW1;C29po$D$7d6)&VJTH;u06n9C)HegfW2M>q@skc z+x0;63+96lm^od~y!L6XJt6?MhQCg@x%PlyJug_EpYZ@lTDQ6OhuB6o*UFI@UT2sYz*$U9h9DT zfSM>Tqd$Re1-FfT#=-F7xfv+xSToCc7+y0@@aRqbfYPr9ZSINyZSLwU-O?Gl!K2f6 zg-fUF5|>Wj1s=V!+@J{pHIL@Q3ZQ-TpsL97a1nIbJp*W7vDfz484iXQEhql|?`F1i z-B5bD+gYUbK#6~I?FO3?q2}5Rb|pN`wHu;A&8rQurBcUT-+&s2-OeoF3v@aUUVhYh z0n|nJI_~-gl)F%6nqM%2Bz3!;S(;xkB5C=4qto>bhA2dNbM1x#uziK4q8{L8+aZsG zuk1Y-FL+%10qPTUJM$nJ1zLeK!$aA11!&d0Mz=Fhcjz04yFdqRxvr=Y0gJsr7OUet z?)n7e5zz8^@Lrwf+9eF2mZShfiFR}C6NXaIDGJ%|IT&7~nu22BP`B?E(2gbWqz0rI zl|TIVe{<~us0Q${3t1oyCb%>t9EE5AWl{l#(kQS!As*eX3dcb~$I$J}X~1T1GtcytQ9 z1P!2dJ4>`4C{gr)9v<55%z+VLpwk(RyPY}E)Ra5p z(VV(M{4K{sK7NAr=0XvCO4h)@pH_-Yna3_=>G?wxO)bVBpxz?i- zz9|f}uMM(b0JNw9v=z=qrxeth_~8M%{n66(0e?F?!~&2A*xj1^t)N2;UM#Q!RhOV{ z`VWuhS4^1Qbnq^^l2VW6+#k%K0lnNGpka$29@ef8id0`Dg0+L14IpdLnhjvBrDved z11&FY1hoXZUBSBf+lpbl<`-Z$Y4EoufP|WJe=xp;?)d{bnAHR91s9MUNOSWGR&Y4+ zw;CdZSU^H5{H<~bA#mWPfg=cH3^@1;N|HeC@o0VlmMun?1#OoADF(}?qsxL;3&Ld+ z`CCC;s&J5|&8Y_eB zlLQ?%xDUhy)uPa?&o4GwgNEH%mx07PS@mI#?PQ(O0$M5X=mw}W%-?bt;*1;o+Z-f7 z-5O^8R?v=aa2*TUg>?LdbOY$}4b$Lzpwj603sy@|CClI11=R?yeviM12C3>6b#HE6r5rRHeE0=l@ZbL)mWNA0 z6O=IJH$ZZrJP;B=*{Ryae_C^*9(_9t8W4H3j7E-q07_zIVXY)r){I z(13vJ2ao334-DWHOCLNsS#6s^rQmiB5rT*68b?ATG7-cKrjcihsP;0_Bq# z{M%hzU+`}S)i@Wx6YtQ8Z16OHv+D&WP)=*E{lQRq;kET~*B_wTjDS`NkW;~0U4Jlk zyZ*3t{Zn%eT(2S$5VZLH;n7+8p)>SNH|y?eAorC>bceq2==KG5d451$GU3R-|F6X` z#qS;Y_kRM4i3ZR>?smP?{KDN9GJfD}Id|d>P@(5HOeH8aF5;7+$)9&cJN0y}(c+=K&g^g4PHIrToWP z?O}Qpzaf8-gGQ1Ro=_%zo&YG7CS%wB~w_gA)h?rpU=YJ<_R4yoIgye!IO_}&x zuW^7J_4X>%701EcMKJDuFn97*s0ACq+?K1{44^d>FBgKjrB}HbKuPT7BuHca0;qZb zmq5LytDZyh(^gYZeku`%3eScL&jSmCycBSi8??yz|4UDhnUKSsK#D;nYZ*BCfeLw> zFi__fRCzFfcVWX+6d_aufj8*=U_8$H_X@;Fs3LG*&9M209e?{_Mpf_!JUahruf0w%>;euYm}|Y(EVZo(dKQ+3tRsn_&Sz1H(&egqbU# zs`BBg6fbi#fcC?_6h)|NhpO^~tNMM3n*p>@_T_t6#oTL}234gDS9SFgH^UhL28Nd> z5vp9Fs{R^*{0nl|`b*pl2B0(R7b8@uKvi9btLnVO&F}-HsurP&8LDa{TvhTVZU!wO z28Ng62vv`sK*FsXtct%CG!1Z^)$$TI187t5OI?J@y-<~jV3qK6vl=Sw1rdg&o9R$t zW3VuP>vQlbo`)B?89Ia+7+&50m8qZtyVtY;s*)3|5^ioBRQQu2C@4x`=6XSeZ-a&T zTPK0d?Yzj%P$160@Dj9)1Db!7p(;0mRl-w*AXIo3L>QJL{yv6;Lo-;o)bTj0=|ye^ z2YCjD*P#8Qpp<+Usw4rTMDaMQ&_zhFzZRYFT6n^1feEj9C%i^F=MLNoO6+ERcY&M1 z78KVdA>FJGK^#ybDsk^-y#nHZ(n^U{H|uc_2NXOdx*ol@m5(_XUQAX8ISbSkxBwcV z>%0!GcV7J720gXnw27LMV|0N4p;?8+UeFBj%2T8mJ z=Uw@99&jQ4LggT6JsxPSpA?wIQmWg{Dw+BKNS4n8>AkIr#+o75}H46*bnq#Z^<@=E3fByxIkfOLR09pPvro1V#{BBHnDP;NCnDYPcAp0Lv z{t2>tG^YGXWO-{$`OV1k(wOq|kmY~>!SH`4vixmK`9HUj+`k(n4;j7R&jnh5o~Q{r zR>L+3lzK`OKq@g(&ppjQ|Bqu$8b^_hP5>E=nlvsW%R6AoPeqnjz?APpmS+ITBRhSW z2H5H1AgAw?$Le%ti0^zrN~U2~!T?di3CbJA*p=MX_=DV+>}Iv#<7DV$wL8bn;L*!k zKZOglhs5F>H^T&!5kvux&e|U@x^{wUQpOU{%HSU!-3}61lw(8xk5 zJ9u-=YtYiOAN<=K82Pt>N;Hrb0ni9IxG(_mI6%V~j294vA*{FDS^A|j^n*vI?~CTz z4@@Px&9xs`O4OTcKX8#E-7f?Cq(1+65?q=N`2W|$4bh91|0I^EB zjaNPwB z3kL&GfJT9vsokLYUIzoP*342jgcx|N450xO@RoJcyv1$fKDL-pMtj# z)?n{;5CC~J!U8nn<9Y!)Cj7D#B!ArX0jReRs(w7c>ReyEbOT9ryS{)pg}+q^%J=9- zaf$@UmR44TB(gI!z>=T?t(t4UFqSxaG}k_0C;=U@^#E*a2KXeg2T&tHhx~wyD+R5& z0tteQ0tteR0WW|AyRi9y0BD^5wIQfZ10|)_1EtWJp>jwduh|4z|F;et$l&2D&;%Cb z^qd=z#Zr(!vpiG^YG^<>-2tF!tQ(M}fl#5)7apAf24H8G3PB4auNv4vGiRpdsX_to5LZ0mLj7Zg%~`2nrGYzQ%w5|3l8ehM3L( z9<%_BNAb6A`TPI>1k@2AaE1h_>~?Ulm11OIDB*+gq!}3)O1Z$T4DfN8-K-~~K`lUL z{?;C7=Zb%u15@(@#+C!6Wl&wsKbT5`Kx|mH2DOAheg~hkWC54yJpST&Hh6V#c7CKK18krG_3mr9Kl&7JRmc`>}=GX1Bl!YY6^i)c|76KS$e>u+w}yf z?66@0Z2)#X0oKY|Vh<7rvl&Z3bCMu&NC1F_EWtcb0F*#C1?_{RgC!d{7+xf;0c{HE zc0B+}Dv+o-0rf6_3utov#mX(90*-~hRS=SlA<~`4Uzk+<`_I44!PDjge+zh4zuOfq zr;`OL^GZPB02e!)_3wYTgM=z*BShm&PND-6;Zz@wd!`L=fDZ zYM40;0-*hVpw=K9w3ci549cuw|7BN1x-?*gm{8~TL4q@DTNMj zdlMcj{4GxG3=FoQ2;y&dX9w?RFE;^gueO44_}dNH(T2ii-$RUI_Jc;l!3$%-QO@5o zi;aQdc8k+@%R7B z2T(&ijyrgOiolomVFI8Mw)6N4!!l@;f{)E8)r1-ZDquMvMF}YAKwJS2Mo`1!0l2Dz z^oPI+0aUnicr=2FSVjhqgS8JpQ$-+693H&^pz(PS8&W~K-sonXbO7Az1Rd{ngUO@Y z7c`A=1KhZWju+2-`Tze*3p8hTm7+KkbaoubSR^N6IuD`%n;ZBDxj_`r&|aK>fgZ!LxLp-G6pB?Tb>DslK*f)N4|pz5kH9h4kJMYF)A z4u7jLLS6wR9|)2EnhBK`hR8qg0Npdv9mL_$>lFfJ3wSVI1n&<951gET5%}W&|Cf&; ztF$ov&>aT#!x5+om>;%4`EWlhMhHOsFbN?5_QTpVupa_pZY)B`gZXkZA` zg~Jh0pavAw5)F_g2O#Q^jo1JZYOH+#+5lC<<P4)*wSI!UIKZc_u2pdFEv2!=yrY3{D2vh*GxTnZFNERr-SW34$86J1@IC8d;oXn zMUT#3@N-$4m;C(?%9x-|GVVOm#V1JFK7PS+PNJs3eFgPVgvty%t7=z4AB`1}Q`Q9uPfxDhGfbKyBGaW3zXDlA#Z(avc{6dw1;s1XRTLuOOffDfaFI<3;1#}XP zD?)`JOKCNz`2<%X$WjX0RtRc7@_@G$f>@wIq7%m*96%egKrsuhaUR_V*Ep>2QbEn| z<1cpTf^uBw36D-EP+R1IN3RTMhYWbK5L9YNe*O<0^#I4-36IVIkJq47D-2p@YbZn@ z)rKwtrCMLmTGktoonYWf<;|`I^@;$1)?42(fmfBv-VGC=?{<2&<~K2-q-j3{qOeu(e3&NykolaT<7r@WyYWY zWbI4_T}AK*GK4gt>ED0I6mPUgx9bN`B$a_%BBDvj;G!K?tf^~&i?vhBKs(^TF(E3E z0!pPIP2d^o1!@2Ozpyp=`ya9v@B?HR=|xBsN)HdRt4jeiqk7!+1?V)@7wK&O{&ybs zNIvXg>H4A;v@GXE=V6at+XvS<7+y#Tplo^Tn*aCzYo*rPm7s;2&p`@)@`KV1G~nOQ z`THNVIv;dW$HWxSF$WAbI;Aom-K@~Rpg+kxXXE4T&Y()rM%^HArx&igMaLEQ+hGg=plhY>+q!zx(h1iv_Fx{YUD@g4*C3owawmStt2}D?ZR_&^sxh zwQP5aO4*OQ-YEtdtJBB805L@9?!W)wdFZ6(A42@?N70W&Pri<5zlC3iO=Uv#`aS;p z|K(&xm{IBn|NaNxV({WA%fJ7iJjwbufrkN-Fyb`-{eKYz(vZZ+!0_VV3Q$v>xrFb< z7ch&3zjZ0dVXHwp55Kq%76ctea23n~9Y$~(%z__AFaeT)I+t)TypUZ8Iyr<@XdU!0 zg6|ukhY@@OF+hhAeAxhv_7}_=ko5ne8e(3lnnyQlZxRoKN4M{bUE!ee4pI&e$bk(9&4P%4SuCY~ zFU~Xn`ww0je+8twS{>?+&&xqU!2)&%E6g442zOMlqPm0k(ck~C6+C)vXMl|HLUzQS zIe-7Zc>55v+u}HD=r(BLLtW%?oYe*@fs|~ZSspyj^5XxkfBzv7oIQhq0kz|*&{_M& zqnnl050RRG`hvm^o|-`&Ux@DQxBmTau6@H$C)>?>W-GYT753;3{n73EW*?}H-g*2* z=kNdjU))^|N`h~YmIrnof3f%ZU*wT4(8vMoFVtp~svsSd3ZYEJOzZ+ ztjFR(Q32W}2`)h={0FbOx!?g>_W_i8G5=31HyWaJ^#QODMq zfB(P8Spv$2pd6b7X0eo3ceDC>feKNk(t>W*ATLmZt3d+31)O@V)7!71(hHDRH(-U@yJ!6#|8PXy2PfhkA6gzVL)(eov2X z);l0}w}(JC>oJG|c5oN>H7mG9)y;aulZSzS{UOj1-rcP0L5ejmdUT!w4ZC?9XPxB< ziLv9X9UCD5_HsL<69jTZCv?Zt32^k6Dnm-A#B2ZlA7_o&2r1l-vu^T$4CcP9Md*x# z>gK;6oXQ1$f!B*0`Ks*Ji> zcWnR#7xW&Y8HU1x&T%M*USVJ z-U${4Y4%?ajff`bXgxU5dGwkto(HkMj~8qYbeZe{7El(vB?u}s?ljllVJH>sW({}a zVd!LKUC+(%(uN7N;pq-T9b0ql9hN#!i*Uwy(EbNjuxXH(i=6uR|4Shz(5ACHovdfq zaWlMRf!glTYg%<4tn`H_+>M9VLEU%{GA0R%<9Mj5_k3XI@gHZMyAB$Lpf)`;7~G($ zPC``0?AHJ_ko=fHHh_kuL^<3+r9Eio9JC=ERMpt6;|6UOvj1&G@% zY6+q`9VI+E10iR)cCsFG<6(H|ig4JCb0EWyzX$_c$=?bokXh%uflHYe;LAixLE*Cb z9H{-n0#*$P7sn}o|G$LxJYRG>2(%t35$k5%x)z)XAQLz*mRy0aSkEuYsg3k8aj8;YhVi_eKVW7tgMv+YhQUj=SCg zHNCo7i=DwWTM0j;t#*aw-~X5Y!J~eRV2i;8ml(*$FTg1dYVo~((1}&9Kfo7iGIxL~ z3)>kBIT&8-(1A91U>BbpcLm)w1nR1T8wDE^z%7NwQ=ldesIkxszBKF3PSCz^57_!^ z-6x=B(-4`g%q$s4u(VGvtH(l6*O+%9h=MAHq`R+|K^@K`0uXOhvoJ7p9`fjQy%U6_ zSqh}9msf2O2g5Fq?_t(KOxO%H;l-9~fB&QOf>8p@$q6OE7Bm0*|8hDgNB#g^7}Cl5 zX%(n)g@z0hC}d!>aj+2SW<9qGlmcBr6PVIrpgeW_h5KUAFuDS0c~8SC&|)vhh4H5s zb1=LHbzB^mfIJQgkI|L^}7 zeOLef-w*C`O;h*_x}*lQ%K8JiYzNy0D#c?ifp_&i4F;VG2p)a^;Gub;^O#3B>qW3w z=mp1}MhpxLu&LpTVErJivIYPCzc_IPEr>v^Q|PksZq_gdNJ#O3L-)mY#()1`7em;R zObiU2pxb9zBSRoD*t!rNgZow>VsOWNXbf(d&jG!r^+%RWcjzDJO_Z(RItt?+P1TFg zNK`|2A*lH1W{qC~4t~}b_t*dX|AO%fdL{>{YOej0SIXbbY7A4mc|E9y^{4ar3sr8E z(G!p6Hvyfsdpx>XLF0*_{?iLz5om|v3nYe*zqkwSF@p+jZ~z8@M&(!=gFzhy@aPe1 zX)vhVW3YkrYtlh60BMNEfSBE^p%8gkho)>9D6c>|G>{DgppDAMUvT??hRjN|U^ZR# z0~IQuQ|Hc{;9!8H@*BN>|G&t-{P+J$P)FONoAqZ9#BQBZBad#@*Fo^h{2qXq-K;mE z@({P31_?skb^yfebv*zp4qj~L1Si!S;G_yZqpcopZ6e6pFPHxQe=XtB8w#4-?gAa^@ds3Zfe-a~v4In`mJ3wFe+vW$0VsIEx8y)B4TGLaQeyie^z+~UovweH zYyU7*a5dNdk>~FNSJl0?hmLbFykJAN=1(WWnyZk`=JY@w25__9qt|rlad38hVax(< zyYL)${R2MveFj8n4wBMZs8SAyQqJS9e?Vu3ye{zQW_3YQ7XelGfEjEgNFAtBcn!M$ zLk3A*^HGS^I}qwX%M~yFW<5WrFYr==?y?kQ?~^G1ij-JPe>=i4rkTc$Bbq zyZ(92x&!30PFB;U+zj2We~@Yc=+-+>iUdtNf&-DI4%80@l~ADZP>>s-8#|Lh>tw(a zhrI!y3mf-=j$()Gob;ICp?CphoYnxeFR8Qiibpf($Rz0XaH~M8P9IK%v<&!OTnDpQ z_*;7+ZA|cGZ~MJLxdOVChQ9^00vkN+&}*u53=%@qz#-1x0@`d2l@fiYFlaR7xD>h^B2*hZXg;-{gW*MR zH)v!S)JE+!Z9WJwWFA;`Ntg#j*!>7ZxE&%4T6^(g7dyx~y{3jxxoifoz2H&uUErae zUQ=19oIga49n>jdfDTrJ@6H8f7*M1j@(E-Z9(1_c3Xjgx1s^I z9)Mj2XbG9vg~))9ODlmcc9BPt0kuRsU5|M5%AQ`&!SEWke>`pz2ZIM<|9A}~INJI+ z7+$z^{RQtIKZ3M>{0Mme_!02_@gv~<<43^z$HCjKQFn=ht`qix-kFFh1Kx%9;5GLB z<4>^f9|z6#uK*q61*$H6Lcxg@H0uKwb8!IA7J&Eub~}J)j}<_5T{nXdBk0mPQ0jmy zHuV7K_ZyIlI6=G7p<3EQKqf;@7DhHI!v~tmj=wk$R#F0*kb|4&36ln&!?pwD#x3?R z_kg)me8C2IGJ;Onfa?vIr56HbRHMmQX7M1woT(XXMg3p$m#+gS!Qc?MeL?*ZDi zUMdB0H8_nxt~!hZr?i)l^E6#=cv!nGDDi@-X*i<*no@9G(HY?4(QDg%kb~ic?>A6^ z59*Aq==KNzDfH-efGn?o)R~2CfB!?wJP0a4n`>t<@VDFo9X7wP;2EfapKi3vQBZZ~99-uvspuhr$JoviL z63{Z03!r)P7tIeCK_#8BM|18AM)0b1NL~dWn^MB=(VTmMJvv=K zyap}u15XMc1r-mV&B)*c`@+N8^#gc4Dd==aaCZ+>DlPX1m2V}Wx(Tf5jXjtTTIvbr zXM*{qt3judbc5!NkH6q_1{XV^>%=cIgQM<2iHb)r>k$?x2ej$q0b*?*>RLu<8@U9u z@)>LczZ1wt&{4P$<2&rYe3VG(bp7*M3>?z?DnWN<_1b=I2lZ=PKuekbFqGti8xfFY zF`$qT@aQ}U66$tvIru`n^FZ^1dJj#62q#2@@q|b73kMJIQZ&%9m*6$6-3~6``%J*2 zLO1ttFud^o2ug;~-m_yJ#L7~3aOnrSHNzDYod;hCG(V_^#3;np<_GnfhdNPLZo}84 z!WJ+HIf6V3tGJ=-CP8aO!AluxZINX`%Q8UyMQ|~h3UfdaR0zD>4{eDn)QzBnOCe^q z9)LxL^^5ympcXI-__#laZ0GS8d48}}oTZ?aA4nXuPzz=mAQ|Y&JP;GUGOsg$qnlO80F()s`CFlf1snhe4HJLsW=N(0=>V<3=WhYu zq77cx>HzW&e+#(mfe3(u+Qb1=9gE%o4a`_x0GDMT-QZ?}1VnBRR4x)czS125st(|4 zu9^S)@1c3vqw^M6wlhHBMO`N-fSJJw>B24!h8IllK|upeNGuJY(M;C^#~mC%V<<1X zA#HDn7qY=?UqOb09XHt({L%qxlt(vs73u?UO$Scppq1AGFBPEj z;LytAZ-t(n0kRIfydG3dgE?RY*|3GeHz7H%x`l(`g=GVzWeidVcH##wuoFSoeS^e6 zi#(B{4a61j=#_!RH8@xoo1q8U%QkqtfnAPd5(6Zg!bFhLfxv6fd3Og8Yji=2&kw-; z4qAL}^x{)HC@vUFKyskv@}Rf_2L^a<8WKXV<^@>X1Cll%8w5ZtD$u5IkRUir3`>0A z?A#IuI6JSz1kTO}ZvuhDX90NaGlX4O0uEoWIYs=f!jO3%kjFT>!Bq>ipaUH~?$K+@ z)6Bu};#3_Zv4FQLfLsH*P6A{TbVWT#HzToEi8aDwhw?6oav;$V1TR0m21$61epj@|{uT`%iCJsyUaXOKMQ z0og17aw3OE^MMdhI|UTDouGSrK`YHc+c;ouM2c4qNO^Mb1t`<7=IepWlME0A+MRHm zH4$njq&%4gQq~QcmWQP=2@epr8(f}D_XJg0pz;J3`C#XO3u-1vWdN=)5Tej3Lh~T# zVmEN!0o4$oWCKfDAU%muss(Fkg&68 zVsT9;*faokLF>L-(R4&r|qo72+`A0!H zSM!hD5~t=Lc_k8%>e>uqq#MY{TQz_GgPSLyLN6C|K&m7}kt0NrB1q9zkRtG1Bp@rm z3*kYF!9cTd-~zn2mS2x9gkE<1a4U1g!-DErXNX%E9nL_$4S3K^>L@kTtcS)D_?Xx?%)c z2bfj}EC71O+xTxJC#06|{jBeCQ9Wi!EqS_zh&u*VG%} z1or^Gd=s=5zx6<=8^lSra3`$;ZKi4f{g--m+N&RqqLDz_>J= zfwY!?fLhC-2Jvf93PsWYYlMK3HAuJt+JXja`1k)m(!>&|T~guESv$j{vvh(-XDH}` z`VO!w`8zv7z0_`35LXp42C~PaSN8Zk4u;n(pfmJ9C*oITAc7$NHhoYDGKVJvH8QhC(u6@A(>ioHaI)9**+wi{Q14!Qy>=Vf8*vNfHh%j>B5w)uX?Gi(V zQ?)^}Ng&tpv>vDv><$KPMVbIfVTuu;C1x)eNzdXBB^LbKU00>?GJJrXgM_l1#CtnvLJSva9$(apNSf`_5I0kmYh z)Aa*%zvSy|P|o(~W`Jx910PHL12p>6?H~Xh0Rgp~AVT1>9n5Tg^bZ`UptaPXlRq6S zpo)c|#(8uHSb)xm_vj3;0PPM09V^7q?fS*q^+QqbYeuxil;DH?x>@(DfM;Jz1@?mm zU|(cE03}h^AD}bqSr>!k!2SUF1++F{B1i=60PwCx4v%ipGMEr}hd$_>wGm?u2CS=%5?(BiOW2=fN$o<9ilfk(HftTHHYS>wz> z)2_Y;Ao=En@&rbP*D)U5ta1>Q2Rx3uf=}`F=w{W12!V{$fG|NuszR8cH7iOG<_nK* z(fvwb(-}}rzcP`Lp_}!*63FeKW-IFhGmx@|3!oSVx8GRLA&E4fVgzmB>}H*a(6J6l z9-?Col1TF@CXfz~ZdN~#13*pKzhJXj?LhoqQ@y#6adi9FzyG%$0Ch@PW03SiO!PvC zG@KIv8Tb-1ipcsy5foacTF^C7KVN}O(e&tM6+`HOv_x515F!od6hNlDF7fDQ-3l>c zNfpE)+aN|nb+ax}1P2Squ#=|f!Ll78(s0fJY?wOeUMz$#)Yd+PNW(b;kiu?OKZwa7 z4fzOZsD@aCNW(dBcq653GWv4=A}?QuOe4VR zGY{Abif&dBQ}7I@jV@?YF)JI$ddNKLZxhhMS*YS#Jh%6^noe|GonroURXEyn79Eun9sXii5$U zv!zSGjYLqr_rT-(4e%O!P*46P!F*(AG`$3MZeI38&ZJJ5dK!ks0OPS zM3oEwK2Ywrf$$)A65R*wajU$?&fwDdsPi6tTi1?fzyEvm+CBrxM&ARKjnKpsmIB$d+28^x`USz+5MZrd>EcP&1 z0FDC4@|Ev5UW2+U4?LQW2%rzgg4U6|(ESS@4uz~3$)13+Mg!FR1MSf8=w`J?*a%7< z39YbI5v2kzw9otpEq!_MLT=OF|L|Q?pnWKk20RS#1=&~*5q`n|PToSF&cO{l&@kQ$P;oH2{ zgQp|eia8iw9LWP4zDEvJ2!R$YypRAX1|K8?*2@Xzf@1Z>_otu|u*Afp*R}-YfVMkG zuB^%Y`yX`0rEMcfDjQiUF%uNutRZsH_CM;z2Iv+6=pvpMuTFsj5VY3nx&b)eZFIn^ z?oS%PbIU#uvzv80R35TIWF<%tQn<`B;9+>-`2v91LYka>9^I_D5EVAM zr5rCbeuEMLr~#6$hZlL6K4tok4w-K-k2JPf-W7#I-C(6>DXd5M)DEDt)U z1Jry44|sD~f|uzvpAzT{kmzRpD#OFje1Nf&^^FVl^+aPzSA>RTt#K86LeN zM?q8R9=)u0R&X$Qbh9vl`iZRKvY-p)K=(p|4yFFn&H7J02S!_K+JB|?J`jF zFLbjmmf>OOJb3w6=Y`ILpl&*{quim6Qaspss@wGs=)~tguid*@^JRD#z&50TY{yQ z5Y-7<;S~yM-mV96yG1vEDA15qXDFyGx)Q<#&Dn#`zW3;5y&wh7Klvb;QK*Xc;_uZQG=H7+wTE`28PzgO5w|50mor&I3q8JFd$S zLpzqB760H<5uk_cdK`EC03N#WgdVmF5&${jwZ(DQKcF*kKmwqxj<3~`1i;lGXj$e8 zP*I)r@Be@BED-eO8`ed&+zj2Je>{>ef%_-m+p9b}Str+mjt+8t;nB<60A`B%=Ym$8 zn$BAWX=^G=gBOT^Iyhj11z`ri4gd|Nbo+u%=UM^jQ-byfgND4oJM}wR^+5)9iW-0@ z&~bF2G0#p`O%S(JR0~9bHm-NFszaDaTTp{N8sC6dly&Z{`2YWZ=hhO?MdqDTL05(! zcLndT>}~~%f$|}PM|Ueo8K~axblu?5ExNS^6#uOIK$PX7vJn1ltcPm28Emvm`Jigk zK*yN9=0V~$cyzmN@X&^s)En>*D&^69fC&<>oyT9)-UG$yo|kvo!I#M7)o?R_Hf4cU zA~x>@xrYgK4>8yXP$I2IG6Tf_|2h_;jI|Ux1PMBc&!g9t6SNIBJmc^G*EUcsAmtd^ zp>iJ02VhwRY?Vjz0Z4A?cHQ$5bVLXLHrC74+zd7WkTYW-cA_|~0nKa%1`MZxPZ8|3 z&0EUB@M2Fos?$DTXh(G#XxtCkX`t;AdtNSQ1BaRg$Z3AKo%SDL7N~f@;xy3R=N`Sb zmqB|!715oBp&elyDAce!jR$<&@h&kQ22iyC+TU9RTB^;uMGRafmV$WTQ5DuG5EF6` z%f%m^to>r({s*Xfdd<@8`i2p*OG)@Acv$hBM>ne_NJF=%6^Lp+#0b7O4s@rpAV>ga z5a><`&=LiYgAZ6dI$ak)s+jK31)v#;PS6p^Gd#LmLCGKWvIJ0l1zvSH1CsbBz&zXO z`hb5M>)A?hqKA%VvhDz#E0EUd+UL<+JAr|}Kb4t*0pi}-Kf%LC6F`?@+<|1RgAZ6h zwJg|DP@Q*&@dRkj7`z^;quce4NAd-59qOSCRsx#c=>b)&P41K`AJ+v>aQvhNDRIvx+A-JXBRe3c!aE}~+G4JR9|DdFu&ceXZoO=hfQ5R4#+Usq^>?KClMC7r>zo zD(*n32oVaer6FTJkH7r~@0fN)b|yH~tX(%0-G)TczHgvJ#ow|FG)LN;`+%vrwu7I) zuNicjrz_~>T?W`?8?GIlu2)_wf|f!;3rJVcvQ+-<3~9|j{+9|g=iXp!&b=bgTzf^J z{^o1O31CJM7WMqwL3b5`S}r`WHdq8`Afuaw(WCRChvGrdeQ6*&V6s*aStbw5gQbd~ z5ya#R$WaSTETDBgmWN7wKqEzT?A}m&d`}69OI}4|{;d z5+SoEkiY>KGR22qf{qJ@rxPIzDePz*hN z4O)@_@&Kr-*$s9!_%63SFE@f>3t}l!Lsl5H{J&d-34Fbg<)LzMxa*I z;m-Bw4xQl9c^Py;%VTKDgUfXue=+;Z|No%g{S5+sfv0(QST?ZR4@$W&qQ3n9pT^73 z0G@J$XNJyGX`KSFv}*o^h_ov71(H_5_aYp3JphVia1^4&G-xIL0pyrI0FUVd44_Tk zt`9t{A+dZM=2RoN>p>^W!Q{cWe}b+nVdCEoDI!44%f?d-4dBaGz-E9lfU#>|TI+#I zDQJL$gjD~7SI2;rfQzO*9*svp?GNO6rOw(PouywqIzvJG;C?Waa(nc$YJ)f7xc)#M z@@jlDfgNH31dDIT1FTwi!-gI0?lU<6;i+gN*nU!8%0zh4`4%GSly3m%QN7eI%}*KvRx z0AhjHjDuTJp%*+lL1QY+ATyf}u!EYG8rOe=h9*{cG}o?R;BR>jIl^j(N4M_^P>aw5 zG&OU`qx1ZW`PV?*Oz@?bpsBbE9$*7p7kG5LF7W6LVE1S};KA>4$m8G-W{-mpm^~Ol zD;HgNc=SSxnr={A9<;ylI(W;>kS`ux z0y}O8a-e|@`RjJw0d`Dpzz=ZlW&~BfpmTOHg17lDD`*n;4<~=iQC0?q37`4pes#P4 z0hN`aC388zTlT?cubgSFJ@bLT1+*Hj8$71m{NrCK_lq-Z3=EyDdP<<4sRnqkx?Tu+ z(;esrI#v-S9){QE-K;!dxeC>8RwgAL23yb?yLwRH95g08!=qR9#ca4;uUU71W+yvc zk94~pVRQvq%urF%Tzf{ZJ`XbW(kr?X;WSIvBc)+5@kE4pCq!pG>-X3*ufsv77?!X! z=YlTDI0M@I)a-f#G|PR%qg%8D)w-su%RiEQry@Ip>)*8`wXg!Yv|wG!h6(Bw>KYsC*x(Ril$1#9yU3I28_&~7Z` zj+MwfM8}E)RK$WiR-m~rkLDMk^Gdmpk{S5Kz#7h8&qY3J;TPx!0-}$I6s&R8e4@O&VR$B+oGE{3}m&a50cd&>sXz6 zKo{8k0Hx$#Am{!Bjn;ues`-Tg=wxWn)G7GLOwJ1)P)n~Nlz>74CJY*-1O-qxXg>s0 zDRc@LYyeaUR2+I72Ro91fq~&Ac!CXXVJGVk&}CEtT$OJs}Gnzu6Dc)oWWni-X~XGZNLznB+J79KD8zkr0w00|NoD(mdQdgJJ`L)U4MX1 zQ-PIyRWsl&g5>uPB@WH5XBeAn&oF?3>s#BYDZ*YLuuX{kQ#RZqbe_lrZ2i=;8NC=|aK*ML? zgaC?xl|P^{0G+*jtuo;?;{@nEq_4$69FJbxe2^`m%ZiV?o&c4#-K;sFF}EN8O8mQ7 z6Tw4spy&#hL5eOfkUgL@Vml2UI4DK6N3WfzzroBG^D{%fJEhc?Ji=3!CqtB?QO;0$OZcdH~iWv2^_at`xz;zh_T_#y3u& zPO*aykM3r5D*_Fvg#G}VEI1Rk9aH-3Z^$?kLJw$$!=jt@B|9kT^0#gR7Xa7UA;)xd zvt9*@gU(?-4i)q0X02fd4{n2oXIME(!Cmi6kWe>k7Kmy+0G7E|0+tB}33am;fT-33 zpe60BDIj*Ys4s{*_z2uu=>}gwVD#dE1gOi;Dg~127PSUbyec5-;6rAQUKy@^3=W{8 z`uGbu5fIJ%qForQLjj})+>aLJ1u?r_AAs9g;I>*fD@d%<^$mDc0;tCUKW1eHG%7k= zFGITVpzE!ASs6jX+gX^>S`Ugb=IUKqVZ=EKAonrL&N2(ZQ() z*?!PXeT>N3zQX*{{3C?F_4mL3|0f_zi-AfdkbRx5SDI_DFo4IZU$TM*Rb3x+v)*Rq zVF2B|2^|p!9bNtelrf+>K$Ve4C##|)G<39GZ*;OsLwWq$7&=(%Kt^@DK7brp0}8(q zR?w!-D}wy(SuCKzrYlH;tvRz1ZGwc^uyu6&+eFQw#(-j#)eFSw1Ub(J;=Gqy|NsBr z0jiE(>aj2|>;P3#FI7M+P_^_@3d90e*8(6GsK9*524aB@&3O3-yvS5ERsz(xi6CeFjKg9Fr}sDapjR~%&jeQ^}~Pl%)I-Uima0t=Mt@HScVr~Y82``_3 zwzit_g0{~eX|6r;zx2|}i%g)SEZ^jELnfIX=W;Xb-~ySo7rYLRRZbi{amT;!z{}NO z5z!cCkcap{Zb$}A?fn6b&vjk|cj7^zXmjTG|Cd!v43N#@FH6C?Sg(OpfmZN?hugp- zSZ6@-&kRXn;P_Vpb40m86uboKcCctYP@3e?&B_cC?-qT-#KYi$BrVg)`V}P9&H4yT ziJk^ga0MRSqKiNRpmjN{2SBWD(Ul+yuHv`@Xb2cIue%T=-Ywb%qTte?HPqd#lR#oK zz^lwz!Sa@eib_1XMgNI{CV4=0DX5pin$N_;@Zvh?1ZKz_*zp%XIY7Y;n)|pc3eJ5u zKm#b?RWwc@Ga=KQ<{)M_s{x1t6 z0L8+ggRkTnFI@c5d_b_%^~y`@KmY%Cv+iVs)EnU2C%ajb7(os{{=$QYf#D@&YqBUC zs=vz_c^F=R4txf$vt`Wy>i{jvWxXo`((HQUW#ligXKX=I-J)tB3N4KFKw_XQ=F!Ot zl7G<$>YjlX?y`!5q(B=*x>)>IThtsx!OiG)FljviIxwC9Rkg+cNn`}?^wH@sJRZBpZm|v;L$BQ4@4n3%mQ?dy}@x-kT|$p>}Kr-Dd`q1 z0Z|B*q7DDK89D=GUV^Tx^5|ww1xa^{`hh5fDhCN|*Ark@UU?}1?t-z}fK+sgs)8uE zLJ!asVYjFOND$O@0G*o)E-5-)_kgCex*b4g-xWfb5{w5rU3WCs?qH}_0gD8H*8Cpm zc97`xU~fIZ?{V@duqvoqVc0^bBbBk@1uV_JUGD1OFwkGp6Lx>>9?u@uNpKr$=`o zN4M_@kK~gcy*7NH!Sv2U;H|SS+z)~(^SK}cSf~F1tvCklKxB;oY41G#;>Q7y>mmDp zLF>&x!rh`lAPOEN-J)@Sz&WIwH56ik8>r+jl{oGSx||GD-*AF7bRK{4o{fRwwf=F} z8=&5dM>ne^NW5E=2}HroJMLfsk_IhW0Z%k^i~jo!^52PG9wv`&)~CNgDNghph=S|s zc95_<$lnL5DY`|^LzFWf>SjIio15X{4^TgPOSkJ54^SpxT>{eC&D#s2K+ST-6QJ=P zP)6+L?EndOn-+p7Sm;SYGmMWAsLAfk;nB^S2$Js>^#W0FH-J(f=pHgqyje`*V0iJC zA6zn;fK+vh%7Q4k;_lEb&99h13tvPPpw7L}$tns`)6L2RrbJ)=Le3A6>iIKB43zgE zt+N{-Znx+`5Cu0IaV{Q$W=8+7#whzVM&1nPLQ^gueEuOYi6J6zvGd(tAH)^}Pr z2LnH%Yx1X))dJ+2ZqP_ItKlzhhSx^O%FBBp%4b0K%R;&)@4;P@IZ%7hEI0}hhIdWg zBXvzy_d(6Fbo~SBnt%rl!H$}UQxCHJ9?h;F7(KdKi+_SQ_j$Wqa{U2n|ALs^u0J5{Uoc0M8$_WdLr_g+ z>H34e*%`bwN^^bjS{yQ<)0_*6Zr2z5+duu0OyHvzNUb3@`Gy85leuL+N+GvtHo9 z2W@a+HRJ-d4M7pZ(7`$fWENkLj< z`w%qv-_6Pa5{C2~{(j|Vcp?7v|NrJ6OeF%%KbY#1TMv}DHUD5N5qurt(apN#D=4)c ze*tQ^zj)3A?hZg#BUE&=p8E=}+(1@WLlq{1_Gt@%PPT{u?Kj{Am4Bczfe~~iW8YV9 z2JmAPSVkkw=p*fLffOed4Ug zLDH=UN~AoxS$Bij-J(lC6g*a-Sr&X9BWU*Q_zTcZofn|q6zHBs38b>bA>~2wE5Czu+I&CAw zqnlOs3n-XH`My9?+27CL?EVZyAryCuegz4DH_fu%0x`Qq4}&PUl5WxSpJBOWCrGAS zbP)p*>SR3z9(ZHb2l2W^B|sFC2GAy(H=jTrWtII5@;^fd zE6->2JN3Y~U3Qi}*$-M-`(hdBs&r6N1P{7{S{qVb91Jh&K~t>Vu0Og%pLBxz2|v0a zE&myy!HPnVrtZ)mpw_+zD6@mwJJ9z1?M@Dc7Y6}+Is7dSwE_`(5dPk~NQKmOtc2LmX3o;(bi2@Un=dhckWA|V(1}K@M?mau(X}87t{7ywkViM`bdV^d z$nF6#yIH4#DbYF*1y&9(BVPXoO+Zb2kG+hD1!(~FP(jNmJi1wZLHuq}GY|zf2UKQw zfD|kTXC77^kPI|`D1g}AqMRTKt{9d-I*-4Y_6IzM^z$94Xb^n_qM*uPIfV5rNU-$) z=qLx)gCI6&ol__4HW0I$bw7xL2FPX*yIXV)h=Q5|p0Fqpdcgtq;<|TmFQPQ%K$U+P zNLTBD(jw48U}%E+0G|KsJpMu&R55h227%OcvwDLlXqmFTm4o5M8}N{*>j(H+q;6LA zcif1*0kbxPy074tKRZb8an>(yL5q(W7+ykVg;_tm zKG!hdA~J zl4GktYPxx|K@_OUWjp~N1i!xt?sT8G+zco=1YBHube28<6$*@HI^eY(;8nh^FFY78 zfO}1)pmGGX<_WZl1}+La0B0=&0|TV6-w7HXM=9*5g3cY81kQ7=51LdncDp`+ zSC_62P<#a`CA(R#M}Ts0DCj8m;AZeDckoL27xf!||A!o9{B-m0|FBA|o7Fv(n*k{g zcC(&)g(h$mMWCBC_aB;q5EKE>HV)T6oviOdP+Jw9wV*Xep#8f!uW-pkp~`f#2BO#v zGuj$ena6Qf+gFfm>~Wk`3Bi;{Fm<5JRah&z)OSt|^P$oFo5FrCv+`)S5 zC89Pv2V!@NZU<5DLJp}!bpfYT*5x4iZqW%K3aSi}7hWhrhV9!xGSIep6^Pv}nhc_# ziopeEX|qQ+Yb;2#^Z1K6P)az?>IHS@i?6Uv3kb);+e*+p5wzhq(jg6SS@0b1WiCmO!inDC35HAR%?)^&f_n%*Z%&0oOR+0NaX>JAVeO3Y_A1v zQS2;z;n5lTpwssbcpdf)Q2Xcji?zHA433>gK$FwQU(|x8>Oh_62OgkfK@PceK6~+l z7u0=4yN$}D`HchUZXQtK+8KJI)Axl-r|T7;PTvy{gG`_Xfp*(~R`Xr-fF2wEVkO8p zSV0PECxBYYFFFGhz>Uq&E1dzLA@(1T?IfW6Xa}Ez#vT|uS$8}K1r=Hu2P(B*be2AW zc+3a1#RptQK|7o|-L6kMkH0v~sJ*P_HxAvb5zin_JqsT0@q_XXfq0@<0=XHwS*@ONGl0f#Uv#q`4g{T}+j*$- z0^45+aI3g^#j zLH+=l530*S%OO92yPDwhWr7r-WyNjqXaTr~2bv|qrep^~3CNNk9>`4sP#lA>2= zVepy-bR;LlT@D7|Dj9V35r1po|Ns9%TThy6-!Sv{DS)<0fkTN^F90;)@uHJeHh`M} zay>Oty6mjIam@8UX#CghDQJ`i+)e|X3I$5|FJ6M1bfAmF8Jd5vmOG;CUz=NlSW+>u z2DYT)nCt(P*D}Xk|ChWLJLdYo__e?>*Z-NXxsJL1PkhY+va6x?KSPP0M=$G@Cy?RV z5>WQ~-~n1R-x>Ph7z3zX2Iul`3;hoo+yZqG9YC26wDS4|18nBQ^#iDv)yvxP1f{ZV zegkjoLH7c`Hb3qP*>kG`xrjIPMR)0+ZdcGU%{&I^m=riiN`hJ@&9#4+%dR!M{$Omb z{lQ#z7_ATm<>$`YH_#FkwC%jR^hLMpo1LJn-+BDSV^D;`3pFlC)`ee>h7|tIZw!#k z>GZt;Hp>@e7WjTeO=N>$2MmF>8G!C82c;Fz9p~T*2F1_-kIvd19-XBdJV29_CEOm} zt~(&jTj)+(UM5gW?Fq=aua!WVt2=ZDC|QG+zHS9~9-t**DNnQO6UOG+C(Ly>K*MgJ z)CSwGdjitf1?P!1u=X%$(7f9Ll6-0*3O0Z`c_24zKygDSNVeA%yb`+~+y`(4udxKp zvN4x)f^LF;30hUs{DK9vu%I1uAP02z-xbtYw^1o|2Ax0zYBgR!+I!h~`~~L z>mhnk3@rt%9tJIL2i@yxQ&Fl2au{f1#|7~IT5!;Uij0Eg5Ql-b47s8?Is_^QISd}u z><9bOphOUC;p-R(6$)O22r6H@!KbF(fR;1Gpf))tX!rpmuT+5A%AlQ%kZ!3fBpzS~ zT(N+XCra{h@aU|C-Qa$}d|=!93&o{*FUWTorCxN0;EssdcuS8LfUZ#PKMW@ljez5 zuLJ3XLBjO_)J@<+=fNvKTz?>vrtnM9LG!Sr*$FysEfo}w9=#sm@B}T;c6|X(Q4czg zzqka79MHLdpo9KPKr?eUK=X#+bDkmnnXu)*|AX!j_J!UR?Rvta*EFyk+&BdL@`VdX zg(kH0g49*Lre?@0lt3z=Egew$0gXz5%FG{-ajVu%pe8V=kVA=WNKpw+P!0m%E?PId z@&euK0E!4u9CR}rd>{onYR;(>baV;0n}TFeXYCD-&e99rt`~NJ)_a5Zzqx`=2G|9P zE69Pyod-Zw7HG@LL66J1AG%$yfHpC~8L1!<@Y2(X(N;GJg*FaK$>B>@Yw7pog2(*gf zOSkJ6@C-MsCI9;_H^Yl(3qZ?kzksF)MPJ?JW;n(oz<{I>HXH%EH5t4G=ru1$7Bp?f z=)nlf<)BuDfJZOu%Dd=89f(?`I}}`-TvZP(wBE21@ez>220mF&;wqk(08)B zM{xNIDn(!eY_LSY08WoZpvn*&x1dY_YD0lq@1Xko1L$U2$SefvgbK8c)*1T5qto{W zEh|{19kCOZ$eZpfT~&yRn-Dj#R*Zh8KSBIs;U;MDh{gZ@!r44 z=WluR+WtDu#qdHx8+4(vZQdy^h8H~As7jjOK*!NQMcVNfH$H(}<6wbE=BQ&Q5LKH% zs=yQ8A3QppEKsLcP|WK9sqA(zz;9j>NEO^X10?f6bGjO!t93vX5;(7R9)BV785DG& zG6-@H3k!q~S*Hl?WPy$zh8(usdZ1JY644JPz)k{p0!7&ikM05x{lKH!g9HEZwy!n8 zBg{~vrbs0VWod2~BlfPxI> zl?<>jTva5Pdx(FVvuB5sCup`<19`R>Hlo-KIWDjD0RL3bdJ&Y|3~vK~n{JT#uwK(i zOS!&3gYCxLbSSMdk88|2tgIgYHR$2!W2}7l}N3X3K$cPDGBMyNErH*-YLN8(d zrSSLvi(ZgXpfVUF2i^<+0@Tw59ih^B{Dt3cP%;56`UI_lfp`IQ#Le*+XYT#|-+BOY zPBth(d4l=ii=Xf0aWK4)1KS8aJZ%EVCS{OKexUvis72p-{Ke{1KP#yeQ??qr6A`TRwH~o0@+A4$G z%L;KX#F4*cK#qij=$&_e|93Nh<_pWf-5%CCkHAT4M>lKSW6%=3Euc6pafU5|X1`eb z1hUlmN%I57)&nK)n`@simS}nO+CIwVV0ba7A1T@J$^ZTTVqwbP|1Zygd*q;o5olrN ziHF<_-Jy3N)to&e=&WAWEf0~V=!8~*js?5JP$JUpdIy|e!4(f^>|rD5N;rty|J?`q zL$vB4Xr$!=_{s!ujBbAlIzZM({>q(8;loqy~0l;0=(^Ao?OE{%Jp%GIBoXZdF}qneJ%S`3Jy7G3bqPoiB0m$v z>}H+xh?@a&hh(p*MGmB9)|(1yE0?5z)*phTLG2}vUQ;=!G(SYzbpmMr1IQG}Y_JE2 z+0E(*wNR-PwA|kqBnXk$c*G6aOzzRmDgzSkbbayK8Dt0_hzA}k6J>_$e*W?{s8s`w z!s9PIUxUkH_&uvH?j`>H|2og3+4TiztOT?(wdDY~`vPLxaDfN0K}>M@=n5%lSeJql zO>YFFN3U&oHV4CtCq1Ba3p%_Hl1G9ec?4dBf{JR^f`{A;FD@p6PTlWK{eXTjq5)_L zVmGTd$mCAf4=RJB=>WJ^g|+s z0mKA#%sP+1_;?Q--Qbf3)nEVpf1Cl7P@8N2=#;v9bhBOsB|M0(Qy^wH>){8;rfvlZ zLgZJ0nBA<4q4Hd%pu7G+hkJnx<8QJ2|NsAst_1YM?x4QQ1!)HPjvd2y)3?HX=l%ec z!6Cl0hS~%1oi0c}#2rc?Ce(MUk$mU*3d48b?{hPFKy1^gyTYo)@Ln|Nl4F?qMj2hqRJ*wS!Uzs6{Qh<~%ru ze*m|nMf2{$c%YFU(R#RKfIzpX>^+Dic)fKFR0=ZX{lTM?H3=-jstq!tlhx%sXx;(T zSMFqWfXLhg>kowuA1$t904*4TuZIN}zQ4-yjAmd_l_{;f@i9=>C2| z+4Vr{0r1=uXmE%z15yI5nFMlJDO+>x0Vc5V!64&Ju^X?5Y5a~qV0Ux69(b(+8v90b zd+#4mP_Qt8mdvzX1uv{V0IAs6!DZoV)?Ff?=@-`n7k@NAVB|d1?Ro%mSp;u$?GcU= zc1XXH6(we|Q0sNu%?=M<))wK(~^>CVu!^L1zTKI285w z|I5dqQSffo0FX}5Eoh+2_Q0#y!8SUnGN!Z-E&9@g}G|4gCPy$_F~`=lBb`CXgOb_l@-essd2&nRgFZ z4AhMSUlRAW57aefT?Q6~8wFD7`UA2y2U1zHwt!Wz*4{)8rF@VeB$QHaax*|DT;aD+ zu=+z)>+rX31dWMzv)Uqb7=f7GtlCgDkor&-BnUB42*m7W<%Y^D@wbATC=>cS*6I>*{`1AY!e@<|dW77>}uPgy27l_3( zLCkK}Nl^Mkq-qiyIK7p@*S@C8fxz;mHNO^ zj#Cw?>w6;p{(rd^YzxHorQKLvU-#$#f6!LlWJU&thT3}$C0q@)_f+{?L38Jz{dm{m z?Sd;HW;g3u5Y_4W;6?fjP>&dt%ywM|`8)I;xUIDoB(Dv!6I3^$gp?4}uJ53H+RfSw z)&}b{mxA;`yqX1KcC#i!<(0v;(%d8th8Od}NfBCxOy&Rk|HYEVs^7CfGCh-cTER5_P$3qD=*m8(EDJ=GJxcSBUJAO==Lh_Z^7G%2 zuXq8KhMl#4UicJ&%bxTr;IgOT7^v(~y9z3MYCvr8$;cm#|NegwUxHp6f$njC!2{8+ z4$C z8D7|y|NRd-p_}#SWo`!WiR&-6%?6$S4Knj|G5EBUBPhEMx>;vI%-Re#D-vwh`lG0e z)tcXcmKb?-v-TYYuLUcW_UN^}l>qAhHh@YaXcFKP`1}90=L>a+8~aU&^%mqtR%Z}96nr;5q@TzNa7LMmNYAqR7r@ z=l}cvb>xc$1)!h;6_lX$|4)v93R4gdynWy(lndT&Z~(@Etmp@A^no~~Y8JQ?0!kGx zn%jQ=f6-Bd<}7fm9xwg-zw;PqoSfms%N>9IzpxHLX>db^xC}aL&v1M=PL8=$!tuwPv6Li_^lAF0)X>~#h$jedOzJuoCdYP%f-_JKBPfPyZf z4P42Vg6<~=o0fMDHkbwGKEDHs#s~qAUfZ{E91Jg>*RnG}MzP@8J(&0J{}<1K{{DZ> z`l2@IFK7tF0HwnV%7Gr8wR?`aJ_ilygo0hgV51BkTyVbxFNJJC%x+dw5Y_2=rv#K;li}v2^Zfn);#c6`|1WDG38Mp~9ukkW zAZ9mf8B{Bz-pc?9LgZsX%x=~&s652`9w0%8ye){?&1wdfHz)-SrD%Wzo5A;Ov>YhW zdvT%z)F=U+7r+OWImF1nO^AQnCGbhQ7a(Vbs)Dw!w;ll9^=f;gkBi|&?R0R+z3}K} zy>S8V)w3748D1NBbh91-iFLXjco8=d7U1AvqmN7B+7@1b1>TEU0e}BD)IMh@1x@mT zV}SJ{sJG%E(fpv^h6#2>9q4>ok6zo*SWpju7nF!x!HREO0I?keKt(M?#P|}(8qng( z7oZ`w3@Jti21oD!nhS$M$fdB<^%B%Q zh6L|D5VM>0I*96Y{qdr30?4!9!K3n>$6v4@Ji7&KMCf;LN?8u(z*5RgkZy>1eIRBx zYdch4r$oY|*S0bSmhx=5{{DY)!T<07*EOL1*dWCaePJMGH>*EXA0!z#f&?M*X6LyX zUTi1;g^BBf7oPL}{0EAnBA=6Aga^##)KCc*`Pt}D~+{RKzjqr-g|Vj{yGb`06dg-#iN_`)mhk1$OmUZ z>HY;|FB0pev!L$ul@0;Oph&OnzHknP7hfkq0^OsVwG*Vg+xNjP0Z_9U(&PS90Pb;v zi^Y!(pal&Vx?L|cA7E*I02-y}be-UF+!b^(AcMzo*9D*0La+b-A*!|`RLuYl*C4B^hO3&0Pz5?U6veDiumAsH-E}3<*ac{vD0tHW zXrF=WasGX-$2*U|Fq`w|KXi1%+Vw)sHE_BChXZ7}|C(8U{&$ChT67;EHTi}~&`U^; zM{+Q{cvcRoUZB-l1pD9rFFJitYHUzxAJJL6#-p1x8I|64OrUF< zVnJv9f@eCHTmdP(1-c~dHR!ThuwcPekl^%PB&wP;0 z-~)r!oB~Bl=zDNEI3LV`m4g#Ox*>7Y24Z%z)A`Gpu+ZG zVX!s^21bV0pxIDwP$_b>1Qc7KBzXflN$RqIk|b-yNko`}x|YXZEV=aef47H3cjzC^ zQ=I`4FRVOKvJ+&53Fy!U-Q(br^+z}B`{SUJ71SvR+zIJa_<}RAN3ZRfAka-meV{mG zH33O>^Xh^r)@>)a8IX%J-5l6?_cl|&1r&H5_!t8NXpoTg#}1@9wsn1f|3gk)zn%=5 znL_GuOzy*QEqJ{_x9g4L4gsJMw*8>*=xb` zc93IEkH2WE{{0_x$%99400;O0dJj-1l<~q&P;7w)@-}MIMxZDqr!IKv*RiHMR>j#3XF+qn>A7>~oDFQ8X z04;BXnP6KDs>ij&Xiaq`$h^D^k#b?V0nXz9uZNSr{2XzViZ*!1oe!$dnphOm&@b)bOEph0zEdXV@rObb! zn~^}PVnAC5EI=n>vO`DyKo_cD=wAuZZvfJt3epc64}UEWQtQ#}VBxWA^(qMP_zqqL zdhi7^s)hq{m?cyVWaESfdgB|iY6&z#4{AMj9)EG} zEXYpKZlC}Sq_hg&I}TF@S{>hd0JfMPe2K6}cY%gSx9xsbY^pKYAfEM<2mVQ7w zcpf@zfV6xY-1*3r1s5$~Ht#u5Aqg7p1Yrlz+B*K0m*7SMM1X%AxJ$#o?EvUNkGSR^ zBK)n;t6)LvvLVMtAAixh9qiK=9^FA49^F9#KD{cS6;4nkpwsM*zeohBLG*Ywg7zhK z9`fmY;GuZ~v>X6*JP5>6Xl^usYk-*};MsY^1GIji^Z1KGh<>kL7GjpGgx#REGo_HL?vO_d zw8}t3ub}b|lrO-&QX2=*@p&M}g9iyV1aL6CIFt)=24XnH@Gm&n4?rfO!5xWi(Ecru zZQ!}7?1O**zdVNsdjU{CrU=q&1?5R_gjs}q%o@m3RtL?T_80m23mqdKr4I@8tRcWOxp43H40I0j^z~Rx|0GhV+=xzWVr3zWT9Qwke*Y}1;Z|elmS_^Q&@WRptjB^{Ay^P}4mbFeqt*z7;0d_O1ccxXxFF~v8u0Sf?$#G@!2*QJA8pduD!=HLJS`}DG^|Nj4fC#atXO06d)SQuIllxn|776NUle9;U(j13g0 zvVI&4FV<(F#_2k6oU$r{%A!!SEvM4=9*f zU+sfAsTbrVXlK$^o&|I)3h0V?3y*HrqhLj)4eWCfe-^Ix_5d%Tb5_ z|3L!+43M>Fcbb22mp%6AX5F?I6lM+?pp6$VLDx@!dpzBsA#K+cFjHJ1rofJ8=w-ce z7c}WF0@}g!0bDkN%PXfMP_w917@``q&9QR|*xuJXNVaZnuD!!kS_ZKP+-w6~(elBg zI{-pM_V#|@-xeU#e2TFHe89m6e)Kj5_?V(z+f$(Ecl`Yasf_{JL1_Wq0|8pH{Q$bo z`-2B$mkuaFe*jHyGw`?a{|5~YfLGPM1Z~oRx*QT(prP?%R1x^PaI)RK1yr2(+6sZ( z-T4cvyAff<-qr?MHNA~4#m&Sxpx>r7hhHG_vmIlwi^`Rpwn~$ zGCaCjw}ZK`mA|lN(m{wLbGr%lp45iYbbB2&iINkt0tq8O&O4XyA)euRl8+2v)1duei9ss38Mo>KpHcSC@ z!WPJ||GPlmfVlg31Ng)okYOes-KfVxAVRkEN%=J?ki@<5nv05f|r zk^#pX3_wL0%v#jGnFSh61>O9_s*EHBF%TpTHLw5?V+{?UWZHTFoVwoa zKu!=5Fb8UQbhBPYl7g5Al7^TEF$10m8WtcKIU7me@rDeTk)UI28<38G4iSGuF z?$8|`-KF3Olx=Ekpf-V|N3X4dI|svyRY{;)5ZXLn^BH9=zXxnM9&~a=WP0|l7x z14x19`2PZ0Hx0d$g}e+4+R2j>K=neet>-K*h8NGj|3Pk5f*T$CAWN%kE8RF4UQ~Vg z16ebL=)<8XY6d9^#Z(0DJ%a4+h9s_T2L*%)@Br*(ZJq;KpP?}YW`jNa;x%ZP0&GmD>y6i-lS4qe zYe6)45o)vR2ar9Wu?djh5;nK}y^peOLLsX!G1T@kC+KdR7`tTaO>k!G3<~PW@=udb+&hvt8dzg^|Zb^%RO5<(^ zP+)U`L-(a6c&<#42 z>yk&W7o$ga=m8JLQ;?DV7pIcJdMzMcCcz{%coLmAr zTpx7Gf&#d^3O#%uG}j2(JPmR%C`-c}yfqDMDP(k^8)Vf557@EVhd?dBWY8Y@10Ia9 z1>7nq_FiBDPiulUq=PCKkj0>_@*iGXpmawrZ1+DD-0orE)-5U-{U?;jAbY8}RY=o|ae60^IjluUSGJysN7!N=i zX&_A=pc}0iFL*S+0Bt6I0k-|cv2@TV7C7PYZv!2A>jBy{3}5=d0q)qY@@TAm@rH|$ zfxiX3*Bi!bUk4iAXsms4hZ7{{h0JRQpIO&f`{D#xP8KQ$=Cy;@S2otZ*aw#T07_~w zUV9W&2sAvS0xgM6T z55V=q1BO!20;CU+A`4U|Vr@O_1|?Zgl?!V<%mw=f;R;Zr1?H0O&JpnEU=2!S^;fR;5NhCKJpj79D z+5i8bV`w4X1>N4_!2w!_Zo1P8JRk-RtruSse*b^1_ks(e7IYJp2k7QXRvD05(2>Et zroG7Ok0hWRJLl2(<^d=#bnXR@1a@u(k3e=#1-a6rvlleV=+oH>8dvn`>;;V^wj3x? z;Ma6*;Meq>z^@s)fL}9q1HWeK0e;Qg3;dd;5BN1}LDwxkoeiFQEm8647QG2#ce8e} zb2E7KnzAFi#th_o1&?mlT##hvLGZL3c-J6kBcvy215DEI|HoTFgOZ?Ja=g{%|NsA> zGkZOHT?ITkTS4Pl9=)yL!PL%H4^YbJW>o+g);krX$)md$;xX{5_2-G8;*pgBB;R># zKWMYo3*mUw0O_oK;nB^i$_klJ1~*YUS;auyZr2}3i4)f7=w$sl3pF)$vp#1*PIa)T z_kcAg9DG3Mo(n_Pwj_X#i#UD&KDh;IF>rWvcW8hr0?_CgsAU5lpGRryHG>bY`T;f* zbklGrX!Vopk8TvRS&+_=t#AOjxHI%c zr|%O;E(eXu1SEji;L`~*P}`Q^<}c{#<8HV^1owjq%@@^w{zE!7uVX;Y=ynJIg#f71 z`vGP%mkL5cBM7e07_2b#OJ@M+CQxvwbUTPByMD2B{Zax|tpZn#UbKN0+JFyi2Q_uO zWy6@kX>Xc42ZKkiZ3(EqDHsCkZyxLp1$hm!K;}F+OZ~qLnkPVB%nULNbW#B5$Utzr z8Qc;v@#vQQ#{@Pv9Ad5v$lRU5Aag;-2HrrJ4K?_+p+~puDTtnEh@Kaq?p!Na4_3E$ zbj!|!Xb6L7*bdSV0@eWOEdRd@S$-fIz|H_WiWF4RfRhF&@qiLhXFvtG-G!8Z8{a^> z_j|!vz8gIE(CuK;dH{5pHkbz*w|JfF(am~(C1`6fSPayYVciencRL7x&O8K*f_l~I zpaZ@^#WKjw&f_m$#emO_?QMmWCC56izX-2qX8@g22M&(c!jRzrr~v_>uJ{h5^oQMj zA*u}ER!oV22gJ$Xs;8Ubb(}{xt2)SCmS6+H?i2^{(cQTpbXGc&JDo7yxxNnBouEcL zTK^xMHo;k~)EUGE%^r6~ zi!ex;0bb>da40jl4hMBMFM#R?Q2h!zr~;vY1-wxlp`alFmsem35o(VwibI)8LERgK zF`#a1fC6}I0NF0kVOXe&CV=fj@efj&*ctk!8?;UjG+PeewDcnywWx>mzFvS2dj@rf zJAE&>bh@7L>GTCHK)V4BYsOO0$)cc90R?EJf>-K*njWA9SD^jOu0LLbnlUfH5}?En zUMA2G0V-rWT|fAAyB_EUEz$SA0PeGNgSK(IzVPV|{Q$WG+5=SbUP4OwNbc$kz0>J? z19nU*xHjsBrUI4{E^wB9>Bb1UluE&)`2Z{YbRh6TJJ1NuixnE+@eybz9D1^!FsOA6 z8s&ixWWeS~IKVT7pv{P|t}STMT!2Kk>z(EYpdQ_a<_C)B}(0{ z3P^tZ;L+;=%3m6wW>@F=7vT}0`W-aP3{LhQ%?Bbtk@6aJtRT3R3Cs47gMeQ`QX(kH z34nw0p#Q5XbUxDO8@@qdQum+gYOZK*=MI*4w4fZKV<(-Ok{(358*x zF$QM?kIwrqz#W<9BOJ){n2>A=UQq`wygQG-m=^->rgOrM-xP!n7eZ<_+b`gCUf`kK zoByEf;|`$pR1Dp$O%u7ncSN#QP6Qod`UfQ=ftw`INC2(nC>7jy9#o$7+A273FuXVm zx;>fI0c64t&N_h?kN$zrNrv{TKm!TjJvz_+g6^A?1Svbf*vTp|k(&XUUf>ljYy=pT z6uQCFU7#8Y)DD8zSkQ0+w|YPo=Iejxn|{F6b~otsb_r1bvzv9<1a5}rADnfM6Jr@)^9!ctAB_C%TS2`-@D^ZDSFP97*&f_gc(D!?C7|9wr;`A<2MY?4 zZU+lcM+9_fHaK(inuw(e;2nW=Re`g0VIRr`RYYUh>=yri1a9)I( zdLuX@PLM{4R8k)a=o_Z zb{q^Z48MVs4X6qMPt3F)03Rp|=fevINYtr&bhF-C0BZEO{wRqBITRFOvEX|hK-J0d z7ngtk|Nk0N_jewDVGc@_h~-+~wyQ@sc<2`FWbg<+bPO#CoYrA|ay-83EdA2$3tmnN z)(%-q0$MeS5&*Cx7d$#ccYuZrKqV}w^AB!UGlJLSoB*?#!A*h_-3~sj2P!~`5X5Z$ z!CWT-X?kD(0Bxhcj026fb-RM(TMv|g>Sqws()9@B%!HSaTYtf0ccA-7Z@>=80Usml zn2RgCvM0b!6WYka0qgw>D z>KwE@=>H}7Oh$<&$VA8>b^r(DI9yN&flHi6e$a!|U%G)$3p&D7>h00X`n!vZ0W>6D z3K|SK0j}9QLB|oeo;dE{19m+)IN-+2_WS)G(&Nl~4-4q8;1tR#&h#*w>ZLuL5<539#DHwL*NY;atO?3WMF`Fy%^quQ$7)40hvPKZvkDw1)AD` z2G0(L5?j#WzcY|3-WT92hCxRjGI(?{L1aO*GOz&=P_!~$@PNcD=xkunev_}@0J~6H z1_@wUupQvT7+-)-0dald(R_dds_D4v6HpQOI_`!3JJ79R%;3}WaEG(l3wE$NZg7eR zN1UcF^v3y@y$lQt6VQg6_**Ca1D#Itgb_T11v2>qIAl?y?THUG_Cd$4f|7hF=qNr= zu7$;ObL|s`Qh7+!PJa9UKg4&SQFE{>7W@4E|C(z*sPcVL@)jENC^;BhN5Q+z;GQwK z2#4faNO6eBwU918a~-q`tOzp_dkBu?caeDN!-m&0dcx?kZf3idkM3!rU zM%79H(aX9Y!~h*kx(~zvjo$6D;6S=R1F59~8$yAURJw04 zgR!&r2e?W`>P11TWQd-hud(X^hH+I&GxHR$=2rGg%y^0|a-KWGg5#qn3*f&=xC zONegJG(1QtxCaDY?P&`&2-IE#uM~d)nV)>o0+j%dZcG#0;HvhI!FdOo4kY_>{Hlmu>|<&7_fQp zv9K4fJ<+cD0L|2a4=?uU1a*nPeZ&KZRtJB}a!|t(bh;L({RgV;K=Vud>p@FkK}~ni z1|-mF{Gi=0KOp5NcsAPdP#Gw@zksaK2i@Il06m$b)Ah%GP$Tz+%}a1pynvnt4N=p} z!vyX{fKTuT4{t_5LI5HSUbX=`ivu!cbikuC05p^Q<0W(v;qU3-<_&min)Mxs0~#m+ zRafBU88g8RrqBx>{Odud+k%d5J_sI|eKGGJ=q!mZ&9z?`>OiI30gvtg1IV$%klU=G zHeCR_-~|8rLzb>zYC)HpcYtiMbcI-14dS3!sRpvL^Y{x#4^U^Iga^|2cX;t1RDOcP z!Q=(##?~($GmzpK+*xz|0j)MbrIrV@YXD_~#*LACJsyzmHQuNcg4DR6kQ4w{gGf;c zYCnJ^;0wLLz6LLVv^>P$2CY58{N@Ao9?cILpzGkUY3c;k=xAy|i@G0pSi8Qca|9o^ z4C<$Yh7`bqz%TN_jZjdZ6@1btXzm%bJRdxa@&OtO-~#(4=-_@({~1fF0r>&Em8J9i z3nfo*zCm@}1=Lh?;pKF2;$}TM6)Dy10C7;FFd5ua!ID4~9C>J~ME-0ml(I z0AUFfl;S{H29ixI50%J(Gk*p5i=D2ZOSD0k=|NJ4+B0yjz*0bUmOg>BNqRx&CxeGU zsz9TYpe)|&`UkWj7}U7f2b#PC6@w2!G0yhb4KZCYm9e?5B4h<7fq1O#tbp~y~ zbUQ?NXoAZP(CP}%-~l-MBBgw2bpZ-OL@@;GSLk_kvr2$$2KE1WJ-S)BK^&MfK-K(< zZJ!{{Sm=&c(m^~3D&$c;2@RcQNa#ozaxlEO`2rLNtm`Htd3Yg+1G5S2VIQzf@M;DU zed$mB|K9dAi4~nfQtZ>V1Sp*ouOx% zYtJy0h&R`sVJs2cw-Dme0s{_)7muEUT6!vh|nrE*{cL1iUq9MQnT z()9xD5bXPqY?U_&9DX;z2__N5frTG(a zc!b0ehR=z1EMc=dFCKizfk-Z#r(gomP(=tZLxP#}6lfd(5_~KWA&<_B9uQMlp#q$z z5MpcyF;EOOA7F>Y4k#l+CQc7NQ1IY({ea?kkKO=wh*p@Bpe7-l1hoz!0CfXe0LjmTEpUl;JaYLW0WCd1De$ELC>?ijft&PT0Z_tb>frKd zKEMnTL@Qh1<{+B^(!z*r2FOs58K9xxgRdk&X5li&_7#N z-T-D~+ax@C16ZH}2VV(*Qbun8D^vii1>`_Bu%FoR`3a=+;7bcoCPLN?auP^4#5Wos zRcPjeoP=hCU;GUZ65Ab*$v^KW;4jR<@Um_2wr9s;OU0;CvSD^N28>qgwbiDy< z%%KmxK-ckNxD9N>zQdq}pS`wK>KqI&Ebsq^-%pB57i38G~fs(1m0Gta%Jt!vY>tb>M(5PdBUDLoU!RM^JonKo)Rwdi07Ks&O!YR+)+FsBwU#!NX{9X;vYqG%GJy8r1qS z1f{ReLms`hENalhj~xGBfDFv0--M1xy~Yx~0{dSuFfhEh`wrajgWMkiYcqltSiY#! z0PkV=;nCRyUcd$RVFQ@idZ1JUGE%|Obv8M5TYF1Wr4|f9CwI-v5_`i9Ct`Sh!((@9>*I%TP|Q+#C@1Q zjyr@PL~US9q(&rUQ0K*qbD%jF$h-|~UKoKzoNketFRi z-bwhQ6GCAc3t9~Dq8Mg0c$yzNU$GJ#grT4|HEfUdM>piTb#VX8qZ<+lpz{YbK~V&m zE}Coh8+v1K!F5=)M}q?q)F%ax0{l4c0COd{GxYfJf6x)Hr3R2jxW#o)PYcu`gj?_z zoCY8k*qA{FyCG}LQ9Op+KY|$c`WmPgbp}#ifCdXYA!~_Vu$qH<37~6){=^XRo*ti-|ag7X&4so;sgQqaT@vb(#~!Ep+9 z_em3&yP?bILH!2MRf`BOXo0+71oHwvc#+NrXgq_CmvaSiKvR0JK|_Eb4k$8SLmdV> zn%<+=mJ8&tf}2o>bsm2q^AJ2s4PAK)PY&$7 zbYV28^gzzy^D(nHAH_7Bdey#@BiJcphd~up+CM~ zYJTL&c|jF)WIt%&8El(JHv=T4#+iZ&3#b@8!|YWCr5}iB=kXUm4M3OeA+I077Q&$P z$VM&Ssf8i?F2WeecizTWd{@rSz<}wy1`}+)yRU@eJ82BxK`T;F#(2^A9h~K%4Grju z3ny@jg;r4D>vKSv^8s``8I*6ql`T>W0^Wj^1yx?%DA$$2tOJiJ2DBc4E#i&80ILua zAVW|7PoZuBH~qltu0Zyp4e^7A^+5~bx*b9q&TxQ2#q|YbvG5D%=~^IJkK+#Db_{rO z5T)z`PrHJA2u+hY#J}U_;3q9>-mOz#Qe# ze1P4f`N0p+2q~!M=yu@fJm6vJ`lB4QMB@WwehoVF2Hx`7?fL;+tcCv2giKa_fUK+l z&&Pl|ncr`DFkS$!QwFvAUUfn98)*17&Em+yhCk@ZJoh6a!VrkRr}mo}B@Cl`^dR171YT(R_fZ`3F~d z2+Dnr5ypu79(|1A_dSBb^R)x$WE+OpmZ00k7+xEJ$6{VM^QfG(VE zJy22&TMk(Sbx$tDB?uLu-4tM#ffnC%y58t^1-an{$PMr?1f2^5YO`^>?(k^-@xMd^ zW~w}-`L6((Byj>w=Ww0>|9`@3_6d-a%uufyX?z0;DUZ(D4v)^#29M6EpqkgCvlp^C zs1>qRs28-@|G4WHXfAI6w>Us2u0XdmdUU&j#3VdGBPn1u1E|V}xv|?p!J}8y!4$Mo z=t8NHNAq5gv7iM2V6~w2Rp8A?pq&XG;Az7K(3%}^>U>!QItvKoQ-~?Qj3K6g_9|cK zc92j79Td@e05tytF%@)S(-+Y0JkarVpdDnOqh3JcA2)ou0~CC^!Cvy{-V5@eM>lx) z6L>zTyR^Zh+qDC99`paLApiPy9`x)4wE-RfU-D=^BGBmynucO7;plcf^YRWWcnfI* zq}GJF-T<^+mlA(F^uZ~(g>NGywUC80a6UI2Nba!;5kcZwDGs_g9?RiSE#c< z^L(I#r$8+SP;HAACJsn3+U@$~@fT4C|NjSV<8!^y4Y|I(y8slz zAjKZtwLd&Ne{>#yG3OVkjr|1@Wh|gPp9@MIH@Y1}K%7)42U7O4@wdA(Gccf(|3`EY z<^K*{So!bK4awP{Sy=D|(;cpBL3V)h-1iHehxoU-uI;?2cn~UP0TEFIZEpAh&XS-> zNC(9WoF~8KPauB%obqGLYt_R@l;@AIQNb7W62erTfZ0UB_b&8-R z0U*OIIuG)L_#h|zU<8pMQ3u5noG^XRcmi!zgXUY;2Of+EJ^1&#u7ixg{=f9n9@QBZ zSe)U}2|6tlH1q4=051JOPS^k%)Pwmy0F*2?c!1poZCijHBEa4R6r z0Ub07Ue^2n(o4u-iYrv90}j{B@c14Jj#p4@z+E&0!$mXjxCnHFHq@E`Oc%|7hmSlY z^FozkjVACZaM)b50K-KK@VE$ccoftcj40~{og)QW-t_+xcpWD=i$D^N0z5cF;R(m1 z6Lgj*BF2P=;3lA_Clwy8>k^@B4!9($c2Pdd%-+?e3G}Digbh<$XLEQ10 z19IUt%Y<&%FGvkO`qhwfdXTyew4Vf4ih^oNaH;@jLZo`p4^jhxk|pTmtdb;9#sXDw zumb-34R8>FyV4%LJWM{|ya}!($*Az|qZZpxXCYU3dm$>o)fgES9=txGN;T)|0jua8 zVAUMd$ylm6@EVS82LsG15AG;jl^nuQP#FS_9#AE>5wg}EPb9+9BzQX-)=F-VI;4_2 zp@glHTMLz41(8Lo7qr=AE?#F~y*?m?+RCdon6Eut$ z?EZt6+U)?}0I(F4DL~l=T-$7OU5Zh~EyZ5NE#==93evozL*V5@loB%_0MflV{{K>1 zr|U8l3%0v116LWKObMyZmVs*&%<2rJ4;mvL37`sW8F$c#D?#zM13Zl9 z(di1hXcuGwqUu_KQ7o^(Q!In@!>k6)Xs$r98PvvyrA?1+a6JgOnab6a2gvpr$hN<( zM6w#RPYZ7K23Ru1m~ z2?(WHK9Qx0N~Lufz|`C zMPsl+2<&2{66i%Y==8u6(16@fXwHgL3K-(8Zkm zEzRKW_7RSHiRRiPEG3a3vYw~8_6TE%OmpoKrV>p^M{@?K9_qEd37XDWcmOn90?x_M z1uLMti$Rx(gBsBs9^IhK1D1v*<`=I)hxou`EnsyQXcQXMw|NcPP6CrvK$o2W+oIGB z@{t7Sp6*}J)?c>+5B{MCP|4B&3f7}r|NqCO6x_K6k3nqkfQ(5)d$^zk1xk3J-NB#; z>*#inX#T;>-y#VbfcU}8-ws-A3fjEaQVAAe;&1hYIPHc9B>8r`o&mMzp@R{i;fEdY z!3a>x38W5m*5(Y4=GqwyB?_PkukO$da6QVd3p^}cXOyr*_tbzQ7@RJ@UjUf{DoDZ2 zP76?*6@09(D`*H}0jN97<8d(+WXA#zP0(&1ummVefp2X0xD0g@sO=AO*9Azb29+CN zCqhOgK>BZZ7`t8o+>hV^ z1n?>fup7Vu2QB}&T`zcWgV>=vJicE7*$T3e5qz~Tc#qM`ui()eur;|ipgzk5MHZST zc7Qwp8rEq&P+|@V(06z!f^xNMM|S{Ex9gc+8PLJG z;FOiU`Tu{*!zIPwU1XpU3~-eO3dR*4)~+{-K%Hf%O&c{(;d`uK}ygEVM!g_ z2LnkUn$j;IWkWk^*${KN0vA|xiwP5&Yo9RiPd&iD?SMz)5m14Nx@Q?Y z{0iNr1sPxHuwY_f=tjC?5bb~#n2yHUFY6f?7)ldC!``5Rq-NXy|J@EO%|9GU1e{-IDJ{91coAr}MakdjTZ91JgXcmMzI(aZW?j*H>7#lBLA%nXo>@b3Tr z_mx8g+Cc(LAb~1~Kp9Bj<1XmL1)?hGto_qi`v)|NUk07xkpSI=gxJ~F%i1CeTKU4l zgtU+byxO(&g9qZ6nFo-Kec(}hOoiye%|{wMI%`*Wbe1mg=nS3V(dj$ErPH;?r_&cS zjy3~4@&-9C15}WEbh|=?K%<7;;DK@2UZT}Iz!O6^K!g6^0Y=a{Ec_koV8vzU@fX6U z!AhX>Slk|96|Mac6%U{XTuy*hmY$s_z(;?BB4s=HSP}k~G`L!DlLmB#GH7AP1O9EG zlc<@%CsBhO4q6BTImrQ}I|br2=oZQj6_6p|q2a#okm3w9EAipwEf5EKYHD+B4+H3I z&Ds^OS;4cLpg9YVZUdiQP!AS-I1gxB^b7dt;)}vppj!6~Sff37Wf^P?5WMRM)OB_} z(Cv`Xc>sJkCb%C6p3CS2l{6q3&`pWmt_L~;G9aVi)}Sh<_6&PTdUNd=cK&uz2%nL^ z1+?0wx%Lbje=De@^Z@n3yBT~STbjXUc2|JfA`m8c47a<01F?_FbpdQd^kVA){?==t z6V{;fUpqjj(hBa=;07o2(^4D^FWf+(2e$%r5DdgzkQJpnaGDBgc)SFaA8_Y^qYR-J zG+o5t(d_{$KOv$H67UnoyCJS-@aQh!@agt_-~*m+bX@=%*A0i9$pIS7Z9Pz`_&Ne) z3&TEhh?~VhZoa=AREole%0cJ;!NUXOV=>SYBGB3b@Vb1^;P8u?Lf~1Q39pq9MXv{{ zk}@Ia8UjR~1)YKhTfYFF(Ch{u)BfYN4!Af0`2uu~H>enVaa;t{0W1X_x%T5VsILlI zp#~W>2H8`37Ccan%WRaqR*O7E1==}|A}a?<-;m}j@`?n=l1aq0UGo9ZiSn@VDi9kq zfpMeTA))m^iOzn|_L~<8o1n$i%j2NT0ov@;47#rfJT47dfCq9vbos?YP}_dr56~!Y z=kXVlpMdlF3&`?8=$eHlh#{aoGZ!Gcif?o~6!dz4jxM>;=~V!#R6z5@pvZcGSa$XT zb+Qt~1s$&pE@eRJ0y>xrjsV0uw-<=HPmm7K1Or?L=p2>K36R5cTtTv+MM6+nP``u2 zqkF;wh+{z;FhDoVfKJzH0xgRJTLV3m7&M#@j<%Q3{e>?)pfZrXDPWJlgpi#HSM>sP zSP7DmAYVf)e&NwO0d8OC1n{aB$e0+1M|TJ0^mWh)VW2G{pak~+B4{NR=xb^pH=O|z7!@LT zWihB+EQ9+kH5KDvcww{|+a@-|`eE=SF(^|)ca@)B2hEh=ZWU;i7AO&c z>OmMAa*QiVQ36_K2=|mnr|$(H(8WvLt`ERtd`zI@2}(sEH=bp~%zp_!0~AzKR!U5G z%{T#a0I&~S8af930JQwK8GO4G=qe;6E@Gk{94LB+MlW%|DpS)ti4Xma#VfV0tYJDdK9^!a_3`lyHtafYv!OfGc-UOVX#i z!vj>FcGrTg!G!juAWaLTO0+}>NiR4>y=DcM3nat=BPb3^Kog=Tz~$hLec%GA^Z1Li zyuTrfFkXU7SM&(ky$0%omp4I$FKB8AbOjeuXcb)rAE9CG`lI|bS|}Cm@@TF-!B7f4 zt_re~6eU&2f%Kxe$QtIN*Pz3^A!&$#33Pm%E;!f255&Fz9RdLz(FPuwWh@0v z9fK+?1@N&TZs2MOdbs#eh1B@e(S zUx3zgfeP&(km?d-AgI>r4k&1T#n>58FyXZ{tfhgdn8C;Tv>qtkguE>dw&Vn|M&$!2 z+k@8EgOZ%VOofAOaJdo!=<@5wl^$pHg z7}h~bHBdVMlHx(BvC|ba^9m|@z>_M0kgx_Hng$UBtwLbD0G`E#1u?RO$H5oSYe;^0 z^qS5T0M~=yV0xjz{rf-Ys7O#`Itai_a1cP%l7_71Ef;9*;+N(J0<8y1b-P`^s4_T! zGJB~Mn9aZl$~f%1{6XhK3GY$>Q9QfSKosjPH}LSsm*xi?tp}j$8$fzX*mt^sRPgKs zt7qMr0#OLNLYu>JhbKs$&2a}v0oWn|utpBYo#7A}uvV}PxO-K?;ke5gA_H~=NCp(_ zpd_-d93;WI4{BEP1IE?^B@*4PUmz<)*>@;{l!R$MzkVf7NU>S#wOsA~njst0PS zN3ZCAA&5RMa0I-EP+5`u{aM*yFE3`=CLVLLyM6q4s}59e+dZ|EhXU{%x-Rn;+bN z%>rU{xc=wg=ZbV4H|)3<&~YiC>yy_}i41 zfW~-!cyxm^A*f6NEs{}ytSSL5_yeB<2swN2A~#o+yGmIsR&#N zRe*{-=mAHd^m*Vo=nPfxc9_?S(6wIR8$G~%Rq)=1x6Hq>A8G>{0YeM~fetW1834j4 zDZ#ZRcykiSW^ff|d8n8jvhg2undcA4x=g4{89TTHhBj>wMuR3Xz}0u>UhvI!om)SE zI@q04!I$54_CEOc|G!UX>kTl~djTYO+!a)fF?e)?MIj?r9^I{A?VwYqTEVKoTW8_-tG8ql3?;2g*RX-I-c zELL3F@ z0J(!Ve1II}B;e6K6*A9_tUwK+09Igt&-sG|qXeim0PVh~!kq%n#4kL$4LrKROAMi& zMIN$a`3l+=QUaQB2kiiZ8V(wU0v}wCMaQKtARVy%OQ0K%Au$9xOc0*VgE z!NtvcK@ER~N~i;mfNnmoPXboLy0E!S#^ACkmTNEKs14A1{M5OgV zsU(sJXcm1J=wJ^I%L^re9^JAxmUDp?6NGYrPv6ew;9z($`3D=Q#sIf>{$GZ4lfo8& z4o`ywB8ra_{{MoU9{$pe50p|Ni3_p@2zp_W7bxjLj(-p0fGr|}oez)jBsgm-LQai` ziGqg#JHbcHdvrr7P~w9!L8q`fKq?VfSb-;R8DXY?(+$`$pw(2MSO$$Z!qjqr*BL?7 zg4+$CC8DkqKn)3S%z(xU!$8FqH1(i(JpJD2|G}mr{T+i^L+d%^|9Q>j)K;yV8 z=t@FRmGHo$*8{Yg1C*mc*#bP%!g#^M@?bG&U>0=cw*bTQGq6(O5onP2xGQL}Gw3Fe8Au@yyXWkov?aLpKnY*-4;B8FKqdx;mun$rfTBSHwnT~Xf`>MERrv}2_D+cW2@gilq#}Bj zc;L}|h{L1v`hU=}wi7QwV?m&>MTcH42^^knQ10@W5 zW!ODBzk?bc%%EWQ==Q*_OawGGb-|+(R{h{p2D;rD)F^m?-?SMXolelA9iM3nJUX4A z(TQCd;|ULFK5BN|zz9$9NI?OfJ%HvF(C{sI78W#ny?}okL(73u8IR+x;N;)|O&-vs z{*n>gL<0@dfhWoFWFdZNW`Sg(5?+{zFG1U3!1)P0m(dBD10(3Nm!0U5iQNY;6Ty?+ z(87a|vEXTEh=)PjYrwq%X&ctC4mG& z=XBHyO5>2A=ycKmr6tI230Ulb3MEU|4Yi>2nLxQ0r4R)bbdP?6j#}EnFq#=bMJp%( z@f9hcY|8*{O@Q0dpt==QOch`)e;7Z&ny8GYKpR8w84Qj`P{$3_Yy}yKr`V7HxfGva zAXhqoMlPV00v@x#RXNPppmjO{8sHKaG&KgQLKHlDc~^b<|9=-~-y*1K==dGn3V^lQ zJ)k#!gU6RzK^-56!yG_Y*Oml9ITjw4V7VgD!U&MD1|H1^3_xu`h20B7w*8R?r!LvIBfY#`PCVzJL_*w}5ZJ1DB`}qoEBkhX7EC^Zp~a!~w0TeW46;3e-B# zb%O^OK`K@+hqs|YtDGT@0=LgWCFRR`;9>yk@b0M)M}o%kUzmIX8;#q6!l()mgEXK# zqXFu}fR?_1Iq+L8*MszQwsL@it9dVoVgTI>2NpO6>M?@O-UZ#y0lG5`a@B`N;}Ot! z66zW+$mnb@YrQITAXpnRO2_~iqk^qNO85*4!%|MD|3$57L67^b4pL3LBz? z9gPgK`iDm+tL_XgELUDY!V7dzD0qwvG!zb6=lbKdfJd*b>@RkP7f0WN5;AnVHsmOC zk6u%rU!Wb-$6ts;Tmq`19>8~(vmTrdalN2Nx9C<78`P8P4B&Xp@6jvj;sjcs25M@9 zhi*YLDjeXOeL)6*(jGWcI*-3lg?I-ttcvWN2k>+LyIs-F34!fO?q#i22B&}zuQ|bo zR6#EX21jG-fzsEY6J8E5ddvW?v+6wl!gMKU7zi|919BN?KXUB@2AHMR9=)u(F!MlT z$I$t|7aqMH93Gv%FFd-1Kyzm`~g}i0GZDNtzqc)g+}s! z(8bO01S*D}Ku?1QUJ!hM)DKaM+q)`Wpt5jYNa_~8LstO6-aKx|kG z3&aMuqrd~02!Eh1mI{60(d+sje%dd%Ebcu1LIX6^23p7>{o-;j=rA(@P+{Tv;5gXZ zkdbM2(7XiywgU*G9Ya9Z<$#YR=q$a`8G519_e^u`h5x0J;H7k}pdt@)ennsJ|Nk%h zLC1HQgUY3D2GByC zA&<^`V1pe0UxBQs_|^0OKj>OJgJ{PX#Hc#-L^#NxJ!tnrx9f|2ptdfkJjmY%PSen3 zFVNx7iLkf;r8dZE381-D&{?>kq5`xw2{h^szE8OI0QgX9gcx`Wti)?ENJ@Yt9#AV5 zbkqW@=7x%bm4dqSND1RbH~4r7P$RJ0^+hMv`C60{TcBq{9Crl`zJSJZz*9Kz9S_G{ zK?|Nh;-EE9pos#|FfO==hOdj5wj4BI%-{NvlY!yo3Qh)w=Gs5OB_hqWe|Ssynrr`X zm2h}K%>l{qw_F1a>(u@UuGeX<{i9Oi10w4cnrr_k@V9`{1c+5H0M@AvGKIe-h?9Y# z+qb1V^iOx`5BLD?@fXd1|NnnE31p?~55|`|oS-W#dP7^_D!|n#^Iy=CP|!I$TqSJH zwSWGX-UgGh*i1A8ndksB@fHUI!-NSQ7)EaR12gh}2@lA*B_Ja?ORj<(&EEp5e;^Lu z3ce2I&;L@amL2)?|NqO&91IM{U9W&H+63Jac7U-He7Jn>d~ni&+_BEzG97Z(2w!f_gb6)jeA+TUMY9KmSjxWNaV5PJ~?F>r!MbL|8M z{uWP&fnZ&b{XY{xT@c7}qzTZS8K~A^hQo^Ah;UGUk@F7JZei#S{R28d79}eyfabjU zTSEVXy7jn%W9#q#|6d*fT|Ed|Py|ZDouMZnZ4-nup=12unEe2m7VPk7uI*spZ>a=p z1+58l?SRYzzIgcpvg;;-F-L8K*enj|JplVRmqeS1Gl@ z44)2!nb=dnpH;(}2!z z1C8Z@W;b5!n+sC+gPFhe04oCn|2Eeqn8)XuK|F4gTq420&9xaO-U=5l^+r~oixB4l zi|;$o>H6n27g#TtjV;4FfZXnnX0;O3DE@s14nAP%JP0;o+W`+ye6S(p7*BM%?&)^j z!*~FEh|Y^*8?-6nQ%`^Whsk#ye=&15I8T27tKx6D!~(jM5Td)&^#w%XG3eoA;O1@T zMUT!;@SvJJ=l}oi&^?ToIxl%xUf^$?%EG|VoV$n712*OkS|ru!x`Kb3Ya{=@1I;fC zntyQew}URZM>*3#<^wwe=pJT}Zv;NDGk8F@c|yzRmro#l^A*rdXCPHVrjV$Bg$H=7 zv-tocl9Kl(a3zcAIm5w3ZCC9Ll2Gbq{1^2B@oU@zNVSgbpqMLF=^x7(JjD$M%{!yhCakrGN@Ls8r|i z7p+fz{RdYUu*?ZAJGX2Fr^Oi_y^y2iKwC;6b3a=jgUZa%8SnxFtll4V1RrR>3CQiG zY!hAzf?ebK;JAYXGnDDk9l8O!kQ&s30I@Z?L-&CF2^m}f2`}*I3@CV62Od%ZB~}Jl z#$ICt4>eH0f_9&-038{Rl*&30N>EZ6?$`=P=l~gtErppNln|c^{u`n=7Mra@Ok4{g4ytng!^DN);-%2r zy3aO12NzyL#&$Z7zxe(U>F9{xiq&XYp5dKy}76yiwXTTkaGrasQhafDjQr4H-Ag3<%3O8goLJriF0A0v~vnf%37u1w^0+#PQ{=#oExcG)O zB{Y~pO$n$hs3`$r9)oVs{{TAC0I40}Jq6T`cmi)nyaPEO+AxMRJ6tdDZ*x7$zwJQt z595;H<{!rOLd`!6`CHzDwyORx;)mUTxBlSW`kERVs-OUgeF{WZbB$QH@7+W z31}zd257?qe7hOwuz4GB6$#pr0Ew>Opjha&wRpzP@ZwcHMsx|>hDFyKP@LyJVSEkR zn1LL&f3+a~2RRZ{SEGCWE>yk~lny~N<{-E9iWq`!jB&ld1R8H+>~?+98}Pp~^hxW1 z(gmPS8K`r+1KN4>dJF1Zg3gKi&)+KY2UHuKXgvVFgdI8I34z+Hy|#Hz*%@9aVEV-E z7St!NRnaRb#ER1Eu-kJOer1;|J8~ zVQavp%?FRpCa^M89U>4N4i=!HdT5ynn#lX$(LDj89OX{-oxeb39&D&o8=@Ji5VZXZ ze90YXE5-|GAz2K|YbbsJjZFT4u1y6Wr6vg;2ksT!a-EaGqZ54E{SMFoAmrje=)Jn& z1z9id6(R57f{gQl*Z+ESmRcYbRRZ!s0`c) z1YIV|-vT|PGX@^4g#R61=8kq2F-X}fNrNf0J5ml88imC!=uv~x?aZtJey(Y z(H#tu08J8cfVZt#9x8&aj&R`c=#=mPZN~yn)4cHLjNo|fflg-6P8k)CZf4LbQjn9tW`N_`qxpyf>Ud}48_*=FN9W!X z|Nj5)+kFply&zSb{OvOs85kg1JbFby^Rf&cy{yw7 zB6_V|57}Y8*6voY(+<9nXnw#C>0m-^=w-e0fE_e)!q@>?1q@Xs16Fm&qnC9bSXKm7 zSiS%`1a1!hwgZf=e>|F9Um)od0P6!4b1>8E!1`HGOcw#G0-2rwmc=w(0ITU7V13A@ zD}eQ*n$81O1u~rpEQ@J62d3#@J;){>yN?+vEMQe2lUIOc(M(1%b%F;XzF&h*Yxn@E zZJQtPgE!$oLMQp4M=x(I*eDhbQ1H8glpT1%0%}q`;0KSR*ny=*z^NV-{$M3YHi2gK zKsEaZ4{LCGE1CpqL3?O}W{;3oOn_Yu^4|k+y6RYx7%3=BI!gtqISPS-!6=`CbGcY-D~v%uzoVy)Zt&%qZUi$J?;ScAag zV0&J42tWqv5NXU65@?;FFOD&Q3ly+Vz+5g5Xr2P~cr*`z7J_tw)-v{jGAH;b6o@>$ z$#2#3|37GN9jwWZac@fF8}Odx&b{DW0llr@rPiIUKcG8oLDw&|f~C3zKo^#RPPYV= z7~l)yJUT;vfO0Kpe{FN^7xi*+_(B`FV$dSMJ>VOAdZ&WThAhSL>^uQ#b%QEccz3Sz zH*%$de&;B>d;uM@1S$hvKfEpiZGr?%oPgs1bWxvZ8T)b9H=>X!mlL3UE#0nvzy+=A zgKo$MV~<`FP$s|7?I6&3+@l**wSqV5-|+1G(D@HkF)@G#Ltz!HTDR*PMo%|)sNm}k08REi=ynj;2^!YdJlJ`n^SDQE=|7KN z-+!P~47a)M7fKK`zG(neU7dS7K*eo$D~N*h89QA;zGdKV@ddTpATl1^4WJc9khL>l zwV*lp-qr&k&Aq0*caX+}0pR~5q#1+D5wz!qkyKM883j=CP7Xby5IqICS+LY=P^(#hQAfM zT^UlXbAZ-%L)J-x>t#@B06y~&d~|QOg9fCIh6#ZV`vMm;pgNTZwXofQy{!`^Hvd92j5? zznFrOm7tAU2GDWyuXVvQ+u-~Ms`SCr5dTq>gI1@3*N4C-#z7|uKoY4WNdmCl zwB4?VgW-+;qhu*$C7{MFD8GZ2{2(=rJ8MDBV(?@z%DgW)96%m}&)U0yCN*G=E8zyW zpFt%vcxD#)ln>Am2cQE3z_YQSnK`5j0B2c6+{&;SJ- z`1}+8)~leMrJ;8~RRANnDS7Y#3uNN%1hmuf5HiCDosAY~uD!zm+g<}YTn5Ex@Z>S* zXw(z1818leEzAcka|E5k^8#GCgVutb0IjEr?jQkb z1%txNqgQmn4N#u~bRstBU=PUN3~-wmvm8(cMB4WZ?yiAi2GsF_B%Q;@(9d@Ob?zXA zc4z2~PTwnF_jS7dXs*4&0NSkss%Sy0_CR3;9s^%}_SgT{_TXw4v|SHk?w3QLt{zCO z2Pj-XyA2gUA^2_wnbrd(BA^Wr z3@?Inpd*hjw}ERt@PO}ea6$ujJYeJbU~y>5aBc@>)=ELh4<@&Vmb0bj^F0g?tm=aqxD(STN+KyNUEH~_qG0eZ#@ zRK$S;DF`6v;b7@wgHCrsy%10r?2A(D_W_oHhMX+%+y@8>YtY&lL|B6st5|q+*1~fk zxb8asBINY1|DA`y$*lAE3%Aq1{xjZaKET!K3L2mTZJhzN2OyE3HwWDPgv`>Hf(})Q zy~@t;Iv0}H1U$NZLD~C;N3W^dRdD!%OPLpk&VhTPpxOKvuMJ-qp9gWlxd_slhV0DY z2d{&H>^W!m=yrW^j3FM>Edf;s+J11bhL zLZ%~8cT`q@8X(|COei$xpYZ54opuH6`WFX5wGk*^!FI18ou-3a0D!iJbYkRwP&*gY z1w7#aK5grTM{fj#+iPkKwIBgxK_|H13{wrtQ5GJZ&?V^22Mmxc>IEG_4VvGFZfpT9 z;D&Bt0fm@HFZjeSBnuP3QPXRB?lQzj@4>gW!7T(yqg$AOY+>_(1dm?PgO`ztH;@q2 zPUsn$uR&$m3lB(H20E7lwJdwW*j)RBsq8j5i9t%T9pJo+8jQ(14!HUS z<(+QuO70VoBTqJi*8akbehE6S3>-rsL$pEn*no}|I02e61POyIWdvEu$i%=<>H`w; z=yoXZXgyHr;M1)-DG$8z5oBqBXXjCfw1h{m>C21YwP2c;*co0}?`LE1>3rqUdC#L0 za;2Z+|101H$>3(bfCp#|4Cpi#{?;PMGQJ(q<7hxbsNnG_$T0vQ|GYMX3aT=&fY!K_ zK$ncldvw>%@aXnk;L#nr!lN6s48wJYC-?@87yaF!;npJ&(T*{Wv54Zx16Mmlpqup~ z3ux&fe=BJ5%5m2HEYRhLAGfeE9CrmBN5cT^F1=RlcKy*Cz}Ol3qdW9Z^C5%IgPoT= zdRZqhb2D`CFo9Z@&9#3x%WfWb{o@Ea6ha2BzVjfcJ>M&u3RWrrRT@=x53ZtvHJ6#2 z0f`%r%8f+jRx@*hoRx^(ntx0n7s0HlD!YeTF@nZ3Z-5JAP<7)9S(XN_Qv(=1IzxXz z3rf)Hgc1?RKr}ySkq5Y&RBCtJ^^E|?UQ_UBDY&Tw8YF;sW0AC*LbZbz*nsaN_|Wb8 z20SeNru9JSK5!8WuEszmG|C;;@cUOEKwJuHs(yg>-a#WCu-T$Z!bmRs0Xp9Rbg{}0 zkPBh)CJX6ke(+$t(Cz!j1C);$Pl1lz2FDq=H}IqAHbfEVR+3|&b2a~feFt8={=lPC zpxYJsDs)J52-3g-7wC{$0MgF;;nA4-fZ@Ua|DatPpvAEb91h@{3L&k>5Cb<+~{z9v5yDD=sf-+8#H$YI&ufJFj4?)$nh6p5J8Y(9~es5!Fpkh z2~Z~Vxx0vy_>VfAiK$`}S zzW}XK1P!5r4{=3aATvV{o^oLGEa+<@N)bvxhs=TxxYz+1wr7KsUmzV!;KRkVDu(d&8u8U}LU<&tkadP6}?7ua0P#C70?4k$u@Fz~k~GlAwC z-+(syB!kXXgDH!HOiMzC#P4G?Qzegc`%4OuR-??Cep3;zE5;O#kPwRz1yO!)gRf_X-@3C%wYN}@rtm93yb zG1!74ukdc{5Hw`o?YaZ9 za2HfDBCQeF0lB$v2fV`u+8+*T`hc522w~6-p#cIOsIlq+Ua9$}+Z7h{-JrWVz`dGP z6G09G=>qRa2DN@ba}qE=T!#2T0OSY06y(?gue5gH@BqakB)$DQ2#P^aUkIG{6dG!; zo797bG;ctgP~bTd5C>Fu!or>nbk8U#K9Iv6wpY431f=V3*28Mm_K>B-aEl#mByf8}!ogoa~ zwFSzB9^F&H#)2DCkl`>;S^|%W@s)xq?;nhiV~{}$40Z7-zh8o;98_Y1hL=>qYmpgB z4mH>QVc>6d2Dt{3J5lUr1vwQQSe?gTOoAB3S^`a8jNsgBTY8e6;YD#0C>BA3=nhOB zuJ57Nz$&0XUPv)wlg!@&YD0jep(9%`C3;9owt|v(H^?yf6g@vw8n%uBiwSRdAeQj& zJHU9N`2{OzO(W=N%wAYv!UOSSF=z$C3((;gP_J-9yt3*9JHv|=i4a*(@H1XG#=yY8 z&-XoeM@l#NoEo2Q@H`VZ$$?IL1O;G=Eo4_2a!K3?ubvT=2e{=48eM>{l<#!?0vhJ- z6*&rS?SjTR7%zB0+T^b_n{&S~Vn~A;q(2}%7|;Pqkl_k&oenAqVdfq{ZPQ2ygqo6?kButoQmgA+ zkVJvL)M`IM9JH_ozSL?tTpZ?Sb#O-xbO0l$ZwRX3drkX(fCA_Ei#On68@!1Qbx;9R z2SfVxouJ~@cY{x->k5}n-zA_z6`aS9yMm6E1#N8r9WV&mU<2AP2ikr53+LJ8@_@^EK zwMIbM$`yQ!KiJ?74#;d-bM6X85744*5AX>D;Nw|P2Apt?wt%krlmMS^20ASabg(06 z`~_r9DX3BV!*M4ljX^swQ~p8cK%i$(p){{RDH$}L3LAn$Sw}D}2&ELqaWe=g!l7MJ zXnzniFAhHS6(j}iEdBsDmVSUcWK69GNUy$fs({-*DsJcba*!gG#mHY z42yD5B5{Q)^XL_|KMa}{6%p(ZXwLn>0xHH`CRYZ;{V2sh;z zgCV$N0X0%OLw_7&01e*2G$R#v7#$C=H^HO5C7=-k(D5NJ-f#c)ADVnRUB5Kfe&Mf! zwCfS3A9wu%>LI;O2fGw<2qs+C(4&{N^$=(b$MwN+*Ds*d3C=@s*Me>xNWSFJ%j~pRT0nkakp$|NIofsi=W}pD_VD#wp{lULY2sAJI1>EcV(t4m2w6hTAHRL)4l46mM zy@R$oj=4SpO2Q4t z9=QO`NhyKqS)|VDiO*c1H4OrwIu^W00o20py&$!HrL0n>U=(mLjG;8Phc{w z=rT`XGTA6HkQr|9Ts;%SeF7b>&p{L0kQsDP*ZbuGu;&CiT%Uo5#d}>JfvO46jiK<$ zet9mqnqY&qT2#RO9^3r~*co2zjRe;`2aYj-HpapN2NXRoJi2{vKugLKaI>O8W?8zv zfSCna_vq1UTMRO*FcM|3%cJoPxQ6W9Yw`d8{}*fC{r?YN;|MMo;q7Sf#K#M8qO3234-^o7R^{%tKxprXCy0O;-*@DNwCD`m#pMcsX zuj|omW?=&D@_;NtfM^2c4)EHG!2RHO;pkw()O6qn3sfKI&?nG-KG1fpUS3(S9uY3k zLI{X)%?Fq~I>AhkpCG>B?H81FL!`LOf&i*w+$dPf*tA2ilJ02Q_T zecNDlcQn>f|NpvsSn@F&$aP>^11*G>|IDAlFn7^B9B4>qywycF3wNK>PYJ z4KaQVKN}BOwfSr41XocYY=UbyD8#`7#sM52D4w106I^b97kq%rO7I?8$Qg7f3R^%8 z#qM5^J8?v(A}GR}U4MWk@4!J0T9S~6lqfq7?&5^^!g_6m_OLU&xSRnl(>P(}&^$<) z_Ifuv!;6<8(8?dFS%hn77t~mSH2YyA3J;sWO-N|N1G+dAv?B<#hZuAoCAbPc?f{w( z05w{XXPqGxFRsaeLn~3sM@U-`GCqhg0m@XO-CTQxsXVtCbebz$bL|yI@Qg5IbO6*@ zhorh08-D$N4QhFTB%sHEg3iAOjflV&!(IaI{09#ffM!U+?J>}K&P#WLYH!F0{EL8% zzy7~wK&olGSs%XTf^N6J{FV#6@B9VhJgnR8JwTlT=t70o1EroI{ytFC0W`~Xx&cdo zf)>$2t9R(!BxsZwRLp|I)Z@4Vs7VIvFok+_K80;f@#q8{JC9@A{729j4`kc?96uUt zn-BMcZJTG<3>s-6ZrgmwE~J2V--NMkJ|+}AYjOj0=uEGv9!PbsZS*d7h8F_M2ydG| z?2B#Nyki(-vI%zI>t1jUgkI|dEi6z+X#6ul-A(@1R`9unkYeMwLj@>KJYW?!Y%&VE zY2>);5m3ADcxwslFd*no$d})^L3>u0@RqW^d<|iOce5U0e0c}LwJK5Q?geSf4$AJ}&8#y#y1}KMM{jEmsKoEQxC@k2;4PGQpmCVy z9~}Ix`?*0IyVrm`@Y=82bq)Wv7FLiJSZizVZ%9+lCb?7_>J}tL`z~~s9zk-}`M>}F zzpMl~-gOOQbL|@TvNinMz)pafmkTuyHbTR{tu^;QXfq0A->M%%8noGD3jelN(B%y< z-TDY=@IW*Fw$^+k-2w<{#uEo0aDev2f{*Wo>3{zV;v1;#$N0Ck79#1tfRJYV0NudR z!M_bW!v-^A4MGjf3B^c8^dh7|9%$)yozi@Ok?}yMYXj&maZA??}KW3^zT$LR^+ ztiQtpvc%kw3p8lm0J?A*tPWBubi3|=N1h>gc^H8_z6!08QhsVJe9E^v$U0WD0bh@rM z?g~jfQQfX<7!QE=iGdcYBlQNVpe}$0`ay`o1K`RTG{B4ETwjD@#uJRLE1F%Q?wC?E zuiJIS_Z$4%E|5A(tRC2Vi^0#NQgOW=N z(h~IR+Yn8t)7#)pD9~JS33yH%+~x!~SR5>%S8jmD1aE*^nV@Sy!DqyR_xFNYE*9Oc zQy?-YJURm`UOIqJ5}3lk-(m(n$pBmi!gu;YTBN3|AU{FptzT5F`Ssre)_gtwV)hCU zH-Hfq2#_lJR3#`EK(AZe3%azBfxkr?WJ52wy$rjd5Tbhfa!|!G6{HN+7(dY7O4!tR zNi?X{1)Uaw-erRDB`9`5UIHD*hw6Wrj7E3p6p#rZe}n1n&>0?}ZNWBd3=9)qwm{Aj z0M{Aa4i%tn3;ZzGbcc3$bOwO7w(fvzNd+Ilm9PxD%jab-_(X##OeLN^-Kvd#psEcV zkdWH#!e(%isNKxY@WN<5C`labc0B@43?7~5!K-uN2g1B``~UwX8`vqXpc{~3| zaPo$yRB*|Fx?AnxSGW>raS2t#gve8(dk~61DITY4- z5Z8e6HL`<|jsf6(@dfO0kP^lZpn3x4D;dF78G=v( zN=Y2>l!Tln^%06d=D-pOQb6$XAe4Y&|KI~qK!7T4cmjB-4e8b+Wg5|IAHfd9S6XaF zD8U_5eF#M$2V#q@PZ|w*Pyccss~y=F4l!J~I7s96t7Fpx^k`V(k)Wl3}GlK=dzPd@+u-wp0EfKP%1wGF}N6oBgyi3QMl zSR9swPM4qnaW7>6-3Z35nXonE0Y?`Hf9p>s@M!`YU?FqrEj(mEIS&+S8)0(m5OSdI%^Ch}uA5+TlMr$+eVbu& zWe7QF;laPnbqh>30wD|135vt5FgY899H_Vem+A-jx4CYEDUe1e0BHs}cRNh({~Neh zK+fIMT)T&%#LlN%mCqHFjX{@*gPPzcR)g~}?<#hN7l)>T@-XtMOGvxB(f0rUm!R8u zx?RtJ&o{7iy-{oc;eZ;951@nLGlD=3Su5U2j0t!}gj#Ks)mw zJQ%d5;0*lCgH-Uy{uOZNJgM9D3bcRq0CfD|Hh2$D3hGI)?;)yS9TGH^A6`R(16;R& zRxX1UDZT*jc5imQ!r1M4#oF~u(KOJ=l!vzK49NPT1(4$t4i(8lCdWW`N`NQFCe4PH zLeRSeK}$$M`yMau0&TH?cUPN00n+?~iN6(mRBbPKXY>kaXt{%T&tCwYzsTRJ0$Sw^ z8YRQ9yV%;NTQ$lVInHcWf#WQ41v|qFzA4z_?5y?w|F6~2oPB#1)Y+I@?H@qe>R{h( z0VxB8yhrnq1k}yPkTFTb2xh1611vl4K{uU)#`hr`4j@JRlN@l4{D6JOJ#-uux*rL; zcOJA8(DetjgqV-A6A3gvh}eyfb(1~cT&QPH9{$WP_X{*e2wHg$T3d~=@Blm=Ujo|C zeE>XN4Z5}sG!qKpF@X;S29?e)-NDs>>k0TO5MGeCKpUz-r^mwfw=05GffEI6<-yZz zq`U!B2e~Q@q|O(#XCAiBE@Tdh+~IOtL2__C`f%}W-L6w0t^>~} zi@_zfgGRs}@PkDe;G&?IUH~2}ngME?x`Leo8dRDB8dUlMJ7=fYb%RIq0Zz~cGw|_| z9sJuEP&a6=T?PsT@CNN4pgBQTkP^rSZg8^_GSd#8ZfpW8g>LnRDr0p00$$J7?D_+A z)<*{;XqAGc>w@x0-L7B0-$3$_3s|=ZXpzeg@GSiI8?f!`>_e}H<-km=(Eplvg~1-#%T_aOhF9-k-g4=y1VfDV~$KEw-JdJo4xX&;CM8v8!~2hvP3W@KOhkA=M40&*>=>?v_R=DLpInCp55f~ItWO@S3c zMIaMkLD&s;BebXjO@G6^Syl-;cmtfUF2J|#x=!%uHNCkQY5JmL=CA)g-Kr~XKou5b zOba~JcL1cQ*LLYbc7_*Gy`VblphvGOcyk(Pp9k8=4!Ak(Knl?duyw?sLr6+@zytmSc%=|1xD!xJ@C2LS zy2FDJyuu7bgHA8m;i2hzz@xeL00V#P5lA%--4_Abb;jS?3KoS126(iLzXf#p64XWy z&jsa;+6~|&6b{<50!kgt4?c9b_8fEV1x9RGg_RCR#U zQX06*hN@|Rs0p3m(R_#rewzeTT>z-)hA9NCU-Re%D`WvH1l4ohV3pA8X0WJ)-ow=m z@jPU&9~Nai5Ch@LKr6aPypsP5rs8oTdgc}H&YsaEY1ELJsK+wU2SXAmjRKg960AJGrP6*&l z#L&1ifG9&Y5VSWEi-9H(m2d+yup4LrQHE?F=yX3U2HHSW!VLr+rh!G714J2;f#BoL zvD@wfQ4BM)37qFZQ!*GH_kgHGHWs{L7OP?(h+??0psUZYJ0Jj}64_XAmcnXm2t+a5 zSkMJy*o}>Vs6;k)1EeU%5@InB#c*Rm1?mKk#v`D>Kx!(3$|TU9LXXb9kb7aaf(}gZ z=$s0=HN>MEd}Rpec3qEd=U9^IgF3VPAXT=11e@Y1Rmd?Q-tT+j+JM48p=0G>Rb z3z_19m0XZzSDkagYs=u}S1)Aw(_F~4sU86y-4PKUosb((JLf`Xsyq@rx+5|?I(-{F zI%7LLz(YV06&{_w(6X}wTr73Z0C^Qrf_6Y+b_O`w;N@rsBw}WOLmhOnF}O6H017RS z?gnu1f=)OAZy$qPivvzX9bom{p)dHiLoTV|-w)kW_5Y#=^qL;9!U+(CuAs{;nE1E1 zDuIFmtQd4A#{WwwiW?wK41M9ze2B%PyB8d|pf2zE|DXd_z!3y76`~MqDu+im^!7C@ zCV~%o1Gfsnw^%}!rhzw8;IUf3qZ=A!*E~A$SuFw|dBtKivS%bbx}nicz(g6?Aq9lo zsNm5JO)3OTRDoR5HLf&)%Z>J*^Y91clpe6|ccY!u8 z-wWW;F?p9^K%!+6744%mH@C+ze=&3|wCIx-RhOJPt}uph<5~D+?+OtEm@&O9jXs zrl6rx(9}3+#2kw;X`# z3yW#cRu|kfP^$}zGNe`)*fda+3#_c$K>)PS71S5y-{yMfzzgQ)2l5cpIxjXql;__T zP|^J80q3cXfC`WT@W2mC>jD0$;B?mfh_UnH!H296W%p5)fe!0LQN{*QwjWg)BiuBQ zQS1;k^)NMe54>P&e!z@y5;Om{fXe1ae?STg&C~z1?zZ18(**{8@%HRYplTv#{!RTaAOTxI8Fe!(jeOl+8=#gGxKRmG2r2!sE9AgzLm(8Qx17KYQfN&9YxY2*719<1 zH`+igC-5cSgsc|v=>*J;Un&kSWa%06s(j{^N233p~utyan^@4j6pcdZ^m?}_f2voA56gJIoGCVqK5i{}Kt_u*Y zAy@{77AC&X3=X>47CdqVZvAvS7=SJo>2{s53v_fCe9wMN19+Zl1!{|E1FS_f1F{Dj zDh(@1H=wnMK+6h2Eg~$+kXu9`WuO@>EXtrQB5(+Ulz|4FV9LM+Rc|QBQfQ+HypR!m z7!?*Z&=wIy4X8N;Qv)vUA?6@Ahd|bWnnN&UNY+7{LlC1tZ6PdbplutQt;EMY?jBVY+TAj6~EApxn*0=o?yP{?%_#0{X+H^6lk zLJ@L#1*)^q>I3WwK?jmHAQgYuRq>$J2iR4Cj;xzN&@2(O`T)CGpn7TnL9;;h6mk)d z-7HW&gHu(Uw>#;NROSc0@rz_~ZC(u@S4v%igSZA;67f5jk&cHVy z=gL4;z)Hj~h!PQeEFbuk7qA*|oyOmK4zhIY&w&?A%@6D$CV~0@_Waud1ezZm05!M; zKxaFED=+5e2NIp2%I@!h7p$BYz!ep!%gn#+Qu8BuP)nYTe|vyHTH_=8ADpMsIs-sj zK{xL-KLGVO!2N<7&5sy+c|a$cGVpH;5Nv+*9b|_f^opK?4+OvynP6K$ck>*4zyYrM zK!-$dUQh*1V!>Q_@F7okfI#D;|NIOLoToYi1YUwRK7t&J-zx`Ruz`&SIqcvArsfAS zq!7wD{J{eg;YN)b&>~OxE=tfr5gy=^ zazXR(A3!J7fdjSMfdd?nr5PZ%!#a{TIxjXqWaQr_(ER8h=cx`*PWb@tXv6!Wkeng} zR`M4`3A|SeQ8E=Y8wytT8>H-Y4#*y`S@3Q)PTS!9b%;^eY=igwAxh9}1Em%I?E=k@ z*dddK;L^pT8#Zb90cFzA^+sm^D5c%-=ml--b^YLhlJZ`>|AoF!H2{7{E9fv6(8eZ6 z;y>U4PyC=uNN#v^I|_Jo2ZGjFJb)ZO0^TbP4S7%#`~o=bLec<)%?fK*L%7V%4;0`D z2-G0_am;~{;k7vbHrET_!~;$ya0zfu1Xu5{YUqbYuLl$8j$x!RSI{{V0W2Q9t{1>Z z8iO_nfqRWFr2n9M6*Dn`y$Wi_fO9Lj83j7H1UxJVPLZHeAAgDjoihtQ^9YomJ-QKD z9#kT9bHWM*{Dxq!h#-mDlYd+27f>PqC*iN)Ko$UJG|+I;r;0sd{5I8Sv7yf#5LDD*36#WA?#|IP`D9#zmbPtZ9NpluunyP5d69pF3xK1vpp zmOyC=obbSI;-7K=v{bd%_lrmKK^BkBbDhUuSiE8a_p~6vfLuR9y8_Vq5j7w{2X)_o z-*W?wJkY*<&>{`c+Br}@hov@fkqfrI)SiD^DEKgK(2Ax92VZa;`~kV@?MFudW49|r z1YX23K}5h|@}nbw`L!*&c9;}Sy-4PR7RG^APJu!M;Usv7JV1nqB_u?^iafeu4VoVw z&4)O;eIFcr$-K-E1g~_ z7ybGV8k_~)B;H*6hYfZVA2$mF=tgtDMs|i5%_9Fn7b-4bDB(Qr`UbS%@wMD>SI}i$ zpd=1Dt5*SXhXUl(&ra6`9=*Odz*l0Ff|m$_Zsh3p6#y-R5o2Ru=yU~L`^Zqj(e3)@ zr7n0W68LB>{n*ITu`~vln0yuaY zz^CGJc|g}4z6LGS1i22@N&&Hb2Lk`$0#Xy)aV&ujqjuKnaxt-BSb82VLO`x=|Hm%meVba-E>r5Ye8s zphab%)iI#*{eed(YZXWY)G_es zgp8_ovr2+2038!j1`csnP7oh-K8QD%?+Ts74*+%WL1$8NKwJBu#0-;kutWCJI2q_<|}!0|RI&Z3%}*W9|nA z21Zai`hYCz3KPANwgY@LD)>;AgD(U?V}6_$pvR;^o$LXcQTYLB3V{x(gm-qqU0O(b zuc?EicjJ6edM~vGk88rK^abGaQxR4A1`kl}51tYOEsg?}!Jue!ZSVj`ABYbsi$QDV zet=T7Zw`3)=mcnqEBF9f{?=8XV?BmW6@g<$v%}3CP+ch?8E{LY%Z959B2N zR?xN@k6zGaxLY9(Zv~Aecy?a!==K$WUzBo{36z1rM-PKC(3_W!!3Kl0ft>1q$UvYC z$`FGbKq=hA1C)~(LHGZ{TmcdWC45lj(Ez>*3@i;Y2UOjF6Oc!@19IB0AT8iPHzk33 zlHh>z=?44AqZ=}e(hV8ehb|H6E^PqKU3fIV;rL%F;M;i+dcK+6KSl3m(n27Z^&6K{BS052q8CqOhhqiQTM_5q!#*Nu5b z9fmV?!AH9s5qJ$fWD<1YwnwimUky9M3uk`hljuMz_cc5^Ya#VKD7%0zbQJ`xstvsW zskgv4+q51i;R3HNe|Z}m!>%_V6&Ymw@&@eSANYcOj&9cnovu$_SHq5v$^v-?bg)l% z1PA{%W}Em@e~(_%&T3GqyZ=Hf2bAhcK~wfGz=}YL1bkQ#lq&$KNiIM-`WHZB17OF3 za@UL1g8%=&76cvD1iB>va{APRqCW7sO%IAd!;PSmEm%LO3aak9z(*s$VJHC=zaJ1urKAL8W(nw|b?2ZytQD{7Pk z4r&M@I(nVH7koNhPxycq2!U4Tf|~?45Uwr-CHM#64BUF46x1XDU6}%^b3n(_L+cN4 zH3YT^a^@1)AWqm`J-OqM%a*`_2`VVM9Xw#CmUX%w@aXl0Tu)UB^56la3f&cSbsy-& z=^qRwtlh3ZKzHxde(>q`z2E{m=1#5f($~WPl5)%|r7}*-s`GRDNPSA}I zz6V@7UHABa7E6J%p#yp~4_Yq40Iudiw>E*Qc~CcXyERi1bA0f>w!|x4jWKd zgWT}pwH~Ce2Cgzd2dKkpN6=6SN;LThYuc=)*I5!xVvopMqhy&*a0gp~5NEA#5 zuQ_=`(C;0D)+*Iwi%)*0ZVsllh>Q=C{avZza^>ltts1+DS##*xIzE7u zjzI|$lzza8thx3Kq&$3pC|NL*A*4eKPHi_lx;;SdIsi#+A7I0IV1q!Z4cXz))OG`2 z=c1H%1=y|$@#*xP;M46o0o(l+pn?RYognrN(oTTfUdIe+8+`|*CC~~ncuVg9_y$=- zOAk7j1MUZKbUX009suv}0-dYL0=}K2m$hLz_)z^D9^JJQz>^W(p$j~E!Ix?6@agsy zfHqW;EI=E--#~jLpqo`e^SdWJK&lZX2Pi&&s4_4xG=Mg=aqsvKT9Dc4`r|cdXAZbL z18-sgwGbfMv8I*ItJ^|H@(2MoJQ4UR&7vQP#C8&Sv0X7I*-3am$G`qq&yBj=ueII}?%P0l) z2R0zpjhf#>SA9$`!>va7FiYrJybbzV};_&G8 zV)Ez?MOFtMCWEL0r4&#l2+yzl+g-mMe8A1W{Q&>=(r=B=9;gC_u)20UP(=Kg2k&QE=Veu0Kv525qP9to_sN`UjLRKiD!bFc_4WgQ;>b zrBI>-;whACwjL!Bi}&(f=8285lYk zN<6?+xxXy~Ln}jxBbX`&QOyh`s{4%PiyAZHqs^MNRV5-_Du!nb1wHv_|K;T;9y3=FS% zb}Rsy#=65no`C`4Ru9mT(V)HCunmU}2F(u?KqVEAM=$HYe0GMHOTa}cXpk730r!)s8Gm}PS^yaokHFNgsOk|!VrC`f*<=43!r383q~ zI&1$l*8ceia)b+%Q4V7K1&L@j*8Tx8%8i<9|D=>~G}rz~E#ZEx;?c``5oDXMM=z@e z$ZQvnUewRkYZ5=3R93WctMKlJ@hi|1LUHZ z7vOU^KJae?o$=}Vq617p(|!YZQ75E!LhR6XeUa7)-kuFp1t}G=)N>R&0JZ`Gl>b0A z>j(br4osj?F^p^q3onpLjEV=pJD}beGC37=5qM`QXh;WXKpQd>kJ1pu-bmpgdaf_gh8B@nvYz{3{Q2`Y(#(B%pqwxGUIi35Z#7x1tJb(u7-9%0d~vv*7nC-8Osh+>iU}yQ&d5w@Ip)hxgK;AA!L#6@fQcI zQC)uzqUBROJHv}xpTHi*<9dykJ&<7`(B;@wQ0sG%jVzIeECs|Fd*G1lHFbq*HbBweKoXKE)Fg1qFBRPP3*xYJkQRT47Chmg@tS4AYsLx9u3tb`pS=K8 ztgyV!zum!wfBOMT*Dw4{!JwsfsC5gt%mp3k0$NW8>5FzZykG{+PM1Ji-S83wbPJ&6 zp%TG;oSfk7bt;yf;l-v8;86Pkos;Vh{Q@mlU?RuC#(@^+V3y5b+dUw41GrY}cHn6K z!BPtA6mdZKu=(btpzsCtX3!i8+A975>Hugl2D2ShU3h>UEdz11D9F)&-@_aYyZHj4 zeG<4M-U;iE|M2L>R1;(X^(0IiPEW$_fPmbY1>PZa-1Pz|G+^6Dy1^+5bPOVBG#zwO zd=tc*FrnrjOeLWEfep#V8fXw zK%*ADrg5>5vWV9kR2G%gfeX%V29I7-U#QGyFR)AsLdF^@a}y#1$|O+J)S)u_Au^zW zD5#7uRAwnyrc?}Knu7&sq?HqT^T=y)sHgyV9tw2wKYwfB|NsBNOI)D-(PReQ90596 zjG^20hOz6N<_Dnr3GJFwZ~Sdez4Oi|m5D6=oF z;A2W*MzORWC;=JuyE*mFZ=Y_}c_>D8K#a--85M-zC{+fA{~thW&#b@)sontb89H6} zbi3YxGIw;l-sn93qTmH+#$-#k>z&TyFOtEW4dBUZA;{Uu-L8AAU3c)eLa(-F1dZ`+ zVJekvuHC>`!rNTCfvE&#+Pe7x<7;WKBpXPw6kW3A0DlXpGvm{(dhi``I6aOAhtq@z zc7_+F_MmV&-W|H3+jUDP>VeS5AtClU%%@wm{v9U+#N{k6{{IJG6#??o_vawaQAj}q zii6`2vrRx|OWLzBxO9GW>3rn@Iy??iQaJv<0yVcW^#-U7*_e66p#<19Xn-}>USTK|gp8k0 zc?vCP5etnRFpkbfUycP@TlfNevo`oH`3nrCg8SY>>NLkN(D{ciL3J8vUJJI=@P+sd z@B&8Ak}Pmfr#r&Hqt|p{6gUO>fixN0f>IEutI;l)8~tN|4QG6!;LOaa6=W5-)xvlLE5; z!NBkVwDue1=PeK;UIeo-{H1`wlyKt`EkH|mu0um7(>?Jd;kggMCoY|h7UZ~$?E%z1B# z)pt!Gb3lQ44x;v65Ie(*!`Rh^Ib#V-P{6bvC;`RYEQk@aK}IxSH$oU@T{T2)K1gi{ zcD2u)z}CI+=sdO`v}K-SKpbpAJkmI5Pp z{{6xcoqs2g`xr0S{eJ*E)2i3hB^c7Y(Q^VdV)$EXm|$nG3V_>};QKc{dQCTkLDaE9 z)rG^=y#Q?sfbMwiHSL3{yXOco&j_yW074zC-@h^lV(3PDh++=7;>ifb9=)c{P(wSR zhCYTL5SxvnZa363iC}fG%MILFKny&+hAsUS2&J-QtvJeq$< zzzkr684$qmvKqyJjiC?^d~kqxz!&bYOW;-|IP`Ww#|aJxLKGjigD6&pD_#mw3|gEI zt$q;&5U3>xU3Cr4TcCQ}h6y~|>k`V&@S5GDm(>&GjBd!@^Uh-)o!4K)LmhO80T!K( z5IaCKmayQL25IX&{=x|AAW*9ZTzR|{K`8dO*_@-GMAHk| z9ntFx(*mjUU+jMfUXDBiY7i^|z`DU;hk|V9Wnd`aZ!HBG1JxG-%!q5^$cKh|_>0^}#L%^*dgGOzpLXUNG{K9c+~A3-G=5Fss3bvV#_~ zg0}v?1YPmr0XjgU8#FzR9H7gdgM0@OL8%yB__w)kuwewRHV5s& z1zIj<;j!!N83^$B{>bCtD^}3y)1XfI%d?=I*K6ty&Pn%QOox~O8kGT=!NkB&@NyM1 z0|P7zr$g<^w*uP*I^!Rtj+uc0WY-0c;|>a-%Rye2L5%$c&Vlz|IG`HK0x~ujqNLmp z;(A$#5^IpljytfhLQK5T?GV!Zz@ha(i6BS;+x@{$!K&}*sy zHSN4L*nKe5KsgE2R>Cw5l#5=T0Ovbbu=ByDZ3hYTnsP!zr4ejeiJC{R=^v<%@*qOO z9=)dCJ`f*7gM~n)x+~ZuutRepCY^(7GY6|FiTCI=JpdI_fe86{^qOvk3JF4lEIoQn zS3-sUfdd@uggH>5*AO9)6Z)Y-H^4%ra^SE6Eq4S}1p<&GO27*YU)}{}u3pm&e~6ox zLo{fDG#qze;f91dXssfL2S_gmvfhP^3=FW!CCwXRK$-_4Y+DS zs&qhC9l%;)NHxwSKWL3}9UQO6JUZ{c_+kmR(G==rP%#B!f|3R(?!auA*HN7Rhyjs~ zCxFen|6;j0*f3anmjfkCaO1Mqv=pkO1!5mei2_IoXn{Cv@VMFw5)v_Bqe>)TwNC+5 z+yyKS?ka<_iXy%cdhG~G1<*Xk4Y3%sk{_gz5m{sN2_~eN0s9%6^*|#w;9EC9d)QlM zL;5SAA!5+H3UuE9=mK_dYY&vK_E~a+$9SK)vopLncMH_DbiJ`J0;I9?_zMS4aAEes zqq7OD13ZHPITg0`0PNNx(7{eHEBLoHfYuNK4O8o`37}9xYHN3ISf3k-)p)W95}~cyn}=)s8o1xoPqg2blmMV=*$tQ(oU$- z!zfA_;7WO0l4D1PLRhSOp(wid6-b3ZMmI-9q3U=ht6YgWbX3 z3cBAOX|@E^jRI}G}b@TLr|kfYh*|p!r&8U;ae^$ZohH&@<^l2adv> z0KN@-0@$){@EF7o=-r>tm_6pvdH%(HGf=;y_5}D0QqXX1H|QQ|*B8)*>ic4tP?rLN z_8)_X%t52Ppw|E17CHU~HNA*18)t=1qewESuS z&mi=M-T<%F0xvfM-;#9$bW0Yf28Lf=Gyyah-TZ?E*2cdJs;|0T7l8ZkEWrqmi9iR{fH8tQN ztoQ2Qe-F@A)Gce_ose?KjbsGeD1*g~>))cdQ4ht9&;>H^AVD~D3tB?h0&*rwLTCpK z-hmPVH>5iP8aSW8zs>a^===uAPBG9WFB~40t}pnTb3t2p!BOP^NfZk}aRd_pPjG_@ z#|Iw0rWGEbdg%CzD@LFytprqUfP_n+!h0dYpb>qLa5z+W8CbX!RDXj~42K6VGXn#( z#jpUhB>@zz#~oNeRqIPo4-#B*^_mJo^`{Z39~4#4eZrvorA!aGLtLwdp`Qu2{fi;F zALRb6Q2oygLB1`O1UVCSk3EPDb@J+)ph(W9~l@JUV`p~^XO((%I5-YWiKuB=w+Sa1`1bJ{(LTmh{Vgg9qqnEV_q_~rHHHd=vwE!#+-l`1R^bb0( z0JOJN;5Ep@4?KEB`^`ZcwgMC;Oh8%p1Zvp4fDfmEj+`{ja|C(f_zO8H@CuC&9?i8M z7)pddt3JWaIM7@g3+Pr#qMIS01DP=c7FUBM-x=CqDRE{8?Fj}A6@o@|`XvAV_h>y( zg2!%mBqu?lsRT6j_`;*t^eV`(&f_mUpr(L2iXib$2Z(PCpyFWDQBITqb#y^TY|a4P z59ZNp>Ic>FPXZi1pm~uO4E!yyK>}D9@wa>hClJ>eumO#3hX@bQf(_6vKu~Lk13Wlf z0J>}qbN~Tp79FzssPx`z#tGon82qh}Myl(KeXu)o9RB_L4>ATU4{H`EvVj+>J%AQC zpsw$O;|?mIG7?z07Fw}E$tgL*E_ zKiEn@Q%^_&%q5`vW}!R2A3*lQ-+=7k1|>PTHQn&`DX5@_2}2@>zZE)r0Xh*IH1&Mp zwIaCZ0BJ+OS|TN&-Rz(qAZXGTa+*Qu4M+%GVBl|&2M^OCf*Iy9Pz)nEn5_g+j{79awC z0eB-9B;Y}T12X4jKBNgZ!=u-98Z@hI76T`3{?-aeNd=NqfyzyX%C*EGF2GPHG@Cp}FEPG*`S3MamVW z>Y&tj+(892@&ICb9Cr|au@Qj=p4F!?y@L8(;K+rfS0?b*dayw20r1UIU^YDFL9vP_ z)#6A)Oa#&p)DB31@wc==+Gr2D9aNfsF!HySLHQn_#q;156!!Lzh}@_NYBcb-g6_D5 zZGS!CaoiQuR%STvx(5_yFF}osZr42?h&@_S=Rq^k;G6p($3q`~kpViF2sRd4k`F2n zVI@)t=o}uLb@G58T`d-P&?-Z+(n>coIsX< zT~uy@WDQ6Z+*9O&2s#+N1}!ZE30pv2P{h*gx`Poa4JsQTMRDoeZr2^nFBm%ycr+hi zgNGLAFn7p$w|_st$$AC&R!~?8dLNSbSAdJKZZ41RC=QQK4v)?V4v%gx0gvt|36D+> z0guiI36E|s1&{714UbL_1&_`MP@%e_J9I~9fC@CCQ2YxjieJF}8wPbP#J`}^2|!nO zg7zJOJVwaBpj{O!xRD1xp~M zM%a}i`xtbxF361*FgKzue*`TKM;z<{U5O2eHjw)oKznFCx*Nc&OdXx}c}t)R2i!EOcZIt8_F zpZkjJi5I=JwK3NKrXrn_D>nYFi?>J_YY{~58XeA zvIXj&Dc3+_PGJ9l)I)i+?ns{`m=MaDqb00O22yWg!26O+)cdI3yH7 z{!suIUEM(j9{lSe{#k=C%mFl@2un*hK%N10E0N*{RNR7Wb%4dsk*je3fYd|%17?E! z6O1t11B-tm??B>5AEC?v;UAD?Apd|(L-9{LBosmZ(SZ5~U1!@~{%F#mkH0{0I{J=8y7CdfaX2(u%w_^0zW#6PJBWdR8PfGh*~2W%ROf3`zH z5#%2OsDD5%g7`-QVORok{JenqXAUB-CxADEcOHMCgYXAP9n>FSCdePhA+2Cg7-eAb z$H7|=e=J5QO8|{pgXb6s zd@Qc_x(Nw(3xrDWo+R)JM^MTEn}z9t3P_l}@aUcdRu3w5zd%~MppHLyqcf5pK=TS< zKkSBtJ?t`hxLRmg_2MGjKOiko|A3hw|4c>L03PoJFY-pIHmYtw{F8@J33dy-1O^S1 zfcynE6Xq{)3A_{%mY^H~I>QX)HLzA#p(Twl5*!mq-UC(H=-vZe{{ZqHSS{3hoCxoM zv_QQFW`ev2S*in$U~pRn(|fb8L%cT?(*1**5BDC(R*?6=W}xykgXu^fz3qm-gAiEAn$oVy$ALNB=$gSSX@D^6$7YOz-~L< zU;*WVo69fnGlEv*I8S)(FyXcBgx6LRUYk#NZ8G7t;e^+E6JBdic&#zvwd#b|N)uko z6I!$bYLP*Yjp{u9!dMdAa09s<+!Sg(Py*^q!TFuXUkD(SfEx!$O2GWi<1gMyz)b_=^^V5^%wbqy)_GJpLjPp#)sS zAt?d#JCDDxLnr|kB1lTW{LbSqq!CKM`4LG8nBRH)#Sd|~r@?6&NeP(WdHlsygc5MN zKvDwccOHMSNgTSg2Wd>a`3>@ppbz}p7;IEvOXG#X`~E@OlpsAw23xe*LduWoYHMc# zAL)rW;qnZmfY|{ZK7y{2v2 zkUx?TZ~>%d3sntyPB6EjG%;S3XKrJ3u4 zPVmeG%qJe*4JSbL3#_Zc-x>@lY_Jc1?mXlHK6Hf{G>`x~xCZP>=!D)2sTbg4 z>xV~Y6R3EA^cWk!OlTp9;ucki;h^)KKtm;iI1I#INcsi!)j*v}NH39p zJ!n@jXx%z=!t(&=oJiLjKA;QZA^k1TL^#xUkp9*Q@NvP7t}noK5vW6F?Ruc-B;@!r z=o~O;^Xvq02zR^w@ab&;bs9aueK*jVt)UA%x=TR=Iy*ooRsAm&_+L8Vf9VXw;j#+P z!D&SSv=jprx6ptG6^*Y!%a@?O$CdJ+rXtMyZ3Q+D^RQaPS)QQ&6Fjy-qrDII!ODbV zn^{2vjBUS zKA>JaXn7v^@Y%9wuzelAAjf+g2R8~~PVhM10BZ5UxW~Z>5XSR34nDg8#y#EuY6!r1 zD2@jWSs-E!`MkVt*B9Neg>j%`^1!F{_L}b1f)p(mML^@5;A3e)XW)Viht#nxpn{;= z^#=cT2Px3>BWR+r-o_R*v&i40%f!H-3t~3^VBv3!5T>-KPys{fIZQ1$} zo-IMAHiKIkpjr`S&JQ%T35p7635z`E2Pt9T+8~85f6FY0si29Y&6*Ie1^)*Z7Y87x z6d&;DW`NAYf>;gb8X!dt_CuYRV^4a^=A?c zS{%>7;BlNa62|Oho=4Py@UB95Cse`O--ES(1?g!7t)gPR7Q_XbX9bCS z^s=4+Deh$b2%>sfcR}PS<69GFY5^q)yY~2qIy}iAlkb_Kwg{}!Ua0e4KyQK1hTo46(sJ_ z%bEgG+{xMtqIy}wAad>?Ubm2RIw`{_GChf?jQWy zVFQal8lL@2>xA==B$`h#AxRtqXH-T=)dxB#ADs2OU70}3zM)H_K+6z8vx^>(Ob#lx zL4%6?+Z-fqK9qu{aRorLeZAnbOF-!noDngyIpppI(4`8{u}AQ!zRf@WmGVHRi(i83 zVo<}Ge|rO{EaTsPp!oqu>j7{sKY=U=+A?X3u9B(s0C-s_ib}@T1EugICP8~*K_i$P z-3}VfKbT8El@Ef?RB8e;(xbZoG%o-a_vm&A0Jn-DOC&mvzX)H&3YyJCn8^-xd~@v| z2G~C0BapG56W!p-p!vr?{?^@)PW}o0Z4*G1NAsh99bg8?M!48tEMmWr#I}RAfG_0% zvp||56%P1-Q_xTbV!RY2$-iv^sBz!?=m2Ok5zGb&gJutYFoI9zJ^^Mk@wc{u%MkE+ z%b>$BE_n2cu9X2zm%Bo4*gpOujvthoOQbw{MVFw;xPWC!LFeb4;NK3m27Fss!>NX} zPB0f_E3#u)JK(~|L%i9b!n;>A7S;Htd?1TUK~o(l#-}x&a$qEA0W2atU{|bxf~gaH z`o_!OkQVU;k6zP*vXDGm0kI5pg&}#CF~AFd*sl8%9#HFgAl9Lq+W_;#%WS9uaHKGo z=z@X`%w{P8&10i$g!}#_XipGGF{s8ttbld!K+Nl7(~q$D6D0P*XZ*pYGaoX~vA0UG?!2DIx9&>S>WmmUsXh*SaH`UBQAM+sur4<4{x*qrOY471G{ z;#`nzPoVk^fc2Gt)&ziruR?`af`v=58Fv6~9CXnDNZ)-qh%*Wy`Y^oQaOwce5ummo zs37#{HGQTC(Pa(Mh0V4GxNU8q+5ogfyw}tW>PlvaKG33elmJd^Jk`JoweK}(6&J{f z>`+bTxWOTXRTCRb6KKr>x{>f?14=Rc+a`ckoHjrD-T`KS#Ja(mv+)$ehyVW(`4^lJ zSxcc)4B)jN@RSYh5J5^4W~7pZg}?PM#J`|o8B`dhsUBcYvvpu8#c&!TY+r+Rc%W)% zz@h;ZJg{H|xf^Hd2QL)_oyraxe+N~+&=ZM4)tUliSsUCd&@m{`U=C<31=O+xPn3f! zK-591pixQCpcAMS43>l3 z#iO9sBIq!EP>&9aQ(yCgm7*5;9=$t26%1Gga&S0kEEE)Jp!p%tDh1Hlk(4et7Q9CrnGh&-T2GkA2jf^7k< zzkoEB5R;dnrBmST@|Enr{(CeZVD#t&oiq(vuId0 zg0IxO&4bAblT!mEl2RsfwUgVq~4 zXka+f45AM&QV`K~49m0SH+Q{_T)`p53k=(mDeS__t4ug36|K z1{isChk~xx`ry$CTKL@xb`^Nwd;`)-5bzyLpz&hR8T6n`hA9c&#CVDYG)xe>0~Bbm zRNL&j0d&yOhXC-I^wzEi_?xDI{TX@y6vFW1keMOdVW4^gz$vA?O-UC_ULW}XJJsE2GPNPsR7P5 z2r1Bs=go(hJUU^=^mTZ2g6=PJZP=xOJPJ|`@?NuR184>l-SNHP+oL-`J_j!k0u391 zhO5B2Oo$m2F0SA#y$r+#1r8%-#;=7Y0cC^*fbhe!iB!E~cZvOt0hx^)AZ20uY( z|2^-57yM(!5-9Fq2V&JSfgOdZ2ppCFL9#Gsg5$8;b%O^u`anySV8IS9y`Zb; zLGywP9^I`V&5(;BE8sj(Up31EW+Hg(57Z=Se!v7;W*mSn13KObYCA-2^P|6@9jk=Z zonnEi1G&PZ+X2*-1~oqgf18pe<+tBS$(0qWg^U!Nn$Q5T0_k))a9e?2}3qGp` zI#39@b`RqE-`wHIE zf-MQ=Z#4q<43K4EBW)5$GR+4-YX@(aCU=-b3sQ;fw%9S03QX%2;S2H+P$m*8Q}vn8=n1z z4Do?au>uv9phKxjK_l{DqmXhvs1pGiF#@k#0^J%5b#b>tL2tl+D5o=^;5Dcl1J>Mp z0JNkJG}i*=f(GLLfa@C6Fo0}H0?9%qBjEAn2p-!(8WQO>oyP}B3)YK3&AV0(P(o?m z3!)fGVm-RS0^qI#bEzMc>(LGBJ%D9E;SEU$pi9SinBXcL3_Q969H4%HMKq{(1^237 z_JZpJu)De)I9d;s)O#Fvod7C8;ab4!Lod7r-MIo<>kV2VIiU=CH3@iC8R(#RRR+*r zoYn*2k`kf}TyKJ|@c=D?bA>e6N_WAHg=AGw;oNxWLp|u)M6iosYim7VYgD1FCXeH; zps_4akpV4eKuPbyOA%r40(u8{G~P4Nv}pTB2aTcLqp+b_Re3jlg@+ zPI!Q_BY$f**a&bku>hZJBDilRB!nBd*%@AB%mat;1=NWg(6LtsAR7`u$KAz2vkuE2 zNUVd8*6aq?JCLdjTS)%U`qUh8rIzkVtRD8{s7h3$6GigIo_%OV|Ig?9-XZM z;Hd0{)TNMaMDJE`tq-lrJCDD}DPsan1pwZw$4NR+rhfiRPBFoUP$W%b0FG|f{gL#Wld#=Z3=+Y5|Exmz!PxYzXKF_&3i!< zLy4hBcPoem-fP$i$&WA*P`3*v30`pD>Duucv{$IZ1ELbu(hqDPOL>?)diR3D*P|Ot z#6U+eOy+}nzpzO8&(FZn?ApTET-(CV-}W2iJn+N}yas;x8#Ky{qrAKTItc{i?|n={ zprXol6FWP@i|4bzxfxtPdvroN&D~H6R$hYpsfZy9a1GDG-`WJW4AT9;Y-EBOZQu>o z2#p?SV;#_57^tuYEqZ|3>Ru*~Hz&uc+4x}Ai*YmHx;L#0{XT0Fi3GU6jgbX2qee2T=o?Q0mo$3H8 zp}Tt_7wkd;5$qSo{}=eTw?_Q_{~tV@2nt5f0n5l@whfH@E#jbCf{+y2ISL05cw*bNgM+#{D7lfMtl?{S$GoV~&2p5vjj=wO0a6u^^ zsrCkOLA5vdG-=3qD5waBRp7tCK?7|;3V>1&s96hZ=JlF7b3vM98TUcuoa+L}mFP*w zTfhAK|6hQq2~=BxGf1zg1XSsthe%3Gbi1d5lzMc7E)Rs3oS@s@UL1J@Y7&)z4liGD z+#vw8*!VRxQ#x^j3Z1=>{0GuE6_Og^SrJ;~rMyDU$~+)lu(}GGqro2Y=mgg&9`H^q zxP=61VR%4_`s1yjRuHJfL+h(ncMyO* z1a9l|w}RL5pqA>d!G{HdOI=3rUQ=ijxWoa{{9ORaUym6Huo~7C_QC zh(by}ATB8RFhcJhK%|}0so*9Yaz_l}VQ{w+e0F7sLIF*9-wSgL#8(x=y-3MNZzyVdW z5LL~J*8x7=x+c>>b*$?JpKb-HjgXUI@3Vssg#5|C&hX;ib5;iQV_>iD2OXUBVpczN zh0x1x$bJ~GyFgpyI$Jk@!*nWyf`m>dc%)DA&Ogwm>r&9co)j?X-H;Rq&fbs>u+U{bplS?!rXVs6+*!p88Z-q{M#I4njbK=94LWahW-O$79+?kGq71u z%?=hGovjle>ifLjrR2gHg}E{O9$j%o(GhY@11H8^SUH-&?a4&Mv*0e|aaMg|5* zngb2Kfu@2WgVNBz1Lub+3qf^8YXvAcn)iYz29)rPcnu3*HP8%HH$){Q*+R@l4-rt< zfJ3*F3AX~Ur#qcEji)e3Zj&4!qA5Ox+LBY0TL z@=zHML}Mpd5!SFQ1BWHVnh@+>x!}?BgR>k3F}0a2)_Me8Lj zwftaWU^w2I0*&0)9^GIzlBpog9*l>e;@~n75lJ8xxby?JwqJah^#6Y|*Z@X|dPs6F zS_KQz&f_oEzrb`lXzdVa)(liMP6b;Co566!Xa{s74Y%>PK70c%EWmDnl)%vOS9MTN z5Ylu5OG0XuYjc=EE7lA_&0dC=f4~iVXwwNf`0k1#pJxg_${RFKToUZjJ9PmletUbN zLr)O1!OgX#zW<6+%M11{e!b9kV|6+c1LWRi z8}Mvnw+EZQY0lK9EvJA0w1=PF9 zMw|j~n}Qvt7Y|k8(QA75ALzX4<1d&%8`e6Zt!%K#3p^l>TYzxf0;oP@lM7HxW(AK= zd-SHh03Sh*m;nOa#R|WXtJhQ!YHj!BfB%stmzv)|R#U?#n2x{L4H_GTFC`b;cK{N3 zv%j-3ylCzMM;>T(KDcWIj@^S01yvvgNoWd?4k>G{{Qx@j{xC$f4@k8MNOg1V0|xN% z5)Z(OGCM&Nk{^(q2%G=v1kE~tPI+wv zm*yAXb)%gJJubiU=)3^B6s7e*i5Tc&o#TfZ`yyz@_0$wWJ z>H4GF^-1#!M)1s3=fTU5Ixm2Xo&j=R9cXbn1H)@|3?<)hcz{*ZLRCPHIz+JoG&%Ug zgB5&a(!m!3{M!$pO7CK5U}ylZZD+jTaqxu#h5`?;3b20ArVFqt10*w=!S}sGw%qrE z7LLF#D_8{@fdr)*a3=*c#{~)k$OM<=p<2Ox*5H9~+mNqp3@>atz{v=7UpZ+18E768 zJWK+b33L6??Z5*&dJD8A1axgJbR$1#MvH%&1J{8U%>3I9K(_mWH-vyz6j^v!x_&4U z+-C=|==B#ih8LIH!4@GWCx{miOYlMIrStfUqoBeN;(qX4@m^5Ugsj^IU2Wt6J-P$L zhAyQ7rx0&G&rAQ$rhjm+7Nex0>J~MAGYTz9-Q2|9Y8ydOF*mUKsE??^m>4k zu}3H9P>xX0t-T(vK^qQ0vK$`Zc{JA_&|~62Ct-mW2ZJu{g+>)fhXB|$CrQ? z88mF@0hvd2{ef8B1nz%=#6gR{KvQxDz^gUEGYz28r-L57p!yTk{}u%oLg!zs>tqG> zr9p}xK*s-eLZX-FGaJK;FRkF{{Q;jWQUTSI;8+8nVhLI{19mAQ+(1WBX~0i!1C=SA zzMx|q9)P=}t`E8$cq|VUS$TBJa&&TnrYwH`WMlB?wY~R=jp4=No1h^u$Ym=3FGFqv zX>0uVAG!eL<$KUzKPW+=RN$bKHbHU20lnPn2IAC7s4#3A9wmK)X80d;I|%TvKL*MU zpj$pJKspxxFTIAI2L?Lj0-V>VU?w!N;L2_==Ri`=gHA7~!N+L2N(}{%m9_qovuG#LJ!73J6ssD z5*9q<3>ta|rQzfMFM$RoU?ziGW}wv}|1ZJU3|qUN0PO?4i|7Lvz0Lw9&|`fl(5?JfWy3S|p2Ef- z;1NL3(Qly1U`X35^oIvHu0U1)Ya_^*C+;)^jjSIY)~*luTR}ZnaAj!i`T(>x7gS{U z?(paa??VA!HhLUZoPdsVDhY)c4{lpf>MO`ntqtI1eP~q(Y9x2N?f`X@#6dB7@BwHo z18DH@0JyqDjdYD~0~qNOAtfJZ|22h?4!*?ezlWvk4$xvfPzprLmgGcrA~=V+f+HS# zRNq0ANT@YBd`t6d(DH3?9SLfCH2+{L1zjcjhWlN1DYfD=&bGV=qzpU=$s0k<>~A#`2QcYm>ATH_v!2f-4p?vEb4aPQ2o!qz|iUX z#-kgw{?GwZl0tGP=*-mC&yeoK=HsAI6<5fD*HXcKQ$#`I>b6f`voX9lTleojbkmMU zx2pu~%pmB3iq-?50ZHgw2x!cA!)wsOEwJ0VL3t9cp|=CHj2Z5b-hu*;?og1=JD{Dd zZ%0A(qbsOb+5l;Y9CrnEO&P#@g`_=tT{nO`{_y(R=JwD3kP}av_ku!!p(Ge&e7A#0 z>wyx`g%cn_#2R$)Ep(*@9^I`Vac~|0RrbxbAO7>Vg0`#eI{@+ayH{)sFRs=8`~UJ2 zC}BbeJ3%{nSWiCT0F7;d0=tyUxigMvr*RB)8T$}v!DL;!rv zBbqWu%FsOM(Rl*0f*-W?4DMQR$^Z@SgA8k~eZve2KUb(hATeY;t{*%OKH%_ZKEMoF zMji@^G6`^ic6)%1AOf)+JQzjsGH0EwCfpr|h82kU$Au=#{Y zhwFsbyl}2qhwB9X?XDBjROKI}LDqSJ_bzsVmZgL0bV%Xad_V%adj13`xoih1~P(Z z^B#2NWDjUj7r62PHyhwX5}+xc37}L13ij6=u(fo}wLJ{{Eg=7aN16^kV1+akBp^-! z_1#w>4O%FGgu#onK+PpkXBpN{1+k$i1T-knz`xBw0=xuyn8t)^dRhBWUT`Jz)a4EOlMsq3sGPC7@IO9-Xciz;_yedJmvI zBA`<70{=Gf?p+(UlBb|aG8mV=Veh+;LS{+aShPED^MhW>T77O1#w|<@=_8~fPl;ZdG818Dr|_&Or^ZAd;slKf=BAX z%dbl`LCYNe|NjrJB|(iOsGLgc0VHjpfni9fIDmp7?KLDAx~_nOArx+g0O*j4eGkOI z&4q1`*%)5TD?`*#y{7kHLNo^L2TwPa2=03bQQHMlTLe-I-RS+=18S&8H-k^N2dJ8c zWF$}{;sRusaWClZFj$S(4R$!B?cn(T;tn>@iAZz6v+J&)xSq+tz+m$Mo_?BZm!v=z zxIpcJ&W(fbAZ)I^zyRKb2kIMuGf?Y+(hx{~f)u^r6b#F~-3<>w=?=6A;uxrf0L{9v zR0)yo4qf2^UxWfaVsRE&Ep+n?#6ZY!yaFG1MR_gALU073Byw!Vb-LaFSAG||!L0`H zNa}w`$QnFiV|XD^3W^1A`xopTc!k>I}6K>}Zfu zP+t$E7c2lu!srS>Tl_!@z>Wmz0559*g&F8N4(2JKL1IhS9k8)F$Y?CM%(Unf=yqMw{DQUlhZKK1BO?PtC-QBIf1a~3bh9vd z%<$+H{qUR(RLj`?e*j82rS=}pdqH&|Ly6!%8;J8%K+fXh6xpoNy zf5!|qaB5BEZ|`GcVCZ&Tg0yDS11WrL;NjElxJ`G$&BKR8UJuihJxOlI;sImpfs%00Dm75G53$;(+xLeLxK#`qYlQC1+X}J~ z8YTa?g0y?|?ghCp9Ms`I{_+2RkLDu+tp`d?K}9*k%Vt(^m@$KPd?Q6JXgMKB7ibj; zB)%bbdUS&t|KJS;AZZUpn8KGzV1s%XO7vl_>=gkWmIFG8V+Lq@zy}Xb&<0#^*d2Vq zb90r7R#{oM9-nM(kJwTLij85_HcW#4_9l zq<}YTA~riRUhvR%odF86&mgD3w1XSZ@VG9025OA$d8rPwT@^gc2T3#F3<3%)2M453 z`U9#TkTz99?P)&10u7Isx0pd*K?+B>bqAlq0tFO~;2RD>m*+s-_F4@Zj&S9Z;L1UM z`2aN^ItBn&wecy$56Mt#`CH&aU`YPJlF=8u1!Z(_fI!XkX#N4u@j4KHg3}13LI$OK z@Zdd4rr(V_bj6`AI|**zfeuwcwhZop4^JQ-SOiuEi@_g|;70@!D98lB_9K#PK3EGl zdBcs1c>)V$P^ito5o*;?OF;)AfzGx;RR&5ndqCzuq6T-Wdk3mQ!8yvo!9yAD#h2H> z;z-%?kViLi#s;mh1aD(81DBb|;es3q%fZG##)I%hf*B~Kz}yNp3?3Yl9z#Oc1#A?; zMZGqleaVpMMRu77{GjC7FF^r`YMKkwv~Qqn4w?$o1_wSo^g!7KTiF6>Od-WBcuQr) zW26*_ODkkhA6;u45n5jdW8`K~P3{028U}j}XWYIP1=k|4)gY8SxKr>Nw1XNFXs#L_ zodV6Zdl(=S!${+K=u?T%nIuRj2)scWG&%*E59&Pr!gJQY{|6s1H~-)O?J9BwosP)A z?ErY47kK8S^Y{xjm=b|f&~Q1(51=_C&^GB09-W}Mj2xKK-!q}6DWE6?wX~s19brl@ zz?3?mCG!3P2$UF?wVIm{HeuI2~wP+bsrfeVcZ9-JUY zNHFlXT!Un*8y*K=NP*hAV5g~r)~T?Su!AUe*c>jjUFmwo;gh#Jw>3#6rCet-gjPGG(@acSs zzVh`NWbAW63T*6C6I{Ny-cbGj|37qt{t1tR52PUe1qE_y2^-iypripFB1B3WH{eMF zp)?(uusOhIhui?SsCRS-yj%kbGVq4^ztf~4~N@7xRCD%ZIcyxF;PD&&ZY zUeMNMpHA>@RiDmY&=$etu6IC#Y_Q#PpwTtxrXA493eerl;89f2h$v_vn17oCC;zqs z{Ob>)9(e&tGT@DdkR03q+hW=2`r@TC2Ye_7TztXD>{@HUOCv#~P^mlI9pFJV$OvnR zp+_&P4rmWmC#ZYd3ieC414p+5PwRnF&@NcW6`}zwV3RuqUJG`EP3=7X!X_0|Ke=82 z-2}(qDgtS2fIe1Z`+K}wg4T)38oF=#~wu4M`fo>QC4L(_TD7rpq-U|v?))IXPgOk7YG$HkAtZXKsyS+Y)01yuU#Sj zN-YHqNIZZP@jpNtnL$N9h%cb}0MzjXcY7Yd3-1Tu5lGM)4bZ&n1CMU-X#n8LgTG}r z=x%s$xCxb7VNH-Kuz-W7LeQ85G!_1Vrb5UJ8hRlAzX1tkbx>CgY)NW~G{h6^B|;De zPYEZ4!BMIUv%mBB3zjrc&3zbVH|R|N)PMgyG!J`p-tf?LeehZwqKgHlJ*AWt6ktqX z2Z3@nc-$O1A`YS8=7dj9Drcef!L8p#EbigiH>UISWU4!=QgU)qABsHkpIl;#% zf>&Ib+yq4+E(hj5U}~;C!vJc4fX)JP1uaMtc*zCs41)4IC|$rz7vgUPO+v#01v01y zDJA$@wt>^F>jPB=28IUEDHYtX+oE=W$Kk=9ZCL1`#M};0O%3ToxUPWS3JALE2|Ps) zS`UhpMZt@5UU+~GxdfM^9*m%pVFP3U<^Lrl^F6v@Y8gCwJy>AJ0f5y*Z)^R3>7^<& z1A`Bwob~A53n|+`C-;KZ;DN580jJC?hW}eZxgN1>b|Pp^0C*IEzx5sy0|VG|FF$|_ zIM){*plKgV*M>6CF_14H%~ptDH-m@ep;B3Jk^m{{hBWwE50r2ocfAAJ3-Fp9S||8) z`#$giwQ;+9!L>*?^bDk}5Jy7xLid8#&WC&S?gfnqgJ{q&SNQ)@3GnI3;DYHCsBhDJ z#Gv^H8-M#j(4;r=sF~Dt#HbnHb=asGxOCm8BL%K{f1Y7uc%hf@??0p%2koGMEoldj zu9`uVT>>fF6%QKl1BV)Tv>LoJ2ohhQ)C4-MVJpa~=wS}g(fo!Z5E96+{+;9hOVH68 zWk?wJfbLZX)tUR8Al62Mtep`5@Bf6?j1xdE1dUchJ5{a^UV^%9kc=tB-wGbogzi*F zO}*#9sTZsbGXXCECt%PT1JG7INch7lK+rXE7)1~0_#x0lAlN+6@k*~jv)`bo@qkPa zE&vH)O{^R!33UdE33~!e{cHbjaMJMT22cL^bVC{+u%lH_l6N>Hb%R>?J3qrm$N0eE z4Z1%7vhA_i^#y22!V3>;*9QKk_22(PTVma@NL>#PNY@RqQnSF$yUJ%bs67VWc=jOexPufk=xB-u(1T$?haiH^lZ37d1{L-oE_6jD z=&C$$n-IAj*8Ii-wxsL0>l0z{9!u8~9=)cS7a$hiSqdr5TW^;rbccf051;Vpyax(` zf|cN%NziSSr@&ifLP6~X*kMjNY~U#gsDhPX1>hN9NZANGK?Zz>DB8Lm&>Ac70w{OT zHaEm}=M+*5;q>TbZMe+F@S5GDm$msa8)zNp3D7+*o!4Kmg1iMfZDlDqJrn6HkcoOQ z6Ae*KELsi^C@;{`=@Sazo&zkjoK}EB3pC;hvJ2E(KwHkoZNpK@4jBPp-2pmyxYIcR zwnsG=Qp>;s2{dgBo9qW&OO3HCjK5_X#9Ifz1IqlZ?GP>~VjC_&B9?gxcsi{VbiE)* zJOe7eY8k3O9=u2KN7Zr){IL`~)CURxaJw1VA4ed)I+zz>mE~HHa4+lDBOIWGK`&l{ zmM9=5dq5_^gA#JCGo%(N1uZ8$;L%%q19Flx^rD4cR-XeLh+~~U<)9zy%mQ)X4aDiq zH&BjsMwUQ1*7*kHSZ8Jr(1~=QHIa~6xh=1ecfTwHReQ~@FCgogA#43x^+2Qapwr$! ztB@hOT9}YCP60?4NV3=T+!;vRxi5mp5&Lmx@OEZ!8t64OIss9kic`g>;}8|hI8_*) zgs6D95SJ}JPkNw|-y4BJpyRgTk+gh2ERuRf z_0K{a!E} zR56g7Mj6r4sK86GzoAA$xAUM>R*a51mw0VMTcTBCw02U^$NDq>U7}ywGHw zp8=0sF<5Eu%Lr>H!wy}hAgWy2 zX8;Gd!Q+9FnxS{5g4U*k?tqwc43dyP&jDHM3cbPuw4Wa&TL+b$0!rqfT`r)bW=s4% zz*n)jzSt$q)W85~O1?-~08SpDL-IjAcFd*f-~_!3G-3Rjbr&QETz_;11i%tAXj}-j ziKqbDCj#5G)oUts0^(E;6sHRA+XpFist&L*yhsWL^(#Ol-45Vo2B1-R&>k94v|)D^ zc=QIe>I}4B0o)Dw(G6Rf_ye*sk+1>$>s_CKHWYxyGeBE+ERgO=g$%Mcz5%U|_2}FS zIO?`LvP;bkqe{98?m6XXU`nWXKU_kiH3G zDIAJucLR877i54CY%4@Ld<`7v_=X9fM#yW(AUEWM)mE^RKtrO?X&W#F8yNi#jf2B$ zK@D;KR&Q{N0dh_bsD6WtU4RFEpleaAT^ou(Gp=AUZPx~*<#XVpS)uKK_26nA>H+Zb zl^rjuAXVHB@U%V)XdOT_TqFa;^?`Cdx*1>&41+pQ3F5#O=y3TCkP^@t5+1##_E07N z*MR-d!iHoDc(X&V>9M1bq;?0Y1ai?EI3Bt|hiI1W@aP7+)v@yexC;vI2!px>dMiQW zTHv7>kLJCgB?j;_9@aosR_(x8;Rzndgibqx&jkYYd|`_qI$bxs29*$?bvclYmzLo1 zH}LR0SP(ilR4U@p?79Ke_uAlL4PMb%bOL;k9K_iU2CWA`GhYy=bsm3Fuo`r-4(J3~ zh+-MAV$h5Zcwh7mkLFs?8l>uf|NnzzKs?YeE;xO3J4o;{FtC76KLrbb?zI99OT0V| zzIhiMHkfO@TA^bCSW+W+e;g<^f<|s9ppM+St^f}Nf@DGGL$3g@&4iC|LF|Gw9iM@g zcXvX%)6k_nuu@qMi^Cw3ot+cFYtbMPisoqO+HmkHG|Wn9 z2;$(@l_39sdcKfxXjX7V*6F$cbRiB@2s{P@+MnI+x&XSwRS3FThksiGWN9K1>CqhQ zQjihQ7yu1SgA3no2M&!I1Zj%0M*;DZIiF-z)dvJ)Yu`=04Z1jY|aGK zHHRw%t?2|!*1%>Fz=K{BWx!41yF1w!UL5rSRZdU?AdA}J`?H~^ehTiJ4AHO#q+tq3 z!*N$oLjg3R1j#n=9-l{Ns|C3C1c@xr^bb^^fruF(a4G?pHsB-JVCS~Eo_P5VKFR=3 zL*QvDXd@o7A*NLYVl`OC+O?q=w3h>XRPk#k*uXE2l;H|F)38JeoU1|e%b*pwpc&*D zppyOvTgeM>bbtrwzyS*CdprY8s_q5ZD$m~znhooQI03eHs+X1dFk*=EJ1C`rFVg}W z1)4&HmJ^`8h~N?tl>NZ1!cNdaim8w^0pCx(?h9xJ09JT>1dTxSP6ay#)B%8$Hf9Gv z3BvWl>kx<~J|2*a4IXtU1juq~ ze?9=7DZjCejp4=KxuBWyN05#bc=XZn|5eB|d8I3Cn%o}LFaa6M-%<*)p&PWjuon{8 zpyg`dxwOLvkt3N0q@~++26S~HPXl=5X9nW(su_?`4yKpNAQK^mL#~*_W_TLdaQ@bx z@cztdkT&Eb!VQjN{uXIS!40ZhKsf-EO!y(q63}5G{H@KP9z`#!{8@s@xo{%M}bEbgX@VuaHt!U@Oy@xmv z6oBC54Za~0abdmNm;e7?gBCb|)`3B0ZXri%gGai+DHP1_oB$sE1chA*=*<2L9^L4X zqIUo}QpyqbLNe?G(2=9ij0P5IKE&hE2^M_`I`*YsK1c1vw4v%hZ%Jme%%EchcLBn(tUUN-&&5oRx`CIzo zWmpP-OB2{kaM=KAoI+O~OasU9@fS&pKviT(0<`o1sem>L8lWm1AS&#TR6tv=9J@j3 zY5p4heD?{)=a|)oa04wC*4%*T315%LR2xnw?%{BoXd5Gx& zbYFry(-;AP7!?BTKml!Gg7=e?K?O9lG~wTV0D6N@X)H+C1GG`E^*||TaoGig8u0aV zC0ZaA$bz6X&7ey~QB*R4mfi1rDGP33)NEv9c#+})YG8oQZ~$-ZzX9$`f|p!G*09uy_-U$M#*ln0fK=TqvdZ8ZTZ@CAFT~LJsxfr07 z3mjN4AuUo@Bt76Qr2MVW)kL6!Y`_IVH_CJfOc*i@4n6^Y+b-x##?D>fnT#LMnG9>t zaYmqJ@1RQ|N(J}v%7KF;cLN*4i%@51aDZ;2?F9APKxfkgfW`tYcyxm17*Y5c;OSP- z3Wr|M(TJ{~DQ*j}KVBDsA_N*`pgakhqjZP>mDN9(L1Rlue3lZyeaa9=yjai1@Zy3K z%n=R|&;uwymK(rL1RqTgin9O>h-Hv5NThU#en?QSY40XT4!7+Fm+6pE8_=~s@p&!s2b4S2JZ9VcNIG`}!b>{_`3(h8MT(!HI4HsDg%W z;eZUGxK04K9{5|KyMRHLcL#5VB<2FpsYIX^yU>%Wra=r`1TwG-V&DvT_Z(hcfL4~l zgptaNZ`;`zUJH2ivNG*}792b~AlB@d{qw&ExJ3fKn+a4J!1ROa9LUTfsAmb9nFlvt zkc^!VGj=tI0h(Fex*c2|eemdP0__Jt?DGfRIu5#d;loP?NQVk^OAK@g%ZF|U2~`G$ z1_n_4Ut|Fd#)B3Fg2swB>;fIn>(Ogk2r{_y_=|{Hpq2oC>myKx1YJG_Dxq2rl!C6A z0G+Dk0nU4>pdJcD)&sJVWCQf97l}C#{mc++K)Lj>3xCB&nE&vsI4?tTMLDedR2fFYSv|Ji=`&v1)Tv{?4WM?Vps#1`B;FI5a zO(UVQZD3jcmO`j2psDj^B7_eQfwvnVF%~uxWEy|#8&F&DxGQLrKPaR=pmek!K~hV} zDmI1}F}C332Uh^^WkXxXg8QC8RJ(yx>p@h55-aHX^9!#*2aSN%=7D1G1mtEwu)jgI zuo$G(=wJc6{>lTizzw{&4K#fq0J?Dnd|?B4dJnV#4%B-GZKw4B?O!Tg;?e91S{&yJ zUiRkEe1O#h+z*5&Hl#EN+KvZHn$R@J;&Cw*wAc7Rw*wET^9mlgJ^=3efvS9P-3Cf{ zn8WYTX$;U^bT=SdKA;zjxlY&zj-$@wFV=2FZhB7yAMy-Z0|`2o4Sd8gD2zZmY9XsB zLH9$0ayaPfqfXa1pe0FfK*cj;-sk}Mk~HF6#lPP54d{3w(D*snSuaCDaSgtr4x9z? zhYDz6!qiRBd_Dt|%D{JX9rNhC{z4L*ct9tdf}G-D;Q^`KA+|sdjDi$OpmnX_4c8v9 z8P8JCO~e~^fe)kYHFX6U+u|8^yP=5((j=af0m?$5 zuwo6O0&-XZWP}hJnxK;(_Jgc?@z)gA_m1FXV3+_JGX@0;+&tMQ#=uYj>ZKV9fllG%pK{D>)l zN5DVjK+Ay==tSQ>4$zjdKMW;ATLa!abV?ArHDJjnT^QDcgO=@pwkg1>NnHK_&4z*e zk%`R$m}E1i1>Yc}nxNW~1)55XKtNY6Q%`UAx#QU0(h_jQcM`ugO?)kw?GFg2*(cx)biJS zSbPVQWW}_+0%7^dB@oNE)Pb7{kZfKmxUXCu+zorSh>hXJIa5$kLPThDLfsRM%{?&5 z(sqo{egSFw5cV)5)Pi5USUe1q6v4EhomdN4p%%=izOnN3PCN{!i^<}V3OxrFoMVtJp4<91;S7Zg0Wculg!1m-~puM-+|dl03d^89qjHDXW1cnJiRD(x@ z_?AE$d%~dd2XtR3S?!X*2f5J3vH70a*?Xdo7{jjc2E#&K8B<&q4q3!7`dFn~iTZVm@z z_3zX<;Ps;<nGkAE@Bb3E5fHITdn<1>_(#==3qH zi3IBSLzj$zJEWj(PY~sx4X=<%;ckZv(5`L%7SNmubTSy!0Rah?3hv`p09QJNbJ!SO zMCyYp9Z(k#%K#%x7%54GE`uhih-I)2Jvd3-DhJnW@PqyMA(rrfEcv1by8p^`0=Rnz zy~hZ&3Z~lwbQBL{`!cxu0=0*Ihd{&3`>$C+RKEvkN($WA{(sS<+4TZw>j^{)XoeTu z#J}Ltd2GLG#RF#0?goeoaFBF6c&IWkz*h8ux?C^C!EGk+>H*NGIdoSG*Z|HS3P=W^ zS^*1J4-Zxb1_=`n&{0#MvB+Z{o#(;ZWFYo|=9WPdrw*V?z{&*oDL?{&eKs4zi}$+V zkVYIL2QxFnqZf3&CaAyz?J8#U=nMqyS^zBs0wpJK6AV0L4B21@HXm}fGr|PW1T|=o z7QE!e13Zokn!ty+3VO1$;66Qwb1G)BF}z5CI0xLjDOd!apoJXpRw}s95TY&sq|O4O z4z%JL+(QS?)*C?-=z|o9qba}~L@EwK*P-^5a%B6fb56*0a?5E|I%yF4mKp^pk26ll!JSNy`~BCpygi) zIE!omZH$Io!3uRa2dHmTBghC^ybju^_yBS$;K2tRkn2gnYtul-RYDIdgvGlD_zrvU zafKjlA0WtxUZ@)j;R*7doAw!VGjm3urLQblD<^14Y5Ypuul& zIs&D>kN;ophE$iJajO&aAqwAgfb^GYL!$q@anNc_hL?~fJ7B9mPluSW z3Sxo{R3$bOAmI#-ERSx;Rj$y2uT$Wq8pu(-qKl`33L)1O(2=+hu&JQ)Geu{i%27zs(G*4!6D!X)rn~yWRECly#n-VcCeY? z6X(Dzh>u?&K+9fP_^D^Upd$&v3LvxIt3lgbA+-^7a2m9E47N%N zJXZo5*##{^fo#hKN4UcRNQCcf0|gj=EBG2bQ0DA4m4QmlF9hcc$oOfg;J!(a^5WuD zHij2FHNfQs=zIj&iB}*twEP1F10+bn?gZB<;6h{pbZiP#F@VZ_a2bt=67cbS9w3*3 zuG~ZN0^IXL9-R|Fvw1IO<@#EE2kRMAcpv$>1+n4sJ zGLRq#tub)@;L&T!1I=Ci1>km4so=i3kdQb&g^l6GdUa4pK$oe3(iP-5R?zL%V3&di zlE6s|y3Y%A4iY$kx*4Eby+9|`LPa3Ey}-&nIw8m8BTZa2z5zD|I`@JXPIYdDE`5Sf zAiEtLzyr9Tss3Kmlv!-x5uWS$;CKWrmjLg|lAHrAc)@ETK?|S2gZHof!RAXEvR5j&?-WEl8zdeK5(n+afkZFpXxx``A$?8IXf@g>u@7kWx;M1J zquUpB+WZMfvFrH%0(8$Q_+(03P{WwN{U@k920GZTpjgwR`G;^x2#Dlwe+Uw9{=v-O zvK5rTntyQdw}4KTd3gdPp$qP0H~-M!ZwKx5LRu{}X&z#=P#dUTfh^vFM1%q~BK-2e z5do=aN(J{lf_SxI5*x#d3{`OOV(}Jii+-nT$4f7eE1=gAg6iUKhX7C=<)i{WIJx7c z7D&FAwRi?7=3QUBmhk9htp^wFt}kA5d-Ss2m<*8tw?(=k>+K-b@y1+K$9;o1?(sx6 zh8L$*z>Whg*H!QUx#JKM=q_T{4$#Q^%dJojXi@yj6(CM8D;LyKkK?WnK;zG^g*|#% zqhXdGcYUA%3SLly2*nXP$c`uht$qjD2|hAY3Oozb?O*_EdoXx>FMZ$va)|{KxFH5o zW`Qar2a8fiN~>!n>gUTy$YeBH3yM?fx{2NnSbakoPOyv6Xc4J;0t-v!T0 zfDRZ2cSk_+3DTDalJ8|zn*@s~un~|}G1_7{R?spP@L}Gdovsjdkl1{jjT)O?5ci9M z-2Ybz?tXkB3tbg~C1j6);|}cC<`+zzpldifUakiV!gIVwH>5BJ`DhA63S4MGMstz6 z$e`*DNd{8(g8P3jra-$iZ>NA-6H~#eART2EnD@Ft%`ecUl&&4GK_`ZS)%2RSf^>8q ze{lzL4iV@8YLGv`iT5=Jbn7`}8#Um=34Ar&wf&&u5dL3y?FF|1)NTh=NufJD zy2&yNynr8cb`3O0Kn9|vf6$~Lc$Fh)&JcF^Hpoq#pi`N_JE5z=+35I-OP~oMP>UOU z6IZ>*ad3?dYJ+$j2X{L`MH#~Jpt;ivuLB{gTwoO*Xy(=fvZi|ltRd4Kx&U&>>miR` z@JakIGa!w#i5j3bKX`o&Xl@m{Od7NW0JIB{8C)P9e_;x797LACMGlk_5SKZE90A&N zaliv|(zOTVR!UHD3z7oWuO6V=&_E|GK$qel%x zV7G$0l;CCt>Y^r?Ff`GC<}4phg=Wwv;6`{TY^363`SVmh8Woxy1ga?LxaOhDOc|3exaUOPOXCn1AVK7WTUq@@GCz#{=PR0CU? zR|;Bq3)aPr$%{z!#+7Ba5ev~gN@;ZvJB|j z3$O{`VaHC_4=?i|%?MC>0htC~5(7G%h5=eEfciiR9=)QAn?ScjTmUbk?_em6Z?1jA zP!b6qcK|7O0G+@OQn!Hb|9=n53#E1tDFGiykEVMsC`Ea6gO)g#E&$g!&2KpVmp<_A zJm}a7y5#0X3_s)ui%!=oukD+`>KRJdJi2Q;UbBJ7PYszwNIQXi3%BUB0bb|$fqz>7XvO}EjsQt;J_EOMAdN>*`>Xj7AJ_zNJ^v!DGe8P?pdNA%3w#m* zH16*KDki}v3W0pn0m`e8^F2WW@u0ndplgKxU-W=0fmJm>AO|RcltFg|gS-zKz6BYC ztP11}@VS4E{BUDvx6eJ2*dVAr~3n{Sp zw>wxMr8k5FkX3??9{Rw)-N6dGN=S}!1(^xzyn}auzMCsC1?d3NTnS?m7t?bK`I>x zsstSe3sUJsP$ej-gH*Z@R0+D<0Ho3lNhSU?1dB3AR)m)Pkn97#PZuhWS@J{GfS283 zQG`+UV^PBcPVLb01xMKdDbFCQHo@B(5a|}#O(;bbD9vH94yC99#XS}^C`A=0+_9*E z6jd<)BbN%0Km=EhC}kBW*}m{N?%)CKi-FhyAU1Jv1J8Bcz8|_dJ5Pc)kboyS;WYq6 zN$3l3#SBvB$pTV$4Kx`F>gqtfft)izH5n)`abU?L5aYo495kU0Qidf1Ll#wnM)H~u z2|$KkJuSfVKIcI#1DNBGErpdD1oAm320@k*C|qEr29|t|>^23E+qyj+2!#l&*npQV z#6=Gz)}dJklA3Weh)_}>DEy((f}E0(+f}&QUMQIh6joTwLCIX81c*fqG;@JsuoG7W zkCL-+ASWBhDrNA3T+r4aaH|W8 zGEk6$k_~~>1xwQKct(^d$d-aiB#>zY5+N)}V@ZU_rh%dfWEz3&220Wwuv|&)G>DSE zIB07+B3vO$#UYJPl+-Iglncm9E%2bGhaE_Mg_NG)!Wh(t{ov8yP~apWzSMH37Lf4ZKek(H;8%F7=_^u^S$pPH54JZp#h4{UipkQ;&nQBGe*S zItKM!Kv@x`12o~};ZTpxr{F!O-JpGH3^w(p+MwXz-{!z*<5~(D5BkBs&4J0r2Xt@- zNQncpjT`D2JEPgzNhM|9{Y}ct03R6qBE9Be}s2$+$C3x^3GWflq8{FUnnF#74SRUeUQG$%aEa+|!U<57wD*-LLgDLXY4JOSIRa>ApV zq1%B26gSW4o&fRzXaxbZ2Ly769?0fy*BNj( zgX+>5-4j3#MN`Vm28q>X*At+c2<#Hj;7u@i-US{FOyHaMK+)9g5Yl{t3DlAV2X|*c z$ZODPyP&|cNNfJV4BDv!mH{htKvoE~+99p=Knds&c&Kp=XBg2`EdZSp05$|X=mZ{Z zc)|VW?|;alO0El_Ashpmpzj8y4A2&0um+FLfC{KRE}&iKofkX~K41bJz7M;N~E(_woBe25m8IU;!s2!j&nHNf6ZO$GZpv}Y3!gW8SS3z}p5vSNJi!>;)%MSUCYc<^fht zfTyE7kH0XK0GAUQ{H;+e3=E(nb8-3C^#y1fS}*v(VW|C3t0#Z@{~xDLm|Ky21X2q= zp$RgO20GG203?RbX3&fYNAm+FaQ5BEK-j4lx*b@We{k@(fN}^Crh5?O1Pc$)eZr?e zdDNrZgTtfq0wfN;fAr|Q06HBVIaNOShny;#U7vvN3WcQ)OV=m-P4WN0Gf*HgH&B`e zwZ*|4P{Mg&f_oUih|Rm0)OizZ~_iJ;L!^`bp&E8#KQ2; z|Nl3;?qT$3c0B;Z}AODX6q4VVzjrYOj4A6O??46-V-1CiFiWy=;3 zM$jZpgGY01149XD*L4GA6Enz9CE&v;Am@cKf=`8Wy#U#{56WktSxLy$B7bWrxD-R|G(2I7y-N8oyLMxv;;Dyhj7d$$h0w8I_Apmp@JNV2M=*rjsplQo)&^^5@%|BR5Igh)7 z)&VhqCj}uTB_~)AG(7VfdP5HfNKdaVM->~x3w8$3H32^u_*?FQvm|(eKLFGog>ImK zxehE2_Pj^8Lqd1xAILI+3!vGdPS+J6fzAu)w`6Ys)vMq}7T8Ci8vlV4^mgPG;3P7!_xIbDMz>Kn@-mkpyNOg)6u=6-%=ry zm7ua3I(IDq3NTJ+qZ@o88dw6f$)Oi^%^W0AfRoj-2u6lZ*B78_yAnB=XE1?o=X}xW z3OYJ?1<2>1*-!AYC(!9%NFw07m%)Ap`_l3dX!T_%Xr(KXH8stk%nDj)>v{tkk!BDZ z4nE)j<#&+Z9VEIL__rNkyZ~931SdMWs>@ zaSIiO#Vxo^1ddy<1SD?3%x-A#faCU57$|O^G}k_1K#5z>`s;4jCy=;>c^0x4z#Vh| z7b3PX<5tZBd}KPZH47TSamxcLJ|J=XI=0*O2`pkkp@JN-;HA|bpq*2_&=m_%!$2cL zFE+f#8l_&Kvp`|9t0+^U4j!Gg;FFL#L(jZ+^XLWL5d*qw6?FO-*hB-+C77Vo;d?=s zH$pp?unPJ(Kd3zZp-{pOz6<8HIA}kNL$~Xh-hls|p=VkTl&%FAu_#tT4kiIDaDjJb zL913_2PS}5^?(ir>J4208o2~@RG{t4_n@0jx?N|0TO06YD}utH_C~2P_<*lo(A6AJ zSHil$iV#1ubrXA z8MJ2rH{gK>;~{X;=Q#>0O2Kokj3>bN+Q3h-V|WRRESOskSi1fxS__@NQGjgff%q00 z0;)n_zk=3>!kypk3tBn!U>~d{Z^Q>`z=5vKfh$2Ys6h_2JXnHbYZ~mxV^E}dbb{}k z@qpBRol|W<4S?gWASniql7MPaXr_Z`?QZa326dxLK`Um!nn5>8q8QF<0BV9lE-OPavAe+stP|9B zKvCb_@B>tVwH_z|T~LgoBLJeq5_a7U#0?(Z4Gf^Fx%B{O@CIU5=kXU#MbM0T{J{VJ z|Np<73F#W&fUH3RD+4D?XjD}RfJR&Xm-2W()kAJu2Je=V@HqH_1-#Y-bf6yS_)^$e zp{}4cr6*oWK)R#2%$7qpn-}aB&~7b6&B_XC=z~2BX(2U$R+V?ULJw1cJM03)GO*3y z+;;E*3uuwdQw~r4Pw<3CuZMw0 zFL*WME=X|;+S>PGatLVI3us{({?O|39e183be7{{L6*3gtlhOrV&Cq@PRO$}^S}XV@6wr#FUeQG{pfRcdh1ca!L(-amd<2K)36EaU7MN@#LiSTB#IRn`v?z#P z#Fja*Ghge#6ob|}fft4KidscO)PnZgxq^(=gc=Qvaahv=ydLj_2l(a=P_Q{DfY%~w zf?@$|I{!9slkmU`7VwBBQ%NvrNnLX5ffDxSAB-j9uOmPe$u0?Mizpb0k)R2x7`Zb&-2 zc!Pm~fBRI3gzJg4&VUGLRDc_{kPB2G*J8PXjxzuq^AA3lZ~~+N1ub*~CtFBw2E4cS zM1n`N>k9B_iHEi84F0BVe?Ykdq71TJ3Oo=3?fHU_1Zh10KJlmnyeX#Jbp|M~K&t>D zn!s*#1kcZ&@X&TW;BoK=xST}0juLd#@m^57lL2&T0;t9YokR^OoL|d98_XWP0UREk zkh93UK^aT{bSNii-QWW7Zl=!A1s<&j>Mz2SL$8$ptse!iP}=}1WEc7V{10CC3Kjw{ zdF=-Yb-T`ZZH3aQhC~Laoe0*L2~q`GQIF6V1`>kQHXe;fK&2!48K8}Cz(WpLm-G5S zj{f%PgtjYT*TX`Vo`V`e@EHeijsX|uoyTA7V*;0(uwi>kQ0)xcQw=JBT|1CV-(*fm z=_`t?3{O)YI0ep-zXmTCq2nEnW&e|&+CF0GsS9nSU z_uT@Oy}h;(*=!6ixIX^<5AUBt+RmWmtXZIuoZ2fqrIH?yW+v$P#SUl@{POYt|F88u zdP6~rC6OhHKzC|`)?9)+s^C&`*LM2w&jxf_rroM72TkSwSTjnat-fL;IQ z(HXj<({~G`;{_QD12-x`Yt0=ZKqGR{BTXeh_m0+XVc>851PR&$pi&w%HdDe4(%tQl z0Xh{Pe30VH*RYfZ8IS=b0?>pz=#GOQ9^GEB+i5>~fI2Fm6bZk17IKmfs1XVZdC&^k z&<`HnMKB%T5O;QfZjwC!8rnJN0a}6pIz*T8f`{e762W~|pk`CA?X(Owh8G_1{(>&c z19gT$(-9zNfHw1&RDncc9Sd%uHy2p#AG?P&wW1hRYKSDeDG&kKVrnTL!U!n#be89>)?`tI-n zx1m65Ig!@cH^1TNuH6D!CHx{7yiMqc0Qh`UkX5f!Al~%x0IgbuTXw;xSA@w2yom^W zo973QZs?+YsA0aH2Yoxi*JCnZ7zrJ001cD{M1bQPDQSU@NCmG5hK^V_G%zzTAPo(o z%6B*9ph`m)7ekiif?Nz90st+n1@8kW5!?@I5WeVo@%KNdcxHGFI^g96tWVV4PyuQw zf?@-_*f|J1C*IAlPal+GJCDB*_5ArCv=?tYT+9oZieeLX9mqWyH2rTEWOCT&2=iMP4t7YM6&q@Qz__5UWn^J z6U#iU2TH_W??)UW0=lTW`3Ga^e8`M4NF{tmxnB}oiGajBI-5YCAifJlP#cIXR_Uf&5YZQ$m^i=fNkRtVTwlvW5ROFw|jx4uA{M1`)Ze}FRI3RM6a z(}hZa=36I$V!GS)0erp{w3HfEDQN1|@=yur81x6w*~`VCLbaFmStY1V?E2xgGh_$> zIyqblUTX;+mV(vgpra^nU^+AoG)@F6fnAZ;-1P(JuZ$eib+-^WEDD=QZ5~QMr^~S*&H2^l^k_bX50@ZVMzW#t4S01=C(7|a$6Y~(7BC>r z83wn^x*I?xTTpICJzw<4SJkl;BVmtX#wrT=Wk&G zF+p_*?Cy(h*As9@-f{+aw0FR_x_7%CfJ^QLOM<-#FS|j52(BBTX~pBX>j%&v5u|Yi zD*wTbWC0J!xITb1+(2zd@Zz4Aj-X;6R9zss#DnnyWHt$ONe4IyAS4gKB|n3k(I5*z z6^!c#(1j_Wg{va1pi&K7=QCb_3@g992v^JC(GA@c73AU3dEF5dQw&HO(mId5nD&eX zG;MeTJUPeT`Wsp0+#vLVJV0M$tR+Zb#d_*)|&Lg3qc zL9JiSL!jC5<^zo2aDap#BsD4sg9`)54Kw^LSy(lKTd5CF2T_~AQ2`17(9pyJ4~P|D zl`}jTFB}66en1Ke&=QJH@Bk7v|1Nt9^)Gl#3)yMYK~4j;SovGJ!KIVy4N%MR2V)7S zT!pZi_*;q~axah)3~06k8ulR&*$2?cD^Pxb^mAV0;qQnT3G|l8{mmRv{us&aMccSuLJ1tpbw}wbbyX!ZgzbE zGUtJZwd)H0rj398|8K7S!@%E~3mz{3jdmS>VPOZ((FZ_X4jnsKm%|!;?i#X-lLs_d z0#eBY(gi9nz};-H=J&SPHkE;AS$E({+YVC#dbB3UbR{tH4yJ(^6Axe+Guz3to3T`#RTI6RSE8hgbwE}1q5qzEi>_{8XwsO$M z)eW2u=A+EmS2Eb4oV@QflY|FSxP|dF9@5d zgbn0+@TK(%kYe1U+f@NnDVKtZ2Z$<0u)GFD9yHUz-vTYnm(E!A}_YTR_(@f#MZ%;twbeAlVlb zm_JxcD?z~k9v=o5S@1|K1r2pVLV=|e5>|d5-Jrq_6u8hNcia^my&k=+9nRq138?6s z0p6DiE_I*|0mUfPI#9P38s4B#1RtXSv4s_U(z^sCtkKLz_PpwL4~Ff65@p4*4x4xmLx;FJeS$sXO{1xX+~p*P$>0|t6z3v?zGn$w`}EI|q? zu+HNS70_lMtXzk96m$n4s#gA%OJJ8@VBl{7l}1!gj5&}N3FypxP;#CC>V8@tDg!N& zL5OtEVIwEqPoTvb3oO2Fz~k!)G`>Jl!`}j(y+VmO&>c;n zmE17FX6WP(tO^62xdWQDZvbtRm_0%V3%C^u(*bfNv_5Qp@D*JO5np#0 zO7y^mA!v^tB;B)=$bgb*i5Mt0O9eo#2A4X}oB*y)5uG&0aK|v%ME(g-JGyhP1Ze+! z=T-p_1)aM0I1ax27o1#(K<;SX3!)gn%Md^;aCyfJx)Kd659YFziolxb(EEd4Du5gaX>9XvbC79%z|?Y} z1iCa&7u0d=wLKZc#_%HN256ud91!4f-p0_kRnZn(GTtN|_2V3_7=_2i68^U^+lor?f5rI|*zN)U~iH$U*I9h%{)<3A!lg zHK@r2S`%R4(LEKc7upvGO~rr>1~qhdfX5`j3n7lbXnqFvBy`CIXoblE2L9G%po2j` zr}ZFqPJq1tNw?o1(~T=UK<8QUx72_YBRdk@AL^U{xYhqf*21fSz&s5O)vUE zO0_4T?OvU&GeA+-yca|<@V9`^D(Z#^f(~8lJpO|7DLCXiz(*JHw^)LXrh=&eC9lv9 zkM6A??NBR_GyZBNNXBOeYnqCr3Oc0WsKdz6**fLl|NqT6;V@uw}VIb zRFJes@+G7t!r=ZLtxl`1}7qsPO;} zA@EWkPci9ChI>Bp(Jev1{k{bhmOBU!xk8YSDjQp+oAX_2!?1S7lc>Kk}|Dfd1 zngI@0>FzCVVZ9@)m zeTa<_5OY8j1AogAu+FJqo!zYDS(FKj&K;1VLA_3|)!9+k|;L!=rw;(4W&P|5o zR?vat2NIyC$bov=ki{V2TnSp<1Yf8E9+!Rq=S~G1)+yl83|?;xT8s>iC2Mf}L6%B` zCjLR*ys7>3zX$ZxO;`eiUXTXm9(O2!W?Go5z=cn#qDMEDQpHCOT&lEemStdoo>Rr& z0!}fA!pj4+E2s1L3+waXRz?6QFwtbYw}R3Eq)`GckvfmRn06Md+ykV%c`u0i&)?z) zx{nl1bLa6F56-bLcv!ZAjOK6Uh9n)B^TF$FdQC&UAek%!w1up*)d6BGh+-%e+y}nk zuGd!0i;dw$&3RD815p7x*%rE%94ZLiYYXK;4v_3@wE)da)k4d0P^k^Ed1?bB=YSUK zKx@Hyhrw9}ECHGo1f5ph0a9hz3i4;E0op1WWi9aXn;DP=2QxqsDWC-%8+^G7bftSU z*nyy^2U}web_{=0K6nAtRFI)icfqUIZUsop{g(!}1VG^rDY*rq2?5j>f*0)Iqzfzb zAlIL2ZZC*r;BS!^1?3D7hq2U42m;uRFG0O!gmg(Qj15{Y zSpelgmP>-722!b5-3J$yAU}fIry!5D9w-IfZCPs!H~DoHG*N)NO-`)`N-{mVr$Ryj zY&C4TB4{-OICNfnKJBoL#QXI2g1qR{3yxTi z-d?b}UT7+SbULA_p!p4lNAF&c=fZuur-Jk&k7Mz-T$6z07?6D+iyVZ(e30>=Wh>Ab z51-?I|GzvAQ3{so71aTG(((dmpavXhNMoNo$3fQ*fD_znE(jY`4jylfL8Lv9kD(*R zp!I~^4kDec5r08xRp&o6t)i5S3b0+*;445|HDHP$dkMkKt=_3&AYXKY#{Z%99ymx> ztp_cWYz0Yzu9p5^&%n?LHh_OSSTL>iK!r;4UXYQD{B260)?qi;OCG(VZV+Gcw{SCq z4FSh9D4amEh}}~`dZ393+FtkQZUE07S{^FP_UYEmI}2J`25}9f#PR9g08-%7y%Zd2 z&}ixgExw-U0$zL_{o{__`bHP~XlEpas~E5DT!cLS~}29R2(M0VHUlt=$QrmG}@-nqM$>9`xuu0l6^(N`V$!Yj||FDuCA4%YZ7IURGU@JD@_G zAfe-6X;3D{@GN-QerGG_!t~c=&@0oyqidb54FCWCe+|0b0mR_n?!d*r{eUIdKj0oW zNEDpYAU3_0@#qF?flN0*n9X}Zsu)UldB9kpm7pNYp#5zyvw1IwVkm6@<*(+wAg?f# z2K#jDemKp+fGwZ{oWTM8*@=ze#Vi@5fW{umenn|ZK72w|NIZJ3}O&i3RGXUg7=$uLnzQNMCVkH$T0>7q$Dp2 zszgCmDvAP+?x~>ggULahC7=v$3xdt>gcM2;_xSYof{GTOUTA*l1y?EEC?!zuUQo6V z_vqaV%HJS5;P3zc;r~llfPzf-3HWSL@R$SmvgKBgZ0ms%Xu$zVbfC?4pzUp-qoZF7 z!HyD!^jkn;P!aHW4qM56WG;IND2zdhz_P5M6G0&RNxK~kx*0lKLFElB79d&F1F?T4 ztsCl|(imt7Q5M|1*927hlz`5kCMmBSg1QT|oa8mngqPvM3=9)q1`2}~>OsO0Qtov3 zg6eC~JrtmHfHI2nzjQ_SUeGX3costzc+e*N24c{L2V8hl8dxCxkd3#U0>{CJtb-x} z)Uhuqh50?F8(j53ueC3Ug*F=C6BQ-ipcDjlKImX>2WatK3hHx%;sSa>d@152@z4ej z$oh4#bf;?r#A;B*fv9{xmAXR15E_|g9Ycy!MNXZ2pw zi+12*%Eyk4;l*chRtDeBA3mKgeL6w)fJf(X@DdWo|JOXary?2Q0iJCFr*LQ(Ax^yq zog5360VzU>GLUaUhwww=w-lxaIs?;kfWH-V(l6A12+|{qgVre^BCuHhN2hn|nb* z0-zQVhyiLIL-PoDn5>ky8*F6r1JHWQg5#|qlR*Z&PJx-q12GjeN)Iyybl(L`A9L#g z(7HoN1b0JLVrw+-1>M-f09s#;kN~aAY5wsaRK~(=f%+Ee!Olb7U=MI!fQKM-Apz7a z{4EWj!;By;RQU3w9kQV1Nv%6T`M!BCh+^Pxf!y#56+FNQU8m%T(C*Pa6{HlhjtI0; z3D!3c0-rm0{l$je;Lh^~h_N7wfxktW51d!QSq0euaNiBmAntAjsfBigbY#GF78K`ZE%!!D362oo# z#+yK?q#JB5*f(tat)P5}#bmD510{m{grjA*YRAF~J5McK|J4MKTwBDP)P@ zK6{9{%ph|kQOxxKyBE~90h`bbx=RaYF6gR8s3_>L8n8<`13*l$=y3}A;l-UjfB!e{1(iY!rBR?ZMk#2^FesKGr6TCQDv;sO&;}

E6SmGySI2U9Is09E?P2StF6f&KV&LH+e z1DaPMWd~$9__#Q@kO3EGpk_6seDvt<1&e^rFFFC`dc_Rf_&9IM#_*zyAJj(zje>zoyv{=&o%cLC&qEs^ zS6-HY`$o|4Ag%0rs)ST_b%RDpp(Udf*i3NZhUH^kgb;F6L-H|rI;q#z5aizWUErJo zs`#M_@#I>NDnzaY@nHE6Id>&Mi#88pa_urm0$*yv#_;0zPPkjZhY(@OwO~6t!5J8o z)IBhAEw~IR5!|;HVy-X9+{Gy7V$HQsbJ21wRFvdgyA5Lb1!Fdb7iv2ZxweXgTJxnK;DJM5IARpa;+AU8o3ECjo3h)BpooR1|}82q!b%y)B{{_Ko(KKA_&^JDXsE= zT_^;pKOx!N#|u(vJV&ZDplu~jSX&9yb_a(NNCIXY=%P!AAb6K8xbT1&`O_0(^1_5VNk!Z7f46`id= zKqXc;lyZph=med)1K}QbhyXQFJRq{*48mMuhsW2&7E{9bRex&G~{<4E4)>8-} zusbcm?&NRXgd(otVc80DEr07Qh&aSwQ^BS~dYKRrXq5!2a=>!1$ObhyAOgr~N5BIT z(HkMP0z?7S2vBxHHnY^;qkAeu0NIGM?hqqD`?g-ocr=5<12oeC4lV0eP*CwVfjame zpu@xXTR(zBsdfWHi3oVXSm*H_$A>18c;L*Jm4hF3UNCKIa#e4e9kNbf9vUgkaaTrt>9r+n6Vrn zPeYC_h4{=t1|;$n5q98U=!T7|z_SHB9GUrBwj)%7Lz*~$S?2BH{B!ayBZkO1@|&(2l`Fb_iY z?f?yvgOq^MFepX!78H1N_k#3-=3gO7LDoR-+Ig|^4GTl-fs(`>pl&btlD`SBLnpir zn(*3x!fT%iuRSNccAN0pdBSUl39oG@ytbO~+I+%mlL@a4C%o31@LGGqYmEu7RVNU6 z{@n)1{3Cc{{{&v}lw=1)r~@=ESqm20`vBCvF9F3dhy{{J0ZY^(PhSS|LU$*4^rqeb z@Bepg4^&bbP4X}QDEc&N|^_Qp|cMgCIXMm0cF@388 zvAheR+50tg!So$ayA#tPeh7m=aSz@J(rdaAYLFuqgC=7)h!tTFl8f}UAujp>PQzgD zz+L2p-Jm_-18dQ}rU!M=dW1phFt0IUH>enF5G;&A%lg5~u|U}Yw3MLrK&cKyAj0E? z`xXWUk514*ps<*S94813y!qgw3LM5ES`Z(pAskZB9SS=7?gTV$fBy!>ZAla?ZjQTx zZ$kqIEn=A|_>h)T(C)nh9=*Od0)s%q%8-Et&(0e=!C}}dY7Y&+*9T!^3#DQ(Z*ws+ zFn|hZhL@ld5I_e?z&rP@H=0i|!JF2uH;#et4Ppd&7o1!{{rXVQzSslM361p*pxO}@ zR-g(F&AA?+GciDu^u4BApdq003!cOiuq4qhzrexZ3JV6%p8xI!P-BFD8>qT#1|9i{ zxW@5;M|THkUK(;}9B3C4XcyN1i=bKL*U&wt(qQkt235M?+<4r<0+eXMrItr`><`4c zV2|cED5oYseFMwCpmq5_JbF#rH6W2W>l?@`u8{K#N(J|6fX2vrZR0f97+!2y3u>T& zcNkcBG#>zM%6b7>-;B5$@&z;y?}G+0K;Z;h(p(C4GiYBs=(H)&-sc_QgTla9tAX$4 z109^^(F;C;4tmS|3xh?VH60+^KsR!MRekX24t?O!30^G%_9}`u6FfR=5nHi9J3Ju? z9CRqzkJpBvmGI!%UQ5>vpv9k{!$ceeJS<&Tz_$K?c85SzK{jhO*ZyDtr^^lS(Z&2* z;NXGY0S(O)Gaz|l17i9WoNPe-J=YcB)f1p5C}`{O2ISQn{zpK`0(6R6=mw8o&?z&} z6YK;))n@1M7gIo?*!)8Pwx`(uV$Tnc-T(!UUeM__t{b2ui=vakfdx9t!2oP8l4C$; zzkrsExo&_A5Qt0x<#5nFU!ZL!;KCkslqWRGwO)V@d4n7&0Fw^|9a$29vXKl@kC%eu zAJW1Br9V*Rq`wk0h~fIcqq+9Me^}f@&#(Z+9;k@~H5hVa2k69Ch&*Ug1awkb=nv5J z6eKD_H$YZ+fuakv!w$6m3#7)u!vj3J0Xnh}G(H4AVc!Be-tPLNBftVPg@88et?=k9 zUEt9PIyB7}wAX3@11$O#Aa&0I$iYOeE0E)A@gY!L!6M=tcn|=zc?Y!87IZ;9(lXn7 zdqBAabOa1|jV(+M_zG#zX<&$g54u+pv~5bk19Vt*>ncbL&w$=l0FnV6&9MOaC=o>W z#`OneM=|L5%?Z#L105F(DOnsiK^OGG*Y2!}Q0)LZbh6tQR8FjbBsS1lFrZ^?c6gu&zwny#|Nk-9_Y5y5GJubDcn?nc;M52{ z_>6yB=zGvcVAONeT|a;}=65rCbTaX8b0tZSBM0c(2i(S9@Hp-O%1aCluJ1u5KFq89 z+Z;G8T;KCIg@dM^n_Yi!Ao&?2$-nIaszV{y9RKjJc0It~bR4vZ^BpLUf_EP|fZ`5x z0MT(sQE9Bq#_*zZ1t<}K&k6#a4uKSr$Y-p8_eH~kg9$uq;0oO(4yq18aeCu*C6eR7 zqe7UGlmNaZqZ@Q4iYrAD7fsVnUC7*JJ-lIB4HasYPpaW{BlBWSmtIH*oW z6@JML$!MVSau8>Be1jxhxDk-UdO%y&H!zeIf=mGqM1wXCgHtgiMi20>KLi>yM4Xh! z49b7awQCqacL{`oY9-iMXy+Ah9@zle3*ZVqPUZq=Yyxy-EU3x?UBdx7&Wpdr4CEBh zX1NZ>g?ov?1oB%0T{0%y7g}-GhL>!}0_ap} zq~n+&R~ooNj(GzgYy>LUTz7!8Ca4_<^~(lu#RiJe&f_l@{{q=wVh0XF=rL1Jb)Z6f z0;sL$0jfj68%#mhxx84-02-Ti-SFBJ=iQwhASKPUA0Yjp4wX-uwgFx&-f91YN%jQve=K1nmz49dw8y2->L%I(_N~bUPqOYpEHizJr<#*Q$sv z2+|75yFWY-yZ&HiL$B3vg}Df+TKUC2pO^UrgN$b|Ylx3TROSsHJ!O z#e%;-AcsM{+yb!{bacXpmx2(^2c%kl1^fUKoBuyRi_O8CmtTYW*`Q+X0M! z7I^TlKLDyM6!}_QAv2bpwCXL-2qNsFFMWBJR(R z|F5$^XRd%k;5GPkWO%Ukvg*sSF?e*dfMN{PcmW@og(NKileTm{QKakvw+80fUeIlr9F1sDn!N&f_nh{r&+unhm*+)%fNEDBe2vf|jg%bZ!N&knWrc8m{c@Rr&Y- zzfWhY1eodt4Q_$9OM5^MhdA!~1Dd`Bz&Q>+q6RCyc7s+|cZ1iTgS#)#y_t}`kDwLC zphiqLIG2N}Q60Dtc)1B^MgkmWr2^19DPSdAGT2;Kn5_;Tosh$Yn)ia{YeBgQl(=8o zfR|f?{J>D+i?n;R+f~4$6Ec2bctC4Snl@QqXl90^qW$ zRB&Gz7ijsp?QTgnh8KeKLB~Mt1%*EYcndkqdjTHZ;8@uS@)WelKmMY54x-5a4{8R0 zjzl`Nj}Kg*)(X7X{sC0Q!9vUs>ga9<5zvAFa884)v+u4Ic+ribmKCHHI$&J_I>`~) zA)s`D>X2WvK@LIQ!}A|>egZ_G^Uywin2S_VY?%*QY}dROl(ZNyYypX)+A;-V3wSe2 z^Ii}Iu?58P=sdLV|NsB>9w5K$e~;{MONcF?l*>>8TDT5kf%+S-6Tz9g8+1b=+<&N6 zDnhIT@84?P3!)%af>FL9z0f5NNHrE6RCflVNGO6Fg(#0ZMkA;3Yz!P2nDp z#lGFGpri^}41Bzm2ee2M9CVPR2AcTph3M`C)dT|2BwDrrlte+Q5lPfp2(+c|0%-6R zW&&(4G_qkJ1(5Xq5|p7j&%e+F8wL_b81_vNmfj)PUbY@6fd(3c-yJI8(T(#|CWg5z z4DdNS$R?&{@G_GUu-8;W3{vQc zJ_a=zz{_4eU=zZE`~E`8xyvGK3@B^O9dAtnFM3Qn-kJhqq=6Y8$HCk8 zL_o28ytU%r|Nk-|W^?V2|0T*G%l`fU4+^>JI#BBny2TJwAAonIy#}wV1t|gf7`%f3 zw66wK_ktF@q3D4Zg&y5oL0ckF$H(}mffF`(g*#-Uz<*d$yTA)dE6}CU|3vlc+C&KQ46%U3*=2#=oal)9>>8)9YCA`siF~G`fl)5>!6#9K$FOz#)C)i zR?z1Eut3B}zE3Y}-9L5)$Y?%jg>9|C3x!qip?qlUo(Ij2c7yGLkKluO4bT2TyICIC zq>;z?!Rq1t95BxVbVfh;UOxyIYX1=pMh3*NLNE^lDEXkIBT#gJZ^MxQZA8+9qDBE(Bbs_+rg=>`2sXg(m~(Fsnxuem)SsTdL|IMT-BQb^2$j+X#M33!wb zx>*x!hl2*lXS_)13~VrHgCl5NFR0Y~2ibZIx+2T~XA!mVu}S@5aUBBCuC66M1JD#H%0|Y=D$hkmSqXS_aCd zVDEwk_93Mef9sz=|NlcOi$DMW=Yy-3O0VBF-Y!$>Fsn~@!GQ4b%{W; z>jF@(4RnVW==g^TuLVG&9^K$O06-_Xfrj2EFn}u&kRl84m9C((9ZC;$hb{pX$Dlat z46uOkz;;1~AKn}Q1sDFx16rIw*N20>02EeGIB>OZmW@;|`#M0vKM4b-VU}d+*4T37`SO&>0@xpxF;dctUC; zlM-+?oB`^|gPaSB{)U$zM}k+Bffn?19)BSQDlWP~`)xqM)!@-xpa5>qV-1D7eeh5~ z_tQMk`Z4h7`j9&VI>FOJka&XLBiG;o^9N|$49tUg7wq~5)S6NmQeJ{x4>1L_;0>}2 z$_5l@kQp3Aa^-J5{TEh@{DT!E4Ub^O$O2F?@*gIi0Tzc9BafiV|G*VGv=~{?IpG7O z7y+mFZg6w*MYIYdsNi~mXesjYKuVX_pwoXkAeH-iK1qRBx>Scp&A)u~(p0E4VL#NF6d^I!vPn6sE|&;s7lnfCd4~5#Z=!1YfY+A@K4whCc*KL8r<<${3J8 zz}r9|{^)>&BE$wp(5i(Oka^$#mtHQyFi4@)6eUPOQ}Ix@;4uhvw+X}oSh%2>f(RFU zra+HF3xovEE>=)usv8tM&;goma8iKo>4bDlOy9FX^2Wx?*z!g=#Hf6bQAfLwjdBP8 zbq-H-f|^ax6zyaIDXl>H8QgsAxC1V&pfe+w6B}<7JUVOPw?rU@Y@ipn@VD@TMv=Q+ zUx1dc{$K{*Dg|M)fG?PT0oBrcLJ*VzU0*=^M6c7qB{HbF0xi^A50rrJZ+ZbT1xeEGWT&*7SgK*$aDVP$!JP6?D`FXbKP1oPw?9nhGuy;K2cEQb2=)zZH@c zQSD&@Em7?Rr%}+HsssFx;MM~r(DU>WV({SLpL*amBCvWzuf1ny@UXl9Dp*jB2lnI~tU$)KLFX-_I0Y_L4tLO8Ampe~kR-(akOT~7vy=$#I{?XOY)otnFJjuk84Z+JK^qJ}vo)ak z*5)6~U`-Geqr>I4=)F@-xU3@S5Z>konMk z-Yo~fX9FX78JfmR4Sc#)OFKaO$v_rHaDeWWWCZUfYy8j3@InK8K<7Qg4tCJ;0Z;a|10r17T>T1d3;HVFry+@ET3fX-Y4UO0n0FdcdRkh(WYt z3}QvL2kNCk55TjXu(F@66k5=PfN~JnO`x~}&2hrAA-K2z4fTW8?t&Knad;qt@TDlI zR0Uta_yf}|h~(?h{05YE!FK_Jho!)`-?-jDB*Nwgpo9hLaiR!<3NKK>2U>Fit`16g zLF;Zkx*aM&14>+wgao-29286ph~6-`yV2?T<27`d0q77|P@ph>uBtN{?hfF!4Xwm?k&I+~C8j?6chi-$$8KA2gPrYUbFGVTsflzgj zU`5<&5xo)A9B_p${tyL8A9n!VxdUBT`~;E;LEf$K=my&kTBHc-wY~riHo@xH31HuW z?^^-2Vo|*gTGt3u0MfP30Ayu5ayzKU(aaR<=ZKhW@=2p+5eYeG(opkxP)=zN3572Ee zp!Hy&qn{^%dSg)AA&HZ}wT=Ze`h5men1SX!Ktnq>z-I!K@*H;s-Sfk z4K@el6Y#I-r3w2B^MQpmo@gv)7>GA)wiMP{6;8Vgubk-_rbo z5v&VpCg_NH$TmO77|oK~KmLOZo&mnFvKt}=K6wBp`p*L{3JDl7EHaQ=R=|_T@Bwz$ z3&$NyzyW(4ez`GdJQy^9UIMze6vF9rJpj6z2(+{eGFoTgF_jb0z6QX2&AcmMcxCkPaR|)toj8n zI7FFd<8L(w9bv@?I*AW_ntC_HE0CJ<)0)5k!8bf!0F^o`| z54{0hvJF~*3m!rQS1rdKKsOpg=9`W?fbJ~^vyVG~`kkN^HL#>}+!eGW3M2{ItttRo z{Ro=A%Q1cVn*@j4BB`AliNPq%Jt z1E^g94g;U=1kfNTBxFJ7pB?%i3|f9qUu5daE%2LTUIZ>a|)03U0IN`S_wp;anqXce5N;=x0;pmn63t}|ZS zgKx?PCwZ{{AQumT7QVsq73j1_s1$fPeFf+&E7uv2V1=AJUAharrIWwaA5xcs?1JPn zHDrNK*BP+=HZwrw7O0@m0^jNk=7L6yAqQZBS_UgTI$amMJO)Zu;OlTexgP2a&=weE z7xK5v2P=b0LtKdnFmP*QFyvE|Fyn9i3OcP6bc0E z3mEuYRwDZnnhrpBa=^VBx&X2b0vZsI5(;#{6SQx@c80fonF8#v`EC z0C;;Lq9Kdu0zsOQouE6NL9K4cVqnnnY)jV*;FXUjpzFIKx5Rb2z5&kzB1AzG(w(lL zEo2u!jV#a&vY?g9pi-q1G~oa$-@!Dj3cbG!ln+5y1v&+Q3mMSr5%86|AU&X50q(Yd z>qby-3e;DD0x5@?(m4aP z91|o0H^8S?g&8!9$_%pBqxmq0kLBZ{50DVV(hGp^O6d%p9yVWiIw4n2&7N~Z8lH<4~=GeKz1kubcg&;ch25?wU(x9cBk*E#%6TmJq3KVbr9 zk8f=7d0jphZtS9^GIIKs`LceI<}ccK*Q1@M2~uD3W1TvI zg_r_9tNnQE1n>+81B1tL@R{@=r+FL)-zNZNf^H^&GC>p8P$uYB3Mlgc!UWJ_2B;`# zr5%I`-Chd2H3##CN^m@PM`XN|1I_e0XMnW%bT0<&5r27%k%7Un+eHO5LR!KFWwDm> zbvtJ?A7Jcs&UgvhM*tOPhRK&JT=OGg0cEKyK`0$*KG zBGerWIuQwUG(fjQ2IGZJXBZcp-z;5k6oYnngXF;i;6>431Hof{X!4-0@D2EJ1mL+t zPz?+_pBB1rA7U6-7L-mOIDk4Ex52p;YBE?3S`fl-c~C<)7^Vt5F>vq&i$|yHhS#8@ zJdiAa8Unh&0AvAZiwtNLk+tiAGEf5xv?~4p)LhUQAn0rc(E41MJ3u>NJs{W3fH%2A z)(d-ByIv^c_JDFg&0EMp29T20()9#ry*Stih)AdF3EyrN72nn;{H=!n{{QcG&H!~T zyPYMPPq1`4OT6X;F(3Tybd~@!K%-;A{M(#mzyrCU75&c8CTg^RN9%3=)|=p*49=$D z0}PnK7rlWF^8}@&&I!<*1>$r&B(#Fg^11`b6}oR(8D2COfpW!EP%40DZ%{kz#k2X4 zv%+>Arti12~!Rx8#8eB#4MlcZS8wP;e@X&3I|U2-;K!aw<#90sa;ZusUZCk4{Km z9J02Sfxkt7k%0m1Iq;x66IdB|gE8n_GDukj>BB>6=T7iB=b*!@z;Xc}kuL!7tzXG%g6tcz@x<{(@0O(X1*9A!W8zB3TK=-UejhO@yLEN|w zF>OJo0I1X04UNy;|Nj5??OqE?ZN9B<`CAu(%2mkuH6Ea1VHyJ>@JiA=x*-AA>k$Eu zzFUyFuowTqLm2!mYe5T@q3RIs)rM*9?tr)pTswGl!gL>m>Mla)KHdNdU{HYs)qA`F z6q*nLsPhxS5d$^r_=}>WpkW0t_c(YNF+?#~0G1z{4^((`!ls8oX9pd3U;*!_hfY); zcK|K(0?j*vBtdIIpoT!X(C!<=gyRkhkfjq~?r{eP$eLUf3%eU4Kz%~!nuP9NQ0ERb zL-_yy|6Sm50mu-9!5nb?29*Wn5b#kZC7@xt1H$E?l~s_O3n?o=Ek}f%{4Ezj z1tVfTC&V&lsAb1p_kcp@WgjR7hVFr;H%Kr41$e&_s4-dsI!G2=+JNJ`vl*0Tx?T6A zb%LD=ZF_)=l2TTW*4w3^a0Iy>6se$abOzN{AOSQ#b>4*g$5RmEpZoj_43O2J$nnd+ z-N6NPhPLY-{-zLca&)}`niySQ2aX6(9S?4YcOHK+2OdTRx(5*Xc_=Kf&-0fABZrhl>ilH1*tZL2!mP-P+_nkau8uq>j7Dq9U=^BNqBUF zntbuFOJ==382>C} zasw!pzK(^O&VtlXQuXLYZb18VJ_MI{$6sjcf)Z4z=F0`(<;~a?O_~QfcZa{Fh?ju@ zUWbFrAXwQg4^C~+45a~@9L$ENcY)ReC9%iBN0@=a$OGa7P{H@_|NrByCg26&;KC9V zpx|~mcwHoDpAe{@(`&j8lzThRzsSi0?F0ddBRY4Ad;b8aNmEBcY1A?KVfBf@i+7D|8B5+T4$>i zxW)tNb^sLxkh79NT(Dst-3_2yXA$e9K+D%bn}BjV^)X4IJ>$LHL#kaMJ`;ywkPgr72h(y!R7y;v3|oCf5%BZ4Qfzt+V3h{yL_=C^ zt{q?j&@~=KFlq2T9$;%ZAjNKBHMoibFQtJlBLXi^1cwwP*x>=%3Q+}GkqMfyfpHx` zVF%fQssP%62|Jt$Y>kA6rR$7h(4xc+570;jcxftB23+KUQW?Goc;*j|fDXtw6ZBFq z@LFKd=sh^1K@I}D*8_CHIe7DDfB_<-K(YoX&7o!)XvPA^7g|PX1!dyS^DmsUF*6DS zXjOAJw71*ass%41@T-rxE;`Xpu`vEiEhw6Zs2SRX;(w?>f>6_ z`6Zx*KU2Y;f#~*tBy`SHP}vJxhhWVKE+`>3M`XO*3~G@$OEiPJZ2T>t#oy2dsz-MR zsOo_7x+j3zB2bP;ZvmpoeEbFfTTnuUG^P=aWPg}q*d@4N1<;{E$Vgl-4--^T_XJRD z7|QYJ-hk4qKK^3uoB#ihL;CZ`?R^(;p$ILXCBX9=urZ2h_aP%4E5Va#pvG0H;J!vs zyRp}{;65wEi(@IE&Ra9M(+gSz+&vl0>~^+*h^VEz`+=130+yFCx2*Y?l<|M~na6G4R@gxwwn5^w$?RBq|f{DXzR z$qmeZ!Q#>UgO9)60>tYTX@z83R?CO144_TUGdy}lbsw@acraeD`~Seh_5;{h(6Nax z*+4oVRgVWGy?8(-4_||>-+)wz4d88m5Mh+ee;ibl{Qv(S+byS=Dd2V4pzBd!ccbvP z%!bs0AVE+^{|7U;%?jtT@V8bXR6y3#Lk>5D-MkWE;L+{u0UB;n0^KSAF2>yzc>8^A@$~4Ro9MB9ke+&4YWypjtxDEajQdFukFoEhR{+5TJ)-vA-Oo znZNZbBm^J@1E>K3K3yGT5wyOz83(E__**~=D4>A~Yoz}JB?eeo1JdhI0E%Nxg&SPZV9S`UCvyacm5kH1(S1FCsp{WY)@xU1QD{6+XK@S1RFpA9Sp zW_KQcVFQtZ_S?WxV0P#67m5%mXx|Mi1!i|1f58Tkg7)9QQebxH@fWXmg6)F#;lNU0 zcIWXI7a&s5ejHc|%+T>+}F_JT*Z?+wr?h(6uEKOjfeI)cg~ zSmTWil!ZWtE|!1>%^pDJ-$9FAZ@`+fpr!Y&7r-~=F@Ulic(ENq)(*7t4ZLuvyA*Wk zD+2?xaeDkkSR^P7fZXl`T8Rx>O(p=or~$f#qYGTxfmXbMGB}6^4!foN`1`otH zA7X@z$b-{6Vy+Lq&=Rzd1vJM1Dt#eG6N8Ne1wObT3mz*4Evy4!P=N_@3uxsbr0Rlf zh3IzRKrS@9ia>>CDd?b_7tqBPFFd+IXAFbQ&hY5G2tHi^R66(Pf$DtF65yZ$=yja1 zDP_?5${!x!UJO_tQec3V8A^a-1$vV#n)e*TU@P^&ZSzj>!4MvuTfrmp(6M^ZrhU-r zD$rV1@L6K62f7_VS6G0C_d(zZDv~pcOih`BEY95kuV!-3}_C(1+ez1u_-fNMz)1Z2_kq@W4O9G2l)|Ne*;+ z0$Ch1bpu)(3$ntao582s1GHrXWS~bk_=+hAvj9}pgVaC|`~o)=L7hy{X{z8AW=N}J zU#@`kC?Q%wH#qIe;dn!7VJX2=uC|j#kjgfEd0}g`^?yEIBw_Acv4O zKj80xG_^yZTELOd1gcCtU(8ddxC7|Ud%@6pS4=6x&g7(~jltLGPgXIJua>!<~ zmn(OIE&_mcllrb8x=Bq}VBI8eM&8E&I^L$&w)!F~!wb3azyCdYSugKl2dz820NR%a zK0@XtC#XTy%eo6g0(|gOH`u-4nOg8HC1{$f-*O+EY(N5_tx=#%;=loIM+vNF zU`Xq1t%6+72%^$Ji@f7~x=nXQf|jVcUhwG#t?dOZbM)}(R)8b}(28@=Qnk9v;H7FC zFR(Jah*$+$s)p@eHrE5lDf}2@(JUwgA^8O4Fb4-n(;RgF55x*sJ{AI1C*9B$ykMoE zSs>*vLH8ws2mGPq%SeY)UI4X*9YUHx^UkG$`?MgzECO4CR)B}cKrseSl-pr@o?tm3 z9~zz@rQma}N@5`*phyJah8>`U1)VPUfewy<4wM5|`#V6h`k-B)U_V2qIzgouXow7> z^m@e#z8)5wj#>|tf^I?u#WNxxnje667sc^!182emFIa3COZbp@Or@Z`!RUHGW9yv9 zT|td~hS%)JUC)4~54&B@9DKmic?hbz`2j!U1(aL}@-V1zz~Ay7JnRBW_@Jdlpv4WK z8sH{a6c!5s9Q^`cxSfDd7Noq?oK0Yf2ZGa6JOWIZRu zItL7epaKD^5V{qz50c5&pJ8Qq5flWPk^>DWyUqX~M%es=19b2;G*BEs6Cd5K6FLN5 zLb{@GRRX1;O%}*bPe4xb;IpJBfbYdS|NqiUXtNJyg#!32d1TF?ZYn$)Q8m8?E!u(WBVZ<-glan;YDH~sC@2Vn+-oZbOh zIq?6|%X8pD4sN_csUMp09#Fo5M>pxlzXr`{Ai@;gY*0%R8YX0z4NYbfAffJYik0ET zYkzR4gUke-CBxtH58^$D0AvFjX2Qk)VMk@qnhQL7fATA2~dFd%;FS%A!BU3=H5V7IXtwIMf&p$j~czsUXd@R@3ePbr%kN1n-go?I%O7!(sc$8jpb5``~`2V;o{Nu1E75_<~aS zG3Uo!L9>mZ74@LSp`hbbFL)r%X9k@E4Jidd%YQ(npo0Qv?T;3;Vh78Cmhpm?YJ%6* zLI#y!t9xF&PDNG;t;AXnlz`G6!f@!K9nkz3!VYaLI?=5GkNktyt%8mPE*0GO1d{qr z9cN{Dq2LQneW0VVLHkBQE6+hErq4h*F&*RFXHeWh4^Iajv<=b)SuqPbu;_yaq^y3? z%>X@h2{hpB`rtKa=iv{?WE<$DS5VK81GG5-a>Olo;eLtWzRwWX>403< zstgXG5l7b_5}=c~K|K`E$>Jx97Q8M1*9)K%7@B{8juih5G3&uGR)!a5V6#B?A%JTV zkn6xVse{rY=puC{a3jw3#%o3J1|rn6*+1DMY`g)Qa)j7;71XZ;t*Zh@2sGdjCzM0h zP`&6BKw3HL(fCFIR6KTqFA(zR+zMT<2U!aUYTJTq9MF^|sACOn-ZVfCe*rg-JmAv| zAg!>KiLlP(Z_w^t=!!pRn-bhFhaSKOK1UQfCI(-zC<|I53vMDgNO(XNDE@$@@7JK) z+6y3(pkV93&3BU}-r}0vZB30p0fVQXXtJXxpfRR2ulG zuU^*v_24%Bj@Q*-joZO8;8QPe@Pjy@$#>A{&|n^T@*Qj~q^(j33>l3B9Tp9`!2qFt}9@aVE%H z{vMz+;Y+~PIR7>WndS#9pi7-WH34|w4Kh8@`V^FpklXGXRAcWZ^;cUeIy`_@=-WpiVuKJsQnFm`XuyD@ghP zHOoQA`SC7uApqUv^aCw05eg*9&1sV0?-h6P6 znG4cm22tQ1Gc?m20A0WU+PVjx6bA(s=T{*VR(sMEBC112oi*Hn868`T%^ArUK}EYz~iR*At+U z|AB`!I4|=zC4i=(UL3Q5&$R#PD zZ5ySab={zJ;MsWsoP0oSm%1t7VhQKuNPBMXXw86pG?E$*%62b)SnT8t(8M6Z! z*FG0~$`NS9!J~OEh++V5Muc1p0lQ-50K!lo(51()Bwqo#7!hK=flqfYNV`vWENI8c z0gvvfAg6=Y067MP`#?5V`gVerG&=sjvUftJt05z_9`Goc02)C7FJ44mcLYjepu7*-JL>>b+znnV z+<5>rJr3$Ef?F&LUJ8MG*`S^N30-sbV552&>{lEizo}{LDeFn&VUSmH}3_F9Wj)+c=WP1uLK<_170^@q7GXe z4~o>*10|p#c#ukPd!kn~0<81`XyvXeX!Mier98;JFw;N_fFY_OVc2@0RAfKsbnq8C zc7LH43hV%fD%duVp^z0dpb;`x$o@|LR?uM1zGz5zHSb|%cyZJ5@Bf$Ez*P;*!x7NX zfW=DlkN^CwWynexpzEAP_JbB2yjX1ubAUO-0nk<#XptUdB_}jUp%ocO43vl3KopCgAlieZr6$P93|0lsGs zv|pD4yiE>L!gL03fEGnHyRHCrI2M4aofRI|;4+85>F#fE;}2fwgZp`qJtdH$(xZDS zWWxxkTn5#|$6rkN2+{*p1RAY_szCG{Kx0ct8~vC)7@_MzL8TU?_XzDKqV8WQk@LW5 zs}$H)WCK8*T2OtL2r48YwHs(k6L#e;NU4JXs8tU-=K@sv8N3F09>lVM+^!eo;L&*z z!YuOe=myniwH=zpiQi`?u0c}tNC348Fv{Gk8xu*ac)@l8{UQG7)@EOgCuXIP5$Ukk1`Ki|ZI5jRtr_#LNz~M$Hv+fI&$DXtV*;3i-hd zzLW?w58nKPr4-as2Tihonm3>U0nlMXpxvLKN)C1z8_Xe~t-hdQ)dO-03`i-sP08r` z;&lc1kO9!0lAt3I;8hQ3#{L2**F&$c0S$XXa}Q|d5;Q=H@D^xJ4=jn~6KId}ILciA zO;CvlH4$`j8h8T@e@g-=oIp3!@V9_AkAY-BO{gDPfB%CQV}sJ?0g%X4(9j8JHW<`d zfh{0t0U6ruy90ERj7RrYP`JWOI8gQXf2Zq~=GrX`{4GlvK*L;H7)zidf|6q31C7nL zfhrSgP|Sh-0G^r!HR?bojDhE6K^}#s2+%RZATA_2L7fPO*Pz8QsA8af%HWG5JeuEd zWHCT428D!;N9Qp_D@_vIU+6sk!fhJtW}WSfpmsRu>jWP5_!=KotXM zyavjJWGZm^3TlzLt^hCj;w%Lng9N(k1~f(j>gYpvUOxa0KY>f}3m%=|F_jgNfhlC; zAejhxm}&;N+U`YPi`uITn!Ey~XYdVXu+kWpec(O`XmAKIF@xK7Y{O6sJi0>{z-O+& zAq*M+evz&Vt~?+?4-ON^(qZuO4NyS|UU-05z5zO4Ed%9h&raV3KA^?&h*3?@03L@2 zq#X-7_-6$}so=g;NRnKxDPylsdz$FII z)H!TKDuxNP1Ohx0Q~lt24ciuoU>H(-Z44NWh zU}!$fXdQc{2s9*x7JfH8dQD(AQ9bZr`~Ys4fCna+E~11cAH;493&7Qn>jubj5zq+> zkZ=JVufJ~|BqnceWMz1vZw@M4aEG7=sOT#d+_w~>XDLX}Z!@r-9s5ALdqG9t3eeha z(4At*03zEvg=^a#&g0`iBI!rS>z;_daxS+MEu24UpfSg5f;E3qT>nH#SPJw1JZQ}q6;lR zF$^hv;c@U8GfJxGIfok10uWQhK&IwEOoateEF?$#pi&Sa#ThfiWY9eepq35vEIiQU z?gr>uHP8eWXq?Ld6x5x^U(Bun7Z;$DI6!S#(BX0hkb8dx_bEfX5WJ3+;l)a0aBzZ5 z1~uk9pp79IAG+@eGD89$i@4D3D&a8$RGooNHaPD305p~kx$nUNF+J-FH2_jAz?zz! zC&2qdp_3ekp!YaZKNRY!zN5#ct9fsd?XJ@29#t#c?&iP0TP4Fk$`Lhj}G2=*#;_fz=bYo zjs&y~l>u~F4(zn`<1eN-fzuS|+!#>Mg6iiB3?-mb9XCKm5nT^J+qdBQ!om~W^HPI0 z(?Bk`0iP~u1dr>4zJN`a@W2ksxd1K~!0n7~(7A}v)+Z!zy20H9$Ic7jZUNM?<1Y+5 zL8FSGioJFL18AWiXpoxWWh=xeaLfdNR%(DMW28HkaSi1y0M(PAb_poGbh>_cDF8MI z)B<#Xl~vG9k}dDSITO{9V7J2Jhrb1M4k37e3$*eDG@{{p!vnM*3O-4E0Ga_L#sB|@ zuEPOO&6I)$?Le-FMmf9{7Wx6&qW9_U1vS5r25cSwUj$DQiG$tcI>AHR^#M{706aK{{tDPwa7Pw&`G>XZiz3jnO)6XPI*F)|dM^qpDo{eb7d#vc zJ^~Zc+rb$&9-y{D38-aq0x}%W(Q=?v+XHrvh3^U2DLRlzwe!%!eW3~Twde%U9h0Di zyr8QrXYe;Y`uqR?1gIWx*9~+=f$IWL^Q5Ko2j~5(>V9IIk0QYU3ZIatQVC zR?vcM@QJA}BO$Q}D!@Q{hCjU2g9v)iR4jNI_y^?j%Jl=>oBXYJ zL7BYU6{-O=sKMU~O`sq#UIqph@Ti;X2Th0-D1E zXIM}+0p|dZ?$Qq!S+%VdoK;^yT6fT9EO=c2s5=8KCA&dgMNnESz2O5|rT|_k*XjBM zY=?tE>w!{GSb~?LD|LW6bx#;dxj_{K!|Rd>pb;{#S)lDku8^vdzx6nHKMQC*IJimz zpV14t(wM(>4rpgNycz?Ay$ASqLC`I?psNKHL4NH#|3cb;g`qnX)MAFHNxtOK8Q=kK z_#wq4;#he2Il!Q17-$7ui7TjG3aU7ugBCBqY?e}CkT__~DLkIQh5Ca+%Oyq-qZ-55lK`sVQcYyZzzqEj)8Mq8+p(Aveq%1-Tyl=4eKnZwu z*rU4v%x`|d(#-(gKMytudRQmiB=BLO;Q72f$k04U2CT95Kq+X&8;B2S5>5aMgKnhm zL@=RiiXf~0L6PeLS@#b;=n6Df3ULQyA;|}i<`*oGMX+GSFzqlkkVFNpkPsGwrx2kR z{{8^1A#i;G@e=6xVW?rvuAohst{+%Dnsa|JLe>dfLyy_!Hv#a@E2vurwH*=8pmRSU zZ8nK!=!xf`3E<`*pcBu_CBRMC`%73EUYKfu+gzX~8>ngqwb4Lq&?(2DN^*xsH@JE8 z0#XfuQrrhv4FJkgV27brfCf$ATm`C;Z$Kv0HbDA$pcYd%!%Ia-JR^(&jnTkXtb*$E z50IV)XpIjM732+w%RmEcpgVqlyj%xLaiFu3yBRzzU0?9GgC;y6t7$+25BS^KAu2#M zFgPVZb~=OdBZG%FC}D$|ZXj9k{zS_|#h}J5c#RH77II%RXuu1k1Z+Te=mC#|k3ef> zK+##M3AXLH1L#;AP)81Qtv2*P9FQfTAx6*@fZ#)fnn4S8K(4iRJ;C1u+FA?_Qlwmr zR30C9eF94RkOT)0HvVl5mW&Jx%?~(QAosyvfR7nLR#!v%UC?Z%1qpu8z$CP60o_XG z(Q9fBnkw!*|6;#33q!Z-6L4ArwWnYHfCLw&j$F{bu+H-@deL=2PviuZP4MM9&_f^~ zJ#vs);93P-$HJ==@WKpG(XYzDzyMlStOOY`1Rvse0opP-{RKRW0lg0cwBZMIEVlsY z>R3ppVmCPWAtTH1vbA(NTBvz+Pj~_I7-UrA*AHZaAqT9Z!~-bLK@Q~a4Bg?;2|gnb zbj&2Qj|eVYAPa>+*$5^BYkYxrVS*2^geqSFvRxBYLm`VoTi2kxhkRW(QvL(AoPWIb zhIkURp#YN8N=!f=1efBFVdxuRHhAL$sPJ+y@UV0}0B#O|;zh&5(se_Lw@0(<571x& zXyw*}($zlQtW!0?n*^&zOxX@2y_gYg2S=D-Y7PBf_fkijKF<%P_~7LgF2wTAR|6N%XWqa(9Tz=E|9G22M_QO z^5EzL#RVwobsm4A4O;vI8uS5gzhv;}1)W9@y8ed?yiOGw``{~sCxBKogKGxx?A!;C zODbx9K*AFxAV3!>LBg{Ww4V}GSA!~9=#}@bAf5j&fnD_?4QvCb;sRB0kQPSh2ao1M zOdg%r|6hP90$;9xMHLIGDo~EcqKXYw6&oa5ft&;>7Q4YVa)4EVE6PqMP%#HH30z7+ z)bJpy0hK~n)CeG}kw9LY3%OGSOUQJ9>oCx8XSeGI{_PC>+Ydm7{Qh4=xODC^(Ekv*x7v0Fv4%&JIY)6V<1P1c5V|gTfw5h@m9&fl0#nf*0X2a3cuZ z%s`|{0az?xR|ZR!)J<-XxCECYkVt@+T*xH}k}9+^3DoSu5)mk65)~s061w=3H&S5( zPTu_69XPNT3`igY_j$f_)_dm!A%L^saFG55? zdKgQ%_Jca*FG59O-4;+H`GL|3fV8T*U4QH|0L`6r9)B?f3X09w1w;jblM)$)q$u3jWeBq48|*hIs~1EU$cAk%3hel z3L5FT;nSS~8jU{z+E?FedJ-hsYx{i)E5i%!Y|xsq62f)|-wfF74}0J@?9#D|_N09us=+9v_tmv;d&1HcHLu>|Xu@aXmh zbqQh9t!Kd-no4v*bBfxlAv$6pwM7iENA=yVD=?)nDQHHApCH2>fz5q=FFua{zG zU}*Gx13DcGBn@iLK+h2qY4&{s>ezu!B>`z+Y4&{sYHESPhokucBWRH)NDNdzLB&`= z>pIz*ecvd&=IeHS173Yl0#XB-;@z=}4b=JRH8q^f3O+~cPyskpK|8B=>|%w;$w1|n zLF8mWgRn3;HmF<|Sgw>EBve17`j8>poQ4i1n`6=G!R6Y z7#P6rWdzOng3tW}MI|KRLbq}~fF9KWzS;?NQzz*5ol>P{*E@`$9fKerB4r5&aF)1J zbQ#hg#+2c2hK?k{q|mH^9pdl+R8}?rVB~LwT%8PFvj@r}5GPn3;&0gt@;mreM9_ho zpakL|0LrlKOHd_1It;+mmEaT)UOfYfI0?`Yu;sy`3UCmBZsG(Dr96P9N{|W*56eU4 z&>Kp@+CWBWfLB<9t+N2lvVaYBkN}MySRN_@6#$_7Vn7M{0py@SkkcI`JTxIo(?Em7 z;1vH_1%DXwH-T>Pfh11Qr7{7~g`tqiAJ8yPHE>qxpyj>M|g3wd2uQ3d(+1>l^+SP&o-2OoWctKngyvdPq@g{u4aH z4;nUm!B7IaNEBue^dRp}*C)^=3$OjUUH>4>`9dqEZpgge3rGxH0F5qoUVl-P56Vxa z;#jr376jeD0=|0XNzp2B!HHCD!v;b?9rsS(2R@yyH+(vMA*C01$M6gAEF~j&9UW-< zAE*&00iGcR9We-M%z(Grg4W`LIN&jQP|X2dbOKtl!U4AQH7jT*1OuW~6YSCWh67Zr zcJ2jlJL}vE+1Ld+7!Ndcf7}(+f&?w!04qSrm5@N>Z)pS-t-Yp2{j8vy!jATVR=k2w z!UQF=8IWQeZ2ya#JkS^k^Z-O~D};Z$11P(8y7nA*1zjo0@KPOQ8mQCT&EV1egRQ*A z197;g$wb7dH5wCPr`CA%vT}gz?sUEJy2hiIl>x@d_vmH)(FZD(TyMNi^5|v#4C91) z^s>H%aXdVFS)al<)*ijA_h1}7a6hM8z@ry(fNrnp39!_0hU6y^0X%*K zy3MQCbQ!X`(p-?Y!RJ^BfL4k_SRMyoD1b)cAR3yHHMl@D%<$+uxC?ZSAKder;n8b)2U%quL?zf>AqEBpm@kg@vNF7Q2u=#%kO1%8gs@QU%||xP z0Le7uFzEuBHW^`>0o)e`sHQ0*oAxLh93~)NKI_I(wgBSTsD=|YNbs2uoQPxhVV zV7Z;Ba^O0beOD1!ZWmN;hGXXkk6zP1JxGC8jAWfh^MfCtx>_BQxEwgZ0`MTbgsjgR zqHl&r=dt}<3=9k}y0U)!Z+3kGs`g$ubh|#WcJ1MBIt!Zq>V{;iUejq11717`1vi5l zJeq4882DRwKpXRVO&dY7y|(h*tPC%V6G81dj9hvw3mi5L;N6p*$6q{=1seogsxu8V ze%bBX09mUPI>Dp66m-rnsC+ZASv@fC<8esznlYd zICAkEk8X(fdRsx03m(0uw>y!NumC72LZv!gPrL;0!Rlpo=>n;7J#pOi2&j;Hc>z?N z^s<^jgxq}(-5tHG zpJ9CPRo%U;uVH-9>EfVsjbVHPi2fTeKKSg0Ue>cPKIpn2k6zY8P(I9Cpp$GpdRaH2 z2|ofA6}_wrp~5dOLHM&^{6i3aAB?{V!f%1`7eV;dF#aS6zX--}g77n-{MV(Rv%z4T z43A#cSSSbT&etIxy{y4#Vh$d?tZq=T*Tx>btPU`anny3I6^tVZI!ge?0rhN+pd3)W z2I@P43V2Ph7_=&wn+94mbc6x4=pVN25Ts~vJ19*+6;-7D`2X6^qZ@ql1E`b(Z`cPF z(%>8f>5oqQ0BV*&7NWs#ZZZR9InXiv&=q!&7Mw;ZxO74kiREAcNIqu-tr~E>0N>2# z_2)l$;TUMC9q9bqmfh94kjv>qri0v#s{8a;p% zPTdUw5FO^I;vU@%pws?9`4)5x2dG#CRg>I}Amd@Z(GpNThnCnd;~);;Z;=M4P}38j zKIm$BosI~Z z!vIC-4*u;9Ed1L+&EpxKoj*On^;SB_-cD%b?M?v)HfULm1^7;e)&nK!;LVkt$M%D2 z;TJzaK?+{S;{Z_sx(f|-13PF%wE$RYucxJgpDNOt=tHB%FrZDlh-(Uu9aht+W!rfdug|S5O<#ABX05xC1^YftoA$a_y zE%C?ym#ZOi7eGx|&~9j0<4?DZmEpw`ND=_;Qi3#y!7M~`?Sery0#T$wks$aK$}58^Pu3i z1AJL|12{E7Hlw>9@acx|!DW#zXem7OR!&fj4;WHx0PdZ^ zO2tx1NWy~(!m?a7MD+~*?G6#3lXCypGca_z?rE;w!%!;V(aT!e01oC4FG0g6&9!?N z!J>98P*LzA1!T+KFf%Y%y6!1AMY7GKdjhBc?snbN{DQF)JbVE@&jGagff>|312+a; zKY*)77N~_N`XR+J=;$KQ!Xr?t9+X8NfUjGB0LhvMEM512mluJ?RzTOKe|QaAObX(G zavx*{q4Yeo!4ArOkiKu}I#8(v@_t(DfeJb3Y6VaX#~~-q()b_$Uk4(|dLYY&$AcpS zG)4d7cI=P;yFd+n%|o3RI$iI8ZlnN>MIPG^+Nt$ICjQ6&=G;4sp!3w~pMve)=HS_K zpairaV+Q{=2T%TOpwb-Vf>%wTV1}l#&v76-K>LYYL2}oS<*vv5K)DJQ<7jSBUlX3n zK?kBd*ayCCr1SWTRlk`*%ebI3ADp1+zn73>?O^9BfmU{a%E=db44}dow4$Q+2Lpc# zbgeRIeIe-F1JHHnAhrW^tQ5osEy;(82Ox<@AhE&AOF-7bZj6Vr3y{=+x^aAq|B=j|rUN(OEhHc2pX8 z4+VSyFsM-FfH()dZhi*DU$9-Vvfw72E2#Y|QVY&{FXG(50saEKNFQ7afl43H=`66b zcV9qCP>68n@fVeRU>(ra_AN``(x9`{z$^JdQ91*;pRM8p>1RU<5&-P&2GD9}NM{;c ztAgfTL5rh6N5F&T7@%hh9)PTH?ggDU3tl`m!v{3h5AFki>Qc}~AyC&Dl=Hx?5Ky`) z1C{3Bith%f*Wfw>to%jX6Hu4I71}gx0r!-;U1#hAUC;??a9`B~2jvEE^RfhVUVgL&Xu8xDw8HcNWQ8+iN&#F} zzYl{h#ColYdSe85y(J{2b{>Cm0;CL-nNf15zzfSCNJVD}=z#Mdkj3cW!lBpHq7ssb zK0wq#l0=CFXf@dX62W~|pb6ey+vrMGh8H@&|NIAwmqJo{=kXW)AYF*25K>VEIUK+F z4QLB_M`vjZ=%^=@G|_@I(gK;b?10IG4oBz)ZM}DZrwzzS&5-Fvm^#R)JE(Ql0g0J9Z%N={V0hWW1H0^F75Egz&=rs)*FdMXfQz~0$N&Go z>;ubzyajFFfUcCXbZvoU(maU#4aA;KaB}D0=D-RXVzN9`BDgOV5*=sCSs7l;{rLw} zZNWmLy8&b#_%7r$h^l2ERpn@^LR&f~fE1#{2dEZ>POx}Xcy!JH7v=CtmJaX={>~Yo zY6~&d(gDsroio5|2fJYtE|B$Zoio5SH+8`CN6=Y_Jl+VZg#^8J87sq!Ki|84ywEbXW&?*sF8K3Wz9l zQmg|!IMz7>)SW|2jdg&B&^l+F0ILPZ5qOXdoDsn()`JydH7K~@p#&-5iHRkQc<_Dj z|NqMh@F9sHBf$sv!>YMNh%jjA0J8L;g}-$_q{#$NGAN+}uI@W$fcC*6rUyGf+nqf+ zXF#?wz$OVhKx?KwI%j}8Ux<_oUOnGA1JrRv3Kj4`UFQr)#RCo%@K7E&RG{bdpoWES zi^su-%%CaK#zPQC34j8c;bk8OXrT5AsN8+Y0j|zaHHKb6DG@>aI?zD~8r`lf9+rpr zTS2kW9eM?nE+9ix6MrG6V}0l;jL`s2k9{J-4SbYRh zlsmv4gD#}Uo*-_3tm~Zd07M}?25t#;&Vbw=0rwdA49(6NkQEZ}q6{2KoihZ$aRr+} z?vMa+J7*|>D2T^2z)ZLUJy;=DgVHoYup3KZ_FAIZ^$Mto4@%~c>z%LgH$4G0k1DKMAZ`TzgrdC_Cb3*gfkS(-uTw4#^pxD|6lwx=F<1=S4Qk;2$DdK|yx}r3nc>!iNcT zrXN}eV^PLkDhgUfRl*6iyb{^1I?~SP{aO6O($3(A846FGN^-l!=n=%&IqS~ zS0-Tfbg3F-L4bn>xDnX_$)j(!&$ToDN*r16+l?+I{6Sn6bTJ`;b44y3jZ4d&TjsU*AYC*R{M(cr6PzQVg z>_|+=;YlZ62ZLM7(0yajgXF*!8WSjS^xB%_vogG3{RpY{_JKOkpeFJrIdBsh)KG() z2pXj7oB(MhfSU41EfA_M@c@;U&=L`&raA#>Pb}#60G&1fid4`^+&4VBqZA;EDZhV) zoW#AL6MP;4IGj$ffCGO4Xumb6A936Pp^3{8J8f zUTl8I$iHm@sP1Wg^pEpY2bc+RCaBGFf)Q*ws96K4G$K*UmTpk%05pOR(g61tQs8ww z0BPu)@d894ioFjYZs&|2APP~QGl1g1a|Q>9LX_tMAa3Uj2@r)S&lN!2&KVjY3R3JD zfSDMzdijn2|6eWwm%4}q4steV@DHc6!RO0#&ai+u5W2dj!vVzYoZ$hY5Y7$&aXV*# zrZ*8QeL4~#q8T6x;p_qsw{u1Xh=Mp9axxBvvkzSV|NrG{)D{Lfv_YegIGx=AGPiTa z1Q3M??HM3$=Zpm)3gK+<(LJ3rHb6vSZ86Az@QecxQRp(I4)6_^oiiY(Yk*rFH^2%o zoXvUt|NqzK;I#4@bj1W{x+4NK?Jo=3OY8%>kp-hFar}Q_0$2z51SH28$5^Bxj^;Pu zHMyOoUz%&bFqCjM)_(c_kAa~~aGxC{j|XJ4GQ3cH3(n)P(GKXMCQH{ZMbPmc@VE#( zfr1L~FG#JMZU+yPZYpS75qQlrXy|hvq#<_vg}pSm+&~>j0u8P{01p>+P5@OIARV9; zjnFXy=!U%mFPK2f7rR4$G(TYMJjlPT37p{`{Np^)0cL{zkL-pc4IZ7f;9;50&>rxJ zOgH2VOVC#33E&HJTMvLrXV9hXpp#BOw1b9+<)Jd@jT4Zeo=(><5Z#!|ic0ek9m&i* zSVz*MmsJMD0d35T^5|t1fpL62dRcj39MI${JB$OGTxEoDK$ELKb3vVW*B`GzldGR# z9MI(ID=23IBsM*ISs&!GLS`rIGFchAeS5%R*;~876LfKx>5*L6;C;I{Xw?zqV2su7 zAa($#x`Yk-+?4=F4rI^?R=>r85-E7t#TB+_{el~KNEkex1f8YGg>3DF4tGQAB4v

2mGfd!u^Z}%p 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¨U@#bq!s`EJN#r| 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

%4Z3Xy*}v%K6%c72zBC7NAE_9&Z-7*N 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
    |7p%b3ZDB1Esn4 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 z zUL_-Fh8x;w+Yt6*_HXdG2WYy&to2)oWVh=QP=&wy@BjbZVH({I8kUFnTh{&sot(Ue zp%l5UvwrdIJH&EmW?_V6mez0lt;wJP4A8;APY`z_XNZA19O&2evb;#B0cE3rw@M6< z0v(j%vWi~Z`~oo?Gz$j0rbYssdl9VyOVA|B5rNmfkRpl0hP?!Id<3Y;0BVYY`oPUc z1YYZbwHbhpLIPJP94{&$*Rs48fpw|C{hK6+C|I=xI3G%uS|T~f`h^FQgDkL@Jxd+H zZhkEV(FkpZ3V_PI7bkau<-iu$v>qslhOnSk`9gGn{cio@?q?*m*sZdHScRf(8ARJ_ zX^3b*77M6m6b4)G1+gAmwQ|1-6anX7D}fG<0{0~?T{%j5VZqbs%JDiKn3ty&2RG1}!<73}SSLa&$TwbVJzSffLI^rJ1lH z6wq8117ZjTG#+qU7~Dxm8*Jf08EomE3>v5bZ-eVR)%*rB@}ip!F61^r+uH)}mmV%YqHu~Zjy94ddydm+%#H=sH1 z)&u-458*s;m`L)so)=b>;&1;W$iM(u(sm{fx}*&n6nc=m zSzbyCfi{3bh9N*n#~+d2=mN zu+LwDPR&8IBl%lEYrDY42PnW2DE~GG1&c%F{9s`R1si$(HqfjH#89ZU-5 zq_})}TYv$zxP_n-B0pUF0bMici>hVo54YC%99s0@nF^3s@)A?z=0&cK3>aGa*Dd zC@;Y~@;%mI-02FoDo1VK>vTY=@aLgZj6LJ;b_lYA&CBIQLdBqhPrK`UBtB1Ke)8o$6b`O9vQ zZg8y$%E&ex{H@?)6QF^^5s+2%qV_G=O;FFJLoSPfxE&k;)-R$VDqvRd1ibjU92^8# z(${)RuxSweDCz6!Ca4S~_<5lId&!I9zv35f-+ZFhzvN31i$zJNwlzZf}AN49-RCQ;=ymAU8%^y zXn?5HN>ngChGh4I^$?f3a&#B)w0rLF@@UWt22-#h-f#p2y}0-sY!EbE7cT;*Yh*`&2NHr_XhIx; zl&q{lC$g8Aq9-o!YQzt{lbayL%|~Of`LN)C7I(*8-++3KFJFUux1b}C0YNWzK~fte1;Q0`fE7cA zD|aCj_d*qe4rdhUb`Zc_iYdc<1CI)w7yZvre8>+=%%BB|@HX%(NLv=-9#BHbvVI{3 zvG(O7P~!q*H)xH1z>Axp?Z_zOMpiFgL!uipss=Xne<@GEizyhU>bzipItOGRe$Rv% zK^>0dnL|$@Vj$ft-JpRb3A_O!gkgsDi#n(o(4tuc5+Kd4Zx|tm8T0pWf)34qN^?V{ zA;$@FLQY0NL_cWdCr7sfs7ot>NCeR2dK$9$0VPxqKoT^<1pb!mpiQvg(vibPgunF! zgxl?40qQC3Vg=2E!si~qSq2G6<*rHoB}Euh$^7Cz^)N!Jpk&Of+7xDP`881iWi4hLZT1V8fa)Wfc7GTuGlGdENyn z1K#R`%|bFi^@SufnL=HPRJ|4Oyu1#|5pFzaLle*`llf57+yuHEL|PA&Ds{UFpsAby zv9}bW^0gaC1!!}`|56<=Q=s)gB^GUJ+gYyKUt5OTq2r`Zb+_{@2joHhdj@77_pdBM<=IKJrdpQ9Vf=D3>S`&#VlaPGr z@WKkK;b3zS9=wWCeCfPk#H|tG!8s6(;QN3PjWTFAq#h~>s#XxCUh?Se{Z`o^2oL?BkZu0ryA+6y~kwBCdqV)feo_yL|YWAKVSp5DoS@_+mf z%Fty4-F`3`l!<#M&jC>ZFIH-Ul0Ni`nK>fD4A9FzF&4q9yvR!f4LHVK2Tz=IJBWbK zh6N3bb-F${?h3k85z>$Z&0Hz)Z#w|mM^gL3p~SPf_Ju;7WVh>!<`)XPKqX@5!OM?2 zFEqbkRCK-bS_>o%+A#&*F!)*;dR%kD+X50HYx;6?sDkjn*{Yo9QeDuLFdaDfg6 z1a+F5!QncSya3%R2^vr?1s!%AdZ+W?~?){@P!=b1@J=O2de-7|F?%M&IPT!1(zP6-k$_0WCLC#X+a$Gh67~nmlvF%2nVg* ziTwk=n*h9$SThwAh?3Vpfye`1-TURWDfp%c#siEOKx3s~7dAg&?>q$aE@) %9cg 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�BDBeLpP|pywMq;@j4fr1i(gG!Hm3t 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%0DN>+&DoA6e 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%0ATXdV%o*Bj^;yBi62GN~Mn<@PJmk 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 z

    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%0DfDbj7& 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

    aJ1o>1OB+VC)ocJy6Qs4ax%s;B;DAsSxn-p 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

    +HDG2;$vCJQ6d4qP`F?hsC?qzDA?`o(OJmR z?8pKhdbk0)f3e#~MWZ`JMdbzP!fVh(_3`h_pvGRQN_RB!=Acp$v{qTE75pOP3C9nt z*(Su%E%CAdR4J4(K#K1RANV&~mUK72;R$@fH5D9iFRQ@kc|zMabqBD|y}Vult;wMj zc>NA&i=m5(1oHh)PeEPJBQl4<@-N&!|NGDS{4zHKs3p?;h6i-XHzAaD}&>f;;@?t6ITGL`1l0wa=S(_1b zy%MBqfqD=gexSQVd&?O1g5s+a6n>igEydvSoG0+bvB{7yOacWmxE%=#$8|WuaT=rq zfP|0wr+@!hk6+?u0PVB{-DfP*UCYtw`lOrv+Ytr+R?t1YoyQuVfg+#334hU&$-vOf-h4#h+mVJ+!|rh8U6*nQmx6A( z05{n|-GgwCZg%LtOIUD$!ms5VC^5d_=?0mr6Uo5PZQkh$Ispd~qA#~0DxkCpXjzHB z^)jfu)n0 zA#SaQbvxSs{r^9~@BlbCKs^}#mRAsu2fa{(ntu~+J~Vyu_nrI;H5SuA(AA8f@~zYL z!OO>+|NaLhSr8wTN?+8!2lbqVFK{zJ5^O04Xq)0vP>vRZ=Vm{6v_+z9mYv1`O<xaY-=<-WQ zxepD$x|KNc_e4-Yb-F%z$qEfPP~buDw|imz?%)5$L)Xu7gW9(&-yCchOO(GcaFob( zdt|hptds7Yv_Ob~q4Q#A2PiLhdqi|j>|kJEI1Fm1b{!CAV1OuieIK$uF+42z#h1OH z#zV_FP~(9o!+?>2;l;;WU`Kmks1#j)N7(5+OU0@KZ-w`~bX?EC-CpmWp%vKX=$ z!d}#ufbLCcI3mQ+d_<(P4P<%Pi>P3*F`x_kU^whWYdBc2^+1W=H#e~J*+9+*4Vl!b z^frT?f2b2Y?$8|;(b)uYekUmOVK*7}P6qn}tn&3WXkiPwckT_3;s3A~t*HzQohB+T zd>?@AfoL`S|9UqlSexGnWHJ7ST{Q@r(rP{ex{DAL#2|Ta`n>-Jls=2kLei(k|5A?b zQl8G=FRHD;O_a{V(4mu3i*C@CZeCE`-0Azo(u<=+2|oJ3-wGb^K^}qVc74+61m4>X z9v~_WgANXL_kn^7CGq+`(Y&a6!SX~|6*#xE1phDP2>TxZ8fgJn!yv0m=oSa0Vssh7FK%0TlKi3=)44{`%j4*6*iL>N6hx^|b<^I;~U$ zbSpflF$jwRBXA7BH`U7{1wZJV0Q3PM(7+Ek?D<{X0)z-Qo`0y`l4FE-%EKqkH6jw%>fgT z;)f3wKN;PS`1uPOSDJ0a!0^%t9-oHa;4ucepbvX#^wRl1#B@hnE z6^w_$*WL+~CN;km0O?if2A4pc2eo}vSS)!|$}fX1%zQBmw6ViQh3EAV!`o>STHn?g zb^EArbc4&9;|IVt9R%HFqMI?(aRQt{>^ zHk~)X1CgB~Dle=-#*3)DKKJ6_QYPqqf1OW3MeM{KpdwcBB&di5l_#CC4_@e+K}wV3 zkh@H~4L~UzGA3IZf|9HuH*6s#Z6-zr29%@?Dp{g9x*5RfJ0PR=Qi*i)um2^o;8Ngq z3asAg21%7ZJ?;P=lkN_E0J*>bI^cTKjgl3{io`9gxyHX!#zvD_7A0R{8S9zyJTCsk?3>j+9-7 zNZBja{QVD3&ye!}8MypE4k`a-x?@4*fAjDE{4Jn??{9844g4+rpwZA(k?+VEfHcGsF*n(9oP9I9yH#C6kZ^&gTu?C9c=B()c=U^ z!r3l?q^2%VISnem&#Xo+4j}D`;1|obf|9z~F;G(Hcu}zc-sy#eFDN%OgOvy$<7Q}l za|0BPEh=9?)D)E;AZm>YXl9^$iwdZ_0=nw7GekuqwVM|_meHdEy4v3GnocCW`S_m4j2Zc-X8wv1z#~PqsIP~se(70~%5uL*z`4{C+{{3eaKZ>Z| zVme)Sbh~nNx*q9fNbME{douKi;iVM<{H>rX1y``}w{8M04sbov?Ge$jy#|y+-{I?=#fq*iB2bx zPA7qGr-<$V3D7v%OOTA~k?#ylU;}sXx0JImFdRP&x?H*2xSOr>VBK%g^#r`PpDr|XK>uAqG1?RuoUfT!Dmqw{#D>mJSP zme=^3K;!An|M~gbLH$e6CJ@&v-LX5ug92Vm(_mugtUb_tM4;RCNM`{D=+-pXBaniv z^MhYJGWbG3Q275~3rN49Zyl%?8hfNWn4{a2$_f zbjP!F`kD0l>2${P^wzQPx4vRzUq+^ zs=M?^cU(kg7)y7tgk>>HscrKQrji6u*R3@P976{{(f9<^19QF7c}nvTe=E2@UVA{G z#IhS4TrdBDWWnvfZsu4Hg5qzrWdUC?2u`lB_CmMoj_%MS@KLc4P;ZqB ze2~Wf*P#9axDK)fHEu1dIQUy)m>Hn`cF-Vd88gb6McvGuRUDnJ2cT6@=nimNfu<4g zfI{cb&d@EI7dw47fKw2E%NiyI21upB-+BZzLX3KBP3s2GC^-5N8`{ha49(h%FK7P! z|G)DvckF>~_RiWPr7F!Q1dh9dX7c`bvV({Aj=O`Jn*WjKQMyBqG@nrDWa@SW2dD7= z|NpyPccAzmto7w#P*9dJXoeo>jy(XnNT@q@M_|Bg%!?*fCWdY|neH$S zkbe(php}|J@pOU)_*q^?gT~Fl;Rj7E;C5K2>z0@6K{B9qm!(I#-Bel+l!!t~m4FvT zmlzlt)j)@DgR(uyPM+@A9bqqC#eqs2P$#L=jib{IWXnrtkSSpEyB!o-50ps24AH#= zYHff5sZjxJ)El1vrANABcf4@E2p&&<`RLdG|D8WOOAlxs?DXBx?RucQVG5`+cRc_r zRwjY!E7t?fZ#c64|2O_0zyn(6p$?6ZZeMVEV?<75pyim5L>7mL59XJFpfShN11~{m z%OEQU<;iZ>Bh4I;Z23|Xqz=-SfDF?#f+sq7f?m|ugGv>Fmj!?R|9`Pbje+513ZhEq z?@I<9IS#5%F^6jWKywwbJ9?YX^#A!E(A&JU|IhynB}UM4kmd~_p%Q>Qb_>i}qJ)LX{TozK%-qQcRcqr%bc9|29JjwZd1 z;KUio6Y#(A!~eoNVgJinLIZYou&K;D> z!LGEP(991B#n-U?fcZSHr@auH#ROev2&$h$Ux>#1|KE7DY%h33zVXc(Pz-NT0aaYx zEh?a{VD}Vo6QmQeE`S3x-veL%F$dhX=yr?f-lB4Wfq?-ut`!QZyaRZ;Jp{TdSS%|z z_*+18D4+!$pv-J}k-zOSsN{Xa)A_o)Mnxt3May|`@-w{Dc@UgbKs!1TKx=2+VbwNh zo~C&Zctr^#e~T0-2SRvE{H^t%Z0MpQaU9&7htz}6TKc-?@y=tNE-DJ0H#9$V)~Lu> z{@`zB16||sh66lP_P<0$<$tgTq(*Gb0o9oLOGePV zWf_CzMgCS@(CI5KDxj%#*d)h?>{vfD3 zI8*arw>yXAWo>tsnVJVBFM}>#?*u7xQIY5l2Aa|T5IiZX#mK+ z9J0a(6sMqJve(@uDk@zyCELHXlXcZ~{<<+;v(lK1#~3qcw{ zo!A%^9?OHB_av|J_r!v_ho`%1R6v)@OK2YMywO?5!}z1KP6Rah?-tQnCje@L)k%OF zVFKW07^n@_86aYKsq@1Nl|P`V_|kxGkcT4znibx6d-$~8t}p@#Kt`#$cYq2)=p4a6 z*c`zdHU@?)hTuSOG75J9mCY_H9Ni%*JTDi3jsQFk?qP#(3kLg3q0>c029f_E!3NF( zhItGOklBdN8`>@^ps`y^7Zn-)wihhmmO7~E{l7#-0EEGr=6|pQI984bH2?fxV%qI5 z)2#l!)7_`jpQqEGrPH6I(_f_1U!c=pqT4^BGd!R>Qlc}Gqf@dolBF|Jpfi%EGg72` zj|wRNrW%81P5E05*%%lakAMmQaI1@BGkt50vHg87(HWuwnz{n*#byO*3<29A0zFf&WdleIwlC8~MZp>rs?C=`rHi)(*n=@D zD%}Axpf<-JP||Wy5omtH5&-HFsri9^DrJ_JlN?h(&;SF=`7Lh906)i2S|V#4*`(e3D2(JLG#WVFV;ftWo-Ql zYU;$ONOb;~$?T${AsnKj)9LI38Vu?T4ge*lX65%U1OEO0-yIW_e7bjn!Vi*u(Niu9C?uIceMxBAMIF(3*4o*Dc-3HwiEDg^X`CFzlGB8+v=Wp)@)e`{<-4z<0Au0-;*Fc3IsHNc) z(&?h25%6L?=&rIO0w7__7!?lw_B>GNdVv-T^-X4CV9@-2@IMp(`r{yrW`4iXe2GEZ zpQZEk_ge>l%WIyHyagIh164KPI6^IjS{NA^m|avjgh2}qF7bDofEv!AMgRYy%d5e) z2DDE+|Mr;d$Ie1=MC`IPRhXs=^sw_JI_YF?2g9XkK{v55$4ApL`%C zsbfTUg++IPN%H}n?tm-W0e24mV(P45={(H$1TE9)E>RKau2B(z7P+8lRdDeLiuf88o|l_JO+JwOIY5=&%R*>- zy}K%+J6xdiVrPg7M|U`n=Ec?n{C%M6vhzG7>_K6C@P|BTs1OuS-JrzmBm$~_8$q!f zq9UQ~!~sf_;GhPn2F1wBOqluLS{GC@z-nDk54rQc<^|2`mOuF0Rx&a$WHG`M8FGom z-)aq7&jMO}h$s(Vyp~~Lc*zIy3^@F?odjOifr11Pf1vb)91L(bZTR*7|BKZi{h-nu zI{xRP0!o}ZFD8TbeYk*E2!^!M!dj4j|hlf>4}d!3}OCwjL<8=&n&QXnw<^dB3wpMdaXr`OX>@ ziQvxHFI10#lnA`!1Pzf_NHZ|J{Pg?({}*{6mM>%$6r}9mQLr*_UNXG&^8C;L|6h24 zww{1$Ne`dyh=7+2AhBcp$nD9n;1^RDfd<4>H-iSm1iDL9WWru-QU{v_ny8TiH5MDd zb6lWQ?I6&6ge5xe{{ztY_7N7aZP9UuLBk@5@iS+ziI+ElOw@t4JzZ2}!0ld#ZZ^<} zkpQT4af|2{unu71Z)yT1-@1@)KbFoK6&`Cp4*q8F_+@}Zr;iGFAZQs#MTS9lg$}6c z#L<~y(VM~2d_bqOf+O^Q!H1yU5EYf6|79G3pfJ{W@es7x-$liu`G^9fNddN~NEWj* z-OQ)(ngf#lx|u*t5_t7G9UO}~;JOv;KhQkwi*^%u(By-H#*YQmRDrm%H40R*f_rg7 z&7gHmSx1oifne<&hgldP+CZ(30Ew6ChztYj{IkJbi0Fx>fs~Y}f$viM|1tu!R)?_< zI)4A+_=SJ}S<^Sd<~Mx0LsT-lOH>j-Ijy@!B?TV*Hiid4BWm|S0qGXfohQ;ACjcr* zEb}DzTLeKZWl;8WQ4#5NQBeW4`+8kebUIyBBtR{1P($b?XhsSY5a5c`MMb7FMn$9Z z?*9@Mk$_&7>7k%m%gzv$ihypni16kEI*^zM2Q}Z1$aEeB%}Z$B2nY@XX@B8h0T0IF zZWk35kh41vYyLj?n@RIl>)R4R%OCtLt3fgF7u4zmbyY5vs6kzQyz_7OVElHkn<*V`$crKbq7jx26A)?b_TL^1`2cr@~DD_5KE=IBV|BMDIXOZ z*hpzv^AR6#BzFdi7#?{21e)v9CRpC(Zvic91)V{CHx%mdc5}GHcR`#3a{9~tp!(h~ z0vyIu4|GRLe7}L(e*4Y_vY)@T{{R2~FUvu3XxjrHdWNJwaQ_Z8{>(fdlp`mv2jw47 z6WIWIj`(i|28M6PI7*8^DaeBdbP>uAP(G@V>E`IHQDL$C$=@;`B#_6^UBS|sqr%f! zqr%Z$$I_jn!qVv>(CNX`nIY1hqr%at(V4-~ou>e5a@T?CDxS_fiOxEf&N`mX>y76@ zeWJ!kAP0Ba@wb8s)#e%%lmGlJ%R#9pETY>%r3LCD3Wn&9;K6 z!~!yb*$0~6>~`V-h2Ft~Kbb&F-Mm1H2#*MWD#|GbKqnVBACZ9;A@Q+?za3#JVQv1; zRkE+!Ma2ZxErv!%Zy5t5YankNMbSP1?8Z(H5&qUlP(G~7X#LOMCl3k_w+PVKQvgr5 zgMj7*P?ZoA_F^AsWa5ax>*-Jn(k68KWq?l2s0Dc{2<&c{+DQ<#Fn9B}g64y|!Qt@o z52$tp*MHq%po8B){=EryO_*n(>6%)Lkdj?IF=w2Z}SEPL56w7El-N zWjM$n&^Q^IIie`$AXTv70>ykk3wSj_`~gV8k|zKvSUe;;JvhKdx4td0?+%dZt^-@r z8KS}hTDTgb!qYAG@+qk4RK|d2-%>~k_p%!19G|*)M0$3M=nfF*_TaHRRi+0`F6%(2!k=n>!*cK! zQ&3>o3%TFmWs#ucTn>Qlr``yP7LY!cZVSunpoUFJT6bPZ^BbPf7oR{E6GHmU;1n97 z!lQW|+-CaGy$+*Q{Svb9hQIAFXt3-@7URsI@UZ`(4vL3Bv$VhdmxO`x7pUI}x?$dp zWHE;SFXQ-M#uFI&!WA?U5XRGdM4^|5Njr?A(~qUshUuj; zs8#@{yBEpA3=A(pojPa&gHoXIf3f@&X#RUOtbPD3+_eC$_yyGuh6h^T^0&+c1uSEC zV1z0IsMd@U>8=v61u^+sxE-x*L{v`Q7d|{}$nIzYbcM%Q6=< ztk7MeVgjmB7=J*@v!#|lN`HgK0vKylOgfzeI^SvD<8K8Ww%zTb!U8&ps5=l;lynF2 zSY9X**1Q0U{2xpKL4hw6LC5(X5$JpY3u{op-W?@#9N96Jclp~vOF2NL1<3ARmKCqL zLG6+kEX@{NB^8#(ioU=!ymSHu7bIbJz60M(SfXMR2&#)ZeN-G?Fzg18X@NpU^8@42 zm!O&))Y@x)!_pa|A^_e=6#inD91~~_rVMC~%0<_4}w8yaa9J0J&4! zMa2YUFR0yr@CQ?G1mnvip!I8@_y~WYbP_aqyKN<8@>T&}KZBY_F)9Y&W~FmR>!k{X z)&r$1t(QtQx_wk+pp_MWD|olS5rycu_`|ISN}qsB&rauz*SFFpbQgotQ?Hv%r*lZR z8w+%sK_^?c8_#h!&<+lUPB(#W=ZNDDCZOm#4yuD0K)V|x0$wzzgXa#KYg7an`CCCN zQk!d3Bp6HMyIoXxx_wkcj=TAQHMs?Vyw&Mu12V|X1H|bK(CLP>5d9K5!$OX`fhRtX zyOn?>kGti7S~8ts6`jqXoVWud_|gkh0ot@OG4!@eO!)I3yf^Ma|DXR^fdRek3==?i z0L%UP_a9w0AfUJX6?n*(;m^PSpzs8(x_xnZI;ea}UI8j!(A%3H-8Cu>-99RyhEYJb zyGnPCN(^Xdw7Wzlq}hU@vs|OQL?xoLT&KH4#ig^{rn^9-gzMlr&QxPl2~hD6qQV1e z`}?SffZ9Z1FUsdJF@U;Ay)h~}!C4HTh0KAyJ}NeWz5W`3pnVGg|3Q6gn{FQ!k4~=c zaE<082A!dxBdbd6>s6Z{{Dz$L&v>9a1{ABZpdM|hPV*7ucIFRuh@$2LjIVD%Gjnel z132hjAAiBp!UUc_L->Ch*#FB3`=1@d`z#Reb3nW=LCE_Rb8&i~1)KL-5Z-sFSHt0b zUAXtbj0E)fke9#9`}S**~jJ&!|U!BR~kXH|B&?$ zp!@==bV^hdy6r$KMM^R|e?ix@#&^egq;~6q#yG6AIZ6^>OOZ>{c7ZZ2|3=|%w(dBO z&f}fg9Non%2j8~ANTd4~Ax;@`!-3e*u?MTrFjq|5lddUcfFjGrk{4q^(Mm$;a1R%sXWI(J6ccowt^P>1wf1s%3|)E3LfFG4`E{H1~VbE zeV)Hwc0)TP-3~UO?i@JW4?f^kWnkc7fZ7@K!W`m0P*<&GHfa3d4bT5_3yA42y26+k zy1|hM3R-uImxn+`LRy7s6Ab^q+=9%1!40}K>^-PQ0}hu?NcM%~h!vo&ENB!lEJl>G~!Sz7QOFSU5E zGNg6G(0YQuFAMiNZ&2q96rP}Uf;_E|a0c;Tl~_xvr8Unp)4D%XIQL3Zx}ueJm= zx1j}o3wS|;;eo7_7e7{j-P3vi)PLn~2?A|(c2P+I6^qSpct8!MEa+m(5*3TE7oAQF z487f;HI|({-~|ueE-D($M-&3GQUbzW%#H>Z*?ZVInp0GC{&hmuPaHq6;1D}UC&beK zTU7oqFffFNhP^o34;qkA=sX5GQxLq~!bL@=J4eL?G;rVTqhg_XRP%V}i{5a?i!UrM zlsh)R;Rp(Rv3&#h90n0kfy2~#prq^=iv>e>3v{g}E2#MoS?dp3ui5zlJQNAeADuob zpuR^CXnE<2|H~N|x^q-O=5&XsaI_xi_EF*KbY&=+0a^nMnwby@c%j9>1nQAUbn>XY zc()d`e24*DdX{!|yQo-nhp4c0GQF$@^@Ks=OrWB@M8)OBk+tA3eF++8ezClqiJ|%2 z|CgX4G-yK-N`d1K9LS)NUKoA>+VI>A-lGD_Kj8ND3#(oK{x=@GG>e-dxcQAucP&r1 zF9$R(L6vu}tH5zr(DD<8PS+#++t`~QGIshN=y1Jq+!Zu&&Hy^7P8@V91Ed_`-{yLy z^HArH*9wqwp!p34Xpi@2&_?qg7r}1l-zLyl|*-5 z==`bqqw{*_BkVhXo8Krj`>4n;bjP0Q4N>6-9rhT-(H(oCldJhKW2X~KXY2|7ZSozl zS6XhDSarvq=nOs68GGR+sLpDrXDlwA4_Za_hNts$^Kqt5(9JHLzDK$_0y}-Lym-UL z#L(?~1=P-J?5;i0EAm$w)CjCS()qmeGV~Jl>&=fpbpFEbw8qE(K|O~%pj+{jLG^Tq z3O~qY*PEYzIQW>k^H*o=9>!aSw>xW3fch-=yJOG1<^!!$;_h~4=?=Zp9nI0n)$8@6 z(}{)gN2l+V&f}J$CrTf7x?brHJ+dFPG;B9`v%T*LNVsAe!f@H!+Nfzs!T>D&MPXEmPzsX9TOUxD5k$Bh4h){B8gg@UsfUx23mK#}%7 z4cw1_k>KdfmpoF#g2uJi`(6-0PDii+v4|>rL-f|4n z3!=gLA>|*~h|ORlc)+tCH7W|-IVu{h2kNpwOT|jNLm8Ui@HD?*?7Y_e=ssxt;F&@e zV-{CHc<76*3s@MseHogMC>UO9Jy0sid9JgR0o1Fy04X{kp6xAT_;ygCgzxy_2me7= zt)@0xbC+H@#=_3f`K#NP;q}S13C%}%3@=4@UI6Xa0R`+aklgF7Ah&`r*u5{Zw}JXk z?9*Wbh&+&`36RD!XtOhDafjxG?iv-1?$w|Hp3aw=pk0kh|4USK!o!09hl1AGv|g%^ z=ydk!3=U{M!UJ(;8N-X!|Nj4feI4B60?+=xegrLQAn6elU%@ZFwSvOCZ5k-NMY>&7 zWd0Xeyf6f}@+6|+y?ao322vju{NgBBLnv4SXjnr8R#b((kb+crt)M#--DDsqZgjc{ zfEIg#7GrXBegMyI9!A(77W|?VY#uAZyx!&p5m0gkx9Y+Bc)HypAkBM(RqG)WT;Neo zyjGPl^iEa~0aa5B!VCUI*tt;#kLGlVc~BBmBOI27olsF!v2TbbROs5 z?gkpvZ2e!tnFd-*4eH*5m&axxLds2~(@miDQe9NHn*z!)A20`(F?9QJbh`;y9xRz+ z9iqZgT%maaG}Imt_CMUg@IPV!OUdExec*%>7SQSD)A>vD)=Np774 zXnw;2$`P-_L940)UdY;li~i;VjA@;2E-#}&)f%{+{vsH3fQA}^@B9aJ9;raLAID43 zHa4gWA?dq)^S}SB>QfNyJsnVo6SO~lg#dr+OC|;e&~)`j(6Xd(7VB^h{-#_|XE0m_ zG?{vek%3_)Xqv3s^$FyhD#Tu?E8TpZCm<(SwN`<&fVN`7daC>_p!yAI$CLtSi4vrL z0T~|XcD>RW#nCO%&E4$8!q^@91UcVzy57*d(CK=o^8|PqduQka=$iGZjIcH9rOs%Z zDvi+wXZTz1K)Qpkm7oD~{1|9G2y`uG>5Wd;2i>kWv|S%`y50c|8G*K#YwCelJ3^Me zftob8I^9{cLmz;bI&y&5Jc1TKT8G}@Z?*+_I$QxXA9g4x0KSu<&Y?R#pxfVv(Ve67 zmf|VUHZbm)j3)$db-Me27QVT&@NZ*)mFJ*hX#)Q?CKP_RICLpJbPavy#pY82%_kLF z4}gmje%Fhgh_Nux{w+u-frF?ds@wI+@xw?SjRkr1CFrEBZqWXB=pybX0Wa1rVPI%f z2d}&aADYn(3IGkz7CO-0eR#CDg4SicJOG;ijfF)LI6HzO=>{m0VjpyVhAxf+1*f&^ zo#K#gS5Re|_5Z)Y|6uT8=fC}uZ6F>zvPj`umM0c1>x0{0Ig@B+JJHwb5j=O=*;9@xL zCIf1!oh2YO+dwt2Y6K=s6;aarA-$V8&#yG!?GZ;5S55-AC;KS z3!EqTTR`_k@A&_pp8-^wT3+bf;8(tL}7zo!pm zy^jh9vyTdB)e8scP#-@Z(Ar!#4sAE+Qr{Duemra7Uv=U7B^7X@hQAcfu|=(JT|}K07vCJ&;X4a=$sAI2tDow zUK|HK`0ThFXgHan^+28D@dMxr6R~xEKWJ3B6TE-E8xoJueXIPfSHS1!fnpmrd|9H# z05PC;r|xunvvi)&c9xlG?afi5lEn}d@W0sNg|{;kL$^1Jwl`?` zdFOeJo{|v8jo-36GElG9e=?o6&bY|&v<}f?}nlXg*Z!>KGJ}a*IZO;ux7M_{LSF;P;f?50cSKwuT!WyL`4VG(P3a{`~_N{U*ZFv z?5{J0L}e!;EkKiji%JbV4S?3_H@|5>xErDg8vjSrKY_ z7zv8y08s9D=LqggM;M2w#55lfFg(F|p+vv=4M$-3i_d|eQVcXE{vWh!5V9)Zr6Q=o z0V=m%T>kw3|I4@k{{LtE37QYjVh9Wmd(o%Gz|bA$)9n`knlAU8sAJl^f1;se@f7nT89AmSF#dZ~`Lw;9|tJoNG`C{00Hi(sLbdq6#%FX@Q+ zu<#d$R)Gcw!@5B|obDJEfzBH*K!tqwW>6aoxsdGq2w4YF#t$kzqPyJ$;^M*U`d$cs z{{J6E3{ohA%J&!1Ama~x?}GIQWV%6<)}Wbx(3+AO6^qUrFE)c#NQ1cG4gsV{hS=N* zU3*a`-3d|((gxD*ssNqmhuA;))Bpdk?}5|*i{~r<{by~5S_j$g0xChFn_RjfLpI%O zz=J!WMIqggy)dBRA$S!5Dn}q|9VUWyD}tBlbk}iM*75MS9EU7%Pyy9NmWTM8L444H z7f{#cg_SC}b_LZKMxa#~ao~05piOSD%^v(Me?g<4@ZBw-(@DBPYuX`G4B)+Dkex1_ z*TGwb4{09n1U24jR1`qFTNKzp=MRB)x3~m^A-1+Kg4&xdDn7{d(_2sl;i8h!9ioy0 z+tl%LD`@!zBzh)T9^!8`MB3-_oei{(3$pj68|?H}SJ1*JH_)+fVxR?zU{4;M&4Adf z2KTzX25hSu%&VQ?CO^2-!~-d2`CFO6=0WNw&{hgJA4yQWhXsI}_n>nD=d&QTpmh7F z@U))f@3_j$zyMtv4GMO+o!OwPY0x&KbhCkKQ2v&3knh8IK&|c^Mg|7(W)#qTMt2@~ zGs-Q^7ocjd^LXdc&Jzd!%4`1Uu2JETeAS(!!ee>9^S$JK{$3N15ugQeAhF|}?N9k{2o4PUAK(D47(!G)#q-OFpqPTRtA70FZ(R@C(g0eT8=@iu4GVB} z=%NBzSj7XX0N~+r*cyH@H)ywsO7jr`YZny-{^m){7`sivK>I8}`+p!iP2{@$WSZ69 zgF04W0iAw4oqjBxejJ^CBAtE$oqiJNTT0F|qiiXG)EC_@DgwvR_r{2TmaczuQITNb zZw&^ef;@%pI8cqsq4~P=hH{Jw2V|wXOy>>Is#@@#lKYwmC4Xz@fvQM}&R?A|Dl(m* zEoBm&FF`v`K+8Bm?WPzNo$eSF9m}7RulaitK=A|4OW=(qBGx`2f3IQ!O*jRCa*RVK z>ZXz|kcJQy3DBY$*rpO|kQl@eQ22>J0&goQIzdZMy)C-KWI%a*Hb@<)r3&6r688Th zcvK@tMW^%d!Qb+r)BAsP-jaO9-(v+T+g(&N1VL^M1NmB_S?xXJ1;&e=VLY8~9H3F= z&M=YAFoDi62~Z^n3U)W2&M?rPB@R%l;$;)4D2HU+?m8LJoFZrqRW~1GO=;spP?z2E zE`Qs3(9+kFka7wX5m*j_fiK_(l@M9rT_TWF(0Ta##qXCv?V9tP_e+X9-F&+9L^{I) zwDSZy-yi%d|Joju%s~5wz-~J3q5@j-0&3ENo8~W@L2fK#Fg);59CZE#s9FsRF#K=$ zw)1f3#qXEDU*x=5QpNZ~@Kx(2{!Y+wp&$psXVXEqq=VZT;IW;T6XEk?5OYAQw?OBF zbo+5=`>}MM?mXXl@!)Uy@Ato7?7Z7~xcMr>_sie!zMcbZoPfqPT~s7qCW71q4L27R z0W84*pUMTDEeF}p00|DogP`?&KmYT$di?+YA3Vqa^S=PbIWFMz{jw6Y2^L~o+62&k zgYF!Z?5cTO@-AqNEoiOnOCOM8(7x--umAslnF8X0^Eg?I&!1^owE;-x1W~%LK7N9ncr? zAQotm>5EX1E#RKR%OcQ5fvfRM3?Q>X5%!W15q#kKHTcD}B2arztr^^1`w!}_xu{6| zFR;jBe$fp+0R}Y62KEQ2{s)g=CWEznZUSoodniXm0kqAn^*~)!cZrI|YdKKBg2q$B z175INfV&y32P)Jwk1-x^{Z{AK?P~GO)rP6$E>uYnq$kpPpzSKpjCd* zRtt2z5H!;9H7xLdiHgIE4bK@FI&DDf=w)6^0c~di+XQO)f!3y;v;0~<-SR8H+gDHk zfF^Gwf?m`agZT&C8ZI z%fvt@0D;ar5C0#a!1w{Q#~XB7BdG29!X0#B5a>vu+u-sfl9%ar=U`>M#TbDCP{+WEGiheg9X&SdN~VJrImpWNnm7P;BUPET8aQM<0FXa zr=WSz@+W`03~0Nj8??;;Z$&i!tmkk044M%6VR-5L$Ic&`7dj6?vNL#3C5xqt3I~51 zKd2k}h9xL83~>|&$UsoX*w2R%H06dmiUclZTmP3NcDsR=I%^)X{Kenw$;iL}YB~gh z*5tln0Zpli1cZW`$1m8PF@o20f_DCgv2-5Qy#AdHloI$`K<8yc>tKNw=cOP`!T+Vp zp=k`%|F8fZZwwiCPn&?X=X=}@G{who+zqmY%?(__cK!knI6)19+X1@o22@0W+6Pvk zIyD5egGDAfPV-lMZ07~oU^h5@=0As|&t}xH=?5Lc(aqN#qGHi`TJu-)NrC3m3atk^ zFYvpb?&L#FuifB73t$aFffsuwVm1T?UYN;&J^u0~yu1QUI6?z&=VR~`4r3h)$i|oN z5T#3R8F)AT3-x)R^FQkl>CH#Q0o-M%Q8DR;WJ8-6}r7;z9CU5!2CPtd+kZ;oc=_uw&v;DF9opxKHaXyH|?pj|A}`SIXS zdB*R8XJ5ucJA9xevXEZ(>%E{1+g;3}UCi_PT6Zx=x3iCSF-v!FK^|K&A5NdAHw z37Y?S`v3n+M^K9$Ji-R9Cy}>Az670Zhg5~;f-Hp82_Snw9K~Gx+Ze!I=Q4)Q8!tA#0dJWWg-8}XZsryMoBR3>s9xO-E?dB-pg=ln zoj;*nLmo&s&>h@0eDV9q|NpPwLQ^edJz?;RupCg~`m6?28Gsr-pe@59-2oQg9Bi0M zWgv44GJ!!a;tavn0C=7Z(ym0v3E3mbK|KgbKcV4<|HFb`e9Q(}(g?Oh20WKtqGHf` zpd_+etlLeb@eydbdgCt;SrXZuCt-P%zYVl5PxGkZ|JJu9b(T3Q7W{5GDi*MUGT;UO zBSr?s92J*NH_)UK=tu$07oA5L-UfY#SoUM%`x`2TeqD4xK{9MWgN62|=C(<;FybcFp6 z2aN@Trcjf+>lC!>WIA6q|F19O=zL*#>HBxhi>)V1wLs1TE!zjpcYwUZ3|f2~_F_Ny z)E)uN7mUYWI)Kti8K_h<>HGj1yL@r*>Hq(r-k0TxB2UeuuXlr-1!~V&XufZK%kT2z zCGY?L|3UQ(=NB{r73<4PrZV!N5qWPZj_{$6b{{M%l z2CaC4s)nSGu;3S_S)jN(S_MiV;QfV-d^{?ki$}l%DA3ucuorzoATbNjdEd=PKtsXc z`YJ5=#n()b{#HWz{jll>w^ufUO>hRA0Ge+FE%{ae9Y5XeqoUJ!6tsS$@hoV33bccW zf#2omH#Zw5{#MYvBh7DE0t13xJk$jz(9WZ+Z}}kymx^`%Xnf8hz`)R%XQ9d?z`)S> z==1yk|2YqJiZ%WRiI*Bc2G1aMHCn!^fi=^^5xY(lK=r_jcF>)@M+87KkNCIG?-$iGK=Zxgm9PREe4ur6wZ;F^GVn|_WJt#u5_bndn~9Gf2hA`acLwi` z>2$W}W^R7)x%q@cCo|O3uQX4kcAIOSu)I)a16n`A3~7`H{|{9GZMjhZO#um~cA7UI z;ej4j2q_;@o9$&wo+EtqqWZ!A|F8E#T?->0^+59x4*qQiqQBob4ABoxACuETDNMNnltMu>77E>U7R~?v^SAJV znm=rYZ&f)sKqriFFfj19uz?#S;FDanb--2QH#ZxFQXSl}&EEz(tp*gk|HECtQxM%@ z8LgM<0zuo1z`I33%Y4FK%;^H}K>>|Zf=;Y`+XCLv1sY*=01u*rhNc)8jyr(2;~aN@ zG$7Y>m4MB6U~y6ON0>?tt#REH81eN#t)4U;-`q0wq{zMSI*u1w0)Ess~+EeBh(cUm@c& z3e87iAhkdls9!7q8l%|@ih%u~(IC)}Q?D0W=QYrMAI*mtZ7S*&Y!dnV4uR6hizFMd zazW4yEo+(+CO~gg>AYrns`MgwA=ev@|65c*YkosBKo@LqgANt}pYBkiV)4S^_y7N$ zE-DVqM-)IygF#b&ps9@J$O(V`Hy>jR2zxOPwi1rN1+*5jw}KV4I;Td(Bugj!#ltlW z44OYWkM%k*ce1FwIMfKf#K{6YEYIKK1#;dSmazXN;Kgeu;V&3(gWGY(Kw-uXT7LB$ zG&s^-0&1H;PhIHrQBmpc2DL~!K}U!9sAzPad#wN}cR-_D%?BB~S$1?d{^#H3#@Kv} z5oCr4DEEY@i16?G0ScRV&_*i$DTi#VIC`g{bh9 zZUz<0-&m?RN>|$Gmu~8=Q4whV&&=QQAJn06Q4u-DsNZ}Lbd8Hh^8qH%K=A9n#`B;p zWu4bvE&|QLx~RxBo(HW6ZuYQoc-apXYWA>U0uQ->7LYW1*f72<1tl{`NdY=v0urwR z3=I20+3O`}#C!tC4?+L_|F_ZRZv{=yHm0bEfQDr{uYq)cmQKCY|M&m@aqtS8<~Ka4 z-Nye*R5V^J0o@|rY21870Fv%uNep)XOLL8i2xGkgc(2tlM*Ut##!~KM4Ei8LLCygA zc?UCWjjra8=KoCm{)ZS3g1WiK7#SKWm>5bmyLW?P0we?)On}(Kzt5=o0AuqZ#%`1C zogX_q{!RWj@Z#4ea5RI)x^9D-*>8A2N#ModR&eHTu2FGdTS)toGqC0@)xC8j^n&S?T{bT~&0X&@nn48K#iv1&c18h2j zL%Ks$Y(R~W&H$U-+V*> zn)$(_NuVuUkZ5>W2AWP;>c_;;+q?&~39Ywz8R)PvXGZX0V~~AmZAbt8N0kQMP7u)B z4B42L4w8nXD^U3bn!hVi5qM#c2r9x36ml~(*IE28@q^5R#bPZxRStm5&TniErE0iq zl`;otjRNX1f-XJ?dl4-Gjz@5_A9OAqc%lO|Dscg{ANlMLu(7Y<{nr=TH~;^Cy%VKA z1(&zY2_VM`gB<$?QXkf+s6h9ip9f`XH-T@*I7<9MB@^hJ$8I+faCHemI>gFKmWD^NbA8s#(@ghZa0>1#~Arr zbwF0-DOeumZ#fA{h@f$67SI^>#fGySpm7AgZodrB@~u1x(8YU||NsAQ1aDgBZvpj` zK&z7e|L1Q7tpe{36M%=q(eL1JfLjcSEKvE68eVgu>Oj45(73@4P}3B08yiFmq!xF? z8ixt{AeQ|2&kx$^UV5n8P2}ZEP?=K(I%yDe{NKTsx{&r5vg0%mmQFeF`WUEq1+9}0 zd$FDmJRj372C6b)gDH^865^UPkh<8)8 zb&K)4A7ln;=6Sgo~GZ;q!-_A}(*y4R<`{sNDa$zS^q8k^;L z-3wa#2*MLWJCBCHDDDMKr?TgPrc;~W=yW^qbeF1t*Vx&pbYAZc)zLf-(%&enjoj)}{T3#%->W)!i(LBX?x%C@= z2k0CH(AIp=Q9gd4(Xv>L-ZBQw3J%c4=%wEc55PA_g2pv_9aB1eRAfNgBtZ8if;#;# z9#n#Bc+j#0kj=iJ@vd*6Igs9f6#fp-9SO`ODm6?iw*UVBkw?C-rBW1ovtd(E-Ijjr%qQL(EJ6+zo8nSiX;p)mJZr34ble*&krEK zG{0f_egib$A;I_|06a4BLi!TeJ`s?i%}02;eR(=BbpFyjrTKx`RV64e0A#|8G>D@_ zx?Mr1sxgPEXxH+*o(wX$^8>_8<`NZ&FwhX5!VAw!pbCu#v?5R>;Dz=@5D#?bkibiA zP~L*1Z@AAPu3&{(06KUNbSkd_#1e>>5;ca_|NI@G3j{#38J(^gFKa=2bx!<$S&qmu zAm@Plr{OPxxE6BvbOXUV#!fJ!RQh=P0noq} z1LCaOQuF5ZJ9-%y7~$o11j-did(al{m6|teGrnF1Uf~$y3rzX)zw>t%LqIS1P_a|HetZYjw%xLzs@Zxz$m=BvuzjWctx8PryHciuT;2&* z(Jj_J9~5ex+d-k(d7=3*BX}KUCqxu6b7w?6zlZn=)7?J;D=2@9AML$omm*cIhPT930j1S<+0MFPD#*UUc;mMPO;Vl zrF9^U&MdtJ|2vCWTECU%p~r+pvo<5dt*;}}CO{1DW^6rBx&ds&YiDq{Ti)Yu0qqy* zywM$P(t5k}{p(rKsHl?xM;k_jLE3W=laGVb6ey&7i~mDXQR}x-dCYXg-wNLE21!e; zZ%af#{Q<~@r5XV*?015r0(1&bsxfri$v03N@Q4kpe*=j=SZfv3w|eP>Nb;cbDomOW zn1Fl+8t3By1rdMC&417_A(;O`;R*@^{#MYfJ|NX%;L9FS(kp)-X!r{3c^ql>C1?N~ z5)Oz_F?UzA-eEaKGe(k8i`q*&+4ai^6tL9$?J?W$@-VC^-OhkwiD! ziU$7HXwXI^aDL!v=wt)si8M$j3lgYEd1Bjka73g+@`NQg#Utm5X|M~b_&0*R3(XVL zK{=wE4U#87qjX>aa7yNH1)rY<+Pp0a%4e3r9FPtZ()!{RpjrjCzL>i^&g1w2P)-1y zddSf&28y#zgHAt_hGz}@tt_B+7b4m7w}NJA(2_oXD|nn><29ZF_LY^HgIU6BwLXCnqkQnbgw74*g;9R^FZroAzlRety`eepfk+m zC3sCZq*CZDV}NBsad0}s$b=IhUW05b1l7A3=@8UF0&V$#ro%aEkaXw;$~2&L#~<3k zGT=SZO0Y5)S9)gzRaoG04^U^H;RF9hZvGa~fqT%ZIrxPQ#C%Zo`x3MQ;l*!9lm&yJ z^a|SJ)$O9fq3y)e9c0jYsYC)=nuFT6UL4&*mM8fA54K(^{d5>ye}U3}cK}DXhYsXq zThN&V9z2}^I^6*(ogONkpza+DbUYDcelW=JZV!&`0G;j#l|~NGOj)OgPB%yoM`r{N zSPx4ycw;?C{R{0D(0JnU6iDu20afwc&LY;%0%Zo!C25d$ANbVO&QF>rG*4MxC<_6P zhX?-$9eV>hE~-SM+gYSr_}ekYQcci|jyI2`GeTC1MTF z{()9HiFJqRbcS(sgVuKNbY1|hoO;n;1{z`mFB^j%v;w-B6I`Hz2CqQ{Kgj$S>dm0} zuVm1U4RG@VbS`9fa7OE;QugD{pj~ADp}~MWH2_}>+g2ZbiX=YujpRUzp70jP!FnIY@KKnEg%c8UdaSYF_70?n6nGk-h6 zSfbeQ2&7lbY`(USRU6M3`$z|-N784H(p%*0-jrn z>c%~dlnU_!WEu$?9cdG~omE;7l$-#c^iTk5V;vEAy{os30XlOvq4~#ue()(u;O@xl z*Idi$Fd5L9qn%+2orjuFFg8E>*LsrQ^-w1pbjMVQ z8p!^j7v;qa4BeoE6J8$$nGfzS8iQ>(oB*-`GM)gsX|{wPtqTqsCn#Zu^s0lQokHYX z0h^QzhYWm}fCfH({4d=JT9?k&o9EG6=MHtXYV!%k&N`XSJOz;ZAoD0`6Cg@nKZXVX zsJ|Ta;&>6vy{BJDpZNd(^&+S=WPSjg^pMKG7t!^g^6Yy&Qh5fM=77xeKr*xDh0c%Q zU2vdtLxcZ^fzD(D&Fb-VJF~!J4H|G|3@;WR|NsB>Rd9I>4libZP>f8D2Za}8w$n$& z0Cd6?=$LO%_YSmfs`Cb9RR(C{9pZvcP>=EkXk`YZ-PG+U(w!+``Jz}z^Qh%3ez#Z6 ze?`i(THluXX@XX4fyZFFXM*N_kr!Nm$^rguY@H%1paJJP#sJXr6bHyIm2QwbL{vat z32J`D*!l1EY|y=ZGJ2iId&?M>Sl%oB&G@3zQRMYJQ2B>AKZ_+ajPV_)dnfZ^`VsId z7tp4_ZV{DEN0FDHo1;O>CuoMKSb*ksVN>KF{h({BT8@DyFAcgyR9=GCwLl|iLh}(B z@UnK;d>1Iaz1Up~il6W}`1}%QB61v#rCOD>)I&)MsI%`x^KqqB) zJ1aCp_9^~<0JW{RjN!%aqoDnYPytB#c;Q|Py8ks6W*sP#7<9)#4nphpQLzBkyG1PB zSsa${iiI@4TE66WdkKn%sMfcocA76+PlEOflqiA@SLqB164XQFBA`hd*0ws z_fg^KJj|HI^12ab4x|7=q`zh#Q2G;&1*Jboeg%#HK@QSGuB~4|YHR*B(D(v4Q-*^2 z?BMbWatU6ypG@bW*8e3bpzv;eTM`4Jn;-q{6l46`dJ zx!}A7NncWs(G`mO!k^h26#kQ=LE$gaU8ACt!Jxpv z@ZwK8xP94rpv1L1T&D9_?+TD`H#@Y@Q)qthud`gHlYIxM``eihOTw@af|PgHbD@{d zzP`|Wga=%_!TNt-|CLvP&cBG}X6T-<0W_9zsZ{NF1BeAO6w;yw4N8>=q)lk_umR1y zbUT=|9)PtcU(EXd?|rvdG-JKxQT2Gd+A9n!j zH@tM*0lePyxC3}5?l^2p6Ew}na2z`K37hT&&vPDk057A0A7lq2~mFJy0ToHhl_CQn0WAWgBq#gR%?9{}L6R;1{6LS!fI4xHITXn*Yb0V?Z`UL?PO@ zNa{gX7!p(uoeuzwfPoHx109|l_Tn(8t6G;45!L#?BCFd)MWHh;;ep+uzl2n*=wixo!>?a}te^1W_Wu9>U!Q?G z9}-?Kw88ct4@YV*fEQu$lu7gk{O<&{-yHroE5C<&7F5na+7QQ)9R%wa$-w$WP#2XR zMbh^o8e~7Ly92R57&PPo8p!OGVeGv18nUkdyiTb^!17f27tn^qXlVOJ^K!5AfB2Sq zi2l$QOTYg6-*}WQ92|hnZ+ze*fHsB)j)R7^K-=MDK&=wceGH(h&sxEwfUhB=fEEES zjw}QB;b9{lbJ0fuOAw=gQ^BKvU=`h4K_ec=T~xrSyw{DfvlT1=9=GTQuTBL`5J4*T z)Pv%I77rdv4}mgc$OdL`vq!+vMMZ=ket-D? za7a_9`Nw~7TH<#FZPfxDf*GQc(0ZxF>N`7VWVh6)J04|}RtaN(q!cs&q|FFT4xsUo zR?v7Rs08V*H);J}lHMJolF+#qB-jc%Ttpmt4xd4{zXxbe-O`Z*d0+^%(Fi=U3A$Js zqN39ga=ElW=-}dh(D|d??gEzXBK+;3OT1rtf~vAI21rOYzhmqK2WjiKQt9KZphy5Y z1vVI4n%%q>6!?sw8FEl@2^u|oodr4`)FR*o<5F-GcDsO%&4!L1z68z5xv20oAAua7 zJ)svI@yA_MAalbmDmvhO%+LTxoA6@yp8x;B_lI|WXm15s1{%5U2amq=&IR!?#$aCN zfxG}I0VeDQRYBnM0VVlcz*i%`;R$@92Dvi_GPwqhXXv;Ne;??;FtF*E=7Rd0i18e7 zvg2=Q26ejL@brS+7VzSX2)Mp|nFAUy>^DG+wLskiDsMu=Uj!C|#s{AULvnZoJb!o? z9>`*Nu^n_HmWzr4B&&cX?_5;Cmmb=I51K<8Gq(tMF>Nt8sG+$9bIiOAkz0_*2f@<| zpj^_9luI-~1CgK$&>)2gJeP<-bBT|Ngysp*K<{f&Q2KO*j7Q{}fVBMsMQ zXWhOTttU(FcZYhkUMd0YY7((_;^1%5W`d2lgNLj@!wd(&Bko+F;y@O3q`~hO-3Hyhspfx7{4JodfbLii&;iAu796Of1s%5MZv`Ed zjFCO(L9*v@WKXwpBa&O%1hlyuT%+!wQ$eA_m!Qc5Sl)q*yjujkIJyuVp(uF=v>qK) zD#P*)xc=A&O5fo80qMViIcGX( z2k1aGe@h`W|A0q5177q9Lh?@($Wfs20Vfv5m;XT=hx9;48UZi9%m+s(G>2M(Yb)e}+6R$C!39evSOugM z2IWwUdJJ^J7^E`~$(Neoi=;svd1#JhQF&dTHlaJ*qnky=(ut!)9#(4ew}S2)1?N8g zja(1~olYFx?4UzKR5?J`p)xQrFqEW1Yb_15T1x^WTj+y4t<88Gt*#307KhYSofjcT zZ$j2sG(G~^(fA8wN$F{%S{1r`<05E46m+q_#9f{RD13f{MMD7NEoolZVtVCqD3R zl;UsM02+`4o$q)IvNH1Je2`Lbx_|L`>;L~RRpI#sUf&$Yea^-jP!k_f>+$y)!t*1J znh$)r5ZFG9dTKQ^pF!&>6{riRfbzm~O?W*8O7CI8prbNDO&sttTsNx+8d6zm@Vb-t6>X0SzXB&dF_f_OH7@ zr&FLifCF@2FJvwx0z4OT`Sn$(?|RD^x+6GRzm*R*1=@DvVF2m=g3Imh0F~BDCBmTnC@-^~!+SryWehN%Ky3u; z2agXvwgUCQioHQSFv$8FG0-I+c|4sLR6!oId|##vD!@SJHubvy?*w&HTvSXt-2d}$ zL%LZ5qy#*V9>xK>cj#5GjZkNZib(j2$>HFF8zg@j)Cveu;Q+0&1)YWO0=iiti1B!6 z_=~;k85uftR9>{kGJy82Np#j}bo%iygI1;-5$N>efR8luZ*%`|?V@5*QU~b-x_AES z{P1Gl9q=%DX}2Fsw^($Iek!0N5yEsJ zH>{U2fL7r&zv0OM4MM!Q9|m=EiE{4@kVxlG(D@&oaT=ZXU+)B)+x(ufvySEE4^S=z zMaj$0pezkZ?H~o9^af5sNc~4JAKE{H%Omm8`^V_&;c-}^2H6iKp84-T>vm6W2H02% zOa&ypqMHZK9}XtqgbuPF#E0ns@xy{&T(tnDhEz{(hSY9TP&cUg4U6SwQ2V|FejakE zGPtVd-#8i6%ij2@qU!ul81PAZyBhbVM3$GX6 z8KD04a}QAKw|f)FL{NbaW|T@FZvr_3rJKRkyb5F@V|3i%&JXQPAU3EM@S%4Wh>5+H zhiq>Er~en%)BpWvE%)GNINku#05bb{1IStk3ufQpvW!9_oPI3ghXeA$m@IH zxP5&O8Um2`0_VqIb5IOCc1Pq#wiO)wtudfE_d|`3Kvp#VVqgL79?$^It>=k!`^j|I zDHtB;e5H9FwCM!2N>DpYfboar1^)JHpp}wrjQp*}p!H)p_Mp{X9G36-+m%6eGx)xf zU~p`79s*@i@FoQx6^_=EC8nUQd7$xnkpNKj_Cjh6c(5IG9w=zh_KRDQ;KN8E8`h5q zK#ySRd;waX3tAufgAshONXQVDx;3bKtzr`wIEJ48jJ zJ5Qwfh=S$`#tWKfL3`cZc)HzK7_WBbiGajF2M)P$Kv*2mQ{q6k2$cx-x-xcx&MF6$ zNv;f_9q%qGCYE`i3Eeyn*yw-SgoZO5-FYma`zts)^FUXFzC4PQVapf{4?uzrw5vlV z`uh#oIfjsU+CBk#e$-Y|Q0%z6fnrCe6I7pg$aFg>bc(2ewxsa)>Vl#~ulXrsiCFUy zoxPw&cy#9ruwjsd01C=(H_#=mpf&KIL4|HN(A8O>sTrQ;11X@B5CUGrK~Cc81RdDD z9dt%h>&X&BP~{t@+r}I0eZATw~Gq+Fd5M8V+TqqK(4Ce(LBNU19Z=a z8z>TffVQ`}NkGITy4_enEK3m;aNH<>s(u$07SO3y{5_z>yWK1*jMqU4;Q}}baI5_V z9dOh60zOy`u9usS=or3*1rcbSu^UfkodC$>PH+lA ztx@q||=2oyR&)X`b8p|NsAb%|o5vK?^TITR|^^mT_2qmHfru69VcepFj9t z-twh%jS3Hck27fVg^!91-OfCqHAT+B9Q#1^W+$kSkkC91y1aBhNZ=bN zNcdYp6)T9zRI(9tiV>)6`Uz_PLxKa8bh?8@x}62UVbOVA^SI`P&Keb;nVLUAmjqcJ z?feJ292j)&Sm%kEmM=RmNdDmOF$Y~9nxo>=`M&cVD2Q@Y1o(R%F)%PNXA6K_+?g!` zOP$@$GA~6yt#YXQK`{jyZ-CVEWeng51)taD%<~ew+yjIBZRA9qm!XJN1!!*7QFUn=|q-4_bsA27TGz8MI- zKD+Z&=Z(&vS&T0dV7FV9nshsZ3R8hz9&o0ADF?C?6j-47^v+kEKRa(^F}yHR)K z@d%o)0WF^u`NqIe!rJ`nf2lO+6zhN&jbFjDlBoOZAm!|9l=?6%_=PLjz^e`*1JUOP zK;zfYS_ibnZPjy-v9R?r;JE>FNY(cG8YDl1>(|fvASX71P2>U3tbyinb5vAX|Ca`V zM#LFHU#wSvlp4pgz=w4!+y^h`23(K)nYVkH`}Nods0K0bQ35YJY)7e8A1c)&u+=ptJpW zUV_e80yU4o?T=uvBxs8w=&YX@6@e@Uuu9M|V=}=nBthp9aC0;tk%)%OS9F6eXmb*= zbmHK5b^@*9I-CYSgcxLB>O#El#4;cI}aUv#nk+Rc?San z3j@E~1;YcNlUMmC9{`&I(hr^w=ILez-Ad2B1C%@3nOhH(s6ZNCpmy^vkf7l==uyzG zZzKF49S1fB<{+^DUUqzpTOUEJU3T&TrEGWFTgA{C#g;U&V(z|ed^xcR|{<`;|yU$B6VId2kRhdLOn|8@*We>p-wDE?vkCBRA{ zr4l6nyjUIsy8jKN92~x#6J)?@;O>3(5Hw$_4pIPiPxFs}GU&ZHy#XxEk3O^>*a7NP zfY$mn3V_27WTSZU#x5cP1cgR34p^cA)ge$B+6dE4(;z0Dj|Bc5YY``ba^MLjt ztl;Nwy#(5Abg~74hH|~$`~%HT_m`;ku4e#k zK6?89-~az5620pg{`~*n`1Jp8(DoxWP>l>OpPL^uH~(fT_2~Be(QTvBd06u_<4?|; ztshIxI)665WbC!!;NNE6`Pt%DsocvGph`WC!}4^wq~=Gs%w_%-&^o@>Z>5iW!R=pI zu?052d!Gv^{XA#ttWn`873yBn=e*DAoX6ck}8I|V4%)K@e zASZsbI8`eBTBFyG!}2D7d+GoG|203ur7o86gWUHr4pb9^-Sz!ahd8KQ1GSGp7r%8{ zy#(!8onSc+QO4#+KNzpK9w>d+e2~TRT20z4?1|91=Mh0j9}?J%$UK!=%LWv76Lj9kGb;@sLfj~ zp?QiiSf;nZ0TfHeN;tr$9>m8U?v_yj#X)!T7d8flPIsQ}W)^k^hU4zw`Tb6J0Z^3# z@|U{`Ob66OVZ9w7hrZYo0m=g*mfQ@%y%83jup`7LbO!Ns25~eW;;_6}`nh)+*xm~z zg3TT*Owd&poe>t%afgq$f%3Tn0|UeB=TM`2LFEOwE>70~)y3Z}K(#y1@ndIp3vqOt zHP|tf+Vrko`SS1o-ra9n{`?13<-N^6Cja>l+L~h$7!(>7kj3y~Rm%VW#}BO8CdAQv zMCHH1i>{3S|6iy|!E|;0eSHkc!mzj(Z^J>QU8e=eHi3ZNrj#dt{|96-zL+@o|NjXu zPKW>d&zfxkTB}mQ&cM*y0U|9=mDmM?DqJs?ZwHx5jXO^_KmO7Do4-u6`5|M8%C`nk zCSfWS>h1t#3C3H@9iUWbd8(8X(z*eSyEXio@aO*v&<gsU(dk6-v&B!tnn8Eg8&16JLpc6UKgwX-|s6P?{5ABT1|7H#1-6L z$@-t67sjrDdRTw-23lJg~kwWPWNFXd?Wj6ey#D^Z722VYVQGzl{ZS>A*M8 zAu5OqO)wlS0CM!U-yk0;Ks|y>E&@t^3V7?AB{Pv;&>@|VcYr*5u9H8+CiGUYb z5K&N9>LqAE9Tr=Vas#y1rhw(eR#i}Zxteh^fNP-UXH3Trfg_EpB%oWM^H}ps#^wVY ziYGL$G5+fO&Usz&XK%%S#UGppOVvL7?*?bW3*T>iU<7AFP;)r!#V4?v1;9%|${2c^ z6{h_8|H2nEdDUF95S;pV{^bI7QzuJK{PVxJS!v>*|1b7}4upfa3=)3e{3H%`-EvcK zYU-|F={5irW1T;nAO2{54s)pxe+y_Jw%3NQ^JuRJhvrw%ZO^?`{}q3N4xZ!AQDIU1 z+gtfx@h9h5{#MX@BxvbiZw(jo_glR@=8C5}uY<~8%U>lqS&ZR9phMnX=<|Wk4gsaI z@?IW;UPlg4MG2ahwKU{!T?(o&e`wdJuxNhh{MCGdsne0=1OLIvppuC3dao!4I|D;E ziLR$nr zQ_o{~;P{~*pmf{}Din`5A7KOKK?a7@PNo;jKnpV8u=F-7T>tVvptnRtAS_Gr#RPFs z@bUCEHyr%(KOiiN<3$}zWCKKm=|v7qL;xZp{2~e_aseX3_`(Aw5&#k5d0_?EhzQ?{J1~(85D~T)r@$ft5D$a8 zj-a{)x;?Cv4P3n(eleAw34Gn?gs`}sOPClKUW5ew`_KBt2o#1Ay%SUx{`nu&J0S~{ z&>Ip!5qt%7QX%NR3Q%cjt^^A4<6zZ1-IH1RAP2F5+gC?HVV>Gu%7B>8Tmd`xfPdp; zjy?v4?%iM=|4Zz<+kHT_a5ISC-5$UK+Gok%3R($$9Lxhbzx7**cy}9A4sue<3&u{c z0L+Tg%I4J|gBe@@m*~L+`CCC9LFf>+t_ zLiQ?v$IL<8fEPWVK)qXmm!P9mKozLrx6Tjk%^*4Oj-YDz4B%{#80H!k(570jz5`&F zec<0H&ffw$bgcOePxuQxsOf(HLAk^Pnv0m2!MO+=8_h+aT;TTO|Nj?`p#4x`FBS!W zS_W2z;MOrqcLWQ#9c(QkP+AS%1jJ+Q#8Vn!?Z{CY-08*B8OYK2`#q?8qSEal(0Z~& z*4j~|G^RTOw0);Eq`OF<^;?NhXQW8CgGi?bq)iU$_gS7OQR(y&==Kokj1uV#1WN}9 zyuRPtwie_d)gS*M_xN-MiF5`DyguIBHUT8g3leYZ0Hq+NAE5D*7w`Q+wSTt(=yHyu zy$%-PpxI0v&=}2e2hd@Ipp|D5y{HhgQtp0p;b&pwZvow7-JH(yuiMF?Gs>Yef~WBx*t2}7D=I-tH9J3cI&(CiWCR@( zSIyIDV%+++q^R?Cw=+xU!GkZEdwsfCEPYgXAjzonSa&u@^RpklHpbolEX@yptY9qF z?Pk_I3_7la@mRMrOY?&t)-EanrE#4%Kof4AJ}Lq);z1{sK=xV)SXNo^w}SRnGoEWc z2fEUd%ZE0WURmiR1kQ6xqd{U(V<2lIr-XSUiD0Lus{70s@;Q=T>H+};Thsg9c zYyoi>eFKGW=!=tQL2LW8^tlTmVgorglppvM6XzJ2)foZ=4Fs zFs-*s#JihenLUw(fuZ>YV<%XkyA@PQv>qri>g@%wUJHQS)7t?mL0T`B$aG%lo&eT( ziNEzVXs~qxNXGI<>77o&W=Ls*uovXs=CvRjL1XbOsht+x?I0g@wt{>Fs^lOA#RSW# zpuRqT^F7d9|LYgIj7*@ho<7jJJ;no&0EGk}_}KQe36}RtY!KFfHseCQC)|1e<#*5+ z9wefB_kwDrPH;fKoP`kYo(*!w>pjp`&xBqt#?A|=&9>kLlO>EF_&4@~BGK{!B&|bS z&<&12@cuzW`2`M7{+3mcH4nY5AkPN8IP(@#et{2l1I-VD$}g}Sxcqt#nn(Qr>Zi^H zsmCn8&Vif?y0-yrB@1XE8l0+jfS50LfSOC-b^^j3!kzc|TmC{;Hw3@%f!hBDw6Aw6 zXmqEyy@iE=;YINm@Zm@-phW2dN`o;fEWO1NoyMIXI=^?8sBpaa`04-uZfB0(?iv;b zhU3i{pney~rISm*bw~l2%mF2thx{e1nx~o%fsQ?3VZ6~99H4mtwD8J_fUe3$#9AU^x9(I1P<_?f0XlmlMunxbIRTXHLFajc#SnVHgW_vJsu>Z2 zI}jBgI5t4#S?hrk>Fx$_LOsCWQV;Pd4?LA4G=ol^hbB>k;3rUk$EdJC6IHOp%K%W2 zxAH)%3K?)!F%?`@w4MT$z|x>l0|)dDa5!^=?g4O70flqxjDP?CBc-kX;G|{v|K*=Q z|NkQ*5bSiwVmweq2u>^k;PZQ0qZuXp9O6!ac(LEzzJ2ap2Q{L|*)Q1ySe@ax@|}gB)@M;SlVp z8FXOEi=W@%3pCOuguduJ0V+RVX@b|1bslbhBLmH=Au2qUKM?JU(vW6tcwCp}Lt|tr zI9tOH8Jz%&y3)GlwIC_R7rVZJ*GSw2C5GlBGQD6OpceK^hhP8ygWD6J8<^{sK!$G{ zVQC09c-sRi_9h^L1FXOEM@bK;1<_ffBJ<+KOK^yQEO=QAYDvKJImiXzd|n1?r(i}7 zXcIrQ^ntFwdtvVJ??3Bx4cPc7XvOsLh998gEkOBi!iB$I{&!B$0QJ@Yx9|T~tCqMu4VQpfu$8Di;;d7zyZDI1i{ec#F$%7Zn#M zAH2Y)(?=x-v@#vEc@DIM<^<>fGanTb&=f$>kQv^dsy^F@O1j9By@X%+8LcZDxe)_ojxitueCt+s3W*0 zFuZi!5me$b90xU#8Ti)+vNRtQXgMUgG4CG-v+UxeQlkxSQZjf6*mv`i-=p1)Z;Q$%jd;oll4QK-& z>jDn&X*4{qwLuB+IJh@uc%a)xg}IKS`IrFc_KIc~6&8+88x`vk6(0T;P|5|3x*cZ& z%_l++Qtl4mfFD~3_CV{UlFgQfO4fIls0e`P=?zcr2B|mv-+2r)p6A5U9mK(S-10EL z`wh#3{7xr2U-afOT7D{h+FhaozU8luqf@Ta4_u&uR+hg^1SNS$8cUl1nu53VQIX+q z1)Y`vJ5|i^Eo=`0Bzi!roaI1m1{W2XW(~$}9~A{g9~B!z&}ln5jG)tveN;FYeN^(0rV+`ItcC|1JgwhSHPWEh-kEDnJJ`JP7szsMzl=QIUZREOt+e09A7? zDn5)MDgmGy*Gg1CcOTk-jz9aqMFlie-(92P5Dwa&_(C3Hg>{LF27e2vWd|y+n>D8W z`476o5M*jtXh8UjAJ6{%XUtJ4VJuOp0J-Q5Xmga#{}PpoZcwVt3b-EisO_5F) z6&=Xk6dL@kynp|Li~=3L2FD;hz0D6mmTU$MCH&tE8eaKdqLP4&K^Y_9Mcp${7#MUz zax}D4%HIlFmfm;-l=DH$^+3a=E-DFzCk-zdzEuT{bM=-nFlTTu2k?MSBy?bDJx~fd zjR=%W1YTN$s|}8T|65cX7{NDZAW@(@CwiM*rvCX4vftswzo#Jk6<*GUR4O9f&7kqZ zfPmiS8PgzY3|`!N`tLtPoY6%kh0#R?v_}2qbx@TBN)9reAKDqgW#~0f6DCFl$8j$& zw}Yg8RAdk(wIF{BH@xD~c;Wa2Tui_G{`>#`7c2~r4moJPGBG7uE)EvnKaA8$)Li1?J5r|QmuQk_!0;>5m zV`l`*4p7PPdNriq_5Z@_qp;cnG#(S$c{M!j1s~W4%ap)AumLT42K9$PhiO5Jbnsb2 z-A*i>hnpY&=)48m1O5G$U4Q_=?4H8fa#%OvBojhri_kD+5EXNg(J@uFet_ z3I6S7X`Ll1BG#KhQ)>K8oS+O}qQU~&O=aB&8Xo6w2i@1v8^g;0>d^h*;BT{qsNn$h z?!Y7c{LNY*A<(p118CL}RB~v5t`Txk;W+L9E;K>rfjW>Z9o+#esok=m0vmMQFC#Mp zgXLBJ7AF6-0A%J6Kr0;BR39xiUtD z;WECYD>Ti>uUFf`Vv@PPX4ovs|6p*;NUR-p2+Munp@-vP9w zq%(u3^9QIg@5<6yV+&Rdnl0sTe*{wJq9Or`5zrM{h>{(2_$A1qW(`L0d7_~5y7R@0 zjW7TIe>n--pXp_p$iF>CMWoZ0r+WgZR0Z7>9m>(U1H=Zc%1P^#c$o@P45?W_621)M@#p`G$oq1mhMT$XNMj^4r_y)LE<%@6oB zk1@V$u47^3Z`EdDV9++}u44hO_J00@@keh3NAm&p<{xtW?XSQ&QiX?+zeV^z`1~23 zmvSiar7hQa}m=Er|D?=$}FynpZ|)92MM z*Zleq9#90IbuaKj6m%=S&3U(AL|f{4WK5{r}%B4caZn_Ur$D z%loCDAh!RR{^$RT=Evat01+twxu@_kD1U<1L;PU8V0nzc=?zFfI0sDt$p?bv!Tb#% zz9Wbas>eVJAYxPmdV_xi1%Mh}A}_Z6`2$*1+3lku@bV$Z<&Z)Gl-{#hI&Xq%pysDP zELVe8pYXSbfzE+`*ZfY9zr*|Y|No$?v@E~#H`{}RKXjL!5bYn69)Wab6^s-oi&Xa1n&EE=Im;l;f#}WoQnM347?L+Y5 zRM5frpgU+lrJ&~5&MJ=Pvy7S>KnzMytw zz^p(2GeFCw0$w;m&fkU|w$lnK!UZa&K`F3#2PhgD_@^EQw_m$6Szg}w`~QDn7GtlA ziZQ6ID)ZtJy7oFg!vhU9D%wW;Q$R+6vK{E?El@KU)c)%XQBeRj^E+pN%tbnR1$FAlE$efn@|Np<>|H=qj5Vi#B`P zCx9IenuHDLZTAD!VCMJXBRHWiPJ%ACKdL1G9=~aRV*_3B!vZ=4MxvV!v|vRYRAyec zYy~Z4<8O0hWMDYvqN2>u>uv#BG!H8KyIE9vT^NNrL08GeTY%;SK%;-hnxFmX6*0Ds zQ4uI*Y5i8B(EN{|zs;SE0lekao(+7wDrhXP^$>rn0f@_@(tH54tenI01Am(x8v{dc zD`*4*wEEogIDZRhzc46Wfu?pFAA@Qu&5xZiDk7~X`TIcYVL=U#?qH5?hF%}W|KD#Y zp6KNfX#5GPS@_#Q=d*wo@gC%F4+qtHAP1i7?gwS+ZWk31&5NLYPNx_@F&+b@xX$Sy z3C&}mxrYK4%juwQWieYPm-WG&~2j9`BC#juZVH;NfzrG6`9U(3x1b# zpcA4FLuO3=bULv#AF+Ym>;PIX-U?dTXW0ts`|PpEm#C=Wl-qY8Zmf@jU^m zq})K26i+7yc*{^4?EK*444{&#`G}3-ZJ4K^?z2(p1pC4gz)(2LA7jVdQ6)0i9peXqr#(jnZLgfbTyWb3TUgD1mkIt6B~bn()msh!S8(9l1GKV={;!l8*CfYAQO;5 z;BiFIS_tqo)o~Xl7SNsM%_mrovw;>lb~>?i{&AWV+)mzysWn_6gLnk3lI8 zE`1lYngQaz&JYzH&;Z}*EYM`1kBUJsGw3Xr*8wj+L5f#UAen<&!#*k+pnL~9y1zT# zqSJ$?^W4i^kU?PgfewcQg&hOvu*A-}prCvSIwEElsClk=s#iv!^MmGvPT}Um9H5mM z&VOE>`3tIlQIZ>I$B9lB!;A16;3NlXZZ!Y+-+7q7Dey1`+^ zc&d3X$UX-C7SOOSB)WQoIhr5wcU~*e1iMP}bMs*Va9EUp?heahfFuiOlIQ>rei&YQ zxf3+r3-%8zMYV>4&WZ&eDT^xp4;uZgw@VbjX``JP6vp6#5=!_$9U#pQjE5kO=`K+b z=yl_0e!$P)avC(=4Gxq;y)t6Vph_6jr@hGRqavVrit&W9i;76E322K)2OnsQM~R96 z_>?MeGVTt6Cu1{Eg6ah)4x z0lL$OrTM{!&V!($#*gK=3mZ699d}{l0jI7X{QPa(e*OOsPIH}~AjSHNfA9YPe+k|i z4@o`X`)WY9?FhUCxu>^`;s1q~Ye9XR5by}M!2gS&kN`Ci!0qea);Z9L9B)q0oc~l% zE!W#x0IF4kZv6j`kPk$bmze$M{|h4&c@6MVC8+*HP$emJ<3DJWgy;J`Rl2pF z9|PU^b_P_7x~OnKR#0~yZT-gI0;;w_b(-}G$e_&+(88wIoi8uGKKPQE@pE@I3+S4| zC~$YK542=d0Mc>p4hQ!eIYASJ!7SbGuo0ICF3^z|paCUNy$nhO`+q20migWCjRXQ;0A&^e8DWBwhCy{4(fa_ zj@APu>t2R|JO)c&jekL7CH!qUASb-~-U7!Wg2VV#^{{8=-8#K$3!|#3wwCS(2MkS>)MkS;9KuxEMN=&a)d8dm?MCXZK z&%90_m4IIF=uRIMn{FQ!lTIHMo#y|#W$N8N;2S`6ntzLwNr87DfnCEN;k0`XLGcz#Qf)w$$+psV&9DKpj z>%rLTa?GILHEk9k=eVedbXM_nMsaio^K^!T zE&;XxrK4<+lU-DN_?sP>!F6;v1AmJdC_RHF8+=q0dRh9qA){U5o!}9$v}PSY#^dhb zS(=vzK~-;s$ZO{AdXesMmd?u{Proh#wN?czD_Kf7yWKgg16cT7et>GF&L5gDL6dkd zVsC@T07aUA^7FU7mK=P*#Q6eLh`Y0Nf}3_upr)NbCl5QQ-|eEp(tMl) zF>0v|8c9A<)A<85)e2iao;Cs0;0L+*H8-R^06HJwc;^qKS#kc2f|ft{TbS9wOK0vw z2fI68biO+Hf*F*uecBwlD_MFSe}I&I0fkdIk7X4Hf2#+m?21ugY4*`)VeAZK>75O3 z`#W)fn)sIYN?4lxSwI8C(A3ETs&_AtmChIy z3DDi!-6bj#y)wa_F)9lD+ojV$O$?B5ugGN3aw^bprod|{sC&BuSwL$>p8os)zx5J- z>s3%{_+0c7a@h!|{qDihc?fN#2_Hy@-EUBvy!1ZkjN_NfK*NXNdcO0+3&UIg|GzW_ zwQxY|K%E#nUv<9kdU?qVl~CvFgD?0&MbS&ngReo$ximU2KnfmkF$5}d_}ve6 z`lw_yA2)117~L78lGA)RuQ#9ubOTanj7mUfh)PUvKsk7O7pSxeQHkiR0iVK|@Nze3 z3<%_IP&}Vx?DS`WC5{r7W-k`dpuRzG73hcqi`J7RBHcME9{k&V89Gl``>43^H(~uI z?WKbUUvk?1*JNPeZ|?vV#Ff#VH7cNyb%)-Xe-_>Rz41RRPxH5gfJ%mXmgWdO#l)hnHyxuQsEEPdzUzY+7f6hH7$D z1RxbxnG`5?dwq^sbTjq_{;<4I!fBbo!rwd*G}h&!q5~@TLXKJN0F8`yp1=Iy;Ct5Y zIr~869Mr>>H~8EAK^LPOC>4JR+GYwBZ$8Aqc!0lUDriaRjgpVuUObkk_* zv$K0As2=aE;sD*8*?FrI%uVZbWqA4F@BjZ3tix>hTV>P(256m!4u6{=L@1!SMkR*}qDl@T6wzFxqQS!N?xGR{5`W1K zbuW12Py!TBE6>75f6^v&NAWcKXt6Lt%SaK+7!?(0i4dbA(R_#lw2V}Mu``mT)0qQQ zT6RW(2GL}?XM>|r3Uq*H=VTBYTz-N&6ltAOFW3M2|G)E7=ZhC}-a<2DYcY6y)bRhy zWuT?ekPHr+|EU4FOYkgcd>QP{3Q&Gz1o1nAKqqfIbl&d_5_o9_@(V;KD4+7!{$CHu zm!P|5dn@z6=`I;szCz-D4#=FHXOR6H$@1+m3x8`As6fk65qK>Mt;akCx}j1$pl$9q zir#`6I3>m1uzcI?C}Qa$z~AZxDis1nx}8KiPj?0gbXW6O#&htu{sQ&iK$&{tcer(+ z`~kXc;~;3Q-j9P1*m^_S40eF>=F91zPR+rCFZpf%*E2Dc3-(r)gWbOvl#wGjUa#mp zxEtL1d?{oLYJBp$pYE-!0V`<$D*;V!TfXLR0=c&He&-2L^Fi}HXuH-6iOc{0H~;7F z_E8bxZ(9YbVBJ6k7EiB;rey^We=BIE19)oCi38N~fixn(?c#Fg&M=$C8WnJh3tx)@ z)M7_#RXDPAegL&DoLD+dB*DR7iD*u=Yy=H*Uk42ngClqisE4I+8l2QwdK=b&;~&ax z_K{>^gyq|kt<9b+EU(u$zv0=rk)MG9WN~lX3eb?|G*D+Rpto%?$gGr85VJZj_KIk0 zzU&OMfSCYVRLH>Z@}v1ABj@|hAHCHaAXkDrvMilm(7X@o#PETfXaaX)$=pBxU(}xZ z58B7IQvkcwJs_)Jo`hK4+wcP94KJt`9z0sM!L=xWY!QbzUZB~BodvwU7Up*TmXvS* z|AU%6FQY+>H#|H4gYG~B_5V==p%CPf_>&OV9>H$43&<|e`S-Bm8@ituya#9U$3OoY z4=Xc)b~J$Ymn(GsYd*%v-?RYvmL^B=gaQA?$)JYWi-wb+Ox_FLFY+Q8RO=pv^t@UR zl-f712B~2LU6%T*^9868`SQXM{Quv1wDmwq6{@;sZN}EOCAz(}EUBHkpvI`-f#&Cbj=O?-MhwSW zYd{$sG=B28w-;m*c!CagQumA3XaE22JluMqbf)2@9U$o!l^6g2hgf;|1*lgCva(dM z^>)du-ZBP=#ElnIt|1itcn@~hZT=R}wo}Lz?2uA14QZXDFn;nI|&9y|z&lX>Jo@LumMmRQZ4Z8;}3|&&2@QickYOc89+MR4z6j6z;s% zdA#}Ihu#oD&`}ONFT6pHJq*fUQsA}my%|5ge*<-}KwA$wKlQp8|NnkV@j`FFkIoCA zLqs%RfCi!4z-3hMpU#WT4}WMLY<|Q9D&IOoR3!LYB|#-^hze+UK%{pPDCvMElq|28 z2zH(VbyPuZujW&rYv@4pIG}TW1VBfi2eNdY0u_nPK3pt}-NAprBT>zd*f}q7yQoNj zF1!EJ`Qt^-9dKqAu?F3+)pQ0_c!sD5^hR+QUh2F7c6jS{kRYh@>&mi%sni{`pr-l3 zkKQl=%R|MMnjd;YOhKg-N9V!bZ6L=rpJcK8&hL5!jrD*#cP~jkV6j66UOa$$>2bT}UZ$ae) z^FJ=o3{-as(p2ZTEV)=_qJ?9khE3WCo~IhOFen;d1D{(9T2PBo2)}zMKD{3w&D- zlx~4m5nz?@@PY610>=l^eln1)0WWO!fU*kueln08cp(n>j#BV`4Di?iMqTj|RM_=4 zgV!M~JoNwn1kiZu1S!yXs>W|FhTzWA&2MD7y+DJYETByk%|AK#+d!ps=e6z$pccL5 zE&jFwQ1x)4`2iDXc#XgHD(G+n9l7pWP|kh;TGiE-208)hKL>wXEF%Mhb&QHZaUgh@ zF5iN`C5jQWs*4r0isd{ga{H(lfXgdCNO{!> z={SMRd|`9_|NqxZp{9ZEL9t=BtN}Sx1++fqMd$Bc9lICpC;tEM_G3XlFR1wqOY>`% zUN??l@PL8Di{dy&(CRx8aB}JV^y2X~NJM*rsvvMbjH9>VB&e115|p`N=>@bxqqpH7 zNc`dfQ2(Ju#enffZ@2*Xz$(bHRgUI|?7iUR1e!axyu1rkL-4zVsPJ(9)cnDDvGY^& z2}Z_WoqjC6bsU|+7M)HkFE4>6h~Dt*JO`RaFHsTcZ3_XFmasPGQ;>xp_CuOm!k`ir zQ_T}liF#%~qC^Fi>!AD^`XY2XXwSs9A6yLK;5rn(%2UShK(~vE3uuWlsK*ShgmRe} zK-Y1$fVSCyZjNp}$=^~6TG6-=G#UaLA+AT-fCI`3y&)z>3f$oV(h6GOMN61u9FzDi>7k!}Ryhj8;qcf!(pwS@1|KFgK4IqDj z79K*keRPMYxODz_F?SbuJX9vtm=`pv$=_N6@&WAH5YRZ9+aJpt#d}_S*#|xsjt64f zi>uGT&Y9EvhNU;|M{wusaL8eRyfNTZCh_9Q0kC=*&|&1)Usi$=8F-uyyg&bciAunW zM_(Wbuoff-Np9fvz#O210b4;EqK^m|9)KM20Xl~STyKHqr9m;k-%V8PucrJE*TVVR&p`%Z-nk$?LL*GiVyJ6C=?GMwgonL2D-5c_ zQonF91b4SVonL#r4YZ33)GL8?dN^87mT(R06%0b-yAU&PnZK9ory1~00EN_%v?flVlpoFb+8py2UZ6GIu6oYGZ z$bEb-)P?{3XFdLzi-Gc8P$2(?z7U-Rim$TI;P`5W-p}3&+EE26MnJ2|K{rZ20JT2j zgdx*e&5u7czh*r68gv3$l;vE|JV7~9zYa7H0iTwh{s>YJL)L$EJN#L}R4TQCr9`aP z{Rd?KnJQ@Qk);5CD?50aga7l|Nj|Em%M2F`2Rn|qO$1_H?$ro>4n7| zPXzyV!8A|_Tn;K=SY|Z8Vua2o$#;Se?@j9zgw7_to(t8LHUZS+MBaZ7=^+@xax192 zjWT1?4Bo7w688T>=W$S3_X90Q!BU0`61xpE6ulo;hm~{(S-r{dL1uB(VU7&OK z>^w+w_YL#@{C_cR2dw>$$j`$3;N=+LjBmCHQd*^gf(~46znHua(y!)k1r6_mo45*x zK;sjghhH3j0C9M!D#({1AWe`0J#7NmW9G-93gRI)+N`O3cbUS2uF1WmWAua$q|M&wJ1Ne-d7!`rz4WP6O z$~N5%klb6z`XX@8|No#lD$tQUFIhmt(V+7rUP$(X(tgzkP}=Xj77X5T+1(1-DF{mY zcR+FRTY$f9GN@Pf8+6kIe>>=&$6n|Etv5;}ntvdPZCDCb3h?s$7)4rvB})E@_TE@EK?JhXoW zPS21YmJBp&L304;_V%D)q|__}DQRKx2}{owpyk`36bZTy8sRy1M1w{g)R^h~*m>)P z255-lcFrXli?P6q6j1l9G6P%z+c|N_UI`aQN$Qxjlv0#-TpMkvN_W%F?mpUM~LV~BajA1vpAIS%57}u!q zAaa*Df6E(4ivWBw&ee6040Z#&k_lvM=ZAJCa8u)xM901C-UeQ$11)!h|6c&z(0K%Qyyt}G2R}N&8W|6Cwt<#{L(kEK)f@b+pfNqL zKOI49_?`cN0{>+KC=%iQhwv8l6+E-@n$)3|_!i`l|Ubi{JfD`HKKF~RUpq=bsaZvkd z88~tF&IhT(D6C(1^tK;?Rz0A#H35)S-M#H*pvJBACd~Ai&h_sT12=2?OP`?hq9f&@zJ;XFvrEXhr8ia8fBb z2&olzftGUhP6st2!6l+2ytWTfktmr18h4z{10HwO=xzVA0JM@GR67Rrwod_-h|4y> z>igc%ACPTG-A15&5RkKsLG#F?EEI;r!gT~E3`}beG`3mmif{soD?aSnE z0o_>Gc>^@O@PZ>CGz_$(^@X?}xYwuh;vKZzzyZom;PRr|MMVbEhJyBYj=QLUm(hUM z8Nz}ERFA!3`Cp>q5FYv;bfX$*?JtS~c=-y>GUbqiieW~*oC&HBAW9JVTm{stihch7 zf4A$Om*OB5p!9(h{$ijsbfG&&MFN_;KoY0{MM~#~7q+13RTmWnNKOPt z34bf-c+6%!Mvwzr50u1q9tXz}f2$CvfgF1XjweK`3^cUf0-Ayc#nm!AarJ8* zB7=bMBMg6$4w~NtB??dz6IAi604?wZ)tqlwnqRO4go1Yc=)9QV1HOP2oRADpzF<5G z&b}|J|3bH}NWd?VafA(vVq{+MfG9jnKJaf8=5GNl(t+%vQ+Xk?0%GVzkY8O?WO^IG zUDmB2M}xu_R6o3!&i3y=tNC+C;R%|~1}$F|K{UdSgYz^fe=~$YECHG$?}m1eE99Y@ z>p;sS7(hoLzm!5U0ers)&kOfWkQ(pxC9rv6FYd8|>bJ6I;2IO+fj)4%@nnS_+(4dg zhTeexjF*d)!0D&?2#e++#aq#FFL!)}$KZq)uQ&ex|N1ma7BD;z1-bzOoIgPR3w^N^ zbb7EMOYP^D}L=v=iOB38hLvKeu_yHVBy6 zw?ANHU^vbWihgMS>$p2;VLU_g58<+H$K64rZVboW!KFm=59zYS&|^uDyMu2lZT_KL zHsQEC_%!t6?x5xt!|MiUg_|}3SC0rhF5P+u+Gb4SMd}fK0hN#~t0C==-tZrmpf#MW zptc=oyO-r*ey79m_NNEH*j~#TFfyw_86#;NlrS(9` zo#rov1!g{;E-7>AcbT>&5q-|NnRX z>OA}+?lL%v>9JUfUE|mD?~Z?>F@vlFG3&v|NrvEU(nbS=-jK+ zZg77TbbcqokX@ja?vQqdaJRQbwOB5(4@e`Z{CJ_g z0oKn1ozDr%^M;pRY}*VIO#TmE$_5I1(4i>cbn_Cl-vQB(5$12P1s!<~x=|{3F{HQx zHPXRDK#-oM0q)D*L_scrCzPqk3B?c8eu-WQ&)lE_2$X+cEN29rfBgv7egPdYpa3h` z_&ZjDG9c)7Mi&(wP@?bc09E6VVg!8I2WYC&MMVP<6Z{|@H7Y#da)o~*xF_`@Xd`&$ zR0F)*PXM|cmzNQ|92YW{4Z15t!0-}y7^&Ce|Mwf93qC-*|3Punn`!Y{ENy~ijfza2 zFlaf|QI5v{peAfdP4j=o(&yc!JeFTeo`EX0<^$rOcGGJvQ2VtEBz(Tx4O9w>G(Y%Z zd86!gFOOVroP@HE3g~R+CQDFLNQTYwCVw;N;Ec}Gnx8dqSh}c46dwX_{Zw{Q5eNXC zdSLLPZaHWPzW~@@ua|(ruiHmO1$?Ys3uqw?XNZapA{apH6+vAs$fj~0$cPxI__B6U zQQ>br1Ii-c(?B3+5rB*Xov$L$dE(#;w#J{JMTX`4%?AuYtE^u>0A-Cb(1pE@;!;jXtrGlUo(d{C@()^00`2i!p>mm4o z!JzV^`G^c`N*L^Zkcr0*zTiIij@j^7=LZ``@O=dQE*}gJw7%t^a-i3x>3`=({%s-b zKP*m_$V_OtR3g(`#bNoQNE8%=niu%Di7H zo6my$<9rX~AD?a)l?0GS;PXy4h6i9x68;VWP=?7-5ivZllZ%0Y!SGw>`_HQ(Gq~Wq z3(BsY(EGm-xdBu>^KZ27eARj5Mc87bdEOfMNV#>43PN5!8;ffu8zN znh6Sa=uM)BSQy~-Exbuth0>(#`~^!|NuaJk8AIoX5BwXgkxJ&vb0KLKR5F9+vktHL z|NkXuO!GzOPDX_Jp!D*>{mofOpb?c0$^8v#5X$g6wSsmCK+l zww*_NLHkocCmb|JPyX}2(?vz2w=oUElIU%$hp=Q`vrTArQQ=_(9i`s+0UVj1S0iE! zbcGK%oAGZ91rMH-u zUIan7z0GSU|M~xaGiY~cz<;wB)-d5?U}4a1P>`?+$fa!EAu8b8Q361BqQt<`Qf~8+ z9N4%-=ZAJz2JpC7C~5+F4GuY2DuNwvJE8LfSo{MhNcmfqLx$8sU$o8!xnAHU=+HiJ zJ@BG<+5i79e}mdSmfO+N6F9#zp91CA$+tlHm8UyLMWMSyMFo~eE8s&f{H>t%1YkR% z%km%@^~GUOJHVBr`3GmYb9YbklZAi&Gv2iO{}7rpUVL8q|NrZq6Ab@1{|hMB>~&+= z1!}8wzHff;q4gWT%c0I@&}OmM{807ajE^)=$KNUhs)rCuZy>GA37wlk`e1!Qg(?FRRT%LAr1`VpA%Yz!rkn-K|f8#&UaRdDAMxX@>n?YlE=&B_^ra>wN z^z}jfEug9hJf{fCi~%p!%!EX28>ohY&Cep%_dJ5n>*83CauB2sVi!1FfXWllgcfL5 z(!ql-nR)~NE1m+KHpI+%s?@0UK#5*=h>8TL2z~MK`Tzf&hjxIPnyr^gK*gs(rvUiy zD%fZ`=-y4pC^`>J2xNX(@QbC#L8;611}JrbdT`(laOyBLqSqD0f zP3A?(Y(|D%pmGniUDD+csOJmT1acoF{e!hk25W)b?+Lmivlo2n97nGXr{$p%W6PK2 z>CJCALW5p}z5zK9ys&`31=MQnwA%qnd7XJI@ah+mK0;J@n%{uVfDj3NvHme!S4j}) zloB5mo8%G!LOSbMI@!Q_;B$Lr44pp=FMa=L`J!Y~ zH(PI=faMRU8FyZQ^+CMTX$N&YbnFW>xp)9v@^$J#WnQmNgWtUbVuAegBKqs!|BZ*f zU*%#reo(<)nB$uxKT8QuZ&QKLxBuT9Q&>ucdz%u{Kx|H?-boBUzW(QTJp_(kaC&$l z4c5OMuD`cQAOobDpQS{&w~0X-#7=SOog|?8?LWT@L?_7dG{}9HFK&MU*p2N#6xF#WT^`prT5QQW`a_E)(37i5E6 z0djvrJ;DTt`=i17zhB{E2tIxoTfx|Aqw+%SAvjiA50vnMZm$drc#&cWPJW$e^#5p90Mk^xG& z0bwuPAi7?knE<*=79{v$@&mAwIw3kb^;-{=o&&9>Y35n<=YJM!!2iu}{{R2~qDBMM zDiC-*3Eh3pVE0|V4Du|>{o>sCD(vbexU$b`Qz+5)~Sz&b}Irt^5`3-At_0B~Ut_TrfZMAISb9F++E<~0lq z49A#sdmR{?k1|^3s6>>>cZaA%^!ljiX#UiEWqFF<{bKVQmZ0!}7jw+PI=fv|B96JR z{b%U>0NL5TMGaK=fyQ50AnrxDRujp!Ywf|>F5xqiHYb>{M{!`C1B80e2n*3xl`g3UnUqW#O_sR;Jx6BhJ4~M%zM$z33if z{Ic^bSY7i$M$jlfsHy=gEx!srj1_bvi6O)S&`b|V8f-^rj0(qV8HhdFKG5@*K%*ca zn*=S7l^KDC^m=vV`M1T0GFZs4mtW^^SqYj4fGKW1$k@vw2s703Sot|n#|NaV`2Zv6 z3_j2;-#5xZy(rLOZJ>Rm0==M(fm6T%F`?6-`2dUMh0^b>-%3<_b?iES^v0OOt`F@k zW8mK=(0NnyAZWnGXNr#H(b9L#;F%9le++yDE9m&r7sob$$IL)!YB6Xn0my^eE-IjV zK|!rZ2E(_YJ~+sqpmlzGIh1*%)(~Y9F^eD*IZXOlTA($~L9F|AabLh}Je z%L~PU{M%$0Eo9hBK7a=HnL|`$4Bs+>CVn`;r?~Z&F<6JF2=KR@1hs(=F}}PC8b$!O zFD$|HD4?z8&4(CYs)Jg0U~$kaF6h*v-uVB$PX8GXYF=dKQL(&QB=A}V6igF(1O8hc zEeY+s&>O%A3MBq*AsmbrA=PeH)}Drc_pw@(6v1n7*duZ%t_9GYjr10#k9y7z!1 zH`Uk{)Xn5?EoWq4XgmVS8Ia2S)$9GB7Gvj!&QG9oKQ&KSp5S*nX!sTs%PuMc;H0T} z0@SUa(CZ`0VEM7k7Ia5&Zxb}4I;W_B&OZtOg&gAtNL(4O`vW@fK?HPP?-X#}V?1X0 zk-r^uq%b7JIbe~+&3N?na%g)Vbg`F<3Qw=sf5z9ACyMPmA$ni)LFGZ=f1+5Cf13!i zg$R4e2j(0Vj&6t=#-otMmXPp-h=E+x{DQI9hm`?zpis6pXsi+<)f@kxnMdU{AEZ6j z{DKjrzzY$sZ=uFA=cow0Wc~mDKjTGkmVU|c=l_3ZALy*x%M{4oWYCxhXh0X#+GcpU z3bcEfMTPOj%SO=96^jb9iweifQc$^?y%OG=14S&Ty#%hWjrV}+>%(Wb7#iQ$fTFQQ zB?Lrm0pFwx9*pT01w~)y6!2NxhL`xa3A9||Zvi<9bmJ1}T%xcSXV${92uJII&SU&7 z2SA2^PJG?w&e(E*zonazfq{RUKU2#|{+4%8xrTaX2L2X4&=E@^Djcv;xj;)shNwu$ zctXP&rhu>)@oT__cOJJq%HN(2O51N(LjRYjh=jek0+9ku?rDNj*Ix#Z*&!+%{OzFC zM4)NZouHGzHIMgZ{5L$n_#JfrUT=+x&ga$5e;LbkK5gzghfa5dgrT- z5Eh+Y$M2v+#X*I>;s4HGpzsC_by%0EaFmBY;+^pw|2Dt>{M*g5q*ywGi7X<1SLGLN}LMFeDK*{04A z(CIlG84MiYxoptrlm_FEfEQ}3!2!p3-11+!5opBrb-U$-QjOl?f88zM*n|!(@VEW} zEz3FrN&ukFRDA4V%R?mvhTmRaho=8-2Np|5meLL=cLKylSS}fqvvK(YfuhWm_ zUmT#l$r7E1UV`>M@NeTg_(*{BQ0vK(RfY#%vrcF|Su*$F1A)%Z&BquyPw;Q!vpiJ# zy0`fMOHjMu;6sjs4+Ox%2OmjrUI48uF95GWg7^DDLZF3DoTtD>fX(Nyyiocad^sVi z?@EsQt10Bp1VRr1pF$=f^37hUqA!I2DOJAv@zO4pz75xrFC$b;$nno zMz;sT#^P{HZ7wQ29Y;D3fpW|RP_v-1I4-_x~|8`=(9kbb8Y1^rF-0O{dd`PNy%OPCq)G{(#~u8gg%Ir_C6mJFjaeW4oA3^=f7tvtx*GIV+ zx@WK8W?%qKvw;e^7fxV_OGmjFth;xB&eLd~04n=lg3N0KlWF|*Olkb}P68l80Yn&p z2nP@m03s4VL_zN)kd`7-GBg!WYdi?j{9@}Ckn2CDBe@>Z1LK$IYG7ty;Fst+z|6pa zu!3LHNq}F|Nr7L}$$($e$$?+fDS%(oDS=&ZAAeI4$Z~zejAR+-o zpgR00|GFP9=57Xs%gr>5aDkZ*ih&6rVgZQQ03r^6hzlU%0f_hjNvco{Ad!9$F&{*% z2NC;0#CZ^LA4I%Iq|6dE29QV}h?oZ=)`5t9AmSW|xCbKMAyRv98CZQUNO&%YSPLTd zf{3#q;x34Ii<0_5B0V5t4v1I-BKClYGa%v)hqQ zjhsQjLDK~io&_RSfrwoo;uMIu1tMOdWLS_$Cy1B{B36Qkogm^Qh`0$NUgFBY;C3%a zMF)tO0U}m_h#er}1cc1l*1(GkI(Fyin8%WtS5U~tIYy%O;K*Ti=@eHK@8&V{p7ywey3L>V0h@~K6D~LD> zBCdjnry%`bQ6dd$IjH;rsb~QaQ$WNL5U~YB903tmK*SS}{x66~M6n+1{$`M}$sl4e zh}aAw4ugoxAmTAd|7YY#MY0~OzX_yl5{Os?A~u1DLm=W3h-aq)7Mf1MpPyS|5dmd6iLP#PDUWzK5cxa8|40hK4WHk47 zUhh10@Fi38Bj(SmON5$#F%@yAb+R`fXKH@MRKnE39*>tUiBK#W5i%?CI-FE&2>&(FZn`11ol14Fq-=Rp*{MH>J618Mw1 z9BKSQLTUVB9vo@>VnG~f{3Qp|_)AWu@&7oH#((`}<4f?JF|El$3=GW&1ey;C1c!%p zUI)!f^EW@|H#}kZ%kZ}4PyQCrDcR+0&8HP6wV&^;=hr;n{GX%Ftoc75f6FBS28QPU zy! zK_aaDEiRzr!2h%Gw@9;sM40(oJ~4wBO#Ce;LF;(`GxE1A0F7Y%XDF#gs*m@9Jd(zr z&jIl`*qdBXZ~nae?(%!hf1T&~TVn(n7Y5XOJ)A+A{_;ltWn#Y$@Uu;L1zpWNUg5?}d)Q}14cUd;6K z0Dt(fg2IROWezuy;lqV3e7^CwI&ou!4_j{)8>!*LhAVt-auEz4oOFp6KJ2|!9HfR1JFf8A32GBS@(8Z{g;Q@WLN8|cG=RcK z0aSm1FtiQ>uMUQeC_u+w!1aIe4R%m?vA+b}v7f!vt2)&r$#Xwqkae%^$fMXbizWShz#Be1pzz^& z3A*=#sQd+L#A1ZcU;b7nW{mX1+grs;YWRSf?^wg4If@m z`0&2;VInerfjU7L;q#Bb6?7UpTKeJZt>Pm!d_dhltlH+=X(;lmGKHv%9e}@2%ng z!1#;t#P`FX&Cw;ilb~wBw$W&_i?I263%eR9ZrT*Uz z3Y12DJE%~a`t6`YX#xK>4|e`-PVAZ|AoJ<`+c@~QF@boHNCJ(|@o#ft1c`v+i+`I3 z6aO|RunH)jnSYxTGm<FjSuIZBs(J1S7R@!L^_(mmgfI+Pwqb|}PYVE^s_EuAc9`hMfE;eo@@^&qhE z#`IgY-T_Mzv0Xny+d67UBo_oAVe!g;mJ~ z5cd#&b37>h9};LjAOIc8v;zr%hB8&btHz*1nHn%reuyY!C=)9+06- z&{RKoF!V7*6f%_g478pcr1mUC6f%@~0VWDMXN-TF2V^J{vtr_4;l}GR>l+?8gn(C1hJYAGM1`zd$Cx1 zu#`qYC4-E;SP-%<&ESDraEz30X#UAiG8>d=ExZ^@7lC-apd@SI#Z)>497@&y|NrNQ zgnnrgSR@l70ttE0!BAk)V2CIrQa-+Z>sj53)2LV&UHw^}ppniKWGjQd7%wr8}CR zGrtDiLu7c{@IdST62)E%z{>8}O5&_C@znJ)2{6Y2iFJ}H0H&8?8 z7Yl!jEvQBKinvW?!e8=Cq1~h)lV%aNV7$5iYz91qnA;C4F*YiRe ze?FVxfi(US_U4xgY5e&J^Dck|u3t*y&p(mIpYH~iHE6sA3b-`>5_biV#Rk3g3cY0t zCFj%lZ(nHs$xzGU)O=6@bdZMuKd3Z=Xoo0*xk?P#Rh|e}rA=u58PMx_q4Ppx6 zA86S7B4~V^4^%z#r}5{X3grU2664zfIrza$L|d#fYbk=<{Og#L0qs)vH2e~G{~#R%{SO|&#p-_)mpby}@js|}kK}(47wl4O{s#@I zg8k17@;@kyarhr(3bOw}e6XoF{LhTxe~=D>{s)iHV)Z|YOC9;}_#f2$L-Id}3w9|s z|AU51!Tx6f`5zR)({s){4w02MvjW{m%>XKPZfG z_#b2nvj0JRu&Frw&x_%IkPd?WXTll(C@ytm!Q+2$Uk~0@xdq~aU5d^BpdnAN|M@`v z2Zb>X|AS0H_CJUZHWi2e`7rzs(m~Mw;6W{{@sHwC(7nw#`#+#DP^9<=altOd=6}#N z0$~61gZvK)V;uemnS$(p5FczR4*&CG_#dPLzyC{hK|NGZM-sX1Qz{N=p@CfJiEv@s zgf#x^HydArI@l!~y=5PI>pyhfVmt=gSGtISf#KUB#!}sHhnPw&z8zvIb^dmUqtx%) zA%W7!Z-*30Q@$N?D9z{J=Kh_3TiAEa3-NK$hbQoFbN|44rdqZDF60_+R+9g?&Ndf92m6_7#c$jelF%HyFRSo};&n=0%CmX~0L3V#b|7_<4ODt`;;uBzsrYWyuMAT#%aQc)QL=mM^SAs4Ggx3Yu)=I$gV^x$B1kuAe7*UnMu}(hPfh+7(5+m}KehN< zri0z0&EMh&HbkdHy7{Lrf6F1TTlM%`G8q{dUaCM1==QkM9d*U>CV%TD(4mtaH@c&4 zfOt#5ygS`dcR;*pVBUl7s0Sck2blMyJL(CDR|V$1=#F{;;^lyOZ@Q!2fOv6W-iPj} z4I;bH1m^wdj`{)OnSgnJx}*MB-h|vJ+N#LJzz_`|4Tcm66S_SvcSl_Y z>0kouxZWLg9mM+r+Ai&JyF2POi1!T4yWbskAH=%><~{C?dJN*70`s1CM?DAe_JDb> zyQ5x%cW-BH&-JQpzUR(I4b5D#>3U$@7-?x=ep9%z1`+v8Dp z)FTiNbgg5z$FuIJXCNLASl_Ges8=8!=)BEtk9XZs??60I3h4Iu)E)H+#CrtZ9Qv(0 z>Kll61|MsYV7B?aHpjrHdI{hRAQn+_}T)Kklwr7_(eFT0~& zTHY)T>h^fs9rf1oW~oQF$H(rdkCrz}?Ycd_c1L}+yjg0}?eVia>Zj$+QZ4@N9)J0_ zNBy<9S!$PNd9&1#f1AU9D(8DL*`33f{Ro@1KKZcSA+J&Og9Ga zGePV;g%$@Bx+JWmNas#K*sl zfq$Ej<^{-n9FjDspaI>m2RN!jE|rmXpiCJXlW70P|ouISR~!=w|82JoEv49tV&)Ei(PET^6V^I$o34+jGSa!x(O z!N35|sarWfVFYy=B)#lD3w6O+kPFTtxxfhIzPnJ_yCB)SNU|beTOqlVzts)QgXB>D zRtqo>l1uqpwZJ?`PUUZvfw&KvTlrg+K!Ycs0zwibfs||cTiH=u3oXwVk6|;lF3Y?x!gY=xmPJ)a(x%(uldze5r-h|qC6QtxOl8sMT85nlIgv!1I$-YFAJ;n+O4_F%c z!3uT{JdOMV4KRSx$XAdAN*a00isU+2c%1+le`5CuRQDx;TyO*Gf*T+uH;`Q50+M|J zm3;w{eSsva26i8;^oaoTP*RI4#2ujf)$%=#gR~#teH_*PM=T5syRSoSxDHZs9m$3x zAlc_o+2!PI6maNai7St<2v}8fO3`9#d3hW+O>I1D$LoK^Nt#){W3tV0t z0vUg3_aRjGU1DTl*nJ7=f=eJJmyler1tj|jD*Ff|`v^%Ebbke+<$40##)YLu(D_V= z)VK!J(nd;+n;4N&<5EVf@p}+t-ND@lQQfNqa?wSoi!OqcTtspa3rO}MRQ4fA_92oi zX#EYW1b#rt}LE7gm-BB!{_IbAlM|Tv5<;_xsZV#UBC?05^tyB=h z{T4S%g+T3dUU>VQInDAWQZpCSDo0@OdKmC|UdaWZ#^vV*(D{}k-8CvY-6bjpVc{>N z6TwG8bsn`mRwAx>tlLFJq4^C<7~>1jWg7b+lFe^eLP5t?>%6Fa%D@0SpcZ5c*nIH% zFCP_-21^G1meXPk3=Nfx4E!w@!7L^Q{+8=t7U)c`yI>Xz1Aoh7FpHIezvU&E#m2zj z@*d1$XW(!73TAOI@VER1vp5;}TLi^HCUY_Hx2S_z+zk9JwqO!`vB^jr11-Jrtu4d2JqR^_=P+<()fkFIMVp9 zAJ9ApIw$b6Faty9h29{6=0_hiFK8a@Jkk7se;?=&Oz29O9~{Njpo6v{hwA-c;%{L9 z4SW1x=5H|vjnDjG;cv+Ut%CW%%HJ}Tje(*02OEFO9(D$Xm(M|MxfVgtx|biE{4Exs z#Z%UynO^S88tHf890-*IYLJSQ28l3zZ zfdc%RATJyOIlQ+_0OWE@&=y;b7()SmO%WsLe#Zk)Ia#n=3P?@{BzFW!A0t@K2PCHg zk~@eb_Y`bl2uO|xB!_I@Nw6Gt`#@JW@N3E#b)M+;F%)QictG=n=AnI{oX4*r$gdHp zz_0O$Un5h1U*j{sMx{X-|E;TO{I~9>@!z`D8{`05t<>x3kj8)gaO;6mA%4xI1N@p< z7x*=c9`I{ceR#b)jlTr!1CY0!gh0d0B}YN72B~ZX`I)~}8zOuRBAj&rDl7tWv}VzR zH2#v~AgSImftL&*F%8fE{2GCvaZRuv`895V3Z8h^>5 zUQo~P`hi|g0jR=D3?Nrn@n2+ws^Zr;ja4D&>PD!E*o*^N+6Fc2GRUl6Px;;;fzA`) zFzogGsCkGV>QsJ>NO^GhCF=8Q{NdNgv`^!|^(l@2*55S#TmRDdOMayBUq8;T@fT#> z8^+cHAo?*Qe=F$Ra1i?zBRG)3j@CHOubE}QubHI4uNfu4uPM|U}UNM=<(i2|tjMUQapX@cRS~Kd@8zH6rC8;im@)KRbNk#{>;OCZzCVf`uOwKfdr2@??Vq zqOcd+K0XEphL?Rvi<98t_m^KI5HzoXHT;<2;U|mgVf6IJ3<*D3g5d{Kh-w^4_<@x4 zddeb)-)C_6ft|{)5h)7^KV3-p+2RX7W@z{^BZVI`Ec}=WgdZy`{8;z#g2K-aX>k)g z{QmH31cK(}u!bKCJp5!(J&YcHERgV%AsBuzg{a1%gda#rucr)h_L*=;@1d-*SXMOfY%Rf@bHpC^&nIs zynJJWgqIY-@Pa8sH4Y`bKuUT&rI5qx8#uhcPUY8#l!Anp79_l^@P!u}G`!f5!ix73tYN&7P0LE-NN&76KL5ND7=31YXpMUiC|4%?C|iCMD-wgc(FsmOOjxC!4#qz zhZ0^OCB2@K$l>)J9A03j@@qs&Lc&WE5?+@0!iyamUhGKW#SRNEcD&&QF3mcNSod*) z(pM8`nHVU%e(-Aqg4Pvb4KEIOcuAmo5Iwv&AmJrJFuY(2QH?_hFOZU6PYLAk`T-6v zuv7UpA|)Wq3w+_l0Szw>r10W^g%<~&@B$V6`#`64zl=aEX#$1UcYcjP&^k1% z;l&9LFL6{4qK6kJB)r54h8IjBs&Odc1ya)MDUKXoKf&Pzb}GL{q&OtJ)FI(zjxW48 zq2a}e6keRL@Z!WBUXK4k?X>^SXweXOJd0n$^DDnbAZVQ{*6`wnhnFa-2hqce8xmfk1j7ra5Y;%8 z@B%66^%O-8uixPC0y~voBT^I+UaFArGQ}5O+|cmiMhY)(Sa@;c39rAP@cO%t6%<~_ zK#PoE;q`@IBM`JM8f$p*z{5)f)r08a#RCa15rW|bQ;2FDN_c^k^m>XQhu0r)c!8bD zuMsH%2`?2$c$we}FCJ)k@gRj44=lWRaD-R4VW-hP7EnmdK`f;J4ex@=uh0A%fuMEt zSi_4K9$vzz9z+i>UPyQe6AUkyLR8~W!V9FN*Haidy#9j23+z;WjYwfgcqv1|%NSpH z@j}Ck7b(1WVd2G#E4&K-cNYEM#|#RwEYQjdNaG%K4!efuCw`4U(7p?-;l&3JFCkP9 zqK6kBB)o(Oh8IjBs&Odc1ya)MDTEwe|G?n|b}GL{q!1*$lpx_{gfG1Kpy9=b6kdF= z@Z!T6UjI6a{_SG|g%{|a8R%#yB)mTIYXpM!>0k{net38ZqIwWLy!avEB}g#5UpM62`@u@;l&RPFMg!(;)jJ7KhE&_+gbD%vVB&9mz`(!&y3Zc8N(mam6S^5YnL2;K zcU?|cApljc09Eh6--@grHj)C?Q=-Pu@j!*Y#OvD;M*h}|papJ6m>}xE9bw^b{SR8n z2XPq8K9K%yM@Uc3i34m3ih^%P1Rx{d-;OBow}RHQd^_U6-zo}PX$V^H@R>iK@iXWM zZIGKw)EK%LJ5b!8*3Fm(^%1x{hw!@`nL3=n>OlVOa%AanVgcEm2KIkiwBJ0?2f4Qk;@%Ey?gh!GK|Pe#iK+tRUXXk@c+82Z(}^8qCNw0V6i6O4d<$+% zgNATfk=20qgM&t{kVjsy%Y*xRApIzIltIGh0&LY(+5|{=bRtB+;ROw!3x~nsfg}s& zL&NI=X#5`(KJf5@s)vRbSRUdZVJ46nF#jWkAKYH3_a}hWBZnVC1tk9Xg&2{-4Snzy8Fl;dq=+d0#-yHmH)3g{E zz_Sas@}M~Y(Ck7mm<5_$$ON-MvkUcL7HD>1DwqYDU04lffo2yDf?1&1h3oPR49&j< z_?zl9LB@fm8J>V8LDLMsz%0--gMb1^7BtPE24;b#8En8T&@@95m<5_<=um(d*Rmcg z1e$MHssNd9=sef_TA=wEKjUZOW*(Yf3-Gs9NHQ>h%1Z@tP!MZvK{o;3)_m{uT+)sga;biG0xUnxIJu(5ap;6-9AON`O7J zSOVfHZ!wT6%-I64qB^J|HLxPgX$r8SNT?!4up-R)3a}y*sG>VyM`2D}fEDpW6>SGA z!r`V@;t+>V0x3eD%IJ+@E+A(*qxrQ1f7=2%kjYr)H8%A|8z4_@h>Li=euC2@;6fBMJb^wv5|6ZbA6njGnI8fBuS6D<7LdXl-$V&m zhZ9r>JiI}(9Q+!ASZ7SYIs~9P;NcC^fhD}3$Uxi!4{wlK%sCWrcvCiu0uS%ya?tQ5 zG@SwsZ{$iHGM(}sv6CKFKk{pMf+s0JUPMmcCQ$#u(>K0}6>#V=L3O~x8#F7zuMvoK zh6SwSf;1!y;o%L_0dfpl`d$K63lDFQTFf~YaCn0~ME0x;JiMpMLc^QT^b0(^5sfU! z^h-U)^xp)24Nvf-2FQ!Z;r&Gl5*G0A#y1fI4!uKA9q{l5&7$yY1Y(_$0qd9m)d3H0 zm=2I*(84I%5o-_e@2|4|iK${Bi@WnUL0}d@Gs1A7e zf@W#>H3G5D_<(f?Ky|>w7p4Q`7_{{J1llTrhc8Gi<{S_>e8CDzTHyL@Fg@I z1Px!*>7ZcHIRxPF1y8boyo4OSCQ$#t!x!Jg5ID4$pgQ2;3!2s8*9gQqLj=}wK@3s` z!NV7(1LPRA@Ld8`3lCqATFf~kaQK2fME0x^JbWigLc^EP^bs_C!KE>L`sg!gpFcQ! z!ILr|FCmBT7g31c;o*yKA_*K?hoCy(;R~7t;@1eoI->;EF#)Or9=VStYXx4~dBM|Eh6j(<9R0lkKVLCvLK?`3Ms9JdVg4ANpNrA%` z>>;verQqQ^SsWU^gr=uJ;fpdoWsaE8!!kbw_IrsiTKM9dr~>P7g6e>WFKCvDUn3Cf zj1^di08|G&d|^7Ugzpm}hw7p4Q`7_{;s1*#Svz96-jb7bJ~1$&6>Su#ZU zg2yVX_-_%KE}MXuE|UdKEJ8vSK7S3KgaUa9IefS9qlGWNi8F9$H9>X2!xuE`#jg>F zbp{QrBLJ!c9=j9=`R0(DX}a`ffsZA${H=-13=H7;n9d)~uUUFQS6IcdF)+j<_E?mtF@WapB0w4x_*)A=v;%)@2V%}1 zRP=*aLW9iU==I{@ZIPGZw0LfX#UO3 z-;xLx;oxuG0d^A)f6MxR|NnynEDdZ9FMmrcSd9XIYYSL}kH4iFEaJf5x(F=7&)+f= z{nX zVgy#p#oyuyW^nVj6hJj0rx&Eu3!d+5{>{tZk`C6v$KTQiX7Ka3Y=vqCP33_nk3mzN zpy^|{&Coc3%m+8WX6yxB5@*K@PK8i8P<%n>KYuj8X6gl97$<|G0yaMioe%xd{F=EJ zbb;JACWtv@450Z>=zQpp=GUyfpey5UKxIMc86*#%AN|q%nynXfecU#v3W$E_eCdzo z*X+HZYvg7?WkLEu`3Y&h^hfh+&R#E0{#MYrBk|FPA^8^?fROp-=GR=kUR?aGK~Pg5 z5fAk;SUuAG>5t~u+`V4h{H>t;05^|c$P?Td2L&oCsAS;n_2T7kWk59%96uoUfg%As zI091722#)0>&3_4dVvuVN>CS|s0R;Lfz-2u)bsax@$} zSfNG{F5l~^05Y&g9&BJeW3Q*cOEJ*l*oOu9d$^DU8UG^+TS$0<^Y;Z<{*M3u|35tF zLD?I=z5$lMK?iUnRFpA5@;@|xUx4Lrafmr3YT*3cc>z|x{{M$=J}7@f^Zx}{{=W%P z1x^njd3gT60L%ZN1AQP74w8rF{|m7EKNCqmB!7X{Pc*-V)X&urS%~++`5CEvxBx33 zLcyv)=T8YSqO3=`04pDiAu7<;Q^3jtQHU(qd}#3kUQYq5&%gc!g#^@m)bip&^J_?X zaS^NrTJk_Ch<}i$xqt6Xg+Mf z-}m{)|No$g=iV{_P}*yI4CZHDfblPb`9%+U%LIC(KfFBh19Z3uWOp7||KcD2|AQ7a zcz**+z_;na^fyE0wITBG{dzF@WT-qhL>|0p53~^wYM;pW|NlV=7#3a#|ATj`fo%Tx z?f?ImIzJFO0#rW0)FaAc@Khp5{XvlWKOl1;L~R)j+NU=QoJ|g_*$X#6j|>LGo9UlJ5k`AA!olyYe8Je2~m4kPI|L%NUTlq97H%AQc@5706vFki0HPJ_AJ_-W34J z^Md3(zWx8tuW_sSutA+IXsrNzB?2TZm1%$kK??|i1fU{fpbd{uHWz3EBqUY!h8Xep z`WW(m=FfNhVEFAbf4$R(m#@B}nGTv62hF=f^+QZ&;@2d?biQ66Lp~JKd(ce>%>#pG znNdt)xLmtqIhcDfZe?V)&L3i34etUW9 z3tITFLROASqu9YplpWl?K8D;NJHA5g_}c08$MDem!M48Uk>thJohmUZ36T0c35n#~xGK%TkM48Uo>to2;UHH2z z@qcI0Z%D{1p_>mH0p-^S6hSechbZ$|dVLI8x*h*OQs;?}XyF1H`vZ+EqL|D}l*!D! zK8DP2lk?C`290`w#?(+u<|E2vrd}UICUBC6q;?^6vq2+1pz$OWv-ycKo3Yo&kg+TA zKP04ge1O-v6FM&-T9csqxA`|uS$0DuXbEQGxBveeDnUyy%fT$r63kvO3$z4t@wfl~ z!JXS(U?I?2%ne{6KK_>LU?I?=%(LLu0jOUsOZg$JAaEPSO~OgmHR8CkpQa1kpmA> zgH8Z-ZdQQ%9*q1g@*uN8hj562&0*qi(FKWsPvcMq3o-MzSb>E=t~2=Z|39cb4KfyV zm0bh?R+o`w7z!h=y@LCvpz=8 z^B6tPWAr?a6TP0J=Xt;uQNub6sFOON&Jp}P8ITgpwWYA7vShC;g`X!wXhA9TJQ?Is zQ*bZ(<>+}HpswjHLJLH};fFS=FnXSc75~N2^E@!ldm25@gY1==@bZk%f=pYy9 zIeMN4|HaYsJTUU(=y@Ka=Xvycf;(^U_84en3v+EFY^mnxc^>HD1sbWtT&oCMdP(+5 zMR<8nXo2EP_^igu(epg4_-_$fa5xibmggmC{SI_;6LLNUczGVEw*p-c2kNT8&r`#< z%n+myex4d^B$VL!6flJ#8xf1%KxV=7BS;D6T0(y4(IaH9B!s6gLJJ6IA}=5uJsF z#2ybi-vMd;-$&Sa9w7DL^?&jRjZkNT^&^Ird!4x9Hbd4sgO{^`){lYL|AE$zf!F_m z){lYbqha&+y-xgK`$6kFdYRycK-Y8hIx)sW?l(bRztQW2PzZAmXgnCQKBL!(B_48~ z1#CS=uM;cWU}W`>^%%WQZ1IrwRfzQ!y-pkm9f$05h|ePNg&o+^*V7O zWD)vN)=%_0@xav})>nXM%t3?yY`sprSmY6t1HDdsNb->ILqG4M*NO2kBtFo>?=UF5 zdYzbI8o=vI;o)}}^?a0GCswd}czA)1ynvpp+v~&*jv&x{JWBY%Ooj$HNFI58O0N?q zTm@)81tgCWesEbxhJeU}mjHG;ar8QIW06N)-_YyC16PCXJe6K2UM%t`;fo}XlwLu; z2cP$Wa(;L=3+T`d(0oH7m<5_|CygQ}3Vj0_B&Cwe^vnjd}u9d&JZ8yas=YC;-+ zKKR&fs8;ZqOwEVE&A~#@QT!S)k^-Ok>qS7PhaLu*3zZB3OQwJ&Wk8bPbFZP2=3q%5 zu%rq|5`1(wR1$RG6~9IZSds@MiEQUz2JmSdU`Y%+LFXNP=C7BL0-fG12|K+Td~i4P z&~DKA-SC6En-4mG&hBnL1fp(%&hCaD-0kt1zdq>zzlLBMfBvJ-{PkHEKu3Oq&iV$O z0REZ3zUTqJ#^=xc^;I9Bhk%0*0EZo2-h9ZR`JhAVfs!4KuNQzvIo}^ZoQ_dyo5o)P zUQGnHrS(8>v_Pq58h;6R1rgXbh?pqYBKUdV(E{M|lkpbg&FGc`CGMd0(DOkDJTdXN zg6^*Z9rUyw#OL5|-43D!_*?gbXa)Y(;~?6Bzx6!m(k{kMrfx?T=;gRpy>w5gUTz=)F)`+0cd>13G4YzkN^Xf z`A%#gcSCaO78G8iHcDw9ypkfQ(jPKfXVo$v%(&kPDbX!s&dM*_zuLOncu5h|eT zEg|s(4PS&Tnto{bqRC?kUxW&1eGChKX!zokhlVdsd1!)$ob&{mY)+d1F8_nW!nCBtTQzq5=#IogX`YG(Y6$Z*c>y)Q8>L@cv{Pe+eJs=`{Z97cakR{w>Jg z7Qw>6(0Yl#H359lY>Asd8vpeR&A%1-+vK1!ZA{?1uXy-A^Vjoho`)rm5;caM0^kxQ zpNEfMBZLoB^zy*Y{=d+CP@ws>0e{;LW{CL@c)^7wSd|D!6{vuQs1o3Bn*>#LiV37D z1*}R2qzY70!&T)#RZRh_@&T(-0jUBN*>F{EP*r_kRao66z~80-Rpo)#UB8$ht~UaQ zLA?xr=cnEhK7rD_z*Z%(h4{85to@PA9zvt46^aFqYHy*rln2mv%XQJKzhtMQ7q4}6V z^KtMB**%wDIDr+dM<^;|&^*n*=Mv+&=0gISr(P(5<@=H4`S)A``J(x-J=ocdFT1%> z4s7B_@@4a3eXt_ImuVnH;QS8Nj|he4!}4H7iZ30x85kyf=C3#5f2jsn|CzsDhySG* zGGB%NB^xqdhX3U^(BT4L^FQ;~^YFiX2Is$s+Ybte(}&Ok0v;ZR1sKnRgUs?)(WMs# zVAZl@o68(uKRE~{ymp0Z}B%( z{Qv*|#Wk?pVYnRB0j-z#TS4-meLUwG&%Ia=RyGH&3?>h<=EWqiWIbH6w+vjaRQ~_} zA1q%4mXAl4Z$2&nit^V2AcH`g1zz}q6NIfsqr)7u7Qdd6zjYBO z0|T-wM15MfSX!qzXf=L46Mt(Rni|l0e7>|!{*H1c&{F(*X8zV_R3+VFAl)pz^(_3Y z4yaOK`@8u%%2_)3K}+%LS@~OKQI(`k=;ll74rA%$PwNb40jy!1)C4m z4%W@nThGJaYK9`8#xLXtYFmIz@n;3C#;@n)Zxw>7fyEZY!65rU>cO5$;}`a4Yktkw zThGVe`iLDGDiDQGZ7}s9vq9LO9kd$1o}a&U6IS(~`SaO6^VhS3R^!(T@VEA$ssi0# z1(xq97ifMh*jq2i-=N;z4fB}t&c(5Amb2=`yinJ zc5fQLP#mb{1^GXoulcoDZ@n0Q>n5xkK<)#n2fHwhUpSt>`L%d&y*Phs6F&7}5D)VU zhYK{nmgudQ;BO5gQhi6cMDuIO-g-&?R(UinC2F7>Q9;X6!vxa0{Uku4mIksTtxbjYa@#fdkz4g-kt$SdqQNstM9$`G#beZ0I z8UEHDEb2e==ZEov4FAkuAI{tSTDG@dmcJEreiL>q%k|dF@wXbG znhZ^^F!kW@2dU?8el6cyFVEk~gjYQ{{6XpknqMpQ)+_M0USh$PAG*Xk#F1P%0aCt! zMZn>g*3H)y#sn(T!kIv#pz;euL!CDPB+b&v-x1CN5=AYaKqB4n@(9EOj|YLXDu@Rv z@Id*o3sRhPgmZvJAu$2903?rG-XN<0cYQ2s;YSFj8u@Sy$!$s_V7c6qS> zLHUaxyF4QQ;gIk012u@*K}HC4_$z=_m8hY#I6(1@k~=~D=T7A8nl_;`{6APL!~kXP2e1}M{^l2UM=^n47?M^Y22M!h7iNcLOptp(d{Dg)HUZop z6$VxGFfLdnU>lQ1ZoxU)g|pZV)i><6VvuoTpO(AXP4)a{`7<==Cu z`7l4@d2kz=5mcVMKVS&j&RJFs(%O7npz~kzGk(qQjGvodL-ug8r}5XjgZ6N`gZ6N` z8-RLAusxibY5esN`R3!GJ)AYBAc5xN0x!h2fZDc`cYxZ_pmuNbVSyS6nB>pRAjvXh z$rn$-Vo7i@NdKhuQmId`w?p&851?IlJ*;0rw`O|Kxla*#9l zo9;k(^#(|R0rI~gsJjj6!Gd-HuKn`=Kd7a9^)qNyI(Xde0=T~d>M9HHxAj8hmqO%0 zV{jn(d;xG@T7bVT2dbb1q5!mw52T=6p|^%#0Msvqw&|CA{{R046WELIx52^$l)io- zI}lVp$o)ncKkf#P)xKVA%GfyR$lf?1&PNq5TqY6 ze%S>cUq+cR1obcB+rOHklLF`9z33sG@OV$DB_Djr2ky0CqkG?dB5^;R%{iL=GQ#_`+x7K=ma;JyQ6> zRUnT~!^0OYi>e>Q@Wmky4__Se@B|N@S%eHQgZ49lMwdA{ ze;FQVumYWM&&0scPz9FpfOgckPAczY%WyD5F!LN6DkB+W01yQ0yYmS#0^n}Y}OC(usOty zP*qPMLda%8R_CCY1)4)k<1axrYYjvrvb$zNgpkdGtj<9)tF#=&oYIWu2L~qbYcTL@ zcnI)o1Ss%p6o7`X52o?ox|YU&>p~iT$>lWu>)>#6D7lu#UlMTu8akc^rCMqHB{yN* z52c{nE+ZZw_@E0i?}50zo*y(%v|K82>$uqPkiSI!+abo%oNtGiN=v^TVks?cKEV8P zBjVbY3EvJ0lxBT9qyQouO0${|u)myykWQP>@wMS8e~IL`V~nNY-;ObX2$s_D<^$ZX z^FYn73Ez$hlm>k}rT`)wN`smY@V^d4YMxGLKEU|erTGBUYy0K{%&)DQ53sy8Z9c&I z+MxLW+iUIS1MIKWnh$WiR%|}N`C6v=0M~1Akl8}b2Y6odHXq=9&Cz^-?=^Gt0sd|u z6`o!ZcJNllDpAl3I4FxWfLWj{(gtRMvdA1T3zS6`fmxs|vIEQlWs!4W7AT860kc3^ zPmob|Aq=HgB^x?fj7SpVy*;I;eyWV9lg(c^geIg_o0v8=Y2r)M6c)Q zecs>}hZX-t*pVoB)(3->VBQr0yZVCcn?VTyXJ88P)Q=z~n0Fz-oI1My4}Cw|=>9+c)|IgK7ie=I z=ol_M=?kP}bpIb{IinT-McCnDc)|;$1oQ3zehp8`ZXSS_U!(i~aJN@S@AD@6W&n8l zB4z*IYhKv!D0saAZ2up4f5#%wyc-jL>naetM5Hvsc3dDEd zZ)F0HdqXBDz}pJS7{K#$pe;4v`8m+=`8Uu_-5%gcI1c{ScrZhNzqJg^P~dOv1v4D@ zTbIC16Y>O2RWO0Jr-9C3hfimK?gOu4gm3Wx&98J+F+sMRLGACTVutXcM=&F8wgCIL zqlyJIr2|$C(a#FvL#F7!qL6_xXdq4KsA2=j!?yS#tALuv4w6S~34v;aQWH9=KqpRu zj@$;FV}E!;M-}LlOE4cY;e>1=*ngn2Ho@|+2`3~KX%jlCK<9me-@s29c znWIp7EE`5Ts(3M{oRG}usNzGG2X%2!wv2RC@gvJarkqgp3qa)2;}A041m4dO*6pIg z(Osg#(_jbM#BhkeC5?lDq4}YG^CSD_p9=i#ZlD3@Uk2qCpu@q__}@QCH2#uRdrkRLi@1kw-F z3!3kEdifPt_a*+;W(EcZ#)D9eC)4=fgC~n7r16(HfNZ+Zda2YnjlaZ00kpBA^-`%> z8h=TE0c5_U)DkpV;sBohaByh7RB{rui2cIrptK46doK052nf7(hb9OJU*WYm3g6(h zI)cx5g7Ly@aX9}Z;|VAm6u)Ww*ROyUm~b(Jc5KvZr14+B4&r}d0&NIse)ggHAwS3y znkQa@_SbfTeS`=A(3IKbS0D|v@UIiXzo`CGK=xm+i+}-=|1N?23-w{zgwBs3$D(d# z0fjik(eJ=T1at=r$QQEUO&j^(jVm0QC(;%mfg7y(|An!c6K=hWA)=Q;<@bGIs0NrwufVAZ#1AWU$0d&hr1=cMmt(Qu6faX;p zn+Q>Nnw()^U;t&dC*bBNXcHmoP7~05ACNs5pyhNKpk;Rj3eCq1nhzMf2<`)|(h`{r zTCN1%6H=naz<2_@`Qe2*SnkIpxE!Pyo&b@R1k2t+m+dWM0BtTfAOPBN^0gOa`Zk0b zaQO_%h|t|6SHKFUA{2nie~`}IV2K)p1jKGocAEh83&ffi6TvEj;3~oC{WE_(#IMcA z6q*kxyvPA7(uFI6#to!D+F<}H{Ni9$8f1O108|XL-lCf?t&^jpfC(Zrp(AxhRA}}-=^^kGeCLZ_5U3Opz0PX z1amD!J6ImN-j^Y*GXQ2WL>9FEkza@nvfh`WGk_gpD$EE__=4<%>@Q%z&<&FZ?H2&8 zePBrA7xrL9F#}>hzYuu6FIb)pyF92O0?VVi0la?pGk-nQbCC6_Abv*yELfplfly%e z(Dl9yX`LQuia_h>^4TEkeHl7E_)**fPA{PKu8{S<3>dmW{zaAVC=fw00^&Z<`hL)Q zSCD@q_)ru;+{Z5jUhfN*M|A^C9=zTcBp-n411$0#1rkszVD1C2*M+Xb&) zaz9uevfdXW-RU6?F#_&>*m`}KJXAMC9<-hpwBDEDGk<*mFGMFa&4Aqpk_Y=AB#*`a zAbHSwU$A~G{s+l}3LdaLn*ZTB4{9M~{fmzZM;d>gj|vZ{-tRo0#-DH!gu!)b!AXV^ z&*tYJ()jb))A&n3%?41he+jht{PM5MKUxozNHLyoy~N)Fy3gk2Zp7*ZP=Wvz{u#`m zuIT$q&Bp~m``a;0X+2O{2~y_(nqEIHfX$-T1EpagC9-&x7=x66_A@r)GzDA(UI%R$ zJudJv|37%OYKuGK+zrq@STh(H7&;C%JmfD8?6}(Sl%KzK8R)7i0shv1ptkxU0shvh zAOQvb*1uo@=>1Wkvp@cT1swQWiXen4^-G`vCE$Sc5V82MZML8dVAx0Zti znD|>k_gjHBmV-M7hoJXs^|~XD8=25@iN95XiGiWxA;f*4PNyT;FgOgbjO z-}(i_IHJJcdK$zyroi9&2*fzzz~6cj#5m>vxlgFq9clSri5jH;0t%0B#~Arr*MXFR zt|)T_F^)0ux6T1EKs_4p`od!@{HLP*EgJ>51R?rn* zp!>lE~ zM>_Kate*`{9_fS=usrH{CcW-lXzD>BiR>Q4=_L^R5vP?v_=wXSpHzz`PPdARdm^Yag{V_}lu`Wn=l1(hA|Z$q>74N(6D)KdVNfBDtr7Z5wd zL0R`aGsqyr+pi^|W~5C337-H9cOLFF;fI$W;2d58Du}=irj!|ODQTQi zB~w}tlq$5|F5&6C(fK_(?&U>B28IdIai9=}IuBg`Uq97)vQz@(`dqvKwJ*6N`e@a>=gfSJGLIOwvYxR;>AIGP`@^S6MnXNr3XzF+WxJb%k_ zh&*UxdGiB%{+8)r{_A2;d-g#+e@i=rpWIuuI6?J4 zJBSayo+<9N;RMzH@*ut|L|$=%>VJC>-xR_ZoS^!@9>iA#^Lxt}TAq~pbR24U^r2K0 zR6MN(6-O-mty4iX6Mt(h$d~RP;8}FSiU$7H9Uw^u{#KCxK*K>DU`1cR=PPwQYk2md zR1>@w8yxVx4 zRVxq|fa+g}{msV(dQJF2``aMB07QJzwEh)nyNG7XtC1p(;dun~!mQ z;ROCYCy~RmWPfxVKgcg&&Anv|p!kJ)9#ou8h>nXlJb=_Y5;jG^kq<7J%Xxn*|5KLt2;?KxSU^F)RRG{oEVm(ER8C%+H|l8?bd? z*Mm)hXgdh<3&`CdH>UC5yOG9!?@=26y~p6gz^)%@Jy3G2`4wmY`GDcc)&rpNDt>L&QL*lzD;1o)7kV3cxIf1UTcVmIEbT;NDw_GN>cc4XUh}_**A~ zXcqp~*`Q!S9LNXii-5`_P(2Q=&mH(%LFE-_cMK?jbUX#Ezt;p$>wx6J)i|U+XW?%J z)z`>pwfzM+E$%D^h+zPgp|L_FFULQ#Q1@H8MI2~l&gkC2m*w`49&w|Eh zMdP!f@j1}=sOSInI&q=NBTnxFm4C>m^+EW2DC$u%3-o*@METfx0+d%k7&*UKf9B6; zfaaGIttUbC!b!#x;NuJ@^ag;lO$0O+Cm0@pTL-RBI}c&cK_z1Rdk!#O02u=fJqXo& z2%aFo`eDf*)Y|~%3ef&Ic;ZjvzYfk?>X0l1$y$&@>G)fr`3;in;pr68UjKf`o`Hd( zBnjPgQ2QLi^pnW>3T8T}zY9v)pj>+sB-nh&0pz|KP|F9Nqrl}Y6Vya-HXx9n()h0* z0h%wGkcmkLq@BtPHAU-4F zz^*a|h`a!@e6Ndu0-TREeT1m6fc9ANG{0xzZ}VbhV1RD5vSo&CwJK!;u|WGs3cxJT zK9X$EmI{!L3eYxL@Sdw!uq0?hNd%Y$+E5Y5+${)n;>ioaC_X6QbMa^#&=pu=d>_#rNangBYS5N*fTBXF8V*`)<) zyn}-x6VuSm5aq}&1r?@fhW0{KA-rE&*LkS^B*Fm85QfXN8djbA7(0Cv$HX-76U~$NO?~vpQ5my6?&xOPtIHDlp zpz&wK5YzK}u$dJ|~Au-5?;Hju)(w~PTCKH&QE zkOHLs{C3EJzZFzJHoxcKZ;}BGV>loN>5#(7WO)D z#~=O%8vKOF!^{T_bwbP+;BNwrH}*Op1_hhnGx0Zp)b~0tg8C=T@0t0Vrh{s02PO!g zmA|PS%x8h{*@~)r9YBMA;P`HS&t8<>>i`<`gYr3xqI(@cgMLsxSCMzG18C3>%I7Y! z?sWhS`a$`;McTa%pb&=g`HG}_9YBM8P(FVVcdr9zkPpo7c2NPTg@>o%f#%~Z{4Jo~ zD|q+ntH1yMH~(kkZvmYj3faag3CivNnfO~kldug{ph6b3VYB%^Gk*&xCqXv0f=+tf z!NS16fYN=R(0rT)vfUMwD59|H?9^S2xV3xP^y zP-@u00Wr9Y0c;+qWL^eV$;jUVT6EJ;1uCLJ?XYH$d7!~#$VS;NuqtN$7SQg_hAL2@ z4XPn`@SvE-!%&jf{GYKTuc3;Up(LaEKT}BtXaj9YQuBZ2lB9+zeuk2m9Rd(N(4d1* zp#72Yhno*Dfe2<0!2%*!K?EC!USl{~GNN(?$L?E3%z|9{30{7#2DKYc&O%)r1<%J*6Y)WB;##Q5zHbBRQQ6+`J~ z%M1MOhcrJ#!zXFdCRko5GwrsF9GL%R* zRQ+Qpk#DH_&ro{4`7pEP4Sx5-U}KsOGeSA9KQb%(a5Hy_G z`11p3P_umw0|P_nK~yo&=p1N8NE*KoXep9V8o!taM;gCa5Jwt+{>wD}{9kGO`I{A1 z{rR89pR!s2LhpvsAJh16zeAG$l*WJiUmE}I)dpa7ug|9O-`)*nUxzetOHQTn|2P3U znX>UEc*L~TUx|UC`G7$4A%XC)EQZeOod-c}+UNX+Ck%gC{^V}~rTcRBW*!xVN$ux* zK?jgF|L3SPYyQv2-;yKGz|j1km%qhX7R2D;Z;_G)F}V3#K1zTXT>LF3#6S#A{+9V7 zps~$LArP0Hzr{fS#9-rZVFzt8{m;tZau2i-^*;-L%T`X16f=Jd==?Zvo=XPpWCax* zR-mfoKLdY@AZWaMAIJ-7{P`S^AOwxL=L^vw;9!CF^YXjP?=}B*p674@*{uiV|h>$G+zo7AK+kV=22nntzv9^4$cVg z83Yh}Tuam#nvV9YBMqF4H3(HfiTEIBV)qW%J)rtEjX!_D+%r`U z9HnXe`FCF4{s+H&7!<+KL&ZOQKlblG14F3*D3}|;f%96<(V;X<)ZN`^x zWKn_}clzL?L11H~k5Bxqhh;I-2UBkq6B+3P)bXTc0SV7yte~=uaQdK|drD=9NFRUj zrw=Aj`e1r_Mw-a^zn_q)maoXeX#Xbv5}EJ*yxo$ zT1AMeU+CtZuflNm;7%V0@TU(pQ2Jnd=_5>J`rxENU}L0@@BFRG!kFoUy|;>kjP$`y z11DoGKT<(GYQp6Q-Q06kkcjlr07@SUp#BR8L;En>ka|1d@kD4htoQ~yD7~=1lo2E{ zy?{F5)b1Q$q?aH3t)B%j(+dZA>4g?f#+qJCK?5&@(+l0)vlMi;7{ooe%M%9D(hCPD zy>PsI!$)L#p+)AvNH0J6TMzSLrWelMDo!%W7g`jFSkntDXnYP5Klu7LbaPKB=yW=W zd+?-}e|X17I6>)y^W_;HBGU&gDp!p3@r%E8G5DGv)bTT}-YPCK(g!V?R9Mr;Q_!$2 zBtGz^54yQ06yY8`>EjRH^uYy6A6zfjfNlzc%*B9)-*Atg(V}sVkv@L&w>EQOmLJ@` zRorBx4_b7|u%?frpwWE7>4R?WF-5osPx|u{j5U3l%9(+4joeek~Y zVIeYo&|-1{BYphiZ&hZ&EI;^qtN6%BAGDZK!kRu(K~utz_`p|w(9JzpLHjo$?!l8j z4&Y56e4zBf_fiM6O_P}R2Q4N`G1A9>{#Iu2IzQC%gTJ?mpN#ZDiz#WW=>xPov>6f~ z_|ga6+yh?i1#u6a^wEGfeei?Q2mfpMT|baC0-FB?je7h>S`$KO&B$jwYew#;@t2&2 zt{3_E{aUw;O7nC1-WvW7jK3I9d}mQn0IiPUo&;ST4Z7dvWAhP~xcHWn{4L7 z`g}XcRGJRnH&qATNyP!#zXska1=?>5-Z}`{ulEhKbr7^amVcWEJO4H(_U@i;g@=Fs zcegZyD9sbmhxxa0@NZ+n6ovdZ=$xKr5Nr zmf~3tb@&>d^-#;Mf!0H90Gr~ll#?O6J4A)2+eJknt@C0UX!%nbXhjr%J1F))^XChp zuZaRJumhbZl*XTbD~&&YF=X`ZPzKt~B!h#%r_jsO+shXk4r z2!K;|Pu%k%uLY9JLq8TeaxK^Go_lVBA*2_lq%_KG%xlsyA&q5`MHDtJmn zCOdpmV)lr;os)L%D=4& zo;(rCl3}KSmT2>D^I+rORs~O`2xT@fWuWz&kn~ms&!z}vprxE(OF{d0A!$0S^Lpno z!vmeaIzKi(0UJjHULV;vF={dWR*AzwTxlf8BG-pP*G|I~f?Dn)sX7GB7Y8Y2t4MtuJgo#L;|! z1A9s>Z2(6~`v3p`Aq6G2R2upJ|9`MD2Z%Bz{%zP&sS!+>Bt#jGRLTug_URwkQXHxD z$v>#2ryG1Rw8(?(?L4{Z4mv^0$B@8dMm+)C5K48=n6qDiSYRKsSXP5rEqSX?~W?NZd<)f0c9c3eyxTI0S5k-`~Uv`?{rZy0jchEQ89oT^D>W{fdLc? z2n>pkaL^Gnpc>Ppx1sQMC}@Z&}E|z~HcgxkLiQ0o58H4mXGcS`+V( zHldqi|Nnpg{uy3mJYSq*c)syGi057!+3mrCknliA*mip$>Ciz)D0X}BAan>IBv_jd z2)v%re1HXlT27YmJG8tl;d1zXkb&VpLkXh;Vzn`}eueo5w5qxJCu6A)|27UQu2L4m z1JQ>i4>aHSAAPvyb6Dpw&|!PMTuclMFH(C!snOJfje%LFoADImIlKRl!Q+wLZcn-pXZ;fJNVCZ&x(e3pD#Pb33-gJAt0r5cRwsgCF==S;m;u(PDzI1zi0r8Z;ydT|O zKR`SYFz-*d*B=lMbZ$!=$W`5LkGs7dgM>bV(ze_4Zm;Jc-cvB|b+^}R5brve_rBZf zJ%|T7$EDltbGO%L5N|hF?t8b_cMxwanD@Ke>oR?k%0kf=c8_~ zMsUe7>0P(9Y|_Nv?K6^I9_x4PZlb$h)7@j}5WKXrS30`WlS#B{rT>-PEv z;#q>_esz2O0`as#c5Zk3$G_d{pT!COR((bW29P*tEh^OdhuvNeK|-K4;N5OdyS<)* zc%Xf&-EJ?ty?OuOD)`RjkNF21clYbjDC_sBb!ES+OCeZm4FBQ7kteHx4yWLo< zomfhfy4^Ueoj6LvyWM!Kop?%py4?hrokU8_y4@tKog_-NyWM20on%TC zK!>0mQfU6EP`l*?e>W&q-FHP!Rn3Q3Fi|&`#fee@i#Me_2VV#rd?{dYqLj(<1URY2 zMI-G_hNN#$uC{bh5#Vp?D@BZMKuQQue(wCyU8BO%`Kh}^g`@MQ;m78O%%Izw{*>A@ z|70#RhipJ75nJL3W%0mSOiMfiI!_#Y$<+LS`Sa4wgP)f~bRO@#*6pIga`@uQV#XyG zUluc^E&aUo^$SQ50zNMQ;hujb*xUm;Pe7o%Muh|HB%aP6njb6=mW%yCF%fJFNBrTx zy*2#*drSEKgJqlFGd90tgxK2ro~ijA)90lSm4D*F;R5n6!u~p}_Jcf+944q1Pw%`2 zHVNV(ka>SV&1nu$;laPnMTO_FPUrRJN6aOHRV=GKOXOF1mPj{$Vk~7^<=J@(6jYCx zGY^1vW_(`VdGYfqP}u`<8puF!_`roNy({D`wAsb+vpd!j( z5zs*?FcCqp2&iM{^qMtoLh~VkZYFR!$#}dt((pK}!1e2Pf)u!n$BXR|!Y18Lkm8o{ zc(E!%SgP9zQrI#cFXn~|mn?#(%$5Tsd`>M-N;sWXLJC%?R^D3f%hA$W9i)Zb!H`+z~Q1 zoi2hb-HvdtXd%hX_EXK&d(0RJ?EJ&^y)I()uWMJ3_;u&7<=3u-BR?puI+IH3X*YFC=ojNQozCDV#!^QFe^y-vf+W(=Rw&Hfg$l}cmQ&Daat(3Xfjko!jK(`n;av87lH-pA!46j4; zHGk`AP{f{s$`;Rq%apF{4ufWu>-^22O>}T6$YBSDFirf;8UO$PN0J2{o6#Kx%}m#e z)8JC2(MX!iP&L{9|Np-`44TcZ7waK3DI;lOLDAHr^#A|=mu#SB?J<^SFtRuW3g?zf zB?=bjK%Qr8`Box&@RfkYDG-mTK`&U z{A4N-FPClj$yma{#a0r!%J6_27h8!hly(Kt-F&@eESe`6Z+aAqbe=Lip?OP{fsv81 zl)F>Bx1QzogU(Z$w>rdIE_Gfg5eF3u<%|vg7)p3L+?iSq^wu+%Fm50NR1p#c0J;%IWCTa-j5!;eo^8uIEnBPCtI9gU~7kqCP|gd^V}!$w0C}76Sry zakQK)QSad4>GELwcJP0R44BCTVhVzp%*_W_I(T@#9sFNRU)G#&vp!!$2I9S-s=2!rwusQTXpD*F`=m8evSTNv=S z%m?)gK#XZ1M)N185^fL=RAx9BUh3v(KER@R3exxXDvmHb)%XY;>V9Z4c5oRJG#M4R zj1-y-7fhyPM)M1n#+RVP04f0>y#i2~0OBz^XoDIp;P40SZzLl9M1#@`7h6d%l=cSE zB%~i%Ncw3$4o*V+9qx?H#~E!HN?4nZGj^zV{s5(+3E?lkZTR!Q@p#unPKL0~W1!8k z4Z-}28vlVR(|S+COO5|PhpzF@Kh*f@_y7O(mWRqs3~zT{=)4J11nQR7vo;@N?!4Ie z4pgW&|Ks3qZvZvCTedT-{_~&lhu!}NppJ{-0g!cR6FM&(e8B_WaLBx;UuE^5|91bM zgXHI4#NPqx$Mkl%|NsBL^YX5+(9qD%69<3Fe}AQUs+T3GlSQTVHh&8! z*Y&PUL2vX|~|!2cP@i?V@7QY{6Dq)tsZk!hD=Xg^huMVW$hI=DE~)|1~FQ-r=C- z#WJy87OsmgdP|NnSjm;B7QOBbV6?ng{;Ko$!Pgw6{h(-?V0ZvJ)^Hf&F8*y{%$>ij zMO64(KS7aM<4%@5d{e=zb-IoNr= z`4?l!`Q~5H3mrOtf+kHsX9#q&sI(p^-480(K)n)OPy*FvQ7Q2QX>0+7fAbF}{?_}T zk-*2GkPW~3qNNMvA7XH@%AZ0cxJp3)74D#{=CL4~i1dX@#$Ezwlr4=YQj&*FBsJp`Ay=K`GQGb)g8T zLFuBRV|d{B0R?+uj^>IS#!eR%8U8j|(0L6$Dq774N{+dxXfgEGsAwN^QPE~N?xG?A znhQDZqQV2BL2(31>aRJ$>7+A6g=Yuo;4}V3%{3}KjGZAWBAtgieN+TWIr+C8Fu2s| zq9W1!hNbi8{}S+CZQv@7sq!KmE~x+x#9&6t7!?Wrc2K75o$3gRlV7Z5G9Zt1 z*Qn^E8ry;bs8qW7hz)F95Y%(j`hMf}{T-kN!Rs3@lrtD$``ceUU-jodYkN0%A3F;q zM7td_KSW`ZIYQe1+{^Ork+A_i2!^;__ZWmTYo2D5I^U@B-H zNao-Jrhxw?Dl#Da;>QP2a7lm$62R)g~>Mf=&n&o z0L35!0|O`~L8o#sv>rI_q9Ou{%ihT%eGClzE{8f@R1{kO^S7`uGB6xJZ~;_i)u`}* zcJ~`}yG3;8i7@`?bWss#eaqhhx^b-Am7`mryFjG%QVG|=bDXKhpp8~&F*34k2w`AgfP}kquZv1b^BbN{7Zs7P7yS^!8K8!DyQpY1A7BaSby3j) z5oorQ&I1iBX#VK-QL#xi1_w}SV)GFnNEAaN1Uw$w8vshaJjWOqUY|YgqLKm%wB8yO zotG~WG1uFC;MM>Cmd8p&z}{TS!obj-C(?XG;N^3WqSXrptrep-JkziNddjh9iVLd;@+J<|I;QQLs0wd#q1TJJZs(wihj^Z;~K38jvoY_ zv(P(9rVkuZss9Z@=|Sgzi3%9MZ~-mRJEC(Kq#v9fk}E(-=yL}rL*ttqMh1q|Zg8UR z+@li1$iQIuzq>^RbUe{<7ZneX|Bkz;_<)i^_Zk&Y^8=hVK=;QpbWc$M^`LsYRlqhM z>~v8HfFuoQvJh!Kz~2HM*L2|Mw&*Sp0S)}Og8F=j6k!EQF`S_8aEOXP^Ba!;TT~`6 zGBAX{umxT7k)z_%Thq?c-J$}Tnd>xBVSE9y<;8|NaM}SyuSY-@cv93PsMkd$r87ju z0_1&*|JS;GRB}4cHy<(3d=E}aC2_q0e_9We7&QN4E>r4lo&yPYqxFCOXMnBP(axNQcrj0sMvs0W_B$k5dW8`m}D{hFHtf0U!r0I#h?HTQOW7N2nxWLjOUww zu$CMJha-RMmVf{MgO4C_YJSfMX(xfsyN0EE8BmE2wqYe`it~s-w;O1Hh3DnhzyJUD zHiOeY=0AJG4LWqM#I%>=zv$Y@#L#?1p!1OCkLZIxm|8FKyBq`e zMM2pPTz-bV&|CWFf8()Zt(*+O&2K<`JAv*9k=ENKrp<3Sjyr%71jBLA=^G3T|BHG4 z7jwKwUBwl&{BaoXnFy;FSz-Q3cSvhFg(y5 z1B!}X7ZnjuDJ26+$>0ciaefg4L-P@Z)&r#u-OxTJC~Zo23WJ6`VP%#^^AQR7ylL|r zj-Y@S*Or1b3K$-EeGS?!H9YY8^o#mL^x<2ue?vQ;hQF|10&2BhZh^E~ZMt1KI$bY7 zUFrG+)Gz=Q3#|vh1zd0YgMJ2v&fftq=3M#qz4?ehcj<+0H&D)R1>bG-hNJU$mOvKc zi`;qO5a@Kh0xA_|f;uvBGTnYLt+)AGBSB4z_LVRH{y**tI_90B)Aa!VHb&41{h;}l z4%ZW%r#g=r-Uell3C)KXZS?u49N^z}fblT@Hl~&XrEfYvbeEpdJk=W_Cf9kb@eu>4 z8hrMlv-CvgGtFzApSnv=SY9a+YJ3AaGNZXig#m69(cJ3R1K9ebh}>ZcHn3|P}<-8hUb6jmCoNUDyM?us5|yT zZ#yWPb~=l^ZiXhC3CEc9TW^<0HXmYqDGch5HT#(SVR(58WEi+T+IgYd_slT|M*ZFZ zCeUOjs2|oHd#3p}3*;=W?$QI@e4Sj~v1ht{Z zG(Y$QYV$VD1T{iKk2F8{16t?MEyCC-0vhPB{803{JM_rwT5vk(_Px^02nsXMconGT zC}atE@f@5_1i%xlP=|NBp6Ptld_eBt3zmZqSg@x9%_HEm(o0yIeOUg0Y8C$G2Oo|x z=y$rFc&P@uI^uQ-M>i-b z7`lZG-*$7go-E<(cH(G0z}V@;!9U?Z=h5z9j&7#b1E|8BM_~q)mN%~lX=m(w(Q<&l z6*SG;e1r#*K)~_V+YW87)Pc+FufPBQ?{)*XSCA&3!RP6MUGo9z9R8MUP#$^1)7uU* zKHx=+BRKKA41xCZ48L`LXa~zR|6r_Z+yU;G%m=C62^xq68d)Y5oUi|$Jif~Z)zL-A$&wp0)22KW0$sPk4DeMhq0cEHipllZu7XD)K zFHj>`0Bk`gGw9M1khC*TKzP`Tc8HwerA}v#)&nKn(VZ7SXIg>g(?LlHTxu^~04_4Y z`d{Az)de67DIY=W8I7*|?osIgwPQeMYPEn{MxcHZwA_SL(1r(a zw5>pucy|l9<#XIc1=PS`=r({9qb(_*d1O#^&(U2W(#_C%poHt-dCpX0TM5uKsEdkB zw+84Ouhs*dIVuMHExDkQ)kQ_3^IWHkicK#|2eeh718RIhTL%K*R)LF(NbAW`#g`hO zg|TG}pvJG|*V2fFy8jF%LER-P4w~l<{$na}Z+^oO7W(3E-0%OLHY&X(tc))VOW`dC zl`IBOKg(z5QNKds+Nl|hBZW{~ScR06t%K+80aKzK5crc?7<#@>KG&A*uWr-9CL zopO-#RLi9j*XAGW<;lB1M-uWcK2#iu-dY1S#GtLU7m!pBZO_BaYPnRpySLe61GpK^ zu;I`D4A7tpyg3+h@eertLE3A3k=tvNLFuyj4NvHc{jb1juGfW?vA0Ae#_%nu?L|ae z4Kr3kR4hPkwX_MHCE#{i_>05E$f5neM8yKsVnYgWP($|=sGaud;4db|tDvUZA#l+0 zw}RFHbyxlY_1r)Ueo(v#Zf(hcy#1o!0;shGEeDjq<-ptTU>||nZjgli5`1?3+n2LJ zB|fATm-_er{}(2apjI4m@PP*T0(zVIz($LLjYgIRU5x;5%Y8eK++G9KL?tRBS&X0* z{l9?azrl-C&<@)pGKazW4@JJ4VP;Uk3s+?M7v;16{AU%f0dgY8H&Q#9c7PHXsMra8 z@lx{d|Hh+U)tn6Bo!7%UkAYf?&AR2RNK-rW$$$k2J=;4AinFIY7XcHZdq5#;~=vh!fK z8%yV9(2#^9Xo#x?wDJv9t%6Qp>~<6BtW%h&d9d3}K=SfT#)E>FJN+a&<7AqTs6aAP z8AG=li{VMb+s!{1OZW3{cjMUww&!T`3&!uSKpN7T|5}%A`+giWtx&oy^SEYA{~^|Z z9dfLlhYp@%YW$@U)6c};2D)#l@gPWR^JRwD?Y(6TaI?NY0vYqN08~ems4+lH;%@<+ ztA5-?1vFg9V0eIkdl(1fg-#I_{_QQU^UnYM-+5>U$h6K76`Ajk7*7b^>U2@z0QF3| zMO1pdICrgHwQ5!8iSLgNzGCiW3EBk;w}TIuG!LdV*KsiSI)Vnh1Ui2--(cuG{QXtu zjf21CJ1>HUuChZ^1f&lBWbO1(kT7o;h>o`=ee*=7X=8TTk|e z2r}|}oH+QCsh5Qdbl&2@U+kS1cTHCDoTPb^@gOLDYu;cypn0(KMCa-6uMYl}?`7dS z_=8FFMz6?GQ2V;`vgTpUo4tYTohSG`4)Jdf%`9Qae;rk8y9H&vJG^3ZFh_c zOD|7!FHd)`3|JpCkBa7D{_Q=!3(o)jukE8E(;Fl8^EF%A1j}0`HJulFgV-%k)qLIw z3LDUf*Y}s8D}%rR%n!=gWelA^z=84oRp*a`KjaVoV%0p9eJG{#m*%0)5EYhEhs^7s z7z8Kk#zUZZJa~$w@fX+i#SHxJE-Ebi(+=@(y984DG6Q5Fq_hQ%D_?ls3Cee%I0H3n zz$UzO0jb#r^6T0_t=nX!i_G#`LNB5gwIX3)~ELZM?_BZ*r1v54uW`xU>z3aTCd8qjpQ+XJuHF>z;>f0|Rr3io{M(cIY(kc2SXm zcjQ2ab2lH+=|n7C?e)0Y_z>*T7IDzr`vH(I4KINkBw%lW{FBxhq9O(x&INf3hv(ie zNA_I5GHA*J>>gH-b32=7^f53%TIJ9vDr0DVVbJ`8lfOL_R1UkSNEn_pd<$|yTBnbS zNLpu(iWt}_L|9&gYB^}4?Ks$SP&P0;`SLS(9Wf}XLCYClKYnpBfPrBGXp*AydRXv_ z#mS%)Vq5}AA*Bq+NyP9#gPjillmm>%__v8Q{PN;&SqfU6xbG0m^`Lcyy)6HGc|pk$ zG*fZBr8x!EA_1-Gc*By#)$5|75D@m_o%&x;-qvV7B4GK6zXf!@wJj(K@VA3n=iMbL z9KAgMdwIH>Yxr0gOTm42&^kzjL|Uf{9}oXFu9lPhQx7!!)bBjTKlOm(hlZaz9WE+7 z{8JAofvDDRpwp9o>hrglGBPkQ$Ea}hviv{p(k!4L!@vMxDu5aUJHSaKlmXO)hE762 zZU<~Wq64mo(6 zrQrAUgTCc`<_K`yPTuC4cI6_^9ykPdQ+C5|$A8w;cc_ zQL)|P@l(T3 zT~N*z;-7i|6knMiK{*B_BGT)^@IU*c4dX}t?IkK=j2}T0fIR;@UAhHc8Y0{a4RB@# zCI-U;ouAS=n{z;!?INhY1C{Hb0X_chjvOFI@-)9-Ol$tZ&EI|wwETX%BNvh=3xE3# zP)=#C^@fuXY*ln{DdR0Lim{QUpFl62FF*z((E$8(Fdzv__}Ff}vCaVid%D!*89FK?ZhS zgcMz`m!?es_us)`WP5qI5&YS_2bPT9;gU=X$Q(bPaS>-XGff;cwXmn)(Ar9?12e-rsR>go1c4QXBvM@6=Iw@pdN2mpq_}y3kIrS6}P` zO>Iqvg~_GT(uP_F2L9H^pcy-G8iA&s4KEzIX-_b5SvAJy4R>-3ior;iFtcQ+_JEsukmz@0CoK~3_x zE-KuX=OwT5&pBZ2qrxK{qQcU795ipuU1O*SI^@0A2Hbb(o&pJ1HwDHY-7Vmp+Zm?O z>88?rLLHBuq&HMm0v}7eXGl0|tym+7kN}K|( zr-H^QLF10iAo1oOjCBVfm0AR8E4 z|Cd;HyQp}y9w-Uyc30_iQSkun@bS?GwQND_CqVc`^D^)>SL=Zi9#FTFk-hWBYZg%b z+wB8taDu11A$RD)8WW)4n9$og9h7a{LCdQcI^8vnyQ_e5&+EC+FbfCI8H#|dP=Hxc zDrxv1v~~cb5>^4fbO3FLn()6w#RJsEf#`S#$sF+IXdw51L+=AL`1o6PLq~#JL4FN* z@ka|B$1g$q)j$pek1vDeK%L<}(83r6Ti%1pVtxJ=cF_3>Z#a6JPk>rS;V-7o0ecEma)YkcFg(!w zh9}^~$LfFoBmQshn8m>G;%PNl#qnkk4`fR>!~yW0!ZmgVhQ=cxheNU`q}EKE04bVU zzm-UXI+`vjJ^|rb%rD$P2VR30)U`A>FE-qFXvVEM806TkCC{u7<6uYlard8vKVxt%Nv$n7KbcGW*-#^#*e)vYZ(|nc9*DV z^s+eivU~^#f3cx~3ADIJ1vCW+jyV2S=YRh}ITgHe>!k#!{|5=0?kOsu1%$@n;4%h> z2Zv-ktTU+B3*nIQ}2i{>{xj4zpcR0Ke`mYiY^QIY92ITZH7stD}-PHG>apPqqjuGC+x+GW+sOJn?Vtq#gfGn_Tok} zCiLQhyFHsSI3SR&TPXY@IfIZaN ze54O_6-XRtT~_l3Xiv7gM+H<(fR>)9Lgr8$S}*ap`2YF;Km7k@kTsy?V$c$1aU;l4 z0@lqSasE~q(EKa6a1}QpxO)U0Z{D~3vMQXRQBpHzUBk% zt2@AGd6d89CFpL^Z332`ir&4v{`>#`3Ed?sCE(J+xE^eu<}v<`eW1xka7yn6r}W;C zw+y{J4!t5?%pocQme=^3=KTKuU-McwICC`q3JnbvchzbOZ#{v3Zx3P_FLe`_BV8UChlh!UCa7a2c-#%=jqL4)Ei9YAUz#bs|9!~ZSd zFarnl3;iZ0&{7f5&|W7Sc!4me{*r)53N?W}&z)Eh?a0J>Urhv?f2-85 z|NjlYLEYWF8 zOK{HOZwK8=X85hSMn!|6RO2PcK+rn9a8QtSgF~wI0RL2%k8I7y7_CcGH27OUi|Zjl zRsEb`p$#Ux85BW})Q!LFd z8JmCpFMatEbPF{&U3)_ec?r6q94uf36)1*u&EW-4uSgKAf`OGj2OlxLZ20~Ef2Y8~ zU-F#+EZ}v%FK*g0FtmQ-Z;1!(u0I4SWx?KoBM{LBvVvrLH()W7$^E?e*q;a{sC|NldR>GkQ(5EY%!(69i|PVyJCA(7A>q5^6K zD|CbN=}R$CUIJ%U(9k!`0sp}cXx0AnXOTAF`w z@wb2)S;xV72$YPQ-|!fI3xCnp3wGISjc#xe*!+fvf1Aq(R%UQ97x2RTJ!q%`v>v!c z1~ip_jL{NY6qR2%e(b<*Ar6QmkAqgVGaPpVRpAV+Z%f>|n?WU1^IJy#Z6Z*Uds!~< zZ>wNww%Nx}dIxNc1KgI2@4&Wnvh3Rds=hRTG~2W>lx%CZW8iNA)#c4~EDZcDpv8~f z;GESBE;>Pt1<=9`&_1qiw$A1~;0pXe9|ObjLoRm09EK+?!D9SV4}QPV$#wjYgPkx( zC)3L-pa^hLkqGZC_z%v3pg?@VTLUf;ERXTGUI(Qga6omJs7M@hG5F5_s(nC9Z$L*V zv>pT{k4>Or2()zY$RBVBzMKIXU1+x12%gqn2%6Rg?OqJ%ZC(X#kJWDa^S^mFr~qK( zZv`D01gfMrgERl7w-E2My#y`v=?2#W%`X^_xu^&*82&#F_5>)(3@;hJ?JQ9dG5mJC z8RSin7^v6z+6Asc_02gdVC6i`2N+9&nrl>47)rLbUMj5wZ_xye>uuu!T?QrrHLm2`OVHT_-E5t1 zEH8^NybD@O5YXGa6YSl-jeq_()TjtBl(2Pf200eA9HxY=b2liKy1~u|wIPB)lcit} zzI6ZhpOB81%AgsJOZ=@)p!SpHUQlA$1tMOmgIdARss%#9`Wr9q)PQD?OJcz@$PwK& zDh1sxDmk4sDjJ=iJ6%*%5G%Aj3{M8UNImr*yzU}{u`@?Syb~0A2G5T0O4a1`12V z+nqTopq1AO2Y<+S?*o;aop(Wg0r^b34HU$kE-D(}l2b*eyA6~XdwD=Z(gLrwp~dTj zhAK9OQX6I;6%FAS6`fB0&UhC7ZCNbM2N;`=bAUF%m)P=e69COw_KIBQ-{!^A!O>8~ z&QN-*o4-4rrS)y;K4u>k1>qPK6^NEj{~w+4e?UfnG?yOk&HaQ9{gGO9HB{O7vB1gpoHa-EG3;hFX4;}^C-VJWNLFX8cyF$vu zll(1TK2UQ0m7Ld9DT7vU$LloQ+FF|z~D0y{H1|?X~!b+FD43^*~Z@IwhXi)nURA+!v zcbPB$HWtHPmP6orpk^-vL+RsYkOc_yPP_o+4}tD(kdd7(dm$5;nm@WjS{Yg|LF_15 z2U%AQoaHvxCiq;D5|t4CZSE}1Z#X*L6uL`V8N&Ftxx?!yTPtXXiNEy>$VwNL zkj?^)ZuagPm5@$%m2ODO3*2t*1T9H(QSs@HQIR+fN?@Rk7y%GguM?;#-5WCb%WDIO zKYDo_y0ch1uQ$Kq>6HO3;sYx7JHHq)Tp)8;rr7wKdOm(8QIr&vlj>K~TVh1VOp}B`c_td<+zmpfUzp+Jn}E zfL7ukW9+C zb9CN+tumoI>PxRTqa_!AYbEF=TsFq$SD@)K{+29|zN#PHS%12{-gHNO0Ik}-%mA81 zGzOha5~IRnoTI|S`L|^6OM8$~7m$Sztsyg+5v8$G4Z#8Rys7l;R$?U z_T>NnZg5O?x-x*KE?f`&|KIDv#@NZC@HkBCLqp9c7KUD)PbKg9w>h#lzu|#3#n(KB zC3bKcVd-{dc*zH{1)f=6u7(7!$jfh_PAj+&eyQ;bvpqXrN-vd-^f%cjm z3wUw#03<)PmO$ox!e4BLiX7?&i}kt)NOc}m1uY0{e)yrYw*a(v?jdO5S2vh#c?4r; z!jaN{-*yKA37*Bg`?^ujh4fYZ@&u&7kON{>NOJ-3%HAoU!rG|15@p7l%NXC>;^#JPPW+xBg^cVAu<~ zZTPhms9KrO_z!gYNu5FCzo`ri45bEpGX1d@8MKK}{1_zmkG@{p{DxyM0|OIi_kav&pu7fj z)f8x?y>t?&|I&Hz;7cak|Nq$;_}yQ=1nn<@7KPwdGcQ4l=^^zm$ZOy&k=!pVAx3oP zsDL)qw17hf3eRia-ZGF^c~YA#SW4@f->_uK zhljpMf`nJ|kN+i)K>aoF3g)?j44{f0G~(5IlD`jhl*cg_9vKFZCazwPgTh}#vi$wu zd9>R_1>DH{!Qb)#v?>8I+q~-E|Nk~z{Hf#Ib+n8m`t@X{1y zO!L-_fBwIa1ywUg!9B9Q|LYkTUP^-H4uIqsA#&^>eV_#U^6%gO|Mw+zJu}%_D$|x)+wp zVA1&?6}jqQ_GA!yBZS=!QT_ivxGnMmGz!&u^kpGP#eIkhQ0221v?AzbG+3PC z2fq-r17+rAexS^(0ME>z(_36rcmlH6UX(&&y!Ak-9C#akhzd`tu_!1cL0uojcC`sR zKOq^{OW>}~F+9*cMFn&?ME4w(7El{+iwbCrv-uZeiDR#i3eOJE zI0>{`fvn`V2kj*c40@3dx<}^-Xgy6%s%$lrULSnnf#ghZ{D4CQblMWAsfVnmoFf{#?lk&k zQ5eW`5cMDz5>oGkq#itx=A#1c_v12O2(BJ{iUH_)dzEj897=6FFBpDPWnge*umuq% zy0A&~QsZtP6@?w3&33!zfHsmtwjn{HG`;zVKy+OEVbBEH>$A{88q{75QBeV_e(@-S z2~<=nbcd*@bRGvAgW@#srVj8pt3@WLDG2KC^FU2SnD-(&l!4*(q!%F|>MW#w1f@q2 z(3Y`o9~BkQ059CdiaS8-=b_eg9)>v8r}>CT=M7LID^UYYKY>pcdEpFk9%!zMr}G## zeRANsYjy_Mah*57t2+*Z$(P4M7#Ln03}ImCJpB45Bqc&fczVR;KG47dQSMuu4h}w; z`>^PPxbJs57Wb)v+^2}keUSKvXJ{V71E4tS22J=q0|#r3ip~zu#yY4&A;G9Rv-LnJ zdp8Rx#92VS7}$PVVOXSr))T#09n8S+`pOFzHBf3s#1~6s&BNHsYDyb$K4S}+5{3&mh?{9J^@41@&759m+} z0gw;6V^lbHfX<(Wx+K~bQhGlRf|lM8_lLe{eg5Zvl00N4ocb&1?Nua=8<9;0MU1+d*Z{PpDhLk;31;hLr&{%-v@K8Y`Fr z)&uHO9zPChqH}&~u+-;o@c^m$#y`bH#SSzoc@T7)2*h|s{+8XW3=G{pV2z-e$`~fl zQ3vdxMKYj{D5&An-2#>c&31tL-OX=Um`hYlI$!s?s1zJ?`wyDtk_hN+UAy(qe^84q z3)JZYwdnXezJrEb=0K+TLsW8lTTgBH^B=T9+()IPGe$+B^K~bvaPU#l0M%C@&AJH9 zyFi*-z?ysgK>d}1P9GH?(9|^e%mNqiX}&6*F)AU3r#eAr2>7U&7~bGK#6R_rC1^f# z>H&^J9U&_A{4Fi43=F-kYqtIYPvwJ(GQ)43pd)_Xuynr8U|`??ZR>XcuOs@)!2t3P zXhC!90sf93prC?`27_D|51LGYcwU+02#bRGlse=AuS7(m0M_Qs$viBZw$a8Uu3h7QIq zDxl>`I-vf-8=lnT?4V((uoo|8fHi}(f|^0!9Jqd$-fyVj*5hx91tkL?6%B456&?O5 zhm=B81R#?!pjAwk9Q-YN7#J8jLR17^L&xJF35CBUgc%&~%|BH5TRcE5{U1vFE%!kK zQQ!Dm!kNLRo`Ck;f>w=y7GuD>1q(qQc2VJJJOauUki|76Y7CI}DzvG3+(iYf_w}I( zsmIwtjn~&3phbLYH#;cUa+w(zz!MMrExSNtSZ{bbUx&SrhlDF=Dum(XFVHI93C#z% z!I=lN7c>LZ!2|^-Xf2pQ7V``Kd7yv+jVW}T0nG-vsMM%3d;n!T2hfsB&^q957Zq@g zWbC4nV;rJV09u)`0HRjL7?Rq!TOdnOT00<zwwc8wKhsq03q=Cl40zeadA38s$cAJAD$Pv_AH2~+oPMB!PNpR%y zOaVvk>)p`&46d8MPX-HuGB#)n0;twt2Cd+A0jF7mUKfe~mM$tjCE?)ZaG+9H^H>d9j)8>o4ba3}XN(F@YA5^4B2ZoNh6A!q%_I!&$=7E=#vXI{ zuMZj+c2V(pJ>$hzSq28McV1@x{r|u7Gc?%tfx_-(7$`M^yGM}vzPUz)g&CSDc_4=Y z@Nefj?f`0oF&uXQ^#~a{Il8@AjyuGFO5{$Dh)xe4{_S2IogM=G+r79tJw*7od+~I7 zNbqm>;_LK~;ot5haNI!!qFABZOXRqN285&2?Im&C!2rTB>GqO2?f_md+38`??WNG^ z;n3}+(&^#S?WNJ_;nD4-)9K;U?Pbs%WYXyo&>0Y7cmUde*zxNB|Nk%byx>Dg(D(rL zC&Ge3M~Z=b1gcd;_*+4T<917R7qN7E#dJy--cIX`;OLHu=qzCAjNk!{rGXYmb$bbP zM=5j{sdRb>bbE<(dWdv;NpyNhbbHBkMksW8$QYhX>-5k7xv4; zjyr%(tzrOelsnv8#t^+@>;M1%<6ioBGBAJ!tfIjlj(ch232A3Sns<=+3kJ6uL5(}) zwo*9@=)kY&ms}`1K;aYI{6+%WoO4kDwT7YHisql3CHkNS@s7LbJw^|3PtI5t+=q1n zcbOsMQXu8MAu23jEjvNOC@5|KEk|Qv0=2A4_kO?edgp`})gBBCuQ$FBk%ssSb{wwb>GxL{YG$a3)~Guv0bS72)L~bn%^l=k$8P2 zZNiJ+?w~PIkT56+!R=#E{|a=7kHiXxQv1$BhTj?=fqI6Gzd&S(Zo`=d&=d=(=IT5I zwh6@&S*RtDA_}y32DyLuq8rn`U~umX+#nAD_hC6u4CH|y)&oihFTLE6V;mG-!Qe9z ziPg`AML#%0_^5!+AwjhpsegV6yeJxEA1HiOQoF&C51Pa=yxk3IjS4jX`d<>?dC~AT zXn$k32g@$dSj`R)(HWy6(ERg%2}|b*!%N`Cr%1Ptiop)hXlW{!W6(e$wB!5e4g%ZkeRP%g7U!&Yc~dl*Oy;hk${8>$bF&VFBV3F&Q~$Dft{~X zqM~s8=n)5Dj_z27*4rhP-R&0qppHYSe(Sdq`8vwy$3wzN4 zSG@t*D0q4ce(_BUG=9})4H_TgIDSB4j}YXj0M_OspcrVj*alvo!?W$r|16n+-exxt z|HXs8Kj0~+;1}D#`rW|#v5c>=zYzTg9)WH>umjX)hX^rJ(H)-6bkE-8Cu>pwl5i39IvR<73b;6=>lC=wwoGpUg$Y z1$K!Q=jl>I{xugsi5Kjt&ZD3nAf{sk;rpXO_X2_H3#h=$@6IqMf&JTg3uFLj&-{*P zM8Vg28QMEO=?w23L(5yxVQ%2;2kNEPBDBEz)6)?;K>kJTe}krup@9ZdpN>!;-g!Q( z^ICA{;qMMC|Nj5~U&;DT55|4N;~VvJxh4p8giK&b*) zh$;C0HRvEk^Bb1HEau?0jV{%s*D>=q#^Y$bu+A}Y;i89TFBI`207voJP4Wo%Ah0l8CwfxiPZ`rIv|(pkjO z8NkvV&eHsdk@IqAJPYUh&I*ohK@j&sCnIc!8MK}TwMAuAnjbK7-soiPe9`>iU#Byu z(o+DL-+G`zu3JW>+nJ^FVDkgU=7;|}{W&;~cUH5!-T~F`%+Y*;vD2NUvzp`e5?Fwi zF?0t(tOvO#iiPu4X8=cMIY(y&%gbW${vJ^JfAKx^&wtkGW}M*NjLqO9k9j~j9n{w5 z11%r`RVNaiH<};(<8J}4`AcB=2ii$~+y%Tj0dzVrsHOB;X+pO%M{hMp^MijS72PZ< zoiDp{R7^TeR61)^OuFSkB}Vh(fBY?=VFJ*ux8^q-|Be5H&Myp6@#s7T&LjLS6G5{C zZ&*5Cfv4v|Z4Z!ZT)>q)!;4#>F4+-*)^C-QyPa8jt65%81n(a+eA{WF(p{rs()@-e z3sm^Xys&oyC%?`^orhZwl(=`ZgM#-$Cp)NQJMIKpYtPWhbleHtfVQqtF)5J(bzRvz zUxH`9D=sQ3&|+Al^+1Vj zw?y;ff29(yO+e~E$6Xx;^~^kObxSut{#POg_Iu~uu>aS=-Y&fhs*9kLnPm*1Ga24S zcfJ5$fCa71K>Z|;eJ|WY{`_ZsZUQ<2_$fHE_;kAN03F^M%G2q3qT5xV)Ab0n0STHP z?|gt`w)zcdzfE%wWK&A7iwfxcv`*JEt(Qu2yQM&mOgrv+1=KODGFX;gDe>xdJ<}}(IuKff zqxtc_*8i0|Kv5SADmYpXlx{uldH|Gsx{;2=vjYtSx*mW}UPFQ)Z9=o_6_IY&E4?hO z(xB1D!;l&J#~(UlFLXZEJluJsJN5z&-#!Lajhc5_Z3X91!N1m%{4I8%QMd#AEv2B1C81lIk8^Zhe60eC|8CbaApi3SfD++9Xyw7*0-D_J z{MlQ<(klWBthw{QHdETHir-y_Wr895Jj za)AyztleYzvxKEvyi>5-ch5IR7DoP7&_U9jhd@*QqRf!)!-UpLCEVRkEGroKTLnR4 zpqk9Smj`s7B15O|iEiIB-7Jlrt{1u)I*)g{LW31l_#L*qz~ABrDtrQ1Ixm7sJl`wb z9vt5eF_yS=hh6~%W&lg)spg0Onooh&r+0^50F|z;M?iV}MkiCRGe>vmiSF1lovs%; zU4&UWPj`EAbO*D54y6AFI?wWCNp-g)%L>MllFraG-Q_GGL!U8%mJ>UGM#&E~KLDBB z`mMY40>A5_PDjvojphf8+>RWb?kwGoES-nIHZ?!`*BQ(Kl4k3yd=tRwuz;6yLj3wUPGj zjo&5oN_Xjn&R`ahF`yR3gMXk3rrVtbV!S&`H(O^l%(@$$Y_BIn>H$z-1hX{1W8`mn z2ws}@vI;Z;1Ia$UWenZ%9Npe5ouCB!?I2@`OQ$mnD4ic;1XVMj`UT{x=12cHe{_a( zfFxl7%Ge81d8Rw|1UNt?S-QPgIxm9_YCTX=&>g@6ikgg0-!t9*EZxN%%?}wneXoEf z9h^atSbC-NA}C>i&g*PG$p{KH4;GLY!$FbK&DZ>hksEZNB1?AwOJ@W}^COUM&R?D2 zIDW*)c>xllFIR$m1L`jZbF^M6N$d@2+kN>rs6nolxzp6d3! z(s~jUeaAUA;D`^j`UTqi z2Qr}Bou%{F>z$oW952&B>+oDJbh_?&=>l365XjBI0B%1+XYfI#HcRWJQWj9Z&G6() z!>|AUqsW7r%&iAXKx#N(_jtbS{tDlV2eJ=T{~(#i@$xlDz6`RsAZ@~g(D1O%bHOjR z%7Qvju6m#jltQ;As9FY{Is@)1h7jlnucg{9<%b%=^d>7`B)70@!P5*2~a?i>|? z&==~H|Nrl1@61sVX+FXOI(e7zg*IC!d#7GEyXK)F$iSX3=(JhL+zF@_WM*%E!_vv# ztq1DmXubeD%K+jm(6C_!Xy_EQP2WYu1T^H@Eux}%qL;;?^+0b1GruS3Y#@_^f0-E1 zf_=sE+6!7;fc8sv>VwX`4+Ren&xP!S0nM{i*mR3GzhMc;;sTA03%oeQ`x|t2jR5Fe zDkd&w^G@^5Ppt<^l`KP4OiFfu*2;G4y?hKxNT75AI;RTOK7h&{0m(J50d+-tn-f4? z)AE4c=4~MU3)cq7aflPbA!pLP5Rm~z&=MU^h8LV4|Nn3P!B{5M{GYK*6zcGc?=QXp z@mZUHFqVJfU;iDXf;(-(#TOUffewxP-U&J|3v#|6XpLT2@QZ`eAR_~HKye;|)cojm zy%Uhd+Ua`WMSV3BL$~XlPS*{c$Ge-q^npft1T23*#`v4x@MJJ3FfhF6d;{JJ)BJ<6 z^SR^!Rfb3Z|FeQ5dIJPHFE%~|bv-rDcmA|IgRuhdOzFEu@YTASS3u?XFVN(}@0;9teApbpH?dfRE$du6Hay z@V9`9!3GQ6&R_hH`%!(5X#VW2;bQC#z0p~F#PU#?PPgxt&SRMblNn8GJ$zS99nQhSx112Y|K_7cgdVfrC)~9wZ14L4vUL1ZdO*;_)SrqdQ;nfHEf7 z4V|t>KvSe!LFFxIZ)CHN$RCE6e?Ywj(CWK0+y49q2TQ;U4~XkKUAKT1(-ro*UV(-~ zr|X(t*BhXqXubuSc5z+tS^*jr-L)%rf-XRT9vK2UR{94c$l1+rIJ$k;bcgQvU%IE; zb<6+K1229+re#5yy!1G@4Y1|KmzUt+e|ZwLf!p;6Xin-S=xomyt3i{&kh%use^B`v z8gBSMEcivC1Smf-YJ&2U1vEdosAw1-=xu%ij?xQN;8Cy6W4$>l5}=A@I;hzVF$)|` z@9V${S`U;&G*k$&l)g%9tPoBvD1FpWAzBLBKgZG=AeO}y3MznPUTnMr4sB4F90YCu z0u4x69xB<|V8PgYodIm%JeYx{>!INS7M>1qNH^jrv{DJsF=#(P15A+ndtY1ztx`Vz z`ZoCd8K~x7(EYq}znkA=z`Yk?c%ausMIzt@D7%2>7hP0*pmV#WpeZ{CkR{DWVqO~m z{{R0)9t*bl1+3R^h~CV=Zx&?(0?Dk3j7h=C%|L7kJK^?!+0w|VQg5|!pR99jBd zFQ&4CYrNh7&{^27pE@_60p%k0&gKiyW0YV-hCpGHpXMYsR? zAMj#(IJm|FWx+L|M)$F9hR#C`=NdXehx+M&y0)NcUJ$)PfWH-d53h?#3i$379_ZoD zBG9WJK!-e=fY#vjx`2-qmU(RfDi$VKg3g_5dj~o~_C0?S=mN>^9F-KtznVuob5v5g zeN<9fPx7~b&a?lS60( z9xPAnc2P;uJOREhBn5ni`*9Z)P@ZFerZCWWf7lE0z`y@NdowIv)SCSRIiv(MgmS6G z3p}|2I)?$Vq0Hs412BpW~7uSS9i6c!JntoKlsQ{z{oc~`eclz_6)m<4f*}>9Xq9V{c!*)A( zz8+RCx#}9*rqXk~?fjA6Cf=);H$z0+Q+${wf zTKvga!c?Yg9l_CgQQCv2NTl0C#4+vKWG1T;*g2t&5WAya75Y zxcP`cZ-@%Vi+H$7NF@lZUtUN%g6`khuE@!d?V`e>)7!#y;0Jgi3dc(wQ1XPT2DRV7 z;r-kJbpMkgY&_Hk)NMI_0DLZx1}JZ~zU6Q2gRV2`Z2*}CT2=#!F3^2L0ibd~8Pxc3 zQ3>c~09^@pfWJiuB*3ErI$fN9n`QF>7SLd5=MNiO{+2t;4B#`!t}rt&7#@JM<3QJr zZ4+VaJl1lFzXf!WM8hxJ(pMl3Xq*T%7VM(}DrtAQgX(-1Hv$3rin^YI(!A;9F@xGx0pVJ03uf5uDIq&rs^z9naAj zqr%d9yTpQjn=xoS_fyNIQn}Yr(A?Bp#?W%IL zd|apbuT<$;&@3}(nG`4pKz*vapw=AhMlMJcq)lkBuq{0eO5?4UN(8#y!TTy@KwIH{ zFqLiwoyeShREOC`Mdrn2P$wF)$|T@r8)zGYEq|*vs3_r4F?`$k>opHJKKQqVXfk#l z?R8~rxm5ZIwD}7(kNG0?F?bad=sYBFdzcS2yv3seTEW!o`X96vHvqKuv5bL#n+Riv z2y^obM$o>=kIW@1D*W5nI!jb^I=^%2o zqQe}bA_7u;jKv6a6tB#S2cY8@t3h^^fvg2-df5Y6D;Llm1IlY4^OQg}aE=NGNV@Y= z=ew3mrJza_;=BnK7fVI?w}mk_9|K+X*K(;uj(;0R%gNH`ph337EUgDh4EVQ&GJv%` z?JZ*frN<|oH=wCGZ9;bd3n=df{As;Z`nj9A^+4$b&`!s0kcI9noh2$9;H@7Z%R#~Q zQXkYu{AKvL?)}Zn=Tn18LcDty64oH*$rN8VG zI=wwyp#0HY$h9we^3AV|S%Qccx6IU1uIk_5q#VNgx#sHB1T&C33B|OQd>T zn7}*EAu}%jA3%d2wB8~vJ{DA;bbCs4^1VJh;cNrE`T+MY!S3lg0IDyKOGDh#{HCP4 z1-$bDG`4g6z#dSA2Rckq0CWQje@irIf#F669tMWvhu?S#a~QtueANk>^WMnN&%n@a z-5H~j(^;ZoaQqmk2I#C&ap>O30=hn_L?xoz?D$~`FJTVQ{8nd)ic9xS(3(L0?HhS` z7#KQZR6;syRD8Ov(>hC3ERG)o^&2{CR6LF!J^*rqU1y0(O!r0(kXbP*8K7;e-8*?e zyb=|S&Keb+Zt3og555GzI{pazBP!j0ukyULJdTyf(R85Aq-N@(Gj8|1j=%qB`PU~-#TMdBn)pO z!n^qebMp_ma)s_ajSRd0{AWCG2f3fN+ld9_D$s%ZKA?mOy4~gw=w708kot>%TaJnl z==M&~i5>i{rjYft!VD!`pp~7Vg1l3p0en^nNFV{!uK^3FLR6%H)--?x)F1*G;F(#F z7IlUa5%B7V5EY%yMsVOw1O-|{jfxdS%Ah+$#iX+l6nmW$K{3@(qhifa!UH<)+aj&A z5fnEKH7WrRlWjU1L2=(uqY?-a$mtGIaRA#L1ThbETAfQLsD=yyt%m?h1w+*ObT)z_ zy!khOskq^RZXcBh&hPwF4|FniyQqXfnp5BnJD@}hPM_UQEX{{Fj=87=f`ZNgoB~^? zgUSQY!7ynP;PL?=c^im4=(f<8psjjo6S}Kdx}7)--!>oO=mbrz)~Fa9b5XGZbt79r zt0Z4GgGK?%7~tjvF@k2?K`YHYKn>JR7Zn$Xp-Lc2L8l&pqHhBKc9_Gg89}ENTR;?n zw%ol0t+a%u2!#8DLGBZQsJj05|Noa<;PsfO?$ZGskaEmLMIG$E4IpKYK_lHr?o$Jq zqX01nw6*;u=)@$bZM|g-#zi3iHXq_>J`I{ZZOs9hF&|_Gq(DcK2elPieL(W{2ziKm z!1|dCA!}n>H9%@WTlGNmA>i-?%QM2{IY9EDt$HANCl=7g{?-Hhu0M8w1F%Mg2UM#G z@w@&2MZ%8`7Zo9h^Dlr3QD%_cNd8j=`A-I-U_D5|BhZ>$h~pvVL(+o^NSy>kT{}qK zF7SF=&}!4pMo=N}at~-e093w#`=`Ndpf1Q`F;EvI=EYWFX3z*tXLA7`=%!C_DFK>} zX6S4d0gHf33l|lQZickZW*I)vX|?kEKz-Nj!{AXL!%M9PN;nKJfsQ7cdg%CpFP_32 z$B%=G!%l&2cF#Q<8#+Y3HF8g!^|7DE=7wIw zt6=%FM5SAx`4>~^-R=Mm&|v@v6gtB=x&yu(e8rsBIV}z}Gw`$YPUpHUj0_CgdY!Kr z*MZ`Paorx!k?dg{oqC;N9Q-Ywpu(N0*H5AKK#41;E%aIwoZk2S|NlQ<^H}pge*Sg~ z4h9C$%G(0XW1S)!VI>*p?qH?z>zyKvFp<)CpjHj2acBi<%!e6(PB1J{>}Kk0b^x_T zomd!ObT+$y5&&4B)6D?nB!=!Voz_bwlHFFlJ%>RGK^Hezc2}`5zVEDL>Gad-4l}_g zZ_*uRfluC|JIn^3yiIpl3O@Oi?ywqs@-^MlUVv8JTq=>l;e|eseD|~fM$kDSB?@p= z%vmg*nJk@_oqZsw<{upVEfY8y7`ojGS`U;6b~~^%{}3$UZ2rN{-x>oJw`o04!rSfU z(p4;!0_!5QwejYTf(

    aO#%7)e+m0>H}Jx0@L*@x5hjN2wi}=U|1i*nYYly%TTWSyw}H;p z2bB=V9Uv=91iIZKS`U=ib%&XBSFkj{;bE>~34h_;@c(~r24km=%8Lc^;7MUn#+nMs z0dH7B!vkL2D*yk#I}EfszSE7RlL<6n$Po78$`K}pKJ=;)R=*k9n;U`wm z0#yE%S0Km0TsQ;j!bp%HtzEbq?7~-DQCzs074AX@s0%GXj)A#w3e<(5U38$4VVZ{F zd9VvTP+h2qaA6%ZmdlW1c>>ghnjpa%T(L}YnglhFA?Xr1mT!YyxNHj(=mrRII=sZ+ zvYr_fhEPJ?g5wC@4{|(rvr{{6Bth2}t;eKqshi)$*AMRGxu)C=C`2-9n|pt(SV6Yj*$n z-@CbW_n-g#uE#nVTQ8O9^zL2&7QC?sIv&Xr{=)n%14C3K=yKh=?|y+MEqf~%Ex#8% zK7IhyPXS+G47$OPA9MsXsJSk198@TP8XUdNmS6{|Lfqa7zRf@kR5rS(IDk$k0u7yk z<`hd*L_%N4e*-lW1Z@9-PMK|g59;`bs5n@@;%@=nKG6J+iN6K3myds&R_DuxpL!)6 zEhqU~K}R=se*Av3m**^K`@-c1oX5d^iWboHNAoep-YiD=>E>w@n(Y|612{^VI>nd+ zM69QQ>fa)^PB8t=0dx-Y-0%PYTTcTu68M`Ye*gc!6U=_u_WeJ2VGgLh)h*D?#_S}~ z2`*D#t_AIlg16TUFTJz}?bLz@q)q5GVd(sR@qhEbAN*~gowhrS7#J8de{_m8zTEu% z|NjY`$6NoGa2!9t0qP`z#(4y~K|v`78i{&gUj?2d={$7&zzT5s0u9J@@0Q?aVCV+* z&A{h}fLD`(cII&&e8|dp(DFoaW%p(gesHglhoO5l2dJl6q9S1U?X^PMgvMV%PfJot z`MWDXoeUnv&Kebg?h29S0}7TWiY2=R8h-_Xe{y+D9vg<5)%#Th^I~1_x~@X9mUPx4qC*w&-5RN z-zl>3<>qgo@pW*W1)BTfZ%zIQI$j!7=!25a@n%rr3Sof?F$fD(Sb$iD2VN$D+PmPh z$Pe%^Fa*3vJPb}fFuNiBOz5zzz)N0G7A|8jy!5gaIerWeyc9L5usqd zATod7f3W+T|8eoRfBO3W|2{`>JF)WvC`Lbn*1AAq{uuaVM#h&rVd;k5@Y2gOKjGsd z-5`D(!elW20~-I=kN^KW4>dj#`~Lqse@iXs?ncm5HOqlN|APWvG=2m%G(hbY&=$CO zkVVZA2f!N-)c5`QpJf}++iU_ZveM%~$1gcR9ggayB7{rT&E<6%)QP;Z9i_yN$63OJt#plsghEn|2Q zodnv4|H1@B9Rg)<2GIJ5&gKQ6iGKKYq6sgGK?;t&@JV7~umoM=#J}wT=x79xdxBqx zfvsD{39=3}4<-SsLSB6M4N72$!%aXP1&I1*KS0ha1FPpae&7#i^ahlTg&{>7MEgdt zc7bNl77^HV3D|$&{@P-&5yqUL^Q&Y)-G>$x0}y4=+bnzN&;R4c6zqjLKm%00&9(>s z{O8{$4jRnwZMHlF9@dxWZPtXaIC`5!K&%oKl}^w&5ojpdMTG}6Le&Y{2VbIM0UEvP zEKzX)jYxHtsCa-XNgKlXNgKhXNgKpC*=H+&Mn~cRXQQ(t8{Kr0iDUvxdnW9eCHMwP-D4siwdZ1 z-nm5uv>~-~3;5jr&Mn}>={vW858m(Gq5?VuzjF)ZwEr!TbN;ue>|kJE=!6`;-?;^R z-hSs6@NWCgE#Upnom;@C?ssm1>|oylKApOAiwfxE=*}%Fpxxe`TT~uEOnCyKK>d== zEh=vyJW%=Exdn1~z!sGs5JAwHW1U-6K+|QNkh8>FE|tKRZ>3FW_@z@~)A{2y546YH z@KdLRn}3@Jc=Y&W=?Bdppo6}7R2qKimRL8xU}^p#RxaJ$(_C=q&ws|7cK;uO_5p*Y zXduPL1ZL2fxOmH@(q)ZDK*<1HjDptlykP0|XKelc5m~~gW&TivZMk6UmSvH z1_dbS>IVL85JjNqYvBVmtzA@1zB%x-@V9{K)kcpL1{MZ}m!OtyC&Iu7Py;0b0$&s& z3`_%0J0Tgk7Sud;QL*{vkif#<0y@G9WMBgW!%NV(7?Ob}pazNu1inx}7$}Nv;2em7 zF5esy82MYi{rUeNWFY8Nt5=|7z7Q_l1T|1JAn?WcRB(8KynF;SeUhUh1M_ybYf9(A zh9`d;&N6{Q!1Z9KYs$;{s7B3&8YL1C_@V`2ROO%l|6#^}^tOBejS;!1_(0qi1$7(f z%rZZif&8E*ZSxtZfx?I=)q$7`O{yScK}ta`-UTu>M@0ba(&h*6n@GPn|9&=O_K*oX&rGy&wz4;^u!l+fCg;j{~djT~{ARzEXKfM{1|G)qL%Z(siE-D(wS-_`xfYOry1H;Q% zpw)MvJgf@R&m9m5y20f|3&f0W9?+a)Yaht-E#P|LIExDCrsw8_gugGr=c$0Srh&Bb zBVySNsvA)Xs)9^#QAue`NT~n+|Nl!Bn5{QKd7cBIl^a8A4oEBH$`x=~_W%9MXFvag z&Y|gTP6p{_hPwGe64>8RH*0{>Qw#XEi{mURtPBhc-~#Ob`ya$$=Ks09HxGvWXL-~V4)!pwY)W~Ks~nf$H6 zkT?T%;lSqp{r~d!_y7MJ{Zc>+nxP5z<%{p&6Wmpx{BI6i0{ktPLFznGK)K=Nad6Lo zrMFoM6hK@7fiJcufCC2<6RRM)3mOv={{R2`|K%*0;&hPnU}>oZq5+zg7$Hdz)aZey zC7%DFxQ~J9ZUE^nZtCqf^;JV zk{r|kL?ER>+zPs23X}psLHzS8)Tiq~x{<=^K^(eIL2cCT7I1sHF+l=c(Cmik{sPjC zl%f}5=;nl^KG2znAiMwn|NgQTrrQaWlGp+QUt~kHfx;=_D>$4$Eq8D@z5oBx7p6WR zWE(7;%prQ9;RM>u+1&zePs76rv@HAmOa8C_|A&IxqB4+d`!5#aLr5vS91=F5CObTf zrGPzo?F%%Bwt}o>4G4U31fmn<%$;Ar&IH~41#;%!|NmbugQ*A2{AVFWNH0ViJn@wJ zLND)XOyB{Rl{qk-#UPtt9t?wO1G%#_1bQ?O+;cMj|G)qL(g>zg<ac(`fePuvpa1^{ z4YY%tiR8gG5WR2@^0$JzVcn3EqZ$)5z)j`$&(Prf3(}30X7Vs}gHKv%0UuWhvibl2 z-!DBuHiKhPA@GF_L`Um^5>aTJz0?GG2hy8Jn*hD%4k`yKhVTFX|B?-4L~rvHko8E8 ze;*C@INb5zkOGY&fno<_^|?=APqTp%E0VLfqw90+c2TK;xVQf0Oo*nLXqGjhYclO_ z0bljjoRISGWy+`j|AQcXm%ta{5T&4)@c9HTn=6_VQue>JhnPGMYVr$xggO0|=%+IY85=pyTATn0uRNzWDn;;J?|67g69~XgyG> zc>K^2(Aa_#OY?&t%_o>Tomfx?KtShRu=F;&LQ>p+vlnaOTIEo+G9t8s*ByYnN1h;k z+#oAU;riyI>SOM7VtL&S?d(F=Plg4*c={aV{?Z><-LC;R4B7q1n@K6!HKPxN=re**8KZ8dIK*s{NgMR4FVsxg=;4r`PpmO(k9UP(aj;C_+bcmVIBx^)$!H?6&9eDk3(;cico04i@2TO zYh^l*y;!mx5^&$@#CO<(_RIgX=lA{4`Qn(12^Ygl%m4rX?*Jdl(gYicg3yTZDB)+I z7+w4g6r()QZR;xCIVu{*K^YJU2FZsSUg`wxdw=2o z6y%5dUqOEG>8|AgZGkUf;os)L(OJ7Ewc8eS8d7KN6T|-v6`Ty+79GB)`KKOYywqT) z-x+#_zZG=pVM86GK7T7{{ar&H69a#14S0jc1@LeP4`j1LKul0)=#>|fAg$M454p}q zo#&wY&`vc!`_Or@JM;>U-DuCid(OXrw!wnVvFj}X?M7p1e)b_CDC`A8^#A`m_4UEN zPwV73=D@@-p}}6CzqKE9m~=hJVW4&Q4fRY6rS*{Q7tL=_9rYK|3FFp%0 zFhI9WH6KyvbUn~|phOF_Up)3mrv&mgFwj&>H^xr>?o!ZE?492aK4%`G%6rRNp&>4E<#oH_3`Ki`#B~yBvK{wQPhaNHf-|4!e zw|T~qKmR*jxAYb%yiP=vU)`Y(dY%4vhF$^fMF5Rgf;Qs6;pueykbT^S+4WAQhrt7R z28KY;zJCFz8{A%i2HC*%sPBdD&@14junLSPI^E7#{^D;F|NsAgL+xpX&ayux3m~R| zwx5>n_+Pr^e*w=6%`3nDcl(|JZK*%hd7}9QN9(2T&;Dq@?%E@rA3&RL-Z370!1}+0o#RC!D>z7-|NSq00^WsoefF`G`Pjr^IpB1EA6g8nG{RK)3I5p8x+JatIUL#@Bm6c@>1g z`7t~!_{HIepu8CT36vLQ!1rV4sF*bW`_JD}32NrCb^EBe^alI~tpqLw3HYdhZfCYR z4k}m}3{STHFJS|1-00>%_<*(7h7EkuqyLLe_cz^cETH8_-4!CB@~DLC;CaqeV_ON( z%8a-CEuf*~ZdcG=0MPQUmbsvgg^P*}C<3)W*0`wHfVAIz)w~#2Iw{RktTgccBX7HOmqeiy}kNYHRR$&_AC4{|}mJ{$HXJ13r=@0<@Xe z0JMHqn zokzFBi!9Kgxl<1CZ#&R@fH9!g4K#@A1F|!VA>e-**bar(1EsQ{g_?#ZLFZbXZa&C( z@G;snLcKP!k6wwfjs6Q^>2gP^t2Sj|kv2^S8)`8|QV1wnoWenfk zIT%Z&yTzN2E3{rJ`Plr1C+NiqCUC<1=Kg}Q1az}u*o$pU|NcirfkIW{#VzpF**ahc zL-wNuzeodH_U%2$GSE6qng5{Bm-%n-;>`t6fgk}tk`0s|LHp%OR0LiafOQ>s&%pq? z8U{2~WB%Xl#V)W8fz|`1f*_%Cmj7ieFP1_CqvPV?%ZVW^7La)_uJeKR|AEYDP?^QR z09R6?#sHSz4w4TC%j;l~hq-6LJy4JtfYgb#UMg{E&f{P#HS4ZZKuXg8ON7B`uI1@} z&>i>xuXl@q4xa%98{=#tLT3EiavoxU?VOV^}! zgHOfpEPZ15t@RS<90k_}pd9=Gl(k%EG{0dv?h2ZCVL0vz>cug1x?bsaUC;^IRc#>f z{eM8GYfo?UmVO3?fKJzrUe_xDFV5_Mv|A4Fw}1}X>SpNnozNY?(J9y&dZasmr`vT+ zZ`J=!0ZC${GPG-olP_7=B3L2|Nk4Fgofw@Q3_;gJvHU9foe#8Ia}x52y{n7SLHb<%J%kC4JltG)=<*TL1OnxEm<@G8}gU zEq-7)?gq~7P!C~01O{dS_&}dGJk1Y2bXtUWx*mCPA@cwK?$9Hkiphzk*Gb~I6WAK) z0Z7N4AT~HbY;XdF5JP8}M5k-Z%ax#F)pY^rh=kfJ&?v_f%h1&D;{G;RWVZ@~CRsq| z5D7HC0UbKt+@tb`pMinl^&4!??K~FV={n_weB}TC(69hG+Kr{xO#)wdbh@^5*3Rg5 zopRiD52%@W+;zkM|NrYdT@M_0-2!4AcLfb@Fu<=bOqR zGy+|h&R+SnyI$n=KGaLT}l^p z`yT0bJ<$AygSnEU+ku1Gk>`Kuim=YwJ)N#QUhF*$bs&Fh5!jG9p!^~ZI`HN=_#Wu) zdI``D6;{xet2Z3~&BI=F!L*bCVI75302JTQ-6U0jRSO1 zVR?w(?@*`fhL^3u6lN&oJTb7XrH=_^nO^W=4m{0|K6Dy& zUJrZmKkWbiKrPRpQq zLuhP(;?H$Qr|SlgKG!WTLF@3LQV_4!OYpZgfwtDT?yz*{;O{Ggx5rRSubuLm52gbYgT)@E$6)FADSEt?gV~RRIgF>%gQqiq z!}4eCIZ!eQ-Ozcy^+4&3&e|<#>*+yp1M-P8$S0t9aXr$B2qi@5y##F!0JSqfc~%HD z&srWSeFx9AXi<_A3eNJNBa(2&#hlLCIi2njFZcfil}B?xWj!k>yE%dUCfDu7W9h-e z-?NFCfuU5O^I~@phh+cRhU(LrETMv|e$v$oa zIyyS^NWcr%FW~L9ovwR8>AM+Zy6>7!OHk4Voj}wbdgQn(=-3yA&Y#C!L36ka*`I8> zL+3CagKXCWrPI#P17XeYYyw_*h%+#BhaTwm1r?p$K_b15;ASjnvvsHIk?z_fAY+?B zxxq=Ko1xPUREvSmwqL=>z>s~=rn`1ew+lN@r<*{xlfZE|&_o`?aX0Y7+inMe1`GYt zNg!wY?g;1%J@CT1A6$`v?b`uzd?(0Yi%zyq-vga>EZr46opmDJ70A_E9k^OUG>iY2 zsDca(-4Xu6_AaW%&U{=4&4DNDS||r-`POh(+7`p_B#IWtP24( zB9%aS*>z2~MYrpO?$AAkCp!heoroEozB^vD1^@pa^}lpMZvo?rs^I_sJ4=uBdNB67 zunB@($)fV&=qGUacl+*WJBQ3=dVs$*>fitWpnza_Z44=2L4Gsp^xXl{ zwnG5iK7~aA=(rj;0sdAyP__&`(p$yY?YhSBq@@LaJE)Hc(pkF4@c)aC-~axP_+Pr^ z#f$HML7}tZ#r^Mp|988tX+9#b6V%Ot)k>hMiJ{wd0%R2>5uAHc}~oDEA=yIt2n%`*HC9t1-(^5tw$ zf#ABv@IOT2Wh00mx(C$%&f{RT{8c8G{okg$^a$g3=F$V8W^(g!n-{Y{%fmMkpbU_=g?iF;__l6=$^MXEWIu&BA`qBgj&HFyY)b+GW0kL z8R&7p(0jCxK>9q8^axsW+1t$^@EtTS-1#@KcQUAF(dnZi64dLWq5!&ZwbMmKAmByy zT1egqQ32go%+q?HgsYpOJA_xLxov4O(4K==|{d=?nh-@b!#P?<4j9E`t642;_g8ZWomZ=r-68(28GB z*BInHc(~{o9(b`(kbxm}A*jg-DuyOAGBE4{=_M))` z6krOS$3aIkm?L!l1Pynt2I*n!c2UuRo({v`S`TWo9I@$yo;m}Gw(iN`Hrpls7SMDh z=rZo!$k?FI#D5a`O6K=3IXKH%F;6arqTuYrWAkBUThh>8s8Ov@71Ziem(&<0=7 zSz|$gAa}m_zZ$Hr^APB$#cl@B8F(%#35@)$&p=Lm!_xV(^8;u#6bOgEX#Dj5f9G+C zKS1YI9N=#S?P6+%cm*^X2U<+=uf&yL%be{>tPH+kMayv)~#DcU5h6lir z@&Otv{4FWq#Y{ZCU^@d|=qv>1=$F1AO(o#_t3*IaDC|YjL2wdkJy4Pk+TID;Q3R3z zhwlqlh$L9zK#3cu!n_0O5rn9Kbcct%P=P1_AMg^QA_8g?>;~J+5e_kd8KMAU0)Oi~ z&{Yxe#00wY5gLxo=l{P19k2&Yu!i4I!fV>U|NrrZS1HtA2z}r{0ta^AUrf!NzhEI< z0J^j9?(YBp5n7wi|8IW5$ln(Vn)L&1wS0KC4BHXV`6t0ImcRf1A9MkjK=W%G%MYcmLE#+s;$bT+ ze}Pk1sZH~GkZ#aH!=PIWKwD7D7!dIbHo9bS^BbPtc96P&7XkCZar?R-md?Q9%|96H z_CUgHK1dx#8hbqtGByMvCxFHm!h&CHJqs!wTjh9_rxcWjLB;k3(2%>lH#mQFhhFKe5bE{N?L606dj>Md-T7SeJgDD{ z>liqsf%oa4lN@}&W89sgSDGJw2>4%mA+Xc;!Harl(6ziCNB{gk#$W|n$63JG-RyJp z&wtQyp3MPZ21j>u2$;dczpXjq=%4=`jsl>)5?Kr{3Z}rE*LtAS^#Xs3Ig0BOz5f62 zu6@uQ3L0DObOnv~y_idA)?A`504Y>6K1Usom?&m}M34LK|X0=dacSrI$b<<@TR{z3YjC zkC=OHjF@ZBfX=-C5%9v~B{*(7kAp%Pw9Bg3=L5&_114U=9H3sk?-fXu3mTtxeGt&; zdZM@atI5Cr0sl+)fQAm9{s!No3p!5oK<6R;mW7NA42Iu8?&JC1V5MK8*$s)mcu?W; zh6UWFyATM9Lun^aBOeq5#~Ac`Js6wca0CUuIJyVy?S_i~`Xy|~81$PDFn0T%={%$@ z^1UvSB#WWb_sWY1RL8VdfGRDP?+_nAuSMy0 z-2rL?Tl_D*@FLcA49bIwKn7qGmLgGrZ|_m)a@=SqNzKClvo@E445$x|@NQqU1L z9Gz^i(e52{Urbd>3KmFRSo=;RB1Ap_9?vjFPJPH63tHUTvCapD9hcp`3cFm!{% zp!HjcR_F28+@JxE?lPIyZza+oKbVETu-gUoeu;SH)9x~n)^DXxqYV!rMx7@_?*Jt+ zgg_{0rt?MIkKg|rkA1tr!2muV$)_{)0RKMWPS*>azDGJs&ma}B-EE-J|8Fh!aEyhC0aV=uy=b-uRaQKmu6KHyK@H%5-eyqq7d)N&!fYW(5_Cy=>uOMD1`Q#C z&Jopiz0e(drq_j0f$>8?7UPRJXn*ct>jC~2P+JqUoWnt((|1oNBWU)s^g_T3EgMjQ zf1=xWPxBET&0n34EJ5MmW7P#g5}*lH&=%(I+8v#NJl&y3K!;{K3bbA-4FON0Ug?fK z^S|^2Si=LblLcD8b^Bf@;q0Dl0;-1t{)3xFohM!-{{H_TY5cuZ7r8+1y!cWERKSAj zq9b544+OmEw+5Ye4m#ES^`sX@n?U0Qp_&IfuZDLX?{(w|3x4tM2q-7_T?G|%8l66% zb0~j51Xmud2THs_73HyB2M*1@pgWBM!vkLES%Jchr<0BGMW-7JYQToQSTGMH3mW)i zu{J2-0q-6^^Bim(tUQ7Ar@(o<>I*233ti=42yT9pgOsI@9|leMcE(Og?Y8c$o$+F2 z31|yzscLGcHFA|^0y+y5R;58QJ!rpF_BYV%EvVJi>AIzxp_`-A_W)=L=NITSc3z94 zfBqkLJpr0x==5FF%WDG)V&5gbybfT-f?i%1Fk?<{ALzuxPTv*1zIQr(&-D7<0F5q` zfx3~M4?A7=G#}9HJOn4SE47+`obP9m!1)!@mKmv0*1337%ix{SL2Jl2g{V!b+{=$Oo@BibjH$Vd= z%|`@4$KD=<&QXApDQIE}b{?Z3=={Z>h*B|a!vE4Mou5I+&7S#RdgO)O4RAB3^#FfI zKPVs6-T<}LTrXrPhrc+q1)MXxL%|JI&?4?*3=G|UpyHN)pZGVIKt_cU{t5j1!WqE@ zWgw{hv;0wF$G?xg^LNXEQi0dT;PTNKR1UWsC}9U5=v(rx^M>Y+<{zy5Ery`B(+{>% zo<{rJ{FGAu770+{?0V%Jg8+X^2zWT|2B?zy9Ppy;>EHkH|4XmD;AH?Or|#G-pi-5Y z@kH}Mj&6xg-xHm&2U>6Qw}Nie>)q$T&%n^z-T+!s;d-UF4V3*mT`%;ufeL_5*AuUW zpoKnYAJTCJ%i1d?2Hl|Zu>Y4{===zGb>oaI4@#Iav{)5`dy#b6touL|Au;&V*b`s|Nj4f%?Tv(hzmFZHtOe9N1r02NwU#{K-{-`5jESN1 zS7+^x4%ZD3QPH#s{QIiF&GR4MTq;5JQHSe>hT07b-L*UTTO2@U#BP9$!6#z|_{V!3`dGU7xI2E-XC{Y8|^Z$5C z@AWo!oCLRr15W<=pXCP9gi|$iY}D*Ig0Nong~iqXKF{3v~WCc!Co;Tns+H@*98aYf#~mqoU9~ z1-$K{^=;=1ewTyY2B4cQTp$B5p!IRxl_K5powu4FvGccpTmd@zvIEp>&r#v&c4e@1 zQQ;_a_;#43)TJ{8%Iau3umJ^;=q%>3It{&)C@Gg}@l zeGEEo5p)r7^Dk!pwnI#yTZi4*n~$+{xc%YZ=FZmP_LqN~J8OsAKmKj*EFEtDo7I2x zx~O<`f)@3-sPG(jQ31znH+Wxt>wywB@KKhaJ8U^XJJmIRYksi2(HWzn!|#8%^+0a~ zGr#AJgTI;hTR>yvhTsFwyG7dhPj!m4H6LKKJY4$m;A5s<5jn=+ppL^{P{Qbxu#QpT zDB+j*(0!($hII2^){+m}t}6LF71=cmr!FZnlx>~VY z+B!x>rlhJnMn$LdmF6eQTm1f)d!v|JFY$X^?!0{PHxuaULH?FVP%V?AqGEWd^Db!q zQf4~;=}wtx&4(B*ua4b&U!~iEeK&i{;f~HOssF zt%ab|oxbw73WL^RX7VsXuC6Un;n94hDfaU3zyJS1s=Ptoi%~J?ZEiRRE&&#u{PRBp zl&}MOn;lMp&ff5qhwek~j!{tnRftv~J&q!VZ$WXzzyKXBfJEO#@PH#I3#x>JW9$Dx zcx-`gb=80@$b!Yu|LdJcn~xa0oCTT}@==j_X$NX>KK`*6bS*aLtxoZm4ImlNcrIvg z-lFpYsG?`CFX@gH>HN`K%wl=H*c5caOBDjcQHHGgyqgH39F z^n>$4C-X~VP;K)0C8&BcJn;Ha=h2tEAmb7K&j8)I-rEcc1kk+?;6l(>?$7@h9?QXZ zMWcn295Z-4;5JyDs@$Ld-3X%~rewTg0xLNMR>Fj;Bx4C91H)@@`}M{4m%snBhMz)| zZ$01=t2;)e1bj<7sJL@cDd^7T==4!h>F$ASBL@|2kW#L@Mx_RHVVsW&Pii+WX#Gj2 zkBX1s$zBgo2?ydcfR2pr^;YQgQ89ts)>bOl9TCv&VAC0+BGP)GM4 zTR~Syg9;v4fdegoIKah?0H~~J1s6VyE-EtJpu5sbR9JcgSUN*gbS$s)H!T4bwJs_O zy?!i~C-|Etf=a`uOr1F@5}ik3?T=2jUMH5$bC$=8Y(dJ-7MXP(>UR3m8}*0(MC*ad z2cQ!VL9JQvLA5?A5}+nL=wy^;21ZcPbiDW^q`U1FfnA6H_n49NZ2I+{H-5Bx52~9Fi^R-98vCFZT`z%dI4lu zw?O9)%?r&xnECs!fsz4>O1Fnd=Y`%#7Rz7!&A!YG44opN>)Jqvt2Q5I>|_JyzTp3s zKT2PMZg;r=x~LD7^B7;&B8tZe-JT-dhMgapAFzWeQvMduR0AkP6F_!=?(mbaywBfu zl8J%g`!P`c!QXleG^UZGA_F?&ve%grR6)Lm-LjH40hISaRiq23*mPy!-xl#7G}`N; zBG3^d$ZYwe^j2Utb zzs-@g!}%ZoHb<5Y=l|V?paYyi?)}lp*v+ESox$K0}WQE{;jQIX+q0WFdTU1ALC{DPEsa)XYc4hCKOu48$hzey3) zukvHDe97Pb6;#hWVgdzGXNZbG=dIVUD*`&%I?sUu;_0y(xsg=H@&<-C*w@t~pg@*1dcbWs6s z_ni$g#74#NZMVA!YPs(YO8j#{<@Os;xvu~z_u2QLl=~{!%YD$Mc~DC0yx;k`)57v@ zX$hnRO~6$d9gz6*AAFOki;4uOZ0HoUyw2Y;4Roge*HUxPjYj;fpfe=9WmKB8c^F@U z_Pm4CflmeU0pC@w(Ot&;J)K3t)8^L>;KEdwmVl^C-2Nzc{#7V|f`5DrCUx=t1puP%Hd} z@McgKXYpZB7bm8>M5Uq|R72%}4?O|R$JO)(*gzZNpms0ls1;a~y+lO>+B`>Tk9UTs zSoDU1rshqKyQqLKSO4Y;Zj1+jE2qduOlQbXn+=g)PXXViwXy#B547MfNHi76&cH~Wx1eqgpRJL~hYW~Gu$`1`cP}pUGN=oEb@EuSEd?W^RKL}`26r3))eL>~=CvZP! zGNkALl|QXlAewo)8LVAY1d1aerFv-;=mdCBdjizO>aI}{==4zm9mtE?@0kuN1`mLX zd{Cjz2I>2VGFu)my$>!3N>p^fnJ-602HXc)#|Y{JIkGe#XX$YN11`$lK_xm{hdZc5 zXYX+T->mrKw#VmW_}N(1acNs=67m>HZ6Ip{Rb6d zpnVIShd>FbSU{CN=t64HUYpIJV(k@wt1GBwagD##6%wc%%^5t5FD*bW zf`oesxa{H4{HJN~QV}E!aVWIC(^>~gPp%?{mr%=XS5UdF4sWj;gue*hhEithV3gU1 zKyCFeppXNNQ*^$B1^mlygso{4EMM`rf^N9&ZC1cljQAX zWhl6@{}WOs$aI^iv>xcrW8rr>1}+ytrKAg}oe#Qf9n`=KQDFh~209Ny%LsngQ=Opl z>;Qi&X#NS>&DQ7II{A7%SURs+o-Z;5skqGFBn4{uo#^)X)0^?9^ukCfxU(t5JQ5_B;ZxJid-Du;oNWP&%9 zLBj;#`O!`da7_;yd1*aadK}c+hj#?-gR(2QBd{LYM|i^n_Bo;>@NyG8r-8>X@OA{! zL1hA{BLG@404j~0U>yNa!xY*JQ0R`}csT=9K!94IE-C`hMg?g6AV!6wliBh(w2T3F zXH@u`k25nc>;;{H^3n{HHOd&8|FV{>01bMy{sNf;@4K~t3O{i4A^HO@ppZrF4~Ub} z9{{-&>cR=#eu#PlbaFW;7C_$g1la-V4=`9BFLQv_8jhWy^MF8Ac#Mj~YhF-rP`(gWnt8;J*Yan?YS&P-~RG zX)DMV4g6=2N zXuZwf0;(_}m%s40fX@1AW@dbS5M({LwGX-+1(f4neg_=}1#kA7fE?}uTBgU}+5>VD z?v_62W>!#Zq(%kW(wE%;Ps^arERL4`a*%zXsEbjNcv%TbU!aR;I6%o7bXPf~75d;T zjxnf{Jb(T-KW5@@E&TWYKRD;T3c(=nx#pol=(fOJXg*mg<39 z)2*Nr;9;GE4N&!+uR!4gS_s+6Z25`5B_Gsl1~;gY9fVR{Sn$9runC>7UY`UH@0F;q zfZFA+n?WHAD$_b&fsTxRz0mN$OGZ!#*Ql^q{^f7s|NsC0>v=D}Oo6q>k*z_gW-fAr zTi*t~&0rkZN7P3#Diz&5;5rG^=IyRgDFLwQ!}Tkr%rPoT8x6+rEJMo1~3 z0jh6W5AeGjM~phbx(MLqvhLv9pg?2R&`Jul)$SE2_k(I6P)iP627?BdK=mJ6Hv=Q+ zbbl8W8Os;^Ep4DSYKaO@Zybwdj0y*T6L=NYBc|gnDgvM$0H_c7S^+XX)a$_5Db{(f z^PuI?5@)!EbD#rxw+VC}Y`Ii<7qn{?lo=m_DgYN19Z)y?D(DD9N5*DmMv$SP-ZsdD z(tV)%M4}Tk+750lgO22BcIROP?fT?z1+7c9E&*Kzw-#g+J7O?g2Rx#*U=2L;fh!W7 zEQYXN7nK~)1-&uQQSboxkWy-QjEaZlJ^t3^psl|L_*<8Pyv^Pn4&HIv?V{q+>7t_Y z@;s+u^3F?RXgyM+BEVX*q8qutAOf<; zMMVI9@@$D31E}%@wf{l-L3X_S46(P<9JJRIN6avNT1Jz2ukEeIV*QQ>bn z016H0+T!kV(B8)q6#>gv{4Mi9rI(KiPv^PjV=R`R`I|tkU(jp{xcOb9qSE=j`61{k zJpqvQpgYH2D?%%x-Xg|M#?GIepDe$YX!KUHbbhk@&EEt%y^4PuQ_F$M``zGO(Iud+ ztpF%#f(~i!JlA;v)C}%q2Zbv*zQHBO0$fGeKlVTWA>pQZ4^%JphB5Pdd^-4#Nz)j7 zj3UTcuuuV|Jn(sju%`Sakhk4MKp_Tdj-fW_!2>a%YrG)Evkqh+rfwBHg@B4@%tpP7 ziUX)w4_b{38m0i%zMz@JP9w|Hr6SfbDm?tH7ythM|Jn{3OcNkwHL?d$ibh$G2a6b+ z85lc1z1;Zk|9_AfrKg(nc^F@IfJ#Bo2yclB&ro$>GcVTB;FfuM#meDLB78~FHE zftRa5J&!WTe&O~@zyGtUZ-$juHQhasQ&T}B0DHhEr*=cmhXd83-93;)R9#doy4QdY zvFh|uQRwagpJCY@3M$G#M?x9tLz z-L9ZR&O2RHGN3bf7B5~e2Pa9;{!&Dt1vxMYRBnN;rHp{g-gSa{oXtO2_*?FSQof5y zOt+7Uisc7TiO=6U8*~u;CH~gip!TpULw78w7z2fJ1SnsFD`Ae8_dtaTq@V1f0=gtg z02CUaz9!rcEjExcO#$5Y&w=lTU;&+&>Y~Eae53}v9T}PdK>9)DRkw>u!prv{<01X+ zgD==^8Dtn3_**VPN;?x!v9Ha_!0^qLgM+`-1tOXNTD5(Ei2*cu!UHZhLF*|%?eq{8 zp5|Yy{H+?G5kJu29yESSMY`oWV^nyWAG7nf`~qDC@Sndm2XuHUs14<#lF%8W0=i%^ zrTI4te|suB18AvjhT(ruDC_{md+Y5Io6Zmwm(CyHbmODq04imm-kHF^ErgAwLj-gj zujS#=kDy!t*3}JC7oy^#d4utUrHhIRe^UWyeUytzI=DQoQ32Js4wf}49Q@6xpqK__ zY)}>o0UwhLnk#bX^ilBuov8ros~-ei&yxV|t&8wA|70#_u{>V>tk*>)qZ@SX7f6>6 z*dH?8KHwSZgl-q`m0l{~bg2r8Wgiue-ay9A5Ebz4Rvn<-D+#c)d4a!W5y%;Qnio1j zHNffS$Ly9j`1{I12gHV`2x#5_`JS1nlc^JQIde*PC@j73bY58si4?B0~+_PQQ=|dZ#@Vp+XO(CbaQn60FPYo_sf86 zFBR!^WCS(bfATkbgZu$%34?;lM}?&m)L-%V-+36cxa9z2hu440-=(j*eN+LFzn$@p?QNYn+?M&)lk14?49 zpemRLRBoeI!Qe5q9U#NNb0Oe4aElke7s1Or)G8QU(*3^w}8qG&>fMz%?U_N z5R@9a`v33$ppfdk2Of512Wcz?4U1@?YC>5C;P(GFwB2&>C41vfNI?f$snG4BV$yn` zWZgG6P$37pg#w(&TvQT3!`n`vZtA_)(;zdv{H?PgC(cHIYF&`OKxKxDia_V(ZjP76 zKOz1H6^bDDy_^I(Ar(}8f>c^q{wx+}{0zFs>M&?wNCN*h$NwG9%$Da%UxU&hs7QZl z^XvbAL^&J^N+w|E@weD8GBA8Q#KGSRYC|=HTlU~&+YL^YEFfpqfYUQL9kVlb*Qm%? z{@`z6VFX=9(QOAhK&SaRd*|<$D}Mj~4_dtsT5O9g|AFEdlK(b2gY%yaH2=kbOD!J$ zmfN8Iua8OsI30G!sHAkB;BWN@ZTel$N~*Sy$y z3Y4H31ucK@_kwnrG}oxuu#_8fyQtWJ%V-&}<~DXvIEAr*s+L2b{GR}x8}RxMk}ZAt z@&zc|VpKGGn^!*`C1y5_(be=Qn7{1}xcQ>t6f+`ThTeS1Y)Y3Reg2 zK!aw^&Ono^mW= z={yXrr}E z@i2aK0?os`U}9jfE>RKSZ;J!fFHD^wD$s>*pk^~@ddlI&mO1ch1l(+P0rm9}&1TT- zAE?FT^Zx?qifG8(A7~_;zXdct4&G0E(DDO+D-Xy9(1^=P{?;r|=rVPCfm%YK8BmFC zjhAmg`3lrO2ep@DR6t_@BA~(*?)DZJNPAfYt-YKAIy1;cMFg|GECQ;sz(x9Zkl~P) zRc{A_#{d6~KmW5cFz~mjfg1A%_&Y$UecQrNti3XPmN6h92!dM}E-H}L_c9I!(1QF7!vmmuJ3(VWr7R2#ogpe7-8Cwp3*uZr2Sh@e z+##$CkTsJZKp6;JmUic;xPUH5)x5#%q9S7HqN2dx)B$QRx~Pcs#;Bx&S5>*F@L0O2 z2=F(nKx8z)MuSq!0no-FkeeW_Y;JffyE{fD1KiRM0bh%&05S)puK9O8e|sFrm>Ly< zUUyJ2n$jT;iYaKT+S)}$gTLiHD9OlagNA)>Ha}#yJi*@=0_uO%s7Pp@=+5G3e*A-( zz4K)!dv}dW3h2@mP}Tz9n*{Q-+{>AWR%F_QPNQznq^*le1jyTrY|v~9YEG|(G)hI- z`CGy3Qe0FdKz>7NPB(!PY!PTOFpkCYCx3H2$n7~0WuThiFeA7<9q_*cybkG&=80~; z=7&ExPjs@q1l6#R{0@$9@EACR54md_R0e2tJAn?kOR;><-vU~2)eLTpLJESle0ar*lPyuR;dPB+qW>6@CD)-(Dmd+fN1k3l3YrPRoQBYf{ zxkg2VmA?gK7-U?<0jbr7(f~X9^*8u>El@dP14>xk%nS_QoIs5((6m7}XhZ|r=#qr= zE=52MDezrRutMi4DD<2_jaSg=2Ua4^4Q`u87lI>*a|-~a#b1l1xh!$9GaqXJrB4k`vj zUb2GH`Wu%2B`OZ6T{xZp2B4)RE}%uSpgY-LWLtupktWb)Bxr4O2q;%_LYh?~NL{%8 zpa1{AoD8}{tBe6$puF4y4L48;{L&ZHQu9%uE}FfzUj1+}$HRKWAVY9M8x zyqCoR&VCFapTE2UI?f*?3d+-<_2MFyKZ+%KMdU#F4!H#eTATrDl7nlFmp4JKX$BSb zwvdv(9JB)EHh)JxBLl_wtVpQ0b!pj+z^wsCf;G8W&y$P~5x(7t}Q>3LFwIr9iO(9?s=& zar^uKKO`T4Ze|CUz@U8ewlt#i-b;N*p9^$z1Oxa`1kmW024y%>(91sAD0*3MzX#kMg%RgZe8sU(N%~z=6G7V*LFmXuDczbn{bi zGY8~s{uTpB{Mt0Ts3fp7Gl0idz{P(nBc%NgcI-<|kTUQXH*!%0sM=3Ot#&n4x$oM8%_|8WflyH+1```0%$@f-b|T zQ2|vCfuONqNI$}bzhwz%P=T%UeCHu(AL4rFFVLtwqqyaX+Vtk1Eamo~8UQqmZt0@p z!rvAL(vH3F;8ObXr9CKbK4s!>`2lJUJO_2xz&`E)bsKt{F?$jkAHXengWhIjB`D2w zR;)@;n(2?;V>1P%%dr3b@Bc4$Rlv%ZcYk0-;1duFoZN1KA{y*ma0FrN)l_1&s2kE{ zNC0;k!r)3ErhxlAJ3tLt@O&Zr?%)4em(ND@A0W4ub?<@n7C>8apyTf)Dxjr)b3n^R zYE*c7BWyZNKnqzw^IV{%dEL;P%}P{2qM%`T#QOCd!;|1XL%c$FJ*dxNaoj}(yjt%& z==eN_Qn_x}2)qt>{W|LOp$@3~&<+}Yb5Rii9nakx0vU`FIxX*&aPea*L0$mWo?v&kcz}Yy zMMa?#R0AUB3g$ujJ_7K*PZ>k!C(s-ws9DPd3cnH+4N&NQ1NHkD7#VMYj0F|Ekfn&A z@tzya4?fsD;BV~(t)#gDn(6`77|jp(U-BSal{NviqllHi#R}vQc&Y@iZv)A&^S360 zWL#8ux=mENGeF&Ck!}nAZQ`2$IzcNI(!N-8@V*t%q#Hfh$hBI~wTZ*WZ$@6cM0wtnDjLnbjId62wsEBk5TZ^caKG(e7 z>to5-%j3yiqQb&>va^)o@`FxSmY3HNE{A*gGpO(_W9W7SHNyqE89EO)KW2w)eOmJ8 z|9?=n-OIti0B+?S;@@`Q;4hADKbGzi6$AclbHtiX|M}k$qml+q5S$=3XfvHWRwi3$gok4hS3mY#*bNetAH2~m;gHc{#DQAz8(+v}r}`kE7z zj3-!LD--13CIxBDbjUC^|6nb9&A+WgC9U&y=SR@$<(8BD9V{RdK&z5UKy%=rCI$F# z5%ACi2V_r!jAe<641e!WRt5&`5)~On(E3bJDF|A#4qA%^nr9Gzw7o$&pt}Mz(hC}b zhL5|0dOaMV@B*c~mxn>Ur!r7@sDM*l3?m!3i3v`iAu1A`pq@KVw*v>bO!*CRV2lb! zZ#9eMKmI0L&`RA0psg}8prK+=$M3Z~*uR}@ou@kgf%SmSVeG8~Elz3D2d|%nmqND? zr4XpV0qvGVltPff0ReD9bQv_hVkx7--*gZ(zyg}!$Wf61=>g4}ICNfz#~1%L9(h=~ zRO$&zPKYw;F?hiSsP1;?1Z~&=l}+6~DgvE{dwn|pTz=hpyF?MWY$_85%`UwJt&xZ5 z1nGigyAmEyOC2-@tp^%|28Gkd&UfH2t5K2Yw6HwK-x34r4}q&n1*C2lO83O?#c$9- zQ4fCDeBf^d?a$~0=S)yd+x&q2Wf7#QEYkTMJXs;r2|7h@jU{+iVFGBgF({s)@d}+m z-~w4%1KxWHI+2C}`;Llv;Km?mM}-BXBet~*Uh;uDVm4ShVh*5=80a3lZV{F48WnH~ z0y*?$BWM}{R=j}X1ndb3Sn&ed7Y9#msvwIQ7@0#<1YX|%`~N?9Dz_E77la4A_INw! z5?)ZgC{giXJO-+P__uv*dibv;HaE7tW zQE}jJ$^?~+IVv9f+gwZ;IuABKJkap7p)}>-BXHaO7$fH)%Mulv(g&a+V5SmlaE*1L z*JtgY%P(3Fl-Tq(!TS|u`k*C>o$tVz0aU1f*3^Ty7|FcM0c9YBQvUW3P#(!qacO;9 z!rAxq!44ubcb3v=Q`^eQCD79JhsPMOd_P@LY z&Ch_wn{G5e_+#^fzcm|Pj)Sss^8@CWF5ugWn;(5>`1OFlH6J|N#SiYn?qgtPV0hUN zilD`mKtmPad2!G#@WYHC;WBRiZNiWSL&-~!06#e1 zdqY%mEJHx!^|v6ksYvG`?GP0iW>B6I0}U~Pit5H!phY>Ipn|uoq`5}LN47ku^Axxa z0f%ApBl*tvpja=H;ors&is9po%@6H4Pg&NeIF!EWe5viD;=p*imnWL@1IRp3f&{f3 z7*Ae))XCNv#`3Zo6nfCmDK!C^&CI~C8YfpoJlFzkkeEc;7PHy_ggl-9Y+li&aOTR=N!UxIeQgUtHV@asqCsnXKs zN6h;eSQ!|0gJR;PD5(Agmnz7PISFwLWaR(H5D_LJ!f&2tXFr^NVTnS4obD@a= z>|py&a6$l?-~5RE<$BOC%_GKr3~USxyFnUWE`TPDe>Q(g^&kd;5_9td#+M;bgFvn= zwSgD}($oBi`DNOl|NjkdgYMyBk+Nh_;cwgh>;HfLZ7fpYh8%zE8qlSTzgbJ~zFY(~ z;azNkziW1NlK-a{91Ns<<^?-3F zD2l)l{IcTPf7tX5^ggKpbhIl|z ztF7QAo1jHGpixH$ka?XxDlFapEYSW{Cyxr+HUbM!C(9o)gb7|O3T-)ns&4ouVbHz- z9?;6oji5f(0VdFLTgw;x?e?HEdHh&F{g0+(Q2F{8G{V6F$~T=c;IVHN{_O$(dMp0* z&SKDDU`T8H{hz%|rBkf)oaNCHm)-y-%d17Tpgom5DvZ}+Q@M`M`pat8EpcS1QpnPC?v~=$TP_l+@PT@a zpo;29OmrM*BNb>}#c>xE4p6}dG6Q55%$(AFh;^X_ObiT`pp{$A;OknT>q0?2AQjNs z(-$30;Kl-|*A4C_LDz+5fK-6ig~mYES3xF;NsBo~B>;O^h{H-jY zLJ_g2;45fM1vIs9(D_3119*?IIVb_ei}boNf{rnG$KNarnmLgHwPXZ9yL=-4cOHbU zk%{_m`LgtN=ZkI`70nOOEkB*i;4(06Lgx>Vi$Kuwywg{%vk79WE+f-wv|zx5R*t z+Hhk9oxX6~MMVKr=ykZLcw1iOZ-Q=kgYI8f>AV0^1S(vcKm+rjWC&V32fktc9RD`1 z=0l7fJ}h3Ke#Z~S9iYZE|FnaaSNW$OZn;@{pMSfHidW~y?idw~?h+N7-U*OY`|CeD zf7@C}|BR)Rxtp)^1f=r;%4#a0{rDhfwz7d5I-ss#jEaCZD4`u->STt*D-TEqWYH5i zdLc`FO4LB>(je*2MTO^OHK?x!iBC{(4}7PPIV1B+HBhKR#UVRRK%0a(Ki{BnQ+S1fLuX>WhN*jR6;g`@Ll=e^G3 z;AU{Ww5o|A2iBp1KO_Foq1kxTroZjc6m2B^h= zs6XNLzeab6iUO#c&>5nV&{?9AVtJLnWe;fZ3TfqrkBR~4poF9RO`uzVd;OR!eL%BD z#-IvZ2-GKLVBl}J1$BgGf%=i4rT}OuLN+4(0QoS2RxshV0pE4E40Fc?AHJd zxq!BHwC(|o=fU@D{D80H$ODzU(0UoPhQk1~QSZfvDsa6F(gd!TO;FcxfD~qQgHAiT z&UWT0P$kT1^c)^1<*xZ-`0;Xv%#Z zs7DW4(hOQx1~ENt0{=E2W|j^fCeT_A7Zs7x_n_s=;K^5Q7Znj^7Zn9i6=Va7F-Y?` zy*C2Xs89f{TH$X3U6TY_CJn0pkAW6oK-RJG7&ZR`Es;K2{tUDX8sq|yxuE23`~N>E z;VOYvV^07l++UEH)e?{$B`N}Goot<;Rj@8dtMsg0R7Cju@<0tv9~B9(%NW5eOASzh z>2?99b5LqBXnp`X=mc~ffj_AIr}45GG<*VHCu7lk2r+9JqLKhAe;^q%|F&2~W@}2X_8e=;m&TZbYL`8RQ`3MjvRY5V)2H4briL4s$_o^?`Ql@o0YP zW(KW|zR<}Go~;A5H+)n?Ufu_}1`;!n^_e!{$@Ng!`e>d12H~Jn!n$KrLS6_-!Dk#n zE1;Wyu<^Hm7KwnI3u@UVfJFIQ|AWTy*gyt@(;p;lzI+K9Q33lqMn%T(0QjgE*g9to z{+6Afp%PGrjDeO@65Z~g(iKuz-Q{oj2kM_F>bK+6w0Z-Ul4ALVai z2bE26OqRF!o4i1!0B7S*NZe}^*chU;F)(5iCVi~NapZoj&f6Z&XEM}nP7@BM^dqGv1kBSaxBy|QT zfr0lQVOc){ZWe6@83S$>8Gwc@U0(bvg_n4sW|0Ye*b-dUfty9(^&?f#DRfYC2wbke zdN~<1;sAn>4=vHZZ_0$Ts}dI_|&?=53MTJH>MGCiTdjb;9FRww<2FUv_zkn7uvlxNSPHTPxI(^Ki^B|~=^&iyr0`02|1Q#U#OH@n{ z#mH$<6z71}`hhAE9~GaH0Lu#{QJ~1uywJ^w9BjG2{{OcQQ4!#81+VXpQ9(<{D9y@K z=YRh=?{K1KV;WD z-}w`ia~Sz8Kk)a0Bm5srIq2$G4bBgp?3N)a2K;R&K>dp!%?DT@J#0`l!@teze}~6^ zkbLROm&-xDBhaaq2l!h$zW@LK@+4@;4D4F)lfuF4w$bcIX>;epbs{?vW#NVo zRwXDy!dljs`4%)X?0op_j+7J%fNDUsJ^HCA#hU~G14bCB*?dPK+ z((7S^SW6AxNNoUG6G8g;+yhYA4QYTN#^*o_sgHp+RfC2NkVoh^kVfc0o0L#b`T!5n zfmVcoCaJ+KbjW&P#Lj9N(9EXgQT~<-pjJu%Xnc;t@)du3IAnYd+^cJ^0#$*JnZVUv zjEV;TcBg;6RsYfs9^mMm0U7214bJKFZ$AJ!^9M21-*FfP8 z8h!zV7i@HGGpOwfZf}A5z@YIju**T6YOsr2{6IAY=COXEAah+*6yTezA?+a05N>n&{!$1YOM&~uq z*adjdw8;;YBtV-ci5!0ejj48i1Sd@7@i)*ZSfJ4;Py%HJRn6TTpg}cIzf1-^{1ydr z0%&9dGW;gf3?6=qQ30*LhK|31^f^FAFlR=9kKx#qyz-i+tsEJ#~08)=OZYRUv z(haKrLF0CJ`CCE}<944x6%J^%K`@KuMgAu6lx2(x55z;zaXXDp(72rpXw(lfZpQ-} zw*!Y}2PB(=$L>Je@xUS3dD-$Sf6Eb2{)Ptnnvmf;@B{*u;XBZp3efVR8Wrg9U061_oeCN;2enhN4c`TThVQx{ z%>~fj1kj2Mj?P!$O@r`2%mM{s7-SsxWhtmuMH{tKhJ=_-Z}S3N4cA-8e}fJP1NDk| zK*#-pb_~x1g};jm4`ej$^?FbrsS|bdP6Ir8w-|IR8hD_iwI9?N2aVpfff{KwDv;4T zeemdAjEX|93p2LSI|Wc8dbtRs1>9OJ0T0)Cf_w-nJYRM|WI)FtaC9Dj3BKhLIu_>w zYJkP42y}z?+ZbE>fQH$tLA#l`L3tmN>_FoYp!5u$u6I$qb7q9T*p4LcGn2Ye)0XN-yiXwUF* z(#G>HLuwPyS+Y94WQ^y52J#TY0Ii_IR*$==;2zHd72}|F{h&Prpz*w;{4LwDjOPWg zfXa5v@jM3Ts0iqMLs0AC|9{wU9_XG4P+^k>YD9E`_J*f`nzxomOE-a{1GK+e0(=$# zXiN-kJnsX1JTDDYltWtspsp)qJWnAVTx#rLU|;~Z28bEY1MMj7294)^;%^0=0}tw0 zgBxd{dIK~9LwGz7bdCXHUlwRE3FLNM<9T%i#`8eu7$A@5!Otqq{b%`xN0S-D5q&y_fE+st$vfD`@m4^`@ebl2#{&)XA;$4GB8}q_IeupiYKlOb>fpjA9% zjo+z(TE-~jcNHKzLR17GsTFkMT?%OQ3e-^r_mV-!=kxcvfriXNAY*vl{v4nK4Z1BRa1xQ_vIh1!|A8aTOw3ZJP+~5|gD9A&wAb||!fvU?Am6%Q`jG;WlNZ2V* z96(3lK;1b|(;YI52bv559pefrdq87yp`e~t4Q75}XM`NqRHI@68tu~pDT`4t01fHM zf!Ho87NEl|Kt_&{2SBV|af+V|X!OcY`cwW(JSpfx66^pw$Q(-9nuq zDhADuKuaM+UV_K)N>o7GE5H*opmplIU}Jb2X)}g54b%m5Q9<3*=E2`m2MH|b7N!!F zl+MHat$#sndw4v*6bIE6kir49-V$_*$cdLXAq{h|2VVYxj^jZ_6gz!X0y+<&jN=7i z8OLKrbrRAz9)AmH2b$#t{?@(lQMVjW(QN6WV!+=r7nGjxj=DvF)(QP%;cwRgDXmdK z8hHct$U51{^NJSc7D?%m+wL(p(K zc=!-x;LCduQ$fRyNW*t14d~$A;5N1is?jJ7XaiIw*c#BhyMO#I3Ci$YFIFWe!*^M`e*XvELv63}UP(7pxe%sOc5rn?6=->%R-2XZ0;=$Jv!9ReQR5h9&FDlUi<&vOj_ zcY}^aHx~PP7yQs)CzhKn-aPS3a z@)C5C189#pD4+B~8WI+u1~O=cJ!mw~@GUcF?mk9E=i&?S9&eUL&=FC+BF&(=t8S*( z5|DBA=A(?=EUQ5C0INXfi=8dWvt(IU@)C6IQ6Fe!<_E*KmM$tXW#ynQ9&?V0K{taX z%jzP~yf@r^Irj=Iux`P4>Yz2I=aaMdQKx-X@2u@ z#_o{446T<+yFjy2-8m`|y)5g%C+4M1=)CuOPB%P2M3GYgcvT%FWY`REx4x|t1fP6y z4CMR?-HetW%7VJrgNmTmx1~8dz`gm)pz=0HC8GHUONj*N2!xh{AdwK24A749PQjO; zNqW!-W-klq2ucP<(7sTQW(G#X1Fvs_&9y9KDH87dqvaAp2Z2@251rDMAB`N{` zuYp%AvhlabfXd+?Ec~rOkm?rXBGA5%W(F3+121hsf>4k0w}7rdf;a%QAhXwvrL#sQ z#quD3a{*{g?g7hl{8JC~x;U`BJPs-oOH@D`M_fS45MF(`26WAvlRfypOVEY2;z6Lh z50)o^?mhtZZb0L93f-$u^fNHw(f!%|~>0{Qv*|KVsc!=T~hVmDkfJ@NW-g>W)#7=@f20q63kJ*0m4{ zbf0eL^{~!!!7l^@L7}iP5fTcaXF6T4q%H(a4R?ZWDhJ)JIRD(g|D84}ovs&NOgZ=O zf448_>QK-Hd(V4a7zH{HLhidf4!WK7M|bTN>{niP)?R6R_@AGFLGui#vkW>Hzw;re zTTpu8f9aJ#&=t9%CtiFx_V0gp=!xbdJVF0U&jh@UqG`PZ&-Sp*PQzUE_?!BbSr`{q3k@? z{Nq1=%Vnqn7Zrhkuq@^mzQSNx&;_1ppduDDwD*IbzYTQO7wBrrW>7NCVhGD(%wi14 zVtBDu1*Be~vl--Wu!*O^Ch~;6a8mgHzZ)WcM4-_^g_%*I)UkUq$N>KB9xRp@i;elW z7qD4=D%0lQ?!l4Pda^{Rm#5G2RFO3Qb`LJgQ)R;Z+Y5LMPg;H|Hi3pn+Jx@O2l^R6 zWuqJDO6biX(*jwg&^{bM=jr%g+P7#hK2Ek z=KJt~uov=>&}{zkzw~QjiDKuP!I zGSHE!d#vDz2b4U(_lJSgN3$;|eF(>aa-$49aqt)(=mu4?H7X{cZL|;3s1*_c!RC%o5G!Hyq)iFYeoc%Z*Mp!vmmu)u2^qsV?lc-QF^WUeG$}A1}WC0_iI~ z(H)|~q74!fdwmvMqP#x#LK5LbNcs*9fAO&9_y5M@rLi0gVZqIBe7b$W=RSf?EJ^|0 z`~j-4K|2Ew6P`APx4Y+q0tnRbZ3k^j+#bxrzdf5PtusW0r#D2!aredJy3cSv>=UtdoWk8izoBJ2TY8Itfzy_EML>7C?f!mTN)BV7%pT1vM%lQWPFrvpbVILC%0|WSEUr74o-|oPb1}bWrAg&TfYp!5n;BNt4GYcBCfO-bBI0Kws zVLp12j^rcIN+*zuLC0%=5+1U@__s41cLqD3@x*awu!}pLd7!>^769$r=ilzc#=kv? zgYg98sRj#%lIqTzFG7BT5-5Kw=w$A07ZnyzG#RAmiQT_k_|4Saw zZHsR>f`eX!b%8VUOVCCPi2mj`9DzYE?4aU{Kp_fhCNWsP1;G*?y2`EvqG{4~qe(^QyKWM#?2&mEl#mXC=;LhJK_UHVCiyi|X2*|%Zn5Wl; z=|6KjDDQM0<=+mj@MT{nf@}oc1I*&ko8!s^Z3*zVc!I=39RBie4+&+myjXf4bT0xZ z9GJ5Y*mV95cwwFP7j#UX1ZYGbWIHn`35G$EDr8D2M@6AGmI-{Jj}K@bAGC)6a^%}p z#tWUtUh9L}Krar1R*d+lfbSEV0BU4{=Biy(WEh(d+B6?#1I={tZ)dQ)Q0K$Hotb}o zFiU44Xp%{!m&Jkc75{dVHva9-OvfP!8Jcn#-!Z=EEEH(4U?`mf3SZC?o1hoBI>2EM zI*0Q0EKsbzWd8I2|BGhR|No);r-EOEd4LMbXAz*nk^^2S@`K9g5*3*j>5!5he(Nrz zYX~C2^&=Clc|2kJnFn@fN+II=(uZ&o-DUL|+&+@Jp$ zpt}nLdYkWnTMW6Y;cHhQ=@jH%aD8G7cJbkGP!K8ft`1oK{eSQ7GyMzTFljHCI-KmOizprht5@wbB763uToGC;TQ{Wp8DJ(~&C zBI^YCgug`=G(7T#qjxg%`9J@I0$#jKhsyGR%myu11K*p>3G&1LGL9D~)0r4L-2@_f zn?=t5`5zSk659&VbKDIyzrxTR#)D{;r5cNZ8gK^>adx_ibbjazYtIIayU_5k7n>pV zKd30(4eH*!;R$q4t8!gc+y~Hc%q^ zaN2}W!%N{WluJRi_x4ao?Jbkm8NkxXqH_Ge8;~blR5*Iu!N*FtsIc_5Z(k3tg?K=> z;=JMM{M~I3_G0>>f8a8t`G`Pjw>D^62->^?-T&>w_P;mcf9I)hF20Nkr2-8<_4%h9 zZ1|qt6=w?wl=D@-T3hws6^MC$Blm&#n=!UB?0jptUJjTWVxd9k7e*)Ive*VvYkf{M- zFJfTIOV+;L1iByo4NGr(BtqT>F2C{hHfZ?-&VQSoK~dx!0*a!D?i>}+F(?J#MPxZD zDxEPZ3h*|bhv9*+7cTXG!CfsE6`L0p^?yMt2yDP-FZqC$1c8T)x<0G0hNDkd*LL#m(#i$(Jrp0rL^j<6R`5B&Sze1N%=MdgK60ys%`x-xVg17%3i zZ5g2UFlY_ci@gYSLJ8oCLZj1}1-xP=25zw#XeKd6MSy>saLXnB7B&bMwBQUhZ2}r4 zk?HO(0aYop!S~AhfY0j$-QXhdS{|BGK+S{ZV~pJ_9UX4}`L_i#HXmkexl{rgH)3h{ z70acjRERy@Hw0%DsXRi z_kq2<4esR<6^_>uppv8c0Ashv#*P3Kf7Yn5H2kvS-}eceJK}ru89UGOPdUi>6XZ`H z73R*L4L_Oqryb<-QDH9K3A!fj8%sGy>3Wbyw>SS~E(r#;)te799%Il46>A_L9%Aae z3U*!T0%$OU&X-|ftXDtApx+w+_u*bp>k;fju;(;iHUDJ-`S8Lq@IfsS(0UV`BD7Qf z{s$dx?eIb|1)Ok@n%$*Z&G06-;kVZ(AmIo;*Z^YT>q(#>ehF%DzPP0O|39c_1Txj| z+l$M|;I3drNOT;id9{Gb25HSD07R~E+Wtp`f9LFu-e!SY3kBB zH$ZkkE9mHk<|8t&Tg}1cD=3G*u#W-9VCPX#z6XVR=fU3Q1)$O}M}-G`#Q;mUj>>D7 z-ZBQu_a!0STXsW&g@b=vi+scRKmS3UkAT1z;s(D!_2e-I+lZ*Jz!w}4>yI&5gDTJe zJSAGq#~GXdgM9s$t#m8M8{H;5UT+6wJTS-L^=i0(b5wYafyQ%WqT@PW#K*!~PR(z4 zdaD@2U-U$So!ok$M5_4>OL$noi&LAy5d`w!(df<>pi0#6Ex4@?G9Q#)z~!y89Vo?I z_5+QttYKhafEKSU;1PYp1KnFxK*7|#Mg_Dqt@$4hfBQwycC5GjEufPGj)No_S`U;6 zfgIBOpr3&u;6=l{uirr(h~@(V3=F+>0-#vo*#YVT27=lPp)d0F!ST>~pwt6m0I2iR zdZ0uS$q?&#U%!JoQlJ|}d3JO|+yn2%o@ZrXXgmUPFLY!Bc1T)pbK-eWIsk3VwE?we z0$v>a_4|MG5rNhNC7huCUMu(>?SE|it)TfS!vnn~DkiU)L3;{*u$BDi)M;z}!BhI7 z`3*;wb?6ILh)Y33lAsm}=wk5RW>8Ao%geyPupcz%0P5zxPHe7__+P?)+(8070u!>w z#5zQUr^FBxjUey)>~H}2T?N#BQh1TC2lhXx+Xpgr1*l^1QIY8M*<;e1{~t8BdKWZ! z|Cf!w^)(9v!+y}TZ!gQf0MO*W1!z;ii?^Vas4jad!2T+20+sKUE_+N$4mAJeEinO= zg0DG1(LAB~C}Z$zyBlum#8Sb(1(}Vam!0}~S7 zpis6vS^_F^Ltprp|NYoyB@et-{W?+P*XS58FKO3AOU;)Pv2X3c;oc~f8v}6_3KlM>D z2<#0}F#zo^0i_a=EUSPQ-wGK)9R^T|*$ukP`ar34Z*$3oKmW6=0s@0xTrUDkg929@ zblfJk%=md0*lxp&{UD9r-L{c;GefgytVS{4Iu{H8Teon?VJirA}MvD};OC=~xV@OkO?% zoR&ZZ3nVQoyfBIW`~NsN?KB?|FoY)`AJE~c;N)m{5)`qZD=Ioc_t+pxl_-c|ps08$ z`|JPz7dKV@|L^?K`5tsf-*3>I6KLQ8hQak!=Tp!u)I@Vojiu-TYO%zC?on|)(CsSH z>3XEwpm#T@Y=&*`_I+Y_va|F|gB=5ZiwLM_dBYJN_TrNUH01bO`XPe7&CvG2b%az2 zSc)g?#pNyFYP9pX?SIf^ckQ5gnBL|XP#$Cn2oHPlIUAM-TfsL^{%0yFE)!|6)8lXP zU}IotsImL2&)*`;25L63glFl8y%2=k(h6Q*>3XKy_egi>flfxyl4sDwE@)8af2qI= zb3RawFVJ}$6og)&1w*b+;8kEeI|Bn~s^tfGB)7p%uXJ8R9iv`}X!9GEEGCdeE7YMr zEtx$55=Vyrq51nYY-2Y#b~P{j`5*9N=4Ws{+39)))NTR|C`xs^o&nLJ-KA$BK?`oP zg5tm16_jE4x3w^XQe|%oGbldHFzHBg%~;D!4Imwub72V^>* zbsmDuupMiD^r7J64V=dAt>O*g&QDeC_tx@4uRH`fkJ~Nivb=Ud%)q*?J5x7JEhrS z76Zfo(kuTn5=4>o#Dw+9Po+%^-+tKb0ny&KHC)9JbblsNQ3O$b+k?v~~S7ykV3E@=myPS66n zMgr88c)_;`oQRtb$aOx11~YsEpfbMGcSE=DlGiGb@~_+VNO$d?=7WsgEIT?J|MPEiV{AUg2-0{9R6&Ps;otY8 zvvyDOAx0ak&d?qFQx4h0cV6e8a)|R+Z^f04&;y;n8h$bHPdmgFdZ2VucjyNGeLudj zRB@Cpv(Ycz*j>A$`9Cv%%R!J?u3L^V>Ng)`?5y1a>chJ3cs&tOo;BF%^S4X{t%dyb z2UNCnyB+}*VFoWgp9O`!03_90f_e+CX97T(ZxKq|@@nrpW(*6TLc?qEE|sNd_zSju&bLI1ex z4p0xXyL876P&axPh@<(T`5zO%{~^YM#~2y9U6(+;z`swR+xG~#hdi+(;D5`d(zo5N zu- zg9f#NdMA58h9xH{Lralvu(ne6Vnq_X`pfkM>=%^4ca58(|Bk) zwIV&8YJ$wdl1|emG}PGr)8lWw@$>)xh8ny7dia`1 z(&uko0+Lk+$wFFmkjQzN4r^b5DgnlD9Hq{SduKq2-k{TU4Jb{3j_fr2|8hQP%_GFL zvDu5GUL&ZP+-hlrl$slKd&cAJ_`mbO5UGoBHa3Sc0c09Nq?qq+d3p$^^ z+jmXp^-k9{osI%8um1Y~zq|HGx9ghY4xqft@Nx_2ICtL#kgWK!2(-}BcL|gi^7sFL zaJGEC?1h`m|Np(sDWJ-$x7qZv;&%pp1 zbm9T+l55VAU@SFiuHs=TQR;4)391UL12{@Jx*d2d12{^590wKlpi`E>lNq4Fm*|%h zSQ!{VW6-d+4~Pbt5ALr|)&sSElj@D8p~Rc8?0Sa zEQ$-8-|#dakO_EU>J5%(aCC*JSaepf9CrZs2RZ{dpn-YZ0W{6PaNGeh_m!d0`nJTO zx4Yrh|Nn-UKz9;$`%LGs^ii=WG6xSIfG17XY-YIl=Rf0JyZ=ui=>yU}fwoQz55NY! zn}0Eu>4012rvs20noxD134#OQ=1=o4mhu~*gwdU&!qc6zm7%$2Dg$eYCgaaep9w0> zhZrqEr=PVJf-a$6-298Dd^L)~((B(2GM7&8=HUk^e|^6B7hBoZ*X_-}n9A0@ZfO3+ zU$*>Z8EBUCmu}hImpNdTP}$^{pta$Rzd*P9m9@PDEt>{iW!VNkx5@oK=uqcUzUE({ z{OzFTH~6&8-sY0);3=sqpu{wRfq@~QxA`GBG2NN~PfW1!a7cT1p$;g<4Q)XqG~hG; zT{${iL1U|cL0yr9d`i5AwvcO0|&!@gBR2OfeTX5vKG+YL7-v(W4*2| zpd~Mzt)PWqFG4=RRd|9c(J8779~c;H85}@&dV;QAhr|qM5e!&IYBvLD9Slk0UjpKoW(zg`R!}f@*KPn0-L-gt z6KrQ|3Ml*!l$5vr=kHqzT86hZ12k)M?6n{$nM}|;&Ug$Y)dFtkvxJBJ2g|=OfrVK8 zT~JZC6=X~|SPBy6FP#1U{_h3{KiC_kV%-pzK>E#42ZG8^p0F3@f51WTQWw;Sg_Nw| zpppOc4{AoYK&OaG=TvYQX08A&-QodtC?D}}+rtg&{q_1-D0ZG}e8}+O|9{O>&Cfn` zUhD>|wmefJ)cA%$fPta8N97McXwB)F(szx|z>V53t=~Y6T9ZEvy*?`Z-K9LBcJ0Ft z0iC@di}<(o7=s$^LI1acxV>ArL2dUJs}}tG-y6VsoIyW0GPrXpD71RR8IL)z#DjJv zH}3{dX_oNwZ{zFmVEuN839`l@A_|h$z(&1LgLoJ`VbWm^p3YVfUapay!3JhsF?-sCvf~P-4Oob&wr3EftQ=0;@x(=9;}@etlc$Ye>!Uf7<(%? zo1g#D{Hb}4@#4XkOrMv&H2VMlKmT?Yv47pYAit+|x(NPzDGOS-<{d-Qd|79#M^8Ww(-|Ys9 z+U6fjCA^@NW%lAHq-+Igeeo8|1`W+aQxHf=8Ow{S-hZJQUmpck127Dpj|Z>s2vOna zX3%DWjR!-ugXKYM7Q=#HBx-=%{Lunbe!KwZah}dr3s6hM0J#Lol6&F)?BD23w7vOHFLryH!k z8*E3XLANVMw@W)mckGi?V_8t$!Qa}!1@5{cXK9EYP?fJ2_M#tdJl8h|#{K-Q>p*R{ z<_QzP*BiBfHvM!rH%wq)=xhaTz6CX2LA{CNtvdfe!>^F}lNXXp!AStpdye5`VCekR z%fki@ApUJk2aj_$A7W%YZh5ivW9$DNAf5a!Kf1w2b_Z~DdkAz+H36mJpG^F1p#7Ac zKMXH*_WJz$|Nr~P?p6@pxzz@w;006X#m+;WKRTy^g23?7cW?moIx%)n1*-ywOfQSW z!3Rv8tpT86(G#6NJCAp71sUJVQr~OR#=I5elh-m(=S^VV3o?p%D@e8FFaEYapb&6l z0eKa4-?}AV>0QwBSFmF{dp-XB{~z!l?3hlll`nWCz%c}IKsQ)H>w(gh-DMn|ts0{I*(0h0Dnj>&f-bl^ z-Xd!7A9OAg14Hug_xjF6CN{>fIlth*OvPiHU4f3MF5 z1^wR&3Zws9L4J7Q3MoL+CUoxw#bxV%{?1tp44~5w_kgyxz2OK7e4z*`J(~j{snl|} z4~TJtp{BHZDk#B%8oms@E>{1)-^ya>y#9YH$Q;GvSxi}s;aLnXLVkl1g#skufGR7y zUS5R>3=F$KT~}+cVVxJGUAPVSdnbZ6S3&}KcLyl3fs-7l!3;Y192!xedLKR%A9BDlOs#RFvLnWP4 zL20)6!H4iLn4?o?fh+|JAK`&`C@26D`7b_$CEpb zfMbHCw;2@00fAY}FH)X^6@i!Rf|5)3WKjCq!N8!v06K7i!SaH1Hz;ZG`&0+K7rQJI|yV~spK$MDfIFvd8l0&4d!K-YR3Hg&G9uxOeckTtnM`x?SzyJRgPjt3|b`gL^ zkU$rkcY_OqgAZ7`x3Gc?>uzBMW$sRJp6nH2>joD~kQDV=2-NQK=jr?h8jZ3BwW-c` zyR&rrb1)vXyjb?M6Rfrytkv=Zf4d;4uIU98Hk!vEX_wi&^Aw~2J@|;FdkUmDX}Jm> z;CE!~+;VjfsB8o~37R0mg&BX3FQ^0p$7}0>3PD7kyY>kb51^6AESnddcHjg9ZhW+y z0tFVh1_G%zcp(Fsi0FhAp*)}vZU$9!y?eoSZU(UpZ+Ei2=7f}gpnV*_K{K2=}jODlkXjFj#I_=jf(EOXH^k}ymOZQw*{o2V4uKU_J zUj7GdUIWiBcmC`KM@RQoa5Q}5Z=DMo*PRLqrp~>fl_`*X+IayfQouFw_ZyvCRlwl` zDlfa6LFpD!jP}ma9!f9E~!rvARYETz3LTYtu za0yat)eWxdx=XkOAPJ~fgwgU^u`(pVcJBol-FflgLzZq9e#Q@$;KW%x`(+rYXAQ1g zI$J^Zb%TA-3@*F>Ll5zUNPwN*{D#Hwk}^1f1ZjQYfU6N~Zv%?&~aI=?vho^ylGk z4Fc7nU?ot?Ja{_Yc_3M!^AMzj?mT$#5eqXoFkW+l_F01K`)(%75ByD=Knc2vL-PYO z*iWFXtA_+STmFJlP`A^U&X&KRlxzvE+3JsVf|EYPnVsiff+pyi-*7-mtj=CgmV}mD zA0b_^Zm?MMkN=PYjK75)>}8hT))-K%gJlDtLB{-I&LeQj2lebOf(A3Dc7Pgmtv&z# z|2GDgD8}Hzg!2M_>qd}#bH)S)2FunZ|Nj5yZ=DYknF=ztyEOr<15`d5H>*rwU;yc; z2g`2(n+Upn!+3JV1O^7<<{GekH`posElQvR*+M`myF`s)KdAZiazE%207!ZO*F2C2 zgro|{MS|eOZ+Pz44|8IEUW&2mq_zlYqaF@IL`k((9pblq1Z}T2dFZ@M%u@lDmP8#t0I~(N#nNSh!(mYW=0(><(D>DH9S(-z<~I_EO$j`P zw?X^+Zq}%<@ox`NVe34c*7(?-Kdtf6fe)OwKsyuIZsw@49Y3UCFU;}HiJz&&gn#>i zUXi1qM%BRw?2V5Y5*Qd%8|1*rYh8>AXstd+e<|Nl8b7dLb8uLJdCTvR~oS3!M* zQr6}p648fW9OVEF)~8K?xWC;SbpL}6WPj>z&?!fqHyhu8Mx%Q-By9Wpf5&>z0+w!D zkO`f8R6u748~*RzqtXK!-pWzo`Mk9A)jrSw$#KZhU;qFAuRjjCu@BU7=sexq16G^* zUlcS>xC3Mkl-+rF#{-bz5Sh+{-BVORoBMX~F)}c~lpMDOb<@jjz|H_)(PDV1^Cj3q zsFLm$u%n=Jc%{;fM?jA6giPUqx>plk7@Pk8-+BD??iZ)nAzp`c`9Sdl8vkp2;{z&% zdQ=iXREtUqh+3lp>YjA(Q7Hgb%08gW$RVfUOi{66WMDA71nM@N2bF$PR6vKQ9()A4 zYg?r^;6ML*hzR4U&JYzD(B*M$po+b_1*{Hq3lAs?kGrUVFR}Q31H9vdMWxq8#RYVN zZZGI|deF)h&^~bR)Gf4G3|gNh0owdwcuDib_bp)4n%}Toe8IoI1?uq1l4Ph;e@ma z%rYtKzBP^e&TPp z1Z|7=QIW7bRwM~Z``sQtnqP2$mM?XCuzZjiS)b7!?-qBCX*6SHXiw{2rf~AxbS}REnQ~ z*7t$7BUm0Q(d>rAPp6Cu<0nu8;oru`zfA(PTJ8X2M;!R5%4?;sx@Ap5XtWy`U~CBH-bS z)&mt!VMem3bngKh&UlmYcxR1@h~>djF_6tZDl(QnDk9|tpup^8QF*u`=#c6>%=kg`mF2;*kNn$QRCt=- zGj=dr*Qf}To_swWEYkTKA-45(b9W0keM7Sof9otp(5f&{27wGMl&CR49na{a!txSy z+$Yq!3E;64NLYbxjOo0^cn~yJ4PK)Fns4FX#sRt(?+_#CjQ@!L9bW&fT~s(qUx4++ zs0dhoC=s>%%kUYa=zRO>N!B%!Yrc#c4{g}2$CeaL7S{TFn$K58mQ|*^L^Od z$5Q$Nlx{!?AG9tDmiGBOxBvP7AEdtQ+LFW@(eP*eNYrMJ{7128dLKCwU~W* zx@$obvYozrI%`iLujUAN;W8QA?&);B0P4bk?)OYx2wH^)s`MAY29)_XPM$M?f#LXp z4|c*F-2$DiM?ia(3_(Su5oouDI;c?m-&uR5^E#}(-|2baM-gd9asdFUSSmlc#`2BHnOx`W^@f z>I}W|BEt%7N_Xg$Zr=l-EfM@J=Ag#D>ycg?@Rq%92FpVwe4wHrAnb)y7uaXru19)B z>^e7t3_A|mbjEPp#SXGw+@KqDAS8RYuSo035`k{l6QE)pd_=lnk9e!8Z#+liChYb!m9= zC1{KSlz&0JsnR_!_D%#l7PO$+b;rv}#6WJh>yB>U3!tHi&?~()9E{;FK0WyZT7KF1 zA2e9q9eSmV1LW)^&<=ig>CT6p#~^Dp4uS@^aVIhG7_YBZTj_;YU!2hKe zUX;B9X%OfRz0!K1gtwca6C9?kYe0i~Z+JRGuY|uaHh@JUXm!R3{uWS;3Ytg>y%PQ( zlw3}{NC4RodZqb@07N|Of9aY3r6*q8cmvv-4HADD1qvZhxng(#)B>nV1b0zO9$we zO>Oou`NIIdgcLj_QmBvOgOa-L+7s}!9u7*V>pMWffEI3D?a1NQ3=TKfGhqSYFB~A_ z_~20EZ{Yy-%|X}Bw}4JF1E-G@ovs%^=8BvC{on0+p&J}FovtTd2LJv4AC_NB1)CvB zbRW3u0FvrXhByE`%F+57l&ar=b~5R_(CPz4qCn?yNC1PAS?ht)GH6PJ z7KR$FZ%Y+ltAW~2pw+}0VJ{BVfRjh-fl{^x8#~()-R7e#-K7kz-%4-8i>&ep3ulG;r`~XYhC9U8UV4&n0@Iv(=xG;E`2bvLs zfy&7fkol%@4RsoHVS$si0cJ*9eZAF~)9K>gMk@wa4x2Z7<`z@Ph&fC8QL0qOyO{1^OU8Xw4e zYVsiOaU4IiV66}bxa=Qp8gyz;caDlnC+HTc5)~iB zfkZNf|3M2cK||`tkAwaHkAuGjbUSeKKLP$0Cs2hG_YbrY8nhq3J4A(}mnFKlrRl*o z&?;yZ&>h5}hW!ivcF=yI&KHK4zMH6Y9_>8w-9+U$iwbCESLek}P|NETXwkvqLw2o0>Ddjlk{NJGYH6y4!D+6x_hk@$Ig$MG{0s%#%y4DxAa>#i%RF~W*rsAZkHC&vhCK1|3E8M zUM>WUvYqIB1&K9K%d7JuETX`>8anU3KK#Pu$G`uej0H+>pz^!Jyd_cH2M@1zR#CTEv2Rv|W`Jz~(^H}G7kp3l>?@E7b9_wW>26Yrujluo(QeN2M zGZQ**yngoL`1gOXD=-oEdBE+n0Na=HzeFVmgnM&T96QZ@xfo(!`1gO%Bf%zsMyL!r54V0R;cBj6NrRjP*X=FQ?JUq8%mbPL=mM=dI9R8* z&j54|ELT8K(2Mk&OrY%wtp`f@yMqO~y+K=(I;#abStf!jjl-aI?r%5({}+n{1Z6S& zFP3>R^#T(^cd$(J5rxi!-Od8q&JvwGP2J8C-A0|xpo#T@?qHtR+#r1~7(1N>N)oz# zn*Ow&EcwvwEYN(+;B`ARdMEV8H2nefHjT5m0)m>483et!bpz~}PG+dxkaDWqfdlN| z-hls|!Jw9CpE{`P4mu74TwpdIGdS)Hx=@cH8np2kHoP_=G#qsL&#~Ya!knNYc(EjC zHXU?yDd@l>XpFR|WUzqdDtnuIx1qSyM?-Q znm9sV9BKvI1lo_Hd93vSXi44?(0x!Yq6{4@V$H7@n}7W;{Qx$tbQ7o%W9_0M0o@M5 zrVVy~cZ*643j+hZypja>+jBsBnm`c|dpK=E=b`3De?hyUTjT!!|8Jw$yGF%|g@J+J zHAh7T)VuIekqLcaj^Pyk7E@5m0@P1Mbq{zY2dLa}QITkV!*U!H#E|Q+!G|-0cHGE> z_O__Fv4D24t?PmKF+@cKyz%MB|B~=yEi51xFo2E(2i5ryQxLiXds|e(!MY0&x%aAKrzAaQXbR`fTqI|6@i!c{{8>ISC0X7@fyT?uNUpq0dsr6arg2asPTL7^S}QS z!h#KN^KavNEeTEV&4(E^Kk#qkk!tu^SI*sXvV@O+-$%<2<U zco@nDl^-wM%|P|P7zYDnWk}GtFS9VFHrJEgM(a{LS^3xbZ@0^Ottx(FP!kJ`1P)3@b?+fQbO<|7LH z+rXMZEx~j?28M3mmTuP$u$iDL3Uuc-sDa)cJEidfyQSH3=9pOrAtz~8NRuAFf#JDy+Ld8aw~~?``1R z`S*Y4UeKDlPS=)h*9Opt<%I(;SerjEHa}o&{l?#N3^Wo@_^0(-XK4rj{8o@Z>Nr{s z@VAOGF)$c@gDk)THAS9+#w);Sq1zz>B=A#?fuTDonLiKoUWzP&Y)lo~64UmN0f-U|?W?q>a}9C@K&srt=(V zJgnLT;;Wb7gU})Nd^^NgQhZzU_6z@NC@x%BSrfpkM^2(%yDK5ZkroJ7PO}c&&;rNS+o08b4E(NO8zA<)tOPB$fCMsV-XFZm5tPW4z?*JZ z{+D)i$4<#o_`elYQoOM70QXm{T|4+&XK;c-Wl48w$1!lyVgzXe9a-M(+Q7dpfalvG zhtj;}M*{pUphcw06HdA`M33d zXDw=ScKiST|F=U9C6f>-TAGW2p&Qu}4^SLJQ?!jd!V+!JC=1;Gpfeceg2K1Aju~_` z7x=nJaBx9SEz~^R8QaqB+S1Ll0mXQ3P+&lf|Ifj|&>O|l{PTZjgaH4P1D#x;JeSGA zz|ee*(ehvEfo|7^Zw@>PCAtlJL3xs)1T=|(7SfZXzzf~MA+5*3z`%GMd5rHKD40^e zz^0Vo?(ePqgB(2k{dYmLw+}$c8N4o`doL&&yWK^s-6i;&KglvMKtw>N7KV!)W6*v1 z3#1ldUNb1ILe|9gHiJ{FYs*W}-5Zep9C&~UC57CQ1iSm?&A*`Z3`&;UKu7e0lBGuH zR#1ZM-U}kZNwLA6QS#gOYt7I8HQ2+`B{=OuQ|E2aW(DwiPk~<7CB3CrZri8?^tx^c z$YKe55q}5N^i$|O-08Zb^Z3EXti8?$J6$`vV>fi(I`~Vz^Mc_G%?r&3O798tr;hV?!Tf;$-8lu9FWSMVlG@Lrfb&A*xW`zC`bK-Z359_H4Q zy^iwyo(B*9VC`%LRfL`3-1_aHJb$Z=7z0ChXiG0k6KGvy^9#lb`OeyoPT1~@vKwX zzB%v;bi1+ew}LM2?v{hqx-6ZpCk{Sf>Xn%p5ZoO*CFsS$qJRIpT~9P05wLXKQD4U2 zaseC!2b$kAT9>x)w`>G8f?_u`zZ2*V?O+b$Xnw_Ld8_^*ct2jr^zJy&Nn}vNUo!=F z%k{?08)8X4eCtS%$-G3=GXLm^xigSi0`0n*?<*XuPe{ z^}xXgOx>|l0{)jC`Cq!{g$CGR2f9P|G#?S*-y75Pr#Il=!AGpkpC9z{2!qFmI(<7j ze>T5oy!?n0+zJ3WxYZvt;tE-lUb><6KwWXS?;ifWC5?Z&1v|mv)cj4pv$O-$yw3n- zf6E+D9Dvode&g@R69(-zxD2{da4UF?>8I}4 z72UoYKqc)Veg=l-pDg_SlER>p8zg<)bxj&5(_Tg-97x*jbz<#o^#Qr0w88K|r)$SI zHy#dtS8%%SYz+am=~`W2P0X#J>a_J+i822+w%&mM9j+~g2O56WmJ4@-lVj(n7wupE z|L+8A=-vu4wbzA>5o$iz7TZ7n|J(Do>xwZjSl-}oQUzriutf74p6=Kwy(X=o*^{sr z?@xm($Hsr4DGzgLQDgT^|I{fj&1nn%)?R2*S!}M zqM%(Aq9DWPf|~coT{}R#7<(&NIwiWnA#Qm4cxwbS%sX9MEMr^h#VqH7QU`zEX3(^M z?G8r%zB!=f!yiED@i@zi`uG3;cZYU#y8mgtRLa@>!+^hK4hI7R)NISxmb!hfFTv^= zX!(Cv2C4kN3dxp8<^P#Z*N&IJL6rui3hO)sY8Yth<@5Ld|GVdc3~jw#Dh`^6 z*$Rr_?${|W`lP}A?%p!!I;~UR|Nn=CUw3GW<|j}A`wLRvce}RmZ{sn5H3UGXF7!q) zcE*czaDdt<*GlhoyEb%Q2enf8TbjTB{|{}c@VAtG2d$$*Zx^cAfs_7AUyzO9`kJFV zc1j@B`P(GG&TszlpMT1Mm+!y9&v=~x?w|>PdR(A^J=Ye{ux)SY70@vty{=2(HGSwc zjF_GPifKXUvNX^>Mo>?2Dk!f9hQAP90(MR}m=ChHRqg-(|1Y0`+BR6)K@6Zo0d5(= z+CkbcKYjiGzdKH#yVwBIYI*4j3imjH?#)*~WfHiN@^aRf|NlV=thA-`KD>{C*>h{% z&d0#e+in5sT|j#pydbt~%S)F}|Nl3G_NBj^4>BL@2w1G_#&DLx%V^L_wK4{HJ$Qf# zlmuN*G#}zXsSP)0gKEPg%|`@43qe3T55bempbFA;gTu?4(12@x!3>(PI|b!V=yu)G z4VvU@4F~l!-2ZgCc38K9GJGjpxBHJy*N)B)FHXGv{~wfDrygqlVah-Cpu(xnYo+Gh zzB`(KGV-@91eN%q2U;(c%6EruX+2pg_*xoTJA%gdUNV;OG}m=IJkBIRhj(TxH?aC_;xhEV6>^_ZwH+> z(fQ$p>pMgZ0;+gGo$sHZ_C_zLrr``#Jbu|GX6Ev@r2$U74{PjsGZKFsp{edmdTKjaVoV(Pr8 zd9d5HW9Ijt%?AuRLpwU1|1|&0t-szGx}o!4=jGvCoW22cmHr4Dq_Q!l8A)9b?cztgp)<#uTp$OzvSP}zL4 z&a?T4L5WLuFSxWWZ2^ssPXZm@@rLDpX$!c?2k9nXD|yc-7VG=Ua|fLcSKdb}Il zbhW(C-?o^afdSGZ=>*ruo%cE~yjBFKA4~862!BfqBLhQ+1n3m7V=R{6`P=S*3SBvC zaGR#|7Q8q6e=8^i0$$XngZ=;dVlSjQF#*!nX$H468KHd}P(zCsR4anpKaAbr!ie!i zr)$g0Z=k9U98ch4pMRgg%M~c&EubQgg}+rq2sB)|1eBh%K<6y{FyZeL2W@Q#|I_RK z2h==n291$|cV8Nwv<7btEme9s7qr0+T%R3h08P(y2mEP%!P0z?(ee|2O9SX&i(i%{ zPprXZWT`B~VXY_Ygqzob%1cIwIs7f9AeDz0I|aJIDj}sQOmZs^1B2yF{+=zr{{IJW zu?L4I$lW~rEwv!QmKQ%^(^sJW&wp@(yE}Hue{gR<;DtpRI1pcUg7%}`=I;<-VPIg6 z?FbGJ`(N7fqG}hYY8U7{*zLLlRQrbR=nmb|$)O098-08X2LJjiJP%6-VWO9)g|L30-ysD?%!DuvH7vxT`vBgH1!$6Lp)$PX^ ztxG%jTl_$SMi3YAYzL3LmL6+ zm(4F&ERXTG>$5R1bPF{9vMhOF4OYqDBm?S3gOc7$yC0zOB4%(06I}B0w={uL7wA+6 zXzl}rE2JQ0{qg@l_;P#b7##k#dOI&@9s=ZXP>SkymU-#=1rkgXy1_jZXh*a4b|wFD zaMlK`5!nqQx=UApR@&VG?Gbd{fDvxJ1&qBe5=_Wp3+;Y``$R8Gq0un`JPaBMstMqQ z{Y3N;%4?uh22MBp&8K(~g*|8(^rbK){53yxeg`c@1SK?3>I2oA-QYUswFD@@L5=u0 zkq*#7Vb--B{4I5#|NrOTCSuv`CSvU-QS<Z@V~SJQXFJ&V`Av8-EiEs1+>Z$)O-bpBq-v*Ma1{}Agf`8M7Qgd z&e{#V8^D7|GcNr8`~SG>3Qz*>Z2*rb%>^asPH?&0`J?lD=dqWd&9I<$=o_Byt)N0M zC^(>-z1O9UBOvg_dXU||JG#SJnvWZOdPCa& zXrAETD|PSzYj1&kx9f&p59a32@|yQLV>>!OcOJ96$=?DxAG|k!$?`IPA7~wCb8ZWx zHMpD2-vYiV;TwM+Xhx>_y?|voPyGYXZoAMO-LYFhM*+QHvOL7!1FEG#qYYp;!(1E` z9Qfk*RwjmS6gPuMCVHLz!rlB5bVfyY=?TbKO?T-LNbLwpE)z6w@Ne^N>5lE_Jl5&D z0el|H(R?^J8xTljUdrzW@LJ|F`7gZvx#9 zTf*LX>}4{@1aL_P83^nSJ!2Wt_k+LbDrnKjv6s%E8thwLP8Jt<)#;Z1rAJ;w?O13G*>ZE~dV#ZF_9gr4Br|X871#kZUhm3@QQaE_fbz<)Xmt~N$=;fm~;QIg|MLeh^+XW(C_PqK3pXdp)7SE5M?(LM`9TMOPM^;du z6+ABmYTI-@{{J7+8h;_pc(D1QJg7n55*QxV4Ic07W!Vt$V(um;hVIx6kO7hI(jAO9 zTTk`|%JX|(Jot;1@fvj0ymSXBtF3+c|9@{CV`uG-?%FM#EZbksdHMf8WKe4wxRneV zn(_aFOwbvY_=ge_tM`w+b5S>c0#UhuYH$+O`F)JvxuS zJOz$PP!{52U|;}OG>CfVWdvwIsJ5dUX;ikw3eXH5|k1_ zV=bUiF+A{+^9x7-RP=+A<}MKNQt{RQ|IntVIHas?{l-84V8c(w=4<~u!39|Zc$hf7 zTY$f{@hd1I)}-;bmV*XfN*lmKx-D5C4!HE__2aQT!QUDQQdh@ez~AZ*VnG_RFP%Z7 zBA|9QBp5-i>iqt)5flS+!4;UZh_$l>e{(IU1%gt6X}{bFYU(&c>+qMiLCv!_99g=M zp)1g++7DKwHW+A4&h^Lt|G%8|2Gm{w_ZX0Se$v|D8ueu$$Zppu;Qf-2^{lDK8I(Y? z=cZ3U186*9FAgw*N9!PCx~&KJTin6P0yMG*^1w^cSO5PbCN%%S=3_y&Wf?%6_af&X z_z(|pNAvmX|NogwTV8U5hLqm0p!P_cwIJ@w{P_R>4saTA?SPbx3j%sw&tx$L1RQq- zP0=&Fc(D#tw1Udj-Tfd#T?&x$qpn0qHQk@E9vdi!QLPxhqW2Z=4cj%7h1B{xtEDzPc>kQrT z^4hci{|*0t=HK(Hv$h31qiz}6!r$8o8bbqj7a-M1Z}I;i%@3WS9lbVt|NQ^|KcJVz zG9d89jkU=6F!liBdCd<&0pWo!_Jbur{UK03JfZoaJEZ9kXdIyew1MY@=8c#6pnGA# z%^Of~cOEyq{SuUjp!uqlv-vj*f6E@wm^=Fp@Y0Recc9SY$kGi51>L(oaH4?pE?z2v z7GI!b7tmoJ-6+{b;bqr*hzZ&+K`ZLJ!6Rjm2?!Ff4K**m|#y!Yb&e@K_T8{Agw2G{kBhdXb+D7^9if9EYoTkB=$3y`hQ zG!0Mv>(s&Se+jxm*YKp_CBp+RtZ)4P|1toa13+^#0WYHdfz?1-L!cE3XWsw+|MKVy zNW(J#QWuA=0oTPZn|^?-LCO8U7}0Wn=ez&^Usgl)Yl7=sh^t!<)EPrke0S)U&f1P% zo({tU(3I9~)7WX#1lo~tfKl_lea`9|I^obr!I|Ms+zrqa@%9&B5ue8(bh9 zcWDDx(!DXvjG(bG*A0xIBY#|{K-O5Lb~8XKcTk1Jznvu@O_hN$t@#HdsBNLpe89ES zbqyqKL!#p498l={c7R$Aj~@O151Ii77lNS4FVL_6I2V35{06SWA>lX~v_SU_N0!1% z(9#%?n0D|>(0Vh&lZLln9s+L*;>c16e#!D5)Q$kvp)UhL$5CxO{qO%vjq5-Ece_pr zgY>Vn*m@fxc7pFXFji({===a_pn!Iy9N_3I_+$B_jHCIu$V;}@|NnRX15JxJ9~aO( z*7@P!4<=~qIm@8=fJDHH5M^+xetG8=Vsr&me}dN!vh)4^&$|2_JLoiC(C!xyhHfMO zZvftZF!efUrLzoVzX52eJZNt%|29x_%%--StMkN5Td3t z#lQesvugOilV=ln@1n>C_?`~0=G7qejNsKV;N`xc`JpV14A8Fo7dzR(bwnrF3{djz z2leqLFo5P2z&5;I2F0D9HMQFmw9~zF ziwbBI)bJZ2cFIt6^~9Am59!xoiQpBjZeYr96^T##Hi?WhNuWY*L%uDNdQd=g60EX zB%B8?o9qrzaR8O$g(6_9EkNeFsCdAZcS6>7c8aKgZeRx8G>>&fCc<2hGkH3FR0>`& zAe&zr1U0wYN2LH}HcsP2K=-M@TnaYv#iJd_uI&f)|GGij=R;H+Knt6vfG^(YY*ASP znjr!0v)`h!05q}K0=`(=@IYsYNjBIiO2$WB!+@#JqTS z29ym&I*);_m1(Zv0IB8Q2376>IwZhFr2wuR6d*66KQl4(_JH^1gBlfwJ3n;ZvOHHN z16tzqiscxC!Eq+gh@a(&(zl(5G(UA7>y?=dayQ7$E-E3QYm`7o0z_cg2-?yQ+M|&2 zBH|2ab%9Dq^AT(=18qD9s{=dd%qOsOKuh8~T~rD>4>ccAusm00(D?y6kN1MH8O>SU zC7=uMwL?@)z?XTOOaq0~cNY~428RFj-61L-{8JBh$EY}Tm#Db(IvRBQsQ7e%UEZPs zI>D3k7UxIR|Md)@dzm!&TZ{!67(o8B{b$d>z~9Fx!oZ;W-<|=q{2RRH8+38F;Q`K5 zpk;h6DjqNUKuhk+KxGfl@q>2|xkIPB6V!T!We{-V2sB<<0=gF}j0cpZTHZ4=Fx=Jv zb-z20Ha-QdO9d@1WdhCdxTx^J7qr%>Xuwyrwl}jgFx)(Fdk^T$76!uuHxJydQ7O1x zqms~F0?ry1-6bj|pxYliOH^#Y7gL?%yvIM~05rY~47x?R8KV*s z9Qb0zssI1GLsSgF@nv|RxeA<)KxuA@3OEsks1yYKFHs2rVQ{R8eFVoEsNCuN1Wrbl z=lI)>i!d;N_659VImTpgoEe;qPL;mx?NRXsB}E?zyI8dmDsDRRG3~0RX1q;Y&6@Ls$K-ZaifHZZ-sF;A3{cGN9{`sH3s$W_l`rUxp9^!!ZVf-hltjFIkQ|vVbGxD1S>M zNZ$qiZ4wQ?ElbaJm#7GIgG{MWiRcdF=oIV_0Hxa)6^AT_EUw-yDlUu+3}L}979Icp zeSgH#Ek^l%k;`=!KJnXf2%Gi${_`wMdv5ZTl}q3Jcu$I zlzv@QOqy#{BtRRYJosBdXN7}yWq{h}FBL$0?qTz}pi@v{R7~Lgfp0DmjEwxPp!0S> zbr5Lvb1!72zKe z(DX3q$Oh1Ye}ZM>HNt&1oC^&?$WL=4}8 zT9Tlf$6;%({_`*}fcnOe#qjGvCV~1zcW;1Qf|*iU%0S&V7ZprjTnC>|AEN@gKv#l) zTQCnOB0&eifERxJhU9J$P)x9cW)~qbI~OTtCxV;;ostGEnR%%Qat$pTeLzy+- z@o(eNgSovQH0ugm#dnm^@>S_WSgi54fW2IzA^}=*m;&xlqa?v(F>tB&(iUV#8H3?B zP!imR!UWnt;iDn~>JJ4xao3!3N-5a^B&vAo6Kyq*&= zxd|#HKo_KS2XSP%qCejaEE6F7ruWEnupY}c3IvK&ZSw~Wm$ZQ9V?j$eKb4*Wm4i7d z60L9f`%FNYy+j3c|0XD$JUTyXp3ppOd5quhSU2bzs~8mt&5xaDdwJM8PqiK>m45jd zRIQaUfaa6qp^HL4@weP%VPF8cg#qf82jJtx-oV^4uL|ZC8PH_%sh4lz>k6Ui0Myxm zmN}sH_>h7NTm$|1-^s)e3EJ(T2@n?*iQZBsP{2lk3i}up&^cosy&`KtWw^GBiizc6 z(D_{aeuqKzN^cG;ljdbmK;B|wVCc+Ik?FkqS~qP1WDi@h9_BiXAka|XF-FT06&e1P zrI5tk?X&eq>w(f!po^Ixq5J18IN^XocFKX*$3f!=|4URfyC0{!I|NkF!9-2z? zOJ-2l8k9%`K_kFEDiWj{vaNut_0a`kgqap&z(LD%j_90ob3CS98 zQDX{qCnTQvn*%_*Uji6ALB%5IE^vWv2hi~b5zPn0yTe7S!zK8e`9Mm%7<==WI{igD zKzD=+fO9D*y@6XV1#Q0v`5Sb09K?AN&EN)hOB*P9!y`ZoCYV8Gt(Sncmk59J zcTjm5$pSiyGfJQnbiFPp&MZMQKs72FjG*x)&_Lk7<^#H*@+=s%j|pPRRFHvCQ#zrh z9AoMPnbIAj5(7Gf0={3YSBDSOBxpTZs{e93=rS)*eF9CF+L-Bb7icW@7^CIa5?4^` z0kqEylq^cmA`)dfq^5-?%2S{Mw!|GmrFoO;qirB-d^Kx0oBIn<*fuFJoQRp;VA(r zZ)-t|cR=Z@vqVMWr8#J36Jj*TX4`+vpdk*>$y&PqL8E&vD)1qWm)k%qampY=A)sD1 zf8SjO1_oUw2Sl?PG!*i(52CK~1m^`%ul(EhYmLu9Lno~V_@{!#tYE$Jm&f0M=0{=i zxf0|{XnZQXi~vp7Lc$xG&nF|vYrotMkMHI;ECH}qa>GM#Vtmj=QLUWjkY3 z9A2({|Ns9EQ1EEGs5ro7TvQxhPJaI%G!(#ttv$K{)YNVU%~bYo2F+T6+M_See*XVI z&6a_Mzg3NufdN$fF8%QTfAcSP{(iX+|Nn!^lqnzn|9>e63R6ftrP(s@@VC@~L{0bq z{67KSY1t17GI0DzXuGH=fZCCux)F3_94rq)+d7dCAi)G$)dH%oKy!UDDl#t&pM%9g z84p~|wp{xB|Nl#G&x`@b6R*oOC?-XV6{PS zfOt2kuqxTm?Ez}+y)=Mo2e|{(j*5XcT9zWrm~!Cd+He2=LmSv7C|$7vM#fTy-bQe+ zZiEMG-6zn&w{Jl0ZXXqsROt5jQgKj!4WtM z{{P<%8UVyd7~eqK9$qCj{9-Ma?hRP^QVcYe`XaG6a%J;N0~=O;_nR+2zWx8dH{ikw zcK+5MZ^1T87@h>}h5W!j=itj%Z~y=AEK!kpxfQgs7dqt9P@@uJ$=?zKs-r_xc=-3Z zsDwcG+8s{q7HYO>O6BjD1hEPmnb8@;InJ2%aWf z1)3@b4dH`^L^r(o|G)V#V>i@C9TLrqj4yY;1v>^b8V#|h3B@Q~h+AR#HWeY+vJ>P% zM4Dz@+#uB!#Mz(~8)=}Vo&bulH=tgR z1~h>3IKkd~Df1KD65NJN_>&uOhz=3MsnE&TL z=oDDc?AtLWkX@}3parWxL5TpGo5AUR+X1MK`h2i;pjrW>e9D2BJ>Q{8;xPCSaL^QI zGq`UCnlE&P&KyEL}!FF8ROAx1@`^>#@LxZ&aWr}aQx5va62=Asf} z_|gEh6vYKJ4(-4J8cBI6|K|UHP{aM@z0cr83eCQt*3!$Xpw6$ciG$=5(x0<1Xl|NsBsu{*GY<_S>232LZ=T=8=KYe>P_+x!4DdD+`MW9Q%h z8A~CzV(kD4y*Q%!`~Qpm>;C?iv*Z z(7lEwlAZrv^MTqw-EJ(+$3WN3se$irEqjkSu?9NR?gx0(0n{&=yaaTL=PLnFY20Q6 z8l>nJ1+6%3y#$$ZY@G?Z26p4*6`+a7<_gfn;{pB_Q0GJQA80<$jU(X2|GVJ$gj_@o zItG@1n|L=^ZSxzJga4SiyFr$8vrGu7^&= zcpOka;|)g^O9p6m^~J$gV5v^9@t_W>F(_Kk|9?FlG;ax>=LDGnK7aB8;`~XF7{*-Z zOVGdwY7m1KTfUqD8a;rdeaQR`DE?k-fB)-0Yxo6r22e~kzY*we0EH*0QQ2+JzfHWe zMunx@WJ2pV{uWT0IPRhXiU@|zANpV!aQa-bx*TdMVT>C?^=+Ab&nty%L4T)%%kAbn~y@m zvDb~G^Ht~X*8inqVE#^kH%IHq(wChVKz=>=g9+l@IF`;3 z6|i?f)2krwZYRyV6TrqEeZ3sTzo3i>!QlC5&}Gd}_JXo!$vJlT$%_1~prflGnQ7zX zHQ;PC0i2CWyt;Q=2r@7<{s+y+^S6MGF6eb<1dRf9HiIO(n?VXYLv}oXX94@>)gU8a zQ~J;V2e(_YSTaBd#k_d<9GbpCnp+Q)&T2mY|Mfm-KgAH7zClKS=J9tz=kY;&jI{lF zHYh(J=J7#__*?8jndJ>nZ!?G+@WKVMa_S}MMh;N|^$%3{c3$O7G~1KO>jq7nAu zZPB0qz0D6q7#KQRR6z04d_)1HC^YN^Q_r9Oy)7y)K&QYl1%!vaPy~%{9Z~3>qOt~L zAM|KD?#3gaML6Jm@#5VI*gl( z4{kol1YQdPI{UN!wMyEAUY&-{4~%a$FEGBce9?J<-{*KIH~%(4P#%Y9QD{9-@y7Pd znKL|fm%&myKr=9K`LYLKmq1ei#QqoNyFp=f{4}I4;b=WsV%mAE+W~X{MCVm)H-XOM zy>0>lFBran6I9EA62)#ef$lJo&XdkMKZDFJpk5Dta7rtQZ5s z>t}HLz~#aASD^CmG&}q}t~sFLgIbR6Sb@&g6wn}0C=X0&tEy65-*|KOD?tvsL&BCRJtD<@kSz-o4Ynwjny zprSsMg@NI?J7_b+|L#_h72OP-2b&+V@V5qAfR@zow;Xn7VCbF;Ha3{0doI{jRVtl( zuYfw+RT|*qS;M1o|C>Q`;{h*X zq`rRdW^X%>3>A&xoT z`sF7?)A553K$Y9>_dEaoKi(PvRdu`-G@1r--tkr)xEQEG1`+!J)7|<4&Uyf6B|vp_ z_8$59|9@xi0Wi4%Os)Zud-s6I-W6aHbSZCV?*cG;4w#$)CZ~YO31G4ZOm=|D7BJZW zCPhF&*9*G;x3d>?*-dA!0a(NaOkM!1*#RccfXNy#Spg=8RfFf!tfb*a;48{%ryczf}2KW`U(Z5zfEuSGR-7H>^doC!xnp;63$p~6} zp2WhyU=22izZJBN^>`~t0Vpycu?~sr)-X`(6)XiBytM&Y2+0ytK~C!iC#&PfKr!A8 zwx@F|$cEP%-R>;b?i~EhFF;2*c`$bRgPhXK!_XaN!oQt|yWyz75Enok0O%FB~9it3lmt(Cs+g zV4Hhw44@AA1#ujxJ>KF9ayQgPt^y1Uy)YMb_ksey`50qwBxC1X5SxD+r{zKZR%KNN z2Fp*S2O<9Hyax$I$O#3YajL1H+}k;I#qazS*oeSEO3@#~KZ}Ynz?gT3Y z4Q7Fz3tq_QW2494o(uBVUQl7czwJQxoOXp>fB!T7w)_7WTEIo$3c|k2a(B}Tn@(c`}C%_9P_&0Jv%ccO2&M1y% zCl6z@p=iUKLIHdKQ)|cXg$gA`ssB)q}>Kd^`MsGOK$Ld zAUH6OA6oE;ivtoiol`*tX6N1spuXcZP$3SoryG(9_JYzaq-~MfY0V>~)6G-s)OMYZoLKQy%ohRtVV(rFJ^bqc)uoppz5HJ1s&);eY zaxmC$t%z`c*$?Urzu^gn1k(#ehz3YT2ImXV1#T}NgQ67PUgh8B#MpVb`SJIL-@zp; zHpQiU-&{qQ_*?v>Kus_;21rHEzm2K$BB&k8DK8k#gF~njT%&ffgUato zzMz-|)vF+0vn>NdH$(Fe1^$)_Tky1c_gs)%r*QXFkfEI+%^Z+=Jq6S@1$*yUs|Tp` zYOsha1!Y(Wml2Y!yQhM(B`E#ZL&CiE62Ipm(EW{!&=L%sKEca;16~Ne20ITFj2<9| zfaQ8CSio%e1 z*pdVM+r0i;+$`S#(Q3t2d=O^h!RCXE2tzHn%AdVn3N39w^M1XcvWgj$j9%XU3#t#C z7;SR+TRNl}7#hKH3B91 zR4Mv_@?Lk8NiPpW^KnLKO@Vw?gb<0Nqd3auSpzqD;VbH7LseLlu`^?w$)$ z*WC-s7M;I3A$Efs2mIUif}I0)NNOiHI2ZbIf|hV`fGRL>v$pvaW59oKvCugcR4ly6 zNdNP{*Zp?$5doWE{`Q@}K%shoc~0}4U4Q?Bsya|OzzYV5p0F3jvEbCz4K@N~5BP*3 zxEDIX4O5UuTFpVl6u9sJdjq)y@dcF);CYbd2ls89OSn3J*yQoIwu5RL_uC-XXoEtx z7hVB3>g@UZpYgQa|Ht6##+t$HtN;8houH{na9au1E>Z-a9Rw=;Kn=BUP_RQvrfzT( z4css9tzd-2R`Uz(<_CXEOS)S@?G5Wza7&|Qs~%{wzZcXN1epPDi*#^6GNB>p5WM*Z zG!J!x^JMo_kWJlAEY?mO{LKk)*MRgP+YN4abc188^)~<1L(RvTAbv35Z;jz#U;v#! z69Uo=R%m#j^)~uDZnu87#1qW8=L6Dm# zfXd*hpsd*mPJz&@Fc%bdjgJ~YNf{hFol`A9)%R_8QP~i{Oja zQ$bmXzdx6SfuRGO-#Twu_Clfqv_=+O3xMK?e;c^X+`))7I+}m~=Wn?Pno@waNlReU zYb^ZRBp{&)(bx>mzl@y+L388cq6`epdqFM`;BQR=C0j^86Vy3~U=-kQ`6dE$7XQA> zPLrcLG)Q{%lpxSCLn1fbZeFWW62~IIP zKuxyB-yo9T?=T`KgL{+*A20>HFgpRx%$=>EULvF>vkgbC$%<7$HCb-}Be*h41@ZQR zYcg?IP1eoH_LD{^)SM(hW`ytp`d?y1|022THWMAt5pq)N$@+=#`lY zGN==rCVNFBET@7z%inU!801k7xE z6fz8utOIJ>lxc#-OF%ik8{Dwyyx)1N`MComvo}9xf)rN#tta>x7(jz0k0lrwf_kTR zfT9~5P+>se?g6oG)aG1UhhqhQI^m>5Tv4JC`LjrWeQcia-sMZC=jz4G!0$f5Br-Kp}sHT9H zPW;=%phZ*jT99(a&V!b>N(&)nBLBY2kO(SW0Ik1{F?LP`<%JhAZ~p&puw&>3^Gc_5 zgDq}7SsM6~gAsI|DLmbUzbFiaq`SkQbl2J43L2S7?Ph?~+>nR{-!9&A4zxkZj)A|G z-3_Vu>jw9kA%g;~2l)LyG{0o*1Y6g+6%=4ELGD4ajtR*+{?-amI%owA1EHj1nDsBg zOK)Lg6OcAX_>27^U>76W94(JN{r~@R2543nl07Cs-3=b9fMj)K^Fc#_F-o8;0cuge zGa0Be4jDBA<(`+@K}!O_jqw-0pncTfE-<8l{qhjVE=bd40%-1kD###E(`rvs&ECKN z8L!*@e-6#U&_NqePEGA(>z<3~yF!K>KzzvZgCfRG@E8SbfGP;mPd^Cmryt-r$lt2) z;s1Y7m%l|ERKo;f9cVee?gPh;GPmfm-&l-$N&64&JHSeL6;2w`~YfMf{RtqF+AW>0NN6L@gxT9 zhnLnLKzsf{#Y*S#&O^=5Ihr3a!pZ<1c5qPwo|y#Ki=V(nH#o;1;BU17b#fpbH!Qul zt)LDUC+RBw-E%?X z%AFrOxVs@OW@koF3$qA($p%R3bswZoZ+^hh39hX9TVKBV{~uC(Gx4`PQUC=yEHaxc z;KetnkpnHh86ZvP;|`$h6AX|Nywl?4Mo=!@3r;jYnjbL2jGy%F|9^-BA+4?7|KUS@ zoj*YBtbhEip!+?*X{j9)UEo{@DkL_cTHnn8aX=@eMFCFdph~S5w8#bAeg?O(Af58Y zUyzp8Av#P6B&4@AQWY&AQ@yKXyHA$ffWkkfs+Eg2kJqA+Dqaj=g5kHJ<#fKA>h8xNz4<;pjUHYQKW(IsWEiZU)Gr zY8L)&0-YybFNAc>9Spy{)B~Mb0B#EY=WnS1O{$gO!%HAX z9n!qs4QalB-ER#UYHwL=3EHOst<^i2AmI$^C`|?HM^1p=ph5&&jL$Ov%MV2v+G`-Z=T54-^=S=)9yHpq$zPXC9@VCmEf?16Gt;r7tf(g;jyzUS#uwpABaOI>GLK$qlNe!6jYua}H1ocsaOh4J!H?pM$b7 ze~Tk%I2T@!ae(fz0k?fSLFFi}g6s(RcoAr&m@$Eof#HSHE@+Vj>Lx+@gzH^EMKr8l zTmu@_h8J1$_)zLaaKoY#sds4jA6_$pj+#WxQQe?cJ=W9%?f`a!D>g)D5Y|NmrD;T$ zu-m}|+9mtuQUI!^E`y31*DIai9zCS2gH#QWiU_$2`2pO81oix}bpl_@L7Vew;Qk*d z#~XBhfLey7{|D+!!uo%Y5&gdfpaT!V#UN7uFZ{(zPe?!?1GU4k_y3;%M}!{evO5Z)zz*F%uW zmzP~Q)ngy>i+TpD^EvoioIv9t;E_U53mLlxO^^lP1`_`^aN7}5gjDdiI=%h>|NAk} zv3C5ewJM<27Pv%%jm$y3{U0(w$KNss++hWmSJ8hgq2 z_WyrSm0!(;r5|f{n317#Y7A%%;}LoZf}D4FV8}b{epxoq(>C~Vx244 zq;7C)4czlHGG<^%?Un=28g$MDW!;yr?*IP}8RY2(&x%2O_A&w4!0;Ez5ThWHAfsBm zKxYA-gP!w**_VDf2bBH5)e`8s4@hQi2Dcwr_}ffDL!Wy=O+pR+Rt<1A2bI>{;Oy4z zVbKlEgPou;F|Z)0>_X}jHQO}i@wfg4ZE%7N!a~}D9u~0PlmzI~EF3yB`CAVnbb=Kj z+3AHxXAXaBJ4h$QHt2Z1Jt(rlrl2{p*PR7Y%4kA!c&iskGs+N}ml8^Q!~lG79(cn4 z1OG-Y{uYi0poQW*K`%b0fg|(fcjSl(dU47bER2YlR!h*CVXdIWFz_V#QsV_Y#e>$w zdoguFS28#;z1;i=Yy&jufO}`*FNz_?LON@pbbpAyH5Ysj3@FmNTfysS&O=fb+#1lt ztK8rJ|6jU+=EuC4AZ>SMB)i-n!Q8>90BSrUyF(jvVidUR2Wq+IfzEvZr;z{rEuTP9 zf)eISKqA<}9MaB*wC52`0z@-_e_Jo89`CJSgbXgj8VjJdnFWske~SocD%SN%=T=ZP z-FXdCmv**-hWxt0$@w^V1R0d;piKl&EB>_;Xjo)I^IA|H!^q!q7}Q;brVr4LBGAUA zC>H*02HkT(Ho;us&S=47%-^z1fq?2dZ2VC@`!Qg2hf-?$ol_V!EG&YudBoL z%8UQEz>NopUz>mY<8Rponr8v`Dw@HA)GVNoWCAU2gS#2pEn|lC`g?i67ac*eZ?6o8 zz{NQ_aI;YBjM&ZCERP!5-&R!MJbezmpkk6r$`T;MxcYu>$H(0V8tOI0cE~vW< z9%Z<=6g;}X%yDpA$5E! zXa!m~IEvt@4>q#T-l&=CmmeBMj#TcB$} z{`0q#-v#A2#DpuX(r54j+wd~{?*ISL^{xDUt#|+b$G*n(Wfn*sI5?m!AGmX2Ca!}t z9bdA7Z2ZB<-)gMRzyM96knveWGU>|#b${GI>pb|Ig+X^I1Tc1jr!t_;M92|zAXC18 z`s?6X52*HTaH?rNP-@WK3mVpKJz1g#3Djgi_a<$=tufTOclgv0VOe~S~iCko0h zt+(rVq0ZuOSprHr;ASv?voF*g;3jo9xS)r+2D~B<)QoS52bD_T9zZv^C668$&;fE- zn9PFQ&0BAWkCrZTe2{Oj;(y^W(Qq=bnqvWbuTC>mq-Lcips#CfEPWG_6xYK zW{1|*=;`65;thEF0@^u*7yz2$unqxFalDiOwc){;lo67Sn}6{0x9tKgQ3Vf#_BNl{ z_xFE5Z}TtE-jEtD28Mv%X5L+Y{|CHS@%b10egRDLcQP`(Z1@Ul*MVXNly_f-gG_~X zkxOkMBWx`EE#Rx4_JT*){`0ro2eqrgOJKUe%Wa!qGWLpe^SfN`76PB=37Mbmo(fif ziNAFg=yWqkPZD`TrIV?<71Z$UbYgkA=-L1O;CcC%4<3RX1nMw=9E6;8K#ez$*vr6M zpvVEWT_GKfm!CiX|KACo|Ai!~Ubp{{V6?o(?|-QI4F}_efIvuT{^ILqa8~LDD+iTF zre>hNHE4{tlerr_(#Z@SdFuq{^p|;{t!G3vFTu^pZgBS%+Qx*Woz4mtc=J-^_-8s_FB0-ddQK&y^}3LqmV&94|+4|GmV_zCI|fR*#Nu2lqew?R!C*=s_X8#pbEFUW=095Ztk?`2G8NP9w>1HE!_qc_?;g* z|8*Wun*eWrHy>vVdlAP4T5>ATTf)W&)oNe~p42S84slKAcm8esmKXV3_ke8c1-Yto zFQ}^Q{MUH_+MGSr-3xO5YdKH_4XTDCL5n^3x5+ghXKa4O2tMzEm4TrXT!b_qV+5bu z_k{&C0?yy^2eg0Mk;U4Pqv#0SZIHRNz)tWAn-`u|khBKoK_=FkfBY|<*Lkt?Pcb48PZ!SWw}yDAH400}z20+}NWf04lX?>}TsE@%rKI5rr2UDz3+ zUT5wG3xP+9KviAy4=(=J8qk6`aOgrz=>|t#Gw8x1P_S6Gf>TLP1ZeyAzix2z3KT38 zkRtmRNT3@Wx6qignZdt}zjLq4umAr+VQm2ltqa}Y(1tVsUn{}l9~8de^@IG|uy&KGchG*|yP|F0I(>uRI%F_n^mX{!l z!6UJdDdC-d zt&{vM*FZ@fT0d?AHReGZTtVwr__wh&gPYIbV86lNx{wWYI?Le>u=^qT6fzbHStC?B z3o<**zwdG=96qS%Pb*VwcY2&#tv_FG{0vI z2zz1W2#zjD=$GE_28TTOaw*VQH`sm9-X?hJfq$F8%Q#Rg5Hdjvjnwau;Dwatkd_K) z4*3K$$saK21Xo|3haf=)@fD;r?7R%=t3wJzh)?-j_CNy)Jc`{R0U5!8k1RtvY4D+- zuORK4&y`I0}X0WQFk2FOorrfNIV{dEa#bZ4_@y>{dEWuEd0&cp#JY0 z4*qSIAjN$1T2N`s7!>y6mpwTAUUvTjoeu!h_fi$qqbg$n$44z_P#4_rv;0wJ-FXbW zzmE+O5AQ$=_&{aei?tBLEdQ0>14RL-q-BIg0f-Ha|7`*<>!AzDA!~~|&v#yY+4}GQ z{|OL2r0D8AWciQ3EfjSB63FF;P+T7He=FEVYlw|6L6>KN&es43OXo$H2`^c}+F>Of zc&S793pP`*pCKzBK#l#w{H=O_5rZtCZ6ELq4xNd(0Geoc#mv9}Do9)NKoeZxAn82J zzwZDnv4b0z2l)L?^g8|Tgv1Rv;k)|gvO~8(aq(sojNGoXJX?H7VmkQJn*s_J!n_Euux8{SJU*Njx`%7U+ zyn@7kgDQ1!c?~IBUowN_Ao&8arUAN)Ed12}|1T{;;X}11i!Z2i0Xu_(Q5 zCD3V+*rv1~)iR_;g7s-Zt0qBxTySstJ!lXWTnI9Q^E+hm2P|WQh8iK7Aq%*m9cpk1 z6b9|7f*ak?xoT;~o0cc|TQ>57ig!@!hQDPB=vE+b4N~k48h!zFSp+aU*~0uS8w9|e zY;X&w^>*n#$dojs$I>C(3!0EF?S@$NdLg{72z!xX1c~57plW?7B%ZrlK^vjE!IP!% zlxYpF;`m#podn1VFOS^>H&G#G2fgqy1iJ(x z2}=Aepp)odraXfj9}nHH03CNe&VaU(Cifg@GaslVdZ`8<7=w&OK=%DW@(-wtJqhYw zfH!^MGECtdXd)KuRPY)J{%zoT4>TtA`S<_-uMdLSHSlN+dNI)e-RaL>{Qv*56Lc^) zB-4S)FG!gJp0I^RVlwDBSoqL)HfVqn+o}>!w-Peu0CK+k)Bpcp)}4jd2hcS@2S6LQ zQjarmf|l{!JPn)rVBv4s3|d(Rw*|E0v>Vd70!`CFRvUCP@NWmFIEcd#!wzYk7BBan z1a+T4{Z)9q0BN=|9su={KqcRc^UJ^?0BN&=dPzm#IS@!M3EDpbk6}ZqUC3I6myhrM z{|_mM3@^PnbM*iJmu#SZG`u4y1zuSVo(urF6)~lV8X|A6{{R0n=L|HRAjQj1J+P~g zl9bz-|NmcZcm=8tVfFc93H$Y4I+ zd2eAI(9k7f-Wy!Jfx>StNI#0Lo#4O#Wm-_#gw%+@I`5sw-x>un0$k6)CaiO{v3d2S z+Cx}0>;jz;_`>PP|Nk$=FM(nm+-Zg-Ewn86>(u}M{QJO7RY)Yh-~?%Oy9mlWpuT+f zUeM;+=2wipEYta2j)ST$P=a{*{vlGv4|@@;3yG!UpiJL-6V!hOXO-?&&~8h3kqFuL z2-@T%bNv5*q(L`R$mmKpc$F=_5f&}TRmCVHEU*L*au}$C`ttlS&4s3p8WqGT716@eh$y{p#C*Dn?OfYKw&(Y-{mkojN?Gj2VV35YTOin z&ejFj$p-wb$)G9^y0o7~5_QS|(us$y^;wED$+J;NTa#+5`W)u&`|p;#$(`? zVJi6AVd$)A>l%LWfzmDiL8t$JJO=LcFhKe+oyQ@Yj~F1eU`H>gK7O5Qy%(}>#zB~Y zp*Nfn+KZ6~Ev?H}VPH50?wm5BI=Kwg;6}-t5{3t01ATizMLOteqyw7AKr^f*;H>}` zntySYO>O}9sTufN3c-g`gS+4s{{Q(~Jh>PcTEBtEG5GzDHGl^Oq0M*xmPa7#T0uLv z8!Q<3TULPjpy2usl!vucL9GN(C$&``G|9OaR5A8~`wh@Q*~Z>-phN@G423O)IRiS; z*b81H@NaWxY(CD|a-j4EXiYG9XaN)gxylR-pv?!Zf5828&{k+jYZF%Kff}r-odVFf zIl$i{sSN7FO$D{BwZRD*Qi?-!5_q%4cPR!2YjDSmzeO66%RnaswlLfUT}=+s%_w=P z`4F?^A^z4kcR*(0X6UKmw!)?rsI|+eU5byo~z)AC{dt z7#K>7A%nBs0VbeDi2^0cuwAf^IA{?gwgUwX%J*|q9hp7F9M|oO;E!ZJdJ}qJ^{|6K`;C@ zz##_7PT+1!>5A@F(5`rRxdBc`Pe9vf!0C;D8$-*15-Uh@>IORylBiHqQw8{VKJ2Lp zlIa-v{lSUqFMyAqJ4QZLraTXT8SX(ga$a3GRd! zJ%N|nkS>1si>qp2Z$f%Spl10gh>yEl!MpsyMnWnHcuc%peE_Kf3wkjLVgy7VIHW-H zDKB5#0k8Mx-**Ah&42M~&;S1~b-=AteD&(0!|?pT#K2Ih);$*-PPh46e}HEyL4ngP z+*=LZY0$~^a>{v7X8@+^0;s(Q2~C8m4yKoR=TXc(huFdJPzW|Bwk#%bWbZ zmq9zad4wT-nqHA!P?Mq)JWCuD@M6_$NML~ZAe)0gMFM1hE~IP9#0;+XA=8^LFPw(? zy%Rb;{_-hk3V$!iCI9)S9(sB5#Q*=DMD^T>S=-!H*f0!8aD^i^;+dXhg*Ox?v_Bf0X%yPox{D&-#Yo=|Nk#9?E{yCkXaGPxWLQV5B~p0 z7Qp2obEt!|LFpbgP!{w;K@pt35G8JFz&%g^fu;dLEw%rxNb3fJ_JQgeP(pw-kf6Q( zPJ!3wy5ZjO0}X{Ey2XgDCa6?`4DW!t9*-~l|NoM4AE^HbNjFf#jx&fcfTqbn4gg13 z`94tR2v+ic*!KVb%LdR1-N9GE%feTGMYKg0fwpuZnzt|Iz~=(O>tPcGbiZB#oid0$ zfu`*R)l3+5al>kOU915*h!CYNHrNXaA8_q)fWP&f47@I2ht~x+VRiAY%OLaNZkr*G z=C+ondqDjaaHsHP)H)vnzCBtVV_lLiTl|v7@X`ube+s?tx4TY=_ zQU%>z1X)YW-+G%1RHVUTN*i=oJ9xaPw~D2k2|AL4G>p?}@se=|sAT{eG=MFG;{&bh zLFphtJ2TLQ`{AHf^O^juS3#zOBgXImXyN_=&Et@+1Y}PEY)IhpGYq%|lSfE*`8OY%93k z$KRZWX)DCT{M#;cgEuQ=^0#V$wShWLcn59R!8gXk+tiTO9jHEku@gPC_kiviK=mw| zwI%$m8$sF#`&Joz{{t3l3qkt9ofFuK#Y>>bL$wxCRzkK$^t!P_8qv@^2U+J_$=`Ao zbSkUTPH=e*8PI~RIso_Np((i=JjPYQ->UcF|9@CI=m%ZjunpY$0u4`rJGmVkkTk4P z-*5)Dr3kXSfWO6?6SRr~97E9cnJgd?YzY(Adk1%wAZZXZ)Nl-RxeIKlp#U`d4~n># zGeP?nAVVXNDjGC20vUdKDgGKZ&}De(Ma;(k|6h8Z17}KT3-QGXDYQ)43O*vC6?C8& zqWS*~G`9({0&JOb1C3$nJU^LeiilT7D{#)k|a{{PoJ4_c}H)ACG-P~#iWTH)p% zl|TFp3=EcMO5dse=VxHhJkolggtgg+Mx0B^eAxD{t=d0BcK)Q$kxr_e#xCF}nGe|a1l7{3x0uaYvh5{o1m)M1iS|f zG?oh+fw0*E+UWwyq73}4^Fdv}t>EgNt@#*BCz#n8!2%g`?zHIi;OLCtfsRLPI|VK? zpssi^1#+DaqW7;_Z6I)$=Vd%-RXe0Tf}`JXWj~5>t`OtE2F(B)bm8TK=je%G z{+j>)Uq(C!RX3n67Gw^PzZtZ2zZ=U0U;xCipk)=%A|KY`zXoYWLFfMp{#%2SOqnNS zwjQ)73Vk&IsLXybAEFI1^H+KcGUwO%4>HMyJnMIie;XSlXdor`ORf7j6FamF+kFT& zdDXz*vhLOY|DC_Ir-Fu9yTJpf;H4IQs-S_eUXUpNHWo$;cK+5Wum1mUKF$bQoB$eU zwY*SspTD*K6(}m$AuF#fZIN|lH0aji3`#uU=mb^rdqBf0 z;I>TB9(Z8|8F~wP(Jlh6K#<4r7Ie3Q&b368;;%tl^}yY1)M8-OM(oAIB#<~br$ILO zb^dC8$ymbNE7IRB)WP&}I=IOXZIXw-V1>8<66T;()anl^30grXV}jfOE=3_HFTAuv z-isIh;*>Dh@d&Lg;u}H12lo2QxyL|>@B*|Hl3Vrv|I5&0C`q>qq90^w%iRqioflrd zJ&I`0qLh4SlSykgfIJV%j-bA48>n*$?u~ULIwAbqz%wQt951EUf}Da}DE6=X|Nmvc zQIPOus0(XWf|gE#ietu?r$IpgE+`?ZOgnEhzXAmz%j9l`m*87bkUG20AhSL{1DSwfbM)0%D_zX`ni0U}{}q1X`WNpQS%OTV1^ z8fAp$%~}-h-L)VWf)+}4f=>a4&ax;lFz~k?2DNm-`>ne7f~M86`1F{I#easEGeCxb zm+`!GLR~B&54rsZnpF=l^0(xy{r~@^>=#h9!}4g=vj6{IUPbP92EBO34~{@^9<>Bz zqiq*n)_(%&LQd-rAf2E)ZJH5H)HO&t|AVR@F)pkFMoqtUXc6`u7x{qL5tAtZlO-5mmxdgNf9*F)q0Pefx+@Z3GX-X z6c8hS%NNLYL*&)eFJipFD~cftm_Zc-=tx7T<@_x{pevG4`eY#>5j_2yAV`Ys-3w}r z2mRj)TGf@M_oCJ7-~XMU)^z7@(4_>2I$Ll2`v2eX0AwZg=heZzbEkv41z_(6K_>Qs zp>uds4s;%SVe%Bzjuq%U2#)hAP=gyhThx5=|FITUkX{DE1CWIqpVoDr_9DTS`0d;4ZI+z8#0sppTDIUv}_RE%4gtj zkp$iPv<)$Jyb?6l0`9hgYJ>W2@Vs{GrOxyG{)Y^|LB>Bj!TyD`zaVki`47_H()Lpk)BzcF0LF*mpUYZx7qF^_?JoNYfe@J?RCf?TmegFTzoVwya zyh4J+b(Rh^va{Vm84w!7;P`Gm(Ajzg)RjHVKlOkDIABpCT=Nk|gtzj8r;kDXTL%6X zA<*a`w3Yd3-S>;Vj{lo~2$b<01DnP0@)KwoWosKKzikCIGCPldUh?uTXx{Yq|I+YI z@VeF4Qn2L7zl{y**%$ecR$22qM$7M|_aU*}4OY&-OgzVh5LD-N$ngcB_02yZ!*tF6IQjcefYJbXM5fox z0Jh9v0q7bn#4>|s@c0u0e@iVWc0q?4f-k`Zk0HT^4*!7`3xh>KLp-1zv=Y#<8JOSUVf9)Dd0{|FEYi4X^D##75%HyWp=%!AgO)Udi+QYib+PJ&h2IT<5h6fONi@*Kk&;S3K!6QNt2X@}q1}_q@Jj6fc z0OyBpusc34c{vxfrnwb#{C_uiw|Q!(#LE-lYoefipP(0PZ8dyV75@@gI|Q=m_~o)YD6PHsi{T9j>`ni3i~s+J zwm~72*TK+q1Z`n=f)54wZ}6h67VL%A10|A>_9k=-0yAW0_$B{#6pPCigLd45=7V3} z0nLv<8tM=$pgY{ad;Wrgpcef%c%clj0=AsP#aJDx%u}YQV!bBzIn5 zyZ~JxkarYOZ(-|5%|kP>7-k~Otd}}RLDS>l;PC}*XGeB9Xas=2#Q}6!CukJlr3H9b zCVcWSVIgQ>2(nvkQ>1kp$92P=Z%+L z+X=d3-xE;tALL8O*iq+2$e0p;Gvis%-eqm@YC6q>&=v*c*hl^rAJ9aF8sb<8?71#t z!T?_f}9~H@^T4UYN9Xv%L&| zO~AO2`Jns;Pa3ZCL37t>6VfJxhXr>FbRO<5V(DfAT@KCN>vsWk+r>}NiEggW>!3TaUK%w2?B(>gjX9(LmrWItGF=h5)6;1{C7pc{ggCWCGWlIbo{G2q|E)?4wv!$pOs z^M_4snLzUqna&H4%YVS*sJ(8Co#*)Xfo==)QQ_%yQQ^?M*8GMgjPYGi=!@+qz%4w> zub?~R`I~2fS}bmVn%}YX2L9=E{L}oNvD5?VCCjhHODwOIM0C5TnDhqz=yd$i?V`fL zzm22eXI;5d%gGYGW)~F>M*e+2J1>IP`*)+7Q?lRkD}Qr5=+ME7uOEZvw_Q{?Ixq6? ztN8!=3P^qP8y3y4p7pVL z)p;y3AWQE>m<^b(5fK%ZrSrnW=HLI`5*3HeSI1pcOhAVPcDktO9Q?)9>!M=NS)!uQ zSpvEtohOSWDBy*6H@NC)IZ#s7T>`rIoFz0o?8VdLe?b-7>)Fi+?_-~9Y<^M9Sv$<06Yx_wk6_+5QeWL~#+*QoHkp7r9YEhq@o z7{K>~g}%7@|JVP(>c`ybZKU*3z)0Y+3NEh6z8U(nCS%FmDRiT#CK5XvgbSWYOJjRAPrl0 zfG!o@dINMd$W{-q2|)S7;q?tpVu(-3S4?)MgfFSp#EdYsvTj|3L#Ovp~na zwStT?{B|5H3JSjCtvTQS{}%>DMr#4c0Y1(|2kJr|_- z|5lJP#>>HBfiHw(7#O;}C7Qt|Gd3R)U_92%*m|HOu6r&>hvi(5J*5Yl-|+n33Nos~w zq#Nvw&eNa<2gsqXHKF-9SfkrnrMnkwzDQelutB%8N~cI;^I;Q6(3E6!J1aE*_+P?) zoTUvEGu_TIs9c@a10|q4t4lU_d#gZKL3Vp{boPdTQWDr?#*2)f0=vNiK>^+EJ+l}X zf}0PU{1@qHJ|Y0Ir*ua5Tu}IfmXWLn1%#_k=T?wQ4R3>wUIiNl@-s(gs{A{qChy8#5Gybys|L8Nn-0yBTm4gphn89hO zv$f^>|Nq}ybr|_uPpC04@Nb(d0ukVV9NNAujF;c#M)Mn%=11>4Z!|w(Jotcx^FoIk zZ!cJ9K-mAS3E%(!f3Z6sGzkeBAM1<2yA_nutic%rF2@FyL%Q>)M1z5$H}y;B2S}v}$qs1~Y}r8@ z8(LaHJGuMvLAMl4VEFg{f8(S7pblHhMbIgz;9Syq^WZ}k&{9~N@BjZZp89r#gTJK+ zJY)?n7X&(|f+U&`v4A!gfSBD3oh*FKhZ(KG(Z%0X1>SEANpse&BK&O+KtT>EMz(_T z$?=1r(v|fEXfJ;&!}tIHvt30@I(x5x)^hir`3Aa698%PF9_~D$dAhg%$G*S+J6m6X z<&S_ay6*o166rkvWA2J?z#o9Sn z29%EDK<5}COR#l<1E3R}z(Hp=G(Tj#@T#*{2c+oWftTzZy&7O<^FzjtUQnU}-3-VG z$rha#`L~7fHa}$S?BxI{x_ICf^M#kqj~GFUrz(Lg3{&Xrl>o^dJn)hUtP+&$yZIo+ z6aO|pfsS5f(EZK7K=(p{hMVVtii(4eSh{(HJ9|M{r}ZR%$7gm1hE6}0ZZ~kQmFb2k zdce}n!rTciSz8bAcYFgWV(SKL>IREi9_05uXnPBES8pHa0D)eSR`9W=pu`;1ITe&P zUPM5av2=rZtp`eZ8h?RSVeq$?gN`*lB;EP2^Frez@Jfw~pp_b@EU#d!)VPAQQiH#B zB?kjTZ-@#%#0|}lK3IaYH-GP6(B2&uuoI4ha~7y10(HN@DY6$-a5Vk|-Nsw5)ZJbJ zxeZmKTco2`2C^u7?w4=>LCZv26+r<7R^RLRp!r7>f7>P&2Jr2&-C;V=!-jetr8^I+ zg52Hw_(LbSM(KR4dARciq;|19g5irJrSBRagBP6KX}w*-+Uz6qhXH!ZOY5Z)`R*_k z#)AhRu`o{s#So+&BhY++rTLJ6<-yV~-L0S!q}w3^R2`lNt@aH7UGi>ui@*7x9B9WN zOQ(mxaVAwzWNZuL`F4ndzh%8N1B2yh{ILzT8%;_sL) z&A{;OkOP0qdC*~~$X0oPHev(_SOd;PbdgwenVaM4sXU=qu%W&E)vdlUhHIU{>NE<1DdA6 zRj=h~{^n3I28Paiul2gU1gyP8ip_c>SvsQxIvK&!CGMbwBoL2VgXdgvwS1|?7g+k)nY_*+Fm$G~g_<(AHy z&4(EeK4j@;>kZ)O6zdLP=?0g--3*-}d@P+Te6aFV>*xRfFV}(=wt)3@gBt)KU7#CT z#5!+*jCsV;$s!2T@Dp_QehoGaonqYroi{)l90n!BM2A$y2+6-FL zF%?v%f%Ysu0Y&`*{%)|Jn;(4W4G`$|0J+MbJAk9xfv2+3k-~a!A83h_q+zM(gwSFrJ0A20f{-*oSe^A|g ze$Q{1OOGG80`BTCbTf1pm~=bnK-$5e>o`j_S`L(O*wpj4+JXmQK<#5tG4xUoG&0jZ zp$BYOZ~MINKmRkPv4alUYCi$)w%M zoTB-+fvMI@rM@i(N<5q2u>1!n@y_2_3ebdH5er(S392|it+K=Xt>)kV|8J}n`1k*R zJ%4+zJY<3bbD0@3;vnDJh?rrrTrC}o7ZW5s0*oA{Xm;!{7x-JVzWx6XzKlgXRKW5Ae}4+df35<}$4nq?n`T!LMoU)_ z{-)y~50(nNv;#FkVDW>fmAb)goX%EIl6;v6$^)SI>ULv+lwB{2et^bgI`4IZD}#g2 zSUSO}m+@2gcF+aeo#509TE(U)%D@0wS=oG;5xThYxD)8UPln@8pg9i)So;3{<^TVe zRS4(wmN9$>_iMVrWb+Ay4mY08IF{q!ZUp$!%r~GWbcq_naW+uL@i;hbfLJfTgM8n8D2x(D?~cpy8&&0+ts_zd&mAZg3sm zEdq+mKxnJ`KWIuCe1N6K4{&d?qvZ=YRe_Ui+hfpnNN~ms$PffIEx>uR^LIdRyFd?U zJZ0IEU;lf-{poISZxS?>-Te9g|CchLDI!q39S4hpvUxYSDGq5fy)*zVeE=;hed+rh zn)^`m0jTmi1zI}>?yP{!Z3kUmuou))3FdF90u_GXK=14YbwI$?PaWu*us0l?zXJka z>@oNW8dQK-*9guF|NsBD=Wp)>b)UgH!Tp6^5%6e3Q0G*T$uEuy{Q2JvW;P!YfHcR- zI6%z`4H*W8=0nn*kKs+S%b+INEdot4P>iwsVL*feG}ex{c0l{|y z_*;WPC*`_=dRHBw8yTUk5qPEt^(8D@L2ZBjwo-A>k!UQP;Ho7k5R%^^t!_}R2Ma^9 zeE6sT|95~2AW)HZfxk%?-0uOof-zJ8QdhMeDB*<{Mb|;D0Jr)E0 zE^|TsAJB1cEwOx{8=M9BTki6J7#!W;;;O{5b1TTq&SRY?3@fMO5QrP~QwDBnF7WFR-#aQ>->`M2Hf1P?tx zI~j-h`#{U(J3%3&c^EPl;d!`oE;xR`uIvVv=AfcwJqrWF!JkasVEvsZAYD>O%a<9f zRP$i#?Go{3u#*K!`MRfqQd6(vKhVax6W!qS#tjY|ZgA6zzhxI_m-kD?hP~jF#^0g> zIs^r*4pf*hg3BOKlNj1*$pe*i(271ukb$8WT+ttA0(A%)YXv}AjKAgOyZ`^2T?H7s zTS1-S)&nIqFb5TPgOhjbfs#yU&W5xf#6h7MAkrNn02y7gyv*OsEW*Ih8_WVVwKG8A zI5Q}8`CGc){r_(XDNfp!gU*luy8%+JcQV16F)hguS1>Vy2gF)W^7q$(#w#FY%Rx|U zAFV<0;M@QImaU-i1O7H2P#F$tIf2TE|KMBzDPKS(%UqBksAM_J-}?70Qps|dzyC4| zxUuxo6k1zAk}l|qftL<{A*mUA8omtLQslwXEzo(ovlo=&4!)M}oC`{>paX~HJLhfy zwVZlEWar#1AU2pZJk>cBl)SpZITm4?;Vn%_I-Uwj(~{uC_mUmv0*KEcVSg1VN>75K z6xumdWnf@{20nj_80c^lR{_SCvESgHfM>zZ)&|H(8Y6#enJ|{2HSn-n=Z((akWsbH zL;Ty^c$*)*hYqiSbi;?&_C&#k*E$xyK~(YWdZG*r@K)O){-!Ku1_nk~ftP2#LLCGy z`aqfFCg}P<$Os1{rd~3(o`h6X{PQ6#s=p*b{%ZyE4)Awe0S#KZLEG}(;1mXG(X%julvaa^ zL0^GRj)OntJ3Uxl=0S~xBrH$`^|BJwcLp_Hpf&CbsR&rNn7>s7)IbH@$^{+%1oa0& zX&6+P2!oc*A*a08pd=41Ozwkr!GSX}T46E=v|`^?fU$WkDBKvkr-I9rOZ+X(ppGQ8 zpsRwHD+MU!ia*Hb&~gQoX+hf-wm>>>ff|TM1 ze=>ER>Sd9Hl*O6{yTNrcba3tffBzbg-yubh8z=!mf&t#F0S$p#wt|K+`P-~P74;jI z&Z(dz5QJX#fJH$G;}Cyq>HL~ zq!d;Ox}6TvVK^cHI^EXdB{pdmwS5IFZ}Kq`G|>52!f-s((QpB}j`2TDSLl{6VVOp;iCO z=pX<8zu3Iy_y3pWA3>R#=RbIKqx1I*JIK|nFHJte!Vo+kkb0Z}9FR{yTYbPaF(`u^ z0*%!}QU;`GehO+VLo>)t(C$=d1_6!Ry}b1YRG2`j?beB)UeQVZzDJ;gnn0~9NYV?0 zclldEm&Jh#MNr~7$lvPn94XE(@}rh2y#N0HXY>^?Jo)m&chIUjur1ARcnl9fo12}# z`KKHJE!+A2|Nnn*xAy;5P(|~9E2uJhVeZ4k(A^6fH)%ei0EybxlO;M0dqIK9P@)Vv z!=qFKbTTif`4KufQC&#*%B0nH~3o_K)1xehfVm9!te%v)5$;o|AU52z@4<0 z|G|9-7TBa?U>3~KH{NK){pzPk5o3XD=n4L&5|E+30^sIFH>5mC1U0oGsRmx2fF@fk zTS1c}{B4>jR#+p1? zL0KN;Pf)?rjZv1oTn}Cx4C=de%Yn}4Y6%Ao_#%hJ98g;snpr1+Zo!1Mqx3*mm4ipN zo54+V#?G6N0iw>skfCnKxCFW5+~+~FZTDWgK`Yz|(D80Jl=1HH$N&Gs#}?}OTihT2 z{||KyZ2Y?sR70_K_kvqH$5^^St)0?Mpj$l<6O^_iaI*>8~QZ#f= z1r-VZw}MKPZt#rbiz&Ck?Lqsi+dv&$n@^yn zWuU$%D7%1`I-oR19)Ma`&?It&6V}2w&ZGdURJlOoap1ZV)Ku&Q)m7Vk1v)rhz5-ox zdPso3B?fda0CJLxL^978WF9ohfz49}Z90RDCzX1DhmasGguoY>azFn=2WXB6K(ZIe zx1EPxhJms>xbEM<3Tj^cWaalg*xd`7gN0;IP^5r|emZ|c$9`U{-VWM34a$YhXr^(1 zOoP|gil1hvvSpFvt%-7GUY!F7D|0qM>|;ORWgW6h5~bbf%0!DFAsgH({6;7XzM0>&nC z7ZrZUWJB{C4$%17p>D`30ucj9WdWIc=w_J#sp^CNhqOHaT~U1I0kX?mF7bC}KKcK@ z8ye{`;6nf*lW*#v00t*8@Z{S|N02)3^i{VTN9%zS56D~;cp{3wWh-bp6WZ-q2^#H0 z?sin%2d#7l1(z+P>yZwsNkNBafy7`v;`TovGr%PLF zbU~d_P?3o!e$j`fAfw8lH1sm;Ey(|{f|P$dW=Wa~s*90R@mx@?0u7*vY=}uhP;Vbv zNWEMDTC>>;S|hNF4U}2dg8Eid!5Qrmf6HXh;Sk718Xy^|0x}ZXZ~|wH5Xk+_py53E z72wfINZNi`2TEG-D!~Pm(K%lFfR>U@1=UBOBbt;!f}sA<%MeH_0b_1O26QO!0Lz_0BqyZT|ed!MB7J<5jS*j4`;VTO`1S zs6!2DL>SUK33Q53z#VYQ4n58w<>HGZCs0ca76u3TTNUphg+VzB()hzE{-#%-z)fUG zIr{QEs7C~DpF;Zth6fB!c7n^kmw#UW|Nmm@g5UpNt^$psfLiB>cKKUJutzPy1p$BS zy4y%rvVg(~J-;>;f-H^|cac@dGJ=U)**FI}B2m zgPmvj=KuefOKw39Tmq&4-w>tnHuDN}EiGlYz~Kfd{W3v20uaSPNo#k6NOyohC%DV| z^5APwBH%!G3n*j0@P`=;;(^`5`r-foml7biK(gZmsCz&P;O>z?*VgjvCX#z@-b6{N zC5}Fc{(d2cFs5}AXw%Kx8<1#&gj1F$MCFTbt_VLcgU%a03R4HEJHXYv zDm({63&cpi3c;fPH`>+4KPz9143=A(7AOHVv zc=F`}&;cY+aS09vhSx{I3msA*YZG2PoBbQE4J7^Y)uaD#0TYlpHz9XA2EC|;+@sfd z5EOoT*Fn`csQn9$k$;c>|9_Ds@DHvP?1b?D|Nn!=(?Qj);mMb0QO>UhEl>cjN#+j* ztw~;N3|W)>1XPx}@^qJSbha)4^`%?|I)8Vz&iVcSKXeJa>l4ERkYT3I)&`JpH$xU< zSZ8a+@BjZ_OzZp&nk8)pT`m^~I_RHm1qXkt6Nm*i4&?SlYM}W*jx5Ho7wJgK^+Afn zIxm11(N6dc+B$Lq)R=$6(G9k~bLx`c|Nn!^Nszlb!6#_HxRwpNuNEW$zD;Y&Z_tWL zh6d2OYS8fnol|H0{{O$U`1k=(nG3RfDcDGs-qs7h|NjsBzx~et|NjGC%y0Vgz4?g1 zcQ%mLJIbhjN)i^ zVqttO4DH^fO@NpJvKF%360)MQdmd<6gyxCP-VV_6?A9I-d8qS-<_XI~{B0VbR!c9) zd)=)duYeXwfcoG8fnlAkAW!}emH`a}fZ6=5k)ZX@;Eko-QlNg!O3*6Ze(++ull-m9 zAYOX~c(&^zA&R4L7M z0F6_&nn0zxS(6cFnHsQ-H$$+PePX@z+kbe?SMACTfwk?vlQd^f0t@c;i-P!Rp!3Rbrjl=K67 z!71|pR#3$K-wFzt|64(E7SQ?O|5i}`dGYf+s4Hv$iAqRXD;4RE^XPVF=`Hx*Sg~U!uWV6QK3o@m83RK{>k{95bLJ zGeO%ax*-`Aa!MvNg?5A0L)Sz9-wM*)`TK>L6L@yFw~XO9IFW%O|7GC+|NlYt1SHdR z{?1|uc#&HV&M_}RJ8(e3IN`W6D3>rGa!9u<14FYm<4b+e0(|iKN3h>lIKA0q542`G1h=(-*I&{r>;*97qUU&-Au} zD&)>yP{6;K4>~Iq%mmfOEgM83XW!odWdg9eW(yVm){~$;*f9IL!O6d~6{H^)HvBDr zK%2`!OKbyPNJHwdmoGt^(90kzRKdqBfEMdPa$x{V^Diy_7Dsu|AQdRFfwF(E(}m_A zocwJ}qM(6<2c1(vHuSb@UHI|8`F9k5d$JH{CeDTH0chpeJGc))vDgbXAL^&mpfkt7 zezLvy|G#`EICJs0Uja?Yg4wn=L5ocLCWFSYkQN7b_JR_75X9aWrtd&)1&|X!Q)OT& zYLw=EI<6nGg;*SXvKM${cS6 z6&9c({re3_z#VUe6$_1fL8TNZNcsEQL33_kT|@=ui#Ooft{WVs-Qd7PUUhAzO5?zk zKrMrr|A0DgF5IA$1P(pWdMQvkf`)wr3p}Z!YCHulkwJwwD2Tv?bvL+}?q+HJ{{S-X zNsKv7U~^zW4K@c6&d4T~sNu*zy-v_X0j^YxK&^mnE?f^FdXKk)3V)CjvAU}_fCZjD zAo;lYg#y?d&>;Zbkem(n*6~(QjR7) zJN|88s`V0N1sF5P?p|=FJJEcQr4!8T=IC|#T6v(R{O>H)UJsT) z$OdI-iMcZosd3m1E;=Di7tkc*N6?aYaBHmdmiAOoYs_*gs5Qplc1f6lLGuJ??GsoF zXpw4Q7eDQ;GLQDIBxBvhDe*n_|%~gbvzqLUg zl#nHh~(>fo`+~HQ&HRTW9MNFdG!SovklGd2Bnl(ZzUx z^8)|&si2nF!ADGBHYfoee8dc9gYwM5M=W4AD1{t+#0qAEGUdTXY+yDhZ5@2X4rYVO zlY@`AIWMHC{^v>S1Usi2oSQmZKY(2Taxy4bJV2{_!0D%9>D%A`|G)1%(R`5OE(0V@ z-38yX-rEYgi4GJizdKtufG#-%lL3%=KOpRdwgsql1zwS;03M&?nDrhwcA9#kBrJDg#27&7JW^k{B zqq9{5)Iyo611|eOVFZ#q-U{*?hy{rc&;qt35zqp*6wp$KxggcuyVO2U%wVT4uLxF39%g$Ba-nl`6H|E|Kd78{Rz? z$GEv$Q6K`dyo2I)tFmT!X`e7yAsRMCrdGr$ufkjefpq zI=_LIP=ccolrB_2=@V;k2UL;S7RKBA_HL;UT@91IMM;IWvO z8Hf!r;QjsITt%2l_#pjcP=vjOm+O#{w3`uBmKuSg5uBVlB@X_U?~GvSb!34IF})N6 znFvo`-QYT**O8^06J*?6eg=llUQhuBQ4J{yL7{jYoFgHHA}IGm#6bRlOpSqy5>Ur_ zE;t@<^LOm!1{KEhIlz}!w@wEgW)9BY9Q>^Uphe}qpaKwNDX81l4KBGbieHctke%qo zFQQ-u4^Sf7ZIE2h%>ll!1JrVYTn3ErFFbMQfhOM|rQ%#rUE2&<8wqkfT5AltHu4Op zH3SYWP%;KJ$Ur-!zybj;4umi;bccb?Isk?LTaf>tQMJ%2v><-^&N@VT%;; zw@)U$2aQ640v8nE;Pwep#n;mA0B)%u`yUiJpju`fAE=8A(g`jd!0zmJWa&KBc^DG6 z;8nFC)t!gCnLw#zt^}yb&Fz#NTu2es$hGaI3ywUAGoT1 zSqMs8kkTm)oL-^Dw;QO}2W_ibffg!5r{`5cDF&R0pq0Z3&{Ad4bS>!pEhm8GfvXTj1E1C0~qfLb`3|e*#?o2{jO3EN7f^#hs z#FDD+$e+AnhRbb7W{(Ev^>P$uMHY}1P{wXYR^t^dl|I!R}s7z6|(d<>_xLOsLchc zyFjKL=5GxGEq4GLV+;0S`(Dt>WUy|{gO)e>n=XRNDR5tvu@_u2UHI_-Kg83p=J*Mu zrZ~Un2}tuB>VgCOtl(D&^SD}Zvz_CZ3k_o zZw9wrBYNk9j@RIKz0nPBGl2Jyb+Uriz6tQRRDjlL{NUhkF$c}&fg3NKTS3v)c?>!r zl{Nvsp$y~`&>~FehB6Qrw4n@CEOmo5b%SR^KnVfV3+kQ<>JGGCDyajnF#}D5Kt?`$ z!Sf{DQ$ZRb6C*D`7bt+|G~cJ_D^3MieIPLGT6F;N)Tn+R5?v|9?n6Gd%gS zA7mT2{f3g?AVnf1&+&U6?Cu360!RV}4P8}$cJ6~+0Z9SOV4rCod?^7k4$`FPo(mdR z0d-@GK(m67avHSfpgRImPV0kqVt|Xos4Mdhm<28^Luy zB)VWxo!vbbGzipsyCe}Ks(Uv5|F3x%qQ3J+=dFW3n4l5t^d4Nkz~-z#`5!5xA9(^< zxB%%wfhxL}prdRj;7Si)K+^~%Y7EdKXKT&x|Ilh0Tw=Zi)uEvA67c#O&=6zi?-vH@ zkSqu~V;-7eCO}4>rh?K+V3tAHi#wqE4Z(#lH0i7ctqTNqYZ`w;%4tzv=yI%Xur|#b zpyUIdMg{AGB%+sXpdIO;`7zL!R0$_P-`m>)O^ho zpyKA#umArc1IZ=vh%!0G7CJ4pD0 zQU}!cp#9&t_LG7V$xF~-V~}<}q+(6OwZ8lHIjE74f&#Qw?+_?`6H$HGe}XqBd&?LM z4}hoNKk#ql;%}*f+)o(vV%lYJfBj|V1H`=-pqd(zT0pfB=%_5gUhn}%hL@Uuu=4kv z`uYDqc(o$rpre;NK7jq-3mVG<)o-A!nb77-FDTrg`L7WaZqWP(nqGc+8D+meBpf>D zf`SKL_?DU+nD% z9}xvOa_%nFNC^53zI=i@WNz}B-BhjL^7VxJr`7gfyzU1&|TTvz&Wi$ z0x@)O8??NojNzNB2nRp-uyjb5u%Q<;qAbvSfWP^{hi-vh4*|%iawqtdV|^d2G4Z4F5H-QEitkAL|RRAYhKUHsdL$ig-6Kn*@n z%0TL5q8lmn0_2}wP=s(mdQqsey>6g>3wVMTw9oW^H*@O&e$NZN&d@QWPH;MdwDxy^ z&dX~24I=q{4_kr<2>JU!nH@gG-};IT)cpYY8!`vn3|hnvRtZh{ph^LH+7@gU{rx$V zS#*#JCU3)k}X8%nwp{sKx9ARW+j zw;Z(T1+?ZO@P&F6c$gD1oBPrg)DZ&DL4X=jqL6Ci05sZPR)bDl2R8>nmCAk4+9+@t z(TP+>fV|oKh9fYn^Y;sG(E5}k0-!!*YyRW^|6jfWT^J52{Xpl*!rC8@n`J>62fP?2 z54r>qJT;W13o_{-=qQgP0+2CIuz4pyt5HGgp`pbu^!!k8lMkY&7pey=1lCjf{Qv)# zX&^U%+mqn@3~FtF!xhr==mgKry+{NN;6XGV5dh6T8i4Ot0XY$tx7}eY!Mnj)Kur%w zzl6VOF?jC_$Yki4{wL5CFyKt{VtO$sU4!D{rTEAH|6jBh|Nj5-2zc`&s5M}C33)djTj8mWaI%K}YJ+Ta$tH8|(;H|+)ODFT;&&{TCFyzZUl|5lLCp|49EiTkODLq^}!o>dH!z&t>5eX z{bKd2AO9nx5R0@y!Y`IV?mX!Puf1zMz~2eFClJ0OG~mUx!r##IZ%|_Vf8p={kobed z=gYK@pvBwZ^qq#Bz^^?3FXToHFsFhqy5tCW$q8P`#L)>!x7shALGzyAwNQ|{{YCat zP(B0&2`JWDYCil2p9TwBV%rT?2VOJP3~Fv%xCM!7a2m|geyI&L`!^(kf|{>uK@$t0 zJOS!yfDP;hEwu(m9AwhJ8nl`jT*$PBfer@+H4H$ucm58881o_%-HcX|cmMx`?_x>= ztw)2*j)2sI9rD5wsvgV(+1a}5$^ZW^g>HiC6YwGdNY@YKK3;USEw69DX51j|yA3+G z9OS-|DX?|mphWW0`3b1x1l8`KlGE_gOQ~0A0+pcsuHdu>nOAw?PymWPP_}|B6?)kT z+Vk~>2hu?dda(d^;GVX(YY`l<0v2_pl; zi`z>;CtusJu`_gn&P_kodA;*BbVYTGN=hT>oFUMP=+GE&2L{wqZ)Id+VCZd80j*u` z4N=kP+@j*c$iUFqq5?Yjv$sVh2Ew}lYHqivoB<6HwW!22f|XnWH7wn1j<={xU|;|p zeaO)1qLR|v>Hs>!%tb|mrD5&w<1Q)%pfudsqOym9f#Lram4-$JhW{lh9N|GP?p%a) z=#N9zPItPfuz;Edw&1MF683*9XytUTi;7CXi^NdyTF`F3#)qKw)BG(U7j;9N*&QLE z9l_IjyRN!>+7t!`hJ(MEAnTz!V^nxLLsU3AFCRYyKGyrR<|)ft{B2)AGwp9!x?@xX zg8vurgmpuX^ahp9H$dCr{`0&3fUcd@KwUdqDuJ;E^*hKgZN_e}<4Z(9Wx(q!&_SRo z0WVgEKwJ$8GWZJHHw+96jYo1op$I+o91_2%E5RjT>s(9o!QD{!DsZT`L5sm*Ugz&; z{13Wm4Yazoi~+i?wM0dx(?vz%<#EtTNKn1_LOSR7f2i)4paBGE(_ufj)e#2L3~m>6 zo&Z}2>i3rPfb+?sBj6_a?p@bc3)^RrlkR`|6Kx=Iny4jn5Xz{mzE^BIjVQ}0<1+>Je|I{m2=w8#k z1?HaSdX^0SmS`3Rh6X<#rfzqZ-f#|(!tTkS#r&Oa9LL=ZKo+%LD&e*T9jeRUX9g-8 z0`?zw1G$5t+fSwWmpOlXJIMMylMBxN{m*#c?*H@NGKK~}UJj6dyPa5?53zvL4rukn zQ_u+te?W;3l42$tcM||jxxBs(O?M4`JPNN*K{;S^cpP5uLg6>OUWLNvcs&b+FYvkx z!3SM=@M1csq448>33I0#3+U+om%BhN0H^DQG@f6*;T+xWEH6RXWdb-9SU{lwjsjoM zsSvK5UJ4D5x*-E8UtG5cA*dT*O9{)T2RJwgs zY%Cf1of$hByPa5GP6IWgK=~JxCc9l(UbaF7j=SlA%2tp`pzsEtfBuT48+1!Wm_%oo z2>kW{X!wKnOEy1ZZ1}|}dCA~X;~~%%jm|KQ=AZvdcZ1?@7s&D5J}M@RphDA6<@Hj? zcpFIHw?mBlEyqBi;-&#A>tCOQ`bQnKQ|rh75~fZzaBwGrHpxx~o%Y@>(gYey+6i*4 zn?XRYn?^tuW7z*oorgNzbh_O*K!?>|;_sLVim*DB|NO1SpqlRze~b42|NkL}>O&mf zdA-4php{)DrJMbw$KU_|8~k`!q48)5;j)0ElB4-JNAr&y{#NC`|Np-}ecVk0G)x2v zo@UVDqq5NbTVWzuszERQn}fR#oo*7K0D}e9aW~Kg8HU%Vj=O1qwwOXSmmUXQ)&RaO zq|;61^-f5*9CyTYDsyqx{oc{$*C%j-6SgG*0)PnT7DS)PvI{*Iv4@zv{*soDB zczNwNsQuZ^(*zn!{03>Hh4s3q*aW=Tt_QAUTMv{Ng5sx}9jy4TL1HR9{>CQ z|H~KP^W+ULeRJbw;-7k`Gfd-U8Yo$SZLIj;SqHks!^V=G-J3oJH$x{toa+7j!~j%G22286vRn+>izcYsnzw~tCrsxdF8<)D_s zks8Pr8&Lk<3o`%pMtFJA?W3a89iw8aKQRryiWf8|K%%C4PJQT?|<-m7SNqSH7Wux9A1N}&fw9^oj z0Cc)bIl5~_I$a-t_Bzc4mC&&~pyAX>ASQd~L0A(Kw4ZE+0)OjWP>trw(aq6%vV^nS zm8V;v^-`%?w<{0mHqF=v#~DBiys|1@#IpbS-yI4nwmO+Wk^BjiA;Vd^%Q-Z!wSMF8 zTMH^3T|tLhGrXM0z`!t}+w}?Khfdc!y%CHcV>!BAIl37vZx$Odp0vEl?{vEP4M%tE zgTR1J-zzT)AQzo=`(6PVJso6pC`Tt#cPLLMS9dr|^BWds*C*Yv55j^1UZ}+X{on0+ zgRvZRUk|9{X9g!+p70m9rh(HMsAJml4rGSwoo=uTJ6)fE?@;QFeb5`Z% z?N0m~g+aEkcNTLrJF_sZP~dOz`}hAp)EzHNLCG3YPk_QV^iDU!F%|)aZuXbaAQ@1; zf+|IJ12`W*;y3)olBvJ{ce;WC0#pefg@l;qwU_$PdLL%(bx^Sj@%~Ftd#v-s2mX!1 z{4KGN+!XwxdM7yeU;2RVjDj_eK}`)DjpJvawC?%;^(nZCFzoj3P2t!mjn%^^aF!eeyg6>#q{a<<%T)u!RUTsiqcti$V2zH+8Jl1)z z+eO6zbh(t~HSHP|lhy+j+|36Wn`=}Y7@P0?2X$;gE(Tr2B=SN!=I{S*9~Dqx(aU1j z>B|DE#=Ct~TwtcRo-CQy9irlLoC(yveLbl=M8%=?Qk^pBrY`<%E-E%~hrP@OC3e>g zkUDVq^S4BTqm}~{K%p;s=7GKU(&hjE|Aq%%x`NUdB;`Tc1EBb6ej}0v>fh@8FHu3k zFYG{fdmhn2D#SqQUpyE6^`Eu<8yf?tXVUy82NXixb5vSD0k;L*4ewr~0xIcKyKO=B zMrVymjN$*@9ShF={onjsp+vQJM*^5>P$Jb^qaxGmq7nfuH#-k?N`Nls`c?Y1`7eK6 z3@Aj79|m2_0;%~lZ*<0}uo&L%WKnr753a{pvIN4z{s+h~9&QE=TMLvXHNO=A=~d}& z19h!C4{H0Uuvqe_lwStjob}>V?C<~GE-E~)j~L!go6!2U&Zyf*g#*$JKYjpg(?M|0 z`(P)JO6Nt*gO)rhWvb0@K=+RQ4}w_J?V=I`?HZSgHy_FAya7oJA}TMkLB@-yygv8h z*Nzl=f{vH?M)xZKsQhNH;@gjEX?FRChH;cd&xy&(0bZmF{Yd z&U2k1Dhi!7DjJ&C5B_87tWnW9_@Ak>M1`ZX2Gk$4>TXK0s8`+&U;zbPJooqp#FG3cZ`a{3js!OW1;g9sJQnA?Gk0#3d*#-yFf}o zR_p_fxq!0H8UO{YF4H zsM*J|At3057s$dG6^-s36&=u3+uWTmx&t{hK^rgvf<&=@_lUZ^BD#YNv>iDP{$OgoR3ZfOZ?_jHzEAM`9|XnsVQ_l_G>+4#02~DbN|f(dnUZ7^EMRe}h4ps*wZKB?4*iVCfFf=#Eh6 z^w0pQ4q)kw04eVjh&~KipBfhYg7pz71yB71O2I7MB`N~lVG-SKHr-wlttU%ZR&bQ) zcl)S_bb3jEuDa{=k^z-)orjuFa5O*q-g=VX^-!mqP4f|!=s4JIi_LF%0$EjGSK@C4odeqq@fu%u zokq8t!fSp|I|Hm-vGZqlokqhs#?DZN?l6{4H;&Famd-GZPCtcCyO$iGDmz4lrTGm{ z2B;zZBL6Sc8zlz4Ge9DpKRewNx5u;j0iIS&)~& zPR{xt{6ByP;^-1Bh>C9RZ$}wRRk{l#Itw@~16YcgI|Eo6o_+_F+#;O;Jcb84xgjZa zLU(~mX936SM^Nj)=@ZnyEm0A8k#Gm(s}FD37`ojey7{^T6uup0ERkz?`meh}qmvJG zPf-O6w3HX<^iTj*3#Y(iIhC9%|94RPj&lcfEHRvf-)9Fb~{8C+`)nx)$IVTnnJ*e zc*0(UK&*c03~CFMs4={74*vcBWhjUT%{veZIeaJF0)?-_Yc_^%s)lc;faUe_GOXe2 z`}P0-R^r1~05yF7gT__yhi`N@6VjE-p!J>L@GW(~7rx;TS(NYvRW1B2@bLWtu^JJ+ zj{|XrFQh!>>CREnc&!eNuh!e8C9Q8ul0bD;iHgpP5=eZ3MilBReL5(GY?g$pm z&#kxXE+H3}2cbpf{}L607n*T@|Mx+iFt~LVqap&%cGdwLWvrG_e@e`;nt{a`k_RP0n$2u{TS*XP&pI);yY-q zoG_?OyBlPFFt~&1$kKYCM58+*qMM;x_}dZ2QW5Q7j)T9Lx*a*9H7~%b5$#}>gTI(w zzk*gS;P?fVx1i2qh>Cz^0842}H&=HAN4HZ%=efpbpmuQU?Fx(T3XaxqrGmX8^E(B= z6)V(#4Nw1da-sDJIx7@9uXhG;yuO$=p}T^m^;_wQhO>;_1qvXQkdj!VGk~S@dS?Ns zBk+1vZy5vFJ+GI8-2>`xbbA=Io-AQM?f{w{W9SZ0X}we;44MspnFU(74Jpie%NUS` z4$>y1O#tf$je5RV&k7m=cYX#*Gcuq7P(H{gXQ=^bQh6b0jIGo4iKP=qi8Op#xdJ>> z2bosxc74+61U_F3)V6xVlf^s}G)5Q@_Tu^nMh3+T%|{eK*>?)$&f(7E(CKj%wCQmX zwCV9un`UiB&`q@{^W3{Z!+YStGpUkhaGmM23|wTrECS_GxPPJRiR<=ZA3l4%43r>1 z<72ze!pFy6OlSG^pVj;+>UeOc>lN72fl_@?h+sW%&4!Ty%YkdnZ+Nm8vKX@%vKYc% zoP5v7(CPZ1^I$hy=jG1OC!jqHhZ-M&+Bn~iFqXu1p6I;){lfR_owYYOk9WG>;crAxEKKNT+)Axa7 z?330@CDz@p54uC2bRO=!@cr`l3!SldI$dvcyWZe-y;Bm=UHYKA_DSdG&JPEF%Uk~D zZ#@KBumL^AD{TTOvcS4QF6cbodExu@?-x32K_>9G%JD;>IRkLYP3`7tJz2UU^*9q~dhPXmXm(ATupb_;R{SlyL4`hOflt~JNZhUh z^@qUaui-an%<}g+fvz#fzEWHrlor71LDnAtSq~k82D{=VXr>;V0FJ*DJp+$_Q2wq_ z5qYuT5~#j6c+AGoU7{kvzy5pcw^Dxag~_ne0kpo0CG3BRip2jC6^$43Tfok=JXRuL zcq#h(_s(OTA3(J$sQ+1_A`uPdfwCO}gKQ5EgAQQ_zt9C+x%UwpLu$7usNLLoq4@-p z<)IR(&V!v7KJahs0}CFvJX9*${BU>kPp%R{aMb`w@M#k|f4x4FdYlzB@dz4%Oa*7# z56vAQZ33waK~?9A2%|6Gp#cub|KTq-GJmx|+=lSNMqQF$D4LwsZwVM~Dz40)J z>^#+ZqWRHZ(5SWL!BTPgZ3mh^F}5DypK_q( zP>GP`xpF?sY?dOCA@@W63ra6cI=hKL=AePO{brd|Lg1=WXa42^F< zYnGrBgplP-h6ny{Q31`_^fpVJ2Q3&o0m?EZDgt3I*1l$B=rmDzvD5?PcxZVGN?)M< zfdkmk3lBiO9?$c4>d!w~)992Je$ZzWL;b_^x1&2Kou!(Plj2p*khJO&aogovd> z#XdAxFqE(zV_*O|z?Gr-2oE^5$HJ03XuVD;NZ9ZjI4#E>p3q&&@OmL4z`*J0MfCrl z{~Hf|zt6^S{GfupFh_6G1;d~Jzd7==lnD1WP0#?bQyh9HG3fpL&+l>wsZN>@8va5R zr2F{J`=GSg_{N5XfuWN{rF)A?0EktiBGP#tG-L~p0UZ|5qO|6JjQnjom>C#AbK0Op zWO#BHh}sLv1>jWmS_+gdI}djr1WRbX?u=34=w%VKJXWUNE2Gc9O-9&4hP~(>f6E2X zfb3bYs^)`?FayC#%dhSR8Q7Vl!UMJ7xQmJa$Re;Ept11RG7x*TV^mn6c7X0%Ag^LGu9?%L}F7ds)nT^Zs`p?3K~){L%WYM5Z%G zg{AW>|2Bcno0+j)OXEQ4 z2ArEA^`K>l3I~5nE@%k-5aUZ$cs*hnq9VZG;tmxLhl_(;)EoXEl+r-0S1fdJ`Jr6K<1UG@brfL@0H~sK)Z`=n(Rd2?B!vmjJgR=)TNcp$bF#qS@#>0H@IkVHN`oz4MUe_aXtx@%cJEtn*Z{Zxr2(4ULG;V3*8cyk|hSrB`Ok@--{0z9_WSyMXE74VE9{KfLE4+ z!W5EyAT5h-2Np|5meLcQAu0l(xi`>sZWy?nxU~yhp|l<-5$+CA5$JXL(fo^p-wEW( zL$7Caet12v`3(zbK1hUr8$$p@Pa8zf>t>Lv__y&jA7kX-Cc(eWf$`u&frF0)I1lr0 zW8*w%`Keg^wIn#b@o#ej$u%Ei1PK?hSe`C@)9d!%@-%-dDD%8D1I^!{_@q<`F59dFYayyttv&Uzd~PJEeEZFHoFP#z&F3q=q^#Q>3kjb z!p;p`_qHA=RR;~XLZ`@GRBRwD(3~A)8X6k=p!Ok8Zv|uciAf^idCSxKzeJ(iMa8BQH2w?jY{F~o3C-^rUvB`7@4n&bd>!!O?iYn!9u9u2He+E>ZCaePIDS=p^C*M$p=>&I_F(Dk98`0sqZkT!WlI+R5H}pd_g~M8$-e2~?_f9(*kh z4XF-E{%x)dAip1FY&lS(%D*p`q4S32=hA1E{KZ;eud5tmWI$F_dK)yqWO$NM0O1Bu zx%7I^POz7fK<5F2{1Xo9@2BzS`Ka)Kk_2cJ)0LHhA&o!bWaoJh+5FHxjlbX|L-S9A za=p*|`Rr-@B?r^^uO9$ad3~UxxL*nIw+VvwmDLM0Kjd$I{(KLNc<O&Y#WC4>UitXFQcQ0c@){+}3=M9r+*wA-WHO z{08y|$jxc|_im)|-+PqCfA4YgafdYi>qlA-lqr`P2&d} zRB|(o|N3Ewm|z-zi9blq!Cp^r@J?Vn-*TYDtK(q9L;e!w6^#6?+>8tiE139OK{fFT z7XDUg&^)<2b3AlBW`zKMs{}}i0)H!L@#_i){#MXJ%wBi)_`|(r3>{A!p7NJyemlYl zk^gptiN95yk%8gc5f=VdJ+NWi@vsJR+JtXM1Yq(C5czLM9Qa#J!3z1~4>uojfF%}0 ze1Obr{w2WQwvGvV#IS+dC%+W<+j=1iKmm%97M_B7{l5(O+j77PO8gBV2?BHqe=Ddv zVt61PJl@v%1MXN*a-7iX&WIw=>&}G6XF=n$qVd_#_#9|_PBcCj8lMM^&x^+AL*Z+l z0>^L$B!&$^F}#xj62qW*I8Y3q1ck*b7XGFLaG-;t8d8UWJPe9&(51+rMSGwfE1>uW zg-`P<4*n*6um(`XLp7krKWN?>9RJ%Hpz#k{U(x)EhrbClcirpG9e)@c{}6cv{#KAY zIR1}<-6X)@1m6DQ&JXt!dVDm$V&ZQC3#hi(3v*A>VqbB&zcS zsF(#|g$`92Y}cK^5l z%y@_kz~xyuygWlx3!fokpz^KcBB+!C6}|5uf{^S9DyBe!FCl`E(i2|J@wYByWMKGy z+@1ln9vEy5XvhRsIKV1}9*AaCYe4%aP)b9PHBAte@u2DeTtqe>cL0f7ff_yV5*lm~ zDE&YzBD#DA70zG-;pH>PY|#2pnBPAkS01o(8C+3;T9j%0*AMdVIne9EZU9gFp#0c; z$f5a{LRkjHIf&o|O(&-DgPn&6UQm65;qP6btOY9iK%uM&f4KRT0ytfkiS@d$D}eY05I!3us6Z}(*!hEh z+ktMDW^I^wuHVh&uSPL3R_uxS?VFs!RouI^YK%n`Z0Dp5KXs-C*m!fDSHx-w_O)Jf8KETra z??;g}vU~_a-V-eUr$`!E-UK1936g)tTq0s2P-5WVSHfc`BSHfZ;P@-UX;I#}$ z{s2q!0hX4NCHxL8Z%eowz8_>@_|H(n=nx+Vjv~l-+w0e$@wWCeYz)E24}%BXx)dyb z{_ky4u>Se~n=?O4G{5UXgnH2YmjGy>22?yZ|70##d2ImABNHqGSW1E|12{??ECYB- z0-Im5G#?OX{>fa%XDLwnsPk~=4amX|!`rPVOFnfTwiGCN)BKaM#2BPe)9`llPo|RF zmH`~4*Lov3z=|Q|Xm11yh&Q1(f(Jx5A7**I#qjp)4WRTD{K9NEsIzhGG^n$|1KKNb z@BtHeu?Kj;M}+~X*Chd3{s#7M@C!Du`e``S-#}9z77Q8%fsPmpbbe_5&0MC}c@vb} zCN#ff=@e)_AkZ1`r8D41XTTp&c)aR${?q)J`QQtt<^zleAFwcfXuVy+-zm`io3VtW zGk~S}H**OaDB~QS09qmOAsP}Hu>1+`KPB%1dFk^hke7U*gOx5SHiiefOH>kir-4Sr z8-LX^GBA|aH2?cwQr`LD`!Ue=iW2|h2QEN!u|;>jNb6hv7EpV-+m)faLISjotAy*| zdCpX0ThJ1$=2{lUQt#IPCGOyj5C0DQ{onZ^Dw2QOhp_*p4F9i#Cc1r8Y~cGvzJb#B z5g$m;9#kIf01aopz7383vuy(u&Keb&?gEi+(BLb0fy!|g6;LA@#0NF18CnmNa2-6ynQCkbb~I?I zS@40s|3Nciy`W{OSq$J=`2&mr;k_;@4gnyyU+X;7>+q-fh(YrY#xh>8J3)ICL5nv* z#SwV!CT&7*^8wI3>&Ht(zyUDV?A01I6y;Ctp|E1ZtN zv>rI_q5``9hJoMZV5f_ULF<417FN)D`?vfpXF+{AH?IcP z{RSZn4A9AFO;CoiEK!juvFa9Uy;KTbX#q;G{H>tE-tfR{_OuB*{(%N+YCuU6JX~8^ z(+o?F;QAIcM5y`W^<8L!oX~k~FKAS-clXMdfB(Py2#Qm%y57m)c)w6$*!%|Sv4u{5 z|AXQZl;#6OUV=78q)h;i|2Knf>3a0<|9{AO`^n%$aSW6w?k@iOzqh#oG;7n_TzvlT z|E$b_-sXt)fBpx&I4JcCO)fT|x4B~-NN%arum7MF0WOcg^Y5TF>jIV+O9fs-)&&QE z3U13&B`n}|!63CD3{ekSBWlIK-;xjN)>W}E@VAtLSsV=fE!AKa4+DQoBbX(?z~2ID z?=@G6Fz~m4`t!|I5)Aw;lfkkw4E!xK!41Fn2YQ_pdc6diAACsTFJnmKzkVT&|NY6< zOT7*P{H>sM;c5J39BKU5FQ)OozXTPY2X3>Kf!aNn()i!sh6+R4hh-9J{MRpog-R=$ z9~=Nh?*x7g27V0>0e+1D1%8bJgEanI2h;d(T}$J?bs>$v>~b3ab+FkECD+pU%OVay zP4F}*HA~|!12s!Q26}!dRR>8wfJuKS6;I$ zK4_W{nGc%3M&^Sy{37!~7bt?OUQqNy<`Y2+fV-Jm50uy&9(WC1_upL8#KF+(!BisG zT+_tE(CfimBGP<-1-u=zM5wu@iG`upgR%5RCuG^ogwBJVCk`8)eEl9`EQ|!Fuh18w z$)NGevLoOYV)L7tZs;DyJu0AfbrwVC>x_m#MuzaP7k_e?7(i=CT~ri0LsV3<7+?~{ zc}xu5TU1tna{Up3&hH2R%QGGmybjuKc@1=2r;7?`A+t*3F_1yc*BP1*{BOSWzx98` z+fKMyov$+l_!vOeOwD0p=$@kjT962`&6%U~bru6m@We%wP3}6SB zu@alu85sCI4jp$<0WV_ibeDMP3EJ@vN+;kj0Zk9V_T0R9lnr)O=dsS~puuwC8Wou= zh71%X{7`#hR3r|*l0WXEVgoAYJ1-bs(mW=4z4KFNi3(_8uT1ly|DB+{Bqq%l|2H27 zO)3d=o@l-X+KD7`@P~XSXpZK1=P}TPog+*pW>&kOW1F1}F&#*Qn@dyQoM=hp5OL zcToY=M+}*_KpMV31daYP-U6lD&Jq;~&~7bIQ>F9#!T<7|pvKLQ&VQiLu2Bg%_)oq& zMkS!LLe0PjW1Zca3 z;dxDvHj&Popbb{d51BhdR8qQ2R8qk4qG1Ty04~s3qms}aqmrO`xI0EgNAjBCrOxjM z-^*+Ml)T*O1D?|r0Vj4)V2gleSzbhDq6aoad}0<8L${BL0;s-=Q4xU$kK}dDkCLF| z0h%BN8wLwgh(1na^H8PiATa^jGy$Z zN$0^Gd5jDUoTo}byutaQB=b1(TA=15 zHPBg;9rb~X43-~21B48cKlpnsL1z>Bs3?FYx(vY;VB@idb^reF0;y}h{vR}7ahbvL zQ|BScUo}rUeN+@WV^maLGJ#H=hxB{8TOe+VQBmmKy5RiZ|D6#st^Z3EK;=#E)?J_$ z2Pmc?zTKYzj%m(ACAs|D{lvO!R1~^%R8%a_cb@2c-+Z58KQ{vdLyZp9pPkhLAQhU& zJAZ(t^PPE`kJNyxGf3+mVn0}m;oIip|3QA}WwCF*`k#M051S<@;oN5EJW;#x^&>=v zgt)^T=8oQ0kdygcKfKKO4>}znZ9-^x=W+fu7ns6=duQARjV%3Wek0QSfEhI7!$0Lf zXN?L6|F#35250Aa&BL81I(bw;ne86`njfHjb1c0pK)MVMG(TkCDc|}!kblYn&7+++ zzP~*9i@Ec9=Pk|G2Y<ta07?W5u&2;pd+ zki6A=L+kM<=K*at3ubUAmn?y-$a3XOI$`ZfDTq3WIKE(1AoI-OdW2@aT31tx2%x zcGl>0Q3>d-Q4s+RX}~IY@bY076%PJ2{}}n#TwuKT|Kcx3P@Tj9cCrBHh0cr34?v45 zBtYE`SS@e((eOv-Db7PBpmofk-XV|SC&M3{hf16~OH>j-yLoCLO?@! zos8WsDn6ZoES=7vDDvpE?sNv(@6zcE8WeHpbOw#u*mOFJfXd@eXOOE+I-Nml;B-2j zK~umMoz5!VE-C??&KfVpLH(P*)BgU4Sq_d@Q2#e{*XmWPw8F!JU+h~6>IeJn0xfI% z0~#A^Q4s-kBKLsTGlG>M{Lp!>+h641BPPvjou@lL z9sDhS@Rhvgg_(>e1aEa72aP#^=8iir8(soc9GcLI0~GTT!Jxgb5ih1BgNw?}i{RBI zoCo<^E-^DObbjdN5$b#mYKei`;Rk=nGhRIS8`Ls$0Hwm_2RywZUEMw^0pMid!FY{- zdrJYRh--eqIFs>(;4M(wwfU#@4r|cP8NY+wpf*;FiU_D_ybEMPHz)WMSHlCHJ}M!g z)>r4%&JY!oUErc@%}u7x9F>U1gPe z%$m14PxrD+0u^6}J8yuBuS4A~Dgv4pK{r422r7e;2Y6-C!Qb-D2X-}I`k(m;WZw7Z zjGvfYR1}0mR8$yG>;x56plVj|R`xB4&hOwBj|RM?0hdpLD5aC&FIa&T!g!0>MI}Nw zL?!0?O>of!Dvdf_R1!Lmb-Jijbh4=Qwt)K!pk_>Gh)NB(R0r+r1isWKvFL>?M+L35v4NFLEtf(085(%qB`P`Hka+22>uym24Ss`; zxPr7%I^8(BTT~W+On2kyZUM(vr<*``3%C>5=_bA@K2k5j@(0m{00)Z_mpsC^i zTU0Hcp47kvNmCEW|(K*uI&Ft>ouUJ#z5(gO-x(9v2g;3I{= z`DqF`i$S9g)H_FsKJeNEP+kC6EG?kAu2T><3Xb^oh+bU1k3AHAd4Ga zRCqv60<|`58IJG@@V9IPITf0cU#5VD5g|z#<_H%RmzSk~{{Mf$F#%rbfyYCFUtC)R zs^`)+gU5SctN^Xzdc)G&d|(0tL%{#dFF-97(9Y8PKR^*C5sfr{1FA2>!(Q}W0yW80 zH?uJWH@`7})_pE2I)(?p{cC2>3T1E`h6U1w;phgpVR#^I7y(EdMg-D^k$|*eWFT!A z1xOo41=5Dmc)<;ITpPr3+dz&34ZsJya0I(fp!51n%j>1-od>&FR63bK0S{>|a6lRh zJdnnM0Hm=X0%>7X$uaQK4StT`7!0mQNi96&Pg0OA1$5UBJv>29+T1dVosCOBrS z6#^e~!QZk6G`{qPBRm*fV1YLX@V9{~h2|f(_*+2ZlizQ29)h?cwNn5*4bc2ctu*^M z*f>y~eEh&1xN)G(d(Ce+dUI5GLXnItlLHyo3YtIO!3nAnUZU(ssA@e>Dg_#qJMIoz zImXZ_e(;xkXE;kY=nT7X4p5gLI)hT0h_=Og2WT9&^Cz-#{Oz8gL+B2a9EWUpN$nPT z2@(MX=Y-xI6_%G3pt=Q;Vp8JKtVkX@0}AAGEzZLq>st;l=sga4SoDK{*}l{_Dq&f;I{@zu`&k zt_7dN^Ws_l-~XwdwV;vG*At*Y1u2Ka!#a-zzbKmr3JkXOpui}A$4(BYy06G>e!~Kq zNed6lVtx^u1a(q{GiaI}=l3S|Ze53#zMoS+FX$P($<082kKFPx=8|{ z%^nKPZ&)%IIye~uf?hlXpQR=d{Za#wJfZ0!^*HGC3Wnw*9EJxFr6XwE6k>iE*nBp) z`CzkUn%{6h%zn`ZcB4e}%d?=m3ZxJ24^YJdH5XK%fXoXEexV9BaO+x-gFz`)p!Glr zD4BE{1iY|3@cTb#PfcJR*yGLMV@%-YfzH8)-E~X;21ce9ylgRp7MvyZ&?19as>Y`Wq6SUnxHu%(0ZUwxYLzqKWNC= z@WAW+(9~0^2AY63{GZy%1~PU6#09MfN+p_eSr|bJS|QsV4gaS$+cA|sczpr9|HboDKmW6~uZF~L;~VgS(=IBYb|~mfYtRH|_Y{>1P(yf*N&%?&2M?u~f}9RL zt=jNg<1b!Nqu%+%jys@M+IgrQkQ%Ao6%?62{`0qh7S}TV0G(w78n>`K&fhEr+VKf$ zL4bBHfauP1ug##boHhYG{%9Ga!ov@)eL$nCpaa8{8Ly{x#&UGHaxvbutWnY6Z@UcY zac&P6=;rSR2muyR(3{6oIy5@NaV$>Tpp} z?{#_$>W&5Ux(f&Nx^ja$$tEw(^MlVe16A*!QR2>0P>m+idZ5#nfxjgQ)PgEeVd<7p z>HMI01GF9734H7rXe%1W|1Bz@uG0&igunkgUue6i*nozar+|<4hHe!owQW2C3Tkjm z9qQo;JGTD+|Nq6a&42&Dz6gp)uwI?lM`7|WPH+DE|K&!|*hFF*^gKv#`ZJyhN`Hq} zg3=#oZ-@aTM}xL7r*?ym1>%6DC!|aYY7L`g(o&h%@=%Mw`BVUuPdT9ZG@ON7ywst$ zLdM#ar|1DBqkC;@*SK{SwIWOL3xz}kxykHDO#ozl21YH zFi>8#U@E=y`V3O)y@MyO9)RW5Qczyy<8LuX%Bw}0;Qa6s)DeZ`RS*d(A3-BGEHgmC zHDv`TxJuwPPJtolxKhx7A-u+U9StreTMtwuqSZJqptCfX!(N=s1giig0K3jZ&5xLy ze=(NWhX;W6D)U0xoJePmmYTt8Bk*_P>YSE1n#7YCKch6i5neNof`YD9qC z-+2qPpKV7K=&VM_l}??PZ5coO|IgpNcH`gwNVBDo{JjITRRNkGQ6!=3F?O6pn1odx z)QiKX{}g`xVZqHcDm=`ftvaA-9?;onpfQ(HXI5P?=Y%*L*|= zoNLo2ys+Nz_y6nj&{#`D)c4--bsa}vY;OWZ9Vq#M-5dO(Z7L}Bi7f-Az5uvmUBInT z4p2)p<^|~7E^yh;KLz9k8(5*i(R{>%f7^lR!!Ht>p!pwi-b09r$hSidrFNYc48N%| zFgP;Uf`}45&?sBOxrQB}Me@7nfL2B!dsQA%{lnc4+Nu5e43yhj#_%F~Jt%d9PCA3T zA7-Bf$UZYP`_#Zu9HSxtwh%dT%Y~tKf!Z&i1n~Mw+JqOs*I}B!lQDz=)KN5n2MwsB zSOS@h?F~`k*kOi9ao{N9ZwFmU+j^k16l{Hn3J3ILF3?fRp!&#S7hquM^b_s&QBmv+GwJk`?DkPn?F_T%^poY^ z?xUg!J?=ZL(@zm(p7t>}1BMPiWzbY4EOCf8A29))x&`TzI!)Dh2v~PXVZ}h3=Ecs%ej#ni95c4&h>eDbuA(G=g3{5da0FK!bgC=dlu_<~J+>q2Vv){|6U=tp`d4__v9ecV1|I zaKHJ5qm5*_hv7F+8|ec$6@%*;$Psb9?u=oE-$Dakq`@gX`9gNbiszRY-7W(_|kQ+SEWq=orMwhV%{N8cgt)sxVxp(S$YSw)C#mcvH6f} z=kv~sjgLS(*)^{>Km5@7%koNzP~#g0(7l~KDu4JH7#J+Cl)h_x2s&n2^Gxf>64quP zo<9t|B`W;<+c=t^edzquaGwJ@YJTV} zy|N3m?4;B63Fy4q9S^Sm{omWcaO3a)-gtq|bDgmdtV5raD}ovsv3EK{Zv_1>y%P39 zs2RMEuRHVx=uk7zNL2H27VFvvCBnTWVvOD5)}c?z&On4p-x?l3JBpWoTLn|+4;#G_ zIUD^Fj+O)bt!|*Y%=HOV=g*f)hzFVr8}0xnw!5Jv=6A;_rbTuxr_`9?EJ0Zl~;8#Ec~sYz0JKf%q-2dPk1_i z@V7;S&te8`*kITNYS$ij1=S-AhTk*~b%tJetp-j%-Qg_Vt~Wr}_MKp6Jk;%aq507t z#_NnfEM1@Qw`~VCIoUg1Z-7oYxY}IL!CHF0v7X1>FO;G5Sa<9L{%y@5SFB*?Zv_o4 zHb3~$e1fq9ECxES`4>B6DCFBAX8u-CkEGXKptJT!XXt@m8G+ZC7D{L{K)UmB=RxqX66am0YNY3y@oi?^$CCLV$l2+!hH>3_qCRRQYj?D+xbC5$El#STE@^_ zdZP0~^8=>lXN)CW-K7s2`as?SpVvMh3&;b%*c_|0d04Xd%^Lw>Nx zi5f#_c;|J{`Hy{|v_5qnD6PwYYWtU<1;rry-9X10DS}3?4LXm7zo@AP=jzr2rBC4_ zSD^Z<`3+C_i+t|C|9b-%n-B1UmTz>jsJz&_3hW3_CDVGK^Js|&Xz;?7Cn!AN#V00k z34PoZv;vNy)0N@4E9gidhR!?|n91OCc%-=h{s)=JqVggiVp{8gQo-KlE9d|I56EH& z&*FJ;d@}<>Z?n(!zyAYzn?IcY`#)nnBj}E!=3gK+FFZc}giTt4)*GA$53vaMf_%Jq zF388A{;3LR`#BHTMvpkK%Ua)-haLw6WQ zx1&Jm?e095-dM(7omZW4EZuQDov|FvKN!nRS`YLFGlJ%%!g!hw=yfo6yYch}Fm{IV z9AjYU=06VUWVfCy-2@AF@cv$w<`;|s{|kA7K`p%(A&}U54ZBGjT3~|fx6bono!5e2 z9P9>#Xy6=Bh`Mz9f)Z*50|N&`KxgQKPTwOh62a3K0-dfGK*u(L7pp>A^@f)^UH7Dd z8s!WOy>2X>u4j&eW?LEdfd+}d2LNkcU=BSK5cI$F!i#8VRo-@_**2wMFxytYS`_1rm=#Bk&%(PRCPkP>jVC6 z4m_Zm;~_|2>4Wa>o1ps5jn~qTm%jzHWuzNnSgSWH14Bav2V-ejx9fwn<_a-p{?-|w z6GOf=RB$r(?w)h$?|=T*w@e^aT#UWDGr;`2ObiVC+XA>7elhb;J((~0Cb^A%O(DncF=V=znIH8S`P5HRDn(I-R*ke@Bf!Gm>3u)9AjrZ?g|>u zW`Oi3LFd_(UU)Gz8g%^rp5`M0(4n>CuAoK#pc}>hmmYW#wicXhyIn7!RkIV|fx*Dv z@&QyxAo-Q$|Ns9l&w)nR${6^!Z@zo|@BcK*0v7((*Z= z4Zk&4NHFrZR)PZ3_d!~7B`9>NKsUy2cN9tMbbZqNf+-Dj$5(qPGXq0fbETdFe``HN z-k{r4q4U_mXRN(8e3sYw+nbpf7?^#}bo$=uuD!$f&+g zk0~5{#L66c2Xu-C52*OHV<~;nT_@04`=t55eA(S@KbhXZKh2MRmtN}jW9en#@2-7d z&CcI86BO{SPr#KEfBS6EZoLE2ozFWDK`M>o&5u5G{=i;oG=lHE(7e)m3Dg)9`NPm# zqXODa2)c9pQc&Rk(kJ1dw3`1EQC)ln-Gsq<;QHVHouxOrOP_SQUU_YjHlf?~Mt6Wr zH+$#BUKb|r?>7}sfLdAZEWII2|3P;(Tu?mN>-NC%Ab&e({7>^7A_lcRK9ck>xAlc#iX=ZEf6aO(@S<-6M*G;-Z~8gya60S+%= z4*qTa65Rs)+uTJCKHvZy`r$7FW>{X}Z#x2+&THB8_y7NwGZ0nAgl^Y8y}LOs{QaNW zZP42+e&O%`)^Gf-KN@O}FqBGn`=00yy^zJw`2jTe%C%9^Amj9(sz}57LfERQB{P`dCzZ4XRFA`V% z1_dE#Nw4dPmkFS16;uyDXsF|6=5Gbv5oE*6-v*lSeJKT+^@Y@@r8huD!gdFPmka;? z|39JE4VEPA88nYKKKk(Ao&i^?=)8cfDPef2`3+C=gAYN0VFCY3FLb)zc@h2?k}f{* zx4we3BKWsE7=Tm%OFmFwmoap^p6RvWczFuMgVe7a|4X0zFFnxdd*j9R)!^*hc^uTT z2Cb;>bUo1Rd*fv-NcC=;OMm~r%m!s!(D*(izr4HxT0&T&#?ZT41SIVP$+6u6FHeHv zX!i+_pgHK+6sY>cpp}ZH54v~53d1_y5?;e^y}Oe@MG-Hk06>%orOyzhLFp}!stF)f z&q3Gayx{>AKv!3QT?|e=phT0}Z2)ewfYjE4)b0j39n>D_dHt;IZE^g-8c$)4&R)>LrJb$diMi%Y7ykb5Yz3VS*V{ZF%mydM=3~bH z{&%*1U)!|>lJ@$~Oi^{?>gUW8d&}hYEE2%49Kg zySBX8{T(z%F3@?X+hw~5XsQI%p8%f~1Ul#UxXX4CP@CttYXfNZW&r8=1~T^;=ma7D7E4eFKw4Meb_`EvXv6=lAcwrrU-0{Xw=d{$=I+pj)&rf4 zC7^pB;PU@VTLNB0{{Y>n)6jfG09;jeUWku93~m(~g@B7L@a5Z}<0CJC#|pY#L5>FR zuj+Oc>7ELT_ihJ?UY3S~4_LZcn7%cDw$pI%w}8(7f%*beaWx-fgobtd6mVW_03Ub* zj=$7yhUOoA4)w4pP!q0?o%Nb@m955NLkc;j4|j%M$q5?-QfI!XfM5F0u?}I44|oyR*+HF;7rZma{SN#|Dg4U4?CBF z?sVt`3wI-xG0g|~Nh@HWO@_{;ppXL9i(5fO!;4Af3=G{{%h{lI1Jo}N3Os%k{9u+!HEYPy`8Ocuin z*&J}8(%A~iPu;E}stgPa3Y}oz@wX_jF)(zO%CvstZ*37^U^osgN5Lypz~w5K1u4Ie zyMo4M7`k0Wnjf%0ssjGjv)l{}(CP?W`Fvw=;BURj&A`wNvCV-8lr(0uF))BKed|ts z28Ltc`wkgEzAu&eUn=syl;?k`!2hiv$Nw+oc){lg3RMM2!($!DD6n7nw-<_ZJIbVW zZUv=P{_TYZo$a7Q(7GKJ(mJ<;=JY`AdJ#5jLH_pFpdC~$j4Y5O%D;U&NV@Y`=TdMT z#}d@bauhV=32qkJGiV-bd9Ns zb1NtgyTMgfFN>JvG5%&*9#GgU@DS!W4z5N(!<)yzg)c*AD<}aSKOnJ3h~qf81Oo*$ zB(0@Q=w@sF!Oq_f8ngg~9_UCIumEU@Uw2RQg6n_(Gv2iO{}9$c?hTWM4DZ@AKz-5+ zsyRC!YF_L-)eUA_Ug2*EVq;)H9rJzt0+RT<{bafsI(tD?Yj42+PH z1tpO%j&47e&I_HrpaiRVqVr%kxV6;$g0b}=f9olb5^yEa4ff6Vo1ontU<13s4W>?T zrP|Bl+1(2&2YPv+`V}v9GIqNOFkWB|6X|s1=xznoZOo1w%3#ww19>_fSs?ifBGSAU zR5>$tItr9Y@o$?7YKe3+S~|V~m-GCt7djw9ei9IOG(TkT6>-?%kQ7*a@FCOX9}wG{ zAMkg&TomaByQvfGVE*mxpfm#N=RII$hBQ--@i!HLs!gy0P(=7}F);9N2dBTztssY{ zHUDGgZ_VWbC3jFY)IAlH2td~~Kz!-q@VDCpbiErxx647EZl0;2nJmo@kdTH1$$yin zpk)aEw}J}g3?>c+hQNU12XyubadZnPehPX~5CF=&3Z3m+K+O-(Y`znytuz%J42Lv7 zH0%Y10Ym3>PzZFg^SAmkGcYvtgBk=5-CIFn{S6$HEG69CZY<2~o$Y%-`rARr41)ah z2-J^u z&cM)o3>t&oQ$c>{WpU_bIRwg7`#^1QKauV*mTopkI9eX!Z<7GG962-({Vx-M2Bi=O z0|TVB7{tsT@Iu2M9FCw-p;pk%j=jw{uKfM~ay!`j;O5m&(AkacHX!reWIEd&Kny>Q z-hls#r&DL!GOC{|CGfx%=~fw;M+%I5J*VLRt_1w}MLU&QF~`x_d!s;>Ee=;KnN` zvckaTsa^d0|0QV9ygN()G{@rrvek{F)19N+P2}JU=CscCI7SABml`0|pnjcg;M04BnrzI);t%6YH?I9o^x`}kQM}Y1<{e`Gzy4@r?!6nwqr++{@sG#j1NWf+>zwogE zg{1)KM%EP|Gh9KZZ+Dk=bo=%|O59G@hHh7x&b^>K(aX}%S=(~(0ZZcnaEE3qsK3%} z(Fv{-TmP4ezFY-5>>cFJ?s^{3IRdkO{{R229h8C!-~lxQU))Ri`yWzAF}@539l{ST*+ETBo~@u^6ov1vH2%Ie>-TE_f91S zh62rtoh*Ib0UXT-I6xXfn-iOVDV1ODWSIsk=0S<7J4~S4LjiPlD`-HXn+=+~-B=he zXhX6uq$LAxqk%>X4nAOIJYfkIC*1D9aK5-lk|{{M#z@4P$<>PSEuH=uK9d4xL8U;N+v z^G8|DE+Ym82F+icEYn_sX5B#DnhCwl9asMThXi87UeN8y3?$0EIjl@lb^4%(d2dZ0w9JAkEgx&RXc!?#0BCCr`f3EvK}far?mM;!dE z?w~@W9khxX6i$mkMX&=)XFCrQ1H%dq{#I}?3+}IcV{_ndEn{I|03Dep1JX4eG{@U| zsf7KwdkiSTRydS!cbAHQ?hWK&WnchpGvO%V>+S_L-9dLke+O;*2bZrPtDKk_7(i7Z zDDfUYzyYdc8NOdo2A6dpD>6V%X$O_=tp`dtKq^6OM3FMt1(v;AuY$%p_JSG#O#Cf& zV5fmwqwL*amopyfoDSlHeUJ-M3!1yyYyxW93Vd@F;V9+qc258eE7XI|Wd!?Op@if3 z0R}H&j!uhia5KCUQucux;+^fF60qB~p%Yx-b-T87wu8#N;|I2Q3UhQDfEw^mK+fm~ z)nKhBOJw=CAyrMSzZn=9UMN>EFm$&2fJUL;aQrWo34ier;vz(82=Z(xhvEMh?NfjM zkA!C0+0I~pzdR1Q#R{|uf#vGo|Nl#6AdU8b7uK0zf4yY?0?N?}m;e5UED=xbmg<}f z8Z&ws`se@uou=UI)5+5JG6Xd82QG3TRX=D|7lY=7tp8a?kUBdc=tY@3$Wn#oAE3F8 z?;wMnKouYBpa1_Mh3TZ<|NnQkgSw6{*MaJ^>7W$VIUOu;`S1V#$J*yGGB7ZLmNxxA zegM=C2iM|8NtlovK1_j++>hv1veQ|z)gmSSAPDV&<*apff6(?$Ut!W z6jBxSf?AwD$9TG1K@HJv5m0-Mq4R|11xRDFo1GDK&pHiAF&@lV6tC`{1$G8j?0AHyJZBCS^F@V-@ zhK7e3ehYrlmk_Wro2+nnKC?`FJ4@Qa0PoOPX%ds@!|+rpoF#g7$f6RP!XpR z`r<(x%(9(GmO) z^!(cx!2A1sRCqwQYF^D#ynmD0Dp)4`tj@WSBc|NoswTMv|E zf!6Xvx+%9n^FuBw24IuB8$hcOdOiL(|NP6}z8O6J$HDk6Ah`4Qi{em-WM8yE&-)~KzJirXv ze8>*6@IP|-9ol&`9K8C#IUAIEE?0w6k4DgoC7>P~XtzYEEO=MTlV!g_mx#kxI6xc> zK2N>#c-V`rFCgQlE-E~bB_FK^N@ALS{4Xg2C*Elg>Ej1icnX8=nB4_BrK#DHmET#= z@({oCq2?DX{Of;!4h!pbv0w~%ajYF|TkC<6KG4#`u+SHv2~|*eR1KP)0L{<1vVev) z#b5j`XJ7yi?0}-S`PbjFKEngAr}Z`$AoWbUA*)$_fUB9RbMVzHy=CAVx?i|wf&6~G z3gmYi&^ZR6L-4?d!H1|w96!JUYPa~Pa2$700d!B%u8&JTLru!0`gPXb>{r>!KoXoCSQypy4;TyTGGQpza1} zziJ4mLIW-H1GT?OR1#ivJOle1Vzx~8WY8!(=xQOz7*c15ib1a}WEZUtKnI$)k(v>7!C1i&yu+rdw_XO<;D1s3;s` zVCXCrC}!&fix{2+h33?Qh6fl=wt_B=hNR?9pH>lw_rHP;Z0HVA3F&kNO$4>nGB7YO zm#AofEo*@`?6gsNX#|=shMs)|zH$SU{y}kboCS1ED+BDlap=0P*VB8O6|RBT zY-KTI@w^b~V_*QE|8gC?9;-PWl!k>XKxtT}+oc11z2-Ae=@(|w?ZCq91UdQR6rR|p!3CxtUv$%cj~CTc+?4A6ea+w(804g4?*j$#X;>mhU4y_bwv#D z(x{B#I1|X_Z~;hQgYIJkS0mj*pea33P@&4B0@_v0zfF*T8%O8W37xOHO;kEURJbip zm59Dhoxs1%gOPt*7$fL*pJR*`7fbzGE|tD&ImzGh;NSoM4L_|)MPFV6MKQz%(D`-^ zzpP3m__qnPTq^wtI@t8(S|oY?Z5%BpOJ}}*2F;-$s~T!lxEV^%zFrBsHxLv;FK>c$ zfb$c0s`Pos@BfgfXg(rfc;F?d(GFfRcMg0Xv;b;C;Oqgd-gCM3_y6lRkopy}2B0t% zlp+|*Kq*3}7d+z@&RULGj?W2RQSb9Y!bzbNUeRA*tOTY_Oi0g9HZ-sxoQ?Vb;6R`}lN^kC`j2Ct6} zsD3LA#b&RTS4;?o!4J4hODaVc71XjydVN};1f)U1Jsf3cI5!oLqf;FQ^lY(2%h$a zOnL{rnEMc1N`M!2%5**l&&vG&uX!A_SO>H=N&s!r;tleU6ZqJ97toLs3uyhz|5A>C z7k_Sm4eUI|56OZ{L7C#yesJFnG|t%k!m8Jw(T1^{z1N+o^L*z){%uZ-pvCM5N}n8j z$OOJtKBEB|wV>H;NR9-xV?jfq&F}a9`QO`p`r_aJSqxbW0i7RS+yb??!M+3KM1j^z zB{IjG&p;P!zEQUB5(JXFmS@ItK(Yy%=tUZ2?sip-awDb3#I9;CYY5fiwHyb0U} zzIP1N)uauO(YD;I-i2tmUF-D^}*Kq+*K3TW)N^(}vg z9w%syN@I@@hqVTO^K%YR3Iq+)_PVTP04*-CVeI5lY5iX+{IVW2rv}N;;BnfLLTFF1 z^U#48tQTH!URc3c`V?|E+wDkDe+qN~hV?ga7m~5`bT_EeR&t~}+ypc~0xoO=!d^@a zhSj*My4__uKfSnc`Tu{&^aW$%5s;gqd(}Yxf=)Do+D{hUEh-623=E*TOwfr-EZ>hi zfHotx+OjY(9CJ}o2F)*K>4&{2fLQ>!v#h&CC4dREqo2QJKB!QKa63P}koflhf2Rwm z&g5?aH5ht*RFr#bRCGYMU@~_8dQou|JZ#)~2s9qiA^;lga#3MvJpejBgn{1$Y7T@t zexPHm5C`a-lb_()-XOHsMa3kb^TYowDg{j717$#0Ui{ypk^$nCs5rdPd;~IH0qW)B z(Vag)O=xhdvTx3BkjqRUz2a8TwieK~f3U@^m(Z;4-lGx&^51{{mSRv$gTjj8+Yt`_ zR#3!)&9j>WPIr(rEdrWrdBYL0 z2OVL>!QZL?8ghdK8>j$v01bXaxZMrlvAzTREuiV#=G~x-_`k#xbW(zgigrL2)Bi2t zB+y%<;s82<*(RVDoC5z__f6Gtss2xWy*fJIj%Ys1GKrQL~@M6VHm^Gj)$do`vx~TAg7bJZL zc@bw~0WE-OaRt?FH7YtU4}u1=SX2y8c0#l29+@KyULaP#xf+BGc=lq6|9C z@O2QV{Q+tlC}hDM2|A9t*G0u9pz}iz)QKS1zF>wp66DQR9%cpx%Ni8{{wW7Ik9O|| zZ7~K-zQ}=6P5T1yco>KT^-mtQ9w?pN{DucKd(Y7M1GLl}bhy-uC6L9|pku&5i;O`X zuh&}}YE+aN_*+^*Bl^uhKqXcdLs%BW3((FEcdYSM!?1%pxwKPZSHDFwvU1qCvM`>g>qEXKj#sts~OjfxH^ zFN5+iL+3Bh;e(w&UaYzZiY)loqoVTC6EuuJ1svj_Ig}buSU}7K4Kh_o zG*~f|iXI2Am+NNe7U*pTt(F7j!3&`7KyUYkYk&W@9_VfExc2uyzw1HJeubdWuz(lR zA>cyEnW6cJ1gKED?FTLO_*<*MBTGDCFQ(rDS6Yw;Kd8M7PCPB|!9!&%z0FUq{rwLz z>wGXIQ-RhDK{^XEFK*X^vothCgMtGTb?|Vw2paI+4O*A=AG{cgza;_GbA7|n8=|5e zl;seBoP|Kj(6Z2(YoO3l=sX0TQtW&Itwum`4jzC|I!E?o}m7p!3)1SaAdp;|MmZW zr-({#b6M*j(4bYo3y~mj)OCxfynF*1GUQQ#RkJMM>(wGa1JiDxq5x9QBG+RpeBepu z8R&E|P;r_9Y3Cpprx!uqXHkKa7B7=PW;JtwS`v_55Lpaiss9aL{BB@i=mx2RC6Sh^ zpi#TsphhKl7hZ2Sxb+BWCxCWvK?CPp=T*=Ke$Zulpe~8bi;3PaXSIO(W6j4|ENfIm zN^*Kj^ccJKUtfb3+x#tkzyAM!=>QtW1^4?P1sS+N0i7KMKF9e*$R}9Hihx4)_TT^i zUxE&mgRDe_j8#d11n>O*4@t={r~mr@zZ>FAXsQICu7xTD%O+cDATe_V8fQqXZwR^#Xj6p9z!@j-Epy>?IzVa-d7l-RX4J~Ai{Sb}kz#3il{`?PW zr-0gDFW5VO{%2jD2|3@P`HfC@4){!C7toLi=zuZM5gs64g7(ODyRr1L90fK0KpR{+ z7(akc{srxZ@16>(17QbIc7V>>by1N4l}(`PAGAxq^GEk&P|f&4{LKIV-BZD}*suR3 z+^v^N3_5?jU_A5x|F>3fd03LsP@}@ZP{M<-jgbwusT$;L(7p4JMBfWG2a@zVU%c4! z0UR$a2THa;Yz?=Z_clr~m(d*#sJqf+T9t zdOXmXbtNh;ov%TD>}>$oX~$kmLc1puI)A+IJpKQF_iS*bbi2g7dosB6`1QZ!b?c?l z2cS+BSOlDYI&Xx%kb=AL6h!Uo-5`5hLC5*JfM(e)f=YHD6`teZMF`yzper=@f) zYX+59%@3GunD|>(|NH;n@-BbNVvuUE4dB`tw0O4lQVCDzj~5$H{r~^61=61BZ3H>I z7pxBKl7P+|FDAT)h82HHEZmgWM?w3zVHmPMEcnIOFi`8fH67IVl<6)}u>d6v{%wAs z2;$$K$JhLjA5>O~F)}dhNM~VSxctNLz5;@2y zn+WJQPG+`%7v>(YoY@LGP`ukk#ihGp4XADNzr+n>?ln;RH$=sTf4dH-ym#q*q58j` z0o3YeZUP-a(jCBJ9nMlx#2wC28k^Sowju&)z#7~SZ#_`*26T)Q|8|iG!vmcc8y|uU z_~xQwzyuoTIKX6iu;z4H>!k`gkfXY5RD8M_dIK0c#aj=Qa)a}L0XQ8Y#!?{rjX-D2 zfqY~B-{3`oJJ=hL&3*hWmH+?$f0+eJO(kj!4L{lVTR^)G)0+Q&}y#!6vL6bjdJqoB14QhM09wAD%1v-lI@~h69mtQDe0L^%>1dTEsW3(($;oxrrbqc##ws&WUSg!$}vsm&3 zdK7f?113=7EaCjt3d%0bC8xi&LKf(NP5_np#=ybf;szQya%Jfbl>i;mBpn1gQUNp$ z=;Xn+p=1Rb9Fe+&4uNRX3W_<$M&M-*BQ zlx*z=Sq!nM^B~mt3EhwrC_!mU5j^nc$lLsYx%mYnXw7TeTyQbt$aCNY3#g2l&&0rB z!^Pin97Hoh8p7Z++FQV94tCe5Xmn<Q$>& zfg-r`#`i~^7Y@E)ZvM?(R@LdF;$e8ZGe^Y-e9}>kibCgoXmE5M>vm<~-*%!m@@MmJ zxiX{XpRA?2&2Kmkz5taD3ZU_F&|pW5iVU+1BWN$G!;2qI;Bp7#7;R90_c&woQ69^G z<=eV_z!wjI4mtOMmIK|cDIj&AQ#`vvGeC|8ttIRZ0uPP9`}_a@!B@=P4lMjFk3f^k zJ}NrBG8a10+~-E3`yvqT>t+S5m*lYgSGp5)l>(@X19jNT!oT44do?N%j7TY$zm*fz z;Pp|70d489`}_a@%O9YvTaXGGd_S)XxV6=i3~Ek76DFw6Y`p+lbHUM>!SeDLLPxi& z1SkcAW+FhdYR3)sf|&w>1Am+ejGHqbnpR7uM4{f=&FZ+7j+vx ze+P}4xu}@*nlv1I#=;D`Ji<+Oj?VL)9}hla>HG&VQ3rm?QW`khfOfPo*QjtXUbFnk z-}VZW1>9Jy^-3Ru+W4Seh>wa4C<}lNrE+-j$^o1jpy!+@v>qru3_4gG)TRSe@ci2yqhfIU7&s)p@we!KijX%vpi@!1YgAkyTX#TV5b&aIJ=p&*x&MHcsDXl~ z(?!MNC1|Grw15GZmo+LDAnUq8eiU&4O=?06>2_f^IrxAHvfM!uUe;s@T+5pi~0~!iF0m;ZZuZ1Ax0OL=_3zp~j+rZ;26)X&;@49PLR5~MA zIxV^(hoW{?aCGkhXYeKsL69d8K458fVK-p})j@`!Qs4~_#C!AC zLA)pP`~QE83V-rvWLweyFbC~&fw{^0EcD;2mdy3wF7RYl{Pf&oee4& z`CE(s|Ns9Da-J#&e@i}SGI1|x$qxfRWNDF$ip)0#7XH?0OrTu{AQ{G&_W%F?*F697 z>0gj*z;`o&XYo$(Z{un`SrXEDf`6MA<71zL4_H9ERlS%VJHnXEkIi6AmdDy4{~lrm zso{DockltrZUzR14^E6H6c4L{Hn$yoEy2Hy%kW0)$L4~qoDT2_wSuA zz&WKv#Q}7w;?;vsSzr;u@fvZS3FAe^7nbMCG$8TOS-{c_s)v14Y&r`#KxY+oa( zyzYdi&a?@dKVR?Y&QWoJX7yf~hJ%k;m}692KqmzM54HfMdc#Yd)u4N2B#s|gaEP6w zvskCo86;r>&cG&6X9e^+fyMzy~25;BNsP zLelA`v#V9W33S-M3dH>5ZU*uU3=E({)j@Qp8^|t|?~givXkO?%c=09U#a*1IZF>*C z1P1`C=84Xqng=_7dB+2;lAxN-BMFCd+F8ucYe*kD@Qz_^`NSoe?z#h2#aA6k-c;T`doV5Z#Wt2s4bJ@N>{{ym^Ug$c3 z=czyg_AfZuVdo!}SN;6YDjp5%kH&Q8s1$(G66khv&^#q*F23{CZdOqShR&P(+YU4z zVm$bemGLy=VaQD7D`?B=xQhyCMc;o=(1J4laTgWP$U8&pw-UZ@kR~z{e`_))18B0h z27Cm154g45&Co3ls&Du}tHXW&A+M5UsWt@%g{Y!U-f z@O?eKw~PUtSYAE>P27Xqb0*z0VF?4fuTUzb`Cldaam!NbH;TV2{)K8#&tTr1< ze}Hb^cnKQeTEW8K0=lmPG?U!z&(a+)(fSP(KfP`CpaY|(dENl8T5GTb4c8t5ZEx-t z>gMX51|F_G$?tNiyGEs?JDjDv9z3Kg3DSEUtgd$(NKLm8crx7O8fc&^AUH5QsJlkR zptoHC)MtF*YsbLQJqMiLnvW=e8m6EW1e(=?B>(>gz3sK&e4Y$aS)&pFT9oq!bS45g zxq!m&<%PfCx(hUD#>n5YwA5@w!@VCwdg$2aW<_DltG-XP7 z8}@@LG6w$E29TtSN=bLaA5iDc1$^(NLN{3C2S@~TBZ2^^2nAIaph~)%tv3vGGOEl= z(6TOQ@&S#LFf|_nw+=v=#_~t$dr-`Ql0GD{zZ3)66r)$6_Mkh5Mlt`=nX1dHhlR1 z|9|J<7Y~<$i&&6XK#8O~K%$pr5_~gDH-qI5{+2EV(1cuZf3bq+20_Oo{)hB2iJ(GX$bwd7A5rK${t~nz zy7fRw7pO_x?W3Y$4EDcqKgjQ#2l-pqgI9Y(6Bl@Y0%$bx08*lA1a-VzR7&`_HGn$$ z9WE*g;8quZ%X>)UQUnrb-`H6ATcbc7j~W#j2L9Hqj0_CN+Ce5Wf)WobF!@_RBM{J7 zg?qba35vHfK_=IzIJ{g38Xg9%TLVQ0xSV~x32YkpESlB>rAD9ud{9>lw7R7E-2c?$ zte_)`K`E~J7-K0YeU)@KfEIIix~SB=-0<)J|9zn42IvmpMs`5y&gOsr`CFPny-&Es zFSEgiZ+Cu3Z3kNc+9t1%+ARwj>I5I{+k9ANCn&IXfh>ofxCnA<^A6B;)(j=W$f;=d zVn`|~Q7P&C(LD{EJCB1pNJWec4AvnkI{Ymepg`aP6~3UoTg``9Uh{TyfwJXE{uUob z1_sN6rSH2Zf|7H0BPcqJT~suTLsV2a5AlPy(tp3vc?@DdxVgaJ%JKjI|CgXcbJ8Y& zZovlG2HK^96l5>kp?9*`3=uYe~4U3cLS&)YVD#T!QTe1<3Qz0iHZcY z)T!A3YS@(YhA~0~K(#77jX3bPfV#in+!Mgk9RV(F#X!!441$3s(LfHf1?53^mTrI0 z&`~L>0?;I23n;BNzu^fE3Itu4WYF9G;3jCa?yv=@9i`B`AM9}c7Gdy+AJ6~o;N1KB zh4LbBxHs3RfNmt6@%R7#mw!P1Dp4uvo(3v4L6$3k3Kl8L5ETXf7FSShew)7~nTdhH z@Z@W5&`$Q7{4L&03=EboT`Z;VyC;C7paB#GFDpQ1xu}TrHh?OPm(d{GYg9@=m!Cqj zQ8T3b#L(@*!ryWcB-jETo&s+~Xju&s0P8oo@%Mj&B|}MdSXfX%D5%%d+a7S^@Bhx< z0fD_GDhXjPR)DAdWO~~(K{X3#LiHMG4SI}wPJ03FE?(A%s74xi0S ze*T9!fxm?j6w1i<-v*^Qxc#7;sE!{5SC*XJoS>FkK4`S9AM7{KPDGG`-gb~vd#8hM zw)Fyy_<{9(2pq2Y3QrZ1V#}zQD_FQ0)YA z#RRZRK~*Vuu*(CKG9`LtKtrpbwkV>a1YJ@d6dVu;x?S$Y`7PjiSI{EJm!(h-ArQY@*rkpaji$99(~OP6rhl&6gND z13||fBH362u`xO>9(>IFgifp1tD#nbhReb32hT|ywgEXl*cUV>0U8ZT0A1ztB6ioG z|51^h$9g>&SxZ5q+de8HS&RWMMAIRe4Sa%=0;n(XhNaV8q_+XI6bLj~-`NhTb$Z)D ztB^X~WqR97m>3uWLAO~2yx6hv&wtRRW1x{a(6y^zMT{T#x0R@P9B&7$Vggls{M$HN zPV&3Ds5mq~WA1ckf%cV}AN=9`&;j0lhSC984O&*>vX-GUU!r&W0Y>m-6LeefbkJO1 zw?^l7Q0;xZ9kk;L)S&_0BoAs^G#*U=HEGv_G=U23N=60-$R*n)Y7Cthx+j6Ow_Ym! z()yOa71Tgx1*>Q4Z3odUCp$o!BicdN2J*LvLR(=aDn2h1cmDYgnsb!_Eg}VtnFxSl z%tb|_^C)D-9MnZ__^HnizRwzb5$mNzxf~|Waf+oG@J3iM8zZU1tTaLLsUTCgF3pmjG^;j^9#lX3;oh>mWTLV4uaNx zPu~Cvlp{K@jw-l6cO21OL0XlNHlgzeICL#vKzd={TvP%$N}@W~9|7$;?*R4bApKm> zdg27oa{eFS)wxgyq)q4sN8{^VP=N^$--B263PLIf@G_N`;9Cem=ZS3xo2&;i8N7b; z4QQo>%8MgmkRU$PdZ0wG^We*WAiMrSOnbed`P6^#j1%NM_R#PbjhUeGOVkTee#wA` zFq=I<`2uvT0%+Ud@dGVx!W`Y3L3{tL4It-RA3x9l5(D+Vc#a=7{VWU& zWo6xy!JAcAgBB|49$;Z$V7zMiq9~s6pymrr(2(>u{`JQ+4}wQvyFoT}a&$Y3d;>SF zSxOX|-|!qi;Ic=EBly1nXbw~WZE1ExH)xIxbW$m7`UDcLpZVo}?*O%HU!Q}Q4`DCn zWq{9r_5`2*%mO<2y?Hmt&i^H1pr+G{Z=k{+yjz70dM0?=7f@N5#qhtFrSo$Z!;2?z z3=ALxLFR`AzX-Jel{Qa3*cei~ML`W;PzrWY5$Wy#oqW)}0p#gG&2#@ZfHui$PXO5! z^kTv~P<6@^mcbb)LaB{FgG;9q2_-z2btgM0V>TvLyQ95;2B6}Hptl%-CUiA znA<>S6MVm^cuMhv<)Koj!$G^{E@UwV1idKY1MLwNXgyH*w70q8(ck|8kX)O^@V|@& zw9-W|j)4JOeu55sYXMs*0=5uzzXa%xX`6!&SbJNT9YA_}YgBl`U-W7G_}}^I_`wAk z0vyfH_z%8fIp)B`(ENy>f18M42k205!;S#P@GMZ9!sCAdOBTb6)v*i=P`|;#4|GP) z3;uLaid*asN^y;EK-*KhT{)o9&)@n1ywVLcoYd_r0y;%a0o43|4%)F?D$x9lv9q)T zG&J)^f`Osim809CqSLhnB%mS*6#&osx=sN}7SyzUD+%h3?P$GS;@w@!as0p$&&fX@2i==K!>&F2<@#pcR@IN5i9lT9DgYUF={5r`P;T zy#%ZheC`2Qw$pV&uj`9W@TN@2#0=z!n@;eNa=qIfKzhL^dUZ|(os`r$6?FDn=Ty*u zLMQm_i0;r0o#3-2dbcZp6uUMU9_ZW(I?tl>9OJ#to1LX=K!trT3j>4Y=OUHY@z68@ z3bY2$ZFHd6^JivYVB~8)%wZY3rp&b4cT2Z%w=)alIsR=IY}iY#H2>1%Z#^l@z;N&d zN9Q5_RtwP75_mUw^I?uoHp|#G<)=aBF?70aX?C3;(Cs?G5_I;S1{Y|;97|+@hd335 z85lrI7(vO%p}PPaOASXrE4pQjI%7Aq9w=c0ttN2205aMEbUFZ6a|H`Ke~T9=qQF6X z{4glEd;7tW0X|cxw;voCkYIJ~fVOhL$Nlv7gJZ(A0n*RwoD14_3prmAa-3r4T+p#D zo!~=2di%kV-3t!LkG&>>-LVaw7dlHM|ZaZXlcty{+4`@fGbCL1LPzG{+5}bBcvQyI$h^jmagD$Tg?N{ ztKGg^nE5~_$+*tx^j!lwP55$mCur%*!Pgx8+gTz&vly{UI(--LZ#&f)d!*BML&Gl) z{+7M`3=G|&8$ivFARf?}yTLpMUa>&L`L_l0f^H*u#n}9dk-u#fNU1M}^-LAeSurin zAh-E$X#UC0-_kC?z|j0tnZKnDlq-EVG{59){wdAheqVrrVHYFA0glVBnjbNOijxW5 zz8tWnIh_+VKrKA5dCaa0N_e|HSXxhlZiQsvcR85Fki{7k(Cd2Se<@Eux9b#UX2^bs z=l}nAhaLglo8~$L6vMtVIwu%_%<0ep?KyD;4G}YdYHKEbkblBhnty5WxBG$|-!lEd zoxlGXf7tzh08Pzl6S{pxK*b4z7z4Oq3TJ1T?{cWycLOLQvlx+Mk`Ww}M$i8L@Al<@MdpgmiQs5#1Vtk#{#Zd4f;Sd+vb~%E z3LtPeyK?lJT<(tD((PaY&gKhRZJIW1g#4w-2fS{?{?kLT{;JJ2FOMJZMP1- zNOBy&IZ(%k7ov{ka-V3@LK-rD)TxaPKaMn^{WncgesDrk#fex$gym;Ux z3xCUEQ1030$J_jnx%nky^G`Dk1vyVm==NO#S*mvMAxo$45>WDiWUGxJ!`L|u@j6Gt*!QXP1g@K{&i!65NDRDWVPMz+F4bN% zKVXC=G*G~YF6jj4iB52l21@s!RG-BFFTnx>Uf4WF3FsBb0o@%6%CW7EU`w_5+h>C^ zVas%jdx)@(-N4BF@+Ww4V0Y|>Ztl)goxU41Z!uozWPS;nf$EM0MMF0OGjn%r52#K# z@$dit{})~!1Pzz?9s%ib+}%K?_A80sj(o_aV$bt{j~oJ6)IXZ+GNN z>vWxw*8Jlmf6Ek5PH|n*{D{Asf!UFz;TIQw%PdfD3zRghK{djZ`A12BezGgP`2&fzdojKO+ zx}>`Stknae)fA$YnN8aXq`V0{B0Vl|pSs)HXJRZa>MRUO}kZZw;H7_u- zy#$?+0ZNi#9F~C`{O!Dg3=I5D-vt;LKwP&#j^;Nkoxg(u{+F(Jk+~4mEf9Fg0Xpw` z7pMSi{>{qY0@^3j{F{xxH50Tx<`m1z#6SQ4PXHAUH#=QdK*MnkBpl1Z;kW`Ei2U1p zmoz`*Z}`c@-%yqvuQ0>I*#R56j1~!ifKEtm04M$)=w=2j00+t}iA#YhsFB+9V zwcU*7BMQA`4F4~Hiwkv7y*p*T&4a)H89`}cLh~u6mmZ+P9O6Jw_<)K521d4*JAVKF zKf&l665If61gD7ex(T_M2^KARUDPDo+i+JmsJw~QgJxpoc%e@i(yka|E(15o&O`>p_m zS1kXwPH=b~WG)G8e#lbl)9Jbd6vLr&x;;#~LAC4(X6EidmhN6qd%GJl_Ur;aK(YA^ z2PnjX{ui(W!h_6D5!C#e)9tzh)SwAn^8Z42=n`;)Wj<(rxo7$dP{1K2fCn)O(jCmv8M*?LpW83< zfwK2rK2Yd`L^^--L-IH%hi`b%J{OY1CxA4%Zs>+I`6XU9fcZzdL6^#`0hOh$Yna_Q zI+;Q1LXYu)o8%JUoDHv*K*x(*IQW_a+Wdx8N;e>t(iu>t1g??NSwT%z^cv|f3!+Af z<$%^mQ$X{Spc)CZQW91pv9qDnNZ@voFGpwS8p8F_nmge72$cK|cDl~#c0JPB1*-Hr zn?MbK?$9;IUDtrxa-i;>0}IHRZY<3|wD{ZqfjV#FNVqKMj$PC3x&SR) z+G9ZLGa!9DYu66`mXKw_aAzy+rlUt06ekNhp% zpy+a4(aiv=mbSSr0IlKR;%}MB3o3S2bb|+NdYvE(m03V3!uJU1m{3O+%?q7wuquY_ zrSHf8|3TB81^kOI@;BcA%|!TefQxZR7O_0V-&zYgB?{Ec1_wd|I6!=lbh<8i`TpDg z|IB=yeV{IIuNO~eAE>4NvgrN)|DdWjw5QvRgPFPYQYq8_3*E76I+q)hL2}Pl5Yu%AH1|Y6w5Ef! z#)6U{B>PMNDGK9&L;$o=Py-SRJz{vE^->9Qw-XDq8wdC{xo+1PpvoD%ufuf)NDH{_ z)ye$Q3#0>5aoU5J=nlRFYLz&!XkK`|xf|j*36QcNj&5%b(0Po?px#6iFBb!Y<*Cl! z{O%W<->?MzFJ17zbj=IBS&)qN477j*GSp&t!0@Eu?U&2mfzlzkq}T|G64yCUzd~#M zZ9EJN-LV^(-8dkA?Exu5^%tb9CU7;qX^tQDn0Z6!s`>z z*a2-8>yDiRjU8y&rV6qaTC$+U4*1+jNI3lm?SMnqdI1zWpl||Tr2#K3G;ee=zXWaN zgIWtZce2}oqdORMXl;8RIPfY!fp-BEc!xm8;ruUM^S^Y%i;puPfj1FR{HIL-r8-cO zgCw>-P-hX+k96heyalSry;%6SJMne;E&#PWN(8%oXLNHi`YuQV1<+m4ouAu+c$y#a zgPL-!XFq^4We+H?9|AKM{J+4zEsUkpbpfbSYTNYzkv~H>fUf#x2m+l*nf@9f4iDcA zoy;$vf%Xl$&gr}XZB>HWFCKhpoxTgYJy<$@*YI!mU69u4I|G!#ON6_9=YZU{2HH>o z`4iNgh2-Y;@$=yqKLsxTLHx~_Sd0t%E8H3mpV28~OwmMAy>WaDq` z0_|ct#qzT0J!t(nsI~?<=p|^uEvVc+#q=`cJ>2;dEI;u#cY@R67Etv!p*w=3o1^&v z598%d89~cqQM!+7VoDXMpOo zR?zfwXB?>MdiV{f2fU#-5L{)q2ZAm#Ze(D96im*biUgxz>H;~@&@kUv@MwS{Z`6hd5FKoo1KB7+jUE4=#5U-JKe4wovu$_O1%F6ACwAO9)RkiH!N9< z;JD9z3HAhNZ~;7+;0EqpAq^&gdsn@z3=EbXklvLGXg#GXN4M{W;|-uT38;nF36|@1 zJp$@AWicZ9Opvhxwre0uaE=wUTzL<=V9AN6!*#(+&{|Aras$P0?FOVqP;>1DR!Aw& zzwHu#OE_r4q;>-vf9nF!VK2zdAkg{}!%Hs@gSrlGpdz&sR4{{w^_X9(gWCZd-3~R7 zQR8k0jcx~)ULIy^-wmZ4n#X#1#5#R9bo+L+o-F0Gj@`iDQq01@&>0H~&6kz0|NrlF zUD0{-<%`e%|MxomZ2lov?hLJw4i;O2N1>O10;L-qJe{s9x5qAFsMoRi>-8H!%s%Z1I-6mtzB1?Y%o0V za{U*$J8a?ZFz$Bc0AKD5F~ss9e`_`9j6YDsadbC;UC;@x7+sHa`p$WI1#~aTFHKNv zPdUgx#dQrtAOE(KV9R5mmTzyUUBf7OviTsZ<-w9oh6i3=`}6;Q12p8BL3OY2`~Ux6 z)`JcqapeGwQiJ+VuqMD?P^%cD3DEi%>@aZA@ag;i|7oCcua_V(C&;MS0#M^U5W1gx z1#^kp3YJnQPz%G8r8~d`G{nOIIxp!EZy_BJ6feDe_5c4%*FXRNw|?twFTL~kKV;DfXnYJb znZVLu#lYXf1xk!>SOR+6r`-7qI+$^z2*?(Jm#0AkWv(3j+dIH(aVLO|fb2Zcc@1=; z@de96{LRK}pkoF=XPiUtHRyC*@mc~he${ybat=J>1<;A(6QBM6-)zTN`m)H-Ns5ExcuRL|OQ&l~X9N!@p1^*F2Ea>A(8`w3EytZW zK$!$w;J;qh4a%e&kTYo(sD)Vyx>x0Y8As>u|79%y&0g>#>}dtH#>#j=3rfXb{r~^^ z8pt9C4N$%K2~?()au}WjjWGW14l8J`Vqxc>au9Si6-O@*_>`;f9|N)^Uevn%{@-27 z0lK@VZ3Sr5{s4dLmY1N-FW|*TVJy(Z)MCcUz!22=JD|5+o1+Q3wb-gdXyaQTM3(39A)~=uu;qCwbFJJx!Wg$qmVg_Z@C!hcS ze+gP+!+7i^7ihp7l0fA_IV%WM8OIT(3LVwFDgJIG+~gzM1gMC zB`>&;pqjdZgPM6w2K} z950uC{SP{WAne73hah8)Kt`58>ymZeL1ng~%S?Ft|9^Ms67b<0GeMGVpdKuE>{;OD zy0>6$|4V1Qs0GQz&ggbM0$MBr?&iMahu8;_jsr=%&VcBHG*Dkwf!5-KZta@!!X6}z zrd#35|NqRsTVCFL{2z3lM!x}ga{0nAp&&RS&Q*UcqBoB6*TXM608ZJgMQ(WbQ#q3c7{e0C^djO zH=srzc(ek%Xs)FK8c)LA4kpY2usf9)x*3965AeHyr_uu8@zew|&=u6n1_hl1$4e`) zZg8m_^9foi2Y>qizZD5`xlXp1qTpEJ34RfYu0afv0)k)Iqstup4C)uo z0lPp6B#G<-T~L>JC%6T~-?|V~$b)A;pzWB{{L^@ z0oA)6)LWeZu8|Qf!WAzcgO0QTCCn8smfZsd%?eP&OaLYPmk+>Zfi?j#ysUWulH`C+ zNjPt z^9B`to9_JmpV19I0IYq*ZP2RMyH!8`_qO|h*r1mA?<|J@1uVx8fY!i*mORMWGBEVE zgQjU;?gzD`+ZAsA{SUhKJ#7L6g4aWU)+dDZx;_YgktYUPhVf4gvxdE#Xt2h=cmrt4JDz5C!tNs&R?A$_}5;z{Oa35g%T#vjp&Tv1wPF`7{SX}ns5Ja zKFG+w^w8x8AQdc~hYSyZPOdwo_^H$N0%-Q^isCQML#5k0V>fiW9)aFzef+=$P{y|C ztUUnQgLxe^%mzN`oqzj&P^I5ldjcdr0aVeuf^Wp`JpNi7)bD6^J;T_1T%p_bjHT-d z{uW-)AgMj*KF@L)(1k8-pnD*C-TpK`_+5IX+x0-VK)1UHb2vvQ=u%mpvV%K7TZ1}3 zch+vvyzu>Y=keFdP=EHiuyObL@cmc3!FWRP2IHY#7AtGl3;fNXeap>N98BFz-CiuE zH$fL`Uump@T&aD!`6pM|v0gWR#lwuZdYw4Btr%-Jbh;ksb^OukdIHiO>8?GpLy-Zr zBDr_|?ni(BLzkP|g6?xK&uM7#kmhv)&?%FM&py+lz(|lY36cpg2(bFct0vK{lOpTsQPq zF!r(>RR--NJ=9q{2Yiod=W|WsZZhR>1s%xW>!QNnU3vg?)!}haQ=$;mZFBq69lHRu z@z(Xg!3RQ|&Me)rYyOum;dWgCN{tV?V~=#YK6x>b36v&JG#?RQ{LtyT1=Kz>2JItr z1>J+e&{=z?^LrZj9Fua!?${$?FB~WS`QPn(p*!>p=(0VTv!G!)&^kHa6a3rw!6yPT z-n#s}we|pi%M)e>hEAhy-xHlqEZw1JdPAf*x??YN`d(;0%+y=M#%Nu;rD$n)?HN#d z+|lj3hw~zT%Y9IybG^`6d&cl2XyKsi0Z{rpz>>$$(dmkqPj$V}9lEEx_DrwIQIG?= zU3V~khh+$U*F((@82MWurwj7*vYcdg-2(D0dqAh}i5CqMKpr?@cnQ>8a%TZe=B4a?!4a}yT|Zycj%eU8{M%NdP|HrIuA7;X5#!+V%1%Gpwo3v zXYGz&H^xrT-Jl0vf;KlChX&b?-Jpc=5_Dk#G#P{LZv&sH4f5=V?of`_OC^G!x%yC^ zPJ_+>mR^?o&4(GgOOG6PU||NWA(?jW(ck}_0+z9J_*>&ZL!9m`&9!qFJ6(71x6A^~ z)4I;-j@{AAbMyyjLAeQkXX%A*P*3_mZ-^XI^AD!7P{vEW?mWFQ{4AjCIRP|yz|kAR z#b|lB^mBLVoaTSbC0fn@vqoZjO9ogX_(S6qJ7{F@1~832?pN|$tA>z3|}-O?=&DwksCG{0u* zj9mljKfhu5UwWWB_DJ(PrvIf|0$x>EiJHLa{%DLCD1I3%)F_xHs zqoMQT<;ShROWrlVVfkP3iKRRC$bXYh0iB^2URZ#P2)zI?0CeKhJI2y8AZ4XHKz{o7 zzjQJ7upwlf5adgMr zXX%ZRWbBOk(t51)Y3qT~>)pN=T2Gd+Hos(iy}jG@1phYQ6=1`9EB)sGMCe82K zp(lD-et-<^EZa&5c@lQ98MDqa-#*dvIKbl`LmVW4VJ=0w)0_u;jBNcqj zxpNr1V^6%)05#)d1wdOA3K*LY2p(r<0_En|BLOe6br4B{zhydTJR=qq*uBmIoy9Dj z_rNLRxHG68U;xEY>5l*A0WYSu{`ucsD*}n4ZdZZhpe+laMJS!@FPlMQTRtLx7+(Gd zH^V?H(*NTvU}u10 zu(Jj15dLj!&Bqx*Cvqu*_VIx96oT#ohbROU+nt|mRQX%OKxG&tU_k!0G2m|j-Kch~ z^~B%*{}p~Dt_I84n=h|qMN`WSaT{)VMF*YA!>1OB*<>&-U^KWAVH-T*Q_*;A# z85nGGN?2^7O4<3hxiNx{>@S8KS6Z(FveFE+x*QT*PzoRTU~q_nd6CVc}E$f^rgS@_Bjs&;S3{Q$gP0?*%P!=-dj5-p+gc+vb8i z+qoBXHG4NWMnUCt^9#n#PaP7Phb({9eC`IT?FK7(DGUlS&@vj1=3`9FhgrG>__wij z#&Wz=0TnlpEc6m|rvfBIp%Idm-P;U`l7QZ3b#QDj=l%STs-oic9m7j6--D(xz##?I z3DK986wuoo0@isl_ve3T?FCuyAHE-y1H*z}^mBr`H}X=T?oCDp0|N)c{}Pp&7ZxR; z(*Qs##|4{@B!IU)9EKV&0km%ASg(r;OF&o_^NYB%;3~ECKm}j7i;7Nnh)PK(Q|p0J zMX(Lv(UEG%*`1v~nvWzzgLd&i@?-NG4$#@Bpo3~bdwK)17+x#{AH1*7dHnS;sBOJv z;QL8lT(|i7pS4^PF45ET*7b_meHMBvuQ@dF~DeMJl}6hSq{5gC|MA@v?;J^hR6 zApPc8^n=0yuKywE5E5+qo8RylUg~vGk!XIy6VUCW0y;oU;l(C29!Ta3pA zuk!DM)HVA2{Z*hU@25biZ*Rc-hF`4Zyv;AdUlxLDI?%XgZ@_+#ph5Es^OvCY^!(fW z7@Hs7Z}=I(-wIlk%fHW!X(y=kZ9c~Ik`JT{l1{o^R6@W@%Ux7LIt?0XRP-52*}va! zzRK|ZZu1eF&L5qxz+KU9AC(YL=(L_Jc>&VX`Kr?ZEDx4Vn*a)KhUR08FDHWPx-tgP z#S`Gnw-=PQTQ8NKdc6S@Upqk~=AbEQhL@mSNRZKvv

    ju-W&pf-`P7$^}nz5yM0 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

    ;+#2_Rx0G@e3nH;7JoYo6c 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 z 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%0A4%O-`Wh?TZ+5f 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

    *3Xz5%LN)-Peu0QFP) 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 diff --git a/tools/ido5.3_compiler/usr/lib/acpp b/tools/ido5.3_compiler/usr/lib/acpp deleted file mode 100755 index d5392cf67a880790560d854df4886fc8479a4384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93440 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 diff --git a/tools/ido5.3_compiler/usr/lib/as0 b/tools/ido5.3_compiler/usr/lib/as0 deleted file mode 100755 index badf8c83beaa359d2c413886d60b05f0a2eddf98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175296 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 Dw8l9a<*zLihNC8+_pX zetaN%`jOp|2ND6_8-VH-e~7s14+cii*=opoKzDL#F|sIt(m5#3;dP_{i##ZeFJ8`) z4~lD*mNZaXKx6W9mVA(D>N^=6m?S+E7eemBX6bKf&VZ>^U&;WQ8w9KEZ*EQyV_@K1 zQ^3F=ln!Yp_s?u>0GRCg#o-S2Xt;fXst{COg!iI&urMxzXWuiA7q|Zg$<$?>=w`*>mu}Z-Crd@c?mRk z3Y{+lpScFI7c@T%8h2FzowYTy;SR_QkT{42iG$Af2F;&ha}QVzs2&Hc4PVLtUWWn} z1G!-jgGB!#$a)2J_`2LLVE=>W8sKMjfcF0EVUPf={ekTPQU{IEL)Nz&^n>P)XEtWQ z)?a|l2dQ5Kx@({j+@3;qFX;Sr@O&g+MFZmx2}Mvk2hBBr&)AvS*a0&KJfFP+GPeNU z$FYh*M}?Dtd95ddK>upUy8X2Y3>^JypzH?leV9I=wE{3Rz;0O!HDeJ2?3ZL~0 z7);hLV6Xw*MX-JW_+GUd&{|DU7_0}KR}Y%Y0F4_UovR_hz#t2%3se{xv_%rZZNoZj zXMup-gsKm;c2!A*k)aM`AIJ=lK2To`Y~OnDeiz8R3X(pMIUuzHi41`%j0_r}wg~8K z6oEtr7jRoWk--UiUWObfegzmH`))vHgY<&T2GO8!2h;HJ2NfS=ITc0*&Hfq96`*@^ zA$MeHs0uSO1cT4X$Bg$gAoBzm7`(yqNav7(_5yj{cqkb49e800~I>+fl90J*EThk;?jYX%0*Mg}I38W9Bs@%5lP(4c+=xdD;R z)4}s=pgTCgc0<)5$%FQBK;jP9xg%>CY(V=81s8zMp<`eG-P;Xn8!#|SC<`87UIIW6k=-kiC^)KB7#8^?{)0-@k{Qf3%~&xw%4xkAVT4-uc1fRJ!mq zzn;Nn{W=DV^$QqWKibti>W1DNP(Po6fq|#|FeqL@=LM`^ z!(apQC#XE{U&`R3ZuuQNp96|>klWTTVgQ{T2wKZ!)87Hj4;%~(6W%f~XfiS|t=|Dn zAD}z|O1IGTj+Q6D^Jm~Z0SW`C8blan@PO=sggK750O?!D;2@{~?c=UuumJ7HV{}MR z*G*(#WNb`OWZ=$FUcVN62N>V_H4GY{`}F!j>OglR?qslGW^hnvR`5_?zY?s5b^Qtk z4Y2%b2AlP(7&O+e2AzqIWqCP@T}iz@Q?=pfAwKzz-f@ILyGSBF>;H^q7HLMUKHn z_%Qh1H#>nu26h!;hB%>Q238eO1~s9@;B}HUV$BSh;4|oEHr9aTRYVwSK=L3nLFRzW zU~*^xug5Z&$N*~lgWC-t_k+S8*L=0`r6WnJ&9`j^k02eYQO~0ebH#I+P{fG2EJAYtzX*@TKBY%0lar#9cc|e zB;CD)oqq~TcPi?Z(k-C11)wo4&|Ezz4x#Bw0hEV9@e3-a)GZZlKyo1WfY#N4{MO$J zExW-!VPFtg$RGgP6QIHfPKTf|EmeU=@I0W6KqEB$H8QZP2r z6^2QmIeSq31-`EblnwFJNRT1Ae+OtzjUf)CN23uuC(Eib#_nb<$GVN3rK1`AMopnn;IM*ni8dK9#-5mF91 zg2J$WX2T95)S5xn?jb_0HdO5aBGf|4;+YLsh)^pEHg^Ss0jQ2)WC~CNodvLdHF!>& zZ#}4NT*F|{zm~y-v8h0XadCyp`t@Krc2NBQ3g`Zv3?|G>4yw$`9;)kCGT5wN!C(PO zFQ9ZY0iIs|w;(br|0_XkA(#Kw=aG3h=RP%yDe!xfoAj_n*MZ03CHpMVIw^7&O3RUZAlr(E3-<-fz&jI7l26 zo--RHKxqQ49MDh^WYF%P++3j|#GpGV733NQ1|d}jW>CC}xiIL1$12t_SitkN5Q8q3 z{0yGQ0L2B!1dw}>!bU^L01_rbLJYk9tHAkG7-SbHje*h{v$BUGqcVp!gN1`4Ba?$7 zD6N6U{z2&uq#o3cVRTARW=!VLW^4q};QHQX{Tc=fkU1bbg;f7v1G!nq<^NS^I@0L} z`Fk;VU8F=m<{gUAwDbhh|7!yG|89WhIY4biSX)@YkwE}-#{#%N1)0OofX?BA=DImS zeMRV8NS%NqxJ=YQnhOyHw+(Ukr*uH;@j+uapuHX-e~2Dr5Civ9vGftZ?I=*Y1hX9l zI!6MWEwxl6KMucx#(Tj2Ukcu{1e)ss)d{5dUk26xsO@RU zSP?i~s-UGy&^jD&*ns?k6gJQ^>CoD0pgmr&JI64?#)n`V6H=xsfX;kZVS}sz1&!f? z@0tXSA2EZ^8`c4>sRX%attSIRKMQ#7Nrr(%KwH3pfsIk&gsMst1L$TSZBQFVQ=5Uo zG6}NA88N2ya1SWFLF>^#cfP~Y*!m?53hS3LsH|yVU;y0#59-5mI<)KY7qUvvCS?c!JVDC`>`_=?9%d(cfIL_7FULtwbL(2=s&2#A0zL)cxRn3Lta9 ze9-+`kaWhfo(X)9pbBVDDfpf(tZusxKL4hFX5$P{e8b!ZGH*SoodH@S%*bE`%K!a4 z88nd6xB#f1jV&&~?m!Qt^$ei(2%tV6^IFh)6A1>!^`Nzs*xdx~|M&Mbdw|AvL2F|{ z>r({}Fld6>ko_IaA^n}r0loYTEWOGM3@U640u1@!y-~cNz0>_I%_03W8*lWoGcbVm zwuAhl(!u~5bAhzyI-3JPW`Ojr1%**}^MYOp28LeH31rMC8JHyl6xTX3F!bg^#y8gb zGO+X}LfT<#9T_-!b0PcJ*ZMN>^y-0p%fO&|9z1U%wpO2kp})O(N&n1-75y#E3woY2 zFsQIX);5Fslb|*&D2?`m#=BdZ!DpO-+z%0FVCZjdmI0aAQvo6w7}O;h7(r(#gW4OQ z{0SO+hseP8Bis{!=G6dD+zB)=@Poz!dtmFI9pG~tCnmT+?l@Fm3W*EQo)s0Q|Nr|J zF+_mIYCz>Vm=B4Q4KTYPZTh?5`>zP^$E|(jfV` z#X)h_3fdFcFk$_21{F}4fWvxe4QPE6=zJ9w=$R4hYZL^g^v{5p(=P!rN1TDd6P#C@ zo5833f!3ab+{xe$UTX)QLkIN>KzGZnNe7QvG7CIp-~+Ag?uXgkhHAgc(i-qsyvnf} z@Ojhy%OPVXAUz_Fz;n;c{f*6_do$TUbBH1jA!RJoohoaT1g7+NG$b&vpJ-6!5SYQN z;i1?+vta_vzFsx(+H>&PlPXJVBKkplEcY--O!Q`8V1%4w2VQLiQxDRM6fOy%atY+e z{YWy$c>-U8yafs>0>)`z#puUd!-rtaOua>YVs9PF=&ME?* zfebn;5fmQ%OIZ}a>XtAls9PE&!0klIuPo5>6R$4-mE)kY3zU9geg^4*w_}!o_w<1M z2NDOn8`gFLr5p5n$5HHIfZ1aKwdVk`J)rU#VkYDqWw6;qn|bXC*v!6W6_A-&@*X$X z59s;94NHDVV_?uY2;O50ncwek2DdFh`-nkq5`Dm64T={~I58YRIfG52e;Iflvj%#m z1yUVUQvfPAL2)8*06LBg@*6adBc;z0uo?!)+I!@5jHCuUt`Blc{|v~Pp8eny%>dfa z2HM{u(?7Erd|n`ET?|N_v;qSk*v&|G_O~@>Aejj|!$bnKj~KLm1*8XjXAh*k0Ip|1 zVvus~Dy;txYV+;^rxQ^B0aTYL{NM!jfx+PbYO5Y#0PUjz?RUZ!Cg43*Aag-(!%XK_ zVeKCbdq8msYQsX(3;3KvP}r*=hZpFK2qgbaKynkla%2H0{K0Mlg%x^w2DO<%>pRiU zsl%GiufXcR3!pI|_}B<&Ok`p+1D3m@vcUU~Nw_OYg$X?7t^*&lfv!IUm1*jG8K7r8 zTs{HH8=!Rz;J5$^*aex+P38*qKNC<)U zmw?PyS;W8yx;GA_u773|Xbjb6{bKNW079Vj0X7pfFAgeq7lX%DRS38dvNvxPg98(@ zf}$Y&JPjl_J~jZKp#riWb3&S3e+d%8B zK>h`-H|uY0J|p75z_Vr%s7`4J>7UueqteoVQg?vN1*rqkJ>U_41_l*A2BtN644^xH zWqKAdFhJuSTFzbs_y0icul|naGwU}nh=9+$e$W8gw+w5SXn@-5q6`c?p!Rux3)pTB zm6ir@T@SJg>_$*Hb~K*>@xf*=FfjD8Fv#@sF(|0AGAMxd9f&A^*Nq7D&uo(DWnlo< zL*OwCSpCr7dSzxmz7$g{2K>aic#r~O1BA|6Ips)hTfzDX~xn)8o z1H+Oe1|~!8|MiBs4Eqh&Gu&U0&A?#zli@vRzsQ1o1_onIhVKh185kC1GB8ZZVqln% z$-rai{exjiHUmTd8U_tRt^dqxau`_p*D~mU&g5K^%fQjUp22`YAk%??|3m|`R)p$; zYzCew`3yXU>zE%H{`e!$c*8?=3Fv;hN(NrgIXA{y|KBgjV&Lsx&0x`!#K6Otn4rSg z1UehHnt_4875Kb7-4<6 z#vd&yNar{@L-N;zOvqS_q2>SI3o02v^P#A5!NdUWTY~ntujK--e+JL*K+^;C41)6q zpydFh&9H|-f~A3h3)D~OZ-&GzY>#kH9>hFG$i61%M*!g8?WlgVHcOErZHn(D~Eo;hw`_)053$p}wBMp!XqYzC7aq zV{U=s+Jg)Xy)PM9KxVH!$-n|K8)RNj5+q%K;(bjPq#RJ+3z@qE$wR{XEUf$|Cf>ng ze$aS_tk(wR+m?n9P#E>kY~tvB#$bb#2EcbpVNC-S3>J_yaN++13gw+d$`j9|o0ee9WvBpt22QE{6&u1CtOVc-!b*NjaJUZz3f1J)Mp zhwi6_muVXRe=o>ju<7rDsDt^x*BRpHo+RkKMcxdIYqA+2?OQ~h3$5!;!P@_zG6m(X zUQpi~oPHP>7>G(gGa&8&<$I6|#9{Nah%|?pema`Z^zUR)0M%!pG~dg~zyeP5ngYrU zOo7dya+uLUKoyeiPeIDRK5+Sm;#ROb8#F-a9M(n!r*lMp69V^hLHP~jHkJj@z65$X zQUOV`3_HN-4oCUjXn?c)u4G^V`GbMgu>tIl2Mip{8nE*FB)I(#%Cn%h1vt+_??r~V z-vZ=*ZqOJMEYE=27@)JzDcru<2EM0P29`fSW<%ok82J1zym7k#oJY{}IJi#*_Y-t{4dllDC6I9>&{!bY zje8g*rb{wtfydw+3_$%UK?Vj1)gBkndOHo(o(@Qw6nO!mdrmTd#^pE}RRt7#PBAd3 zBr`Bh^=8mgS;}C-kPVt&`Ttp^1*8|#PY8b`H;O8j86m*v zO`}-rOJVTY#UOh@`3Ov-<$28ZmM~^t5={?iP7ItMnIL7ifCF^=3$*rrC4&O95;zaC zg3c7_$zTuxTaeN4J|8pOtP5{+SAUF0Nf~?;Gv7zc9{%>i%0P35A z#%@9FPmu-&X3)Hb00RR%c)o0ABl=!MNLvl-xY!}^_&+#*>}LRt#e&WPlL4*!0i`!k z|D0h#gQ@`NJh_GrRe=UjJL&&_kwyj`&^U+40|vo$?4WU$hC84%0m?HV_kz+0WZa?y zv_B41_VTE-G=k^QVDcbZfPuk~NkKrhj}P4bGXU+|VLT5RuR$|QjlrQq6+EW16S7W{ zSrVj9Lr7o&g96A5Xg$cI($WMjlR)N!+#$fgAOVsGjmLo3#msD2!pOxS2|6o}fk8tE z%^n`GJ)pZ`L2JEQ8bTOzK>H#=V;fBw=;}dsfXoKXhr-6Qpm7WBza9jqe^8nQsYQxg z9*{ba7$j~F+`yZ*4?*&Vhyw$E{|@kYEx3)P(t;&zqxBDaA3^kj^))tM0Hs+5iIWWs zkq(NWGzfABXxtRZEk0nkG&Y0oUXcN%HBdSO?cV^UGf;Se&#D29QGvz~8=E2R#s>`G zd(xr);Q*Nd8o%qG+2jM>N4SYWW&H*Q8Soe)Xnoa22GIHq@V!K!aXpZ^3=9pR@iYwy z2hjR(28RBLko|OOhATk*Q5Gf!$k;V>97=-;e7{M8DR_zeJUVdF)*k! z|NqaD04jqR82bAfQW%&k4)mT|p#zd-JTIUKs-Hk?AqhxWsU-jZ&yx86mx|N>A1n!w z{YK!uaV#ee^dv*{fzAu;<@^u6OGAj0K~$yd|NnJb3=FJ}3_PHH_mK41xP!?7x`(W# z33OhT2FOidvlti{;AXKz9AL;!Q0(o6m?y^j|1HS8{+UeyFh7Ib2igw@Iv)${2mS*H zKioK>*st{e59sU{@Y=JPO+KJ=Ss`J{06O?v>eoY33{?>*R(Ab2^(iJ8>;2Vw^7#KA`=0nGX zTEOOK^t7x1pFO6+&L9bLJJ^gyNSv-wTA_n+x6d91jXrJA8EOqF4BQC^dc9WY*zhy( zGx}sGt_6)V&TRYuI@}URbgY`2Dwj#9lVcM19Ubv=ne~z97r5&C&*mT z`i|Cy6b6YC2UM1>(CGn(1Oo%(O$SBL{xnd$^sHoHU|@+jz^EOd*z3f=0y^Jfoep@- z5@@_yrhg-YLjNX6{e&2+-YWx5>pMXH0j;Y9uc_R^ptF86gT{JLy59(G3vB@JBQ$`l zF>dl;|9?SOkN}x;6>^4*&4K3o zK>qAK0_h(}G(h5kVG5{>tPld7)7Q@mI{TS{fr0g0lUOAKGXpDFGdPEU)0qM!Z-LAK zt<414+ds4M4_Y`H^nlKUnA!LNw3Y=V2TBJZ_d&zo05lE`(g)HH5(lXP_0fBrA^mbt zx@2PXP+?RKP-EbVW?W&+vA*qouZ#+QKuR9=AgWJC0V)2;!N5-4r`2d}pPxfQgQ z7g-+c<_VxQ*YH72V1-T}^h`pq_#OrWP*nFfHh}h!nygV+VE|@>;sP3<{hJvy`nNFX zfc7eY%R_|~CXjM$H~9Pm&^=M=d;f0$tqTF!3u-6!ID*}#puUd512opv1M06aFfgpW z3A(eY@kjp>2KYW0XuK&1Bru4A=UWpY@dw)r+^YhQH(myofCfgF0A&WQfCkX{j=ib> z|EPfO;bKi|5^ZE)Wnj%_5JjASZwIOKn^5n_0-aO0guw$8R_hl*?p}e01?avI4^aH{ zFJ(Y(<0!!6brFLL*0^24-~x)rUS>!2GzBUhfk=jm1N*pzm&lT zqz+^!L!yTYXs;ktea14Hjq zP*^rqtX~Q_-xg#Z$R02aIj=te6ki}dB))cn_rLZxgXh9es3Z%wfYuR!;!VJTK?f9X z;IflJLACeX3KdY=)P&5Ns;aOtu!HtI_s?wn07}c?cwPWL!x^+E0CZ0lW*CFk<7UV%(r>v!rC(x&g8E_x9njeA`t=M3J)kvQk`4!$IXo2CD*pcg8vg>hb*;|-KRqd+ zc2iRY$e%r_5dVSv3G$x+1LW>9NSjgs+Jz6aQ^!GQU*l;lL_r71DV#@LVzu*H%{RdtDz_CV2xCIm* z{h&L0mNS6w%LSzkkQdc?>MQ`j9jJL3`Xq85x+@T7dW5 zbArMRlIEdt;EEatpm@R_uG@96g)1mb!E25BpkaCr8m0$O!jv5rrl9l&_A4}vksO}u zq2ZZNrSO~q4NnPJc%C=_TYK2!3k^@u+Cx2Pc%Elq1c#?SrQx|1(*J1!m)|KWPAgPE z^%>}HDb@4;|AW@4fZ~{eKi~j74KHDE0L3+EjimYx29x!SkoA$E@@YLU0}E&^J7_#b z^dKng1yrHw*?)}!I6eP?-d_hkuN)lDkUc9lp!yrc2gM7B2BmYb+L=uOptOr34m#ta z3*zQpuN5j_H*zH$VAeUH*vrnq(a#MkyBa?*uva!P@Y@{%-4_WeZ$RlBWX}54kg`R^ z7j!0YBZ`~WuVpakU&mko@(--uWIR}*!uZ%jje#?mfr0BZ6SH!H8Us%xXkJKxfjjRI z=uTfy8WLQ{z_P}NfunyNk&!0J@cI2yQ4UBTc2a=R!aWS$Rnzar?KDp)-W-uD2B z$B-UZ$i0D}dJd$g#f5>1VPOEcU&si$4{kO1ZpVPu90n#(xU65p;L=+FxjPVKKNDky z3L~iB%fP_7el4gT1;>v||58Yu4%*iYQrEwM!DIa*h5#Jt#symcqNKC_9U%3MA3$s2 z*KYu=CD#DeJ>a{_LG=#U+$G?>ub}%fAZ-ZH8U={ou-XM}^Md;#ptJ=F|Niw10ibiI zd!In#UW35^6c!AP1>kjoHLgMu0- z1LGRd8va!bHlVa7>IiCEg6F0~K=%{%Hi5=LG*lUw;+jMg;b-x_fSC<;m!ksM?*1hV z5&bipYEb%ZYZ*Y})e2L0fXrcFFy{XwzjQrl?y2zwq7MX5s}|6(jR2bqn%{)3e*~=` zM!NGe0+RMNg2(?sWeSe8=YW*<46vjS552$6AGS{cRUVX9 zu*E&7`~=DM-h`AP(h89FWgiD5jWaTOs0b>8&Wr-LK`h!>AoKTXtdMfPj~Swl!7)Gu zx!ndb6V!HFhsCWRxn)e?`*2H$xepek9%K(FeSq2+p!CO(2;NgC0P+*KtYn9t<;`r? z1X2f54_4<`paN=ZGDtdu`nC!T9H4u91Ju@Wfx@uy2h2a9wA%w&kDxFi8!|s?nDhVl zf*b}LP+WlI!Ep#GgCKjAq5GTGgU|nfj9=inM;X!wkO1A;j7T#K{Lu1B2jo^z9SO2W zfPp~)(pCqTB^sb}*OAf;=o}OiP?`acQF6r{THDRQ(BlhU<6*(Td#q{g4+e(*oeZG6 zn^{0%v0jgXp~r)Pqkk2H1IQjwoPzh*%xq%mab;it-7^9+A8aNl-9p9y(at(q7XvQC zXEwe8`4=?S1JVZ?>w)G8V*SU5%YPvILGI~?x(#GLC`>@&U>d8t)*hjfyM#e)Jy2Z$ zcEeJ{URBUKrXD8-(A_Z-3`~AamRbx<3|!#7N$j9;vYsT!d<>{ev&>=OW8e|c28o0E z{-C-IWn zl#W2=g7&U6HfE@ZE(F~z2EKE}7ZheaN1=7c%%&8ux+M$=3=0o{>rrL~a9M03;=sVt zzn&pQfC1Fr5KslNdjc33RNpZ$GF|}R1!TE?9YczW90R+GI0Lte7z3Y*C!do=>LoB!D8TfD5CC@0Hqzo z8H=kR?O&w)2g-Y(xCPzQ22B^BJg5Ro7oa!?rwd3rK-m)pYNukfM;0@H_d0^spn>{S zAb<6wK+_3mEJg(}7Q@(*p|&QMfoBSIJ|0vLo4#XESds_slY-_B(aMii;PEd|x`&k? zWV?SQgUJ*h1|9~^KnFu_<_Ctof8;@B1Y_<2)g=+Q>|Y64{|*U1@OmL|*zIAE0M&z_ z_9Ms)Q2G@;2)e%rbdDb4?s`yI_P9XWiy$>1wV?JfXb%$O0|n6hBzPXRe`Zq*NG-^0 z5Dh8^Kx(0J30>2%61@Hw8Wv!;AcY0EUxVfz4p12cYD4t6K>D9xvq9^S85lTJK;wNg z8^L1*urUIdJXqg)$bN=3`QR~1P~0eh+yhbrDVJ8j=08E}k>7yIc945O^Tr^5fYu}T zgVqP^VUU2X!2z#r0I$1&l*#Dk!PY-r0NvjV9@pQ@pu*5FLlwN28p}Rv5$HWS0t^hH zpfUwCz6ToT2iXsDCum$)!hyjLEJtX(KLNDA2J3jgDab6)7%qsWaJ*j$WCmz_fq|vt zK))qqyr0=nLa`?UGCnWF!2r2Sa8d(!d|WN4Swzk7{|`1r1|F5<|3CU?g2w$JV!zh zS)&Y+j!dBQ7D0ATNP>znc`||4KQk%_sP=e)WEdC>y&3ogLF*7ea~v@9e8A?(Gd2jQ zPVj}4%?!MSOo9g(*g(1_BtgZPDnaInGCmMcoe;qQzRSm0l7U}X0j>@#X5axfkDHM} zKy`{INS%Nx=)QMB2Z*{UNgy!>1_q{Rka>)Z3E=V>OCDJYZT}#`2NX8oFj~r>GQk-< zuOPv|T*w3pCxeRr9~gfms4nnfU<8fdPHb1mkp_dh+tp>l{c{YI#75)^7j(({uj`i)b+6W+f58IpfgQCZ41zv)SjiN zbvVPq3Kh^C9Bl4^@qq?tf1C}dJ>GMJ0kkfTjX~mElei-2JZpyr6+s3@20@1gMkeT8 z8;lI92AK@@pfP$;MFwt01qoFK!GHz^uL#B790mpzcK-hiJh@CFZz16iQYXN`pah~p z>xl&t8Mqk)3mQ}y8AJpU!S?Y8B!cT;UT7W653PgwL=qV|L1#Jl{(zb*ah6HsCyKc| zP;&*qY6Tq{KzC>LYC+X=#WIP!MyOXaWMH1MhJi_inSmKJ4lR<)zy)@%U_k@S9#Gga zpxL8l$iOmT1p^bvpN5!Ix5CPy?0Q{mU3^Ky!sXhZs1-7#IXWZ3z(Whqe(J934~`1vJ2C2ZPjs(-nBm zs3`(8)(y&6AR9sA0t^g%(Dn+reaYY$0d89|7HBAfOuy6Py{C4AwF58{{zX zi#9N@807!|z#$YD{zp*9*Kchx~>H;qYMvxe0xw8O#{s*Ys0fi~N>{-HK z0V;DqaSWPg0JXnB@yNhe%LFbe|h&AIA>x`E@%$ z=?UBxTgqSoI?o7n?>&Q~g$e_cDU(V|Gh`lO2ZIR6?0!(&b_Jww4?2q!lr|V7eVKF> z!FGZ7!%fL$U|`@#WB`Q~V_yX*e3+KxGcc^lU|{Lr!QcS04>V5%vXhzdgbK3~Y@9Wk zi7^S>9tQ7U2BjxZx&qk&Nmug~Kz&ru`Wet3dT{#+wEub!gM>Qj`LUorlE&nn3@U~{ z80?KT{vQCh9XUKy7lZB`1Mg8p%O9Y%6`=iTkZ}poPuHD2^D4yB!6cls3Dneuzn4Lj`~^# zo!%wjF{23eMGP8iTp(kFV0-s4NPy05?Vs7?06Lomlmkc(KzLoz9B}&|qz>c{(E1~!I92Gy zx~`~khf0g^1b8@u$}`Z|5t-|XAYm{Yy#H5y?|*^*F6h1q5AYpYpmT{otY6CTW&JXS zAM2Mh{ORQb^~E6TVHppC=e7jbuVc{Y2bB*q8#man)&Dm+_WwWQ0ob~lX2kx-F6bIM z@JuZOL$3s6EP4G728~`O1_98SA*!JBFTm>w7_3#;K;=zS#`;AJZ+cl6Sk^CMcmeV^ zXdV)jUeuQ|yaBmag^j_Z*BjKPV31s!#K6+)15S?_y)BUaIiUCksqbIO@B*YB#P9V5 zkqiuL7cp@3g4)^Z8Q%0BV-V*G&wfNUhfzU6RZxLJ zKvnbqe+Ev80}PoGiVVyW2N*a78+tt$7(nv95)2%@+zc$t%qJ8XlM)oy&SYRvar%Ei zCHemjQHB5CKzc!HL46uf`1XS4$Xc5(Fz{72s9Ub+U|b)esIJFgvt~5|L%$*egSsUH z&)P%~`~MHsY!LhZkAB7ff5i3v|5%&&{|`tF$af$$Aag-$X?l4XctGx8;H@~o__jik zfxqGa-;ZFv}o;8rYkG;*H za{yX+CgeftA;Z)E|1oQW%>d0Qg7-Beo6*07;Y0t-CJb?~9j(n5`um$%KxTvZz2KX4 z85q_xF|dI5Gp%FzBl>{h6{uVlJix%Lc@TUr@-q-0l1G{nR9ae4*1W24GcfkgY)DXH zWpHS=6anv-5?5eI>|ew10W>$-51xl_)LEb{0zU6hrDeqlkY8CGp?ftz@~sV^b8J{Z zav;B`ENuawrw%%E4CGF*84xubNNPa$I6&5)&TJF``5Ua4m4OvxzJ?Xdf12m?-elY`hovBJo3uydP0;Cq~zL^a-K=Pn@Sg=_jGeC6~h;D31ftn?P!z{@8 z5sRUBErHH)XVz#?S<1i#+B*(54|L`V$UG1YF^^-7(n=nfc`7X};Im@EZh@7lYZyL& z&W&uG!NAbJl;MLgBj_FraGFX1uc4UP$kNlYQlMw)O7OWcD0&fb!U0kPa)Zj!7VtUX zAhW>nF|!da2h$5a#}ibZgY-kq2kC{$gK3alD`;*TY(Ec3US%mHO`yqx%;)J@x)LS5 z!PU%cO6X}>3Dyr5+ruCMT1VOsKSM;s0VFQ^06JgT2-+jpC;^M3HF_eT`vN3D_VCMXX;Cz8dH zfm3}6!vRPB7H1ou7~9Cb3dyf0 z8x-heVK7ihWe`BxHwaokoB z<_nCy(EX**Gwgd=K|W((=z*?PQ1N77T(gqF08}P|+J>m%KN)=f8O}BlXx}ErJ_1l! zU}+Pfg(YR-&qzu5TTEqP&{9cduwdu}%}IdwZGzUUfx;iWJ_}`EJLbMk6ZG((ngW?~ zR$*r_VQ6QN1g#b8$zd>2eZSH{^(SaeNQMw79zY=viW_iU4chbj@c$3ha|}Fd5B~qr z`|$rC(Vzc+tUdVu4@eDYuPAs9BN==a9B7{vXwRt$XkSnNjOGiB>7X?Q2||oI8H#IH zFtEV(GxkH{cgiBDn<5z)m+WNF!XCd9dj@Cz0^gAi+t-)?8Y5O|Av%9)fX*&ZNoCN$ zlE1)XCMxVq4DdXT8NVv%@!Oli0N#J!lgpsezlK49fu*1U90%(v6xY6CU_cN1o<$J# zDv=C~Yj#5R>tp7v3E=q;P=6RcCV(^^Dbm0I-hTxtYa2JHw6q}K)d*hC2)aWBG*1gE zGeBtz)W=r|Vqiqy_ul&hGS4TDvey+OpF+%>2-zRo2QE<&*8sD6DN_5P{pz%fQgb#~{(W7-m+5BI9{bpXfj2Zb%6Rk$%wqFwnbU zn3)w6`#^Wcg4X|nS9UWn^nlmpFfcF#IVi5_0MDVRfX~tf-C>Q`ldRFx2Of)+2K5OT z_>UbDX9SJML(UHatsjMzp;P)GbFGHw|HzyEU`_yuFPXu>0jb;i!0`_)TW=uuH?i-t zZQOyn&sG?GcM52)D(Ea6P&?S&+)1!4?+aybs++Odu>;!R>tTJR$zDPyv<4*u$b5-2aEB z3nKRpgYzZkI0SX-T+n!)Oh3hY_qyTZfAI2dBLfZg&w7gG7&^mfBziV z9^^1rpw9j|u(=mV**^#JA0!`jg3tf$Z)`pT%3o_#VCUX-E&=B+q`mYYc_e+{_3!;{ zkTVOw`+N5@$Os%@xDOh)?>WL?0a6P(qZGU+qY-?r4I}96evo+o%!Usj8Y#>n{fjop z7!$}mkbKV(2Cz64%mJ6!R4|7F?4Jh6`aS{j{l!8hb3~|Qjsca-aiNkq0aP-_gG%O@ zP{|x0YM28$hX{5~feI@F_zVzGegV}HnC-?^@cvhDyAjkbnFt;uR_W6Nj}a??@9EgU zAR>AIrTw@=rKJsd+yT0u4~V7Sv9IwU<;{+Hyc{2l*4;=RiNt z1@n9>0nq-0{+UgnJ}KyYD;3yY2&D6^R6y-~&^ZC1u}+ZrYacOKfZPLOgU-1E(V(;i zIwK3@2Jksou<H)Jx{^i(offX<|6;0!nbG8eROWNig#?=5)kx(?_JuAW>53kJRl zusq{>55=`QNaq;A&Z`3TdqC%yLB@2zZ9R}%AaT(QUjGR)AC!hc?uCUPIP8|d=Py8M zb_vMcAiaY<>_B(BfWi+Jb_{GsnUKQ|Ja3xEU;_$2(A+633>gk4sE`+qjTgXmIwT!l zKn_RH{gpjw3^t(ih#8iF@)M*_1WS{kbGkv{s?yR1I->$~z9aZtGf+5#%mLGR3>FOR z1_v0ARVem?ZxLZ&&{+tchZdR+y3YzWAF~W{R-{Txy8tMT`j;`NfZ`Tx253$Jw63WF z(tcoOJE7RG3X)-90GYwS8pr@zW5MW?p}Kr611No2fWirE=MM%J&>3!^umaCBgXdd8 zdtif^7(Eiyz;mqY7<9mE5!Nz*`zvb~Le}>6FJb_%y9BL0hNQU$aQ+9)>%r0*O9KNR z=&WCs1<sml3q_Gto0Ii_`&)sN2`sQn2LC$1CEARKKX_if549LF*ww>k&a= z0y@_Z<`>Z2Nucpin7d%}evmkBp8<*&u)9HLeuK7c<2qL=4>E4Scoghs*!T;mPS~N+ z(hfc+1#Avv>>e|oai0qa@&~y659-%|%mDRw!8GdG9sAYi)Is_`GaG(@{0#FW$S+_& zg2u&h+z$(y|LAXS<`8jU5C)xn4L-95G8T<=R&NLBJ^=~Po_LINWng7vOEY-16m)I~ z$c@l(1H^fqsOt^Db*YUEKgjLi`wu{C2l{6=%7FVhkUM1+KzlSmeqdk#pM$Ev;s{zl zt^itJA*90e|6l*iriSLF4CX3)|3PaKj5Ca1X$XsJd1`c5bhB)NDy#jU};~*a6o{8`G*SA|Gyx%3S$AMz(LS` zs)Zn0T7{9b0Cbfga|LGvM_oPYx8TuMd*(7m<&I~fh2`gW+a zbo7Aqfx~zYq?`lEtMLB+FRshL!N4#X;P3YiL1tsWXD^{R6p)iQ$B* zngl}vXf7H&Uwx1vre6^@_RJ6hp0Bn5jXg7f?vvmHg)PWj28R=>DiL6PF;IP=IqwkI zn03D*Lxeb3-~T@lJq!$nKNy&V85sE1?_kL2t7KqMU&^qcAG&8>q=A7Gqz=@s>0izO z-k%LRGZExQP@Jwk#2^BaSKr96!0-nPXu%W6oD`5bV1KDV{EueN2avy2*ce!l%rO9& z0}3<49}Epp_aq>h1HPLO&72=la~P4#F+nni1r#^ycQC|2-G2f!_XctoOdrS(>lZQ1 z>EFo!UjHtv06K$)(Ewx~NL}v{2JmVNu)RANLFcq&^e<;P0@csb2U?rHhrwX&BL1d=%}AitrR16hy3#=wJQjti1G4p4JKkj(MHG=~w~PXLD} z!aY6+bHH;iAom0ynG=9%4#N$ozf6$a6M!&>ff4E+ACNiy%NZqlkATh}(ojYA7wC=^ zusP2e7?I48K$yb;nhOHC#{+5(L+=p=6;ODinZpP*hXctR6@)nq0#Nt3fXo5u?}d(g zAe+;_oB@13D5yP-WR3;G944519FWWb*C!BjAnR!Qmoq~4v9d9EAeqAfT4M(aO9qJ( z+QJG9;Crz_=77X{FF@J~Vho_U9|n*;0{u%FL2FBSLHQq&E*UvMZU_67jlluQY?eOg z-8B6I5OY9!LHz>;*1`tZ8X>Sb@N$O1r++=8gs=hwC+KV*nEv(r3<{v~8|0=QKL&99 zx5ke_rhg}cNB??o`rzu{$>4&dUI$4%_$;9{eheBQHT~-uE(j|yfYdu6sdqq951#j4 zX!2i7=IXm*Wj*S2i|9HAOPQo!ITfWJFkByLjcqqQBXMauV=UeHe)Bl z4Uk?2$%+QXpB2gs{9qb%?}ZFF&iE@DK<4)zX9!>h?b}`tHy^Z?GDCoYDI9G64u%Y{ z`3wxgVDr~8Jn7%bsL{WJ;Q`}K1BiL~3=9ks1r3Zh3X~c63Lxe_huo2a#odlzb9XXC zfX!8an!BFi4b}U~zAX00R?fPoGKu4$%HMMg?I820^HMzku8eN^3Cp z_U~Z$(EFUh0OWs=yTRsRhOao(oe5BP3V_T5xut(6!;jwM3?}P$G6;a&*T0_O56JBx z^FU^S+z%>m1t5FsJOmh+KxdkQ?iBI>nI-su0b*7q14I7~MwWhc&{#r)47km(o{<4; z4j(k$QRBryfPwKN*j=DCwoAbNgvJXa56GYWI~X}&{sj4%L89OQ-SZ609-X!xyX6ao3IekDq@D(s%NXrEs5{p5FJ*Yq`-B0UFHp?b0ou#S0BWm%+yOej z57P`#yKrXH6i|8Fdjyg;P|VoL0Nxt~b%zh0@R-rRlu@Af2_!wBn6ZNaT$e+`19YAO zE_W>GUka&fv4jV>T>*B-Vn)#UQkZ6d+5|J3R`f4rxX}9q67MMPSj@-)+WR1pz%Ucs zhGggf-5K!%w7&stALt0n3P?M-pAXc2Wnf^uctUYaB=}rIaGVN0U=ReCF&3cmO+rBUS_Cfc)E&&tTGflfeh%Z;*eXesx&m$Dji? zYX<{(eI#h}Ht5U@xLJ9Su?5rHf@Ds^8b1aRs5#(voG=4}aQ`}n z7_d142O6g2F=#Oh98eZKz`z3vYmhn20tXa(e=-Ds_#pT6L^9Z{@nbNVlFy)JZo$Z~ zCW66+iN8S+WDY3Y1rIO?g7Q4rOwgE6K4h#x@&RPsB&coPlgA*@Z^7UJ3O`V|G4r2L zG`+#VvL=#21!NvbzgiFjBa<^|EarcfnjxsY!4RWT1U`?c2xJeN0|WRTaPWC>4v>9? zAaRhrpt7^4l0im=`~MG6|4CSZAqjMbWltW1L;ntjIUu()F#J#ze83RHc*8*vl#YA6 z7);dvGcYm+NGSHCL(;3@a>)6mJvoqmx8NGco|2wQ$oYq&J0bh(Kx6VCyQdyw&=O!^ zaAkhRp$&2es4qLEfBGsH%c-vf>sq8>oNRikf>r{JTIZj zz*LGlQ*DhC5-e;^aX4Fg4n;|7W>4GbI%tP%}9ehexqE&u;B9kFbhlL z|6gGDuLQ@{V^BDN)?0w+>1q%^g2F>Y;s0_q0R|Jbp#T5b9RE)O$%EQ*{p%PFdLkfs zgqg2Gb&WqmNdHa-@O|gP3JmPb3gG>%;CTXAxdMt`kbclO1*qQX-@u^IzmWm7hC`!& zGlLFjTts~@BWVBee)Tyy;QbGvF(%OYL9lTq&=?bFudnC<24>LR1Of~U>LBw(7C_fs z&TP~Go!1PTlK_p=^uzAR^oOJiXy1K{N=qlodQJfb1`!pe|Gz~-4$z)Uh6eCmH8$&)GTtHP3!nT9mw?8A8d^Z}W^nuWfX=!GkK2IjL}c;xix@%cfHXk;98f+4$w9}I zOx7=A6abAif#hK3!Q}eaF^YiZTh=dPlmX4RfYhvg2RcKg;RVRgAag)8=zIw9I3#%7 zu~9)~X(wbH3bc-R4}(enYDNXn`swwH7-8$3H-N^g)~^PQf&JiAY3T&rVFy+RHg5;x z9T06S30@QTw0{TVo&Gh9A}V74|4TM79O&Q4sIz_nqlEfCh73@d*S~~OV*LU}aC!lm z3EKMxa?|>?j2*p;8D#obF{*&vAdtYYn!&+Cwa1?U)CblPe88}rnK?mm?G6Ts^=lY) z)~;r7SigXgW9mjoUKLVcnA^XDv19!LhKOEW1`|--333<~J`&;sK3>w?-$3aX5`1rz7#JB2LCeF59NIkQpA9R^npEuk|=<>5pQ zZO|AUNFH1sCNr2wEMQ0ixdUWA(}4-9EC(238Q4xV^eQo^FtF}uV2GTd$Pg}}*elAQ z!BEVh&A_lgRYZXyg!w>&s#r1u=>7{1(A_U8%nXd6vI^vO(AgfKc<*Il&;aF6hN%+D zV9cDuz`!fRERw*$%zQvWRm_n=T8)W;StyKwi)rx+MXkpFKSdN6*tHrNI0O_JSQ$hT z85k#>P+cSmJ}Zt3w0Bb|jDdqeq>6cw5CcOKF9X9Oeg;OPz*V3@;cW!RL!`Fv)c&_v$jJFv%4tGj5kq6iWsz z@nc|+gx$9Qy8m`LBM)c{0hIRFuVDDIekJ3T^{WtRs(&Tp6<9jz)d%09Y|_7i;SVT$ z7y|`Ue#<+ zod5sBm{_2~cpyTxe?6nj`qhjE>(?`yfbt_qjWG`+gJ1)LYyVotJN-KuLH$e-X6+2c z^=lbrBo8oHGB8A__D^aS0OeH`0R|ITUIn=cWN(i@1H<$kj9b>PXY2swgXwD+w=o$o zNP_Ze{~iVtW}Xv@OMimyIb-Ajl^0A32C57U3POx25sE?z48kD2pu3AfcLc!9>|e*& z0n$75JcAa<907j@PKdh34Y2k&$Zn7tkUYpAAbF78{c9OJKz1(Q$+%_eA_lGg#f%dD z>lhvScQA^8?iXM@RH3+jJ)^_=#f%an75~pHU&Oere+{Dp$nSy;49uW#Sih6e1w@1V zZMcpBbbf(z|4zm`pzs65CFAP@itBeU%1Aaan1jLx8a6x_VFT(LtYw_DekWr`zZ!!` z|2oD63>Oe#!?>r z)5;D=nDp~7KloMcK4DPl-^nP^zk@LVRA;K| zGB7f;Bq*+5!x*rBEu)0!I&heP^nk{KWdt8EFoXQQeg|U+hz6xW!qR%nU^a zHid@uybL-52N*;^`34#WJfJWFr3+A4sIY?0Xo7@A?+=K6fd~f9{xys{`e)(^3y?g> z&UK6(AiLJDW!%wwgu$SH4WmT=dd7(UwTvR5a*pu{IL$|_-^nN;uKWM|`X!8e`qwc= zfbs-rj~b{vS-+k!21J9x!kCAlL9l@#8pH?XEl`*ul`Fz6Rj0F~ubF2}ck z;vVF7P*|dugY5d9j2S)NV6mJYX9f*WogR`2GPNNP9-Whk+9m7NGRj-_i`;&xWiIqz5E#B+0-mtiT}2tk9s!tN^hKT=y+! z(>qz7atk#*i3n7cscBf<)FzGnoe{>*@f#l&V2!*@&!f(ICMKzSAvE}-%abT<=Y zH@N(h0f!9(1E_p2=<#OYS-+F9gn_%_K#wy6594ddo>zec21&*T5wI}g0EN-|^^6Lj zc0S16;P8XCnK9N4+<=U22t+{Io}jRToudx&H?m(q@dxq~$gQBbHtc0^5M01u&-nU; zA}Bwt-wCdxahJ7_a^(QHTv^L_q@Rt!0+gmeb};r8I-=)uVbtM(V#Ff=3!tIY+%p=#Vt4<*E7oW_%g_V z!UhyBpm-Eqz#zYVEn`EEH-pUjos2C#&Y=6A4l;n^j~Udinb`m;KP15Z-2sk2@Ejsa z{PjTQ{(HeAiVO_By^!%A0bdg0Z#|?hWcZFjKoH!fVqgHd8RQSpxE+WVW?(P|(LIrn zHAm|e7#MoND_OvHg4Z#xUBJN73%>o3fuZ*uMBUm044{4sNGn6XBt&ez0s{}od{Ex+ z@nNuGTn#R>WCR-+q}H!tv{=8M(Wb|l!3N}S@OkyDpmW;6VPS!senEy}-z0)}VscU2bMj=-?kSpr_k%>X)Y>j!AR>-u#JEY0h|_suhc)}DaII0P6N7(we!KzwAb&3DW&quD%+k`t zz|hjnz+@2d|38DoDJGC#L4F3^>u8Yk|3BETJXuT(%ux&stW^w4IvK!cYcak!p~Ap= z4D4@aNe@*9)*xm>pZ^R?`WToPbs|(5So1*s0;^@_IHAJ8RtNSs<4;gncrhF5{AXCx z$H2nq6QRn$mdC`vUIkVQHkbVvXs?t2*j#pqxoi3uIKbwz=P@xb9RjNbo6A(k(9_Hy z0ydWkZY~elT&6rG24*C4nU8_uQvz%*Gu&JOu(`~6Obo0@=Cam-{3Zi7mlbZV2-sY( z-;m5@1G`rNY%UwzTnVtbAirU{R|RY?!o4zJbFsTu18gqBy$WD+VeVaBpb8ELhGE1*L^GeGCR*GnwOkpkO&@~^C~x&NF>rv>7E=`id6BH&8wLD;RS<{#p*pSQxrOze?39z|raB~H~=CY-M^99^o zh+AdA=0e@Nrk6nkY%Uh}PHAOO0GkVS@02zMr8T__5@55L)0leN8B{=KGq4_lxc|oq zRR*>wCI+@3kl$pM%w$ji<$X}O04@_?<-z&`s-Uu9Ne_b(xQv080pM`%VNijFGlLB~ z!+&tTZf0O%d=3d~h})f*4Pj*tQye(2^t3W?fb3#?UZBFj?8MB#oX5bp?trSHyAn?8gAI6XYI{yA65%Gpw1(AOH#1Do{F*VSMhP!oXa{ z#K3wE>{gJShTM=c7v$$PGZ;h|*s2&9pM%OaQ2BKX>`st9hFlQ;gUx44V*;7GrjJ1a z9M-)Ipz&{(mSzTqmR1HPg9>O_$_%!b1zeV{`TyUBiQzv3s4QiTVgT6#FH0YR%Ex1% z@{t4NZw6?dgqNkDJjo6%o0v|hFtFD#^mH)rfb%3fyljG$rJ(YW1De-C=5ibZ8 z$^kE%AY~~BsC+~+7m~LiWhpb<#c*i3eaI&gW>#}ET)uLgk6zfj-%zW}r*1AJfERtBB*TNpGz_dbH=uNW3AP-Qr< z0(7RY!TQY%D(g2v?=Ra3xxY-RfianZVTLLbgM_M$5W|1+j*|YR3?U4BhZvZJPN*>O)iE&s zJfOvt)rP1OG85P?_An zp21`NP6ihS{zDARAocuZ42(Aqs50;uF&p0e&(Ob)!Gl>6#eARjJ3;gGQ1uA6z|8kS zGe2PcPSE-VsCrEE1CY%Jw-KHkP+7l|Apo>y9ppv^)+%PhcmEmsmoY>z>m5*KV69_f z=GRaKw-JsUP+?#@$G~h+0pdg4yqqBh96oGiOw4=+stoL>7?@QKfXima9|a&jv$6hv zhW-@{381qi8Q9M;F-uygGJwkFCkIp*ILg5F6$1y<-jxg~V0$@0_ByCCa27Ezg6!pl z+RF(EE3loMAUi!&r>|qkXy3_@0g59A$wLgx{3leG?_|iBzLO!VeFsBU|0;$Y2FW5O z@I3pw1F8&MRSb+z3RITwV8~+NI>!LEkE;q2rmGnWz+uW&$HaI(K$U^}6a%wLfeHin zF$U25I0N@7W@C&04E<{uO2Gc(KF0()zl(tf6y^mg3_NuVjPFjUGVmN?Hs=4&(7%?U zf?2;nm4OG81`<>mcp-K(@Ivk7h1$EHp#f|!FUZ~uRR(#ez4B0d<)QX&U}yo`D-W{w zhbn^r)LsFoy#f$>!FCFO>}*h7zk#7;{eFgq^=la_)~{hGS-+a0VErnFob@XiQr53v zNLas|A!hwDh6u4m3?A#3GK4TG6sUsojha4#2Wa09XdOEEKBI&Ge}K+HThI9aNAJP^ ze?-s!|FNF&|DXPy3^kyBEQ4eb1LLIwDh!f!3}81(Rxug=_|L$2qe7KIvWy87F6(zP z)PT=NlPox3Ecu_E@n(hUf_(5gB8V9hWep5`=MRC;Et9NhF#N&5VtDiaZ&11gt6K-P zi|?2NgT(nm5VI;A4Bs&@8B6~E3o~!>4u*QLn_8UUpQV$y+HF$1Gm z$-l)a$qXLQbs;EcfcI}<(CFU^TOYzOVf``&4v7T}o(v2Ess_s#m_c(Up!>=g7z!E~ z`Xm%>I2r!;q=C*2WME`qJH)`u32GnKF)*-2F&pOmX8_eh;Qkj|8585#1FCB(7#Ktz z{r{|z%)lbx%3#dERMEh|dZK|@#X*swA7Nfk5(5jUPr>L3YlCMo8}0zL!3$KuX_f69 z6SIDRDg#pz17l}~3Io$2W(KA>hMp7#4p2YOSn@x^nk>*gofWDKOkqrn{t2oKELjYU zD-WnJu$*FMV2NYsNoU|;tSC?g_sen^SQt-Ls4}pmF){XMs4}oa{Q|Bd;}{q#3sk{% zWG({-z6Qq&MQ-pVqloW02;qq%-{g(Z-V+l>Ps1PK=%Qv9AjWyvyg$ICm%AO zzh*rHOHU$X{AbNV2GCl09ngM3@ED4EfC_`eIY^&WB8eGvf3acjfABa2gM=Rw16L9Q zpWB$xYC#ybq;{in2wkdgW38W3D4syrhH4J7w`QW>DOhEe-86SeeyO@bF4|HDcVFqTd3^fMcBnHNg z3KdXY!@yg_WO(vF1G9dFDr4pWRR-QLCQvvrb0w&*U&CO65(m(AZfo*T<3QxX{}PpC z@cA+-Xm?A4?kL)?KF1BV{}XiYY!7%}9`1DM0oqe1#lY|pwEwPuF@pyvU8*l*FtA}| z_zzB(&lwok97IZ&=aJIoK?V-cSvR0`xdt?Ewu1p24&XGZfssZnu%^)tP?+IOqb6cX z3@Ph(Fj({)L`tKlkkaTuL>lcm1(_>Zlf}T(zaCb`7cnp%C751qCS)@3FrcPap8nMg zHd8?2xYH}xo(Y)@ym-2*ye15ZD6UoSYlv>t$_mnbH~tpDJ)9^o?p{a|2_s5oT!iv2&MpNHy_Oa_Jtp!Lf; z84L{H{;y|{j6A@Y3(kX}Hm-r;Yli&{eEtm#oau)ccuqDLTQE2=+~uHZVxU9b(|lY%pBKe!x)ghdrZTg6i@$;5r0>x>93IlH# z0|W0NCS&gZ42(V%s*JBaR2g{Bf%26Nqh*2W`gII8Em;gq)7LT>Enmf8FeQh9!Ehx5 zyWtG>{~$XVGr{dtqn8W^}hVRE3sn4f{gaP|M+jIT3P7q4Y72Av~r zxSruJgJgjN10SedN^mfo!NA1KpP;&U4OG69;U9x!`60to42+DP5PkhSAnULhBu+6f zs}`s*NYpVfNF*^CcKv5yd>5h0nB}3$Ad$z!sCxobCL5rnbLjf6H8~6{J;>?&3^bkR zFz|?c_%8~or$BpR(aHo5X#GANRKGJcNT`D9b5I`dNnv2DPU@2o_V5wtZU^&IW ztP!9BYWFa(Br$>VDl=CEXx*AB1KTMEW=&APBZ(P2cAmn(u_lj!f$>Lxs$utk21f4; zRR(bVe?pak1yrvls4%cZF@wzQNn_wyQ^~->_$ENrFz-JDqhE$91IsxkX59m-3~Zpf zJwkvhk=LjU4Sa6 zFTfZ9GB=Hhu@^LkUj(ZER6uhXQ1?o#$z~7$wN;FHK&8(S32y$Wk886;5r25Pr}{Kf+H8%q(`+%*-Tc}66Eu^eM+$zxCf z`E5-OgF;IVgPP&_|Nj~IqnH@@fghiW37Pvwi}oU1TES z`af??4x(KIO>6$3v}UlFfe|!k3QBK1Z499CL>5pQ0mTO-JwekN8(Lap4`N_ouVZ3h zKL_sfgW88{`WP4(*t3|x?&XP4Wz4HkRbgUa6mVrQSU&ql<$g!%S!! zGl>BdhAiOmSf(@v1|~@QVdlwDWnenR1Zop9uB%XGe04yTfu)E6)Gh?K8PgazKy6sY z?hIANlb|pTVls>XwQnj^LHE0W+zy&IV_=J80=F;oGE|v015`lylY#9J6F7aXs!(No z6QRlg_RBd22KF*0#+wGyea^NC8Uj+hY^-pps)nzTMmZ* zp!Ooxe5>vO&bQ!kca|t7P`ey7rVDD9gXge7^L(IoGiaOxG-jmzpJ7cd0|PTRX#OjW z3FLpqF3_9?$iLvc#RD2AW?(tQ3@TUG7%7!wwA1wef&286jBc+3?+GnWUK zxh*LS5@_ZM;4xPQ&0G;&=Jup8s34oWB$q(~W-cfUz+nMu+p-)2=Ub4u&@hmJnF-1R zps-a*X3!9E{Xct6E+XC_eFIzQ`tSdw^bIC3FgU38FJ^F1U(TRo!v<-8f%Yz}d5F~h zdXLopdI;_pnAk9a_AhubFseb?TnwPPr57@11?np?NYpVgp7&4{Q(~}QzmmbE=OI!% z>J?Hu>LH>X)xQRO9|UNQfPrz@0Tl+GI0jH(ih-vJbPth%;miM^GFFv=Cya?%D?^om zyNZGF8EA|qi3v1Lvwkgu4l|#Js^QH442+hbF`PW6$vYTy7=0^LL3f}p0PTxf$DjjB z&)~K*=xmr4P`mjQ1A}A~6Jtt%8mNBd^1@)ne85sDInHXC=)YfD& zuuREkVCe_7aegrHGe~AKFzzS-wNb2>J$bsBRy?70SPERHSL;q?99Y)0yD$LrT zd+n+i82Gc87*`)qTfYN*9t%tVO31yaF!wNUo@Qd42~u0l!1yvlZT(sXgPv>#mgzeg zj2O5}nGDbH|2Nk9z`)p5p~@hU#lW~MLWM!Xk74MbhAIQ+DF$Y>0u=_%Lre^uaSWiaV$4fWHRk#cF^e;giSaG8Er1+X(6dd~R4}mg zAjOra!2eSGeF7`k{twXoY@j}Y40wM8=)8_)kbQ0Imw@kh~&@(*6z|X+z$iT=2wv%!4P6qu6-3*{bCB^nt@>CxZ%jjC?JF3OIlB7BMg$3{YXFI&(7G4Moytu;1p1$_agkCi<01y&{wJ1k5k!01i-8f^&t#BDVg|Q;w4iNP2~c0@ z1gOl@U%wM=d}9arKI8wOeAK@N+Gpj-Vqjce0WRklc)XYlE&nqx<`<|k-V9I$j~hq8 z$28a(c;gQl<})xF>iz%6_|8LhK_&w`$Q(m`hJy?|0S*jY$C(%;G8_z7GuVOCW+nss zR%NxFdjdl!oVHI zz`&iw1Rj%%Oi%@l-!O3dF|A+CV8Zwk+^<3%uUHGMM{*fhL@xZFsFKXUfu%p@UH|!N7co0kpn`0kmFceSs=7yMqb?vlkP{pN3lhLF13Apfw-hbuOUwGpumDh#Y%Og&BDaYF{icMhtcG{V4^#=s~UpbAx>uQj z`5XfSa}qPiE^t|-eL$6&7qm90j)_sfKy^(AWWC#(J_ZqZ*b@^jpfydPH842R0Vuqf zLF?X-(gG+9Ky!;zx*7OjYhplaM;KV4>Egx-RR&f+CI)U$d#wt*){pT`hAKEb9x!k$ z>1E)9yAjmBWGZ7~V5(zaU^>OXtmpvlZ!j=PzAM(!ExThz<{c+iUBE& zV~uYNeZ+(bI4r6_>#sOK>t!HogdppK7?_D2xG=odS{DR% zQ*VJPsQ(Ev7qngo?9Z7D0`TymVZH;e$82U0>S<*V0l5>lW)!@3k~s;yW(d?b2c;3v zI!wlw2UI}w&kU?VOg(K35=(j+gg|i%ayv7q@5h?Q#0bh?;5ncG708+}@cL1iHT?`C zjHgbh8s_|GVAjb{Wnimg0<8@N^?w;XBUBjJlb9IT%Rpm@x5M&R-uOL_){D=58y%2-g^f|T*-=^0w)6TjvSwamxA=8XxK zorz7s$)R;m;qc?fY;5TtStn&2Ud>4%MEZ@0a;fFvIks#K+6tTID`BP3Ts^9 z40bCoq|O1`!E_89<{-C2-7CQeT4TuU#{eqhKw%6j$KY!V!RraZ?v(-A1zuywdJbH+ zgWL;RQwR!gXc-4y$BDeY5M(FV-)v4ypzsE*DFm4hDnELf8C1aQHNopo%fMwFs160C zUy%DieqICG=YUdI<$>J^3UAPwO^}0;-_%BS7*7`3%gUJ$4{AT&@+=-eh19fSv=|GXrui zyD$Uf+zJNg6Nb>-0t=vS z?q*P6a86JZOn{u1A=rv$M=yf{=sZBiWuWuT3WON)BouMDAAE)wlKa7Th7)iHaW91pnJoeTjC&H;*o zp#AO)3=D#`;7&Mz;?4vCRaiVhXz)D@`_<=YK=!}PY`OtDn*%fs(BIY!K38`==pLH=;Jx(V z{0}|5e82h}b@2JW{jJScK<@8Z!N8!>_WuWHUlJpOg{pu9Bpw7FFi0~T2c5M7Iy;1c zq31DVE{r9Sfr%mEfFc9)0VReXCls00z~?7`-QDvX(mxe=z`z61`~NrCj&~5ftOpsG z7!On^GVoO>F}xR0WN-tS|Nj$6jmQJYxqo0ckY_i@7zT3e7I?r=0@94+NAMo1p64J@ z28Ny=5cjh)K>c%sfklPq{~v}P4Hbr?9*T?#4ywIe3@ipS8JNTs7)%*`B2;=#GB6nW zF))Je2o*iRAj5DZL7AboLXq*cf@04r1`drzMg|cD1`bU{Mg{=|26mMu2BuzL29C8| z3_NRl893IiVc=Qo!@vO&U)#jM!q}prsF?`XXnMYV!~ajgW%P6tH+1_s@= zEDQ{WkqnID3Jg*j3mF+0R%<}~un_DXc7~$~iXijWoMPZvbC!W)?J@?QwQdX?An~=W z3=Ask7?_}Lms)d!`#%FiH&{I%qgI4sZw>>?+7t!`(;fz{{<9&0u28*fz0XO z&!7M*dtmVa(g(tjcu|f4#Y=x{vxNHI{}*}|F))D6O#-=P{T>F19zRG}G9CeknG{H0 z|ICI5AR25pXzw8C{BFko|3w@@=U+>J<|Tv~7$j6xSU)f@xK^kL_%raURPg_2W<8<8 ztgN66(!YKQbWQbQ2916YUcmqxYi9w~k3F6YEDR13s%ut4&VPrGza|K%LfowcUjNhI z)GX1{&%gt^YaMhSH{*i?s;mzgm_Ym782Aq;gZ#W^1_KXNPXWlU;PatoHXQ-^6XXt% zKS5y#@(<`N_WpGcw}8&Q7jR$@UVDgvfx%5dQKjYo4~8ZUWd^niWtAQOKY`DZb6{Xt z1IS(KOBlfS7uv8gF!nEDFagh7tYmNyX@Hzx0y+M5r_YOKw@iB7+BUcGcdsBHrDDhFo4#a zf#munA#u;H$iT#`5TME+8KAtL3v_M(gNX`1152AJ(KW@T>u?p-5(sS(D5lu?Dn%bti*~%DMlaKx+@yx>LK?NKj`)zxiK)M+i1fXpX5eGhCu z3mT*C*#MCjVqjnbvDPs#um~|QfY1N$^&rH|K5%Wyz#zl`X?ykYL**a*{|VB& zW&-#usuO(%4B)-Bpnd9~HD+QA|9>%o&PN2*`x_X*Yf?e}0_8u5zvRL9pQ`Wue*$z@ z0rdQT8xzG33@YaY#2F82faXCM85VMAfz!br1_@AEr@n+i2b>0GHk|?44@#>bx*v3h zJ>=|u8*ykGO@M(x4wNQ(7BevP?_|&cr2~*!P&k3^U%-|QK;oeFD{Gk<7{K~gg7tCq zsxWW}I6&&S9xn!tHBAgWpuSy?H$-eLD2`niI6(0XTB`t^E3p9i8DuBK&vM}N|3T#o z%uk@R!qzWkFj>Eh!9t*cL5HEiLba#w{~whJ|9=>sXJ8b408ih#Aiwmnf#*L>7!Dp# zQP*H#Vdem}TNs#`84N(>jS9m90nnN02f%q`DTBp&=p7d8motFRUjyak{^bk?A`YN3 zssW@&9As|)%!W0fbH5lKK<-nAs|U>!&TInRsSMfo4K3$DXTXE@ee}<4g4+d;3(#Ey z4ic&i2?DC1Z~*P4289Et>;i=aJ`7TaPkvNxGz3Ok2naCvGzc*GvxJpfFbLL07Eu|07Ev1 z07JHb07JHf07JHd07JHh07JHc07JHg07JHe07JHi07G_w07G_+07G_)07G_;07G_( z07G_-07G_*07G_<07Lc^0fy{30u0$J1Q@b62ry*t5n#wZBEXP+Mt~vviU33Q0|AEY z7Xl2~9|Rb(e+V$-FbFW@@CY#ENC+_Gs0c9R7zi-rI0!K0_y{oMga|O?BnU9%WC$?i z6bLZnln5~7R0uHS)Ce%-Gzc){v5 zz>sr8fFb9O07K3L0fw9>0t`7X1Q>GO2r%S)5MappBEXOXa`PVnhFk^#hFlf_hFlH- zhFl&2hFk#whFlQ=hFl2&hFk>!hFlE+hFk*yhFl8)hFk{$hFlK;hTH%FhTI4NhTH@J zhTIGRhTH-HhTIAPhTH}LhTIMThTI7P47oD|7;+Z~FyyWfV94Ddz>vE`fFbvQ07LEx z0fyWQ0t~q~1Q>E32r%Tn5MaptAi$9OLx3TVL4YBTLx3TVM}Q$uM1UbrLVzJpMt~tt zMSvksM}Q&EK!737M1UdBLVzL9L4YC8MSvmCLx3SKK!71HLVzJJMt~tNL4YAILx3T# zK!72yMt~u&L4YBzMSvl%M}Q%3h5$p}0s)4+6#@)-YXlhbwg@of?Ga$eJ0if4cSe9A z?}`9J-U9)Kyf*?2c|Qag@>v8J@&yDK@)ZOa@-+k)@(lzS@+|}y@*!h644^Xt^F0I@ z@7FbFW@Hwegr^>+x! zZUFHo2*??L=otcXVEF|C@?iNDpnN32kiP~>Z{SgF0ok*K2V&n2D1CrWngyi)1eAXU zN?+kq2aDf<@*hCy7kp|hAoU-h{4Y@Y51$lBynuyA4dkB!4hB|`dkO@E48gRBkP*mT z1rkC=U_SVMRsn_r1vXBQKMPdYI6?j{(BV=6n`6MG3bMbzgoy!6TQC{3BnU7R*f5!b zX$L0b77*Ws$rMa`ut3!LFqwe)0bDF#eIZPi6F}->n5@A1Qsm}==^PO@uzZOKJD9G4 z#6v*~7Yo?_9wuu6kiIEQ)?o9%Ws?9y!2%IBu>1-Ub}+qxjREZbEl_$7ls>}20S<>V z92}rXgx7aBmtO`x<5ly+ca0?WIwF@oGz z=)uMf=KHX5gZUv$7GQHDK&@v1hQb6kUa))$#Gi#3OeSFY940d`UBF}xc6SMr1(*ik zY9YW-Si|Ak@<4#0u!X~or9pt9u!qA9%%1{Dw}mq}+`;?>93Ei#6&xO5{sz#2a+%1VX_Cw7eU4t8HyyB7(@~T7>Z<|v;q@@1c<9v1eT9r3z`8EPhblM^E23j!SV%c zAz<|tY$0HN16wFqzJo0ktbPIqgUA8_hN2lzdI1N6!~p?@q7_j71}MD)Dt-XUKLMpL zK*euB`42c4L_qpqK=~h_^bd%5G3Zd!1p*Ak92^W1AX)%QOF(G_i27m;C~W}MXTiZ> zuvCDd*a1p=a4;Ag6JRI~fbt`tbOKa71IjOe(iKqg1}MJ+N>6}_&w%n5K<0{sEMJ16B6}!Y^Zi(gG0iG8v94ko(G1II2M9P#I)Si=oVbqZ%x3 z!BGts2iNri3}r52H7X1O3}rrIH7h`Lh*+%-h>nrs2ZdW%f)qa}+{!Yf1i<_pDFHCQ zL`o3MuaFW1^J|zaLGf1Bz+?p~Kg(L6?wSCl=Rn=J0?OY4r4K;G&p`P%p!5@{_y;Ke z4}>n~fQXli@Ti0AEtla_2ZejN3XcZJJ>@!l8ld(QascyRFxi0l zZa}@$?LZEuELV`^g%vWF&2Jgy^ODBlN4hd{++p!^glodXpwf%0ph zbPH6x2NE7tQ=s%5D7^$quVG^l=n-J3+5)BbK8?6PU;!w9R;LIp0P{1L7J~9wbpg{tP<&Tca4Z6)+v*06MWA$C-NCUK%%8xq z7|fr+#stbg)eG2|LHVb81sgM%zky>3SltdNeE>?IfYRW(6i``!gh6A(j8Hy!ULC|1 zV5m_LV5rd%V5l(>V5qSXV5o5sV5r$6z)*8QfT8Ay07K0Q0fw400t_`51Q=?r2r$&# z5MZdeBfwDeK!Bm_c4H00djSyg{jS*m|O%PzHO%Y(I%@AOy%@JUzEf8R+Z4h9noglza zyF`GYc835%?HK`v+A9JKwRZ#j5sQn_qQ2R%Kp^igB!*L)`)ahPo9340T%s z80z*2Fw~t8V5qwwz)*KbfT8Y*07Kmu0fu@80fu@G0fu@J0fu@R0fu@N0fu@V0fu@D z0fu@90fu@X0fzbr0fzbn0fzbv0fzbl0fzb-0fzb(0fzb>0fzc10u1#F1Q_Z!2r$$i z5n!mlAiz+6Lx7?Fi2y_W4*_srs)0j*p+P`^p#hvWL2(GeMfs&AnR%&J3YGb#3MrW> zdFmw!nR%HdnTa`>RjCT)nI#zt#U=5{r656t{2~yiC^a#qxP*%Vt~W1VA-S}uC^fG{ z0V<}WP@I~okd~5|k^YFzLL-!g5ze7kpys`SssK?2P=A2f5bO|khd6Z+El_m?{2TEBst!5c zu%v@1BEv5_1Zo}udt)>v@Pp$G+=hmDjv)fmzp+oC<`D>&1QTdFeF8NLL}4*6@dp<3 zu%zc?2dFv%{zxM-oYOU+<`M93jt5j7a=H(|43~UZ`a=#EEdD4qf#mbwNa4bQB_EZZ zf!a&Jzhw)c>Ik^6N&%`4JkJb@3-au*uip!#D0tXxAj4~x2m2~hKp-G?Ro77+(va11)z6gv(J_JxIWP$8sjvgX0ZZ9hUOo1T3E;tHTn0CpCz3-$__` zO28jyT=1l4cyeZNI0Gxk3ApbptldOF-MKBqrGxXZa)?0syC?uHhX|;<)IwbNU53`@ zDD4+myd8%JjKf1{dH)Z|zl>Po?IA3kBIiq}d5kj<<~@R?17vkr%IC))u=oRux~Cyf zb;$KJmUhW=SpFc8UY^6!6_S4$VE&zp@W%@gXnY{sn*nVPA;cVBsbEP5(DIKFv^)S} zq{FKjP<6=h3oZW`!Q*sbg$^GZz%)7m?)NbLg$p};?0}kw#UIS^S|4Q0U0GhB$Rh1w{GRkqO!T z2zwy@^@a;LGB-fe0do5un%@|~>)yd?9r+rt^vf{Y2aZB9ka__*yjcpM`46tv`^}sd_--?LTt(VR4@tEL^aKA9(%)Y^tOB6g=Ua3RVLm95q>>>X6+BEw31x zK}x{bQ47{C#-`33tOi6lYQfsY*wopBlz_3LHZ0zd)xpvq=tMfOG6qK-Sbr-AA^;{g zK+-cacs&_d#8DSdJC<1ztOi6l>PBGkFVtSU1 z2Ms^w(;y{a?5K~ezJ#f}4psvq9QCo4FEIBZ>LW)3@LWDf3kn9OQ|9+@F-HRrI2)M( zQTGil!7!hKQrm%F1 z5MzM554xKWWUpBPG@m1@gSG!65%!w>fY#^8Ai~iNQFej& zFbvM;EbC!h21j=uJnln`mpHm3$3I*=iKoBM$_i2f#*SVkxc$qDluo^NK6oJx9kPXxy$mIr1T`^P@1A}8Q zES+Lg*M?9R0vi`Vj%R4QgcZCV7Od7W43W0M0#E{+u2>Orj$yEI8bq1H0Gr2QTn5#} zz~C6^0WA-(*vo`e4@SeR3R_c_3Ch#=yogv6#nt6run%1Tgt`O(s3q&}= z=kt*5g{D)sPLL8XcFe(353)@Ms{s*?xv+8rTevI%DFI{0Tv$HBrVc5bbB{pNDHe51 zkaI>r20G?RfG7+MDG#*a;*NQE(jTiSk~(NR@jqhBh=Jh)q@H0#N>`<@`3fxVV}qRA z0W#FF98Z6SO&FvEj2$aYaQl}Hsh+9Y08OXJ_Co7lCh++p5c6sfeO#~rlmLedJ810} zM8L5IF}4U1fshb&&|8Q>`3Dbb+B+o_6Iayvg<+|0kXG# z0q%O5)g7U(5mC0n1sND1@y3pnUK$Z)5{5b^(5b2rQO8DD{f5nbh;byxmKS*9;~K;; zkU!e+*_(!>4%S}77S2fV+m2_vgdJ&Ir32Pa#*)w3!x8p&$>2_ZtcdYM$1d1>H@0v| zMwr))sEgr(@c00qEesZR?8cW4D#2<%gkuk^ACDX^(DI7C9i#+|9eX99^#^#(CRmIC zHr~!Y3&ID*$2>gc6S(hiLONFy4TqKMth!ALtfo zxGn?(oZmQ<-~x{8kHFao1_#7EwqtN1$MwkWf(t{`aX`*_0*N|q0IvlHF;OtYUR$`B z<7Pbla}LCKw&Ru^a6QNjh3pwrzfsS7x>Iw#i2@rp(pz4sv|Df$>c0|}Zo|5NBt#wbb}LZ+y|w{O z1%wMxw+_Mqsk?px&PHZH)a`}~Io?1X_k#;V(jN!X_|OgH^og$SDqO(v26B3W3q#Gj z2N!U>i7lT)>n)Dg2z9r>XTibwFb2dQUtwGZ$J_YA1!)}pE}nK1Cnv(Zd&uboE)4Mp z`#!jU<0EY00xc(5#F5nDDTg=_>qQ+OA*W-wb_jzLslV_Pxqk4p<|8 zqPQfnBr{o|peR2%HKnvDRY4;!Um-6sH&v4%wIZ{GAwIsiB(VrYgBFCR=9R@4XQrnW zq%!0tX67-(=O*Wu=9MsHBo=2dBCPbJHqwQW=UXbK^nl z-Wk%;Q%jN=auc&t$&XLTFNsgh zO95+7%goCJxvjW3wWuUBKQBHlF*7GMg~2C3KRdJl+07+InR)48J*jymsYMKVsTCz9 z`Pr#?4DP8Vt`!AEV7ZjkG?0DnsU@Bzsksa(TQ#OEX?rRFdcLn8zf z6Uh+$#U-Ffi_c8S1KX972WO^Ml*DJIR+NCm6H6;Hiz{;zQ@}2QZaK(I1M?C~E0Ri} zG6*%rB}Fi?lA`$3ijvIYVg_hr!?!hn10oS@1Juld%wIV(Z>cZ3tm>W_nN)VQV0xu~wJrnA?#FP}6|I$*y2`sZDKars% zKPSIDwTL0HBtM5C2P9IOSDc&()&z0_%!Hzn{L-8pkgH4bb8;Ax^Ye;Jb5j{W$*wp* zKaU|dH5U|xxv9Cusi2&blM|m?n!^wupOX`xl34~}6s6`u7&*lmnQ0(pr8znAMG#JU zQGR)RVo_0IB|{q6&kP{@i!-Z0NxuXVRPcx^Pb|sh+nN-fFZF(m~e4;L-UO94l8 zVrd143DpEHP{2vPxFjAS1+zCXB_%mOuOu_CG&O}GJ+&kwzqq70wF1Tjm4yrii6t4y z`FUv|!Q}E3hLX(OR0dFu2XY>$kc3*5m!B7(4h!FS1g`+31{CS>nIINO7bxXHL!>yh z1XfIe3*}-+bc4JAQVF7Ajx7L{qL8qIr9?;?$}LU@yR^6@9#oq_i#Bk*2o)+WVMxx& zFHU91f!BEq#pQ_w@t_hiCnc@8GB>{{CAA15Sdapt!TAWJ3RD4um4ixYkU&}{L>>%j&m=9iYhImO9&aCS~+ zQgLz~L`MWHBbsD z&ShXoEHd!QSG<2YWF455x}3Gau|NB|g|&a(uA26o9f7pmI|_*jxI1u(#BJVv`T{mJSd( zn7MFT;Df!D%m;fbjSu!#COFj0_+W4O0Jj|6EU5p{{fN#-S8wI>!QKkZeU>W-+egq` zn0vr&{rrN|B2Wy2A`r#~O|Zb&#taM$p~a~w3Mz>u;2op+r6me_#i=C-Z!u+}HCcxqW{9;zfRJ;d3QoDXVor4|?G7a>`QFcWMaRz(OkX*v0c zC7F5Y3I+L@ppC6K-HlTr!Yr_TM5xOx%_+$&$Vt`BPt!F~z@-6UZd!ptN`7flPAX`V zZF+%1ab{k6PAZa@k-{F?Y$IeP6sR%5VGf$hlk@XZGC}2sLUMizit`xK5_5_{i@y?! z4GKVgD7|C`235lp1y#co1_jk(_=eNu#5@Jie&M22NS{QZxH2~>KZhZyC^a!#0hSU$ z2`@iQp$ODeU|`71$~i-92{ zlYt>8pMfF0pePkI7?hEi10I)G1-mdUKL^x|PfKU+xX-srsxNkJuz*9i!#OcIBUL}3C^bzX zGq1R$s5BWI*BOb$3NY)-5_3vH(M)x_sqGiclv`Yqm{$VwK0HiwN;5%xXmEhzF*8rW zKu^!i)YRCNfgvriI9I{eR-q~<6I74F(={P|u)r#=%qvN(0Hr%nTQM~^HLnC7AK2u; zeKv)}T+mPm*fj=vdd7wf4A{iYjIoP@)Pr*oIO_6JQ&Wl+GIK#$2P~QgN=ztxutmCX zPh*iYHZnJ}(9;7^<_wtfpjJ$IY6_?ckyZd|YA|?$?8{6nNmT$R7X{SZ%)pSFm|T<( z3i-r5PzF|jxH7Q>UI-~9rj?`?Ay+*N8KANoyrmuN;LJQo;Q)#)ke3-!D+*GR!Nt6~ zhPpyhY8oi#B_$Rkmr_V-G}WPYpebPh7iHliV_P@@&c&nf}{~c10zs85qEJ5#biJ zsxrR_;z}f)#G8ev>lBJo3rjPLQd1a^8$IBh4bJa&3Pz?1Ntq?Z4F2H$Iyi2VK{aIw zC_m(u7MFmUZw2|qncxTm`70%}EVDQh)b>cKQ~*U4gI;n$VooOb><+MP#R`c?S+gj; z6kL)qFqEYhf%9*1Nn$Rj0h0=ekle(QJ_7@!pOl!RkO=iJ*n(gkh0OH4{G!wpP^Lhn zSx^%O9M*cEUX;FG4uk^b)uKFbnTV}@gw0;P;!4mtDMg^dtSl95X=ZLg4!H6FwFENr z3qVy;W>HFFNg@Nde+RFZiorwA3K;&@OU+9Gw=O^hu^y-vVqnP4ECw|)6~JoSBjea$E_LBS7k~g?V&hEJ!ofc*Le2G{lvo zz`&4{n4(Y&3TRNmO3VefYp{u7^A|pIakV$m(jU0&gEcnvic$+w6G1(#5(QX|nwh5n zX@xN`Fu>$<6Dz@qA}_TVJa-Fz`#>Mb&9HLogT32|5B81?AMBk(KG-|ee6V*u@WI}N zr^^R>&l?}?Jq~=Zci;2DzL*D!dp_6~Qv<`ygV8=8?2F08$nGJ+ zjIx*y_8?ro=7T*lE^YW=55wg(AMD{6Ssju%$P8Q<*<6y?Nan-sCqt~%;DbE~6Js~J zIuIX(D-=H1gR#R0`wCiMnE4syN6jg%9=z-h8k>$nwGdpuz|HgE0tv zV8#dg11TTu57d0H2eY?)us?9&gZ=p%AMDT0`Cxyk@Q_}u)qA|gZ-735B67%e6YWg^1=R!%Ln@_ zEFbKzx_q#|s`A19Du@jdSNULn1*CS#2m7lnAMCFl`Cxw)#D4O@{u+2)rYp4YQUF!9 zi8-Lk0Wwb$4-wGN1dTz1`fRBwNNPZ>ns{)10Ggv@KvI*JpQjs8l%EVT2~8CiyFjyK zDCQ(*q$X#_L+92&^+N~)Loj&gNkO$3wROYboS&Bl8vh41Qot=9$e34t8g%qVLA98A zY9Pnwf%4Abh2U77uS_!G( zRvfDTKw(}0ArKnIN2g(GVf14Q{OZy5qw}ALe6WA==7asy zH9nwq4v;p9LSAWZQfd*XzX@tUBgQ5D@)e3plQSTy7#J8r^79pP6Z0yO8#JH@^Dj#+ zO3TRyO{p;WBo?KoDx{<)XXYm6D1gS+i$NWkq|6cq20w^BD3)X@*eQS}UJ{E9N=q_x zK*OpGPKhbtq>+=En^^*CW|iiq7G);G8vYC(sTB$-ndzCJ6CmMML3;(DHZ;2ajMR!m zn2TV_KxUwgp+Th-O7im+a`N-i8A6Im^O7NB>yQO53=9mu(0)Z~ML~WZs8ybs2Os~| zg^a*M&0$~wP2nr#q~@iA&!z+~n_+-Tf*QV{><1dhC`m2K&CE-L41`iD506Z6+ZtpA z$U8}y=?o0$c7r6q{)G8SNdeJOg7meJ%BSRl0^Rh~ywoC)L&1}1P^&0X1Dc=%H={xE zh7{hYwt-ZE8tn`W3_h88sfZY2U~o)H0rj0>B^SK;4x7F~ZT~}ZB)ntJz`y`oWQ43P zC^J2yM4=$DC>7iThxV93{Q*?{prRTv1^_Q_!Hxfn#IjU{#H8Zc>> z53diEG?k!Zc<95N3?JPVGtigW5X~x5KRomG{b=@;e!Li7BpP* z!GWO#O{@ovkFIA5n*1Cne+iUc^T9!M&Ibq47atr%zaZfVBsNSu1B)0;4i|j^s^`WB z2MLo84iZ;BI7o6Ju=pJW8zwG+Bo7lKL`x(<%#r8;k2`|eEueJ=AR1hsGl0hGa`F>X z81%pcVhjv=iN(p8nJ~JFK`*JY1T?S#Zd`!$fg21A40@n86o?O*cVy55l_4NLxX@={ z(1T8f=_SKP4;dKr(hJJ-i&8*#f)>0m=#{4?W`ov$fb`|$=NIJVGw2l;B!b46^*}8! zkT_Te14BM&U>(E5u}AdudFB)RIcmgCKhLd%uItY^iqpJ${0XFn3z<| zpa&Yr1dU;W)f9n8g7iRRcX=t`fetXcD31X=Mg>v>84F?1%gYCklY-p%z5gD2$lQla4q8azs7U{En&U{En+U{En)U{En;U{En(U{En-U{En*U{En< zU{JAOU{J9HsWD(sF*IaQF*IUOF*IgSF*IRNF*IdRF*IXPF*IjTF|=S%F|=e*F*0CK zF*0OOF*0IMF*0UQF*0FLF*0RPF*0LNF*0XRF|uG#F|uS(F*aaOF*amSNi$$jNdwVF z3@T~H3@T|R3@T}+3@T}63@T~n3@T|B3@T}sAT^+91<~MfU6nM@2rdJN51L*9(cm#@ zl{7=}o;{T`Lo-l#sH7Q!&jwLRGX&2csH7Q!&)8K-GlH6D1U1hHw8ViyB@H}X1EQhk z89~i6f|_RpHO~lYo)OeMW2kxHX(k4hwB%%v0Eh-z0HQ$_fM}3|K{Ut$5Dl^bM1w2< z(I5*H6ciZJit@qfGp#6*A+0ErA*~3K9@C17GC_VzD=K10OJrb3D+1vn(9|?TT2T%| zS`Gt4T0TT^T2UrMJQE}aG6y1_m!Aj9?%?t3TxcJvAQQ4pt0)z+!V5Hj4Pim&Oc)p# z^76qmSqz|c9+1@@3=FyXWni=N@*%7w&>}FfS_rEwA2jci1670Il@ulB6@y0cz-ke^ zqEyJl18B}3ksd*4xl$v7*r9o*4ls_RENhJ-$E(ZG& zl#fA$QesL3zA|eN=s!Z%Fkga$}eIl zPGVpvPAz08PEQ44uzYcP2}3b79E&p;7>Ys5^r2x`3|bVOQ^HUT4Zq^NREFZBM26y` z9ERf3BoKy}Q4X35ECwwtW~j(7V#v!cVaO@ZVaO>jVkj=pVJI#KdzT?M4HVi8AR3fq zK{PnLzOZ7F%*aWBm;urYvJj*eL>EKli=px$`*ZY)8FKVe7;^Md8H)9a8H)8%7>e~$84^=c z^gw+_5DhXOM1wL~acL4*97Kb}K{QA_w-jU&11Qe)K;j@iNIWI846GhRgTz5JNW8eP zs01Vdra^uH@l(Nh9wZD(GZ1s~%k)6%6O%x$V_*Q$Aag)8NIbc$L=WU<2%X9Rq07NE z$Oj;PiXKEfMGqpLs#gq_Pt{9-(h%`-sCYS4yd0!YFAeOTWW6-7dq6bUUcJ&hkVGb3g$Bp+Vvxekw>FDqfmX z0&2cjYBQ^D>mg^Gh{kT{42sV@e5AX%>%>;W(hb|+|s7s#a`H-p)r zU}Z?w1G7P1WJuO4hPoL13w9fb4-yAEnITyZ>|_WHwF~0rymWAw z>w##ndXO+k9Y`2LL)AmVBrhG}cMzS*kW-q;P?}TDP@0ng!r(kuT3pTm+KrQ#k^;&e zpmduFk|@q80rNpLh@Y4Tk9A!TVEr2NcFO$P@Khz11= zhz12pavCI$B}4OTQeqCMjIK(|VE~o4U^=%X*$@=>xoHr(1T;>e2TENG3@|pxOc)zv zZc%<|UJ6tVj15u)V}sNrrlf$&!Q#>+Fb&pU3ef~-r$FrhiKl|^xyVZav5S$|DM)Nk zctgvl;O64z(ve6(XN(0BT|}fZ7Tmg`l|6gsTUsfvE?j9hiC$8)`m?30Du| zfa(>HYaleF9s$*%5I&?nDb~vY*DonhIu%NngJ{rNM^HN~Gm)V*CxxN37!+4YpemOk z1=O$sg%PxHN&)S<0`Z{@A`l-`0HlESUV+4+jh+-xg9pq9wT2*Z4ORy&FiJs*1GG*l zzYH9vx%p+_wr6gB8TfpJ-25_d83@`K2g>PSItA25PXSe-47s4nzL)_*gTz7nR0f7T zu)<;}odTs(8SVEY3UDEvlLDcOq5NVfAJk3-9dwhDTmouJF{C7yfXBu` zZ7Wb(%}Y!Hr}^SyQ0o$u7jklpjX-n}j7|jclah_W;g^(b3=Yp^V{ls-)D2@OE(h_z zZ9XtRw*D;seaQiQ}1WKnBfYU~934{i@6B&c%Fmf`J za&uC2!DpFpF)%Q2Aqjx^NL=uq31t1Sc@mJAD|lBc14B4;L!M_|8vOhqkU5}PphW1t z4%K4t_6`P+m=0vvS=BJb3e2~HF1!ZmQ2+txI&2W7T8yNci-7?o4O)i)-rTC7p<1k| z0NLTn#lWEJ>cpVy>cgPx&cLAS&A_1R%fO)P7sR0J&%mJTZ@{4IZ^)qQZ^WSMZ_J?U zZ^EGK51yG|&<$c>&<%27&<$Z=&`o7v&`ksNUO+Sm8!+gm88Yam88PUl88hgnnK0<4 zGcf3;8!+gm8#3so8!_mn8#CzUFfi!mGcf2DfUp6BZh;|#Zh;YlZh~6ZV3Z} zZW#lEZaD}WGU%2YG3b^XGw9~!$AdOhmVmYn7c+qQIi;CU9)zEgSr%WEnu{WqSQ4L{ zp9>oE0xfNWsDms5j4uIA-GCCBZf<5lu^|Hkm^Oma#!%V>tfwG9KZijVJSJxWr6J=M z5HV2dWq^vCfrbm9Y>?f#pzbk)ZhApHXhS9_J?MgVl0iH1x<$qY1_lfaxDgLDqw%5RwNgI;x8o=w49wmH#apUFR_F{H>Etk06Jc%Yi0tT z8`DiIFgAj8`x$gWdvYst!TC|QAQRky1JR&97KjGbU%E+|>G7bgTMP^gy2<%zpn^g- z6|%lxH@6rp0;NIP7<57PXJ&k6aWQx}4dnJb(EL<isbOznT zBv7@^pj(m#nyxhjjR}D^DI}-HLz7EdW<_ZMD4vX<@nr_4OVYsoM%^M4V*>;5eqNB# zppAZzyVf;McTtj$)?P)*U~VgQ+sx+9tldq6v?Q}V17GE?%v#wz5b78fg&WF+P(7=YZA zUX+>$TH_5C$xW;PD+2ot92_7wfOhqQHceV7WTvHnEJ@7; zEr&K#0FB9m*X$`k)M^-mf*rQy7$SySzba@CR%J6cmH&3UFM2MyJ7xMXeOTltMvj z9(bWAXqG!OPa!iWCpA4WM_RG z)JwpUkQ5K`FQ`p!1)a48MHI|`DVhqY70KYO6euYbqU^XKo*cd%~l0%aRMc$l6-}X{G1fpt6Npu?Y=Wtuv^)kn1Oaxk1c}8f$lstE5LYyS z(sQATmyC&B90i+LLm&Vr6meQX(^y8Ng*?@Bp;mNbre7gr9kNgQon%r=A`ys1bksD zXks)oKd%_6_BPZrHqcQh0PjavC`twC$jnKF-0xbPTm;(t0WS4G5e1Tj8V6#6{Zb5$ zE0FzG5O08Pn9a`2OUDogsR4^aLkV=C0Bju#_!d)0K?NyNK^@5Al6dIx1Mo}@=7TCO zP+1Q1C#V30nhB8y4>*8pTYT*V3dk;+;?jbG{36iuuJVl3JOxk^E>5jbP_$Kmo>0NX@WJ62#|MYwDjyt< z&q2oy8p@g~9$>?*6g-1GBNR;ajI9g}jEv084J?cd6p~6ab4nBp4D}5y^exRmE1L>3 z(=$>Ni%P8Y(=$OQLFgBNA~UsE-_X#|Lcb_KzeE9Xv>*Sr%?1n(p!3!k7#N%w7#Kh& zWP(o7c4c5-0G&qYY+cAo<02Q zm{|DNNUq>t$GU`n^`R2})ju-$H#oiF-^lfbe528Z7#7#x`y7#x{<7#xK%7#u}y7#u~nFgS|YFgS|0FgU6$VQ^Gm zz~HDUz~HErz~HF$hrv;M0)wNj3WK9=3WKAb34^144TGc66$VFR9R^3^DGZLrFBlw6 zLl_)Q_b@n`)i5}kvoJVX)G#<&{9$mk=3#KOp2Fa0%fjGjJBPv1{sn`h!xRQb#}Ecb zrx^^6&I=eEU40lF-FO%r-OeyLdPp!hdgL%TdL3bK^xeSV7gX8=)44|_zLFY_5?n+<)oe$}F zZ~}wl5e){=nT??H7#+{9VQ{?ngu(IA1_sc%a*j`LFgQN_!r=J4fWh&F27}{^7zW1| zUl<%;Jz#KreTBjC%^PrfWMD85U|`e{U|^afz`*oJfPtAofPtAsfI*-^fI(o50E2LY z0E0+?0E0+^0E0-10E0+{0E5T`0fxQ>0t|gi1Q_~O2r%@m5n$-sAi&VKMS!7ihX6z0 z9s!2F0|E?vM+6x9P6#mcoe^N@yCA^OcSV4q?}h+F-va@Lz9#|1SVc`J*hQ$X27?y+Z z1p$WTR|FWA-weKk+AY1JeDIPVJ1_s6k1_p);P%+TG;UIM!3=9m?;Ek!qkEIplx=n5OsP23=AO53le8%U_dbs6b_*9 zV`FfzR$ySTR$ySoK zGJXJUh=BP6Bo7t_9kmLJHvtB(0tP0l0tN<$1dswKhN+7JsS{veU>0ELy1>9xb%B9_ z85AE-W#Fw9EDQ_`@eB+Mpm1actxsoQs$0OoARPcxgygJflVq|~=CI$`$1_nk3hwT#>7#K_#cnUr+Ffgz%m@p_Xurp{d2r&pUFfg!z z@X3s@}!12Y2yqXL5i6f-agGe9s{z5uM4(SgAMiWwLr7$6ud&%nUI z#K6GVz~BJI3>!8ufH4C|UZ4QvKF%Kn0t^*k%)qcR34*}}gVaDg@tpty2i0MT3w z3=Ap-ka$>Iz`!8Fz`&qfz`&r(ziqPt0|SE)0|SExG@d|dK#;+KX+Z%bz?cdc7&sXm zKokQgY+)FrhX>>s1_lO@8$kB3GBB_R7C_A7gvudPjCxy_HR!yttbw{2BqyY|b?GGc zT{G1f7#L(g0_a$PA?5-D!vx8Z1LZ(8`_j9hbil~J^Dx-|47Q1Lz~ak3 zp8?Tak$0YeXcogArXZU2fdSZF9?dI}AU>zi2XJ_D8J+^WlWXc0JCHboaCRD$&IQq| zYr?`oG*8sgd@vpN@E(X}eDnt#PK=N2z%<*rP;j_%Jh`(7B+v0g4otIYYD4@#vE?90 zoK4Rf%x7Dil?viBO`ZzM*NlvhRhmG2_Wik_a*vT^e{La!Ukwgtmi^U9AU?16k1`O= zT@9gG_N)erv+r3AR>xg^6dbSYd!oU7mOas6c@D!k^WnLrAoDoS znp^_WTuW~p1<~9whM+vk$a3N*I9%9H_=C;mv$+F~Z-y^BKxHu_<9-RSex9@^eIR|D z1?NG91|tV^d^Cv9DsmaDk7chOINX?3_Fn;sGpn?K%6mrkNk-sw!DMtR44%fcOm4;+(-WizOe3X1%Zql*btPGaIFuV{<-rl z9)Z*`9@GHSY)__v!;3A{5gdQKZFxsP^1N;F86cW1-{3Ns{f@p@Ro=ZS9Z(B6jJl3#nV45S%Ko=y=k$ME|FOD=3DE$OX zGfaF4PR9&6(EJ_)qoL(U)-P3%ey(L2=3qMcd?|?L^xHE9M6<10c@0D}uqA-Y1BUNQ zSV4Ri8Fxs!$%dH277d{pQcr^Y!B_5I0#e6wbO)%cV`Mus=_iQKb?yMToM0#|2j>rl zJSd$DrK=z`dssU}-tvJTNFVzKs}K;)6*U60O6ray?!mSwq( zfq|KkEh};x0|N^qTjtMg3=C|HoTpD71Icq$vO>a#y&LQfuAN?>x{Q(i$Q^Jvu-jNw zg4D5I(0>M^*=?*qEdoY{;@P`Fe75wiH6WTHi>DtMn>qY`ehei_It&EYEs*KG+=$>^0!< zVVhwLF5lT=dLZGF3lV4M?A{47kMoG+VGzx5UI#4C_6MSlV}~&~KeOH01{P(>Y^T8X^B6gR%NI7Iq&FaO9wXknAeudACM2B}tpVqIhSY9wJTqjO zfzvJ9SsQRZWw-H!_%j!3{wat&`|3$x``9fY{$O7{8={~62BaQkpV;B?1!XBF6AZ1*7X z!?A8LsO`YWz}6iD($BzlV=IVeyE(%RM04bA1ji$nUOm`6uASS!^$~9+DvG!9CI?}gVZx|+yJM4ev#YYbjB00RF{MJEPEmC8Rid*u7mg-zIVX>C^(wFWibp!TFJU`f6~w%=5?=+)m+NzX=>) zEDzJct}ni3>^N9e_w#Zn<4dYGss>1 zH+=X(Gkam6eE#|!U-XW;Ui^_mg5{l=~eX$P`x zh0v^Akot{TD+(Nb9A24V|FCCdg7Yiud7a51^Vn9u1cx6(lpL7m{5A_xuYQ{a>YFh# z{dNTVgLlnZuse7X*ueRXzb6{f&a?Oh&TpIx*}(2*o)cFGGMD$71-KsN$|(hxr`$8l zz~RGIwG(VV+v+>ua)jyce@MHL-xeG{d~aD+g7u3%wFJ@3!9HMj@=jU=E*JTgIKcHB z=Vm2v`;s|f8#v!ETL**F8~aaCUygy1#bN@aK6~s14rg}OY;d|{tK4r7GM8h+XK?+^ z+BqK_E?g0FA?fZkgwJ|mf*430yYLxs{lQkb5fb10KH&7kmizw|NS^b7_%;yDFz+q6 z{m1Vk1nQ?S@^Sv&0}|)_a2c$gJL3YRoqX&7nC5))0$gwN&DR9GpIc_D4M;tky#d6Z z4yAuVe4ZCy!STYc6ATW2hU}?#K;pdFQ^DmKo8BZ)pNx?!<}|1u$H?OViUtNo7Oqxs zJB)>^6E4je=lZC4f+#lguuos-4Sh(dH zK1jifaY;I8Bm62oS25|q5b2c}q9}D7x+XLL(55Vnoj+q<4q>j+y7c`JH(c7r30_+;adla=^&BF&bPx z@V_|(4rh*;d%^jT=hq`}IB;Jw3;>zSIeQm4{5fVG1E(9#-LYVIb3JGU_m{Y1<-p;> z%y0ezX;>dW~nwUa!^R*1rWrD4`hd)3ooH|tO#kHr#|xi|BRF1oQ;oppv0e=Xrw8W# zeak`W_|CF|&1EjT2yXwf|GxwdclJg8V0nH$X>d5QY`X?7|2SuJgZT^_dO%}Dj125c zz~u+qoe(h1P`L$6^B&m(&i|a7Qr?5?VY}lEPS3nYR)gDdoEtWR(<3XNDmZK6ax6B+kH<15SSo97W)AoPqHaB>zaj=#}7lmuD$-+(Y0L zIKCMKPJ!LWdLBCN5%U!??h$bjoIe;JeS?JaBNi~twiYt(!FsD291pBJAvDL6Yv6K| z=mAIpJh z?rAL_LH^`j2Bp0r;~uPsj)B9GCrTe&Ui0KZ>A3gc@`m-TJ2+mMjxo*#>1U8)1(*Lk zv6|p?z*7LBnK+70f#jJOA>$@Y5-@rtINveIyn=+6%qwtsv2hlH>jj4CE#UH!vHBRe zoxl)e2F@2e{)yml;QY=G>mN$hfYU7x z<84U&ohc2j*I9qZgWJ<=bFPAE{u7cn!0uLH28So>pO=vFj?A;*b}CoQ0&u!y?U@Uv zxzZqfW@cG%xUjAM3l?V!iwC=pORpR}KEkz$3tXSDS!9C!#VYgw9B#au)aZ-C%vp@3O)E;cbfqm*-qJQo;JUZlr?yue@!!u^@l*wnc-(hwDZf*j-#VQo-q# zw=EG|UNeNKgWJm-JIuiC2!=XH|BczwADlnh8sa6QDpzYSc!v2m>f`;Y1LMR0hrKK%kNUm4h4!1XozhGcO2hdpf@ zI9)KXr-9pf4D4xOcQLT1f%7dFp9Q$x!q1`vu5b8@w}bu39Q+IHZ|>AOaJVuGO#_Du z(_6ihApf&<34-}--FaY|rD`HroOS;_FwL@mBe-1Uf5;6k=h*+rfzvbp^S|J9$3D3h z%xA7%0p@ddT)zo2m-7jP=KYWgt{<6PHNoSkOs=h9nt?qG++O3@a~9m6W9lga+sD?! z25tv%zZ8J94_>K*S|6@k5yZKi8x`XsFoZc?K{VI7dEoM%J!d;uKLbM!xEx@&*&zv%=l}E<68=z{|I@EbkT}z)zu@*b zKa^&h$q4QzFdbtBr#se%>0p{iCkk8-a}=|K>tUv2hr#0_+$NL3@Y;jZ71!ok zu)jF3-3HfdEOTSP^)*K>C_XqCS=iTr>kTFi7O=mWo zu^x_i4DvU#*Ew*x&oWgOTs|^R&<5vowloQFJBTeU8EhVJ6lA=Y^@9^QfAMHKfZHGJ zUJl^+W;C*c_`5R{TrTjXZUc{lutw;E%Rl}H?O^-af;%AnfZz`BcpJNo8#vvvre6S; zV|?>u!Tx5SeHE;a<@`>tKBi^nCLs5+{k#P3x3HO}g2SI*?lUAEF%*FN6FeuTfy*E6 zV^`Bb>N$?^gWH+BM~;KzhjZ@^aC?ZY3StiHDHU+~;!2wdE+=_Tz5x4|Z*n}?UmRbr zK5=c$H*h-San}cz18lLEz~d`?99rOU2!>`eaJ|HFtP5NZ zGyU@d+t1Xs6dYfCw`#%Ttvtp@!Q)Fj*-OFh<%>~u1i7EJ^b2?%gf&G8+#lxub{6a& zjyy&N!lu zgU7eoD^K4C+n3b>9)IK)VFJ%ra7^$5&nvKXLHxyI_#B)bc?{UW_V7s>fN747qu}zB zcbWxg?v9c5QyI8i=BqjmZYOi!&BE@$QPmphz) ze}VgZobmg>;l`GB6kL8W^PB{iXPm4M_w(NW3NDY?ukHYsBYa;@g7tAvNrKp$&jF5i z_H&EDvGl_xl)F9mn4|u=_c5Rlt1S$iHC!aeWj6`;T8p7@Xgj zq#eNHJ#5Q1g3aOgc@9xm%XwiFI9!=N+k@?Au)6`yCtMpez~wO4 zu1Vl>o>5L&2V^eu7C~@+;yE)NJf6bMoCPiixTaqR=VPX>UA-W6{3qkV>UmDagWDB6 z8_dAzl&y;sT)uIaNrBzX-u)C@4>9#U1*aS4on_$hR1VMiVE1uYK>G3A9T0Jb+%j-_ z;dF}tyO*PHB6z%qqi-RU-Uz0-GY*2wJLb?MV45v04Xlst=}&NeWIGM1CpeY{fXh$z z2*`LN>*?zd_jEzazlYLb|FUR21;-=PjSJvCJ~$)Xz~hW;nGpZ*_q_(!cO0wMH-hZtw3`J^f1G<>fXAm;=kS2X4cIn> zgU8u;nTo;wVTgJU9yef{vkJ^-P6!0I7a4LglTs@{D?1p9(=!eA3_t=PuAU)GK(8dV zqJ%*&GcU7*K`$*cFOxwpC9x!tL9Ylx6+@_`;$jB9Vh|ahnwP>5AD>d3AD@z0T#%EP zoSK`OSHciqP?VpXno?Sn8efu_l#?1?oLQC15FekKlNO(mnwXMW#1IcslU|gV3l)GU zWQdP1E=epZVTexyyCpt1IlnZogrPXKBt9`Er6{$yIKCh;vxp(NC^fMpH9k2%7i3|4 zacXi&W_}(+aY=kZQD$CATD%bw+nAvkteYV(H65g@IJJZ!B{My<1Y&qfX+chAGDrgC z?4q0$hV-KR^7zD}qQpvw%M*)>Q;SOCQ;Uii3KG*(8On9pmBc3&Cue3d#OJ2O7ngt>6Q5aJ%#fOsW@Zwf28nY} zl$WIz6@y|2B2kf(SdvoSgQ%7o1QEqWMoSl~sVJ4-fXXb&K#zyh!sU^i3 zDMetenF$IPNQm=r1}CkCre`KIq+}L@3XNFO<^c5Pb`QBxfvYSAWmX_X$hQDoSX+|=VT^< zk{eh@Q2|sd*kK@TMX5RY$q?g;67zC0lOXK$f)WTLr7|xuHxs5JH77o$G7lnC1j^89 z`4CP@WnOV*E`*(&pO==CnG7``Js--*$xO=0EQWG&;i|!z3G6s6_l13;-OR;IIAXCCg*??Y))ccIw&-AQ;X7588TB-Q{$5pbCTo1)nI&a zNlH>_8bf?$eiBBthAaRniJ@636>LL1lu83vmGMP6De?J9S>XDPAvr%S4V<+Z^2<_- zauO>U!1Y#Y3OJV(8Gs70^a2o>1}2NaWRbBUNT|3nH#s9QGminp$SYw;D=IFDhos$n zP_#0n=B4DPW#$!>mM|oj7J!4 z3FFG*_&iWu7Z34ud}(ofQE^EIxQ-|;Ny*G-h@)X0m`+Y@Xi6(DGX`F$%%Ps4B#Z6ms%bVYJ(J|B_^jbq!q*`=Oh*v$Ab#3 zqLTd59ELP#(g0hWk(if~lgf~mUz829CO)koIX=0#h#|EiHMy*SAwC(@oC3MLC>88| zP;CQKlMGG@@$to}x!`n_1|d_x3PEKdN(&OyzAerGw+msd%3_AR(%hufA~eCYOi=zp z(F|$}pr``nv!c{I)K)6AEt_0ggejGinwMUZ!H}Ms7oSuVUyxXmoRM10kdhytmS0q! zSdWRc+FsCHGya?6|M-qY+^f~$Y*&x5g7bk;S6Hpak6XMH@AQcHz5M&av062xCD}w1v zFMv20q8H)|c#{Ug%}q&7DoqDj3~rl(`~{XME&+QJB8})#_DUq~&B5#3yBzfLNu)8S$W6Ez5l{G7~Wkbf}+ON&!MSr_7z#InT998j;5A+fkPGd&MfdgXwn7&43F z^YT+tK`~X5TEvi;l2r=sF@nPv8n*dqX`nV6%rPm6pzc+1az<)ODX6^wW2EHAS0p8Y zqZm}>f?HlWCHaYtEEU1`EEi6sUDF*qWxHJhQ2QD`u(i!b|Oc#SnmDD1TQHjNn zpv?sJVv5YbZ5mLiRFcY2WCmgsmBfQfO*jt}i$$f7-gHrFeo=a2US?G)SR<(3fT;)f z(&KR`PD)~cdnP#}H94E1C>2_}f=V1v?>jXO6lbY9ndzCJ-g0tcUS57ld`VFvsL`HZ zlv*5Lk`Kyv`9+lspcGOZpH`Hg3lmAn2RkS}FF!FSGqIQf>`*ul9HzNo8EE-ekXTfl z8lPK|n9cxYf@L9j2+V{kgeGZZAy7vs9$6qIKOW>(un@!qi1naaHI*T^7?x3Ti$N(b z1>9BzmBk=ufl^0eF|?bKmI@O}%dALAO#?}$Wmc4@CT4@iVL&MpoGU@%p!AiWR$Q42 zZkdynL#8N9jsS#A%C*|jW%r6Ixnt;X$ zARJJVhT2qK1n(Sx3T9a60K|qA(%`;OYI1gbPJVJ?4k&$s#)Cki0c!b!YsC1J)SQw; za7ZMUrN$?h7J){8lH)T|7(guy&@fIxVo@qXYFN`tzGAgQF}{Ja#f>ZH`XR4^ksA5`jq znOUW|5W~S~up}Sk#@x)3 z6L88-D}d+$YX>#9z$Sos1^M|oP!n@Ood;O0o01Qzxxw`*LwOO%Ik}0+MfsraKz8Jh4OX69 z07_#J<;ex0Apxi`H0B^OVD;d%0M;6xSpw>9fJ}~0$;pgQ$$>^paY-(?2M`Ym!uZ6J z_(Vu00cumC388Uw6N|FrOY?H`%fJmpn`%S5u6}Et$R?R2g)Sy)*qy4 zmIyHb$^jXXSqv(D(&CF#3rkb;l2aK#btq`q7cmeF=7EN5a^pcQs`$iY=V#q88mz`k8Y(=v>?7DHMaoLdxFwCf;B8EIr7r7+0 zC^s_?)OtyU3~+$!3sCC_)Pw{FF(}+YqL6+Nhy`vcgXKZ3j(BK)8q^Vmw9E?fi%X!a zc*s~mW`16LT4H8SY6_^)m|6syOn?c1R3}4}muF-qXMpl4*y0>W5e#M*!`Sed0|szE zIytd86{0sUwH#cSf;#fx?ne%MS^zZi4;F$I{tynR*PNbO1R3W*4BDsWLxxeny=ss= zsCOO@jSBF{6{xWQDzj5d7>ZKCW`W!Y!tsek=?tI|bI_;K}8Bu@?b-q#g)0Bq6XBuO-qR{NKONF>cKQ<#1~|00Vq#{M}I+S z8`PpnEUiF{c$O4_6oMxWKyn2sP%daNup~YORQZC$L2Z+?6xcKaC|JNPY3Q^ABzU2m z;*z3x&_Hf+Flad#o5AM!`oC7K*K~*qhUIxSix2@yB!B-5L5e5xoWP%xq#kruu z8Zv4C9SbdnObvmiYvPmh3o1*%^E-*96`6=~5Haxrnau$Ap+GYwpg;oCnGgwZaR?Fs zm#QEJY;pzUeh?otvX_$r>hk3mfhNo=V1vsQpdKltgAJZ_2URE)&_WCxTA(Zql?TsO zLj;j@6(>VG=<%TT8dNDLC&wdXic%qET6`wBtIv>^Us9BqSDcn#lv~V@n^+K^o|9UZ zn!}Krmzv8^Ton&W@%aUyu~vrsf)qm#VFV&f7@#ASpjqF%3E@GdK=}ct3&e&BXXcf}Lz$rV1zazveGKQM6+niaVEVz5Nu|Y*W-g?! z1LwjNBMYD@fi{>bK{Z)vDg&GgGauCG0kx7l351h6&V>A8o-^An^{n71m_i*Aj=h*7#Sc` z7MYkK^URP{CMCg*$W2UvvmwSMGC=5JhTKfJRC0cSVSYh8sIdm}P;o(K9ysia8Nj{N zlKlMmq|9^%$m$PpJ0H^Y0xd4dOwY?NN{vq|O3Y0yW&l&57B6TNB)I_A-^oi&O^HWv zp&eFGL!SZ01`U^jdfMp);A{l8r8u!1)Vu>V2MaQj8FCVfOX9(uH;^o7yb?TM3(gtE zr3E0{pesv2)lX(3Xj-WlRCbgkCK)lLgU8~N@^c{m1nC0xPryAE(5e*%PWBc&+5I2mLoq%H+@03oc@ zyyW~8=voPo#o)RST-AaH>mZ8CK@&S*nY8?(R8U_YR4o-1fl~r3MSw<7z+u1u9-VE zf~SIV6N|IKBi5jid}xz2J|{oF05qiw8R#xbO@|KhLq;|-LDSh_q2dyd((KX#29S<; z@SJT*VtPDeHB)X$T6{)gRbo*JLqTRiYECA21Ud~g-Vf)22H?OWIH3M^PAWrE5~M{0 z%?b>#aaAY{?qD*+$2%6KgC;*6i_*(LlaQdXS&-X7J!EhnfuT6H0y0O!P@I|`pP39^ z&jjjAgXX@$?kvbm2DR{@Q&kWbmlP!?r-H^%LDgJlaUw%mYEcrXR?ALJEdZ-dFDOdQ z0p%Ztq)bpBGBYuc0X(S#md!6H0n?z$y*L*d44{4kq}h{MQBs+fUs?p3e_#N$IzU#X zLnhx7lQJO;Q0EXj5dP&;mU(lkhf_Sha7}B#6b3ntdAR07z z0UnPAc?O)-L3tBgkR&BB6lbJ?x>-fw>B8dFbWkw>2|7?fg41XQWCj$@2e*vjyo|(R z$RHJXDkCo^H8Blr7Fa7}pbEr?PVRu}bZ})<1YW3tU_ufNXqXcmw?*-waRZpM!GQ^{ z?IGclUjUjRhfHLG3Sp3gKtnNkCE#qq017lnU=%=Sj`H$L67y1WK~uTOsj!JH@bnNv zQWC_^iI8}Mngwblg4_ZL0Z6GhBQu6Qqxk4 zic(YH^GYe@;GkzH0auY_h6W5pCdLK^pn(;J^nxOA_Dh4(AhV!R0f|&l%PT)8GdHs& zzAQ1PG!@ol0f~cBVmdhILcIx&S8Y z8ee2$U|_(Imk*lBf;uifBQZG}q6RbyotTpo4;q38jp(GLfGQzy#gvi{nQsBLT0z7A ziIw2lb!dwxw-_{n&ybp1P*MpUIf3S0aLj{j0}Y>mZOqFDWx&*;lGGFiP*bQV6*PPe z%2l934K%0?R+g5NpI8!~1I^Fr1)#C?-2AdsP-`{0C?Bi_ye=jwu{bk1i6J+?A`=q! zNtx;K;Dttsqkeiy4msrA(Ql4J`u0lbL7*M|e)cFRx8xmZGpa`l; zEy@Q?WrH&;cx6HwF1;whcx`5o`R?;PAy9<$^`X@pkugssp+656R3WH8Ng5+ z4{qE+sxyWZ6duIqpx#Ad2}5FWu2Fsgm`W_pg$fp>ri0eoCKbge=9DK^7RQ5H#Ysi+ zIhon1Ih9ZzxLPg%Rnn!#AbHTl4~Pb3sbYp?14AR@cvzw+$~FQ?fx19owIGHGNCe!t z2Qk1Mh?LYckWR1#*?IZpd7w-MYG8re7LZh%R+*E^kerzqp9D_6nR)SGPG%mcEeHxp zP#p-03q%PF2{$x8q*w;q0&U-d1_*K!D?sCR@kynbIVqqOR5{SdD+V<&!D9g6{y|wh zWPx@;QEC}z{vbV%AuXo_TyTKOI8dW+`NuY zs*KM`VJL=3L06iAYD`c7F@SO-XbljgDIO0Rib^UjhB_eG7#whj;DA&YpfG_{Y>=5G zP)9oxG$_je9tejg9Z;A-<`qFgAn!s`Pkc^hQUPdX1*r1~3Uo-d4_a6bmPyPj&V))c zfCeU$ON$sFePnPS7qp{>Fji)8*aX@O&A`C$AGDWUlfe_T)c~Xs%-3h|EC!uR2$MGj z9ZCq2WnlOZ+B;z_z^Dk?^8=Cx@tr{D6(Y%d3NRUf&Om_4`=Rke1R!TMG6+M=1MRZ| zYZqn)o1eqLz+4Ry5N7@l+Kb!-J_8bTupvagA9`jb162Jo=vkKxLJy z1GFarCcl@#VJB#>2aJD?!O<7Aw-UyG%HXuC0%Si_|3?O=U7$VvF!{d>PP>uRGqNx^ z?FH>sfXXxSGq~;q?Lmj}r5IdqgZBKu_&N-350T|<7~GzK_O8O@-5K0og7!Ya_&yA7 zZ%q*HVGL(*`vBS#1(Q!=aQlmFUOt067iiBHOum-Eog3M_E(UjA&{+vE`DqO90-&=S zVEow(?gF4ac`*J`26sWwo+223J%hUtXb%~TzmvgT7_JJ`)>*y9$#3nM4@ejgjnUl4Ec;?m(Ew zq{-lJ4NiX$`o;2HN`#lRwPhA&Zng znJzJS$bt6mz~mn?c*r58N2a$79*RimkLeGChcZ%lFmp3_sDSpmLG?3>GkB;W>1S49 z@K8tQ8!&jNBiYYv!{Ffw_7B9p%$^J$Uf}c#@gH+IgNHv-{4l4&_)z&G29E%w^uXKz z<3r_p89V~O=^e_S3FAZUTgKoK06OCg8ve|iVSK3kK?aXNr0`=t$KVl&6o1TjV0@_g zFBv?_b3o|>%KysXQ4LQ25IzeFgGV)JZx_@)7GVaDl}O>qqR8N}8no9R8lEgV3?8dN zd%|FR69$isNcoY)fx%-llK)wJ7(BLs_AbHHhckF=1^W-;AC^=GkE5Wop5!nZe^BQhsFhW$<{2RKBoAGI%^fO8=~>3?AP=dx@d$VJ%_sWCQKdgYlaf zJT*ak)L{I622UMu{)M`49)qVYvinyucp4&wFY7i2Peah2LYV&j44y_v22W$q zo?Dpw9R^QRr1FUMC4;9aQhs6m&ERPYIwK3Jo{gKq(+sJ6Ws_j=1Z~9x9k2_kZ`o8C zJS~y(Bbyl>XVG7(Anp(hFM}gJ(2S zeZZE_;2DkNU$z>I>i0cLJcc?jd*7GM?ym8UTNGXZ8% zQ2OM6y7!F$vnZ&%gvoywU=~Ai9|yAlGia+Z%zYeu0?gu|@K%86=MY3~FLHqP5rcvo zbU-!(0|N(W-zqX6bbcZ-AGH4-nGZVu1ep&$e*z>R%m8X{a)8b~fQ8Q|1_ln${#XtM z24)RGhW{WwsBY(AU=RTL55x!Udqw7#F*t03reBb$9CZv1o51M}wBeY6fuoJVVG}4k z7@+)a28T@`|HAl_85}l&>qn^kECz>7(DobHyoC%7o1o9*7slUtMuo>FE0jqz^;IJ9l|1TLFHY5B06NAHMWdDC>aM+CO|9=b)o00s_$;#jW zJ_`V9A14=s!)7G^a|$y!Y)0}wrwoI`W+eY}Dl#~1hL*=5_i<`4IBZ7pKc@+U!)7G^ zb6PPtfU6^zeU1zcTaf(E>CND<1;Q27G(eLWq_Pb2=o7828XT4{y)Xwuoc<=7a1J3BK!Y3gTq#2|KDS9*oy4` zrwk5Tk^TRM!C@=1|35Q0Y(@6}4+e*=$o~J!;II|R|6D8#4qK7@&&AE)uocPwTmlRZ zTaoa zQuy$AF*vdzwa<7W863Hh?B~g0aO6iC58$m`7D7!B^a1uxIAD`~dUY8JyIR?Vrlvq=6J(e2W>J zbdb^;-!=v(15kSq=AY9HPR2;##rJ^0$r>qs_&zf@IYG-0kbV3t3{D=<@(s)vW^jrD zoizzHkKcg7DIe56gYm5yoGPH@BUrr~gHt7v`}qACoM7cCSU!ruX$R7H8GkZ^6LR^& zpTXd?11bFY3mKetB83Nk4TIBer1;|RU~t-vlpgu}8Ju=Q%U7^{(-@p~BgH@edY*Ncma7n8E2XQh6re%;2ns zEbqtQY=qR`7D!-l_CxBg3*<34L&kR?`9+|X!8r&iJ_XtsoP&_{_cAyKgZdlL_!gML z;GBSze+1?-I42_WS28$*&m@GY-^JjZgslGzgEROp6`1@T2InNC_!4-<;GB#U9|C_E zoKv9n5h%U{*%_Qu!G~8t+%G7?;GBu%e?e6S=WK8T5-M-O;GBz;eg!=loO6-FLokfN zIS}PN;LrM>VGZ~!Akn)q@ zVg~1Gr1DR2BZG4-QvMd)&EVXQY~N`H=XPlQ4fg*v2IqF9^eOm+!MOuDd_FQbcOb=| z5G#Xo2U2QKjZ_{Al`%MXgZi7$_!eqoaPCDme>#J6A5#4(w1mOA4=H~LZDernN2))C4lp=R zKpIaGI?dob2`N5>t}-~UL@FdZ17@RL4jn@bVF*sjBYJUmGFgRaFO5eh%49+)^{3o2p;Cvscd=#!`aDI#we!{H` z&d-tEH<`it4N`e6Jcq%B5vjfwUdZ4Anr4EPU&8AdT$qvalkhGE7ipyU6h6n`B8!wi zgdZ}v$RV}Ygx@i^$RVX);Xe#63P|RO@G!WnM+$!tK?avyNa zR{^B~*9@fcP_&7`H4`bliuNk@B19KL*!6r1UMu!QeUpsk{=CU~rv?6h2~V46aj<`34NGu<;2{`6K4c;0o(c zgZW_$uCV?cn4ikvx&vu^T&#q_bth7IiB&SVg72Du`bVsR!F3msf5qAvT#?&LV!aHm zdy(4PVlx?B_aU`s#pW`&9z<&Yh^=C9J%p5h#5Oay9!4tf#r83{9!83PvEvM`N07tg zI)m#`WcS`>a6N`po{D{9a6O5Xzr_ACxSmFGk2n{D>sh4yB`(e2dJZXniYqg?UO);T zaYF{zOGx=i+>ycc5|aDGgBV;dA*Dz0GzQnpNbxCN#Nc`rDg4B18CB8W457|6F2Dkf2 z;UyWx;C3HbK8?ZcKC*p<3~rB*@}FcGgWF@I{2mnK9l^$;O>T$o+bY=xO*U(FU7>*?upbMmEvM>_d-%H zCB)$FwF6n~z(4@N4#q?#GrLy+=|)C30iP^9`wYCeN|7*c#lt!Ho#N7lcc!95q* zzlRvy%aPK*)FlS@3S|G@XK=4XN{><>8QiOo@`E%3gL@THeJCx&;9iXse$omI?lnmI zrS%xxYmnMo($);_wMgkp+5@(p0}|iTp$zVINap`G=ZP@wZc$6WfcUd{udK0L6Z3d5Wr216Wg2AH#DSgVi!q%fe)rZ2? zqd@to3?B25^0#augU14-@=&&p!D9ikd^dx~0;KV1*_jL;OOevM>{14gWytogWAIpp ztbY@O$1-I72N*n-Bb9HmXBj+JBDGIsZ!vhRM5<3@Uov>CM5-@kKQef%Mk=r57#Td) zBlWlB_!vAkAj``zcx*uG56G!8c);euv{~P$6=)UO0Ji|<0w-5 zNp3oW$5CYY6$~E7k?q^e;Bf+}{VKPY!Q&KC`(5r7gU30f@Rz&F;BgD7zaaO3!Q(bk ze966L@VJXqpUM4W@OX?=pUd+wcsxPsugHrrczi?BFR#ep$%YhO@>&d@;4{pj>0jQE z!BYb%e&nqfJav%TEAp-ko_a{-v3v-FrwLMekxydqG(jq#r{mTDh z@XSMUuL3KBXC9LO6!;lD^O5u`NHKU8AjOA*CWB`oQu(1^#^70u00R%WK7jK73o!72^9O{l$RohO11=At zd>H`-9&q^p?E@^=Loc);eot;QR~aiwZCZ zA@h|57$Ea~Pu5@0X`*UwP%s{|Nq zkoipl3{J@WUI7LVaQ_IZex?9}C$ju<0S0fR^rf^#fWaFn{V44hVDLtY52cd=43PE+ z)V%8g4BklLuk=oU!5b<3mHrAacq8QxWljMGZ=~>7mK0#{MhbsrRRIQXaCrwYU)e-} z!5hiF%B}(o-r)KHDjy)g;DeOjl;Z>#e2~(ca;^XaWPA;(zDR(<2RwcRW>HQ-Glq z+#iJaU)4x}p%mO7hVrch7|M{$SM?BJs6dKO)ldP(e@OXDHBEr=A5wU!mJ2W$g4-uh z^BM%043XW_D!>F;e+!kLB*0{ZRDY<>5@3QX>4VBI7hp0*D$iB73NRTXr4Q8;0!+q8 z=|lC3025?=E>!H68&bGo<{fCL_R< zjFi6Alm(a;fx`!~zEDj^faxxHz7Jx*nu!3@TV%eY05c;fKA`I*)jR~48A0&@^4( zU}gukk74}t0?h27_A!iqOMsaj)E}6JTZsrBCR3UkzsgW)7tErQs*Q%z>1?G~xu9 zIgrwqMuq@02U7adC=g)gKuTX46#~p0pz;7_f42ZL2U7adm@L4|ft0>9W(hEJAf+#j zWdh6`Na;&slK?XZD1E{FyGwwX11UXe92H>ZKuS*MNYf1_*bAZ}&FnLu0 zW)4vM3dYwHVCDeThcLdi05b=uzJl@H1eiHM>vdp!9|2|#P=5u+4;NtO0JUFW{44=x z4p4gm#xE0K<^Z){VEiTlW)9GJ0E|CTfSCi-KZ5b+2{3bj%1ao3l>jpbs6K}Aw+JwE zfbtKFzej+X1Jpi%@s9{FgXUWqq4`hqmH;#76{PTZBEZZEN}n+G9|f2>LF1b+{$BxR zPNejz#Ua4ViIiTogaw#6kJIYIp)7~frhnG>nJ z)d~?{<^Dv!0A1(>;z%44lw0cI`%gnzZB z2rzRYijH3H0BNclr+rvNh-QvT37D!|Nzls~jC3ovu(AesL_fSC&^ ze`viEVCDj)e;r8qr}ayKnF}d>X|o70b0MWKZ23Qwf;t^*2Br1Y-iEWpf#l-_j$1em#y(z{Nq05ca-de%u3VCDv;KbZUS z1em#z(wk0|05dmI`qF6n7NVClg>N=W^M-t2F3tLdeT`fz|1p&fq^*& z%HJfw%>RLbfpG(re?Wj)Z~+4YqY9LNT!2{!6h6@OsB=|-8Fb|x1C0MzfLR!1AB_K2 zfLRz+e!}=)1(=0F=>^9BE5IxaiVrAXmsx;W7?j^(e0~9D@P1bqUqXOc1XP~G_=*C| zBB1mO<7){pi-6JxjBhN!ECPxT7~fWaSrinWFuscbvnVKk@j(2i>nFf03Njy>{&d3x zm_?Dwd)-6}VF2F1fY7fB7+bX~;jufAIM+BI~k?McFa{|obNcF$o z3jtBD0?E5Mxz)(cc+5d zZb;&cp!;z_d`<=iW>7ixhk=0^bayyN42D7aU~EuX4`YMqsSFH^W(*9>X$%a^G7Jph zz6eMhgbhIi0|Nu-jzTDtK_0?j;%8uB2Bp(Z2%ljU0|PVY4sFmqs-Um~-E#?*!bXAn za3Bdm1_nl91_nmZ{fQvHCy0Px#`O>yPQHV)5DaKsGCg2mU;^FI2(p`vfq}^vp#+5m zN^6h>#0<=C3=E7J3=E7QvB?Y!jG%fRq<=931H%&r1}0FxMAFO%x_cNDuSyIIjG#KN zpMinFmVtr6h=G9-lt(~&?LhiLca?(Ffq?;Z$0tY*bSErG zKP*l`Vo(h3qk{ScP(GLf)hnR;&_Q}Y0-(E<85kItG#MC}TNxObKzDe9#Gx2`_cUbN z8&rgWfdP~^>lhdqe=#sHK+mpV#1eK)!VC<|Nd94nVqjnfg+T=a12d@p(_>&@+Rnhh zY{S671lkY`x=$2g3z)_Hi-Cceg@FOwzfNLcV9H`(U}R=sU?u0%bF7W?*0h-KPyo zE4vvO7(wlgSg0hZOoB3*Zb2C!e@tOuU;_2yLHD(S!U)u-21$eR-FpTGrU?uTjItmB z1_ovi1_q|33=E8*yKEssV3NrZOffKk`kNr88v_G_4Fdyn9|Hs9KL!Toc#t3hGtNY? z@v#^|cg}+DtL25LVg}uj3}G@bg3=PG{)F;D6eFmd1Tl~>BdA;jwF6*cNNJr3R8N4? zI7kkfb{OY^I1CJopgaaDyFmB5gYF!MrXh$dDhVE!K^0nSp@;bXPWfzcECD5i)qmzzDh* z7b3*KpuxbvbeDmFNew1|n`Vw-U|<5p^Ew6w#zcfV<~Rf!#$p7u13+;N6<`G2P&$8*Gm}~m?fc#(aIsHD0T{zj$krQ3=B+2 zerM)oU|?JYlVo6E0@Y6`3=GV(7#J8u85o!jGcYjnFfcIPVPIf7%D}+*9HN#PTE;Pe z`jHSJ1_o%^!jKISU|a~LLFEVN&hBFj42($m9wG}N8Nma>3=GVmekVi-OfrJZuLm<3 zm_dDLXj*21wjG&HLFC{hsGknyFoW)o2C?lJ7??IOFffA3N@!io#LmFL3@!gbO2GI4 z0|Qeon8m=*%)r11Ys-i-FffA3mvROMMrimmL;VI-jY@&+K@wpEwb?-ZeNg`X3Xx!r zW?%q~nKPYXU|=ePh=C7ZfHIj`85kHr4QUX+ih+RtaeQ|u?+XJ1<81~8Mo@hQs;5A9>}6nJgtoI7p=~~fwNUj?ig7;! z1Jh?v|D1t=c`H;955){B?~&y}ZB$U*$;H6HSjE7=@Dm})47yt!%4LSNht#10=#(Nt zfEk)j7}p_*!P{7K7S{Ahtb-K*Amj42+;Q5vWcDwaH+8 zk6I)(Fs2!dfuI?^p=?l@I|;&O)P~SF$&CyQOa~bln7=bHfag*`alMIwfeF+e#i0>wibOc#V^f~HeO&{z#b2tv+hU|{NEU|?Frz`*pCfq@a!jsWEWF9rsN z%Mc|DAoq1JFfc!0U|Gqml)2sz9HiwZ14YZw@qK<#F21_s8% z3=B-5a*3aTfdSOEfyM(Pv|R_D69d)3jtmS;s~8vE-)}Kg4#o%wATf(oB1;X0~4su1C0ehgdpTf2n8Y;LG6&E3=B-Le6*W^ zf#ER&0~4t32xMSj0OiRr1_q{Z1_mZjS$u?nff2-q_ANnXFo4{c$iTn^>bHXOI;cE| z0?RNkwlOd;fXY))z5=BokT9qXpSU|@pf1KUC^)N6n!s-K1`(!=?10x>;10yK> zp^BJ5{b!K9(-{~T;~5y3Kz_GnU|UmJSfckcNP!*uGaFKz50aRapV_;wg^--QOFffDq2cWWJ z0|NtNF#`i5XbfT|0|Vm$1_nk@+h_#?12d?90E%nS*dk~=5L8DmVqjoc%)r158yA3u zC#a0y$-uw_I`9ZoUV!XB#K6GR4Rr^|98mb!GcYj2$~sWp1L~`QXE%IA!rZ~~1%LZlcNKz%<@J$99W zfw7-~f$0PT10$&K26)BRc~FqZRC&O$G)gP+DqaU|{rOU|@vy z37J6o$ccf05tR2qW-Vo4V1l-R7?(jU0*RY4Ffc>=r;MO<2bBWt;RMb5GqEu+FoNeV`^t$UIfq@Y;zXDS0%fP@0&5z73 z3=E8*dKMIB5)2HCNcATZ$gi&%7?_}SE7LCq1}4zh)kOvd#+3{VOrZ1%(sz=9fpHfD z18BVflQaVZXk7%;J_ZJ+jSLKo&@z_^)b|IaTaaI&^)2%X1_tn&1&|o1+{t8MU|Pt) zz}&>Zz_^xyfiatbfw7Q*fe|_`$pjj+f%bD5PcSerA(ior=NTB7zc4T`A&qr1qK%_L zgM)z?)OG^d2_4G?tqWm-h9l!w1_q`&1_mZjc?R-Z0RsbLJp%*NHwFeKXdjdbnl6}N zeFK=mNHk+N0|WCx1_s8h3=GW3eG||a8K@iuI|c@3a|Q+`P#%P72Knh80|PTOUoe6Cs31Rp#>SR0Fff7oD$qI>riE!M0|O%{ zFTn&r>T4Jnm~S#LFhSdIASp&ro&}W!APy8Wg6fkD1_mZ*`vWS>z#PfIz;u9tff=cd z$lSrez|_pZz;u>@feAX616psx_?v-&@goBRlQ#nc^D~GEOm7$%nBOxnFo!WPFoV=X z>pNy>-;!w}0|OIitQ6!{69xvxXABI?o(v3(e;61*Yf6})?I|XZJ3wRW(6WgcTCRa? zVT6{EAT}~)2DSg80!+}h8kEZb?aslt3{0SW1sb0GcYhU zFfcH!XJBAT2dRW$rdS3B(7GTHk6Dd@feAED0%|jY^g{D5(`*I?CZv7?GpIg>_Sc!9 zW06cq<7&*H`U+$q$PA?No~eR?feDn?uRw^*vr7cbclh08CnNIr5Ko685o#h zeQJ>ZIT;w3)-o_KgZj2GMId{iWiLpGX)*%?(^LiqW@wl)f$DXT1W4Ua1_ox(m_CTT zj)8#*+81Sl*7eMwHXFz-pBNaJ(B1Nofq@y+uJB`EVD5n$2yzozJqVLw2AvTNZ9_4G z*0w+;n33`ZGc?^XBaP{SltB&~1hE(xm_cn5kUh|G43H=j$ergH7?>_FFffDaEl}GE zTVJ6W0B}fgZ90&E;xfvLkVd>-*0|WCu1_owmInA8Hz`z6=djzR} z#=yYzoPmMq1p@;!tnCOjlo?viGNYAIAZcb$-cev+UB9ByCc8GweFk@{~iDQ2{~8YT{+A?KxnSeTgk zA_D_6TDb;N#SCrxgV>~EW@tN@6n)Il_9;vc^KA%=`8opwGc^B0L>L&Dq2r1$J~GV= zTKk18Kvy>N0|ulzgn^-dW`h9pg9=4vg&&+I5)9kX_&d<}JJI;N(D=L2_)k z_!rRl7t#2a(D;|p_*c;QSJC*_(D>KU_&3n_H_`aF(D=8}_;=9wchUIw(D?V!_z%$d z57GFK(D;wh_)pOIPto|#(D={M_%G1-FVXm~(D<*>_;1koZ_)Vg(D?7s_#e>tAJO=q z(Dic_&?D2KhgNV(D=X6_hz7aE_N`GJEfiy#Ad?SPF8{~`4`uZ}R!f1t?7@I$qK z2?K)-BLjo_QU(?V8xF-D#fAkc%NSS~SOgjv4jCw}QG>`s|kJE;8oxI|A+cs1_5w=qwoW?UIir00111{Ro_9`NXegsOl819%*)$CUwGUkWT>0Q-H7GXn>MgM_NU0tQxw1p=x)OCj>3#K=U9BAa!e+z%vkF{Sbe@*a7o5*v}yUZeS4UfzE;pF)+x3+}y_mF;l>S zK^nyG@nc}<NDjmX*#nY?naR)~peoS7z{4DC$^d4g10GYKW z39i-!thTQKw5FAz_Z%b~dqF)PXj=$srwmvf$W8_ZhMr`Ix}H1+mL6yiobkMXGK(Vv zGXv9sW)%?4c%T_%7c+wZTKax=0b~{^%=%|G<4fNHpzr~QRbK;m{IB;MaFw_e0gZHvo^zt$oD6)4zj30i}^xpwU0Mp=14i2A95KgMjt>7#!B`VX#@h zoxx)LHU^XRTNw=2Z(-0`zllL*{YC}_p#(;Q^&1#u`sa0h>7Uy5rhiJ;lm3ZaANnVB zeX$W|_-`ZjpFu^4K|=i=14~~M14Dmb*8>KoiU!6<70L|!6%D=T7#Kk8zDfob5TEh9 zgkle#+19u(+19uez1NR{& z#_uOo7`GLuFy3@fHRk-!z`z~HWSGnFpOG^_mC?6Cb^Uqid2VeAf2W8lhcVBoE6Vtieo2DWD%gAW7WIR*wkCk94w4;5y! z11b!BK}?3e{~4G$6I2=a;+PC88U8c&R;V)mbWmNtg2AURi-DyFG>XQR(A>X+!H0n- zqk&PkKymF228O^W;?w;I&AGKK~yGFfa%$Uc=x!c_ma# z_x}Ua9Sn>D3=BMrcQE))UI!IF{r`b!J_BemB-`Tk489=qK z_b}KnYGkM}RB&joU(4VlqQJn#kf5R3KeMf+kDY;m`GA6|3LAq2sBD3`2c&-;XlS#D zL9!2ADk9v)zz`wCc)CJy?E?meJ_`nhzAgp^W+4X2KG3KTS3*M{FK88}hhnb=1A_`b z0~-TFfe_=m2*tG-3@m+?3=Dl-3=GUh43Z2C2||oM9*PU~83g+D7#KkM7%wqM_JMor z4nmA8A{5tFF!1zgF);LjMr?y1dYE;AE9NOzw zk`a#JS`RrKL4G`-2%2~R`yVvR2l79t=P#Mi(8mc{1ze%n`-*`T+xwduIzZ)S|9%D+6(@s`H4Y36{h%^!BZET!CI*#$ zP?@-eL8pH!gF*i`29y5n3>N+S7#!61G6aCjQ3ZnlNICl82{WWE69B3oL3Ja;G706L zJ_ZJrynLpqVneO}%%7$griG4ng9f!ZnSS1_ztzKCH} z|4N1x0tpPFYhE%i^mldrP+??X>h)q^P+!8JA?nB=0IJjaTR~yjaAy5th9%(eTdKqX z3O|qq=@{XYX#58|u?H#2C!>OoK) zxPA#k#`>iUIX#mZbQoA28iW!U<}tE5DEBvY{bAs6Xz1~0U;yz!Y}FtC|MyStdeJ|v z>p}k{NPW3}1w(+1+F=R2cUqs4y@GF&TRNXJG6XLU2Fdlhft7BO(H^8=M>4HA8+3=I9t7&6o? zcTWJt0h5A)D#(A}G(59o2UCKAYF{w}3rG$uwuiw+Ea5+R{25f15mSbN(!Kg#h73sg zbw>qSew|pqpFw5)9tH()x?aZMFrkmZoS~sXRqy~q6T<>f-QV@3e@54veoF?1p7jh2 z{h$?Wk^v2%w*UI|3_8qQ5sJNO3=Dm&3<9t;1a+f=fCEDxgM)`^e@EAc{}`T{Zo)aF-VVvt~HVvq#2*;Tk0*g)khINX1N>k$T!y*;4W`6f_&We73m7AP(} z#URit$-n^8!>j}nKOn^TBSBGAl|f={0|Q4d7Xw3od)E_2CkDx$Tn2`o*9;8({atS$ zZH5zy>$Mqpdbt@GdO#~mk{Bd=L9@0J2@Rk=3FDgp#a?h+pAZ7ILD%y#u=KBo+-M4F zn}FN{GF!Eafl*YIL0~P&uI{ckJ?|J8dO@=ed?y+hD>D>9VcfeETnFmF(*}b9C~biD z@`Bw54(l0^B{P#jaRa^sjlr;gKZ6R$y*+Oj7{G4h320z^RiM~=lz{`lc#o+mTtl!8WA<)2Z3Y4b%=XJdR_gf}|%HnPoc)vxIL1z*l1899egW-7w zM!^RR;CY7rnN0_n7*NJJOavSl)-yPCs7{Gs0I#bMW?%rdiWqt#89-~y82U9JeK=7D zhNYk|=<#F-=%3lVpjU-~0TeFlmw?MwkU8Lar%BLRDa}R(CIJOdTMFFXbWvZ*kifuO zcYyUF1GD-vh7bV;1|=0H2F5-Muz7R(SrF!d`t|*L7)%(LB(wz*Kzk&>^+`sLCxcFp z4}(hoT84z4NCu7m9SkXqo)IdHy#*?ac@?V677i+mFC?Kn_Bhw&4mNFOgl2m`-E69Y#;0|ReC6F3i69#HIO zVqlmi!QjWh7tz4rm7v%QT4~{ZLXknDqJdf8L2)hT|37^_3=Dmsola93B>T7-LZ)#t z_%U!FXkw5!(ZImz&@dT1s+A$c=qsVv1Gb%kf$?UABIAn$#on&}KfrysRSW?PTyYEx zTty5FTvber*H5T0mK{)Gmh@0HeDR-wfh&y3(3{~uqeg-%V|Rh-`gIHe?K>EPCiyck zs7o?1YCdFO5>a4~UA~hcsE?Du1ym<9aONFgUBDp0z?Ien>dy%_GJx7a0)mYUpmva; zXd?qx|5}EC>FXE*Ca-4*G`+z9s(2F`P!({28P;*jx0fa-cs+d+aMq$h`gVVWd^AA>|h69aca1ISLsJ`Y6($%+O> zP&o7c|1pURn$9Es|63%%;MOMq8AlRh_zzxd*}tE`1~ewrzmY+re-ndD|7He-{w)kD z{aYC{`nNIY^lxV{=-^!{LA zQT@QcBFq3859@=jHi78{>0weZP*oFv)Rihrm8O8yfb@zf{0HxiLskpQk19)*W`N{D z?gzVLX5$x-{UAB8*d7K26~X`iMFJV5L1SrH^v?n52ie`<+yI(8ThWuuzyPW*8JHa! z7%Dlm1VH^-1_p-y&W0s0{fwZo4mSpHnV_;%X#>a%kbMFS3|*ixOA!YK(0WLQ{+W$` z`j;?x^e<)bL3R@;oM2{w>;}oHELGY9G6%#5yQRAU>=tmH!ko~+kd5S)UL?2l7AW>Y z$9h$kDxCqD0dfnd{sGbImS@225)d0Cr^3R(*gvxkJaz@L7bY&izz_p2w`VraP+!8J zgCZ9IIRH>35HeOOz`zgy@@GF5wITt~xLU-Z1L^}9_%r+$e86D9_@F^m@F9a9*ni-D z03^MD>`_^&bOGcxCI(O&0@OzU*Kbcia$xuEV9)`{8%r`Y2rEFwb+Lrs2ap<2TMn!T zY6r+ZW`!S|Dod3?-pC;IQ7nAOg#)&^+k@$%mI5p!x7Xe_uBbsGkbWhZ4~I=dgY$gNx_^2KM#K z7(DuCHZB3R_dxyx*#YW1f$5nI65w!J!r-EAdF>5IUS+8=sQoPg8jA+Y&1`H@S*na& z?@NI5N`E)FT$uPCWD)~|-~$FO5UalhHNUI0FepIH1@+g#;R-buTpobJ6e_O(aufaV9`2QcIR^9Si1Y8|R|4Ig%{;qD0wMq;O6TKK1K>cSy2S^zNibqg;3Z!TKVg?J4 zK9v?_mHx#H7X7OkY#5jm8bJ0i=42?YT?85*0Og$q36P%tbs+hQ29REr7G?1K2jlq$ zMUZ+>zox&fTcCet!x>OmfaYRA<(m2u1{1IyOO-+CSpvidxdG%SkU1bZ5F2jB%x)2o zzRA$lpu(`S2o$d^4LLA9DlN(eFg>6;3#12RF36ooYD{2i!18U~khC$g;S9)qAh&?* zS6QlT0a6FzgUkTA2WAF{4U&WUPX>?w!0|)SjOK0@6-EZ;3CRo$AUBC5GH`?P8OUBV zw|l_s1&ytO)PmGO)q~~?!Epj}r%H=*0FrthsCpKWL}=N88GaEk^&qui`$6RgYQ9N; zsR7GF!ylv`9BwVjDJb$t`r&GpDrcam!89WWMIO5u1t@AT%_u>U$8H8VU4!FsW`o2! z1_qY?r3^NZ{Bvdo$Uh)AgUk_d0L`B@sDk1HG)4m&O9siSv?#ZL$vf%AYl0eGZ`hDXbj6-U2ccrVmWR&AjP=AvXh3HX-$yz-1N4E|6Yz z%R3<$dOEs6bCWI;!73RTM8SJ_A$@pI9z`l2LG?MLe4N<`UIU11RzG$>f$DBj_3S`| z1ExJ7e}LT8KeKTM$WD+ORF*350gZ(*F$k!F^n%)Y(0aoGQg56A&;P0K{eJ^gXMn~w zMH(15*DqnvKrXkD%IpImbHH}ZZ0zY@0-47J^Y<`FsJMX2J1k`~XkK?_2wLSF1r9O$3b()pn23KkgC>DM}0ekhv9h!0nrBx z&g$D3eEO$0@)%8@pYV#ewu+d!+#Y<28DH83<9A3uxKKKz`6nk252}y+|>Yalgd(M&=|J~ zNF6ADF*PWt!pd2g{p*-O^I-q~3n@a~?E`VQVK0M#;DZ0)J))pGAH`juJ};}0QZ;r z^dRm8^<_YQ=>v}ffbK1WT&>$bvr(dtg@LC}m4OEyo_iP+L>wUI^f7@C>SkZ3#K6)g zzyRJaBnG~7oPhz!F37mc%od(L6;yLT`uY*`*8&0z4B$OQ{WDv@r4+KA=xRak6-Z#< zWk_gH1<#j3cUFr_Lfr-(%UH*O;x_O)M^HF{^ouF{2d^W=(H4c~-{V_AVU6rgkY3PO zKWMJMzo{GCrtX36nCQua^hrhhAT(%<4y0bBAL6c_B*@wTkXTPLB+Nt-K=-sWFo4Vh zDU1p7e44HFIIK28%50Su zmx5!JuZS{H2eNfv10FV?ZA(14kbl14AD>0}IUk>(?;|fXo8v z6=V1hPEW{o^$9@ACY2Ty(A*Bld_J(-;pVGIK+R_9V}s-ekl9FPg4e2p^?>{VaxbJl zf$nF8trIya1M)8@UG_IMG^ivqYN$9dX28amCPH@+2tI(MJC$Sx0g*=_-@HLE}a*gq3;|0YNr z6lWmue$YCone9HH@ob1Vc{shi6}6r zFf?l@iZL*Vs4R5=jd@If^+ne&h4kBnK>Zd6Xd4pL9-Y}%pu)x|tJ0!!0^}!^r7AZ- zeRojUsR)ASH`zfO`1)rydVua=v7SMvzY$W-uhC~p z0ksSImqPk;Oo9raKA8fOf`Dp2BHX8d*RL=zFsv5?H?wTNJ0AvQp-#z{e94c&#mVytUeH75VGhDwaxc*UDs;U7>TOjrQP2J$NL-2Ap zf?*11oERj>EUBOfTBoPd!e9yxJ5XALq+yl*4)8pB!vY5ehF%VXIsIJ?9cxsWGS)IN zF!XvE%u(TFU|j174g=6yJPnZlL1seI&_S^O)%X5KPD68uO+!pd6^fwzs^Z7M*ptkZ zv3?zc3FBjM8scZj(*U{I1C)k9aSd`eDDFY&qJJrajtFR-ojJqI6h@%9fw)rwW9p`*X0p`-V`!GZpn?GZg`3=BOj20NxcWw1lm zC&0iU25Q^)&xG9Fi!6s^CJ)%m84xr3B@Ff;n>n48!3bF&*iC3_Dk1T>{{bi+tMC1P z0DbNSl#lwSG<1O5tUctD@YFN2hh1Q3?ROM0t2%O|NsA>br&%o0^qoG0VJA;6_1Y?HS zkN>ds5~R!nK>Ln+&w$c|P9uXjXsrqZOF;uD?}Odn-_X$C+0dZ+o-u>*`~k&&Nd^X0 zO@=U=(*Zhf0A-9%fB{y|b%1Bo zP|`4{UpKP}bPfbU52)VT!yo~&5427aY9Flq16mIv1F{R${$IafyaiCfgik{ z?O=t9=tI~zHt0+}0o9&nh&%(cW&;E3u|whvpuK}faZ_*L>w7F<5%(m44^ZD1XNWR8RP{V8RS8ID*;CaS&7q`#BLiqn4~u{!Xk9J?gNOroPK#RvGzZK8YRrN55(}vIfKD6(MTVru z0aitre?e!^34qq|@$Ourm2C8QS7#QD!%BUVk z1_t%j3;}Bs85sK4F$93-))@He4~afx-~i2&^&{yAnGezrG6y85!pOj5EXiOmtO)iO zpRgj>UxLDlV1J1SD}w#QFRTa-V_tDZ2L8!wKx4xQH-XGtzlb5G#{=SS6-NI53>>~p zqKXVmDqIYVVEI)HJ|KN6j0^&X-3<1ki46SH*Q1&Paue7bUnFyQOPNFug4Usc$0R{! zF@yAh{Al=tfnS`Fff=;6U4VfxPKB9)W%^FA|Cx<782CjQ8T2QwVhBX{e~%}U`JACl zqK*jj(ba;&3KTaWagaYiakPFBLqh)=2JrY}Z#Sqv(e`EiY6gcMU(iBv1<;%sBUs&9 z1{=`0G-$m7C~O$dA5aF(je^W%Wn^Gx;P5!C%E-XZ!02(9SrfEwLIS!!oPh!4Zjc`t zxDuH}!Skg5|BECts;Mx7${R*ykY6XSW(Wk0*D`QtGKnr^FziPQPmp^-?I4hS;5gx{ zWfFZzhF^C;{0dtC3kr+%D;OMlA|dgyekX$sC~QD+2l6wB?gx$WuY!aJqgH~lYBywz zh!vD4cnc1zE(H0x;4otzs-Hpb2l*KqudE=yiX<|;1knNv49`G*?q30kUqeX-esM)` z{04*U2e}JmKiJRIjNe{p{H|qi=z+VkgP=S|Y5Yn; z{I`B5g99kNg6sl?Cn#LkuVAo&$E!E!gp~wk)n15SSwZV6xeE@fCW8E0aF}r&nqSv5 z1cCgD7O%xnzZQV~x)ZDho^PkG!s1tI#w(5TEy&#qMFg}n_?Y#gV zHv+ACX8?`W_0R0kfrUF*{~iVj5WjzB8|aKCL>mXvU$X$IXK-i$j}L>@uV9D)wPir- z-$3mWW^lKM5V>x zLQgjX1H3QJ&A`yp3tn3YT2q;zx}Jei^(F($no0(SHT?_>JvSJ5RE~kxOcypV@SQs( zt^jM-Fx+Hd2mtjTu7m1-Q2$(opMg=u$>7EWUr?wqFo-T->;c<9qg!KvKLZ13?x=q~ zLxeB`WDib%TSG_xPKFqjV+JRB4uRLkGcYg}G%y}2P-fsOIKX&QLQ%z+fpN`Q28J~i z3>+$w3=ArK;JpY8D!dFVCKCTYuBl|;S(DEovL=r~U_mYe%Yp<3)+H4TZ2dbK68e`i zr1YzR`aca4>lZWls9Qb(j|qTW*S{FNMn*z_fiV|67Sz_zVIukeBa&NKK*xT;><8_? zSyIWswxl?;&hf6KtAuE)T#CXaz(O)moj$jt%_3~^v{ zc0kgVIOy6;&^*FUh6GT)=vQIj0p$yZ#sU?=gN%HP2SD?TZJ_&IQ1TXNoi}JdfdB&| z>l%H7J6PQX@;eU$6SChyenIv>$nT)=5ny1j0K2Oh(l&AnnuRN~MUP=K_- zL17FU%L0`Tps_5Fe!&9_;B#gm?r4wz$$`oZZ0-Ts333xS-av85UC{uxYYl@-|5}C^ z#@7|fU^lE}uwdY?0M9KmzLij9;5x`)IFo^&S+YQJK^_B(iUg$W1eHUevJ_liCNQuv zGMrFdlfl5VB%OgxfPq14O(uf~%v~V&fZes4!2ujk&@e)A6DUoA+_Hlq0_+Z0yzOC- zVBpSVVB7(6%Si^qJ_defy$VH;{R{FTW#^J~2EH{J;QEqhO(p|JKQ#Xdg7*=lj2#~V zm4TqJgO!2cb^&CZEdn$q0g{7^Nvx@W)UW?KK;yNbeJG%QbpND=4p4bXaNo*C2FTj} zC5#mYt^fb4uVZ8Z#i2?hLxNh6!5Nif1{Zo28Ddm58F|7`+n|8RumvGA=!!xW>+41H(=a zMRk4#W>q}~=5_uI3~SCYFo4z0Y@EO#*U-SQphFeZRsn_i8a)Hh+_w#bg9Y-q`WDa_ z9VlD{7#RP8@*@aM>2`=jyL3<$f zFo4uCuV2KlM1XIi`xh}R0M+~J7cpk2@Pq3u1{H1w2GD-AHU11d;JxhL3?gg1 z7z7qLFt99eU|H@#v`HXIzZ}XfYnWa%$2AKFw6jr zh4w+$qeI7IZ3Lk6+iC&~0%Ah{!RKQ3&xGhvw`9x^lZ3Uq7+XN*^*sfxkL}i2$I8Gl z5ww4DEn|+L0)sjOYa)Zn4hBY0I5My%H1w}!%;=xl6vNn>pv=INZ~$g6V{Zqjy=nsr zS5TO)Q(|CPr_aE%P7ky{zC8rA<^bexP`(1~tpTMmrp+8$0t}2PAp3i~7!-QE8B|mx z8JHJYGO(=EVh|8eU|?CN%^;$}2`-zNmT5AuEi(p}E3%6e7+7KM0=Wm>9bo$vK=oUD z05-c-_!*c57#Ll_cKb1ifZVc3pMeK#ryc``3K!H)Ee5`2#teLm6c~8biWwNiO8_P1S z@9jVi8<3uU^ghZS1{+A-fzijX>0iQ_1IiEmOBplNE#Gy3)?kCoQ(*`9wLxhCd_IBz z10yHMzaY26`siT0_AuBmF@ffA{)5h)WdN0H{oM^6pfu5Q%-~9Iw!sC4qY}yj2@Dq* zlO2>nX_-OpM1x9;!ImD-iMOCrtkgXeRh9n#SqD1h$sN3(h=1K728JGRtUff zsDj2jLF;P2&F#J%0beZOk=!|G)G&Lgty* zB>w-=*W~^GBQTEvd~yWTJQlEdUSRVQ)@1!(0yQsTP2&F*JzoF8XS}b; z`oE^f@jrN9>6*m<8+yF{gV&_3$@;&g$MHYtOkajIiT`)>ME(bz_0O=T^8cP5$NvXF z;jkw0|AC&!|KQyhYbyUA>2drI>dArBpXiDF4?YinP38YHJ&ylD=c9wfFZB5S2lwID z_Xv&F<7E* zc`s)DN(KQ2c8dexyv+vLTiy4TfuX+#G7sI`W3Wbmfq{Q*FM|#!kAlon0i9I>)eq9Q zeh1`Sfj-b4(=Mn!F9Yx%;~*p2`L1B(hX_^bpb6=qOhKti>@3B0D5ae@;A zg9%Cj{=%M;jv*f0Cjx9XD8Z#PGU$b0JYUQ7!OFO+JKHjPOJd& z!Q(g}wG4>|RGAqhRQqRk>zHIRFoO4qfG)Oy?XBzR2G8w-_UeN2A9#2ZbW*N@gld0R zH+bF)v<4j{CkUF)2G7?pFsiUJFkxx`fbWlh#6^1ssP13C7}7Ucyp+KmG%r3GM1#gH z7Be`g95Xnu<`4tJ0#^oB(78G)ybK&m&oT)0+yIYJFfQk35a_uH9_tccugqWoH8%yP zx$O-d{UCFn8|+#02x>0q%m7XXj-{RqLZH2gD%=c=OS>5adZ4HEt_AIbZ)xc0pV^)R zG8dF)Kz;?e68-FF@HZ0NTq4nnwhisiCTpY%m4MOkJ>W-6&H81Ky+kT4sxBb)ps|Dg)`kuh9tH-GTY6S9 zfX2@lK>IU#Rzt?!)`HGvS;xQt8e>~~hJj=4Sq2`^{$&+T28p#l7zEb-WDx0D#lWBf z+7sW>(6QEo!D6i^XkMtjq^HFI>^@Mqfb0X)t>7`49I$;LJ6cqI)+RA%fZPa@M-D5H ze?aG}z}lkVzA9*}kAr~$v^GYCiviT$XIzuXV6!HJ!D3A%gUFf+27xvC3_NS{7&zAC zFtC8)eoZ!m$(k(C8s+v9^soil+20FsQ}0@X11c@55la^_*kQP58D#wwKKHCS$zZeQ z1cSwzn+zgrZZHU}InThe<{SgZnls?OY(A(=fToK80_kD}Qo6_h$K%ZQ0Ccy5)Iifk zJXj4RU4YC6hdXE=4Jh0}duSkP!RaCdsuq?mEY>fBtp8SNQ3cIwDyZ->FoDyB1cQLe zQiBzsv;cDV+9U>s9&k&DfnjYg14|F+d>{q}hP4M6I6!Fv6qairF!1z%&WQo7=du8; z7blnwR`jf3U{GmM1+9CMzzFv}3<@CkgX#|zP6p;RnG7szQW;dh@tVNEu_l3mXH6>T z3@sdS+XanVFM~ZQEvh9;ofwQT>{!MC+Owme!p*>}!pi^}S5{ebnt^4_0S2Bm2cYMn z!Pmju-+`P)q4lha`d$VP)bWNn;PwBYaOgyOhR9`YA^gd*WQGE{@qhMg@eTXz(@sJ@x^d)q>0_3Ju3=1G* z4~V*Cjg|poZw8{gO~F&%N~o|gaDc{kLH<%nHb?-aNl-irFfhCV`3thK;&j#o-=s zeqD^>9_aagV7D)0&;Yp|6h`oLi;t8nUS`M~3j?!<1FIr~f1^Au!ufjXavn&^{ir0=vmF6A_{Fc2_`U9 zgTz%N!DFfAYj!fQ^qgc6P~m0Z5>;R*UUQa#rRNNTh>8RQhhPIk0Z6R?14Hhb8w@O> z2N;+QDj5_E@>xLp8rco9SQu2;88`$T!0XtU!EHgu2vx=e0aef(lR*xH0|Rpg186;g zi6;XaDBc+r1XM*EKVi0IxU@?hcUW0I(YpzXdN!BuK-#% zD$u~d460iM7(ioG8mgeRqoBO6^N>LhysnJ_oW7YD9tfzaFfj-~@4Ui)v5*VsN>mU?Wk$U@pPHs{(1yfadlm^`4lOtAT&@*mP32lZbcfZ}95xJ?c@=L}>XO1peN1E?+ppKAb$Ye*bT`2&h0 z^}YXBfWjFZKgk9UKyd@wL$ZDYgT#8Ixo(jJ1|HCSH>lqWGDF>x8{Ah0u|aMI)6hDn zC)wZuh(CEfL%fRQ{~w?|FFgee49xlt%BnvY_?bC6RP+=X8P>07Fj>Ez!2)z166m}N zlr`aOtglsCRH5f!se<+og7?u(UdfO=eHBAm|7wPe#Tyx17q4V+S-y(FO^ktod;Mw# z574@9(AYI33?OGTf!xQWlcBhNEqF~lCuqF@XkA`EX#KpNh9W3mfYgJ=6+vpj@;ey< z)R!{2FoD;KH{4kdZU2MoJW%>v4r)&~-05G+5YfMk!9wK;WIw=q(0*)?{0;__{^bk~ zpfKp4+1S8jVW6yX3^Zn;0bZ-X_#CqC9u!XCHRoLo9lacoa9aynbH9>7r`HS0hpabO z=?Cp?*#KYH83BpM$tIw91h)nHx((K-7`yv;#L$?7pWS6&S3`a z3GPt0@TeO zWg>X}FK8bOD1WGIWMEmp2|WKKp{2;c%Fr+YwDuda-)b|1iiiS(qKW_mOaEj@zf!H( zU}71UM*#Vxq4x|C66{W3=I z{^j+{8NvJW`$04)&pRl9#tbq*J=zkM&-Hc9VlB;<+K7-(0@d9c?BpVbUg>?-mtU-M(kQl0U43ccLR?Bg6smhQw3xf=+;P3pA}RlEMe3DmEjC5g^)Q)(E1cm7=gkH;im=> z2L@+QS`%Pkfb4Yu*NN?*c00bX$UzDVOPpcB2@MM#21b=+gPb1djXa<|Kp_8u+`V3t zfd#Zj2E<1+2d!R!AV*q*$#hZtn~;r_1x*RPBZz~|+m zhgl7hKiI+kXl&?E;b34~qhZhjD)T{Yu{8g z#|%Jwydir7mN0+bRm$7q^nZLV$q*k`F*@LqO}1S{pigRTx-$ zk`1=>EH&6*(8a(g2=4z|s4}n!F)_G;=F%AW8JHp(7_t)-d)vWdgFFl@W(^>D9Y=7P z#R1~?gU;n<%4ASI$I!vJu0pZ*Ii#!t$uY1UJEYIZAP*j!S76X(2F>q-)(3*l0kh;# z?6K4b&mn=%s%KV!=o4UI&W(H0H1_oIbW(Fb9dLI>L25tcc21ylW@R_FKD$ERA;Jt#( zkiLluGlQG}1B0LnGlM*6&O?QnK}>*wfmel@K^*yY^N!`X6*A;Zg<{u-lhG&KK%m#^3;| z^Fi$waGej@Ypd{sb3IHRw67ABzm_pLs3aRqK$KaGkTM&sT`Bm00emMSs1LV(2?Mx} zL@{d_g9FG6Q2Shffzb?9?t$mM4l?M0=dccf_sB2{9Aqc~ogFN25OQX?00RT~PCan{ zVrEl>N{brG8AzZuq`3qGGmbtV$2wjHn{_-47VEefL_lXktm9299--3?ew(1Rl2|;3h9LH=&$6 zW5ZRzVCu!d44#|dWk9U&1-VHQY`4ui2?mRG{0t)N_!tD%@iOqN<6+=f$Hl;c!%Y)F zekI^0RWvt&$I;>8#9hE(n$5txj+=o6w9W`64ncD$ybOr=<6;ni#~mmxnLul&Fyd|r zAvb~DGqW9hUmtRu2{15B0H5zUvps-t`ekTCO22Ao={E+Ne!+L>2|({x2B$Gd`UQ{0 z!oz^CfWh<}XzwEf$2xunm34d!EbAB;c-Ap6aNr1c=-E23x*BWx3t1!r8s^S!jkQN0Yk^d_z-@Atp635Q!1W~ai394&|9`AyhO9dS#hsu6WM3qxeg*C2 z0FB$N&0-J$?UhsEVPILi268R}NDfjrG{Me)cmTd11yrZaYzNm3p#7tu{tCl_232q$ z5it&~18xKCVUPfo*U&be7bv}h+MFPFfa+QhEqDMr4=}SmqzBqJ28n~h5TqBBegzm9 ztigIAwe@+I5wVn(-Ydsh^K<8G& z%B{7z3?gfD7zDujcQQcE&5%5Pcy}piztYnUU7NG||BWd<&~-~|{@`~T5|HUGb?S^NJ%Pv8G1 zhQ0sU*R1>hq^BRchH3r(7dvVSff73G)x`t`z{|`MKkaao?9DauwI3o@)<_4%P zSoQx)PyhcfhCU3x8Tb!6Fi4y~#31R=V93e9!l>h*x?sisFFn2gzZh~c{AJ(;?O&-s z#K3>R!B~=kiCL>ab-}v-UnX?_|6+Ka;h$kH10&=51F8#l{QokcKx6S{MWvc*_ql@EttB z%u%7b02Fpz|34W1WZ2KZ72&|ZoqmXcC$qtD9fJeo%?#BAYyZFK>G=P_a6Q9)(A_Z% zoZ*KUxFQ`4a~KpD`@w#D(K7S@CjmEx$Td6vzv-F5zyfkNXda@cgMkC=_7w~~J)I0Z zDozYc44h$23sx}*fZR3#bkip{=zf^ALkre02=??d@ECgkuV;K%pt5Eig9vD!gUV6{ z0|v?ChZrP04=`$j5T#uf|?%v>i_7wr5G-lt@&!Em2} zJEMVt7v!Hx2g7#^3XCVf@pPf3i-8H$Pgny=bDfa%v1aA}4?W$WF;NDFHLJn#54lT{ zH?3*Gn*Tp~`v3o#u;%{@$ejvhhZd~+|Ffs#{~yEt|MiTF2UOPV`2VM;3zF^_xcm<> zaAqE0TpyvjVDmP^z{G#VCcUKaLKD5)2B=+#ae6R{np{()0h5h}-{_Yu5aKgOpa%!D;0<1GB&b262W55~`p) z2@ZQ`o&<+II8TDgXa+_|T4CS-#f!>P1_89R!lBZ_zynGvB1!+>g3^nC8|3V5P`Uw| zyB55!2$mjM!0FKmbkESSrUg3~IC^F>aHuS0aA1&x+>fzf<^PjCT?`;|4Hz9GRMxEi zf2OAgn#b4tztGbQ&EsqTUjgN7P#$35t7}@Y{{M}h8IUnU1_{s|7H)?YtoVPkrxPN^ zs2HHKX4U^YJ>Ag!zxw}!o*roaU-SP-PcJkcc*~j=tosiRU$EKy2OAh9&K+8?^Z!dw zng)q6GJ2@2S^57>PZu;DtU^l%J^vx;fG4kM!P@^nditPzKG5EnV}};(`2VwKCPa)` z(LqJT?f;fFEB^n1#gmN;|3URRHL&@w6UcWxf$jnTpT{(@p`m|LLqq?Rh6d1mQS0|J zn5^H!V4x!W|G%05(+xF4rZ;LqOi$FNFniKxf<8s4ro(=%3l}L4}ne0VEEx1GHuu zOvA^U)xdo_uo&pBtObk)ps|ep_HLElbIezIo-;74U&qAK^B6SmxItASfsuFp0!E$w z4U8%vT74fw2WXFG{}M*0E5XWqY-@d*Q`Ktu03 z1``HP0cFNB4vM|}3>*wh0u6%x44e#}0*bv74B)*Lf)S9mQLiL}PXAg)1JOv(94UCL z=Kx53ZyxBL0|`~ebrs5M`56pA_VuPR$Vh_Lm~t94^zUGN!f?_+nSsrqf#IZqVlQaj z0}F!*h~Lu$z8}tn;SuL7} zQ&41>!lB)Jok0VXwiy^!sIFhe5Fw(#(9C>5LRG8i!?AWtM6ds5KCl`QAq-s@&CV2A_EuGlO2j$3;+KV zQD9)#TFAg50BUcF7BVniu25Z&4-QK%m1G7+(B3eiLvzQlDGB7O2 zWnf%T%D|+O%)rdRvW9^{w1%01VTLN>gB6gqHc1T3puGYN5#TX7E^vC?$@rvy9YaLF zE`tg~U4=5^It4|s76xaKoa6%rM-VM^fPsUdZh~^(A;`EIgYyAJX1No}Op;)8ltF4h zV;KEQn2^V+L3=|u7#uc$#zb=ZXEs}?w5Z3R=ONHKk9B7m1lAn@%|kU#Pzzw-U}ES1 z&+{>X?ihpYvEcx(#RvDNnk_){KOl2dTGT;jtb_9c$Zbpt4XS;heMK`H?l2$FP-Sv} ztg~c1q@dV$o&j`boDJir1B&ZzFmQm4g?hbH-r7UjuCw0*VL1sJOf& z^r+gyV8Yl0-p2sS8&CSzGn#n3Ow|L2TIE?fRwQIVKy>SP$5I&=}ft z&|N-?B0WzSIC`Ez&c*}f9Z>lKvIBJf8Ym8XTA2QT!WJwB*|!8f0~s{t1{!|@_4h#G z54sZ$q>f1ee6A=s4nTH+^nv^WrXMlLfZgoCpuxZdb*mECtp^CZRjHuo34=t>GX@!u zJ=opKjC@w9jfx}#%le%RptG?hK<)&&mjt(JK-~&S&n=*{oZ1U|T9{oxdt*RufQ2h) zZ9#u;w+g6k>s<>9*LyL&pu0-fLFR6;h7H8L5|DWyvq0ek5BvUx22j}bzGs#JiLZUc zAOQ2i1clAp!gU=~izXMi}Ffd3YfXY+`hW<$nIUu)z_I9ZVGMK0Zsb4{^Pe5jZ z>l0T7hUq&Qk4#z2pf!Ch<1vOp21$?`m~{&jm#hPo;|)Rr2@F!x*D@Xfr3F}iUcZzP zbQc0BKeL1L^UP)oP#uo$56~Ltb?2dZ8C0Hw#!Mv{Ox9gy5LkDCfn(iG28RBnkh}x3 zWBNMAWBofA13+W_%hxj=nX-sM3ly%*OeYjU;R>n`*Y9KuSiXqySnpy69?(7+hGtN{ z_n9VU~mQ1wV?388V3I0ey`2?^^7xmAA|18Wnd6U zU{LE{$G8SOcgEbw0P+_oeS+!+Q22oN)~{up0gmrw3?k~5Dsw=23#1O5Ew3$&jfWX}4vpnH+-#emW&&NK=$cPAsn%pHttKoNAM4jKMyy}TxS{tkxZlDEDL?-22bCq@aGC)Lr+x|MB@zh? zj-Ye|Pd9=LJZeE2B3Q%A4RnSfj_2BJzDG6G3u<} z$(XQyDdPc9n1I5c@h~{;90Re@!lXwcfx!+OCKDlfNzG6r1Z#LiGBEV7XFSorj`7U; zos2X3LHiv*_f@_-pt#`H`kjnA>z6W~frSIJGB_N-`?bK~fXG8S5(x}8p!@?mvlWzw)C@JI zU=0V*9kc5hm-O#sT(N!!UlHR8bJaGT-WGn#te+L62vuc6j`gM#2>vw?tzoPdi zsQt~rz$^*&|0$50!2X{JnrBCCyMW|CZFmsfdyW}A2fFqUgG4_rwY?1u{rwFMy=$3S z`e$^jtX;$)(fgix59nUB_3N2f`XwQDODiyd$E88x3o={HPy>5e4H}DK2ji9X z>lkPB9%caDonQl+w_AIY!32Dt6S?V(kAZRBIkYhT!Jq?AXQ2D}b~0Y*U(0v}6waXf zVf{MB3%ySnEa2h1gRuh~&g&Q$L3wWdPR0&!o?FUzrS}KKuZ%aq;S5e^;CXe)0?s9t zhM@gq4In-!ELC`!g<)-uCAx;-{ivXD0n4{EG%QgvWC63m^Lvo`eu;u1xGe`(2dY;= z^VJafE1*2JM9Gi~l-97wmq6t~_lZE-EU5ayYvz_H8S>%K-viYTy#p6~XByluJuS@O z_U#fSLm?dc_dxZFV39BAX<-7N+pOh17;OF{i)^}S3SkbZIwc>SCD-oK#xi9UeFq(S$gtq0wowh?sy zI+G9hd`{4roH*`LV_@h|UB7^F0;s2elxh;+ds1d+-C%- z2geb}{6&l{{WIHJKy7}AxCZ$AP5}qd`5g+XHX;QKW>Xkg*DnI?DF*EwVT8~5_4tAB zeKZm41MSmeU;ynq2HjNxI`0=`X8%%%T9DZww~09Xe-APTRQH0+6;ohX3o;wDw+y5P zVm|}uJYCS)og5&wkohA}A4U_o%?b4ns(T=IfbO=Kfz?o6>FdB|ALzV)B>Rxp zXMpuh3uG_?g_{_3odc3ulrv31YC!AeV0M7UT%c}~0NVjN57t2e+}8rB?eT|%Bj_AH z!H1B(9+KG~ki!L}9wDa%zNZH)20MFyX8Q~Vh6YtcI}tfPJ5+m|83aIbI*H)B)xdpG zCT0d{kp#&4a0YhJS;qnb3`r8o0uB%{CgujkJ_}Gkv3&-}FCh0YNr3OgF%fb2{~FXz z2h}+sb3t-2_lSV+8Rf4LP7WAazTvf_0V*4C}NQI6!N&RCpK?Ky9{l z1q=-9N*GwyWizO(%V7{%m%t#gE`dR2T`qX9P5~&*A)5)Ya|g1W70B`sI~ymcu%L`9 zfz#W%N8oY=+Go}Rmlj_tTjqemK!p{wkKhMre+%d?4U_fT8B0|77!tr` zSy#8px_1m5>)ta6^zUSB=>^@HB*Bodeg|XE+DHbT{?$z2Gg=LE7+3@w7%lqOF!}Va zWo!ZYU2*}VX#YCKIqMfNcBt=TSO9I4bb$P}egWf@^^2HXdLV6kllAKve@y(rVB7nI zLB?3}|HFkp8EktWL)usj%)w3!T=5JH+{uR+n={nbzGbkP`VKN?W_SZUX2!bo2ZLQt zB!f!-D#khDptBlQGyV`@VEE9#h_R!8HRBIPmjuPNSqu{E*D%iMU&}aQY6fT=z(ZA% zf#K2GTm}af_W%F;*D-XKD-lgp8f_c!9^x zeu%tc;OJk&IDvsfpn<_dKp8ZSz~CVOTEBD*#0JUrt_Jn}6hQYCg3d26=-q zO?^G10_ZLa_;}lDMhp0OTPk$CZJUBJ0|>K}Ffj0`fXCZF=i_3Gw;kDlWxVYq1G8~} z>VhmR<83(%(DAk?<^?$n3=6W+$J>s8$J>}0(8k;R!Q*7$GOm9o6X-mnfPO8|cw2%p zqc3>84Lr^!*#Nye1e8DP8k8BFBNQ3y3Y3}j!1^KM5;H-4N=SVMieG4X&VicewFN-= z0wxclLFdn``@tZv?g6O$Y@DDb$iTs*FacclgZd&cbCAm(SQ)F*qU{5c2blvZJD40g zRQuk8)_*|9*%+YXY>yNa`+kDQ*-V%X0utD+_rGE`X|JqiivX0gbVVc>nvb9+a2YG0y4Vz&HW4W{p9hK^atc z7)dZNgUT^b_%SmyfZHILWw|!;+Dver3|gxW8vjr$HmF$lnSlXR#;yAR9%r1O!po2V z3Xk=x7$>Y>%eZ9yD#iuivTbrhhhaA(gJ1%KJ4j#uI>rh8>ls^AZ$QdK$p;KJptcpb zpT2;x12VRwy$8AM1BDZ~?2BYzn7)chW&KXZAJdf?w5G3NQiJx@O&EP56qjo=Xn@RT zU}z9xyl_BKAb~+_{SL+nAV0(W3o;87&yYUa4oE*0seJ&F1E~S|6YM`wTG|OI=lZo6 zOhEo!_lkjG`Whyc>8qJQV=6xwyE7D*uVqr1dWb=*e=%c6{|?3tpt2t{j?K&j9&g>S zelcT*Nag=i%NH@J^{-;w(7%SU2Xux3s6JS~hH(ps?qA2)W0=dpB)EXVqkjjJPd~`* zI~iLTZ-C9{kye0)6{!CX3M(N79yLSlA6UZ*bSCv`CZ6@H7=QFSGl=xBWfEX00*{56 zfY(dlt_SuVU-~)qjjnPbjK-Gcc}S&DgPiC*uy$-2bQ6FJ%(w zU&puu999Pym_cE(ehuRu5Z%9%vB#L7K|$~VgPV#F15f`d#t9&En6)Al*RN*mkzBxF z4Nh0kuu?PBF~J&6pg!mhCYkl?7=QGF#(&l`DZs*sng4|1+M5gtAhSW?#263(38&R$ zh7&IXc1hVf3<4+KE7*jJ8 zRc|mbuHV7fv3@P%0danCI4Sh+WIO;0Ct(E!=KfVoKI_*o9s$w)YZ-eCy;(r{&#iwQ zlMg6=fX!J49#`m*e86CZ7ET3N!wEDdw2Dcie>D?m%n7uH$%N56LlHDKv|g71G$u0v zG$uq+zQdN5_!$_nRJqp>sK*$tY6P~Le%^J>GeyQK=TqOKw%`ffPonl7VFnAo&nMQ>lu3tZ!k0nGcd$~ z!)zzGJa1wA8KAg+6=RQN0!A3E!5T)ObI{i@vGng?0`=WZ)~{v!0m{2;*F(z4-VKm3 z15h~$9zO!5S?qNkJGia`jX`4zBW?!9b+4i6Xe~6qtz!@YhY{#(nH@|l{p*=P^FKeB z`N3ht(yt26BcSmPQ2Ert=o$eVL+n_;n(>0@4R9E7fa(fRc?qg3jQA1t1nB-*P}zuC zPw2b=)gz!X6C@9&7cou%oi)l3AfUMJ4TAvKU7r~k)-Phb06H6O{UXK*p!^G>*Y9M! z0t$1GK0|K~P&#!6*BedUp!wV$&{;O1a;nFdK?4+)>(?{(fYPhr0tWf@YZ-6!1Tbi< zU(a}F{RYMfJzk*keFg?W2he;vsO~1F9iaa zLeikH0)r&jJnZQYt*xaCUM~Q03p|XvyH!-U7#P>Rf}}(6JR%1bTX_sRU_XK4eFu|4|9U2neLtA_ zL3>7-40>A`Ec$mczUW^KuKQb7avZM%$FU4!9;Cbmr+o(oh4rf#KlB7J$gJPN_=Q0r zlVLq5EkrWNFfM3N1;;I@{ea#7XmP8DIo5+KZu1xYv%I0?IG_-Q6m^YZxrRq1q^cQ*D|i?31F~Uzlw29PXvPvgFwLnVFm^X z#sdwipmGdLyAR#}0T|^MDF4IqW ze`dp-<*ONI^d4bgP+!UjUW2Z}#*hHMQyz53B+^~g`0tfx0^MPKP<>7~`2H8rdRWjo zB%t-Mp#2u$JF7wG)%JIT%Mj4{njp6c!uCAQYyzK=hvX*-&^RG@%_w+nZqpRdnp}{) z3hV#>pmnq${UCYuy$s0vzz(X<2?OtcQQ!L?bjFJUXw0;~rQ^x^Jq#A>w=$Tl-@;(9 zelvs4`b`WP>p}O-f%bNQ?ws2Li93+m{+UfGJ<$7#!1nB6un=%ys82GVu z>2C+!S>A9)eItVpsGp{?RIf+nnBEky8=vce*4tayuop0Z<`hBm(xCNKpfyz{&lz~s zmoPk0U&;U;|6x)9-w_8nyWf!^9US)HJiq`Rb4Id1e*Geb8{oT)!0RoVDyA%joVl#h zq6fNP*8(&SfMail1!znaG_DUa59CG=-M^mUPX8VT3(&lF|4xQGHWD15a{`#wgU9k3 zCol*oz}LsGU&L?$wEo&gxZ%H9@&EreB32BH!XBW#Q5K9Q0jf5l{~6YJF)%QOCa8eI zaE%YBE^E>Ng`xe=6L2@AXu44j?zc+!?5=^|06Fe?#!4Tx2!e|T2an~i0i9m~={G~yP=ND3I9@>M zWFv!0|0V{F{>=j~L%`?%g7?jW(#gz*GwOT)JAn3Jf%dAa zgZ6AM)!PDcx5_a+(4GYaQ2GF+6Hxj9r4#if413gzDU54L8E^^ zcn@Yl{}Kk|F-QdgP#L?3VN3sdh8-#_3><48Fi7<8U;v*Nxt;+sz5wz!$Zik~+6%va z5yKi}w}R4%%2K@}AT=t-^v;0Ps7Nv}!q#u}FJaiyzm#DOD6C-XDL`k2fYgD_gzUvS z016WjA00!&C^!VP4iG$l)Y3I&je_9@Fneb66i~SVDlJn3)jngAqz?)%VYAo&s_= z17F1fu=z|D2SDyudCJtVemR4J>NAKRz;{Q2%EF}#3jLsS{8}11dX5=x>2K_s0x|>S z9|pDq2SEEML4E+a0py2%(3wDO4IK=uCmQ-&x+Z}1sH-wMp!kW+qd`>->L(=(KY{nh zfy{&WDewZ=Pkr4MpfHD()q)2Y>Ot=AX@ai7aA2qgg(GMT7etG!XDA2JJrR&O9dQN* z&`LLkDLWx!wZaMv`5^iJnN0^^cS3^skn^W9K>IiQ+q$OMus1ODoMd3=@nTS6R8~-& z(hWH;hA};XjnOAVMQ{NFcwBBx0|Nu-Y(tP4jE5@}mp))%=>eZm3OXb9gyM1q1~!#s z1`drxMg|du|F1#nRG1kVR5+L*=DRXzpqd}R#;__uMX&)hkHNqIHvcS07Xt(1;sV8` z2N+m-p!bL}K0cthoPmK2bcSM&D}x3z$eo=Gd?3|~>Je-Vs{>R79pL70^ng!SWnf@z z&QM&sfPn|i-FzT-gUw-9P@FQ8K@4OLv$_Wx!^#L1LD0Rv3}E*N^nho;85kIy6BL&= zFo^V^x=#$`K9D(#j};WB%wUiMo5OyBjbW#Uil72K+$4HVgJc*O7?T4OmpU-Wpt(;@ zC7D4%B;)@!kSfrf4xl{&pmGSrSGV*B-#-argVG;#tuOjnU`}Y zH{1Z4uLPZE#lQ+0=hb0`&Rv4`pGtt&n1jyKgx`f}2+pr95e(q_Qp6-6_aXO0LeiJW zO$KnjZt(=Ugn>b1C4Bv=x=Ip50BF35Asw`D`~Q0tCk77C-IgGgy z3;{hYh8t8om>N`C7y@(}83IA~Sc3HTN`goRP`?(Occ=0~-TxNqrasWY))faB&kHEF zMEq@1ar)Z;OV2IPJEFxbp>Fbp=oRyYyNM0vCWaJndVT_O6DVH#H!!gDgTj9k0}m*U z)c1n#_dTdS#|M1>ApP8*XN^d}?$fXYrCv7?PX8^-GMWGJ$O%!0z+bfs^Jd? zdC-};0t^gJYkn{=Oy9}C*1w8DfI-sfkSZsGf(b& zRI@d285lr&K}8xFOhA5~z77)a4186GRDUoithoU;j|CLkAh&_cTl12Ep??(v3+Rqx z2Ci5K2JW;&hW-rpAh+p01fTuRv-T{gz1PXWz<;0te1-|=6mu@m0}Pz;OrSm0qKORR zCOP2qe?=J^Bvkv?g71@JF8@%nTqsCdtMOAisdZkAZ=K0g{KjazJ^=pr65B_aXR9V+H{Q z(0C8@t`mOPIWU&sHZICJFrZQ~K|mF@Z)MF228QV?K_)XW7-})dgW{-vHH6Q=o$A2A zlXpmU9i%U`<{bmW^z{r({VNy*82AqzQkP^@Rl7?J78@CJ+sBGsqq=8y@!_1t9l>%5(t*23}D4-QU;HVZ-0R z(0k5Mfua8Z8{>@=D&h*@J3wUx8bSRI0acJ0pn4djUO)jLVM@28Lb^LluV3 z05(Rh2o=!;NZy61$F$!aeExw%1A{mNi$nuMiiC21Yu6VBW{CqTYzz{xGgU!ts)Y|2 z1bRT}4ODzFpHN({z`)T14KoI32gP1+PGn$UXoKFl=j@><)A0ZOS_K9Mko}+p1c@_u zNdLdT+W~Z!ENC4XM04(hss56jm@c!X0j3Kw;nC-|YZuqa(Wo z)HVUR2h>&vwR0KIHz@W=Ffgdx{QqAcbdTZz0aXD7hUx2fFere_PstMv4B&H2EWtMu zAfIE>zk)$Qg^@v!fy1v!6r`8+q{HO33`z{F2?q?<{by(F1D_?{vUoj%()5)K3dS1D z4-B>b$bI-|7VltCRAFRb1)Y5k^3xBgLc(+XN(Ru}yT&pO1{D!U22qfn{;qBp2G)WDyf#*?N|QJlWTvlXP-5V8Y%t_vKVX>q!=BMML3Q~W z1|=0fhRp&D3_{EJz-xJ37+6m_^uA|EG1g>$uzo#*!t@mk3X^v*C>e79k!REnP+h)? zL17XPcx?we15d>P#-9$Vi&roxsc0^PoSE2#3&IQya1G!b*GO7U7*8#C1 zZB20gHd_Ze+oro4vR)&bF#{yO9vWtoco}32Z~T8?xQ0QVaYlve;`I!Q%a=1KA=$yH zBFPYi&km40$PUo?G0P+wRM6s+m4PF&fq^^h5U8#ab!1?lzLPb=iOgkEw9_>)Hk^BF@ ze=|da`91dk4B|TusE9H!f%1+GWBq?n9tQ3IWP0DA2)Z++e-T58KqI8h0^TpRlp#fc zfgu~zhE(6l5V3wI1L!O<3H2QeA?lWyN5K12mN9_WU#c$$-|=c=;K2ksGe;b})@>0( z3h2HSkw69x@EtcZo0h1sF@W#31)bdoT5kzDr^m>PkwNS#1DBd61EYv10|!V?|IDT( zYN-s2=;}e~1f*WjfkDd1j|H?BJqDy+v=GG(CP%TR6ym&A|?j;b^Htr zAT^+QQWYkK|NV;?zQ3=Hba7*fD{PnR-GS-+fNPX7`H2KDs}4dC>!2R!}?Nsk-BXAR1%U(X<-zMP>& zeJKNE-Pke)f&L{79iaWE0u7KgSp6Fq!0XM#z-PRI$_K_=P`NKMfk7NJmIF!){Yw}o zsIW1xBE>7XUDZFM+XECfpn3*G3q$Xd>j#gcHU{)BWtafcqtapkI+q-*M}UDb6jZl> z{0GvbZW)QZ#?C;%fq_j$n1QK(5#)Xs6({ihKThixF+}w5Wa#K$$uLJ>kwHN~fq~72 zyMdusi@|_d8#1;bx&TzKgXV@9I{Mc$%+Wo_pdbQjdxGlt9}FgpCnMOHxlgDFgVwmM zVwfYqz-R>WYyT>SIUxI{x-i&);*kNoca1@bfoVcRuMYzclhXu62B8TD7$-?6_T(}! zfbuUW?}{#DU}Z>fP-S2dXkc&wuU8XfU=lbmk)J`Se(3u0Mu8s?a|A$VGCLZmfX;talVo5Ntz=+fa5PX6U|`q+G7ro?zyP}MQX@GaWF85O=jp^ zznCFKrI&$GB$uHL#1=Tfz^n$kKZSvTi7CNARfUa#4V14y^BbTrg_g&l`yD~|rFnqD z2~i!N!pNY+z#`WqkjTIZvJ<36g^@u`AQ9ZIml8+>x9g=vKzBhy?or7B`Aq=SM`2@N z1KpE_;%)}WxwLS1FK1}!@9XvexwrQm$VCjGa+?Fhg1NhY8KewSX)yrJsesD@vB?a) zAh-1IV5m`HG+;31Hee7;WZ(dc?Sz!Y;Pt2*7+M4v7>w6%WJmzXfyyO4MsOLx4=R^H z;|u+37&=s13=J3r0vZ^2G8!0qD-;>J1QbE{#rHl2xrBj%Q5lq{AY&S9oI!osrX`@V z4LJ@#DnWh$(K!8rDAz#e6oLH$$}=Fh^@Gm%UCz*s~02{LwxZflSl7p4E{c9K;m^cgA zdV3-3ff?6TsE9s*jv4M?umSZ$#2Fd5``0lz^zUSFP~&D`1g)uK%!HKXp!3;5asuFS zZ~;{iyMGab#nhwFGI|kc?IVLC1Cv4nLz99c1B=1|8@BrYCddB&XLtf$d(5EH!k{5? zo`HpdRic3*RRXl0SP0Zln-BqMuY3{jvkoZt+)cZq>Ph?#*$mytn16m$;~ zt3-nU149r<9%c^642Bd?TKfM?#fd=!q*g!yG=2>^BMWpVHY6=ZG%$1rC^F0xQ0(zx zVCV(!G6#)ggY;sgLkmz^2IVPG{H|XCxv!)jME7=k^e<(wfXzLF#_+-60j+02YC(Eb zS`1A<^F<&%Ab)|?%xsVVg<1a+28;e>3^t&22~xj)1*AM@Vz2=9*Fk6WDnR|g35r|L z8H9E=6pTMkfZE@DpmQ}r^8IT;abXC$FOY?iGk^^gr;J$%s-SvtjSmBh zDnA1wBt~o@3jl#&m4`ItCk+7DMp58kMDnCD3pHkJt9k==cJ< zYa6tetY4Xdp?@WVgGd4cGXrNJC~jLpaXWnxgM&dX!++5DjqXAQHUl39`Sq(AEEpTW z{noJcYZwf`{Z{z>+?L>WAIkmQD;ON6uVZjBlwh#eXJl{yjk|%)EeE-onE}Ji7uJLF zL5m@H4o+pMA?SQNh5i+gb^HCD9X~+n2z;-)GpJq0VBf!zAwb8GK?F4B3o>*4BJkZ) zIpBH5nQa9sY)n_zF9L@Hc#V$AQbW)lU4)q+^*tSbKxdOO=42@Lf@&}Z22GH;;PPuJ zgM<2d1`~D5un^GRD-{+77WHKe7V66x4A!rJ+-U?F2Ze<#=v+|H{Wa=48FY~5F&)$` z!@sC6Ww20R#$cenoWTUHcL{hd8SEa=J)R)F@cLmXg9A*RN{ithm>uBp)|Ctaps}E} z8lW|Q3@-hv7%U7jIT+SvF);M6W$@@<138y#?HbU!Nd}*O(D@ypGlD^Dbapa?fX?~? z#rJv(a5!>;;#&}Q&)6yka2vMQ8~*dg<+;Bi}!3?!YJLdHM(x~4F& zRvZA;4=Rid%%E{;*!_y)j0~(g3mF2YID_j=PMszO1rT2ValbkT%G$Z#t0nFf+&u0S1OWAp83}x*eu`Vz2|6ja5OAbu1}VweRI7gAxE0iydCf#Rb<72FO7w}BZP7#s{#8JH>> z7#~6EDI50s|0d7>|7YY^Q0xJpOu@h)@Pok^}g^b5e=!1w0=|Sd4CiH{O;$>hE(g)Sm3=B-1pfS4xLW~juiW4Fs zdWDrC`&=gYLi7qQhWK%UA4IR{VR%@?g6tMkg^bS&F)*+&9B2TQt>GYX5F6Cy6S?&N z1gH)ZVqgdaiG%E9%urASi7_w;2r)8MC{F#spu*sxp~xU{qJeQ{hGH-DPA3MwDkj4p z3@qXdkTXp{Ym!vh7&Jij#QIg>`ztg+VK!f%feSD?t1R%eNr2m=%6-s5n{!ZDhe9&meKuf$?C43ggcV)rEl!vY>f@wZ04tAazFi4Dt;8XBZd{9#CPH1k1~T zTiME1{!ZS@M8e2wbIZ%$iOP1z`(hF5km{8`~|reZGKoofPvWr zXtd+b|WZ^ zpz4^Q>rX<&92nSa1nd9zuLGZjD=T`Cfw_MLLyL;g|NkJ`h7nYeSE!g7{{Ii^)2?67 z;9)2UT8GMLW5~w@YU``_?*QGW0bci0qHY<2d@ha#ivxokxc|N$(jOG?XOIA&!85bl z1GG;El(zbpGV}<8!eR$Q2rO+eJ}^)P-HFW%PG3d_Aa{ep0F-9?moR|*7J)WK1>R>1 zG8?3B{W^vckh^RcnHZQE!To;q{&jG7R^V}G1xP>GojVyKK;s}LQxN|21ck!r<`U!vMPH;R?vi{`CwVHjFF` zj1R%#Fbl-*@9vt?zk?y7H;;jVK>{+r+T#qqLy%c;F}P32B9h3^4_3Q_p+kikd@nR3 zgG5==`kf3Rf`=Jc)~{p8QDJ0I6+Ot{4eG=7uV?7#pV93AIxBDTI))C=*buY+2}RHx zgyH%B%*+-Iil#pq3>NQX=m6E3{p%SbM0YTNXF{gz3;5Y(}WB1Q&`T!~`!Ql=nZ$Rba zQm{Y4Z3mDaLFq-9fuRx{*3j~(e;EUK|Gi3!5vZ@OA;7>;2$BbdlNcidhYA}5dw*Xi zLw|F}kKS_(5#SAU|>lrH6FJP!xzn-B09DX}- zgx^kvlK%A!EuefN`WRmCfW~y0!TDz?#BK2M9=m@yL1h9gKO*@D)Q1O$4_JODWUNH= zCW9r&e*z3l?4U9ioNl_irZDgyWMF4xFa-4v`ujS*^lxB@=*?$f=sm{(z9*hR;KYIT zI~YP3e+nqBU&qkW1KNkPk)cBLAOkM9|1M?d0o&7J z^aYgHKx#npHjE4fpuEG#D4`;dz?h@L3%X~F!9gUEVIEk`%%%mfJPXnf&c}NgG(hS= z>u5lF``f!NfX3|@7#vj9H!#GgdKvEM1(!Mu49px7iam)SlNcD*F)}dp zA`1Txf=mIOTMybp-?P*Zd`GtcXz$w!hL--ejt`)40+my00t}3dCnOYmDwx3M=L<71 z*f6njX!nBlB&}yCVb%~(Y;j>=>fgywBKm|ukwLQZ0O-5~kojVM46-2pluD+S7SQaM zWJLqR`2xk>n+y!?I~cl{RVoyj`N4g2b>mXy}hBplu7$mEi82Aes7|tR5%=n`~ zk)aQ)UK*^vwV`880#gIX{h<2_Kw=>K7~UUH1kIH)^C9$#K49Pj$-~3T1yTlr#xTKd zbzxuw$%DcKW+q4+BqpNpe=jKPKxt8cf#ED@ytg+A)V^X+5J_ZU?cc~y(7%zP0(7S{ zgP_L&5Fex$#Afh3pxDn0p4(@Hj{7l*Br1v=c*2aMKD;aD+=^vC2Ra%T~ zK=~M)_E$34fYX0Z*91_S2l*Y8wm^Odg{|s&h5#mh@OmNeo$sKq2KfiPrmd%I0%T2F zgR07Nh5&&F3^|}U0Of5^_<-^cC_X^yL18o{6;%E(Fo>x__NasI#Q}wp=nlwQMQ|8F z&+-t5j%9=V57H0wKZp&AJDC4L?OIS6fbtQ@O(1!Yn?UP^KyCt^M-7@^6=`J9(_>@^ z==En{U|>CP05k^DuJ^ZzVS$0Fm>z>VNRENk;sArYf?`iAG+itN*ZoW)3n6_WQ2b4) zfTT~+9}L1EyTEZMaH4@BvOtl6?Lb2>Xl-Z23B`UrkSqg(=sQS1VNEIn13WC;VewZ1 z8jE9E`jdeTi~EH@?gzO`L;*5yAi4yy78Fz-F$f$u04jId_5U`3Y!cIlge@oxKxTo$ z03;4F0~DW3?BF<@1Bz2v9D?Jjr)vVJFCwJKz|y~nAw*1pfd!O5Kx_d9h6qq!p|_HO z!H~~@fr0NZ6SHQ8;?f@sETA-I!^ptS$XKAlz;}j;nX^K1?N0^T`PpZ$z zz$T!;;0!VoJa!}jUo!??^@6-+tbHd#7lU9y!;+Z{Y`xHRc8u>1fWpaWy$}Nfs5}Fi zFJuWx>&yzEJJXsLfZBzi`URA}L1`VFzM*Lwq#jhyf@sE<1t7EJmmUJQv1CE(b3tW0 zs68Rh0EyfFo!~Nq1LOwL2T-wf3?-oU)sjB2K7NosP#A#B1m!c(IL>;|4O|>m4y+Fu zSixql1DnGF(gWgy)GnF9zy=Bj5E~S>$YOUGIT)3SX3rJ`(U6mdL+PO(n}e9 z)YmiUsPAAf0Qal*Fo61D9_x27h=9ha)R!`tfcih`%OH2UtAp;_L%nx971W0U%^fi~ zg4@3=3`|Z3`j;{|fcl*vH?cB8{kxRG2IOCmm;eI{3sVo8ANscn_3EE>| z1J(~|$NQ*TMj`K00m*~UO6*?_8BZ5@0Lhym^B5i|sDj)EN&_HwgT~H8K=m=+HjGM(aRx{qNI!U7j{(%j1kaE7U>P4!0GZX_18qNn zQ!@jDAZ+~!rrBqZ%w__$4Z(hejIkl#yL?c6juJTjA$NWWfab~+Y*-r@RFVx17+ee3 z7>`t_fcDI(L@+Rd%D^>g3=E)r&&+y)jakJ(MG!Q1;>o}Sm19|xz`(+&8o zM1!iPp#h_%f?`h>1A_`PgMy|b_$*vz2KIyo6>bKOHQfvhj5-;L0t}3tYZo&xK=c(r z^yw)mg6ayeKFE4aW(M{X4Jr~00&8Y4FfdvMfb#wCwV-|-D}%uFwG2!uOaA`{ts`dW zPGDi|El`1t--$H*|H06pp$ayisRClYzJX#7=tMK-0}Tu-z;iB4j1~%tj0_s80?rIv z49o!ypmX5Cep3avg~030*MLUV85r)aIRIMx7SO<`6#;U`&9$JM=*)1PfjOZ8VowId z9vuZmMqP+qps)p*$9MwCJkZJe3=Ahh=7H8dfaIa;Kbb`o7(_sKpXokiU;&MbtN!?Z zU!ReIT|j{W+(tx=2P^PiMdWw@jo}J3GJww;fy_67_q~AD#xV&rLfRvs`;I|&g4_&V zAIb!aHv>iRz5?i4QAS@4WtN2uObpBg4WN7@;LO0u2#q6L2HvtmjC~r48VeZ|MHE1GRWzuuGAMxU z(nr)k%&Zu8RYL4K(ZFa4j*n7Me26$h>J$NYhC&AR0MvNVl2BySO;GIZU|@jVJqL}K zG?0G;7#LF4WH2y@xHIsB(gG-a7?>exhk*&=Cq|H)x)~Vy!96tw2F47qyTYLQL)LUa z{L8=uO$%B`X#rHWuopBic7XM;FzQJtg4Bc4B&eSO-W9{Z!1w|z4@r9&;BkICkY7RW z0hKp4EDa2xe8%8%fQ^|ITn8|N=Rvds6xTX{?h#{P)Nll?7y17Kq=tbl!+~`n0}BIN zK|??2zC0cVg*7^cCaecRVh0X@#rPQ%*615rurq@1x@G~3Niry`u{5*+M3``76kT_YJ%)r9vlEKEf47`_y zMFq6Bo~fXLQLjRA?PCTGW|k9d%xaLbjDZQ1uQC+ZE@lAT-M}K^{Qn8aPH24!J@Zc1 z0a~B_0PiU{%Ap0?S0JFkkjAh;K$T&cgt9>%12Y4kgt9;agET{`f+BeQhP48`ew6Vk zbj+Qj{=X^5|No3XEEIcwg2L(4S_=p?jRlg-Q5nL`CCxk1fRo&+QZOoq1Xf3TifzKL9hWbj@|=W-~ROf4N+dW zx$G)W|KFJK4r(7CT-*R;A9$_p0tr=EA5@fyfm!A0{|y2R3?O|QCgel)A=a5F;nCLt z)z>kh0;*2}Zl4I6K5#k|WdfxYfd&RQ@Y)~_(Au5}l?*ZrYyu5pk_^mHaaNFCkerCi z|HCTJ|ATt*s-V3IsPQNb-v0=yb3pMpWndR*U~mV!PYmRS2@#O;PDldM zUYQUHnadE8gv7xF56E1G7zf<%f}py5f+vFv$Sg5V24<*v+%SKE&gK>AS)!yVEIkt9B6$C1H**((6EE{8C0DA{|B3q09khrN|zHVpy77|8h(`! zGX-u!!!HvWekZ}<_YbU}0UUn+L>&I_1n*s9fSLzyi%Fz_$~I7WrM~z70R|RmnT1%- z0^S=3T0_A213XU$UZ*V#x@Q1XcX%+csPHi;fZB|pa0acn1*PR47Y2q2t_(8$-3=WK zEV2#^%zlR$SOXeVvkeVEYr+}56BI%Fq!>?DC^NnVpH&79HvtBQXpsI1E>OR=GH|b7 z!e9Vuql0L)HahseE2zD`AbtHa8)W)H>Ou4HmhCr?+Vfzw>lZPA#*m#LYC&b^fdbqzluSDfd#VHN6-hf z)(G4t)`6JYv}8gmgKYm22Jl=VbbJ`R3lB8^268XBYyl17pv}MaFNNq)X)y+kmqPT+ z1ot5v`j;{osIW0GL;M6@8w`=}h4vxVf=p&$5L^IV4+!f+EQR#xR9Z|Fkk+s>g31=q zUO@G|kiAtP-H`sHSO8L**nuZacrgBOPz0@k1nGsPiC!*9c)`j60S3_6wt#9cHvhJ85rK|}!qyyt<9sQD zhdMOA;p$;(9TY(G!k`;-RYB<-G!G7%Z-C8(GyafJoKgvib8$rmS5O@GWI_BO>HwMh z1>HB?zm7o#vY*NC5U4Go`w-ODVPFRNL4W~rM>{y)XErTazmh=%&9&SN485TCASmsj_cfO?K>M*K zptV2Xv;{t^6SC$Aw7(XupDCgNPA5ovYSj1szX01;gV@I+pa`00QDJ1@WRN)5#L!@& z3K~0OR*+B?R%BpVzk@+Tg^__*B$2_Se+PpGDDQ*$4Gi224>VLo62Wal#_1~2&43N7mXEw+% z9MDizx9qb3sR!k!^_Xg-e74g(X&{h;&)&4&h%G8?u>Pv``e z@I8PTz7mQPDj1YN{Z6Fycqt%rCnPb*fc9vC+QzCJh6clZWFfYwQ^U&3I47FIUUaODA=%>dG)zLY@+8m>0j)QZ5* zl4_6vjU9pFis66)_)JNVJ>Y!4n88NCfq@I%Ot5*289?LDpg0BHEy2>i419;6Cdlm| zHmDo|liequVByst#>ly{3Fk-3CwErj?vab2|NME@eJ^OFrv#^(0X%_Uj-N#K`XLU zCvr2$PGn<{0j;+K?FUz3XW&`ChCyfgDh53U9=|40bq3G~BSU|GLkFloruyE{fbskR z#eOF6c(sBEX#bidcsz(%h2{T$hDZe#m6reiRTvo{a@hF=uuz506N1-Rg8k0Mzzm8@kQ@66*H5r=2Q z5qy61`c({|b6zAs=@42zD)g^nPyzWLR8N4?tpEeVdvN*yl~YUw4ajXr#`7AAJv+c* zz`K42gU*DV46@S~Gw3l$q&0~)g71a_t+VA7RAk@;yJIcnj!DoSE0K2$q5bO^bVSt| zfh{G98lW_T?gs$}1{;t+pkZs! zzm&lSRF{C-6YCd4>z9>~b9Uh205Yq;+XEC9Ab<9+1f93Y02=QT0J#lTzkuo-WHUhe z!SU8&0y+x}l)p4UX2A4=^n%V20F{ZNkTP3`Aq%{gm3jG220ezX2$kil8T9(sFzA5d zdo2$G1JYVs$Ql7edjuNarl9rL(D(-3&&$9F3P+F~pgZzJ-h=8?1_n_@22+sz{WC#n z_dtWXrJ(_{WQ1ZbX!k=xhPq}WgP?!{gO1_4|Nlk(AZ0O9TtN0s%xsVV#Q``jK=FVc zZc7;)z~K)KF98Pz32b2x3L{YX!_zkA{5QH^!E1|DT1-P=dIT64yg}uGs5*luI9-D7 zQDtOMfz}f&hTaUIeD_~4kwFve?=_$^l^IkSc=DP=7cwxLF#i89=m_dBFfdG62Whv6 z9%L{Bn>7OzMimX}5{3q#d8&RTaN0)A!=U`_4awi2_yXl|&|YZJn3(86@V;{$a6g^- z|Ns8=3_9R(PX40~3=-!KF>Ax~zN$zMX#F01j2oQyLFp4CjEK(vrVU781kV3pKkaA0 z()Qq911dMw_x_&&9s^-5XaLRAFdi*X1kHDV`h}n~jX-NU*Kc5uSigiJgYono71~sMs|JUziaA;r3 z;3VO|I1RMc7}Or^&1GPKwMT6@>;Ic-{{PSTRzeYUmJdThfU2MpV|)J&P`$|53Zf@Q zK>Cql5{%$IHd7;&Bv#K0gX37NwLxpBfe2Br4(3{K#6i|--s6oK|d8Qz~zWY$1&r#;A>A}Rl$ zsw`#D5SYkN%fMpLz;MJsk%7(N0K-`gMbKVzm17JG1oa@{26F?b?tp|3gQ&_928{_j z7!*LXm;`8hDCq1>28RjjAz>`|0MdtV-^t(v(gRxCp?R=@0Tgx&KMyFPg`E`0O+BDn z;Ti-~1(l&`1+(CveV0}I2?3PsR3E>gSh z9})IdOz;ESS0ToSWFK^ohcE-WeHDtD4`Kc*Py~%-BiZ)|hkdNzun`n!UBr*$LqbD?s|Fp!5I|5tD$7#jIb<-~dXO zATh@01&YhpF*x<_1f93fz_4Z~1A{2b{}(F9z-cfQY^R_@1EZjWB0Mc}I2?e@2{YV) z+P?s6`Va)A!wKu4d4rFE7sLnK4^4l}>IW2;?_hB1Uk|n4A2GMia85%Jq#jTD1DPK% zArfl7B-s1_u=zV6>6@9oLUH+e1}D(o7?6M0_%Sem=J`QvhMQpX0|=O3F(CqKz699( z3b6U>A?9O*UnBzqa@eRWVWPl1ytXul-Hd}f$B7!7hKXntA5`TqsbT%`&VRbm}h|61fVfu z^}YW)7(i`;_Y4f6HUYRju%7`kmbrmJWc?C`3dZvRiW8j}WEmDTfaW*AXL(JGfP^`? zZ2&HhS@=O=465fr_DqaqkOR$quiwd#vVIXm3aE|HzXYj`u!;dZcGAC!p#)KfFoVnB ziQbTS7ENGK0_mCP1F=iAfk6($@AU<@)mRyL>zYI#GDxgn%Mb!em!P%?XdV=8e*w7N z3|dzWau;YE2}Gms9|x`ff~HB(d75B70u0QzK5Fr ztYKglY+#UNY_?EjV9sb@Tnri`%Qyg=(_vhxpa_~T2kjRTSO;1A4_c2fkslIYf{!3= zgNYK5_!5Vk|bUK<90P&Z_{`zhJX?A!Z3Kg1U(hYStl$dI1JzbC6jK z0ua3*eIk$kZ&7JsSTIqNK^C;;&W7<1c+ZQmHiJB9{FU+H0TpJR3{}v6mWh%Ka-cmj zpmk`B3oBG0YK|~~`k;(I5>!F^&_MlAP2TBBxr1`3AE=KyiXEZKY;U9e>Zd-J{zQ)0d)2{dS4K% zN2SFKw0;<@M}UFpJ18%L&Y$aF%8&wDA39NjLAHGjLzu`81`p8OooFM2n}#F!&MOy{ z=KnV) zgZvKaZ-M*^nwRKb%8-CGFTn}&1-x!s1zGE^(qa|@(*u$Rtr-Tbkz|krms#wfJq?q0 zfY!J&Fc|avXEyC+5D{QtU|YPFA!PD8h`8a+|IFsv3<8T+GlcZ7X9xk6VQWG6Fo8pa z0o3?M2{%yOf!wRoVpajN8)UBl1Jg=SxCt;YEeEBai98Il{c9OgL>nOMLnrcq%hUwX zb)fa38sPCMkl#V(fcy_Lr++3S&OmcOAajKkFy>BRaR$0K8tg&=2Bt2k-QfHWn%C%G z54sPWAp{n8qCXfcp>b!y@Cntc?D##t6IuS%;3I78iw}avgB##LHxF*p= z21xjW*BCP}82|1}IDlh;DSf8Bp()0+$ei$VK3L2=OE?XlLI0kppZWF!OV zyaW&fW;as!KLObdk`rKH@`Q$gJ1G2-%H42yxx0gbS(t%Al$jY+?j|%aHYX@D@Fc*? zMaE7A#hzXU25`B%7835DJU3w`Bz=qCgq2N9dLTPQp8fvJJjnFv1HlM!?lK0`?RB8D(f+Jddk5ODGhhm91e20htFKi{hBP9wT4Nfb;umh7gb(*i1+|lvoT&gJAm&*ZqI6cpXD1D7>bx zVF+R1u5>W`0UD?OBhSoRpt>BiH*6O^8NPx8j5opO3WMgE zvqcj@>qsP2L3@2b^F@LWA^nOeJ>YUZOSBO>4hX3a*u@zcRKaeB%yom#2ukP&?UA%> zd$E2o17zYD2sFQ$5`tpn3{v{uEbQ1J{vgX{`q2cCf$pFhJ`Oh98i$ z#_$c4MnH83sO`Oe2SdO_76v)w^aX0Gfb_3l!T_5K2DekddsQ7k>)0D))WLHkeHL)F z&@k#>!2nh(;s9xjf$Zo9rPZYj3E=d*f&qNS9Vi`x@&QaeiDrY&KlKq{U^oo&OaD61 zT5bl0_3Ib{p!RvFTh9G}?lw^05N@9{L{Bd-cuX+>6qnO?GK3h;V30S~{v!{H2T(bs z!p$IWc=rDTX5JI3)7LVDF(xG_gUT!hp27yh8|()RcmA+vmITLJ*yQyL;VQfgOong% zA6UGGA-sPbL&#EI29>p-{frUd{uT>^1hnql0WPy3<Fob~GSKziN z;%pyWX=ec_4$#uh2~galrJYPr+QAmKpfN0v8L+SwaAwfzU&7!a;J~2HkQAW|4&U_* zi12;GAP?Fbx*X*Hbqt{l+?5TW@MY{hp*npHLl`J*4d1aJFzo$d&v^EP>hhfoVUu?- zgoFHK%>Dns;?)e{pmv-J4+GOu9tM@Q{NR0wAm@ViHKVlUKxrD}7nK(CHy}5H6bUde zn1TJW1iY_UhM_@09h6o;{s5^3r5TV~B>$*0Fhw>H@`qtQ`vH(YrmtfN1Np`9%ny6U zHyNrR|14k25H@)yLpW$ngt5i{1LoWeOkjVkV+c{P!(ly0-yQ}9P#d>@IYSCaKgchjxnwni|No^J7{ye08JKLi>i?U1{r|7R z!yu@__W!@gGf2Nsqz&$FUXZ(){&2x$CGaO-7h)`8yVqjzl1dk_Vg8I2kN(st_Gr;Xyab_k1MFyr5 z4anmj;Bkax21Y?Y#5lr)^^kHGHjXf12PCc#;|L5FKyDH_3>`-(Wbk8PHfUft44tO{ z?T4BPZYM7gjbva}X$G%h;{nm2@q-ELpyosS{S($h%olwG3sVO0I16~sT!MhAC}=%2 zcx;P-SEZRD0CZ*(XxG3$ zY|ajdTZEaR=In%+1KMk@(hP1VPX+lE#0Ia02f4=&q82uGFTlXS18Vbv%>#vK+5`*{5d28YQz865g|Ft`}&{bx2k&)@?(Cxbz< z?9lX`3{HzdW8!?34aRyu?E7~z=otQBKfuga0qQd|g4z$DaqY=FAp13q`Tid^Jr53R zw#DlioG0&uid+0YY|h7^uy`GV^W=35&Z?FFKNwpuFdLr#|A(3X1gLy*p0JKVX8L*t z2a$ISY@qSG{>6~9*d`=_^Aej%(Ga{3FjS32p~FOsQZ{ z0gdIWOET1e+GwEtjG+EJ1A_)=Zx8aBlHj=%P`M0>OQgO$N?il0TR`QiN{a<(EsX-` z%sE7x*aDoNLHa@E0f-i0V9)@SYa-CR1uowXSg3;5?Fc-B%$dT{IP9Kca6Ez1*bhkD zPS^=uoBERhysn$!fQ70+8&oee{R;F!+P$#!E6@+sy926s228Jls+z$6|6&aPz~|F~ z;vae@7Rp#Rq(-0Ce6HYefU2et}{y?4A=gaM@@Ja<9Mx1}=?raI|D~X1EX$*V(&YUDGUsZ$H3~qJ6-yhF!+Gav1So# z0`(slSPp{AXHXwhSP_~oKH;z=Y6u@BfVTn;8^9_Y1Gz#-Ou)D}%=REuiuE1)y`S zY}W5%uvou`!DRh*27~pR7-ZIOWRL)zJ-&Vc=xmt{s_I)AQq+nK75Z8r>#o zgU&RozpyT!fu(N-XkGLN@S44K6$~8HCW6=GnMf%x3NZ-oXkhxdLy@oMgZIq- zUcZVVN5FyMCn(%O^DUEn7?f0a|Nj?l0EGhs!@6AX*o5}FTn2_o{*b#nM4|I?eW0__ zW;U$=m2aT(4ipEV`xZqUAY(e9b___3I_mj9pmn0+3=R#D^MRH!FsNH5oB^Ff2|7cI zslfv5Z|E6rCL#{d^FU`dfX5cpEz@;Cc7e{U1la{TlMLi`6*+KU;<(y121bybpfmwG zCjfM=u=+9vaNiK@zI6;KAbp_qPr45o>;x1bWdV5J1AZri)fJGL$agXbFfhcgU%=1- z>JNanDS`9%yV zpuK(u5e)Xi43M?4!i?bly^1g+Xy_Ka{uR6)1nd?CP&=^)eC{ohT_#|&W;Q_G()kAz zW=QfnsPg?Y(BxGh^4%=$D;UxyTY_{lFlZ}+_b!6#Qc(ub{R#}AJMN%%tOxgTK`NpC z6$YEp+0D|wiXjEG*VxdT!Cn($2KYV_!2||o@EC3)WNZ@QpY(7kCLZ$M{)fbJRS1+U9wWME+OVlvcX zJRs@_O|#wIKK(u2KA>}fLF-R@dl*>OuV&}~ooBgz4MR`=I)KiW zP<=1M3`o8Iv3TDY0d+D-b~XDka-|?s4TSrtsw^AC)j7n z06KAnfk85)fz^>A51cn=Hpr+5fcC;~0pHmOGIN>=q&${rVDM29V$kT*hLpLCMc{ib zKuQ?I7DL+UJszNC=nM>kVhntY3=*n>;tb57^GrqR7{Ixze`fQR9#;mI9yiE6g{mz7 zpMvra$PNJp21C&K5JC+M;1erA;lRMKKo#x$H4~^>HIUi~KG3y24bZloFQm+d&v(Gj zkwUrS%LFuE3UatW0s}Xw{R*-RRFAG-%)rp&#vr0@S>OXY#{?8+puR20jZ8^1KxH^I z|8E7K-2>7Kat}-%8UCLH=>v!P1_qh_jSLF?n;2C3H#2DTZ(-2s-^yUn zzYTtGrUOVVI);S(Lmg1qL(kfk5Kv$c2G`$>4LJ;a1q}>(9Ev@9cHlCM@lJsvBXpk^ zsEh)&9YJkX6-EXQ=)EzV`0kBiU=eEqo#_uUAJi5WaAXiL=wq-K0N=GHpb9lhLI83n zjU?!978OPY(0nkc{sPSbvw+mY?e1f+2k&nK?Zbxd2L!nZ)QckTR+N5Cf0k0R{^dK?cVD=?yvH zvf7k$Oo3`FyV`N}v5Kw4V1JR5M%@DUSFsKPI zurLX7Xo33gA`1V%g2Dhx{}_6A%RTV^PxZb3cdXyf;Ie)XgTwmm3^wbxF<4-`lX(3G z28Esp3<3-dJ5<&9{{PfH$RIADz-Z2}z(N(=Mun$+dvM-CPWyfD8CX=985sK;yCWF# z52!In9MJBc()DD41vq?<^gU%@>4V>G48D8VL4bkLq<=qy3rJo6%+?cqPZ(JGo-&B^ zwJ|Wj{M+}KL85;T^gQYW@VT^%Dy*P;cw3La%mbZq+4qw{0HjWZkwHpakx>q8Zew?h z00X1c0tE)9zLyLlea{#;`kphetY66>(D#agr+;Si7Zn!JxCG?vyY;IWK;yk2ckzMr zgWdd$fn)sw27$iU5cQxk5k6P78m^uRq#jhC!t{XLuLh}4L1*av0?GHiVPNTd#2_Nr z02-(4Q0<@A^#<(sNnH;Z99F2R2!qCNA^uWfh1_ERN{@X_3=Dl|85kIX86^8aXQYG9 zJ6Knt*!u*0UbF+q|DgS03=9rJ3>n~irNHM!GRy#-?F3mf(Lb}Tg^^i7v5%dB0puT$ z`&3#OSo%5{82Ta^7#NKiBthZFzz`tBtQDcSHi?0uua|+L4|IzY?}-LxUGP0w4Gg>m z4WK*+;xqPDfX=OK0J(!%vO%$rn}K1{Dh39|lnlj%s~8yi`k?y3=ORPy8UW=dRSO2j zH4zL9eLopk)V4A(GFgJ$2|43VfPrB>D6GKYG80Q!d<36Q=pd!QuoSEg6o!+!9)Q9Q z98RZ^!zrMFF)Kr{7j%ak8v`Rs81X^+m<)X&y9tC*KLZ1(?a%lb7DgUIjGYG**E2CN z^mQ{Z^npgBLE}B$3CavS2@MR~0S$eA3=E9j3Che`8K89$4Ino#o&m=VL*Gl#ITaC# z3o{uQ`nsU{xiT7KYwz zJ2Rz!W@`*+ePG`c1|C@2>wC^1qQc3*xPB!A_`Z73T}Ys~g`V5x(%;<;)(7evpzB+| z0IFv-BtL=nvw-aGpV^(#_liLTG{=o(4-e#Q-_``sz0aUD1-b_XYL_iUU(1TVCk!Gm zJs>sUGHVa`Y$sonfN4-! zhU2d8{%s5v{o5IAKy|SCUIyrS$~TTc>x2uSy~O?Npy$;?>R`yZ%3ByzV0{-@z1w>f zw&&YMpnpB&tm@v6ptgR4s*nPMq>2awfB)o$oc>7-Icmi=7HUB@27TaixG|ug6`~j1 z*W1IO0csy0@X_AiKFa5L3mP*~u} z;AYy-AYiQdfBym>1~=2!3>=2K4EGoKGq^4AWN`0q?wYf}o55{?FN3>b4#Pjgbqw#< zI504*abRFsnK8v&4bHZixef z#}Wqy7m)c2{21JqI57CFabO5oKH#(^PZjRQl>8V801(3}luE>iUe10(zn@e0^D z_q7DDA3GuUB&%u~bM&e*Fu?pOuz+Fv`Xvks{cYV2{e9gvpgW#Ha|@txamMopl$p60 zq(q_fg$(SVv7rC|MI9MfY#19D#2KMu_H3Yi6DNe0>}0S3=f9cF6Q<^X)~PcvsP-~2 zGOhycB~uUrg)2CI_Ap3*%m{6D1|DXm2u0Og1{KCf2NZh~85mTv8F9E(VO`Hk7(}yAL|+a z{{g8{NoHUKt5IcO0NqIfGn=6q+&=`L(9_@64L%R6=NQP93=A3v!Rs>RptKCA9O>`q zZs~9D?f{i{;PqO`42+CNz~wf$&IO%Y%8stvkRmLbdR`73j+ttZ6JI4dm1`=KzEn+HgqsPIia`)be3X|u}FVg_lzZL z80vZOhHn^0x{>n0b_m!4#S)Ozk|#H$;131Z~&AR zz-_)IpgAPuI0uC)D9%ANIL^VlmKhk9qva9St3z`&-s18FPU06f8f1 z?1hvWmjyui3AwxwSiqnPI)kUDi9rCAE(9DvZAu0P&^gT@eFEzs?(cDel%paJ|G{J4 zpmGOvUpdGx>z6Tr&I|;dWdJ_MV~r~VL(h4Ld29R`Sk@e35CEwMnFmr2qWhPE&pv>t zcVl4a*#Rkc*F-R|tXae$g6@7$*$2`G@y8`t|L+2F) z0W`c8tl!UIvL18~-&O{l^;;M;!1r=&Vo-qfht@A)NSHE}!45P|BenoE2fP4u7DE-N z@7nu=fk$g00~4rkDWbrjynY8mgpF|hf3xEM|J4N;G}JdSg!F-D8yFabk|6aC=>EYz z7f@P+%#*>xZ4ZNihyx^@LgiP0`rl~stf2b}Cvh`??m(3lMcn-r267Lm9V=$~|1qdv z2y%y3BY1q88RQ-T1_sD^HES3W)D|%?PHkbZVPKMIfZm%Y20C}De=S1<=f$LDthl@6!XxLC=nQ4{`^CXhj3)Y=6eDkTb~` z&kHC{aent<5n0v@B8fY|2(9-|R!U|?2Z2A`J$J|_co{wZiZ0mv_)dy7HqM^%`> z=XHCEK=1PuU|;~9SHlXuqYFIG+rNoHp?@=jO8*uHjsC3+I?yzg07<*&VdKA`eyt5? z{DPSA3hlj?7>|n5&($8SivxR|&@dxOBtP>5)Dxf_s3J1XXY{3lhToB0r z(@rqhfyM+hLG_)(3RMvW1_{u(Ea+@g6&D5#P~0&jM5r<}B&e!nF{ps*8&I9Jwh>Y% zsrE4NtZjtWNm>7YtZjtUNuahDNX@jf40a$hn0P_^TmQcWt%IJH#9*T$#K0)wz~H4e zkwL>oy#Bx0_y3@=X;~E!28}-Os4N46*gHtyr4M@Viuid3E0CL+L>MHQ6arM$G(mUM z91vpKaY7L!-s{M~pz6iIvtE&bq1W;M4|Pir`~Qz#$NzssJ^%k$ulWBDNDatsAT=O& z2rw|HsRc1GLd+~sRnrBT86m{9T0oJ(p+dFyAOnNyIR>7!4;dJG5B~q5`X0po|D*Td z|39K<|NmI~@c$o>8j$@UHPb2>>_BX>2uS;3*#!o>9uG*_D98XE$7$?#=%3ko1=QvS z<;yju;Jz++oE79Iko!Pxg5CqUN6nByqkm%e0+6|V;GOm0v0P3yuK)ib_dhl5U^)O9 zKT=t01G<9(Y!*m<*(nB_bypd9`oN>&3=F~wP&dHFdJ+0SdlbO>`e%0R=wAYvYX{j0 z9&_BoV1jcV19O}g+6Opu09ro6%i$?~3^qMI3_ReobQmI3B@Zx2f!ZFRv(Wn6x|e{? zLsM;K&`{xGkOJLtyyhqaL(h5!28IO!s-pameA=@FlzkZ(1XV!gC9cebk}}49+0CraWP=0i7|zzyiw`Cl08qfYy69PguVkQWt>E z*8$C&_b+EK0Of-v>#k~zV|1+CvLC(`%u!@0U z!fLR%pJ5JouMPN4xCLv$Z8?xRzM%U;On)#)fX&&#z%XGa1E?G|GuHV3z?2iRhjYP7 z2F3}iz~ZKc-v1wf)vjh>oUjHgW@Fg<|AFZ`sM>W5j1$&_#jOp0K-KPGU+q!vAw3(wZF!Ap{0w$|Yz#b%j~OIE>l;CLo`Kf-F@Wwx z0QUhKWY(`>u$aclV5e?*J%mvi)XonOVmK9{I5mYq1(b%?FJtfkjdk`f1Fb7(^Z}h^ zvwjf+XiV1zR1bsNccA-9)Gey9m!4u!na0ClH_d{L zabX67>@;2myJ`9ib|Cvf<82J53KS=vVUPod6T=B1hR6eoi+LF2`ayTeu4Hfkjo+{3 zWMIHD&KoeLjlrg;iGfGr00XFhq5-@63zQ#KI2oi=I2a_M>lQUc-htYO0;-^PDkyCV zLiaj~Dlu??&fM(j2gx%qh^&X4%L$5ekli3T&{>>F?Ty!fP{gWC% zcX-+K1sSv8ZAT&25ls+sVBD~N0Yi_CT>bz4DcuXq@BRPZ2fF{evD*POUbM!Lfnk~} zwC}!vL6Bj=22}^AJk_uea!PWnfXaJRbnE z2Ri;{(g!|MoiPezCgU{79y%tS6^eapA#N32z+ecHo3;qNUkEgp$OW2P1eI&p%oAW> zPzIR^QX}BVzzMczW`hi}+GP%q_N)K{g9J!ze_!_skR202md=6i9&BGie2b?4*^D^~;Q$5^6fh;JW`hL&6NzNvoji7#tWbgUsn$4H^e! zU=U4U0NvujFli0sJ{Z9U2GDE+L!U2nuA8@}f%PE+c=V`$MmKnF8fgs(=%jZBtZ5B2 zCKv=>H^&xk2_RQu9pgana1H~aIZ2DI*EC7Yynm`7YHC_x1{Yw}Ys9RnD-@6KO3rLNQ zBlxZk@SU#Ub`BG4pS}aQJVM^54;qsP*(KP(z}df+VF8kx_JHgK$$`uS(`y;PZT6|_ z8SHvN`}5K31`P%gklWU+U=V@0>lQqIL1uvBSb%}S4^&k_s1n*A+&C7t+`UpBe`vTBChbk>L@U=J~^FV$OU|`UL z+OGrRgUs$<3JODLn*+3m3)DAQ0tsi38su~ennMDa1-g3z1i2sGE){VGMo{>J)T7@wq0(Xtp8E!w1Cj^PLJADrObP<3pm>7aV=TI!0XmY> zpo%nR^#i0v2zqXG|2jy#i5~b5-VraPz`(%-x{GXP$BsTh2JrocpuQW(9x;Xgzd&+g z4;d^_k`IGBgK!{&p*MqoVekLc&Fo4zvz}yAW52|ZHc8M|k{|@FO=0-k%%mA4M5(l0A z-Va){w}fE=sQ=N^2?>++D;XyAuVMh*Wo#nq@c$?1esz#KkRHJX25xXa5_EUt%#IyB zy-+=C8G69?27=c^fc5l%)nS?6=-i8HtV-DSggmf&Iq&?2~;1fU&j!mB9WW0eg|mJP`6C~N`{zzO9loN z9;+F`3JmP3T3fYaRi zH4HKR6B{}}>iZ0h!DWk(0^?%vT;jZj4$zt=^?Sw~eV{fg$gD*S6Q(Ic>RN#W#wj3u z4CM@xeY&7^aT6eWsz7t)Um*3VPy=H(NR0sK95ROn)oBt8ZXiB`#OXuA3XpMIQ2GL; zU3E)n+Y5B(#~ub75eG=!F^z-42GrJM@|d6qYZHnwFo4%lF)&O3&A|zQ()%<{1{+YD zlgV>}B5NW+vsppz=mVeR$iN`R@E^SYL5P7d9wZK4iw;_6KMB-VhqM=_=`q-W{Ka+j` z70`MED@g`#eFFwYAqECE6&421NgfPxlRP172^l#X)bs?v>pM1p`UGnf7#R9M_e(c+ z*Yx*w{aB*~8awaa0-8Hopaf?3fYwQa*nQp%JpGN`J3w=$Yd~|dJ`585joo`B4=@OV z=dowD$*Ax$c&uLwS+}FY0zUWCMune&aZx{mZU4-c22foEaw9Y7u2VK}pAd8p5%{jH z{+TTWp!yLc2U;%y@*ilObN`I)4gE8_!FOze(p8ps6H2a04*<}^J8KUA@gIR zj!20h_NU^QMHeO5fpC>42XHLX}aKbR5p?e7$nyzF@VNTHPo6J zH2U-zco-5qR8=ydb6$!J462%-c`gQqUPYuiFU9|VL^YsuUW(wgLf|>CXxw1A{6DXdIA%p%*l60~-@${QpN(0y-wh z2yr8*-7He@|0QT_P|b^hQ80iZ7R63&2Ae(|1|A0Pf(B3=FrJ3m*_WZnsB}P4ogZZ9 z3HVsidPN2X&{z>{Y!fzC1RC1}jTM2`P=VBd;t^yXXs=G676T7sH>CZ|sN|r?=u@D` zcqjwxpI*>qJ|Mp=WYFkkWKe*OLG>~+sDS;lkU<5c29!=fV^9cl0~-1)8F(1I0~8s! z0uC@LRVXrRB`7jB6)38{U{L9O$PfS?D?P{%(EE_V13ZR$kinz(A%lI0v()gW_5S29aq>p!3v>MHqq-6hU_wF0){; z6JTJ_UIt1-29S1@7z5<|K~R|s@+aEdo(*WO9JB_1{UHX(dVlcx(W?s}?tq5mpq-^UpSkeMKJKzSZiW~{%;z_2caK?HPX>#{Hg zm35GNRwsbW6;t?^45GpH5T3QA{o5HV`u9Q3+*jYrumDo;Zo31mcTW(U16#^qvwj(a zL(fD85rzhEUBU}$ulIp(W&qDAg7;sE`9b<*0-*MoLxU>P8V&H8Kr!ffr~MP4b*TWP zF70E2gu9Rvq%H%6ZI2T~Ow8&3ACMo#7#KKJ*jPNl?NIO-cw2!=i!J!R1C^z=7X5o5 zcdO!vGXv0CcwBPpL>M^MO=95a^Jm}yt$ADH&%n_a!N9W4iGgF?3ZxDZ-2m=F1pIE~GhfE2eJ>3$jeZCMg z)~#g_Sm(eX(6<4?7h-^{j|YwA^aN6a7UMpMw;p%SVPH-griHbD0U!Nw-QYpV^w?P}22+XB#e`VcvgIUu{? zat>JJ8X#v@Frn+)0j}Q+){B7eYXq+$T@RYq+0S4Cn&Sh{^?~O6Ky!Z^8Dv1`8$!pf zEFk%4^Au=4x&hixzaDhYA#_}ALO+8WXdKP-2ZIA>tXYVGL3qIo1~=y=5S@7-*s2l*P1C1+!XjuHh+IRg;kbI=#WGv7FT1&>jz_1R~=Go7n z0xDZT=P)9<7dj5O3B3Owc2{3dvN5=ICy)S%pEXGgETA#<9&pLRz#x(Ui679K1dzYi zC>irW{Jm)o$lv{a-5NIh`X4~!G^XzvKx?gqZ6p}@`JYutjS-ylDF?$r70wSJ z_b{x9WMBc^leQ+4fd%9b(`^3#Yq}U1)^szl^!IfA0L2OHY!*rA{u1zcc?=8;rt26S zK@jeglJujadEv{&^j5`logW z^iS#bF}wEvzlu16?D_=^DeD(7WUODnkh6XPL&W+83^Aa6MC%tY_^e;R5U_p$LkMV& zl7XQ^Rll}uNfyO{V?iYK{0PdsoL@=;` z);p}BG%%kGQ0xt0U;ynkWDtmA5=>yI zW=sI(>*hJ@7c-QA_R)aTcLHS1yAc!P0Rac_Sx*fDj-a+b_%470ki7+r3<8b}p!4BD z=e_v!FJkBrQUDF1GcfcoVwlsvm;rQm_mcjl3^o1BAp5@<7HOz595zs8Tv7mix?RC7K7Kf zM8NbiJho6}W;&q?a}!7p$loA0f!qfQtNz6dJ^d>fQu^00WWe<~c&IZZWT=Ds`iz_b zDxf@ptE<@uVL_6zk?w}E$IIZEl2SF1n`-e(~=m#^Xmc*41x?y9-wwQ z52KQYA_J$#0cK4J#hwgEeId%gzy;bLIVA}^Hp>Z#f9Spy_W%FaFNcIZNDU}muFGOj z>0iwNwqsp3_?`{WDg6xVau{^_*D`>2>#WOVkmz5>0G@eSm&YIjIy(leH=jYFe+OjW z`nn1RgZ`bMecKES>na&c`d2a}fYoF&So9S`+ad}7!FOSkH_ov(2bA|gcY~|%{r^H` zsWA`a%x3{rfdmFmkX=1_pfwEOGmJp@$AkByuV2r=(o+Gs17iIS29BN-NSYLAfSzFv zy5q5u!JwCuL8T{~!Gu{eKy^(PgF#OZ_zrrD-d@N!F=K9l>Y6+Tlb#tMn;01SIUr^- zzBr+}rjo&;rv)-!Bhv8yHAqEI7K21jCWAo_XicL-f_hIrgAAiigbL&80@a=h29us# z1_j0k4(dHQ3>H0E3>rQ83_5G_7*v=!PN*<0h)`$jE>K~N^iXAdcR+PbCWFSB3I?72 z6$}hLSr9*pazW~w{+$dg{c9OG#5EypN5LJC{wb(G-;)e=Q^J4nY1kqT|2Ko&1}an4 z_cBO8%G5O?pm0^+`~LuVKN|90^KFQ|=;-T}d!~Z>{|@~#n~#9z_dsP4Xg$X?W^jAJ zL?VG98?@F1UfxdZngK3rMHn>HHZy3bh%++u|(gOHdoK=|`UmWV{ZlhXpiF z2-Twx($kN$-x9Rf5@bG;1GsMmGg}p;uE!H>Hh5fojV1#F)C@V0+$3%WcM#t+hd}`} zf3t{(!F^gTIR731?ag35SE1PZ2;>3=1_q`>OvaLo2ZVk?;v054do(#0J^PP{g67HU(V1%u_37(CF{!0=o@XA1~u!Z~^Djec(0j zpgne=y>_5Icc8s@pgnk?y?7G+8z5^QKzEWs($mT#u=E7lGY?*exD>okNn-sH1_#jj z3b1u~pz{^_*MskrmJoda*^#uiY4?%-B@7Orz2p6B7)*o}7^G|% z9YAw0;PWz&{3(Gnhb+dxAOP9}*U>+-=|E45G0GZK0qAg_z z(#ZGmP6wZA&cI+0$siBPpUesZsvx(6*r4!$gzXAg`{w{?pD4qD8K8Y;koA{a72pnK=TMt@y%~IC{I)_8>A%hKQU!Dph1FPUe@VTdKf)5$Y zL1+01K4bu$`79#%kil4mkwH}OA%md`BZHXWLk4{nMh0=ghYY%)FcI-*knZ2fU^9IO zWKP&vl0jZrfkDlflR;jy1AK`1Dw$N;*lSXfXIyyss? zR1wk_>|X^|%fY}E*}%Y^c1W}lT29Vv0;N3%P&!dx#^3_#?|{O!e^S?z{wZB=Kzn;Y zd!rcm4m2?C0I&T9Ni(Q|@|mPZGXrNp19%<{bnX;LhC4x9umL*f+`wQBZktW)`qJOg z^`#FyyUW1P%g4Y1TARYe2i}jwqr%1@(cjYb1+;GqwD%c#&lcD{4jrl>{UGDlg7zVS z_EYtO4&@POV34Q)oz<+&xc-DV8i$ybO$;w19uq%PdSPc$WDMnDZq3wkO?SliwHE16l zXrC9Tu3_NGXkc8Eq0GRGph4lzcow?v%aehj4|KOO=ZOYpO~~Fj7|r+-vKOv@6@vqV zU_wKGZ}$ntoC3wQrx+L}u4P~Vop~t=S{K2Ok zLa|>BH0IU(1=JtwUk>hDfX~`k57~EU01D?mF9rtCd>;c>K?7r-fFi6p}a>w=$Tl-@;(9elxhN&{)5b zK?Srwbo~NGne_`8CDt!sr~$3z0iAyU-m5pY>ka7agT9#z41GI5?J7nM21$3o(z5QVVtq#4J#W z!vGo|0`*Bj?gFKiDZUJT44erKJ$?)!j6M>IpnGM(XGxtupeWA5prSJK{~yp83`kGk zY6b>Soxzv|i8GK{{f*rh*7-7ofXq|j`~M%5x2E_r`1N;php7Je|9?pYgC9s8$Q>Xx zAbJ9Hjg+zG|9_zUX-IRc;4x$HcrIwqUW+aGycdujP}%~~)4UjLKzUKpfk6k9KXK$q zRnXeIJ|^(`Dk;$VA{9mk(3u3Fvwp>)c@T6~0qAT35fMjNdTWpY^4pnId z#vIUCd4Fd&_zWe`xj!KNf(i^pAR4r$102>|2@Q-n8H&B@z;oX`hUXdhMIS=WV(N>4 z^j(<+PAH7VuC6<#%;U zNPHpLBM(v!F55t5IbTKtqi=#@Z$C&>LDldF1HU+E+8wm^1Qag95e@1q8Llv93Mj5$ z1S&%z|OA{pHJ7cqd&g0?W$`~Q8BAA=jHO$f^S47>>qj6M~Ly+0Tj)QTZ{-TS+{ z?|^JV%9G&n5-A19S~Ar5L@sX*E&L;-I3=Eu;Kz;+ScWNt9VP#+f*{{-K z+X0dX*$t8h(Z;&}zc2D-a6`BSlomiT3=9m+;5#;j4e}vw5q$`$yFqc(15WE0@q<)G zq1gKXW-lm=K<;KV0Iwev0Nq0lJHM#M9dfS6`gP!a>)^F_{WBqH1=J4&xk^|8vepAq z?l;IVZU|89bpeh4W4OgeeJ#U^zE%bXaCyP%(a^t$p@uP2LJ@qfDQiUo1Ji+q{;sYE z%)AMTj87|+Rd4?Pvvww^ol(&Ms^36jJ(-|O2nAFb_$wM1{UPVS1~Gq z&ZuPIN@!r#sZdHJ)=zh}Q*!_T6r$V)VEh7);90JCd1*-k47#TqIRexjm z6K38BRmQ9ns%tD67^e9!_<_oACLK^4;@>ni0R{;y`5EjksRV{9kozF+lu(saU?>BP zE30o{xMIV>@ZX00KLbNCxJ@I%AXw0#zJp-}19Lp3^o0rv!c8W6hUW2^&ADC6~zlO6IS1X#=k*lb3*cw9cYgy z=&nhN{>2P2AoVc+fZFl>GrJxz@KiJ~zNt_Kr5jK>!o4E)P?Fe>%0V+5Z; z%fRQyz^ERf!oU~A!03^o!oZirWZ3_ofid@lDg&P%lc5&Ff6y6l%v=$w>sK=>fbQVv zU(2Y#*mgp3y)FX-D9k|VKurJt1W;V``GLwO1_lPcBL~FRJ|~b#M1f%{SgsK=XSc@4SZ0zxB<~x({QnPB zml;|x{9P2m;MV5^wVMfiPE|VtQ!WGRLWWk5{%QUUe&BkVzo3Efe1S4(oeQ&`hhnb< zq`VbpV5kPE1C@I3W_1wF7|{%ByZ6uRdcn8~Qa6FhuJ!8~6@(QS_!%D*s50>T zLCOI|X#bf%ih(gPLxq7K5(mt@0gyP*X86zOe?pa68`OVhQ~-rP$gK>#X-%qK|NrYc zGMEb}FqneGz~fCIH)?Sx_GmeRdq|8i0g8;UwXf?L6{hcGRAAsQY+&H?J7lcQAkV0M zKy8vggS$R210w@(B7v( zF9VbAA_m4uehh8~UJQ(eH~;?wje&#Wc9Jv1EQ2HlMh2z`ZNUTv9?;$`L|h*`z#x%- z2&5l$_7($EfJ6HtNP5@sXJD{=1kxAaU>M23WRUs)FSBNZ>LPD&T8ROLmw*EUAE*xp zuJ3m+Fo5cNW>ER?4qWC4^v`Uu>2racoz8elLm5_of%Jg%3o9^if%=8uG!E{sfzHT1 zpxDm?UN=_(QUhKW2kkq8&J_fYul99=*I$F?e?e+Mcl?3HXSRa-LZI>mBo4Q4Kd4R5 zpwPdOL8X5agGT>m2A%#b3YRv;MxWC!jqn{Y~8|pmlxl zIrmM7b7ety`hn(N`y0Do2!Mt&6u^FXp(4S+zW{XRNMjdxtuLtj2i5(cwKnROXW-{M z!RFgRav-;>TRuTvqYO$f%>7N>;65~#eq}mHPk#rrUkPqOFff4j>53>o=9EC^4S?2@ zg3RyLH0Dq-wmi5@1IdHTQn$PV9%BKqL2d)h7xYhplp~-$G9Ymw z(7YN0cy`%4xb}vg7Gv<*Y>*tt zE&BvAZb3H}Z2m-$oy{9SVUFPk%rFI?0SNM2UjPG#y5%fF6CL;r@2+~>;kRQ}7Pa=;WK;jI%#;R!tNFL-jm8Eu|F=vPzXgmmf zAHzTJen^nHlQ<#iR!{-5_j{TbsQ=5rAn5?vw-4%@!P*|ZsgQQDN{d|#C>;A-7()7c zyPov-biD!HM+Tb10fjke?g(_ASMO6$d-!k%$Q>ZNKzcxQUl1gHi#hxU-|q+t7qB>V zU0MH(?k^xdsO<`(g&81j1La*6Mh0wSLP8*Q{WBqX7u3!H@wFAfXRd%(TlLRuasjQw zMt2Lk-9iiuI-oe|gRa#Qg6$#4+>4+9+l$Z_0I7F~QQJSW`3x*>KyK`FVc-FUi$DWx zzMunC3t%bJI(C54GRXZP{UAMJ4F9iz+}c003EW2k$$`uS$$|Fr^*1*(fW}mNl9?Z< za4^WMQ3jW%HK4gO2)m&JwC8Y*f-wsyU4qWbU87*k(cjnw-fs+Am)+mk{R6ZY5mcrx z(14u-)E5C7>7fcCsV{Q}mP#K5oyG>-~eFFv!e0n`UoVS}8R z4i<;rn*>ga;5D8obp*Kl@9*e#=x^+T*-L_urVRoFmd zDA2RU*MZl%OQ^6gc=dO7*MPzWau%(D>OutuCCJ)#$oM75Z=k*ODy$4_{axKP{f*r* zpuQ&Pe8Ytf3`+ey-5vccJv^Yj?4UL7puF7!J#&#U#{e|m2C^rle`ZU73M+%G3LAqg zD9%*a|Nj7)3pT$OWNr@!sB8f77cO8>>Ib=TKLhAYdhppUpuQa>TzXi*;nLb&)8Ew4 z0J?9ze?~)t>R|?rHH#S-dYqV_^n-S%Bj2MU>7WP-FNO>bZBQ7AC@|=P!UvRw7?>0q z7@8CmL2hDTQ3T)F2~J0C4GsOR4GlfVn4k2|Y`DX~=F!lzl=%Upng>KJrvdoh#Py39 zRQg*Q8bIsXds>(ufXxBbZJ_kM6e`!)U8B;%{G_LefdLek3`_wHj84$?*{%_ap#2G; z{KvqQ;IKv&l=m9IXF{z}Wqz;*w9W&%Ru7t{z~KR!i-3ej7kK|OC=G-17|4I>mSQm= zcYyr}I`@hZyj~AHUN!-9oE$vv+~3p#I+F!aW;!x(sxUHu?p`wi#Yul(54eqvRM&w| z1L<$-j!}_dV4UF30NzU@_yE$z2A$urAcBFZe`Ys0Q-JyuAaleOAY*eAJQx^3d_e}t z*%AFs-5Wsm!P;9Q(DPtG{sP5^x}~TK$WI_WpmZYuTWbu_$B3j4+#i_0^+Y#0IyqN0G(gB)`3B!2f9CKZ2|*JPYwe^e|L|-+6D#z&|P;R^$V9U$biOV z`g?ms79L@c1)YTk7JtGZ2fACMzrTCOVipE@P+kRzFIHht=*a-((e6EK85lTvvOuB? z3`;#3R6yp##^)AxGl0i>VC|@dXBm`0=7GvbkdF2I3_M_Spl61xl?1Qh0ZB0|RbWs9 zrH`H@1_n?W3@Upd>7(NcIKT9FJ20>mG=R)vJW`<8-_*SXlwLsnOUCmOilB4@N-t}i z85ltBhRulyD>Cq^uyI6!>vnLP0kkgL4!qA(WvLzL9BN28+1$MZ~h$4}*k_ME!qr ziU0pWW#t+d27&&a44``tIoE*J$E<*?hg##oz|p^wK}Vz!JSWKmIy(W>S6Ji4Akx1Y zvX*>}H-iXhJQ+G}ED2Hz@&l+$SK(n`T%%(w(cj$tXN?1c1Ssx7eo|eBblzPate$Hx z0EMyo-v1ZYFJrKnypF*dRJMToE=w2;)`QjzFJ%Ca|X-S zp@Hl2J&-%h5ockwLE^u!djqI`>hJG(1L{{Xusbv`@_Q(P%GLhn9*Kz-49uW2dnY6_ zFz7QfXn^7b6c+*t3~xZ|Jiz^R`1%k>@IDOW^&y~fB?i{B4h(D|44|`I1sE9KGA0Ws zLc~)Y7+7)`7<&s81sE8fGaiPC*E%q;9bsVnaYB)SIj}*1f#CtOmVhDyYpeqUTM7ec zzJ!6L=zstN!!5>jAn{rU29`r0{x!xQFf-1A&bqzCtSkUB`vL>2r~}wemQV);CmDMM6dBk`9T-?^7#PnVP-I{^1v2X}v!sBc%4+ESN!%$63~Zqeps^nT z28KP1i=p-)=@VdJ*v8BZ6F=*~z!Jm2tQ`Qde*>elfTBt-)GXc-1_riN2T&VVfPrBp z<6{9ul^g#bfb3%64m!XfafU&q=l=uHJ%gY#TLl;x7J&Szvi|=AmG1u!7`RV1Fz|!@ zI}7Z_Q~w{Rto{Fhfw$-Y16K-zO85T*4BUqppyp3Rgvl8O29}@$ATt@56G49OVq7Dj z$iPy@^c&GX%N4Lfr0e^DEyj0dR12af55<%b%2583~1oI7IZc&C@fX_{y$*g zi)>(EP6FvIXY2-tbtwa@5QtyQz#?>@e-U`SZDIcsh6s=z0S1O#24;aK5F3=I4Dy-( zGcX4=F>rzWbOdC6D#%Y@dA3{!2G$Y=#&rpb3@lLx7`rQA=^=*km4Kqk&i@Y>Bth;1 z>kDV*1-TvM7qEMR8P7oCkAb_^K_v_1hcgT+XCdJPnoEX+Wncp{UjitO+!?zdai_BW z{{aU6GobKs0;M078~+b5NR%`%u;w~2u8UA)U;&$N&6p#gsB-H60f;*e9bn+9X@G?Z zNf$#W&uTT zSv?axpTP(^k7oUHhLH6u7&O+egzU#uX|V&hUHTU>*z_-F2Kzl$R1t@~n#`n)``T#Qr6t5tCp!&EM)XrYY5W&E7ib+@jRMrWo z8n`eX5CGku&2kd7uB$LQOyk%s7&(k&a$f)o!FoEwgW&qy@02#~f>G}a0 z=K-}TL3T;P`aVrP;C?D>-HGXH28T7?3=9(%LGCnRabRHAaAZ&rP=L(o_V@RI=dT$2 z0~8lJFo*~%Fz|xPa!}u+zpvW?)JF%Ei7Jc?8q9nN%8ZQ+QlL73fgwX^jjl1ce+^Qv zzL&uRRG)#|Vk5(UP<>8g1*qJg(#N3EKcnLf1L(}@A14$iYcVi`+IqT<3>qrT3?3@1 z3?3?M3?3@%p!=y98C5tKJiz5CeEid?0c0lf_$LFCtrG*236sHV26=-s4DyT#7NGTh zpBNhqR3UOYOa^Zm0EyW`426=qEOu7(v?_iKOxXB<7+E*{Y0J{4SWWT8s1CtHJevsWD zzpY`A2iXnv-!8@mkR85Yb%x3e@*ulF_kRm8Fl<&m&Y-}+ge3QaK^`i%hMB=a6(Xm@ zWN67CZ?FpFF9TIZ2k`mrOPCcT5b_{%*TD78Rc!^C3knyjLkvusO$KKn_8P2bkXK#C zpa8O0fPrDM>Qj(9sG1)P@&-E@p6WUz{X-QYBXJSYrR zT^Sry)4=MQRNF!7pkaU-f7Ouq(_sSZU(X=s~P@Q2t7Nv8}+rQIP#MO$P57*aa9E>{OpKI6%^~NfS6-g6zD>zz&W-1`AbnHOQIWpm=0p z0;z$9|7iwxkUv5GQcYuU0QpmZfk6x6KbV^|n?U|FIL{z&u!BJ!B_&I)n| zOq~-vKNxa@!WEt$#8fj7>cIA$h35x;#s#1>jg)TAF|dR30>mx@Rn_NUKeIyY@^u2G zOJ)TFRZv=7(9R&cpp8LpK`VpIf)2=<+6B!F3N|wQ2h``(DuBurP@f2N4l1Z`13Fhr z0yNeJI@2>rLJ@T47U&#fljr~cgU<9+0iC%8Jxhln53)W~CHemik@pOo8lba|TtHPW z1A`z7q<HoHOUjX&-d!92es4)Kj4{Cc0JY*09 zwY~fMyPov-b-e-geL&?r=uRxqIT4JYGvQjh_rTXYaxgITEQQ=v09qdjZj*z~fZ4;K zpu+k8KWKdvD2zbs<3Vk0^}UdDXF+0+c&mo3e|`Yk%LQvggZeO_J`GC)=)8soRT=0! zl)wT8AyB>2KeN#Q+_zcEpaME$QiTmN_M*bhzzC{a*DqpF0G)d%L0N)aO*e?*G8*9?-fagPjbF;tCA>AoKcXHo6ew4ufn4 zM!|&t;IUVbKG1n(SnQ4grC~@vuh9S;7RwkkK=*Wl`W3J+0fjLGoB3gwKSdlEm_dFO zNMI0GVPatH-@%{&>ff<5FtCHdMIN-g0n|oNfTUya{wdHJdZaJ}nTZ^BA`buGfy@+1 z`2QAU9@t#S*pdP$yb$qM3A_IY99|3u8bIsUWkBu~X<%Ri-ATf-5VWrQ|9_E2&>A8J z29}4gGd5a!7#=97g4R=m><9JFKzK6#E5Pj^@I9uWeL0}}AGe|I$?2aAy%!2} zKNRSmsOb$k{qq`f`r8^hKxe_Nhu!-FJ?l+H=>LCE8KhS1tfMx?*+6ZpvyIv{XBV~a z&OYk*oC8#j86W6@mUDs!7{DVb{r%lG3=AErp!Hdx^L~-Wpg?C+GBP+bNJ84gjRD|0 zzLqh#sI)jMFfeE!&WGOtUUP5K58f>cUhw8+WXZrT4!WZh-0yA-0PRTtg)=A&K>Jld zH0Z1z@VWw5$Xo^Jz8|#nEkNf+a`v$@u)y4)(&7vr3jpayGKU4k7eh8@0m|NMkU5aC zE$}+2#sHNTXYhUjkUp3>Ap6@`8Mr|11fAtIiHU&|Bxm5kAON}})xeWM0i*_W7ZFGe zOfN_shz*h#MDjB;^c-4{9LO9H-6sIqJ1WNTe+MXxko<+bM#7{Yw2xsiXdN5)tUN{) z&>g0U|0k#%1D9VmptJ>=R{+f?pxnQQd2Ve4B)ye!K+BXJ{e3+;ptJ)j&p~GhY93@@ zA#@%yXkH9dE`!FMK>kp-)O>*)1|Tue9j7W{|NpBM8ymFcGq9E*)>7cqs!`NZcO9lqUq69Wk1<;;YhTnZz5H*ZG8LDe^jU6WGF>o$YV&E`6 z51RL6U|OUPx}UT`way%Ap-+rD`?FV=)6e=27v^~`ly~jvXdkk zI2SQ7aF}Z_2naARFfZa@;1o&t|BNA_K^1g%1V{}y9m2;boxyi=s4R7c+_~(mLpj<^$?;iox?g;4wwy`&jlfK<;RP zmY4AT4I&H*NN0~i$_dC^BzS%qG^g3Whd~227YSM;susk+B3APM(>jO$fBN@hzYh~s zKSIY652(*6>VW3I2hj0N(E4-*Q2hu>cPcE9Itp~J*%}uHhBYn>EDKy1IF>jta4m3P z-~`>R&_AQ01JqAemoPrS_(MVwG}a6X&oz+@JfQk!4eIzc$WHM7&;E{X8_?Om6Zsez zKzUfD^Zx^In_>@x#QG%+0qd7CgoqwsU}jWkP-PIPaAJJWpbEB2Aff?mS4DtgZzSjp z3I$bh1<3kcP`+8elEFdUQvb&KRiH78ADrt~L-zaiuVirO?``M+jT^VFH8um?sSI+1 z=mN+bGsqn_Yz+*8ptCjw1ROx;Er9qc$)*9I`2Z%i18mF;C)62#W~hMLC~I;-b3Y9o z3~mS5z-sb94Vemc#`7msK<7R)vlXy`*5)%Fs8DCtKcNC*gZ2`G%$>->z|iZ?z|gYP z*bHn369bb-0|PtAocCozknwJj1q|Z- zI~fANbI1Y$4iI;qU}IJ|pw9TC0OU??&^Zd={OAS}uTW=Pe?Ubgl7W#~ErV@M1p@=) zf(mtJ{sSr?HpmVE28KXJo(ffvxuAH|R|Mr525((O@c4@tNDeet!l;(P#<&i=4jeqc z4i5WOpgW-TZ-COy`ZWwHps)tDUqF8CU&EjRHQy3shQI;_a}eG0jDewl2c%A6hTIiy z2omp~30W_rZfWAcSec>N3*E0M;J}~>mT&D^!yr-M0BYZZ+{v)6Lb3G;n8g5Jk2w=u z-hk&bdYnP$5ob6+&RJy;W>|Ybv7Ha1p7AhP9he952Pki$q#@jXVFS6P#|csni8%a! z2r>~Qw%|PjC&=F*e#=itxu~woz_{cs16METOdzPA*WLi{uL7M@A_C2u0g$>e4}AV_ ze;+uXoB*{mLHPtJk65f<3fjlxp$f_;Dii)cK+Pu-;C#YR;h@;d4#_71&^@m`KOuc8 zVMXX%-AwQq+6o{)gX3-``0NG+(B8&gZtyx0iT;%g8f&u{SU_e8Fff?6yk+15)p7l6 z8Ejg6jLks)6l{Q`%bsVDHA;-jz;y%oMo!S00gxKib0!W9d5HbR0uBt|vt9dJy4Eo8 z9&iB7HG|YK%s8Rgt_o%`K;kaIfgu$fPr?jc5sIzgQv(Il%?0ul>AXacN4iKbY;2mVV zRt2Z1l?uG1`YbyZt=hiQ0&`@b{2Co}ZS?W9oRCa*Q`UlzF zznnp%XQ?UpydRi(0tyT~Dl7m02iFVC6%FbVCI>)kWSK1#6hZSJ;4_^;_vN^N)@uF# zv&Q59kN&P69Z;JIwB})rrm2IbBREVU@da&%GdzIY<*3r)yaMC~kYAu-1DUI50M8R1 zP@j_xng47Cl~n?&J;@OFNhE;6gnl##?7#KzR7??r#t$@N9)RquY z`2SO7DJZ`PK*mAfW@jPi{|Dgwzn=lzcNILqzzhm|0R{%p{%{2qCI*52mWB=$HpYED zEf6rr3y{B{?Wpz385C4noWXbJsw{Q>0PROWnpgF{~#~B#M zxpNHi416^V3=6?+gk;9`5}Hx@X;BdGJ(togl zArb5@K1K;-b37Xu7Dj-~;b6>^Q0-sCAOiD`VK0L`124$01uCGhTfdlrMICf@i6R37 zLjxqQt!aeif2Q~gT^dD`GbMwK!dua z@d0K@NF57mCks4a5LaPi676{m%F_%C42!{a7I>Xv&m#sNk!Hx=1lU;+J>Xm87#J8< zg4KchMm^BItrlwqm-S?8B|nST)=CNRhGKQfbs@tTnU`6 zA>(3@a_fPBDx^$Ln*j2!`riK&KzSH+Zbq*cq+AD$iGlpQehEXt`sEBI>Ps0?K>Od+ zmob3*U+Y(a?`M?gU(XQJKfh~9{|<(X{>Kaq{mU6jKzE||uVOG@RxVHhwMiJ*D;fkC z7+Dz|1XTNHbUQFUuTTW#ZwCH~1B^c+6ep%Y=Jzxj!EH=!jYb9s0R;w48{P&6m8Sm> z7<^B#fy@#-z@P$JQvqt5fy!oeOREPUw}IROs_Vf0xjhUL6I>WLLGA##p&!)8o8Ps> zpr1iO^Z|p2!3+igVeq{OpmjS9G7T=E^}*&6AiZ#NmNS$$C`3=szg7FDnR{{ykn~akNo&mPU@`C+z&**3I!Gkp|7Vc;mK+8ykpm1|sy+Yz8%l!5h}l*785sN5 zF~l&wJ;26zrugTp}sB^($VJX9h3kp!Go7DB@T z)URYJXaM*1K;!z#3=9T4z-RB{4u?EQI4~Z^9S(x55H&5C3|s;XkTq)}2N*b2HUIw? z2aQRuXJ7=KE5-P>fQ?!2fQm4v=?wC(=Kueq3Jjdr?_bGa0ZrE~&~)vj()|BHKWHo@w}6fD1~^RYz0Q;Q0!-BU;xeM2qZw-gjmx?CB(nX>bS#1q!m8)&JJqJigdvF%!~~J zsx3*7{tGCaRGj|*7d^nh4r&MV?*OG8(AZOfir@iA+5yRnI52R4`~?rA9}EKG3=GU5 zF;EzRXlT7%0BQ$;{0b?T5`RF;r5m8IgS9h76d2M#?Hy=1Cfl$yF!c9#Em3*?{{gsd z{G@=5@jN)LVnODD`t=MCBvdCt*VKdB?jSo@KzC5EOE{}M1f?+vXHeM(YQLy@86RNO zicstYpCrHlI&%P$#!$z&AbHIf5}u4pk-`(v|AXW;KS+3~p8x-Ui9Z9^L~tvd0dxQu z56B$`Kf(ErQ{^QCBcn3r_wIH*gWh8hX1xO8i-V9#9Bp5*BaRR7r0oNr< z!S}`LtY6AdvVIvuMgI~8hV^?GG}domP=VDgpt=S$rUkBBIv{lmXq`5wUIC4}g2pt} zS22|IFJdSF-7hD=z_4$PBls+o3edU_2G)!Q(D*Uq(hTr^cn02#1EBR+6I>W%`lZP&Og3Nu)xR2Akb0p+3sNr>*>E&4^mlhHQ4{$80JN`q0VIup^nl_|-O?1Y$953| zXfL@&|6+y^(4C1B@)$TlYCv-&>Xt}j$%`TC79=rnfYgBe2^tSxkk7!`PyxEj@&A8u zMh0#bHYW5wT8K)E3wYhG%2F55UJ$TdApI?s3|#%4-8SkP|Nk$^VBi9sn_$Gvz$mH! zT5rm@8qp^aGcH;QFei0^%oi$^ZYCR5Eb2q(b;C3nBFw zO1fXn0CER7E>)JgRDk>oN;fb)pmcA<#K1TaJZcKA^pVoMfNDbu1Bb{023`i22E_@P z&@`{jAOJas3(`IS`3Wt}L(+S1j}9oFKx^CkmofNgE@WU6QGm=Hg59`=!3EqGU(VpM zeglJmN{dSiC_dM(VGsei5oB)vQihWLbqpT;>ls`?X$#ah0qr?ozn(#4x+H^2Kd9}s zlR*L$cc8N^)GaMGfXsl-2SVHd8Q)a_m7nT+844ifXUq<0z5|`trP4pSM`!(Z1{3gE zL=8JsH4iedgXUPkXY*`hFjx<}Llt^|D##z}H!w)_Pw1Kf_RGx1fWBu88hy_hOhEHp zAUCMAxPbb^;C&|`b$#y{O!|H>X!LP_?&JKx&_Ahb1>=ts>WqvYs?3@JD(gUJ3rR3A z^u1wF>3hu}0a}OL_m07!zpLAZnb84!<|e3b2-^2-D#>twab1Nv<4+G2Q3nR2HJYXo z{h&F_zqXrwpB5?i0%dp^pI{3V$2nQ9(2MprtJV0^X7{IhZK^4@l1o;md z#ufq$3<7Eb3`_zIkoG$0o&tu16Y30+9x9R!3>@n~=OWE)3;@l^!RBij9vFbmI0uIf zNUxa4|LdUm2A!1!@?(EfL&q9z(*O`##mU%Uje=s1&T3_)kLsxUH`3OF)=&&veq1Kk73z#`bd zz*Kff_aFnOfC7Us;{gFx@H#iXiUtOK4#ggQcgQ+7q_YwGTf26E{0thG1(~C=h=CD{ z7*qd@&J=^04E79?4h^6_0iz`NEUp8fy%fwG9*U6q`2PWr86fleTRXvLRe{U}@xkH? zVEvg$jQcOwgVt#;WiVO4oWZ825fsl2GU|&MbU^imx~2OOh65U^>lZ@SWiTixsP?a8 zFagzT>lZOt^d5n#U(BGfCIwu-*nsqa(g!Ha`qwcSfbN-{dYD0H`V$5n2Ihke3@I9l zDoYud)Fl}lm{l31KxXx?VsHSRbKl?I(9!$e)TQOQu@&Ph17#I%28sTjt`jP}3>G2_ zAnhjDz33tfA@@FrD?-J=_o7#T`;Q=hGrED!<2V54GqZ#ECxk$2O+jZHg4Mi+h%rl6 zC^DWopv=t6AjQB^*dU5#mnh6G=$$GIYz(}rHy9ik7(nJZDE9AUaA9U;kizLkBz>U! zLO^zdFtZxS{sOog8IObb2ZTW5FU)TaC^L97NJ85U2B5nVne{3_y>bSSJBe{4#C;x$ zpftd!A)p0G-{E^eWnX_^*NXn;t|g#$0BHOTG=AE$)Yt+vb_r`wg2vG$7J&Ax7^s5c zhk^A#gX$yG4AA*?HmnT{6TBE0LGxG>{1})ST_f0-wG&iToETUbj~-xSaN*Eilf%Hk zIHN*UMB)F}HQ@EM2CASq29;?l&rKcHJYZk|m1iKc1RWSGR5(H7Yh6n~bICm|44{1} z3ZQXYhNCCgm{q`SKMs|{42(VSGdB|&7Iz6955 z2(;rk?|?qd`^bc3^ok&+Ysi11QQTKO35Uc9QfTW8e@u`TqdJ(F``wm}bvg@cu9G{V{8FOhVh2a!vtO>f-3^X%13|b(6fzAY3a)Uvu z2f7yyHclbp^8c;MQU(i9-Ug|I8JIu%Pos1XQOsG1&FaXW(IADrlJ6%wWTK2y*`mC=UqaGYBx=w}7m(hmDi( zXK+wqV=h_09JIE`6>PrBQr7~Q`Tfhm=hZrZ%mTTSf%!lKGc)8qQsy5g6#K!u>A?3O z!rGqyKx;OpJOb}+@)2-kV6)+FU;y2VE&y6P0y=h+f#EAi&4fn`vc0Vg5)9rIY!jX^ z$T6%3=OwT?BCzu`IvYAb{Z~~@(>1DIrW@8efzRLn49AGG9V8~EqV5?|gd0QaIn=Vwi*gpBWrK<`bM0y!gGM!=ClLWPk*R=|-# zOofplM8pwt-+0SANS!AN9UGgF54kr=pdS{O3~NDdT=I;831lBAEv(SnsJ)#F7?faJZkbXPt+~1ZT5W9py)Ao?Cp9V5}LJ}m6sRUdgZk$jFIcGs25;7JrA&&uk-k69V#I5VsGpGo%K-E@2)Cx*K)mB2( zib_J%s_-%}g5po+!2g+`b;F=I1BC}Du8_hRoIV5?K<6R~sKUYsbe=v)t>6N9xch_L z4(^XEVenD6^aHO!0jU9(GfNnJK<0zeBdF{G*&)%uAOK32Esq(P`kT5=fYkOxFo=N4 zB9RJ6nJ^_1QWgk9_jQ2Q0WEpJz$9`6bYClj1z7Jo1{IM6h@WBUqSqf}8Uq7p9T$iN ziU+X!ni@Jl>x@;LO!vU{o~TQL%OvJCkqit=-Z8K(dCVZv@(2S;fGA zz=7e%3B~0~3?eP>AY!0Bj7#1#fXi}_U7)rqh?Ztx-~!FxfyzHv8QilJc20t84Jced z>cDCsWAMm(O%ABf@dw|34O%zJ(4e8Ja?IGE(L|9>n=VGsj}F`Pf3xSW+iq~#_9TgyoXCUp&P-O1+odPq0F+cUzP(I7q1W zcXpj%V5&IKKfj@a@e%mksssJKT}y0u8W>c#!S~c#FupWUWK=kz%Bawxs{Y?JV9Gg2 z`Vl<JGBAlNFhqjH1RgLbF}ysW%*@3gHRT=TOnuP$ zB~b@Rn84cMqK?pZI8qyT$_TVCWo9h~DbP8|IQ62m;UVo`#+%@AL-2YD z1_ljPN$~b40dPCCzprae&rJpq295&`s*j8fK;g>FB%#P4dBB1324a0nOC*DciW38q z$V>(%24@a!(0KqN3jcqB{3o&iQV#UoU=Zo!W8h)t2DQB_gcw2hh$}(LW6)kI5$L%K z8jj%cdhj_Xy*n5fRGj}mV8~HmW0(Q1Kfq^but3-KX(WQz0I`GY>4&yS82Z6&M({c% zh65I=D#!kx5V`mtbc!8=2x9NJEGW)F?IEyUaO;ABK^wFmT>+8@VQHr4DT4@TpD?Je zrPAWM1H5;3IVjv27{KB4o4D}um40ad z7?jRIePT#^!W%aKwPQVO{T=d}Jm^}yDQygPJrfvsG!8N_F*M9j1(^woGZ6&_Q&9N| zn)mLX($E1q+o!*?YmJH^gN917v4PqYV*|Ay(-kdwkoKD3I!Han5Xc}2xs$3whzWFe zIcOi=Mo|0|2!Z-Qs_($}xiNt5b6d~Iz|i{;>0Z8v|Nn@-gWk&rT4lsk-~d(wx-Zj- zff1yC>01VdX=&j5(YRFCGBCEyfRrboF*V59bdd5~Whn!rN-_fzNDXL>j)=m4$o+&+ zzkuA|*2lmG^Am$Zges^FAbEh{Ajn?~Ocf2#e5weV%LCoVW6JUWKNG)!A_J3!g9;Br zi28qHgI-GphV~x}BFyRqic4=WFtq<<5b5)0U|=?6kObMS{-1#fly(^yKzXA;QT057 z3d4Z|s=Wsp7(n;ff&F(7DGUz&|08-H8U_bJDT#prq-M%Z1{KXj1}4#&3~3(?`ws3!gYZ{Pr3VB&c7= zz|admxsHK>!M#AS^#%h&3-mk$#vkDP%LTG${SpR?_MHq??dur8`I%X-LV5Xm2CM!Z z4B#;!(3(1d)eO1dH7Tl)d-j+l!Dpm{v@-}YgW{fnVL~5+!i4h>`$f+~(hS&s)&mX< z5hoNG+#zdd+o5er#v4d(SPXT;dZ-)p3zV0yLvq6m28Nzy$le6FeKQ$6VD^dYBimQt z06M1-Y~MQuhIVLMf>{sEz8wr!?J)cJPbe?n$zavL4(jJV1`W_Sh{)>y$5dJv0t6Ts z^g!uw!XX9)6-EXR(AnAy4gsp5_!3cIPy@xk8ViF)Pct}3Kw%;WVnO_W!hym4fMPpn zHYO4h4E9Ed1@rc)RgCd`C}TO?#Z6lm`zNR4P8WZZcDVg?gXdT8ItV77iegGKue zNL!OxvOp0WPV1rWKF`1a$`>N5|KC++gm2ICG;z5Cx+s|V z!*C!&m01lW#~{zZCgH%qCeXm(CZGtq-;#+*K@oJmKS(X(p$bLSpA0Gt4F#&b4;jFD zd+k9;-Ug-dwFm$I=mq8NpP;)M|NjB00o`Q@R%5}y0CEd6^9jY}x(p1{@)>ME`G)Z= zC_er_2j$`ZKFIk|pfw91`vebw_x|Xhm$lLi;5BJFko8tgJ79YsRF=A4fsac=#*{JE zHABlz=sIRMaQ_c9mdVgypxWYOYzA60Am9MGV;;1Qujd?tNY73N5ztr%17C#$gQSN8 zL;nFqhRy)Rc4h{KR#yfF2?tQ#a{%9!0dluWi?KmVH-m^O2Lq!>HUmE+6NgsM8wLZ= z-Y>yM$QoVnx*^sAhu*cOJ}oyGm_TzoEzq_gcx>qb1ILm`P~QLlR;7i3splm`zo;U# zjsdM#VvTU<^)mHnIm^Jr=q;ew0-NLOEl^(K2RUm4iI$Sw}K)A%ZUbN6-YUtt^(TA z1G+~YItB^ald_%xw676Y*_05_xE(I zF=_e#Uxk@LLq(WDLp9rUMKAc&KL!R+dg<2(`GSE#q#x2A0EH`~FoR@o9|HrZeF54l zw_Kfp0a=f_1!&KBg%E>(0eC#FUlCNVGVp-XV!z`5AF%Y=ulWCuxCJD=g4C!yXJ7=W zndZ-6qms;^!SEiGFaF;Fxd5~_ufMyYqhG=_26WFD$lZ(@9*Q70gYJ?NW?*mvxxLL2 z)ONH`WsodzkURjn=c0c?LkFXYgrb^&X-0p4w+rZuwBGkj2F7{}^6S?#1WaDf5D4;@ z;gA0h7;l_Voy5n$IC(uo(Bhp8fed^n4j8`s&(5rOKy~pBhM@lS3<03|a}`O3o;3*! zHcKiQeAXl|=&Z?S(C9s9yr&ICe75dRh8$+L3dPSt{hrzmXJ2Hz)VORi(xV(jex=xl1?fVmp)-&=&c0b7p%e5DWC`$vpt}wE(uzf zQ=kgE4;Oq_>_Nz#x$tzt`2UZ%Bs86XP6uK+-~dV|eg2R&?u^e)D1y=ts4cm6Ap-*_ z4}<&_Z(wD&kWNIpgYi}gYFuWIO)L5prC53&-}pf z#vggmob&RXkThn{#~=?%W1z8OP&(^hZ{t2MHqznuU#SD_5JPA?< zQV$yI294vZ{s4vb33wd>x_cPhKD1=uS+5AKLw@}K0lJ?UREL1V52R+AJA)m#EMb>u z0IiD=QDBf{NS9D#V3s%lvxk|vLJ?#asQt;{Z~$Qkfi@^84TIWW(;^}H9b9!3Mm~WeWqYJE9UG<+%L<(A@PjBd0zn{TI?Ypr-+j|BM(0()UUbAhedmX|18KHdv@cn$t8CoD^`U+Lh zSOMb=9A)}}231g50CFd2k6r%?h8hNk52|aK7VXAn_IW?&Rq&%n%( z!l4BkdjZ{D1742|>RTRw?8%t64tftDD335OFo5pzVhUrB>;tuMg-$qt#(Y5QAD6O% z#}`&GFn9lo4)b1M{E!6%i1?hrqrxO^u= zTK`Ih6wp0vpnGeC86bNL#6atn8Ngv{1KQ`rz~a!r$e^IQemMhp%zOP(h6GUf_k-x= z3?86*S1N%)fGI&jm4P{+fvKxOv5)EhpFYq|2Br)Lu)Ux)exUx_QBYaKz{bFw(4dn1 z|G%2R|34xL|G%tbVqgJ@G4-5KTyF$9!ygj2pbL8-@db)2mFEl+439u&{BH-vmQVwO zC@8+c=f^Qfs7fU;aIdjrU|?zh-No5@1#}lJD9x;2%#hO$!h0A@!0}l8{|D$!a?rVT zObw{}OhM+hy<}hljW>%bFo1l)(6@s@0Nj5C?U7G5-O$U$pu&)y!N%wdo?}vCU`}-C zpVI9DkMBOl0K=Kg57w_^NSVHpAq7;I8e063XSQ%qUA}@LW%4S9)ZTNZI}EZJfEaG5LS|`CE0ZLyWJ-uG0F(CH{Ixtv*)V93_wHG8*8MreXBo{E4FbGvN zfZAt_pCDt@jQ<)yZHx(OhNc;PeM}CMG(q$G~8-OqjuE9Rq{TI!OkNz7^o}<8)NG z7#PrPAUGTDxx2znB4h z4s+XE1`bgCG4NJ6Fyw>N!4)+_2B!WspmAabhNY9hWt>ev@%Q3YK*~I;HPAAz0+gRX z^Cha;rXkR^y&Y>)!RI1??wa)g-8Bona~5<5ZN!vj2AiHX1|Eq7&|RAWs-SyZR8BBx z^fH0&->Ux)S`!YNvk-A$U0|Rs2Ar(dj0l|k1OpFgCR7Ld}lnj~}>;)Xaa|?{nxdkQxM+R;c(43ni zgA@bvfd+NS{|D69GDLvR!h-En0gdqrFfa&#&ZI+96M#hxCz=`$bTuIP{v8Y*pgcF7 z8MHqObdLojY(U`xx^srX9o&Cgqsqac(cjc{0Cb*t59}OA=sAr7jtu@PEDX#7E)01p zj0|i7jtro6N1%0G(?MqUuVjenU&9c=zzM!POc8X~7=z>q@O@+8b&R|j;5)^bbtM!* z`%MHC7+Ct3GK8!J&9@~8sDjx2%NPO}SPL2$j}|C`=XcJ-)iN`7Rw%;NE@$xRU%}wP z@a%vhGwTUOW{nI*2HpY((779oH{f~-LGBV@V8{pQgP9L@_T>ydaJBF_I-$t$;(#JE3xg!HYK9^MgM<(?{=suSF!hWp zK>n+6VDJaK8$5oyHXk&`3OP#|JjTkvz@T}M0d#*ic69p1(U+W$1vE zSEheJOQ!x5`rn zMh0d9hn_A_qG4cQbc#@1nhfe|F))fO{{IU!POox?fl;uTK?JO>mw`bgkAabKQHA2t z#|#Xh`+Ze18JL)vPAD$dV_*WAqmskG3^pf|fu#qeKAC|<{|8W*sj@)s>sh}9a(+oah;9U*!#-h+64E+S zQ2D)|K?W4o>U$w`_G^?(eIW5^0zUsAw9gULCIQ7KC@w+g#Pqa4=E*=I1`cD;nK1ng z9iVXTeQ&w~B)*;>6ek@!Kx0Ut_yCE4)Pm`m4Kn?WU28!8SGUx60iDkbQUeMDxEk=8 z@*w@F?gi@y$$|X?mIu%6uTd}suNwfbd1wTkZw)zjbBzMbKgO{0Zz@222Y8mUt$5nchI;`|Fo_X z{q3OhP#75cZZfF!uVm;D2cO}|z|eP^L8MoUfrkNfr(k!2A_GstfeG&z7(i!TPTb5O z1KO*h!ubCmQ(}b*4UCy1MTkzt#Mnwf}sU8#{mjY z@LIP$3?}_67+OGjLGBPyU}#}**a0#Nv{$E5t>FIy(72opR|7-uTGId~t^_vF-Q5F4v=?j9W5p#gt)g$J>z{@Dep#^TU!PbAQU}#ZkaT5WBgUV7j z1(2Iz?ggbGka__HhAsxtj063BT_+f~g75h}z_@OKVqX(@o`VH+zY`<4ZO_oa%ya;> zo~{E_PW5Xt@Gu_&m%BR5oE?gjlo@0hL<0^8B{K*!h6X54Qi06v3#CBT{7+JajNu8T zLe?2ic+J3|mc+m)ngAL57I22F0T6J3%I}vuq+8@VCy@}AOngIP}w}~9D~lfLku#E*TL=t*AL6CGw7&o{r_K7^#5_S zDgRFhFfe%cuVm-}#Th6})C~XshlYy_D9#uJD-QI}>^i~t5i+04_;Z0`-wX!OdA%JB z5*`h`Sqwak79QX`#p z4AX8x!hzWwH5?`>G01?zLMVxWQ!Sf;aRO*x59mC5=z0>tBnB2x*ocb$KMV>h5F0ec zBFg!nPwg6m1t^b$_JbzuEg1`Sv_!|RMwtW~n+AB` zNDU}|fckU&>lj?rwlXk^t^2=2Z3<{VagPpo--rYQ1C##*W$1c7Zcuy*`7>~U@A`zU zsbhR#03HWYX>rp5nFn$gNF5VsKjbC`@R<+b_}|Q+&<`5J+RC8Ok9k%S=ziS;>T`7N zfZIp#yGuX#|KCfZo3hIzIx$N17i3w*x_QI^eP4_J$779GuE? z)0mzo3=E)sDk2S_IWhxP(7iXHdlgkRO*0r)RIo8V2CqY7VPHAoz-SqvxG)twKgFoB zlz|bl|L^~IkUAAs1`!o51_g!{khS=N3m8~c7Bet1uoXBk>QyK%dsxyN2|1vNsIInpE*`p7d*H>9; zY|ye8QdfY-!xR{pRq`1aLE*GyJxCm~XBZTgkoJwX4>&$R`|g<-7*#;?SIv-g3|c24 z0@@SET;KrG4+`fceGFU>Hf+zaHhBFHcwO=m295r83>y9YT_-?mmSO8`!1dA0#(>`U z3_MehGx$tB#^BYm)VM;W#SOC7VLgLD{|*KX(4LCvOblM2bq}Dvxrig=JSLcal@_-i zP`M9sJ4g+fZUwcs8gf8;ReF}1g7@~Sw74w+$qO(rDEIGYP=TeXmSkhd%u*6K9JxUK z2_&Lf{tp9Ij`2YVJ3u7C#AmalFJzmK7XKH}TlKz>^J)nGpY!-t9XpF8w22}Qe z+NH>HVuFx0YzQ;U!EFnWn?UnL0uJDP-8w>o|G}%kL1hzoYG0$!H0p#*FhMR{z3bjp|k)4vpFaq zfcy_?7ox?30cd^%yq0EaLkDR6iP~17hs4_JqsH$}{*nq}{!Q;mZ85nv& zuH4}*b#1A`J+&CCWFhibit+NO9Gg}%uV0jr7H*Gt>=Li`vS%AiBLG=Q-ebEDQCnTQ0dDK9FfvFl4PXY`~ zm7s73xdmi4a@w25#$W@AQwFvZ4&XRb1KqFE*wE7g>$5`40;>b{SwVLmu{k*Ow3zy+ zvO)Ujp!5MU17tt8G%Nt>>wxm`%m$fhtPFmAYzzT?>7e*12A{J79ft*{bx=BA2C7Fo zA!p-3?hs;N(1hHlMKH~S{0R1kr9NbjXp8ZIJ}&S%oCXYBsi6Dqz~e}5Ye6BwzyP{W z9(0ByhzFWa0MWhYOhZ64<3(`zihv(L2_%M|e+3*M z{dti7z7$Y+qO6IA=3iKOgPuPB*MQ7yTMWvJ4ysJbu)OG@sy36s1~k{D%E7?1R*`|B zm+}7(RZS54|BqhA|9?b5^XZEJ|A5qh%mAyAgyuy{1{QSptY6IF(htIW7z~7r801xQ z85rBT7}!Ahi-9Y`fnhZ`%%qqWc!17N@nGD@p#{5F6SPJYEDq0SkbH=2CTI;cXgmvK zFXP1uEp^MV3+vZI>JV_61m$&x|KM|*KxQ#D1gNU5V6f>`1g|IHS?kEa&^TQ{WNAesQ_Cxh$;*`;oYn$JOcL2@7( zIp2Zex33jcA2cK7TS&eJsRijlPsddP1^+WHwdK<=N$$6y0m zH`_nCYYpQ~1x0Y5nB{;&UlC*tk~#|m6G$Cse>2E`>ykj}I_Ut|yk!gppnSySV4(_9 z)5if`(^3H{f7WU+M1b7Wzl5Ozqz3GcJq!l@s~9Rk=B#yKi0EI&P|&}Wp+?;@<_E|; zkUF?o+zb(r`7RCBwcT*D!0v~ewUz;NSDC}w1q=~={0uyxJ3!ayGcbVt#K6EHd4NF^ zv=*vQl7R=*9%fb+Pz3D(0JVq385xu{8X1_@fcDUGfX03_R2i8)6xS*+aP)C8@Tjmc zurfMFD6UOl;OXN5$y=y0HfJcVUBDm!vJ2z}#>WMUYY#ApfXoN+nUxPHu4e%4(QaC@ zehFm%(fY*<4*g3Qe5P?Q*z_-Ea8PLhpZ9IR$O6jW|8IiU5P{qQY8R`pu{ZUD$|&e~ zlS+#_`0hWIrS9Ok0@=~W0!pJzd%$Y|6@Gy0ylGqvc72=-JfQR27_%Z28Mq_B?FCTZ zX>AjO$TWTizdl}u00yM{h8fqLP+YI{{|0CsLZ1YKiuy)|jI|QrvBa7_F38%@wOR}s zpg8E`hO7fx+s&ZUzm}n*j~{ZT-`e#I2K_r3D*E^sOh9g1uLm9%tmuu1L)iZh}c`G-nR@o{p%p=rXGRJnMpJ-7%;F% zG%%!q<|!l&fb0gvYrh2p4=7HVnH>~C^O5RH8Daz+85Gr*F$An%#E{Xa0Dup2`d z9WvAzbt6<5U!PE2D+%tSRrIf6Na?)+4x0$Zh5&VDE)NyPl@+RM&ok(#B>%qwI-6fW z;r~^TdqKF5o57%8gF&TFg299_BSCc?4P$jou7Mcr$VZ zsIJXoFzDaGP}2wU11}`Z8CMpluIFPg0o|G1$HAb}`x6rG%o+)*Yu|w54O|~h^o8u_ zG+oKyu+Wpiy?-5K4tnBEh`6~1gTlfS4DS7FAaOOZ8zOF+%iyrEm%+V%B~;u3B5p3p zps>)A!F>`Rgl~G5!C?_EgS+V(28BgD4DO(L0Z@7Y#S@4I#Rr(i((b}7X9C*m2=1SN z%50FCJuRlleLMqD{R|QZnT>4Mx&+W&;GlU8@H_x`EeJ>r+%8a?3;R5Q0k};Ezc)gFK^F1Pdc~f{G~g-T{#LAouiu&N^gZU;v$u53vV*%tC4gwBLMU zJ!s5na@U;o+Zc2h8aAjx!l-$|`uz+hpnK)kL;8mr>p^3Pn-F(3gTjyTfC9J{gU&i928O3b${~iVd z(0+f=9=X0|28TY-*=NiV4WKncy}h8h^Fk-k{v5{j3W_~585lt8Lkuby zioI?O3``1;b0nD*EL8gh7+65=5M%iN31lzGuPXeYxx+*!2A+rpCT#&lP~02jGRQNo zKfnT7X9${0?dxQ4=<{G;VBib@nH|H(m7v($#=row4-}ptJ3!`&K=&`Hh%zwt^+Wy6 zp8?Vnz?fU02s+aMq#kTHJp4VtVZ+Snptx2LC2aPB)QK(lzmtJsg(@^{W2_7BhmKc* z(jRF44>IN;VFFEK2S913e@fS!^-CBW`dYx{GAMo7fcD>m(ip>n233qPYtXp%W(Eb= z*fz+`(DY^kzVmi6WG|aqvFRPqoxPwoN}oTZEsm1jpm&yn(_18iLm#NdfuuJRczSbY zZ~&j{L2i13+5t`*J`4_hpp$$c>CFV5-oPta!S{88(_8=at_=(fA5{CkgF={rLFfTP zQU4|ehraiazNF{_hD?x5A9z2+1XY0q&>AWR1~$+hVWE}IYK{!@42&zC`#|RgiaInf zGOSQ#G!0Pf^#QA4F^XW2hn-obF7f|?iX;Ogv*ZRA#%bVjQa_N{;J%hnM?>#9(<>l8 zcCh*Dc3=C@<7zDs=U{EmwZC`=RUK7N?uqJ?kWlbCd2RI%aKB$7` z0+^gZe*Hfe?2hlCb|M3V*n|HQL3~ggg7S)x1A{Aw-{%bpN5KT7vIOcsaC!*nv#pu!C*OAb0QNO&|bX$mOz z_%JXSWHHDydONT%c0kr(^!YM4fWnJ`_e29^?_6_CKN|xBD4Zc?gU1_8P|6Z-28TXS zisS~DKLLzdsPWY2&*0FP!N34=FDUF7c?%TRUSweCL)=pjD@%5O!btc4gD_|g1QchW zyC{0P85sIOal`G=zzixkeHa*eW-_q!-(%odI};Q?824hEh#&a>0Tjkyb2c#GESLI0 zYkl`Y)+HeJ{s~WkmQNQzdpW>+IFQFbH!w)_EMjl~)iVrCkh+JVUqTVI-`pUQK^}C^ z5i@6i>Y6MDhMo-!A`A^3stgAvs0uNF`l2&bLFX`l+$QGA0G^Xl5oTaSm>1~;nyY8h z$x!TF$G`x}BjEgS^MHyt17z-?e`bRMlY)Y(x@F%PaGW@R&lJ)SfR*pU42+<<1Z)Sx zfAERtpmAa*(3-Bz4DkJqpf(7!T!xMX3xUu70qyGr)%pF?x;B8;LZhr@0F}L<`W~tL z1(($gJ5&W480N1#z`)Qyub~4}rmNpGz0vm-lE#G=Fo0{-zI6-?eNP!2dXF(UFt8qI zU|0sqFASXwY@Sa2=OJ|%XpKL(9Rs>|iz`C0H-~`%GzQ1Gu7ZWJA6za#);-VcUI1Dj zjdZ6w=$tLc7!;`A1U|FE9egepC@lK-K-#+fpgJ3x&p_oy-%17s(0E_38u-jN69zU% zCkBpy1_mz)MbN##2Im;$8P6uLFy>UKg3fXQtw9Big9-g$-~f+}f#TzV1|mKnXFP%X zK%lZig#~h7E6fdR0vQDKw~xB|z3G zfX=U8cZq>vT@eFM-&Tlzu?7G0K<2Ne6kp~}F}(+SCIg0ML?P`YFQ zrOS5k+#SdzAb$%uz{8epoiGDOUk7L{4Fe;S1}HB=&m%+J_XEn63}AneT#oWV=0BUd zKzBd?0IgqLzkz{8z=1&o)UNAkW^m}4!QcQoW1oS!(8*YmL7rJtgN1=lq5*ckF=)&M zl>b3)XKc*?o!JIH3lQl{{;wdp9zRIh=sgSxAAtl06>xti34E3kV~;DOEyBQR=>$4+ znBn{h#eOaDd9m`$oDM9E9uX>{36OIX`oJ?+3=E9@kTMu#KH~}Sns+V`dx|RqsI|=? zumF-yrgTF1jH=+Z&1|5v7kZK*?h#4&e;=d=kX|Ze=4vrrhxN^DZ>qe?a4|weaXnsje z;QwEQeULl|vroW*ffeLe5C-k50o?%zVyg)-FoV{53pp|{GYNsl1R>!J>euucLei9& z0;tagDsv%m+K=X5P^5z5cu5h1N1p%#gW4koMuq@z*g1m2xgT^d1n9hC4$~VfpgseW zq_YaR&migC2f8zZ*`t9`K|&QYz6olBusAZX7Qti3+{O^FigpTq$SY?25`B6>~D~%p!G)}zl$jRKMLZ5 z{Le4}T+X>LH0%Ja({|~f*&NZA20FwUvbG0w&SPIO0}m)qi6#7p)#CyEOBld&Rv>f0 zlZL2tY5&8vVH+W#`*;eA?p_~M66%H5F^OIa1?aTj*WQz|NdHGo3en|!fmV*o|1}7Qh1z~4>YyN)#+RFkO zQ)1Qz$Kfh)81y!DFt8Og^sY6%(!YaY2IIO4#onhN83qP{9SjRWte!;-E+CqL$zV+Ea^4=D%sgXTjU)-kvn^)oQB9)!pXBF+fe4wCO#!XVJI zoPkH6fkCN%CBq!hxd19W42(TV&~kza)W->EU^?ZY2s&TFz?(rHbU!JxF8IuOaGL7N zXW;0mV9@EwWKaR6`JP+`jlMk4{SN^uj5-l2jNT_yL3bB1>mN`>I{#@p*!~tsJ``zy z+~osu1IRxjDmq3^Ib;^$IJqz<0(O&13-G=gr^0k|Cjg zF++KQ#gc-qQ6`MFCcpW2Xy}v&we8BoZyA%TYVI~X!Rd&t(W zVn_h_5u_fZ52PRL*HsK5>(?dl0;}f( zt6$6jUZ>uZ!@vPLcfBW@frU{gLxu4b$ovDUjCmd^%$y*73EH|%42)ns#Fr;CAZ-Yi z7trzqydMI(eja@96X=Xd*qIv)e05E_4;d^36d-3SfzN2=hn>;t2|nR~5&4YP9SjyA zHO7(*_MkmO43->@pXaUjvD=;f44h$y zbR8MQ1QbB~RH5g>!tX!#2AhR^|2gQsHBg)x<}lc+_Wr-1yO2RZ0CsLN= z4#gf_?-r0c#yuH|j0@oINCBn29?+i40|Kh1=fU^-#e>eS?18SkHJ4;yTJw{Eq2~qY zZYu^^Q%(lPH7^+$KzBER%wyn+Y+&F{J0#c$PS-M`h;qpn?6=+?i~e;CHWQ(169gB4 z<}3tMd(Shl^zUHs5Pbj|4--(G&IFyGasaheG#VHdX(%$VYJldaJizl)8j$%ZMpgmE z9&oB;U=T=ztU(h-`-nTcAEH3)*1m%;ps!IZ(L)DnCGbCqQZh92i(smj1s1F4sV78<+mS zp|OxbLqOp_c-;jkEko3v~tN%RK?`QB?zmLIV{T>FF_1hU7)^B65 zS-+LRV*M5dll7Y!4AyUA&{@9`a{l}JWef+_FK0N?(+66g+@Z?Accg(Gw2peg2GIEa zCy;&9Zi3bVc?3;UcVZ= zC-KNMWd@r*6$YN(%?u0@2@GdJ?N=2M1`U-73>xc~Fx04TWvJ*w-5UvBgCgL-uvdL4 zL(lp}3>DCF8dQFR*Fk~9dp*O6{yhvXjGw@D1bD=E5+?(=RuEKRs0W4XBuNHE_2mo& z;tCAaAU>$g2{vmLLrwoOh7xtlxfScTF$jRn1H~g#mj-BUzl(qa19(SC|7r%%nUw{G zxeSb;^ZX3^7?{K!Fn~tvKzAK-^zUToXwn3wbp{4j1;{yS;s+SOYl}g0{W}=e^si!A z(!ZLap?@92ivINsEzA}UDvaJ4DvZ1ds*LA7R2Vx?fbL)n2D@(u!<7D23=8^KFwE#* z%h1!mhG9FHyJ)VTr)3<3TiL<1=Nq~JIvq!nR5Y+!-4kpSt$0rVPG)GWRM5PgZ>E?#+e6HL1E0`Fatd1 zvj$YYI4Gzh#$UnXaiH*J>0iZgM1X<83!Da5F@SDQWmp>ws;3(iz;)j;h6Cy=7#h?q zXKJip!5{z{*JC=Mp{l-|p=bSO25=u`{aOYIkljfAb~DiWaBv)h^5+r;@VWqy-(c$c z7c*3-h%+#PX+-_a!2qtm{lN9Npdz@OV-r^(z?WtY62l0F+Na?gWjMGZb-XsZ9Zw8J21SpfN51 z&^(e){{{w?{*4S8{hJtc`ZqHe^lxD>>EFs=(Z7wsrhhwwL;pSo@HvU%9OuP zpmiYVtTyodXP`03_0V%)r<`Pf?CIxJXkh4s?DYfP^9?$C3KZ|_S3=J9?g!B`nDaM;5d-3W zX3$y>(Ec}&xvLpm)-f|gfYxw>{LheAp}6(|1IsiPXj`#?p%=97Lqvf=0(6Ft3TQJ# zGJ{5+1OpF4LV+r1@1MFZg9_*@6m?4+=k4hJ|FQPq|34r#pmR4s=Ocj32b~kb@C4jO zdIMTt!l=Tb#n2D{Ixi>(bY}{qiiR?1eZIkZ24=wr4AP8GBov|NMS#z$VoXv{1g$Rt zyQKl-mIOuBnFP*imCEg(05%n(Wc{|@9XRec6V!RHJ<4D1384DOIKu^5vi z6jf3fG*nU<0#wo%DpWEU79i}*P*h#RpwhdLfk73trWbTR#6qO=Ar}7sBf17^=RyVs zh6Nd_AbUV-b5x!)urNM4ps3EnpwiFCpaDLIW+CVt8U_WhSquOF=x1b55$A!d4+g0L zoiPVm9}F57RcT>Z06wGZ4fyQ60L0mQ3?3k})-!_6R$=fFeFHsr?jb_}BSVEM=-iV& zUIreOr3?!g7ZoU~o?%ewJ;+c2KKte&14HjYh60dTYajmq(R+}gMD)!6A8Q}}{{vQI z!N92E#IQi+7{dZp4u%Ed?Em+!1)UA%%fPsd7kqwSj;ay^qoe{u1}ME4sxmMOEMSmQ zS;D}G9;V>+NC^j2nUzq_*Z{c?v_=~42k03a>ly!p*GR+TEtx?>r2YRpka|^J21dc< z4BqH=AjccRKDeK8pVfB;8fKug`WgxlVFrq`MJE*1b--y}1Ciz#6u{wk@c)l~MFtgd z9Y~z_D>7&>EI0v)a|s3>m1Kqm%uMh!699^5&{;RV3mH5>W`WPcS;*i6N;BZ|a27HI zfX-_JsX@d!Jk3;q!U&We`WYDtKxTo~l=m|-lpv*<3RO#JoGpdKo4ES_y&yfHcmkbg z*T0UzM}?I^gYhVXB&fXzDhK*`L34x>LX3+~fX~xnbOoJ6uU;lt!0Oob`x#t7_3Zk63=Zq}Fxaf$&S0^A z8-vOEtqcb1w=n3e-wfWXrm}t`gTnd^3^EXVz+-bZ>lZO>=x>IMYr@U~7f4_NkHxNE z%&-M&#{{tX3mE2r)(wEx13=7Z0L=k_%vjUk3L5uhV1V5ZA+UfUxqmgoocf6j}TK<7p~yMO=Zw5i}+v&A?#HAYjn|YLoV_Wth{;VR{90zAYm=WQ-ML##9#u@E9{_ z{;7W*!xE-j#a28A}GA`&)Wn8AAY_N`jnSoD3SzrMJC&O9=MF!rA1_po7 zUEBZvs2TqMuaf-#kI2OTf7Vnoun1ga5N2RI(7+(*(7@m!p$NLupeO79kDl!RUwU%> zf9T2l|3@YH|A#eM3_NSH893JDFtCU;|Np)w6MPRlc(wu5uNFD?|AtC30}E(xFUUO5 zI1odGgCgVd3dP=^pnX$abJj|N?^>S&3UgI02FCTP80LV+I+<9(eey-1um|1S0*;3@ z3~MA47#l(UU%!SSpnn}hfEot_V=s6G0t3UecE~;kfd>p6AT@nWu(73@23FA6HPbl< zcF^1kcr1xAbNvd2kp9l@1)#Apq;=|`vkJKSSAo(EWN%YnD}%$dHU{w8E|nH{P7K@=|ltg43#wuDXQxj7#VvNv_u*h<<_rb$NN7Ba*BiY;o`*fa!Z_oE3WKDFHmDukzl>pvy5$0m^(z^2 z)-PbFSib;tE|P*OQ-cP0Z=?EhhKl|@3^oD|4DUc^T!GIcnAxD9;$->&bpNip<&qjz zeg;O+84%MZF?fOZG97^EWoiJorEM4-R)G4eDom*77THWIWAN&q*{lNE?*z*4Aidx| z_8tZs&>B!7Mg~66UUZNch%eyCz{SKApvV*!p~&bB3R4Dl(3;@>bqqO70UTPQ2O#|o z0R;vZkT}y~2Fbpe3_N|gpmJJ3h*`-)QB|Koh50b3oK6s8Typ?iZiCjLgVx}K>d0P2 zr1NM&Yt{At{{YviilDtp3XnRki-8AJ=7RbhYqS^``nsXzZ4!75F$<`?1(mZPKY`QY z9tInb-@$%GU5jEP5X8W#!p1xkZLRPZkY1Ig9s;1S2b(doSp^h6AaO7s6enQ}H7ab( zvr+YWfXiQ%r5>QYC!n#*l4*SmKK;F*`SuP~(7jen3k*~>7lQXW88e7FG=TMk?t*HC zw0~7vJV0k9*dXt9WnzHsb@fO9xv4Le0ko$DyswY>09+27RzQ6qn3+uQJ+dBCK>EOL z?*X}mfuR?=pGdP2d>60)*e&4o(oH)+;RW)m%2JOtAblXe!_GEUS?YnjClQ?AL3%-P z-QU?Yhf&l)5!9~)l^e_&6^au-F~|riFc^aE-oa1-nZpf)&fx|+gVtIzb3@iIu_-dJ z80j#`gGNe0>Q#FnYpfV&IR~>=MYjU4aI;y#XL|L25xXD11Tmw3(1H zT3CSrRK^B?%Qnc_mUC2l85mXh8Cce@XNVA8`EM7vtX#zq(7%Bp1XTX3Mli65asO*t zzk?wFwAP@13Bwv>^ZR##%IvN=;Pp<+88(3CZ9sKCSj__s)&4~cTR`qW%nkqjxgI1o zvl%pZgIEW$AKag_>EFO0)4!2Hp??$jY(S0vEetySTNw=cw=tOXZ)dRR-^btpZP!5i zneS_${mc{Kv+XB#Z2+x>?K1@5Q;4`L4YpQj1A~N+0)sX9T$-s3IsKEt=YZ#c)+nfL z^|+%}YKF|a=v!0iw)_xHspZT1FIQ&`~cb4#|kMoK;s{M9N=|027R8Ob7&(#>r+!edl!0J z5$n)Ec7f(LL2eUc_zym59%LU#9ApQG7F@s}0kRj#zB_7$o&p&5@i91n*HiEv0Izig zuRl@+jnOoxfZ_oXFANMA_U&gdLEl@8ww~JpGCuLv1)6Ryfc78vPwLtL+GE=n0KM-L zbjRgp1{EO&27Yk5n%NuxTK9vt21f(O8XOHVh5w&HYi9ZY>_yg-jbsm`Oaj{j(hJJ-V7*A{LF?AQ zX72%y2PweA8)F~yYuNoiH`asp%0t#uK>7sx89@CC8Bo7~VL^u~=za=N_=Efo>L-Bq zvxCks0G%bwq#&WHCSZC+NP&TS9e8z~fa;nQ28TX=$TLiYxO)}evxqqYK-7Ec|JohnN`LHiLDK=#30fPm=?Su1z-G^cnYjx2UKfa&aJj8A$ofF(7Zj%;{cv&6 znE`tk;PD78U%~fPLh{Nh320sk0G$UV(7?bCn$zlO0+|B7cNcutNB_)5mI*ElydZPc zp>r3Yxlt9S|Nr|JF+_mYRDk9mzOGwOT) zKLFVavJ+&s%2MwOAag)td?5Ymdl?j<`U^n%VP`X}U&;VEH@&4{P5;csH|s%ZZV!V3 z=sdCY%Na~mmU>?So7cji0E#Ej-n9OiZ80GCfW$#GNF02};Ccp&eyBO1xt9KA3_AVG z84O_ee}dGjK+OT`1E~e4vBozbaj^VS?*}0Bp!R^z8U%@h)kEU|>L2KxT`yqg--7cG z5&i+E5s-aQdzfhKpAX>kCiXzi+yb5V0Evg^u=&pi3=0fYLHFc<&JTlyA4*(;!VGj4 z*&YT7sNbP+`Fsg9E+4F43Oa{hLlxN!(48fqd(wzBD*|d3vEc}5r-R(K2Q)7MnwO(x zy6|Cu#usD%%r?B~0u)A|b5PJ}P#OYZNcca4oqvBprHw%zv<8!bt0-|aA4pAotXx@` z1_sdCON>k$+KfL=sDQ>bR9YBVR5d~6(=1gY&Ef|2_ZSXHsDjEPkefi` zuMCekv>6{9P=}cTI(vCd1;Q;1EMPzJg7q$tP-QsapxTqizyRLo@SK5B@H_)ENH4_g z0;(YML=^siSLI+}F=%Fx*GXbv6an2O#jenxBEg`*u;hdy!x2bdzh4t{Pk@6mBTohk zBWC~$qpyIP4(J{k==cjLUkEfXBr`Aws2VggFbgCwh%qEMsDjq#F)$Z2FswVF2r>h- zh8?m-(13+e4Sb(92g5sv9iX^jY|Bs)T>v^85^|Of$UM-xEm5Zb??7e=xG;EuXcRLe z8010obj?j6mxYAm+o)5PEb1nr}{k)|$cg zOo8UdK<9ihEC8=LGXd}A+lDyX9MtXut*-*L=V13MtB5f0t6lREQQPVxz#stG_rR17 zSu?yu4yf%8ihodh9CSxASeyYo z<_q4d3F>Qz3H^TtvI{mApwi+a0a6Fn2Wo$V_KY{)*fQuKYD;c;$*W8V*>-TqJx@<2WTFd@xLHw zjFH9v5CdnB1EaqL_-7(wMJsJsK!%K`}uOrUm! z25A2{Bf}q&M#wp50tt|QVLxae_6`OE(FY8i#*+X4_s?wU0JR}hSQsWi!VVn95&{ei z`$6eNSb>2}o3R0OACi;}BLgEdBY0d)9292#Gh2H4moOM0&bF*|B!Pji ze+`39e`nVVkb6LP#)D`<1qKeV_$tU=bX9K##`UWibOaa}Sl6#&Pyoq+)Pcqv)~{ty z0Nuw7;)@<&0FT#+Jb>(%5J&)>pQxY;@(Z>w>R-m70Fs0G6Et22^=ARdA7Fo?`LTZ~ zSWgeAPXP&Uh~Gi>3otMwf%J(y0Pn#z0L2wZ-0 z43=E85y^wx^1}NWx#36a_E_nYl=)5nG z*ct`X4@m4UNbDa->^}&$83PiV1&Pgp#O6U_3xL=lH>^=G6M?z`od3alFhOV9oHGUQ zWn<_QP}Xq-->=8P;HtsKunatw$jZQaz=@gdgbL^^32}x0f0!9GR6*u}+HMf@?i_)Z zC-C(VJqsBa)Ymb%fab`jtN_I!0|O%qc#SyI`V|Z&>p}4WU%MODr0dAwz~~^LDxko4 zVf`uw70}v1(3mHKHiu%5whwrnBV$d3B4Yw%Zl-??g9}KFVK0L{1AN_{FGL;Ey1o7# z3@-gMy8?{)8SKI5QQUM;1ofZ5?f2G(oL)9?zgqzmhbl{bKz%0(0S3lBpg!63m5_N9 zLoEh*Rqy{lbQ2la1r!*!g5*GUGjK;VK-}jCu@}vKp!j9r$!uWYJ$6W+5p;h&<1)Bj zi31G`795H_7JlG0JIpc%6qy;Iep?T*mw~^qfr0PbA$>*A8b?NOj~Z;R$RRf2dm?1)nXf!Uo>^Edg3r0#nno)btOMJm}01iS>&ZOkna5 zGt3x})G+n00FP}-FhJK|g6>xlbYx%wnF~52Uepn?#|36a&r&lE6#by~GpHTj3Oe(k zL7``<84r>?Xn#7W-jD^Ehr!iGnl5YW^e=LVFvD`Lx#N!jG~}9OH?}rkn9AV zHv5@MMCy5nV48+_@KIC#v~~ zJhXl>qp4L;{_%!z`)QCb~o}^ARD8(N{f#Lv|Iy?2ZF*BbZ(Rk z%28KkiyP{7u*DJB4BY;JmoZ3Yu)y+(3L66( zD4(GD1KFQoccRH7`x9)w00RRr*d0AxJ`79|pgGeuka5SxH;g$MioMHF>N+2=ouK__ zpfRgO3?`sD9kIsd$_G%L4qAHwI^$Gzt?38Q`3#_b0z*HfodE7HEMYJZP+-spjlqD{ z4S@Wo>Sg)`wDzPo0(76H=?_&7(?1LmC)mJe1!90LPr{r#GL z28OjWLFc)diKu3q3Bc6#g2pN=7#P-^XJ7!W&4-DD?wJr^V31jB2|a%Y6n9X&L2d`l zor3)Xx;L-~bhm*SgUV9VA24@-{G_UBCIa#+$UcxC);cgStXaSSx*(omO#}FB2Zl8V z7#KkNB-SP{FsxNzVCVt*8EKyfXj~esm#?ycfgjvn0`2RV4H5(SmjT{hf*fXo940+GA>&czdJHV4 zKNvXHtYZM31qM39fuVmrgNeBw0~5?mpgLPvk%47RA9#-jo46vR%>_$GpnV#7CL7Tp3=B*vOrW-gfGWstko%dH3RFRQL3V@NB1{YdDohLxpgaqf2kB2?UTdU8&0Ci^$D2>4ML&Gl(q#r5|@&}~;XJTLi-5H4D zj(qSQT96w+m<6;a4=k@#0NS4svQ`f={;I+Ry5pom6=W~SE-)XW#v5c8cnkS|Ju^V2GcbVS161yS!VMHQpg04Ifzls8_zV%SLXfxs z1A`GL&4Kjx+yv`oG1p_@0F_-J_kzq>a}F-f0@_yua<>X2gQZ9!mhm5@FxQ! z=uQfd;k}R(?-@*QFfgsPU|;}^>w@lAHT}uJWO{>v4Rr4?XwTA`nG6hTXD~3B{$yYQ zsaGZ#uzP$!>p?(jLH$us*soDCv*~Z_+5r+ISZcu>2Gf60h!&Ce768x2QoV}X)-cJK1$_a9W&aBB`R3piMj&%Re(CRT=waX}Xka{1pv=Hma6o+rgNEw+r3Rq; zO&QM%DE6;r(CJ^pV9>u7d{&=D|9S?SHICr0>jA}!N+tu#8gB-cH9ia+YkV1a*7z|9 ztnp_M0r>~yuQi%?3n1ZjRsb4apfhMxpmWwTJ)m{K9St4o>lk!EefM4tGZRo)3NkQo zsxM*C>4Ds30J>wCrH>7=e+2Aq@Z1su17uHEg92zTP#-UYKp#5;PahitM;|K#%lfqp z0(}yodswc3&*)sggFyr~=LT9U19BfIT|wM;1~&hR;yzG2qop^1t3^1*z$C0^N&jpeo=1+GAv)+5^2?Mr1K$oN>wy1}%^u#i3`5^y~zc=?o0U8VpRL z43Kf#DWLPR9V}EC4Itw%AoWWE7+6}oAm>al27<=}BSH3w9DwYH>hT7b6GH2}8B{>$ zIf3-7IRh5sWpJ=iZE=CGjbf&Cl&|zFspvd^~fFkssc<@RG1_uLG&>0;d zGejKzgI6w#JYWE?d7H8b;(iea21ONb21d{tPLMhkrzn{o7Z3|vo`T0fM0P^m)&X`0 z_ZrYj<^};(&{{2!%AQV$TSQj={{`lEfk+01HC~{#3mrQ^X$Ta?>p}D0OTl|{6hLE~ zFgJkgU$UA(3pCdVQUg=30y+y7Nj=E_pzvGc%D^FVfPrnvM+UY&A5c6oFsyk4b{p$D zcLtRn=vf47-ZC((IS!sX1f7utKQjt7-Jh(0=F1(R`IP?24IQ8~rB-a_(pLyx&x3i# z3iAGa$UQ3_>z6Y4tY5|u(5J+}(r3=V0XicYJlE3K^@V|{q5)JUGd_aeiF5vdVzU5v z?KS9zWbm2Rpfw{sOP#}1}OYMbAq6K-XM2@Lb%Top5_<@ z84zoOKxU~0IoW{D4q^bUod%7^5MkcBKn4b}2Mp{gj0}AJD;Ydg7#U6h02XybO`2T;Pw6%T#gG-N7 zlmY|822h^b-M^N>1$4(}|D;X}6}kWa)V4-xOj-oqyX(=nn1Mya3v&OnNI3)e{JOS9 z3`~>OFfjJ7X7FKb%1~s?1?QbbApe2(Vf3$usAoKXKoNQ`-)sgk0nmBy9iYC2x}{kJ zL!^UZuK=Tis-}~N5Ca1@gXaQ8P*{S-d#0%|Xn?{Qv_1|L&Y_U<8jL z2r)2-_pf2_>2qda=wo7F0qIxCVqj$O0#K zDaenYa0G=HD6GKh6u@VYnt;L;DL%mSKm9YC!RCR&7^D`Y25P1#NIxvTRI(Wu8N9)9 z#RiHSkX<0PAiH331`@*-XP~$RnF&%4iaQW3#sEDtqN$-n?HU6kD2=OaW#AAy^dGzj zADqrXd&w6t$S{Z%901)H4myum^?j5E3tum9a>3)}ZnjJiiSqV`1g13AB7&@Ikd7fBDJ`DI*(HK{RNr#9V`cWt|3t z0;sG7-F+%vFo4VK1_m}2vH$=2S3}F}MDRXfJ{1vonGGt_L1i|p z3L};>S_Hj}o&hSOqe1szf!A?@?q>;#(ooxK7BR^Qe8;IrpECoCh!2A%gK$EFNC|^F zh;DOYV4CF1zz8afLHi?_&wL4sFuwTAgaXxKD$VOfk6edXAa~prZpLgy&K@=w;V_> z$Sx2qBnUaLSZEq#osmEp9 zPe6CAgXHuX8JGkV7!*O}f{G;gd=A+)k)Zo1nkRtTZXo+W>OlVQ1D(;q$-va#-O#bd z6I`Zn^l>pTsAh*~FlkFDg4&8bISdS-HM*h=;Cqp5K;Z={KUJJU6hP-BgU$|Hdlu{- z2GIGgsy`T5!1vMaX8^7JN0dpRG79(IYS2B6`x~I`z76Y<*7t+@UJQ^mG&fX{zmWRMkUgtWgwst{825~(` z2GHG^qTul8=vrbU(ZB#Y(}qdn1RJvk_-rgb27!PEQ22n#8`W$l5Ab=|lR$0gW{#ev zW)^zB42+BmCV=-~LHpC-b+%x)^fz=c2nc}7c?Q1@MbJJ2)%Q*w4E_fcMHVpdt>3|5 z0uIlXh7NF94=vx<8!#|{_H2RNrOL^`vc{8vp{K>n1#~xd|0)I(&=@jE4kRYzz`zR@ zo7tc+r47lA!dN|fz+>4VPNP5pODJ{I%7{2bXH*hq^<)hf(+as z^Fe2JgUlDxX5a*!Y1+pFNpHQ-^H2=eF|Y_8fSjAAmc+mUIy(YX&od-}>v0waX9H!B zdqDG5U^~I`9W>x z{R}$rwd$J~6#5bC)dL{?=e-8d^mJhTb_SF6+ZYT$=?Zio8N-1MstgNuK+Xc&!(g#~ zD}&DZE#UpJ3ZQWkfd+=9p!MsZ_O?hP13QCoLj$;N+}O~ew$;o9bjB*k&9F2EDj!te zn?*43Pf!G@1GV$jC2TyHBu*%T)Qc=&;8_pa?*P3w5FFp2J{toA!&+emh8|ClX$%ai zS`45uK2A{HgPc8qHD1Ae5>Wf3Z#4r0s13)&vp}(LA_K#^1_lNp1qQKo-jFeUkf}W_ zpf)}OgFpkcyab&o#!_%Vby1WC;~@#f3H~5e3=CrVkh8#AA|Ua~EOtV1NhAXk=#FC% z=l|b8s)Q665|dn8wAxpySA(Vd%{uFP06l4|I-U=d7! zxKZs9152MW#Qpg40;q06(Z&C~!H}*w8_sOqBwK8R%RMXqgJRFA95^%8#{7ZAO%-I=Kvt>(@fg0fd&R3ZT1_ zKz4xK11nR(XG!{1D6U`6paCi~)GeJnK>bN@*}8(k0Hth&=C8G&vK4f<0qAT-&={dN zq+A4-t!o%GKxH4u9#GjQkifv(4-&&(wnFx0pqH&{KxeElFsyB1VCY}V0A6F+yA)(1 zxSZ7j<&*xtt^*)@K;sXf^aQd?^dP8xC865K4=rbZK+=}6Bm;{u^o&3?Wd;^-|CW`3 zg8_U7Is*%+zXUC3nHYjNv_Tk@pO~C1ltE=L=-di$Im&?Cj)s@L3StcZ!Shi4E1+&= zg}4>0X8~xR$`$bZ7)TVfroDe9g8`^M1kdBGV$e{{Ht!MjW-tMbmx25QQrFWG1I1XfX)qujcf& zNB_)b9#ESDR2Qya0A7coAmG3t#~>8Y&_5BfmPpOe$%9EtKoK-v2&*@t=Ta#2uV&Eb z@9DMy&BKE32sH9#U=(eD%=LrLq*8MN@4IJIa{{erZBSrfDrjKRYfuF3F@l)|3L{WD z0F7mU^Pf;f188gkG?v5o(*cwhb$VGrbI?v6j4uNe1r{&}u3yEV0e0VN1`9PqGZ)a^ zKp=AjmO$oo1Yzshu=mv<`D|iChYBNuub3l)0>}(d8UdMsl-2}5X$=&|AoF2q1G&u) z8Xo|;U5o)zm!X>h(hD*Z-LD`ql=K13`w~Fnq6fh3brnz<2wHm&Zm&b@`L&-QV+m_25Mv1-cY)3r0pEkX zi9rT5Rsb3^fYc$I!Sg@hGwb&=$Ux_N90VE|Cahn|-~wv<8E4 z;PNg6>D+ICPw zYC9-{^upQ=>z6Xvfb-T0=s7M+L1$Vubo7JxmS!$0T>t+sabRFs;>EzWCX#^z)c)#O z&7h*%W8<;Ln}K1?A_f&ko(x4$c@Ii=0t-OrWLv0${0~Z7pz;h>Uabe230gnAfCOR=K9Cwv9~H$dDsQv@Baa7Mac`))xDE1_Qd;s3F2ksk!%9EGeoYs|@4a4T;6CXZF9r_K_!THE zg67vieM3fG1;sU>yCV7+7}g{)FhJ9t3@F`!?&k)lJ5L4%(Al=2IcLy#7U-TJbAwcO3%g(pn<^~6i1NsRsl(GKOpIi@qvS?zyi=ZbL4g} zJiUQVnqdIN0cbxBD15TGx&&wr5@a{190P}~rjrLFCzi17YUt?kX5ava$65v( zQEzD2`ar^#u@^0DeIfns^@|~EOhEIW;5pC53<{ul1lbE}SAojWHGT{n{p%TQ)Gb3a z*7!59fbO|qlvGdz^`(0{p<$~4&eM>vUBzGl4qI=?y$x%#7#KivQ=s{E)m{dcHNNn$ zwLlHq4KkoU5hzW9_F;n3Bxo)dl&3-Sa-eX4&dd3O=2Agnt-{9gyjR^Feffb3+HH3{^=s3s|FK=CdXNJeLKMVqlPTYf|O> z|6f;;L0muqGM5Kl@51TPz@W*Y*rOT#1*DMC#zT=&0TSk*^aQ%&8g&21lqPUF!UQ^l zSTK=+LxqQd5wu2CFcCceAtVSXTZBauA$kQE7}(b2FfdF3o#n#7zyR_u1OEYSPVrb&o;NYb2rOXW2DKl+V|+6k6x4#uT>4xfZ8tTw|NlYh7F0HX>M>B5 zfc8^^)b|9rCU%sR!NSM0Ht4$U7+*}u3I*N&w-Et)iI!Q0+c2}^YM_dS=#|h zlj?i_Z&<&CAz=DCh5%3)Ft9W>FtFG)F$kPHr1Ox$!SFnTJS?rQUk|$Lu|ZWpf#V)% zpCLHCFgr9bXmBX@XheX|&0v&qP-KLyCvWZK0r?ShMiS_ZEp^LB&~*slyCEgO{R~k1 zgB3Kl_Zs;QS_uILj!U38?QiWAp}>rTU^7-S_<-yeHDFKx*H?;=d7%ET9`HE!L}=ec z&;c^`2`WcH;n?E@Da(4iA!Usy=!{O#J#{_|3hm1nf(&~Zm_!#q=MP#tWl-Ju6nu6G z==?!Y{uF@SQH`VyJv=~mg3JJgi@GHwJP`XrIQqbTLDCQM6S^57y&y9{`e0^&&E3NQ z3e#G!8Q^gtQ2PFaIQJb?FD_y5!KIggx#?hY*FomXbPqC!2q-X^_pb-f>Es~R3r0fH z2=e-4(B6FTJ=Pfh4Fa2q!>t6|^d2@4|v=IVmY1^H`6R|o_Di3Vm1 zeET|rL1%7(!d)J$4~Jjyxd*iOu)ndpM1X;VcY!9TzYaUE05$GFWiwPA^8zgf22dIX zwUtzy%xpkwDSCU%T>4u(b=G!+_9HbY^teIJi-V-07bc*!L!h}nP&oukv;E5%O!|8p zKy$|ms%t$O7~U2rPCUlI(7u!*NZs-tcz*{ty!J3ifbs()HlQ>JN&D>g z!TxUo_m?`rZt`bf=(mKpX}vy)Zkhpcle&aQ1H%so#ffaBy9pfMptZc9aTZO`I4}Fw zHJVNq;Be~(jSZXGfbMGP&4##fZ59qUE@sfc2)D%y8vVW9A{IFeN}w~fb$b{XMSB^z zKw$$4BUt!>_~7t{?va6)5i=VUU}`|?-oa{?{{IUKOR&3JJ9R+jfZ`5RwxZ{A0&!6T zkBfe&Km8aOz-?Dh`glj8KWB7{SX44dO_pF_(6?k@6t}?ZPw={V9RB2h`tv81{0Uw& z+1~+4E2P&-(Ff$jSm zJtvF)ncX55`3zce3i324{E0|=#$bE8pz-46(ZKL3LUCdm zEM5qg9WZ-9X#h0-2MPnw_#cQCg|1lyg@H;7gCcsq0I31Vf$|5aE`{eiR!F;9fPsx0 z>^?+X+w>sfT4ya%T!Ye|!4n2%XdHRqilhF1Nc^b2_h?{ve?oDx8lXxYOUeMiDpu7S~D=<4@=@g&2pg9CcdzsaI zfgU8SgY==BkIxJN23Ae5+Zww|RQN&T_^c`m^ucC<$6Y|}TLA`E`8AeK7NB+G{jHrE zy&PsPDiRFLAUCg-U@(D&H*(ymurT<8B#^Ru38WI8wEZ@L$3!pt`AU9@% z#$BOq%);qLKahDi-Pi+lBY2kq1A|}#%RSs~WVsHO1Kl}4vq1re8_$B>*xIQ9vKJO^ zps+#+S=)X>_(88Xm)`7fuaUkp4@T@ zlqULnp>YGh?}w!v;wIR*n-h2~kH7+!La;a}UfQAVZ83A{c@C<#A?pJ{=?$JP8yh+V z7+8|mC^&)on&7bn0`Y{RhHC!ngZdAAawh|W-~kqUus`7Aig5o~g2f^JgSdsT|FpsW z!_jsmkiKNW_O*6~5E1t%YN!@AO^~pe0A8^Sp2H9Zr-@cb+0nBUGUhC>0J0VlU%3I+ zhhZKwr2dDS2McRvNd5BN}Lz*5l!YTv3pft-U2sxLt0 zg#ZI{6xjTo3<3R}T>-`xp#8!Q4aj?i89{fVyCLrd4E_Pt>kZaRg?+SxBm zK<#W&#uWq@nBIcyfS#uTp34B8O9eXbs=pbspAt4V3Yymg+1;yY<^syYYn34F2vC{> z^+iB^02Ma|MwI*t8gInY4-jBrIt#MDA1O_O`~va^DBXk3$3-y@dY&vO&4JP&NDdU< zknm#K1vaazo27p>LjY(F0CdNepyU53pnLjs8yUC+6c}9lS1^Fq9Op3bBs4JSa47cZ zM1jxEVVsko$O!Alf%;)Hp?z-HxaM+(0PwhGYo`Io|FFI?1ADFm18>QAh{(B2B5G3nFsPKNRHfa2bHWfq))HL!oY|t?6JiQ%ufOgOdOzi(PIRk)$|&) z#t~e`u)^kXqrmfs$n&@$dqD0+FJq=JVF&=p8FVnnGjIez%54`&xs51i7~g>G1Lb$n z`~v76mtLf~1z7s)ftEE4ELo7Wz63L^WAhitU7+|7U|@ud|AET0nGGGFH8!CBl|aoR z!ZN1{3LjAXg3=)@{Ue2U8Q5;n9R+I`eEK^&Q$XiWO<%_l#K0WT09vEZ=p3M|3R;WK z6>xxoujI@1h(EJU`+v}Gz zIKc1TT+Cq855k~4y_~^8ClRzZk5LD7{vol{{oH-EFg6%j0{2|j*Keca6~r;n$HCo7-c~6ptCtd92s~)?(XmG z2CoN2^yi`T(=$53`_20$7#KixImk}Xm;ti;*Dr#U?>HvR#&qYq*x zXuMp2fnn1+J_d&V{%-J{P_Xo)`H+EGKmoFM6x6-}?ezh*Z$No&ttBLXLek?4@cHzx zbF%uO6g4RTX-2+NL$aNT~90TPMxLL6dpgVmTcruzG zW?TN}I4VQ;^$=q}TyAe-DF%!Au5u21$=5 zkUv#b7#u)$f%6VDECm=CAoG76T@eh-2T;zwV&(`?>_zFnglItBCJpv~Pv;T_0Yc|x zg@i!$fbQOw>F@9IVPG$4U_5_95qw|F%*HpcGbKTD4q&$}4FTQv0Z9X(GqyG`h(Oo= zK-W`u_JG#@fX1gmYvR@@L@9vSs^>hw>!#P}`DuXp@BIwc=!byi)c5{xSfk(sx;wiA zw5MT>f|CtM4QL(I8U-itxhbHvP~iS(V?)RKZ45f#b=@HLRtAkV3d!IxQP7$LVP14~~714Bs1*PK<4zlgzC*?5CMfX zh&N3OvSwD*hkOH8+pL;T?{->H-gjl+OrG-*xU$OdyUnN(6C(V0P#D>%%u$s zTCnh3x`06kWIjlI?EwZASeUMTz#s$j`*I5g4bUAhAT>)B81z8y1+mvAFc^U1O2C0Z zc&!723CQ0d@je~MnljLu|NgZMEkX?pT#!9S4GN$;sz77$Ds2D%f$}Z1K7#9IQdpo0 z(gQL}bOE$Y(AO;kG8eRu1w@NN@4^vUz`zeOmqE1R0OQvR<^GvnCm8rE4ygY4e}Y+3 z13cfVg6#~AK#(a63~E~$7(sEQ!pI=Oz~t8?s=y#+;0!r`RE3d2QXmn0zJ-)PA_K1q zBZIU+B4phg=)7W(3H{xj;Px5pUan=@@VMsy%Xf8x*M5QTwPs*oSf&M$2g`x>3#)*} zl)u~ng#-8uA5h-i!(h^<2icPYS}!X40J2XU>P}t;rejUw3=BL_cY^N1<`IFeH=Sn5 zpw-{l(4(%&z_?74K?@Xy;I-F=cT4)Tp>dJ`xldlG0pb^-iJ<*Jp!1w@#|^~27;7?3 zKyeRRlexx$fd#Z?TO~P42DDZiq#m?Z8)QFd4JPPZ6_8k8F=U)oD1iaI4_l}Z;ug?8 zWKcZzt~Co_O3+Y+tuO4;V=(ClpIpPhz<3_K=9v|2js?Uo!VHkT_@H_US3INJ-3Qux zr^a9+;J_fHbC7`vbfymId>@Gh$o}Rjl?)nFG8uH3BpVbNRWuZtSi$x}&eU1ZfPAJ7 zco#m%3=steR+U5l|1&WmsdZ>j6)S|8*?$P+Y6b=sC%76ekca?i&8S0zs!#%SU-2OZ z1~qO5M$sflSq!=dahU;w4yc?~yY~OTs?Yx$Vh8@Utp}aQ3~$>-Nucc`0q;Kso$Cmy zZ$RT>D$o5iK=o43W6-@A9u@)_&~_u}3`WqH^)VX{m8E78D!KpvfX>b7UBbY?xIjV` zd~ft3@EwK>42LQdMOXa)zV-oR9WHpic5;Y9PXPmix`dyBkOVX?CqvqlYQ;_-ptPYT z3A%qYL;Md>FRxHkzsDe;78I(WW*8~~TGQUQjDewV1?UW{#(=)% z3@l6!G*neuLe{Kb#sFTk1G+yRbpPG7r3_ji_5Cv&1Ewuw(CJ&w0BL8pgxmqiGat|Z z?fU@TyJ(`)5(?G}N?U!Pd)N0c*a$H|_O|wMGH`&*U^EU;W(;AFYGY$y1LZlf254Gi z2bFRE|BE#;uz>D25Osu#vw`MBG=xB96v*6Ztl+b)Z3JLt^UTHo(7kgod61hx>OgC{ zK{Wh~l?DMC`?Cv{7MU-~#Cf`vr85B?E(~+V}te`_4f25v%t8|IfORfn(iS z27&&WjVf5wbAr|1U=UH^XW&}Q&%n@k6Hd!HVsPHmyEj-J>(03jZU#dSC7}wnZp8@9rI;W1vI~_siI_y`U zQ@aA(#&7D{0y;+*bpF};{R}#wauNmnSIp1w!_0 z3qkjQfc8rF89>i61g)jn!vH!<;1?4^hiYFSgUmVy1{I>z1~5phb6}7W0+suq{`pLd zGZI1f|AEg)R15llf+-kOpZveG&VeDIAAIj01A|&nluRGERlxu{{GGEObT$DVb3pRo zG8J@g0rbp8&|Yq6-w1Rc(|+|iHQ@9A`kNZSD;Ij4?t;&WWM~4}4>>0abS7heUqeq% z^4$%+=k9I+oj)&ln1PGISwmT5Ap5)9xCE7?2v&dkkVB>h@$PGQ!RS+QATm zdXGT>>RFv`$n$fd7LdLw(;ZO%cKT`t@Hw1@ISlfuz5jpcE(D$F3vCC0+{c^Iz@W>a z*rOYVX)hxDTR`rGv?rL3fy@|Ulg=l6pkYL7Ss2LN`%$R^MgQ*LurX8$i2P8ZhBtT~smmShQ2)f$=DLmol z^2Q~A%s?3{?P}-&-I1;8b$0@@R)k`2@_+C-%1q3lbj?%%wI`P$p+U8O4a6Q$+R$AH zo(F^Mf(g(R0lpYa#MdH9_p!lJw zp{IW*Lrjm;-31Jio(&N58JHM2!w!MX?(R%6)?ly)?e%BiNN51nuZ$fD%HX~dPr?BP zt^*B>4j!tYF>1yg6^g2-{{QcN{{MikBLla90uy+w59|i6fCdIF4#gg=c(52_On@RI zbPN?VCLqYlAf)n^K_0x{jgf&>LrfA<1ND-*wkvd%*W z1px&nW>B1g${~<=@436+_+)q|z{cPVy6=neH%Oj=>4X!ra)OGQ0BGO&|3AzM0;&QG zj9)-Gfv4}DQMJcfzGEEWQ6tyKylyJ&;trj0R{#wm1B2z^tVCEXb`&x z+OL4P0c#n6e0pmG}Q&hJXlV-9!dH0R;w(^Z=?;Kz8>e-v!_4!o;kgtkcNABA~#)&)|GO zS%r~7S)36v1|Z4`J;P-QWUL3Yw-OY;DoL2;3bHbA=`LhYMshb&JTNeWjc$_AU+dwg|g^F26mADk<#cEkeujY1~-s6 z=q`E?A2e1Aasy~?MNpA}7c>{E!pI;ZsK@|HlcJ)E3|1g@X!e?d!~_@^j6r%q{oeJ< z89dZ2RX?m>!4LpyyRKi!03JK-U(VnGp2uIw5F)_9pbkoa6&Ri}up~Hv)Pc-pV2W^JIFq5mzQhS z6jT`#1XM*A{Qm|zXC7of-0t@UiXi*pb~7+AFm{9N{{IGKCde%yH-PQmk)a531G@d< z3jZI1)Cw>#908Rdpz=bL6>^>hQu;>Dm*6!X0t^h>!C{LiuaNV=Mvz$o3=Hc)YCvWR zvV!+8GYdk_a0Qi#;4umub}WSIp9j*9qz2iJ8BjG-L296OkWlV2bU^jDg7hQVf$Z0M zsG1ryHOTG&&+!T{FcgE-K;0pr@&;a)f$|&3zoIHX803-cK`uL??N(47_Ai2gK?2;) zQsD-j=XV#`J;>_(7`r7{K<26Ng4H3r30a*BGp___E|p1;m4TG-ae(^W7UVCGJ)k@b zs#8HUw5&0Qsxd)RgX|VPs2Xjs8szh_*|`3yw1k4o6_ur-ptD6m_u43d)Pwua@bmk* z8C6Nkr+XO)7fa(~qy?u~#@nQ2ipfz!f@6hLx zLQ&>;m>2|9LE}BpzD$CR4F7)hIr-rI@1QdW7+A}ibPqB(!21+S7!*Kv0t+ZG)iNFs zPz9Iyd=(80`W%Wq`tjf}Vf<5}$OxM=-vPNB%~+Dbo&kQJMgmwJ%KA0X9csN@0fyjx z7zrrzVT`>6ioGaj`-jeeh0pZ$kbb7&4+eR4$^Sp}718<%a61z*?d^eT1j+T!=u`pCJAmfY*XZA^0Esc~IH4%Oz~sKh z^6r)X?oJ70v-IQy+;4;mHru>3Lx`A=7Hq;yE|1t=7HR@ z#`10hNQ`lH0!Y378lAgWKxTu)RQ*8v1(>wf=-r*r5A{3jt`L1iw01qh?>9hc2_?L{ z8hSwXGcYAIfZFzqT?LA&tHEXquRZ<$0L*OAeJuKn;I_Ot$P93NOTg}eOZ)>8L%!Rj zzqiw-e$PbMF*67^r=zzaHCChU-|BY54?Hjw>bH^JN9Nh%;Q z~J`WCr{GuC4>1`BnyQ&xT&mx+~7IL(I$vl)>{0pgN2%qk-{&hbqW! zklR)L{{Qc7`F}w7AgHa+2<~Hn?SuE3lED2xl>Wvd@ZC(HGcN1}6Bz_Rdpy8xQ_vX~ zy$rG-K0`ma%`XUU^Y35)&6W0m+Wm}cBv_bPPAG!f@t}Q@Yb@_B0f);f1_hOF26@JO z2^MhJxD+UY?%x2Z>+fjj>EFSipvrOgLa!vq_Y4fol8`%(1QekCycTGix8?4E9`FbS z0|SFk1{-J{=9*scIV@mNm6p2))-*6M^mKvmf>B^}E>H!XQzF2?*bBNprGGWVt*R9a zOlvIeEZ5lCd<2l-C`be;zz0}E)*r+*EDLVs&Rk7^|Yi^|fwdjuF5YuD@qpM4AV zD`QIrDDErP=py;=*xfa%exNfI8H>Pv1D%hW$N*}?G7BU!NP^n+pnL5=>8l@u#SpQEclagEm94U8!#6jjgv|D$g4|3BCrpu3(T7#P6uxE30Z;F(JX z2F5k;coYPkl>+lme|tlZ%F??>RF2&}q4NChnVwY)4B)#{eljpHconcQ_(!lYL>^!R z-HEg2H28c(F7Vwctqnb(@IcoOx(5n&_Y(tiL<3`TgfauCKts=3@SMv52JVOh{WCge zF!ThlFeaT)WL#CC3Njm{mf0dfv9}juKS*EyjLtbA^1SX7-R%Mj z7sm4$s-Sri0S1QeYq`MpOo7vdiW39V8YM`&g54tn_w#B71z6mvRx+@G$^`)ihUaTQ zYe8ZD+JR8R%p#z;<`CHL_rPjk`O=5MUa*mY2b5+78yUDj=}NGXfwLb}2d#soTZX<0 zMb)?Pbaf7tPC)XYz6JwVWCH{DxkJK`euj{^A_FHlJ%Z8>D4u5|D601T{|Aa&(4E4d zv<#L9$@OO_s;+{>y8r{j4p7+i!`$V~04XmR8JGnV!S@5OfX>JPr8jUG?1cD@S>=GD z00YCyH9L^=6R0d@Sh7YBnxEE#)=l1B!}tW0&lu)`(mLE8F9v%-M+Py_Tn#u39Km71 zBIwA#rP9M74^FSG4LuCqCltYHl#hWC6z(AV1Q`B3VeFG&0sE)1p@#wLA5eQvfZ^ZW zHCj;nL2)I)zz7Nh2JaJ!khuDHl_5fc1?~<%27AGS3_@Tx90d2-SVRv(=fIjeOF;ex zjXyIqNT@QnfX15`U~9)285|@)ZI2#?98jIgAiGBY?vnoI&H_-K)|1S@0J`gyAq7oO zf`BS0?KAiWD1zK2z`(!{4*%xP9FU*E`aqc%qK^e+h5!Qt6GMW4Du@k=1CU?9VF4=3 znmaQ<CERr@yg#hX4Zu`x<@loB?DG zT>>HwvSW<}xDL(fpV?NjemP`qrAkZakN)KhkUM%GFmR}_{Quwc6tvH?^#SNUXHa~u zUkaWJ1g}d0&1rztfYv7V&%~|<9CnCxSqcIN7{owkfZFMxvPtkDxZE%lJP2NQVJdhK z+$XgZgyb(<(Swk2u?hVQZXkCX{`mhJbbs7}nG9}IIw0rpFtT|lF6m_OK@Gp;3E=Q+ zZ0G^ifol}*7J$-?iqqW*YZM^uVfDTL1J)=&+Pa{z)HMo_b}VQ2o7{Kcu92hv(I56<6QMkJRqy`i>YZUHY0kPNbVX#@FaCZrqy`8~gjl$g( zVD>f!lQjx=*MQku84T7a+}!|XZvm|zySoL<-V9nlc6SGuy$Q5t?Cu^gdn1Fw8il(D z!0ZhSGHVp>9s#qLFl<<(aQ6h5y_8|g8il)O!0crVJJu-Ny#N|-6g|kmzJ3A2jQ*L; zC7|#F#UY3W%{zkWX3*UI2GySAD4F#O7}f|RFl(=0z_6fyA43b6?g!}d3&mA;WL2d^533O&MgTo9}&^kAeA4CZAlvwB+W@UFt9Kw zf%QY(-=PYcvjv$2Kj*Wnn_*f2gAQn44M<$j0dm($e|Ogj6-EXNCT|U8hJ_4L{h;!3 zW@A8~8-vLD4GaQI2^Ojq)!7Y^gdS5 zU7R4fUN6Xc9WgJ+m}`G`Crketh7F)T5J;Xe2VCxf=fV4XyYKX`V^{z>`v)W^xBwE4 zf(JnB3mF)M8X#+$dJlom&=UmR$tn7fLE0dK!5-8O7YD7uVqjnZ-PHnKkHsw3B;WuE zdr;XR;0RgkBftPTN7f(-e7B=7c%7Cb1L$68839KIPtaLs0*(ysAU7CPLd+IcWN-%Y zg&G*FnCif8w(MWcFhQ&iat~yGQ$q)64MUHUnF(lpnt%fXACrQCYX1s`ivF3+68*~= z8rE-T0N-u4eg%UFDEvhn7&Jg;fb@dQ2I&RSAaM}gzmfscw=w|RCks+5#tB)A(Z7lT zJZHuTIj2|*ET;vzi=xko!Jw}haz--r>}5WXyhsvgx|e~W&xwJjuNe{+49*-{A_@#_ zPq&n{*BekC1?{N-jfsNBav8ZI6nm2x82Wk{3}AVpx94s_UmJr6 zgKvT2`gIHfDlK6#3_cc$=y?NVaesf052*bMDv$biFf0)VOS7>xf!fDuhjbgkY7`87!D)zDbRmN* z*v@qfJNlO}%;-JO;G%Ycfsuj#Oar?jc#VuID8GTmzWX{D1p3+;ctGd4g6_3jzY4Ur z0g``V>w3Uufz|+m?)Y26utVL_E(f%R4OCu%>O@c)V`A6<9%lrFPmj~x0+1dCUvL=& zS>uJ>EqtJTOQg63zMc`Xc7B1nrR@ZeJ3x5>;$oMdc>L1W4?ZWo2jnNXU;IINw*g$Hxw&_*l;%0P-WO zTmku`e+dKjFqjFg=PV&{p{~imu^!|$0`b_tnqdtny@UJ?3p3ST1`g5O{};jT@9PO* zzE+_;@f;QlVh8qnQ= zYZ#`0M0=-#NCpPb{SzS8+HO!Av||U;0!ZBr66>1)K3^BK)~z1I2i4hqf(#s>`^rQd z8Ng?tL;cOczy$U;=uRX~!G+-VrG(%@aQ{tG6trdqR0l!td1c@O-y1C@pa7k30oB{^ zF>gLim6kAYK2cd39s^24AiMi47z{x63Pa~`+bkKF+BzA)Z3bpd2jyiN3`|J%D>xqu zIxv7&xA)I%mSJju_zPV3L)OB%gW4G^jtm?sY@TL(e)T27_sm3@rT;cMBLKJsOxf1weNZtx<7iU||HWpMdyj{bGhS)0E)% zNph=r{r?Xx%VFWv5}pG}D=JIFYd~QHQwvgO=>7k{XaWP@GA#!1{g0qCkwI#~ZUnWR z9T-?ZYe?4wGH{@;Ee5SC289bqtr)}qW)KZ(+xPV{n1ITc{`CxN7@ z93CL|g31)IdP_*&5Ss~EV+~r<3Ko|z1Fx_W2i+40>d$s|vh=TFSOcoRK=KTn4h@V< z5{it@sOI)ffb{?2cUmzqaI|qVuubt{&|^N08ZS$n8T63c{}p5|DBpqNU)}O5c+LeZ zwuiw6J%2GdKe3Ruz>Cx>Yv%%0cxXzA`X}m~|NpPw z!mvOj;m@u0D;YMd-^b9>Ke3^we*?n;HPCu@@JKrNE*kKt@{|q+El@cr$jHE@!p7Hv zmPUI(?p9eEz66v;LFf8|>;=UKh(?Kz)eIXzYXMbr{{IK5UB8B5!}<*j3qX0Qe;vab zaGnCq^R5G@4fFn;Q2F%?J3wyh{RwJsYp6oo+p?fAMJaQ+AouvHa6{{=)!;tD0(hT$ z6{NoEU&F8fUpsH_b`C>l_RSM>07^u zVGT$RC_We<_4T=akY9E(Y*1n2TPlngqet9H*b=^lS>Xq#%F^%ypfCcN1Ik+}Y<$c5 zB_Qi)L2b1Dl?+?Z;^6{R-xIh#kea53p0#ES3?M&%%wk}2XkrA-{q1KUWsT?t$XH5n z3ur7reeZw7neQ7IL?-kxxb@6ni0E(ZI%0VK|L-LY3|>nb7qGa~tzX1o(%%7XTXTSY3@V_&ERcPm zeyzHt0{Dz9kSxetFb%!)3Dy@8aDem^`e!zS*K~pG0ILI?i|oK)X2VqvTC)Wn!$Q&n z>mP&8AONp52d7cgy}~BymUb7^mok9QduC!V0QJWuK;xPM4h*u(m>B%}SRi+@3V`-i zFdH<0*3g3P2SIj2|6<6#DF(27^8|*&2FeU<1_u~m<=8TCy)Mzej6r1`6L_Eg9q>3N zX#FTSeJwQr`5i2`lEDCUhvza*1}{^u|NqyoVlV)YH!Wf?K$;^4-*E&A0}zI!hrkkO zdbrWw*s!C2X2${0e6b4O|No$~>OtdduroH+=z;Ie0QCnoL>w3l*DqpF>7UTB161FG z$}ENl2C8C=@V3Gl$Q_-HZ&cvtUnYa+egzmH^+bPv!wLq01K_zlP#7}tgYTIF-|^8u zvtbEnE}U7?K@l_;4l=73Wt=kk2*~fC{vOCLAhjShAhk&Ly#c8K%g=1KP9}(h5iq*c~%Fc7X0)1IdB;Fn8@>(COdFU;vuSWwtO-?w{G% z04lRU>KK10fX|o#`3*E44;t%J-^-u@Su@1Isk4y5L0|!cs11JuLl5Ze{q+af7;l^a zuQ^^blYs#&ufV`&!`T4J$1Dsh1K1e3A|UeJ3@kbe89W3O7+7t18yI?e7&sW#R%I4Duj% zfZc;|1DYF|UV`lcncdeF!oZV(x}IWPg<|hB@tzQngFH8ldcRA=@nr<7A8qj&rAis$-K-Mgx*`-K?-&eu> z0Cv+-2K2C51eRY4x-X`A21pG!Tw!hj#VIIUG4)Nss}E#e2lV^|4v-HRKm)t5dH~rT zV*F4EwreK?Xn%B$u@-|p19W}E^rZ|=Jz8l646I&2HQ)5Spp19enjX&x5p8t2kb`7u!fwkhs7NN3`|A@^lG8WgYO9fZaY5sqBE30Rjw6pgkorB$)+DKOnP~FnBPqMl^xqOEnd8CW8P2<5#es z)-X8q_jd(=*4KmjWytjv=-zhJIk*%LP#O?mfULdlU%>#bw{;mo>!TPSg3SZ1%jbaI z!;uailR~+N1L_|1^drE)coD20Bo8b99)Rx_mk?lJJO!5P>;~QO#0Wo|MDhOvkQ@4U zGJx;S0HtYNNAS8Lv*{}soWN^pplQ5ED;+$y2TR}JcmUZ2%A3%%0xCm5{=*dq{mU2} zz~Rpp>i{~x0d(dCI80k1<&^*f;{uR7LHP-!4rC4kYt|vK8faO7&0eq=YB`URz62N; z!Fw;jepP08$kD?fb3;pi#r6mD@*kUgMw-* zgM#Wh1_e;vwSFCg%KD`Y2C%dU_wO2!mP&sYL$-pemzzEL&qKb?@pzs8x6|k90 zpl2~Jg}4J`2M%!+Y~lh8j20mCrtf5M>R-cP!5|rRNHvQ=LAQ}XZ2c+*69ENA(ey0DOX2wndcOuZ4};t3pzy|*t^^nu@z(zW42)bLcZ2LYU?l@QDpt66fYx7w<)QTePB(W!+&mF_PJ^fe(QYO# zKdfa?=Y(}{LNe`-7DEZn0lCM=^`I-TIzE*#CR|IJ98nZUOy@x5_wbr2iB-jmW z7%ckxI+qa9W`^}cA?NGN0Ij`tKy7DBcqsO&p|rC>V>uF_cmUajc9-6M^*K)9`+pf& zz+>hTp!oyPeMq2te!=x4KWv?KCL~{@uCoRi%K%zut*-I^hb|+7gn$BMYyhkmUe9NO z=b9Oj?%RU&#{^WTuLK*xV5r3)52~9%chl-RGVqHiK<+7nsq0@2o?~GGop&h;S~s_j zfdMpk4bqJ?cg@@nI(Qqj&VLn7zzCxmSR@-5n2#N@ zW@V7oS;W97;=sTH8h^27Vvx~sVgRo(1E~eA|AM&B0et=uD1KCb{J)_O31e=MJHhUQ zuZzwG+l{;~8e|U0ZqVE>hz)W-)J$;y7i#7+eMSa30R;vuX6At7oH#S>pMd(*p#DB+ ztrKY6p}(c;0;q2d>;J2;2{3@l6p))ha-j6s-`LQwrit&vnkK%IHBEdCYnm89G{c%E zh630fd219rL3dT}SD$0w0JfvAp#fw^?>SHS9s$7vVD~HZ&urcR+AFYr8G{C>99zGf zK?h_f=-jdXWeghq%OPVN{T*EwKxGvJ+ra}2tP%|jtbqqWcat(JdnhunDS*!iWMHb$ z2Hi=?n3ABlwx0oXU$X)OTj2rG1q_h-wyEn11MA5H41N`gjE@f}GDLbPGO7e9u4iXp zSnG~!O_<#tkRL$%+}DHlc28;mohPNE7WDT4X#EF#zxzf8&{{AV&|dfc$)Nem2357< zzfbz|K(W}NDtG|0UIujTPyfv30LG686#H2iSU`RTspzX@U;yoN>fghl!6XTuul=fK z$iM-z10)X`*8|Zo^&oZY92gitc7fI(f$ReBK~G>{u;HlxZ_4riKWP7XKWs1hCI$ud zy$lARbhSp~?+Zw}vV8#Z8)!{2D1KBq{yyntW?%rN1%_r0ZBSYO#f=DPpJ0Q9s!AV& zNPkO1&sxy=bu*i%^tAkaz`$p4fPq=#0LWdSHErOy1FdIk1cd$cMsStAUA;8*C4tB5{6*6fO9qj z17mZB;@U+FEWO|wf`NgVxk9n`3CK(a29SB6_1_G9C!IiZi42_rilBSO3{Nx2Gv;Kl zF!~-)h2Gx?x}#MClomiff}{oOE8sBg>skX!>%Hf|=>T$%z6W^2rz)w z840NNw{$J&pV|JVe<_1O|1t&>_4N!IJuM6jpt)+0Kh#0_co8@+gYLA3t;rPzm2Leq zx*7VHF&Kc_8=$kNg`sP}`gbyD^tW~`Sih4&1ayWRA6Zu$sar*e}K|6C>?{+us{O?Ged)cs>lNP+TaS1J4BAc`6VDeES>f^{e1y4 zj{&ldPMl#8IIW6;#QOVsLO?WV4FQOT;Z)ZNKTjmy8l*zff;HqEbP4DZe%-gpvUR&0|r))0}PQC zians)(LDncdtJbD&tUZ;4GhdGObkq*b`waSKoSGD3L685KpF$53I_wHKnA4!E6@b7 zPoNDF79t&BeT)JO4Emrj7D$4MH!-jhXSwa;w?hIO^ zEdtuh(*6IhZXyG#fC6Z}4tS3b(%5AVWN$yx*d^%RSFjry7=*xfra>A}MIQb2`)DL`A-iGdLmwy^pL6t0jo zZUH<0;s&^!290$$fYEy!2oo|;`*%&8tb<(sH_K_m$->R26VqIXr2Z%jx<@6K>>7L zqQC+MJ%$AnR6+GKgXqZv{ZqQG^iS?O!mP1Fu`hsuq5mWU1A{<717kpdA_EtsT%VZ4 zpuiwnc>uJpjOk5=V(&Tz2B!W4ih>6i!28FTc}^(yYk*>nfq_u~JXa$K;(^XJRAGUf z+r%K&0otQzvL=9mp)V68%fP^B7@*ke4PmeGW?<<9w_+I>7$<_uOoqN7NI5Cy@c$-A z73fT>{tXNw80T1l&bPum%L>}2FE$zl1>rG}i{2Z|qt6_l>$`7I+;8Y%UN?H-qBJ_gUT3C*nsxVgZL`Rf8X>#!)c8tX#W(09B6F^ z*#4Q#Yd~&7)+^w^AP&ky_}oUMy&pj5c!S&kiW9J%pt&%Nc`(xuP`HBX9?)4r;C2<3 zwAa(h5W&!}0JQ#Ij$wg>>Xar18x3TFWa$eDwn`@=ze zksNq=Dh4i3ogn!@#Nq#Ukh}^rg9gK62Fd=WZty%i$ZhJD=^+dZ8A71-p;M1As4+5w z&f}^OV(>qpIGvS24LPlV%;?__E_2ZKQy4?q|4rR2{cT+bCb%*%AlJ(xpn1C^3=Asl z42%oh85j(nGW_p34B?9;FbJw}FfaoYQNuW4XlSgQ`{m#j@^ zU=UDXv{>5?txMs3$ebAs;o6-H43Mzwj8NfcXcb^!_z4a>kohw@8{p=H+y*ie>Nl|Yjhz81k_=obEDWw| zeuBmvIz!f|fZgDu!p9)Ab_s^rkC4o60h`Ulz=ZB^kYD>7J6%*H8F)bELefH~j|xA7 zI4DfPW`OLLU{GDVgMk5@ei}O?K<*G=U^oeO1IYb-ogHvH&LP59g_(f`YKI0Wo}g?O z&^dche}Te_XU%)K*#TgCA^wk0kz~+P;bZUug`EHc!&-3of$Zz=oB*~DWIj@SfYSyj z4L5emfbD~rBZ6cm59sW1sNE_m5)2|xH)W_uGRQ#L3MzaIDNr`JM*>wZ07{ooai6tG z3=H5nZid7&IF3Q_ULYYDG!~teWNPnznJ)}HgJkKD>z*5k_cm#50Bm=ud0|UbWAy9v) z2izK9U|`k*jSC1U_JGbN-U)IQXpb~V-+=~ZmIKNRpuOJ=1ww25Ap2NBD!_ZdmBDtg zfb0T`q1y$qhXsp096dPf0i99L0I`b$v}YG=?vE3S%n-YHQ0#)3&m+?De?K@J7K6i8 zhk;q4fuUJJ8JzZDc?1&9GDz_(0?IGYc;f-*Ye-rEuk3@0XMpU7vcYQ)plr-Ihv>~& zo6NwlR+)ieEhx^N85p4IA@K`Q1Kt}25(nicaQQK_8N6QuUbleS340hMp!F))UXVLL z7$gRw!R;2%zBwiaMo7J@3+w;gfYrI+^)yQvbSCsOFo62zpt~B>LG7-Y9Xg;i1h)^= zCSzcL+^+&^PlNgg3>vDidxzIp`~%+s+`p4Sr@yn~1%o8$PN|L%@Lf`%F^nY)8Y-*| z%pmhXdkjErFi@Wm(FXg+BH+lt1#Sb)>;Q)^NG-@8Ahlo`K5p`l0a~Y`_0x600h8`nsU;8IYYlE&sr4(F7V9z<0Rx&+Gu_GYtFC>TOuKLc&t} z0Q1ZTicq^&^q%|20y2C3eg@dMK*ai`3^D7MF(e2cWVB&ma8T8F#NcS*%)ls+z`&&P z^Z$O0#|+T|2@EXyiVP;8GYvp%$JVcBa8Qw8U|PQebfzF=4-R;26n+*(-U(1xAfH8{ z!pXoYz`$Sty4y#E3*4{OUB8OKMTMJz8FXgX`qd0BDm)DQpfi|2=k}`bGVlp7FsQ6w z%iyBI$G|JVzyR9k0xC~IZev-$o&j`MCg^MfX^=ZqB*ErOtl!Dtpu))@D8RrV3bjiJ zbZ-LGE|7YDs9mB03=BLVyFlX<{WF^_7#?V-u3yYxvVH}0Ub7_!v=3LIe=&ne{|W{V zke~Y3GJxZObpeAn;{wom&}|PudO-04(%0h%Ui${uqrQ&82XroDPbBEPSO)&JHyK#^ zS26^E&XyNdWB{#~2DMi#)-Pa)>0ia*13PzK)R6%?C)aiZbVmfpe6am{7!(*B98~*f zwtWEICDXqYdY;t^29F+Z22lD2?O*UvVPueJ;7)52Y-BhB>e~u3FtGQpV@T))ubN|E zVBoDd!1{n;U;iS80FXGy>@|H1Ed4V(T-GmP2tl^5e+fefsGZxthQVdZOvt)qW6eME zrdmu20t^gmmUJ<2faUrbI2d>`9SnCcKQMgvN1mDQ1gI^yWXVhh4uJ%Q2pi7&|DZFP zO*Q}j2dyy{b!2c~zmmZRG;Y(slp&$V>7NWJKMOd3)*gfQG`2kfwJkwz0gWMn`s*Nf zg2qch^csbKGW|0j#!I zxU63d8J_}$6I?&I{OGV)qx4S(*$j|fpgk)6Guy88_WYAUHV33`{TlGPV}g+YcFkj6f|j)xh&V{WIGhsPFv`ACCsPef?4f7ij*L zP+!Mj0n68*um$Jqnc%z%pZA>L$pCVb3#e`|)dJ;P2~~jx29E_^pz#DmxdGA-H+MCI z&e}uBBNrCj2 z*F)Ev_Jin|9U`FnfO?id2>8pgOF_gMnj0 zHUrO^3tivP?EoMBB2TnP<~Gb&UUOb;~-U+Hpau|4eA{cmV7#a9`QW$tZ3=IY^p^oc{vit8yUpwPb?N5|R~EWZ>&x#gGE4k5pQ6;b{qj#|$jPN(|SUI@ehs|D)9*`YtDj0ZrIl*W8B!JF}T5HK5fK5FXcY@E=0GWZ; zomr535Ck0jain?V9pfA+6o0J-z*+BFQIyJ{LhWrYg!|No%! z2V~wFWzPs`epXOl$KU}gCqQ*OxSUwY-~meiqTv0o;IaTz$NPZvg8b6r#lQs0C+k;% z>vV8lVN6T_owcs89(4a2r0)0VU&;X21M)v)9Yxz8m^irn-NT^Jznmce9G(sms-Som zaA06r3*Phl|G$VM1LzF23|N@-FJ4}m$soJ-2ZIPGPpEJ)$oC{Mh=9f**Ca7;fYPGM(tkW_4>9O~;v3}G zrIrjTz1$!c1H;lR1~pLn1@YE4Fu?OwPc9_>*5oqq^zVSAZO}P2Ykn}Wfb0aT{{ari zH=roU#~lnFJ^qj~kMUsvBpxC4E~pJh zT0Ay3Gzd5_u&+__i~!B$gWL#WgWB~Xj*xLfJaGwH#|@54kiP!rhKBx~3>iJio)Icc z|Nn#1$eKz9jWtOOBB1zMlfgU~oKefbN=Q;K^)Y;03QY0k@Z@_(R&Kp!TQfO{N6U`L|0V z891hRLdCWJ$eU&{G%WFA;ONPL)Uj(oaoN()1G*m)`~xxzly`bogIEjElr|9gEPVJX@OPxlyc-UGVpwxgk^_XmRvSTD5Sv33Uo2PoZv z(km$4fqWy72->#Az|fP)zyT6RDi<-$1>J=OO1Gf6&|{DRnE^6?O&$XWxXfYv|Gy`R zL8pHyLyCwaWNuUfF>lPiCKVzFvX{XXJTA`!VuQtJcIcp&AN@-hQu=3hfcN|%#|uag zXsMsQlM}l|L#ic?HP+1Gxd@ z5B0qa@HRK7?XAMZ06mjbS^zv=F|#oQG&ctt7XgilfX07RSeYUBv9d941GQUO92vwx z>$v*+Kzq>|w}9sG`j;?hfc8~^>|75z;|;nFL&SlB1EjxyW@89Q4M<)EY7XdZM6fxa zvj!U*!1p1_MO95<0H5g24n-pNKNT=L;o3>oTBY zMFyZX*dTL2>8ZyBJXR#Zz~a|rsm#E{z$~FHkiftLnxnK-X5fSJIiP%2D4zw&7Xa}= zY*6^C?_~hr7X>mGlD5P>K<0BRHLVNfvF zU=Uc~!NAbJlGVkAwf_GaPw*Jxo&F`P;C1CDOaK1|)juF}AY~ydbWMl|B>#iQsv1Fa z+~B!~H7fsgKp z_n`hn!w=Bj2#`BfmU@EM@ryVxfX_t7;YSmE_JRF_T(>hYFhIgzXbLp^FM#S%Q22w_ zOExe_fzFHUZ*6GkpV{yQ6b~S`se|hMoermCR`3a;BD(65L#0RZ`0i{ilIv9q!1=jw#09q^6KcTk+ytWLq z&Ih`_tbcM(27|){(0QAnyrTg+i%?C3!2xvMCCDs+1)y~(;QM4bKzzoF6^gw-Kr9B( zVD`hrK;y5VdFmcN z29bVM1_lOpkB0u4Edq?35{f-(3=F+TAa|~<2dy~<;XMozJy{G4pl}iJVu0*Z?e59w zpV^ksn+jD6ITHsw{|oXDa-2irnjg0QiDUf+hLHXVy`XuEKkJt;{8+!AA!Yq0hL}E3 z%p91Yx_%Es!upL2pt;09;CNWh$kM-#5i~}fz~acjx%LnP11SDM_JiC6Rs*p=L4bjE zTK|4fAFCUDHy>=Rjxg*l^(OEhQ>F=^^(CAP%p#zDWqgdupz|EouVdIDsKmgm!o$EK z+Qh)3BEguT!q4acO3&-pGwfKugJDPi%pMIDKE?zjb4B_$G71PVFbIP5_hU1kpD_(= z{(3a?B^i@cBp98*=I>zGv3@7R4v<-(bJ;+3`!dkE7c(0{NfWu>m#|KWfn}Kj15^Kc zMh+ED2Ik&Z3=AMQvpO&&sIW5lsCqFl8agpB3OInyyJ%4DpV9T8eX z4aI2|3``76C$yO*3lxR87#x@BF)%R*I5hMxV`O0za8PCd?H>{lXaKXhDjNEGyB>hV zn4BaO8J|TcG8|G+?A^h@06Hsznd5}wWHknk{vC`W0w)>RKyDB?0~t^0$%ndYy@p~> zIs*d(+ldB&2MnwrdqHb{!Ls}Z4lwM{P@HDTz{J2_pbc8Pu}q(V32HtI*nA}h6IBj| z2mw#1`95&-K`D;`x(h$VuRQv(*6G|$UbnGfD}ob zXkfNDp$J-g!mv|Aah)otzH0`TOrZ1%QqsSNAwh+Y!J@yv$6=ik1J5!&27zS?3_`Fy zx`GcFm{cSL7?xQu2=&kGhU6_vkWK~$X$6Se`y0D;RQMbq>!X^wbwIM9^?D#$zyUH| zF-;$Gh9%>p1FBH7z<1OkrD5=hX@6f2xW5Wpzb1MBRln&ECWu?Qy1@Q`oqeYo`TxJZ zBKQtMVQ@YL?XQK;-4}w-!9t$9pQZ22g)_nLdNiGz*BBxugQaGD`*_usJhZ zL_lQ`=u9?Hn5nQah=9^ODBRXBV%Pyn_nc9{Qn)d{!dp8DVfdim3JsVUR7)~@W zD}dMkG=S0pjNRYT+XC7b$}B0NI3bCF1C;)B{23G&_zx&E-Z-Jc5Lv;(`jCN@L7Bs1s;aWPnf)G%HEuOVvaUC+P(V}tBqdJPB6GlJBgXkdy2tB0gli28&c!sdhPMyUBcM3@iRUGfg>UluX0|L0Va88-CK?AfCt z!N?9uH_LZ091vDuU{>K{7B=B;WM96X;Xr>&&kazy0cx9q#@z%O8I+cr~`)pJFq zlYtSIUKqMSW1$Svj9MDX20Iv-L1$7iIy9&ZA1w7@n+O&ah2K+Nuzn}Q7m$8XIDqtkViznAs>7PQAFN-*@Bp&rr$qvkzSWm9fcHzOurXMG z(lw|I>0i#UgaN4xQP*ei>0igl!T4N45nLB7X4ukuiUHLAPGEIlkV8uQJPZsCs{Jb% zSr`}&G%y?xP-T=*Pz1#}I6PYzSVRK;|6!<<0F~L`F(t5CfrHl|zJPF1A89hfp`jPglfY(X%&uqw1 zkzi0zw=7)Ht;oPITakgee?7yW)e9L|b}wXL@77~rnXSjbuD+3B%j$Iu9J|*saCa** zaLiU@;O<|>z_EHE1JCY-4E)`C3_P>-82I~_Gw`fl#~`qK9fNSUB7?weMF!#ir3@^q z7cz+KUdSNct;ZlTTMx8;S3!04ItGc|>lmcF6&WOED?-l3UA>S&X7@q{`EET1nb~>_ z^8Gs*Mb__NP+1K+J7FhiKS#@f{vC`wyVo%&tFL3&v3?zc!}`Sx8`duX-=k)+eiMVq z`i%@a>lZU7=$|?GDyyR z$RGpSM*&Maoj(|4Xa0bklf8NegT(F~4APws85Czeg!Cn0X{YlCgX+v53>xcqGN`EU zWZ1EK2l#vrhxO|i40i8eQ10KsC<3jw4)m{QWLdwGVaoay3^nj{gq((UFxaeL2Mljop@)c@$xPZ#a_3Od& zbC5jM-vd6I1F1b!4Ngxp8*=*BG5k@tEOdaCEjIj24zRH3wqRhHZ2=7nX!^ifwpcLm z%(j4r1vGuY$`%zC26k9jbXzcp%(j4r1vGtNEn6%YWM*4{%N7=J+JL5u^*b3Xp!p1( zKGv^iP*Dfv5E)`V2g?^`U-V&mgdSJ)%4X?cag>S)V~lq|=ug6iI>NCj9)`$9e zJ@_0NgWc;HKy|DIs7wK+1CZZAdu!qG4=PiU{kxt4;$Nil6dup(!ST!h^RtQs10tTG zbqF}klUawTurM&e{S2=|7#N7GLs&p%D5yRFm7VZ-UdIS(r}BWxS#?mqZU>HdUI+E} zdT2ee4jRw=91QA~1rK0;Mu}(Yq-{31pQ(|yk;*-kw2dCmJD~nu2lX#JT?>HxdjP9{ zsgtf*;r<=SbiE!DzbX<;ApauTMT;3W!1FP6(ljI7ztl+6(DV$>$2%BQ;At8?esQE{ z6@C_we;csIFLly0Gu*#}AU&(_F*K-K79?QxFLly0qTNf&^t_3Y0o?w@Q&xk&X`wV0r$Xt+_ zptcmaZM26W0n|1Us{cUdfy{u(f%JjuU@$!std9vM2T});Q(<9X!=+D!g@F~193w6{Sh#}h zP`8|T2IM!e8<4^k#3wIYC!PVB3o;X1xPr_DxeF4m5W7L@L4F0xVYbUar)@Am^{~U- z3)6!dt`PIU=Inv2^MdMQ!lDl;Tv7F*hAV~~Qn;eZf!#E-K?P*Ly5$7$nd%@m+;20R zpMdzFumRCxbV;t z_!t;K=^r%TyN(|;C((2VWCzSmeVhyoeGv={jHV2d{d*WJ)Fl}h`#KmH)`8|NXEwc2 zVPWu4VP)`8VPo(Bt-S~B17KhX5CYx%0x|=%KLMmq&5(gn%=kapztFw!3jG@yRQfkD zX!LJp(COd8V9>vn!3648=-lRa*!ede>z6R>n7)o-*ZTboTXfGeCamAX06M#8&-!Hy z2LvB5aIRm@aHPMZ*Mx!Zpfh+ZL&HO{R}1751_s7c5iFYd3=EdhroX?lAqTF1Cj-mOoeb=%nuQluN;0sh>M?li zlw@Grs>#5!GLa!*XCgyzr{ez~GZp{;R?P;BdF)JN@a|On|7WHm)UHGZ zA5p#kA9p4)_`~$8@G$Iv>(^sonW+cabF(s!A!KJBLwNtpwj9tn2B?n;YP0q)fzF+P z&XnK7umKb@{Vm;Kx~Ct+V_;DI!N9m?24))Q-@~wB@)Cyq{k`2A`e$}K^n&ir1&s~! zIy5lyIw&%5I2>Ts0G(mh^k(u>hQpJWF&v-1oMG4cRnT?n3m8N|aR)L-_atM2AZQ&r zU!-$?e{To_cR~YW{{h8*=o&l5vnN=zH5nKL6&Tq2_cLti@9N&r-`Jx98_!##1)e|M zqP~}52Pmz8Tn@<(UnfBG13azt_xDPG(hE4PY+zWkeklVuy@1X|m<$?cebAsPtN=)HqpvuMI(aFfbFq4si865wK3=BIH8JIg6|NofD2#crxKXxYm|J}*> z|IbWDSUmmzBgzGer~m(9`ulqta#q6hb1|^YUDyVjepmGI)13{{J(x5o*^%1|QMB{~vcg zWblXSSCL@23fJGqz%sKBnkL>cgzS8WCr#{NSOAI}P*_gi$*{|Wv4KHd^Zx-|(7q2Y z2W3NU#s`er87!;|8N8SnIkapT85lt{=nNK6eqv)}0G+_i(BB6N!vm_S=ZX_l&og** z9%Nvcd60ow^&A7wYDNZz-JpDR@c)mQ2mk+8mjH?V|FIjCuMYnIGxH$CU#mg+>iqwY zyFvL1svp!Jh3h}hz%uhZ1G~CqvA}A61{QS<29MqR4D7J>kGdr|4}tSlx8naFv(fTZ zx8nalvyt+ZxCSV`82n-SRX7>0!}3+P1_R4%4QLox52BSj2mk*O zUH|{%&Vxwh&Wwhfl`#G58CYhnXJA*CC@NTao`FT3gTZ6xc?R}wMh1r2j10`+a93mq z*saJA+|Bs^$85&`zd>QPT9LtHw<3dgH{<_5v!UsEwIYL$ILH5wyA>JyVft0L8E&qI z>E~cznau$SpVb-+A-gs3gwJY7_<+KOjgf)Li1Yt{Mui4dcp20Kl3`#_?Pp+I13Eu# zCTcwdN}u2|sIPlNe{Z(~Xw4+39Ae-LXkhe%lsybw0S7?k52);6T;-q$x`zu?FM;c! z4dA^p;PS42X7`5v8Ql*3pf&TLnJ!7teW4MGpgVz?xjhuu8i4n$Zt35^um)7dfXW(3 z8S@c5|E<3FKfH_ql`nYeBMZ{%qml)*ua8OsXjC7)f#sV{I@Cw~>lls@Ss(46yo}*6 zC{2LsBT#zOyM$DNG~ z{xJP2{ESR1VfynJSZ3xy%E6U=3?V!F@RWn=5#=DL>@$-1|G%e`0dz>5s;U+P;~LPt z_Snk4r40M~JD}|^4h9BL*~P$-(ZIMOLy>_u;{da6fnxv6rZ?bpzK%fvl+Ll1eLdY9 z`n$UwdV3fcz;}G|R5UQYft?*`T%4 zp#B4_+y<@t1LrZ&S>T{OT%dbeFv?tq21f9`Crxia?Z?SW81$zvXV7Bi@K9X8l0g90 zrvRI?3Y=HLdyk-b6}pD}^&F6!`ayNV%$5L9od7+e<3FIb_+t#mV&`@Dv2vK2$ z-HigipF{z)_p5(qO9p5iD(JiskUVI=56Di?96xBSB}iZY%$5L<9Ad3I_+BUl(0cs- zR#2R@_JGz&LiB;pjYM{<0i^DD1v~!@Uak!k_-8rDnkl-5iAI~fju+T_9tko(1j7#R9N^(UzB4(iLOYL*{R)nM>| z^|PV z$Ic7}cG&mDp@|AUP`Aou@}#~(obzctYQA9VaeMS?L29zJUrSZ1z))=6&|LUz8v zQzt?De*z4U`_)Ah7+9GXWT?XGa1mJl1zc}?sH$6*D}ef4uzFV=)aO!UVA!e1zznaq zLE{^W|9|XM{Qn!J-d6no2i)gU{Qn=OA6#$4^h5hxs@Y{1R%$S?sOB(u?9@Q3w-+)5 z>|BUcZ-d5d7BYD3T!>b0FJ$l$&H4Xv=R%ZvJ7pzIe+~o7%p7PKtzih+xdu-dA=TU9 z{)@!_|IDDZFR(F`E@=P7gMo2P2j&?3=H5^!XilJ5rZRmJ)bK$tl;HQB?IltqlyhQDv#PoEsx+~1uc_6VFd~g z7Domqg9uQ$1Ue(Tdjm*a4}o$CR3?G+gUba_xuOXzS2znA7*7@`GVm1~VAe~3mn-nT z^cqMX0~}|Nb4WJyuVy&X-wz$1dC$NA9-rYq(7?=pKoN9)9pjDw#kJm$@&z=e0&2^H z+zn|T-@kyjjkAq4fE}%eFm7{8cDmU6(0BoEUHWz?APK!Jj02-&|hK|!h=MwsRdNSbS zwA>6VGr1YqRd^W~SDt2I*?F3Qy?_ZvxHTaCtN^YI!I!aC#hI)`YYhU~LBQ*a37-4;+RoAbA#KHz?17 z@-8IL-jRXkS%>vY7!FJat-prOxq$L2c;00x!;$sN7*2rpvw-GYKxf}#=H1#2w9mV> z2{g*PTjA-F{JeXlewub}q0s#mRmsyBm2ry~Qy zOh*Q0RWAmfl?xddb}nRK?sWYBW2WQ(-{3yP!v8;ZF8u$y)A9eGnU2sgtcCyohPW;QGB8SY~=Nu&bV{Ik0jy0}E*WX6I@KcCI1K(U{VI}-+gCF(K=ecBa6o=r&Cd|Bo1Ye$}@ zKccyyvAzHQVfy>~dootS^yf0L%*U$XufXXkB-yr4Jb=dvKxXUldyz!Cs%NfqB-@&j4T86QK$5v3r{Oc#sz6`5( zfR$n3`jx74$BbVnEyqCPDv-8%0`k~_%XCos0JqgaWBzp?Xg}s(w}3`t{$D8_^9O|m zDE;YkLf1h^1UmP3^hSX8BQa}0?xO(7GxJ5TXl8=fL4fz@_xD5FD$w)X1s_1mkuFgC zE<;t-t1dv*gMzxj1HEoQDn~pRSY~=Ku&YQgFs@v|z_N1%v>Z8yr5xD-El1X2DMujJ z-7~1>FfgtGjbC7y=Kznbz~+WQa|Zp8d0J53XOM)<8BAWna2zz(0iHKl#&8}~elWfW zPz25IfyO#OZ5DdAo3sddg|V3|1+T9-*O zuz=Phf!my*HsNvx9^|z`>tS`-Do8wn&gTI63$zEnzq?n$hVlLX{v8Z^KxeivKFm;2 z&1T3J=Vstp~S0Yxo1d_eumK4=|qj)8%JKcj(hJ!ITVg^MAa@$3P`^<2<)Dq`OL0HmD1SORUQ z&gk#!?peQqAqF&N&u{>I|4s^c5BL&>jP*+yas&@B=&fJQP%?czLzW67!+g<)(0n!n zl+Qd=)g|g5fYwyN)=uIT|(DWfX9qsW1mRtDOQ5UJ~{q>+zA@{gs#T`#}7g8THF!Q-%1}Oe8AJZ`uLZsg3XuF&0Lfo|3>={R1>RG?0lw}r0}_Yl zH$dYMQdh5MI0Wi%tlz+}M)wDU1H%JwTy8<>b1Y}r1KRJod>zBC{?3L52L6-IpfW^N z)9VJK2I9UR#@7ifnll&}#2G+q!4g#a`x*+sdGTE1N!636>zLqq3EBn*uMcDV4_P0G z)CLBx4?GFYi?DS}T@3|r{U;e%W}akVSM_SFT*=A6qUz7!v6GX59o9Anx9wr`%doaR zXnh!Lej2%L51OC$2en}t{9*c4c$s|Rb(KE@%S?ahICnoo$j*K|Tv`&6QmYEUGIRJeU_0sP61Sn@2gw5U}$gLoj?DC%B)^ z;IZ={gEz`L&Vvj-qANlDbOwLeJdBD2lmAMX{*??YGgm^x?j%FV&Xah;4tcC$1-OoQ zpvwRMf$l2?1qQANWzadOjBieW_G5!fe`xqQh$t|)g2J)C6BK?2R8=(_Izj72VRJ~J z@&vyA4caFFl{>2$q3h?6`UK$hb9&JAbI`S>{T&SjaQ)D=IjS5DmaF*~SU}?&pgz=Y zJ_dH!nniG$hNV5&I0tgtLmuY?crbGU5{1^qMIdQ{jMI6-BZ%CQCm zQ2hilOHJbc15leE-VcI}rFt_kuIa{Fu5RdG%diJLN7DgaV*%O?kG#f$|AgXt@Y&-{ zZ$Rys$x9hdgT`H8>kdHYPJ!xKkQe>S%D~_Pniqzotprt7&87-fZM6O-tgj1ATi`ZFBebuKl(tqj{{JJY4b7Xd zw1u2EwHa7uYJ>7-lg7$!1{T#FpuBlPb!Rtf-h{0mgyl_jO9md;`a|Tr30i+Bx&yNQ z5S};rm{Tk8}1}@!9 z1_cJr1ZBp?3edWa4UGBVGZI)pb8?f{GVBMXmBnir4ujj7pfNU3yBIXa#^=z$$cMH* zdI`f}`1~Bw`e<03gZih4@wF4M_3skvmoU7TzJlSE4IhJn3cq}ViUfmziX=msE+=CG zQhdKzzmox!X78+D&v0h_I)**#7cd-HzkuP$`UMOp;AamkV7MWuz`zMQZ-9X#(3ycN zqCtHP!yd*QME`@4uYyJMB?E&fY<=`hP}!8As&3h`LS35yb$JS|Y&dX9a@?dfI{aQHhx!Ux7Y9&NLCOe+2`}%oUKd zv+@N)$j%pd(hhRDzLMdU3L^uzs3L<;|0;$zAZ)|PAi(Otz|07lo9daqis2QcE-X-0 z&2HfU&0)jFmcV0EurXxVx-)Ry1YPTkyzUG%h76j&2Cemlu3H0@H-x`rYUg!{0uBJ z`5|Ej8@I!`&j7I=+5;ROs~FyZ$21)nT)=#AdMZ#=w`|V9NKer4fu|>=@IgsW2chZd zAkta_Pn*@xvjQ46u=N(4Ow-_DgOr|D zb1;PL=D?GlpkV_lH$Y(lqE&tVH|TaV91u)k;AG%A>D=Gn(7+&B(4hL>>jC3C2Sw1? z?I3lGy$4vdxfvJ)69~*~O@I~rRqJ%GKjU{N`2_tg&BKniC zb2Y%@i+l_$JNcmF0-*gN=>199_~Kefe-h*ucsUHdp@4xwos)raO(%|ebtl6c@Eitc z?V=ZS?IKr21L%xN##a^Ku|&}Qm(!Osykg8R0Nu9(Sp&%my$^?t!2_*~h2BGbI0D+Q zFj&8ZVUNL-|Nqx-V>q&YE5iZ3KE?!ts|^1QwlVx)zn|gE`aKLM)^BFmv3?W7mh~GM zHmnDY4K880uzo4S6~O}xoa>h{+~}X#>%bsV>C6C{_mp%{gq;=7)CpP3A$kDR#|TjE z?*Wyk2UJyiT4$*CqxSdVZ8d0rACe}aZ9SwtAmFxMKPXN9{}1o)&qQkL^)s-{><8_Y zX!QW^mC(epSHh7YV5cKPFgz`Q<`f(mJa#%Vc%!5RM+P5p&Ho>FIwI|r;AXnD5~g31 zfn~NPq-;(YdvjhrbP}nhuWIFfv^hPl7g4UxRQ0xb_n-~}vm^wUI zG%Z1UmkL1lm_x?GaLwDn`yVYoRP!n5f8;~kIIuEz2GV>$J_F0ld$5Sw1HigBc`2=dgkL_)G^BRGAil?;G=AYOqj+?BmN2Vmw=+2x=EY z&oDiqX88ZVn8N?(Ah(0<-N3M>eVpl0|n zF!b{?uz<}t4>co_fulDIa<-Yc76Xe)4g=$YGbm;-LCxT2cv1kqo3HmgK5{Uh*zL2Lao29N%}Zg4*d zv{o9VU-AIt+?oFV9`HU@)%Oe{4C@alg626u^1=$BbNv_?`a6467+3`wR5ck)7(n-Z zL+?5k>1F_*ec0a%)xVZu3+Ucf*jafZ=OOp3^fz};0hu?U0z`t(%VYzwdMY8|sjkTY zy7znjnoI_c{;nRC{_Y-?{=OcS{`CwFV0*n7L{zgGOjOS?Yyq3)m!QbtouSCE%0W@{ zVS~W>6$}RJ*D`2`C@`?BU&ElH`LOsB#Xx%p`-GlmNpffQA7#KqPcQAN>)PU?TVf_CAy3PW8 zo}GvTgHZn>28aHY3=SYO86j&hKz9Z)g4hBI3|wIOnJocO^CQsAw*{FGQUeMX1F!%8 z1s*UcuV2Mr)87G&GiaG8$-p27GGhXG6am~8kOJ`q9T>#bmoQj^)*h=bVsKEmd;~tj ze(_QUcaR?@FJ*8SaA4q5VPO#MpV{Iwc^QK>#0?gpv2xH(CSJG(nTdmBLO6G7{unKca*`)9UZP+^7i&p}}WvZH?$ zgGYaN*N6U&t}o!RMo`#rXEZRb&QJ#JhhXF_P+WWJ{|At{p!UhaH{d&ZG(hP9WX5_6 z2GCtYD*Y=VZUEl}0y)Fh0hYHw>OdHh$9BWkKR)Q6*){=u&gl{ch4o9p_Yq30U&f%Z zemR2<1A_+GpDHZi^P(jf91K*|7c(fRxG*rPFJ*9;kjKCd#B*Z)62@eI9J-UM{6 zUH{A`@Q5@>9IS2+gNXnGLsXyF{}*D446-VW3`{}`7^E0rc7o!PVTGz71LUr=KIr`? zj7o?xThM(KV6#ZG(-veW$UdmOEJC338)5c>OWzHuf(;BtAhY{?A$fpt5#l^f!3WU! z8q(~QhuX^`20bHA=mCQy+`r(Qw*z!OFSso2i-g$Atb}Mk3M# zff01yjF{s8_H|zWUqJWYlX&<14p{nMu^y7HEY>e!hyc~Y3@j22jLr^?6wm<(Cd%-E8kEX=^*$-tA)&_A>50f-OE>mWX}PKILVLI%#63mJH( zxc>hEJCm<-Jp=E|^$Y_2ZCxK$L(h=vT*x3eb0LFB|IDTu*jX%{>ls96u4jOpzXm-+ zs&gTOsK>4tOn7m7y{NWVenbMg283|B1pS#_j(5H{uSW!g)Dj{7(i=zLqKON zgTerG#xm$GtA6k~&@FrVmob3LeWW~K0aDjLv#A9{V~Fo(utC0S1d{i+!N&i<_bRO4 z!vGo=vgq*xo%LMN09tbeZZ|Km0OcJ6h6V{$6-EXYfkp-v^`#63pu8>8$RNzX9MI4| zv#9_yrV6qbbO$`BOaas+~3*t zfYCWXnSm>y0aRwg*dX)4_rj-wbSQw!L^OLiz~=Y#K+bk<1vUA8aDwasnGezhG9UAP zhOMyjPh$NhhJ^l2jG*)T?yTR>P_upyL&f^-3?=KgF%+!d%8;{u3q!{G%?v5)H!{Sm z-@p(78be#Zl;O?#Wegvdf!bi8^Nt^E0J{x*2Fg~3AN_k6D*E>`d|2niz_QGNfvIm5 z_$+E4RtJU}1_lpR@Y$D;^N!WPXJ1a~deGn9+tSz1z|dR4z%cPK1BVI^1G7#gXwIZS znVGLbg&`k2=Fbc|2f6EP(6a^e0 zWkCN9MivIu2te3e2O2=`><77bJ0r_94+bV?u?$6!8stkT(tz=*Too_zzDa0K*J3wc|7AQ08Rj4qmhm3zRuvRqmK;6V>>7m$@$H36@jDbO5 z4Fd~9pMs*mW~hJK6chyxFt9ScN7NY%k_87qY8comv>EviC@za&VCtL6z|fn|z`$%+ zpg8dmgNd3ULxfHQ$lepmj6Vxh82q62G8HuRya%;|85kJ#JwWHOvh+MD>Xve(=dLpt<7{2N-5T!;kfVHsg&7#by2sOolK1{|DWl zC6fDp|MC?K52i&jFsTSIXfPWvNP@x*bSE~*&FfqkIQnNc|5(2ga!xBKR>0|IJ0pvV z1cOEY#NLE;P7FNDB0zVHHih)5K+-l?9q3#xP#Rmwa0Gn5_#*~}K2=a3tquJw_zD3A zmVo~K3^mgtApT(%0G&TyA*A|~!G~FM2527P&ic&^H$Z6=WHze$fpjtY6Qd zvwk!9&ZZgb7cqE%&QAn|!}=Wzp!uT;^{osq`dfP^fZF0cOBp!SEnjb8S|ETZYxXcy z2rxkQp!N4d!bSCcyKX1+3|HiE>7>GWo9a6d;nE2|ZxazNSkG{UowvD;K?P^HtVau% z9XP@T)V|-tKvcMZ(@GQcd{-wBkAXqJkpbL>1fTEfjC8)U7kI6EE9fjQ2Cj|j1cX1B*!XC7qW>7Us$Vf8`= zhTWj`wC5RkXP##e=wHIXuzEcM%kK5ywXlLS4>E{=&eK`Fkbz_OLI&>6^9-Uh&ofB$ zgU%6N&%m>LJp+H|K?cd02N`5Q<3XzzG6?Km$RON#opIGd3HbpF8ySUanmpFwmsKfL_} zIjfVAL2@=DgACYju(OZ(8DwYkgYQ^jSq*Jxbu%(3&Sqp#0gXAq&ads}XHcEZ4>`XU zbUrcY-kjB-Gdp)Oxb&}Mm;uU9pu7cYf2pr$0M*|npu5@O`3sb{)Ks0h7F)F0F`ZOh73Al68}5Yf*3?V`AU5!!wuE3TGpO&N73Y>4`O8!OlkB$)MA}lVJwv>`w66o;w*lKw;7kI;(O$!yC{! zpX%$NVFNlN8dmmz!Ul0RGPt|}*@;x%>_G{iJq+Mcm;OnRGwLS!gHjFygWv;(P7n*U z-UW1~t?Ie9x3Klv(DDL&eswc${b8nRy->9IH;a$TMG*hXgv!_A2%3S zX5N6N59k@lSi|E61JBGG(C~nsfs8eM++Yxyc>|n2nBZq*V@n@57-VMN0EdSPxQtoP zpaVV&8C1rA>h1Lm;B)~xFI#;FG#`P^$3@OZ>oL*?6H<5>pofPIKL_ZXs{&B|P(9by z3kwgF^a0B+OBq+H$dm1$FWY{7l^e&MV;aHC0#{SkTjjiX;;xU94xgp?a>( z7i(C+@(CzikeN?FeP(#NfaVi$y4V3dOP(L(8B{(uc$~cfa(=qtl>eOyaGS3m*#n88^afr z_8MB<(#HzAFAjW;Ek=F;rCH>=PeA1gSZohN1?aw${)ycWK=+!U^qoQd=5-7&)+vGd z%S|PqaPB<@?OQu2faWkNK>gAFnN10x{wK1T;PIWA4Jx4aqPpcP@ZEPX`&2+@2RHTH z0P*4X899QkbYoz^(cb`{9SrJAfZ`j}?uD5NGQWR4qCG0c|NlG4T#!0Y8x2|AqzLdl zY=tlb19)Tts)ij|4X9lUYAb-`KxV__z-GeQb?~!-A^rlXgX#m9-5@@?KKPlo3j|cL z$U)Au#UckX3*;7%{pyy_cc6wbI9}#}z~<%-R%7gHT@eHBKkKn z#Poy43O6&P^lxFv=-WXO51XWbk-;kb&Xp0R|RWe*=7eCv?3{=fnR$ zWDC|ITAi94KWNnh3BLkBP6N8|L z0)r&z%wZ;n8LIu0dQ(8-pemva3MwKDf+8W1H6#5qTVH_8MK%L8j}Ka(z;y9|BIBV7 z#fgvq{|EK)gcd{AN-Spn{~t8BAtwC)or)6!Bh$qbii;J%_oSLI9S~6M-^QTRzm-9w ze+z?3|7He-{!I)r{Tmr1K=&y^!@>d*7V|@(VF4OXe=&I-!)wqQKjd|lf(IE`K;ys=n`B07`!-=?=D!6qfFg_mLu}JJ3E-P`U%{BZZ~AzJ>z$K2qrTlj^z7fR#HL zSayQWHNFX2YgnNQtH(fRyu#O3!uCcWpIwB!Hv)8a(M{;uOz7SS6<&tfaQ)DB0my$V ze=>yZ{E25R5z>Bz{+8~P{+X>u`j;|X0G(A1NlW0f-az}nUiZ)Je$hXpw`DT)+)sTy z1_cH_&^>7xD$KeCEUX8h<8d=UVR}MUU80jgotMD_HdYBGW zlrV*_FNB6E*bR)(wVOy`3SOUh7PJ-&dCxV&e7OFz3@kIxLh{;bUWSm}yu|Ifp1g+P zH7FjyVcXyJ1{AK~y?87c4UBIE6k+$o8ssrB3m#wqkJk0i=#Eg~WMD+v`vx9y=${E$ z12WkXk|*>P!TH4lY(6+0A5c|&-;tpDj==*t9mChdLDMlL44~`bkkT=DJ={A`82tYa z)89X{Cj+h@I^F|1b73_f0}E)+11KMY#_87YWC#H5wE~TGf%^5JalgeY8LorU5a|2` z(0csID;chX!=Vov4xoK#ETDNe0mU8<1_n@A2{16^>NYa)_0Q;L0nHb|!a$!9>{nh; zxgyxez+zCzzz!};8X@y5!r(g=Jyb#A2HxkM-~iea70Cdh!$GtvFZkZubkH6xWAzQt{;|$-?txFd6t1?=UE1J)wj?z3@t}M^&dP9qQoCG4Wq;# zgOBK2Q2a6Y!{Seck6|}l|62x@nQu|kFt+u_pmP~3sy5EM_K zbS%KYAUb(1!)H)@i6}6zsm}cW6%;3ejsI7x@-qksF#KNw3RB3Qlm9D0Y}7p`ogYAH z7kSSK$UKmk-~tA#$?F*2_wQu*VZ-#FfkE;Z12a>B3WH=Gli?1A|BN>>6m6Ip{xe7x zF)$uJpu)JLLXknTh{^Eme+I_42NXf$8U1S+{;c1@@Pk3JjDhh`g$e`jF(zX^hX0_u z1Q{f&7#JUe_G6t;WZq+?w$qhU+nMg zdc(kS0KCsuh5P@1kpFt0fmAXus2uzMM^J&m1av=f|IF5o{-q2*RM^4w>l1K(Tg`Bz zAB2}NJORZODDQ#7o`GASL9mfw7sDX~MNnKq_5K0HC0IY~-o#}LPx==z9O*~Z&n?)< zuo_h_BLh~wdl)u=^@HjYkXc|iGP1zbg4_r;XAi>$0S1QYpmoI%zjQrdJOa6&6I8Ci z*enMbm>JjtnpHqFV?Z;ro`hmgE&~e#7wG(a@cf08N(!j2)YbyJbC!_-ybhCb{Q?Hi zy0$&*S3&MGf`chijSl>WZ12cR$luX&WHXkh$Nq0GRKM4y*Xgt-YEMwJW)=P2jNM1G_^Mmpi~=vV!3VD9!eR=$YLqpnI}G;Q@*(2FZ*D#+~3b zY6$wRgd*79JO)tSWnnyVLJ_<^4RRLf3s74XlyiDq{{QIlV_;EXWYA_jQlU8U>Hq%> z4ic&&pf=(R@H##AH4*uzzEX6rt<#}1_s2sQJqGHL{OQxehCAE zP9sA)=)8KB=KmK!YE_#4uY|D~5@74jroh(!+yM3eKCeWroxfEDT2+*ceg*SQt(xurX_Rs51Iw zsIKw+e*L&o||;B_SlpuOblmoRj! zS-`*mikqGQaQJ61UXW0nkPnKV391YWW~hojWbjrIVc=4eU|~-3K@}8dpfn0HqYrcr%pQgU#u5fe zH9iJLkXslS5`-9=G8EV4GBEV{Gq9}l`~QRS!vV#~f)Mk>6#l;j#e)C?g9ON26-kEw z>vw|Zvb9v0|2L{|u>W7b0?b!aVgAFoekGW#tipVNu^+bAk_FV)VJuW(XW#<4MdetR zPyZf3a*zO|G!b;tp6{-0CB_Q)ePVhB~)|% zf7NXS?F)sjO9$->v;$h3-UpsJV_;xrKB3I6z`(W+R5q-D%%?F*g4Yde_wQ#YLF}*W{6o$C zl`8xUjPSkB(EXJl*RJelU;*uo1GQQE92rC>-zQ3{{KSo-h%>=9pr`XYu7^~DTRRGb)C zM4bQsTjTH_bcdvh`W6Q8T|?@YygSw}V3@If0mA|Yh6$>mbyMp%GOPf_JyU~#YX3%t z75(cNwx}60Ffm?~P@ItR|34@_s4z0<2{bauu3yA3M@5(+LnwtoTFVi%8k|8wg^|HP zppk)Bi;+P>Kmpdb2F(p?fYLa4d=G5)dWJ0^vlu^0fbY{*3u0iIkOIzUdZ4ibfkp;a zP~HFs-~idH!pOiP=Ez_O3d0E%|Np5lG8hUoGU$T%{os98 z0jlbjU0c*O(e_z6GBE6PL^=}}ytn56kDZQaXW}~k{{z`ugV<*UTC=leRois7T$N~WMG-i3GIhyGO+B{gvQ4zEb)PQP6s$2g4_vee~CCU zfct~}YZ&JAgZe2e89Eqv@((cZ)gI_y#jt~My@M(P=OHIXi4&l{pxW9Ld*oE zr#0T-^X^OfahEF_AmvIoc>j<3-v1T-eLbM{^C_V9VbHTzI@T{`=vlvvVS?ZR2JQ9B z8Kxk{RlC<=jB5?_cIsS@5_x2WSogl&(SH1{#m;U&7GSKeKTPY|j8p+)aT|p?@921Q7ozXr1WH z#vjiYFqDAwK3~XCFnI?R#S8_<7crCwGcd3icrZxxuV?5{kz~+a_>+M_lmW8F zxxcevhYBNu5@>BM$UH$s1}P8??#D7PFdR|uVK}1J!vYd>Q!=mt(XNaPf*{(Z!Gpo2 z0errCqrw{9 zUCO|4bO{3_Z7V3YKV1eMKU00W92BQ5Gy0b@OaO=T0r1>mf&c@995{?o+Nn&*h<0i> zsErL$2i~Wl(+F;xvZ?ez#*G9T|Gxt17hw4R9z^RN1h+}wfY{*t!dKA1pvR%uqt_z< z5@WnmpvZUt(kAV1>Uzz6SU2>3Cug3h&?(9gg$c?ms zat1a|Da^nCzBLgN-=KC)j|?^2HT|ITDbdkbPzmy>Z z*0h!mooS{VBQmg>oOpqC%vR{2KLk4PGwDLgXVnzSVmL==A zFqo|0$e^))1A_{~fd*BBjSTz6P@fcDuk zDQKuNH5jOZ`nn*$s4oZa-?I>6V2}jutC_r+!EN#;$eQZDMg|7ZUaR#B83g)fGO#c? zXsCkr#P>Baa4;npsIFhgAkjCI0bD+>-^n1;KeJ^4$o(L5K{WVoPJ#db#h`sEkoo-^ z7*zT{-8z!2)!bPCtll?ta1G;GjAo8Qk{Z7f4{>QDI@=6G#NDR|n_I6_b}T zIImyCV6uJ@%G|z!00RS8|9%FQ{+UfrKx#mD^nmVo1KY6xdNd_yI+9z6@&KUsYozzsz@?$u8Cw|SO6M}n%M$6Lq})*9tMr| zOBg`&Za(XmF$An%&JePGJ%a_vzQyYpocs4MX!NgONCBzYxEfyAYs!K0u7sv{=V)PlXoyo?g!}wjWN#bdIQQg3qboN z8@p3LV_2ZEECvaO2H2eV`Xvk%>z6XrtY5~^uzop1%i?tm#cM1W7}l?6$Y2KD!>Y`{ z0J<}hArU-wW@^INz|h~-2@WgR+1sKH40@pcHsairo*axbeWB-iz|ZtWIu``xOy7gh zGkuZIO#z+h3)2rf(-(A}C3M~b)Q<-H4ZWU$wHY91`X;DIGBEZxLfpOpbjA;Z1o*5| zsNY!BS20w8&a`7lbWmkvkWihxl3}t6BLl0bBKW*LZty%W3j=SjBPhMJEC9!?F9XZu zr3~HRxOHUUn7oXk9~`&73_R->Gvpw}Yr^E!48`EMS;vsEKpPydDbRS$QQyl@0ghKa zQ0hZqNE|nS(|><|w@d%bUJ1~6HK=@9zl?zcv~O%ZXe4B&gCa=(LN-{sXaJ9Y_4oJ6 z^v~>7U|=Z#oxR5ZDqCUtmVK0hP zp8=f5KzmX_V*)C|3<7$5kU3c!#sCJ!hX+)cBu;?NO9St<@1NQJqt69eCV=kN-ov0F z;=sTHS`Q?^02=RGpt?>0vd2YC`2SlqLk5=qrrsVEW(GzT7X}R#CkBx<4*%b*arpmZ zfy4g~Yn=ao5pntdYmM{&KmGd|bim^UptS-ZH-gp)Y+{fBts4M^iTYj!0~;Csed=@S zH9&sr@9Sm(g&!zyFfd4{>K+8o?=gcy9i-l%>HmKa4IMw-r#`0+*8h2cZT~Rnelbuy ztFSPD)@n%fuVYXEmn(-r>7=m%)<;lbV@T;=4B1-@8Z(}}oE^UDlD)zA^1Gi3KbR>hW=*ID6NJn$o>TmAosO_+Yli4gIoYwd(^*};S5Oanxy|< z5NaTMqp_&@flCd@jQ-}{1kijY$Ub$6K2_L!Iw(w5I5IHo0FAM5F|f?$g7nE(crmc- z@B-g?$^qIt1hQ|1BLl|{M+WY0E(V_2T#)rvE4&zZc6c%H!}bnA)d}oyWDxG=Vi1|l z1zD55!izyr{_ z*i*9R(Ekr0zk>S;jXf1A0t}2$c29q6_ml;oK15@8Pk&4Ilm!M14E>GW6F~E45Oz<8 z%2Ean2)lcWN)rPsgbis=LiF~4+olllZg9O15%0bLa?=`Z1_sbQWT5ft1rz@N7is$c z2Xv-H|CH`2{f#|4Kzjfe^)SdRYG9CE)W9GI)qADCsXGS3?qLC?Q7GF2bp-4-DKL+yXV#Gs)HVfUDT?1!+szaZE>;4@vI;zy9gmmt{P;PqKh^Gm?ukZ=N@ zZvYnG!%$(v`^>Swy>~%>V{glvM+^)L0vOB}I53#5abPf5qYDnp9V#6E|3kvNdj{w} zKPY>S3LgUtlnuHgdczt}d%Lmc#q{+I8^Go__VTDmGH^iEMD%y|*g)Le^Fa3pJPx0z zZ(_IrRbSBG(klQ_-}QlkVTI}%HLx2RKx6L^c5jIaD+4Q(4e}NPxUOyl4{I|(%;^pR zNkG})o#GHPd%(NoA$lQgc&Hli`5sX56JWiNbOZ@!NVtLfA8SDCU>dtQ7FsaC>=K!% z1^{P;qeo3c~KGK~ggZ%m&-n1-`o;>Td8kAW-#S zGoj+(HGEKU@Y*J5_$~nDBXE4|VW?1HWdN^f>~HB60l5t%2MSM6nWMtZz|!B?)1bm5 zBmyy~`-TlK8yA#)$8_z21PHswM}?2^3%LGl>}gSvWZ;Lop+!ZI0TgE-b6WZ*cRg66 zz`)TDQp5lM{~8?z9uS*B@Ib>FT?PRVn_2LH@)`vO5fGa};y}Y11qKNa8!9dXVlzl6 zfW#HRY|!|b0)q+?Tcf|R8xl|8u@x=L%RoIKCn4TtRKWb%mfdWyb-K94H(?G$-yFufzkoSx<2r1NdM%n zHw=Ob4dm2CtZ7fXL*cT0au z*PAs8p!CpN0qUQC=I%lDH0b<437#Kihp-LVD;{rbh6L4A4z`(L* z0RxLlB?HrfNQQ(p4h%7C8W=d%EMVYJ$!B0*;Lp&r#(|+@O#=fDXfN%W1q?hYP7E7V zS{MXG3je=USqe%Uy)2+|5M)<>V=o7&9s|`^pl}9@f!FRTsP;GaZdt#Gfdy2z_0Mc; zU~oXKBf;m0%mmf1sN(AvG3@E@?z#b5R|)DbgTg>F5!41@YE$3Lu%|B-9Dg;Sz9Gm? zP@AoP9m5__{7$?H?tAHqD>B*iuVy&YmjYH>0cy{H)Pl@1aAx?glgN+>QZJyu#10Yz zk6|zeG%#p!DE4UefzuabOn@RIY_ED_kBgBg!+!w=rZ`AG>t+#PV2Xz1<8BreZqPg? zQ#d5wb+dr#8UY5T-~~FMHB3x_DxwU`0t`(4Dx#oq8YW*AQ3h541}1M6Q3me*#vT_H zQ3f^v1}1ly*($sYEDONpdXI|$1Ct|E{EYwulO2c+3j@%c1WGu7){!q^*wa6=5u7hz zeg^p!;?Hgm0R|@BHK29ojXfp;3`|;-nb)Huz`!I4HP1kRfk_NxUVme^g#ZJSFofL$ zVhe!6iUM~p5MW^Z53#3rg8&2LACP(djXe;M4<#%~aI_YnaG#?KJ@yT1r9 zFn)ltuLv+OzJ;ji*lnM0S3mSP%|Oo;PS5rB)%W21|klw`@rHmA>!RU0t}4XAncwA0t}3sA?$7$0S3km zkn*xy2GphoHO)Z%*#5?D85J(DTUV?B*NfdUD%@bVE&;Wt!16p`w=MvM4F&P{L4bj= z9~^%>8P0&xZNKXO51?`ZBmJ&oIMY9~{Y9_K{|}hywhve?r-dtfW}=Oq`lO`A;7?x4bj`f0lEW6fPpa`Qorb?34oDpZ@hQ;X*DU~wPtbe>$SlDFjN%}=zp-bI z00W~4*pL0a37|OceF~XB#o`Wd|5t#4kz-K5*Yk z11KFb{981EL9V~C2RwNLwxhA@hX4b^4@g|1w8v%$Ffe?AsR4~|K;o|lB>n~_-an&f z4k!;m(tpnk(AX(RPM86**1x~I8{DRZ)kT5{&~aq&IhPfxsy)3IRQniE@3nZyz_9Zn z19KtxH)6 zPJ@j-8UhRq%Rut|jXiq=K+}GZGUk8)1H%G{csF?eK7`!^ZeKyz-8P{0f=Fy=AFtzJYJ8v+arSy1*J0S1P2D0>ZP{V|x`3!3MvP*q*q+W@-L z7!QRl()qe8L2GL@{_$~meB|NjxUfUc=lWMG)B$iR$zFJQL?1Iug+2GG5LOe=3N zutArctbbQ|Q;B^-&tPBeM>lw~~@<8t+ zNO(-}0)-9(gD7c1v6+n!+FfhQ!T=*DRX7fSET>KbVcKG2KbKzs)nau|s zbMa%~+2My{%!Q9ZWHujk%*BsEWQQM)F&91tnb~~MF&94unH_$hdyygi;a>15Aq)(f zji9zLbZ)J=8{BUOt$hXgM|J@N6R7@P1DaQC=|0lm+$}Mo2_(b7AmG3tWZ=v2zrP7` z<|3%?0Fu%0XJE2?#K0)vz`zBP@5usMzu|S2!+oc<+zYHDkfV5X2V1G+m1wCAY5vFin6{s}b($rIY(HdAx2Mt^&+jt%$!#{R}$0~@rx(ot6*$g5*??HX*UIWJb6RK-08AN(27$kb$f%@3J2F!c`s%x|u zBzkffWP08*$bkIJ*c+j`Mw>yVC!ax~=O=>#SnTHk)io9j3O#uYDm|}2eeYhF`&4>z z88mucGiZR-LEHyo2iQn5u!H>6-`E>qZh2e{+-Ga-4X}~0Vt|YZ^aj}Q2{5d&1p6bv zhKrqHjRn~K0j6HyF(wg^UKO4nAoUU;whb>MXgmSr&Hxo|e(0D$Z-5Fv1M?d2m_ToU zjpPT0HF{w8n5ann{|~8edregMz~c`r{f)gQDqJ7rp>8ly;rai5jRM#W;Isr8m*_Q7 z;r#%z7vu(rICxy57sdv;0mcS}5rnM`4jU62ZU&I~pm4A-&3;e^Y2Wo)sPOZH{0nk} zg^eWt2dEps=@#k+7+avfu@}Y$xdFxog#(NYas!MFas!O5f}|JZ2Jo5^Xk5V9AUD9+ z9Q}>GFg6bo8{`IvxCJ;3*{Db`Ft5=AryUy`z7Gs*w7_Y`#`GKm;~E`sTCuU=`ro)l z7aR^Yrd|(V;otzuLr^z3nD(g1LDPeS3NLu<599`LTMHTv5VkfrJvgXvgU6IW;Q$eb z#07+{4|aot4L?6G0F6NdD57+2{^O}o| z#1D{PKyGj`mtd%aj8pZx*zhs_ho%P?({ukpX%FNE@Yot;oC-AS$N)+wptyjDYlFi9 z!iJaK3n&~sRCvH+bRakQsPO*pgSx@ThMNJD4ngU`$A+JQ6`Ce}Oy7gkKPWx;s7O|T z!UvQdd{iVD5+LJsy*}Xl3vq*w4Htvp8U=7%_?UX}OG49wj|vY%88kik*zhuZSfdS& zix5yh3YsrMZ214f@7BPou3PhixAK_ zCe#h!G2b-`;BbJkLE!*ngTev4QUn?f5Vi$4E+A|LaG48X>w(J$2wMy61_&Dx7ce#` zZ^GE1xPY-iX%fQL0p|+{TNfM-;I=K)4KOw+E?{g>nuM`IaRFn4;sVA7rAZhYEQbrvBwc*$3GiZS8MivI}esvXA24+y0tFSSMfaF2p36%%0n@5rtMU#IA ziZ?v+%xLlwX!=>8@*E)hL2-&E4?8ymEU&`GV2LIV9@7TxB?jqNVPmjDlV?XZUxkeU zd~P$6|2WX(ZP4^{qRHE$$#bE}+o8%cs-np|qsgnG$-AJ*tE0)gqRDHZ$-AM+Yof`! zqseQb$$Oy6Gw?#?*`VR;jV6BwD$kBXUJ5D?)9-_(|1MM>rXO8i1S${Kk0pJG5|9^z z%EQd}MYCTJDv!&2Ap-KkP4L*;RqFF`ufoOm;%+$1d_)L zU(mX~1{Kg5`5<`}Hil$W{S2`1<%G(opvl9+7bc&ICJzfgSp6!5CJzfgn7lBWJS_ZJ zq4s;C$-}}AChvtN4+}p=kbW%wht*GDc@;K>G&KFN`UxhVg(eTHpJ4LoX!5Z72_~P7 zCJ(EhaK#U-euC-GMAgp-YahVmi%{hmbfEDMlP^Y-*F}>D?-f8QzoOCP!E0oZp}dGMVm zpnexLeg)9%w}I-1#g8DGye+ak7WdsIAa4hfM=IYL(ag68$s_eYq|xM~pz>h%VX@x< zDi01n6*dM*H2scf^62Ha6Pi4F`RxpnM{@sUH1l0R@-X*fai1#zc{iv$tbEHwGv6I5 z5B47x^F0X2dlHcMA|UTgK;8!`4|9JWn)`jB^0?gZM?l^mSzd*WfeFq00AzVA;S)$e zK8S#PFtWS~8)Qu=QuzcP_khK}3L676s{0t1q3LHulV6S|&xR(y0!^MBRh}UfO98LZ`0r_yKJS={}>kbkAXN2|NVe+MD<{P8wFGG_zL6a{>laED{&qtGwLz6E= zlaBz&BjsQ4zI%lG86rXQNbx6yrauEDkEDMJntUdj{8TjgEHwFPX!4-_WhzMKPe+q4 zMAgrTK7LVzCXY6L!H|wB&oBec{7R5KC_L0HmBD>K&^RY(>>Ttm`ZO@dx9ZfzQO&)x<36lH3ceH`x9vas-(ey{6=|2mV z2loS1*chVF7+{ z18rDiaLI%FDK@MuxZ)4o&#+--5yIhqa6iR{l?7M)g8LyhtSrJf^ux**UZ^};JCh+9 z5V?$|6&42ASh^J042-re18gi< z8izc%uVKT=12Z4I*B_~lfz8!$;?NK7%h<4T;L?vY7lgHp1&l9q_;J&O4s|{ElOBoMtOWLsZfaO)#7|`7ZZmZd_-oYgg zZVTG59>67E3`zqwtVeLkmq6rC;F1Tog>6_naLMOD^v}R0&jXTIVP$}o5$I_cHrD~m zL+JA0Hlq#e6=+kQ5zUvSBT+jlmsKXA!|&l0m?b%4pEy})QybbFDaM)of8}lIYOK{19*Fiw~*;wla*gOOa4*OyAkV-h@Ve^p6 zIOJjTfLb`@Ve?elIOJjTPzE^UVe?RiIOJjTTt+zLVe^Q_IOJjTSSC2+Ve?pKIOM_O zI5w;-kTk#sxzie{?gx+K*s!v|>V8hNwh4G1$A*=K3u->PJa`_*hLwdIhkQIFeX#K0 zkO$B6*s!wj;gAQ9v)Qm}fYTRx-c?~?0FSfTu^>~{2RxQz!}olK`ITt;+tB1!p~<(S$*)F}??97Z zgC^gJCchRuB-$%EUjNb(!d z9bK^7qi(w-rtPKAQYCH2DW;^4rnm!EIwC`@v@vBc*?E+ZRcGCz}4rXy)%i zlb?bnzZ*?{Dw;fauM3j>)6nGiqUoQGCch6&9@ajC<-h%C@-xx&gV(7d**^#pvfOclV6A?e*#T@5t{r-H2KA7 z@~6<`m!Qd?Mw4HPCVvJ^9(^A2ESfy}JmfhvdGvY6^Jwxb(d@r~Ccg?z{vw+EYBc#v zX!2{&W(DZLYlfQ{3zZp&b z7MlDPH2K?T@>|j5@1V(VLzBOYCchm`{vMkA4mA1uX!1MJNP5uCy{Btz3l!%ZN6A!w4I@hsmSO&oIK~ z24M1N{X0fj{|_dQZa!@O1SXGeK5T3nCXa4DZ0r#xk2ZI~2phYG$)kSR;Y+UVLd#GI>v6ut13#R517Bw)tU}`>NQ3LZAWWJh( z;WrjFFuP!C{$No9vkRu?FBUa0yC7>vSs4CdQ3JCJrsh8uH88uNY8V-?sDar9Sx3Rb z$cRM^%r2N3CM;@TcEQwu`f0f03$kX2g^>k|IWW6mYFM$Tf!PI9!-ho-%wLf811t)u^yAqVH+0NA2G+>Vf)Ru(@~@HiiZ?dDxy_@LB*BHikwt zdDxy^n0ynOyb+rD&1mxId%9ZC9ZA09=w+VNxltD9=w+V$$c}?kmP5f$%FS&Aj!{0lLxOON0Og| zCJ$bxjwC-9O&+`#14(`!nmlaJJS=}zpvi;xT0qt!g2s0k(e^wug4ens!j}r;CxRs3fhG@I%LvWi z44r85u(gaZ`7Shh*jh#b@EAQCqYRonY%L>9UKULrww4hlk3PN+TgwQOM<3sZt!0GC zqmS>y)-uB6(Z}~;YZ+nk=;QmawTv)%wDEmL@K_sUpA5KuKyUxR)-uBMqsKpNEh9`G zz5N4Q%LtQ4PakM&85z;rKWJ+i8PVH6Xlof6(c3?0YZ)1}(c%wnEh3{1nmpQCL`GdS zd9<~VjOgtvw6&0o=99yQQ$ct%M)YM|rij8a(C!1}Y0 z{TM8a?0D2b_GGXya^O(|*_Xk>$caY{WN!uwBNrAmu)Z_QJ=}QIz}&-wM-9w9ym-{W z+{1@O4J_Va?%~Iy2Id|CJZfO>5yYbg<{lw*H7YC&;5x&GH3Pgq0n7dka2m8>&A}xP zt}|>{FW`~~*BLgf8*s^k>kJ##Ex6>tb%qV=2VC;tK7kEu0$3ii&BFlh6WFk(;F5=( zgQo)?o5S4y0y_s!7l%CT96UW7^00I8^l`|;&cTC>V`JJ6I|mOk9*ijuI|mOkhKnh$ z4IOiVjJsmW!_L8jj9+5P!^VstV~&{eurgZ&hyP$>Mq)VRVSQS09P+R+B^ey@urVcB z9P+R+B{>}OurVchZ1OgOXTaqd=>BN1JPSiBdLFS6egjdHpaCt*8QRd*sIV}A*Rk8M zx-0;j!^VKN&WZuNj@^dU1v0;jDGy%9Zo}$;OFwuWyA7)YF8$zj>^7_(xb%b9vD>hE z;L;CnJKM0%0p}wu{sXUbw_)7_lSk|OGQiqqkhLFZ{mrg!p4Yx zCOvGg5%^3^6*flnGwES_jbQTVXVSy=8o}hz&!h*>PuQ^f!s;0GwbtOawGFE;ByC}w z>BtD4pRi%|gXu@BgBii|6S&fX3JW86eu4>B&!eRk6&6PD`~*Dxqt!nuER5j!2^&@) z9Oqmxx`Fb%4XY1q{Uo~k!1EI}tUfr-v0#Mlm4byI+L`@~u)R_+d9*X58DV>+VDe~Z zMl-_pO2On&&in_RUjlN!$(fvb( zmq7+{CueVr4L9gcCZ-Ou9FK#ycSQdvqs&#+ShCJq#5h z4$wQ%`ayTU6{xDd?>V6QgTbToAp^tAhYZZ%d)}aTqIEv}|6}IE|G!m{?nLW+`2Ww$ zhyVYB)*`Pw`2UaS56GQpF#Y{qJsB%u`hPI6%=`hlXAI>|G%qZ7zb#+@pBcD*6+-~% z%s!C${WF`u_bY?k59aS@r~%3KZ(vC1-^h^CzlkBEe=|c){}zUV{;dop%nuki)b}!6 zu#w^4r#|Pu1@p`Yiv5k<8~SH9T~Xir-(&rLhAr#&Fo5^oLc?PN*xaV>7yW&`Efbs= z7(n+u>i9D#Fz_Ex?r-dQ!g%9^3PYp=3o8SI>jKcdvYnuCOHftSoM5A>&EV0g$iOgD zk%3uNlYwVtBLlVT8CX=;F?cX9IH0<-n}Hqqj=t553<0|t8G<{Z zcl4=CFz~EqWboL{$l%?HbVuK6Mg||zb^kx^W@PY(=~t0tbAjt$$G|dk9VDJs^D%_% z=3@w7zZ0}hyDbNF7i0f229Exv3@rUi7{L2(z+twB0TOmy-6{PYU2l557#Mm%H=A=s zG%#{|DE30`ntjmU(xcMf)T7eh+@qqx3cd@AVNELo2n(n1p`A* z3j+^`Jppn5oS%*(gMo+wgP4vZgOz{+g9uoDCIf>CGlPmiB?G4l69c1)69c1$BMYN| z0s|{UlY`fo4WomBy_0ucr!4l zh%*SP=KTLJkicNG#)pBSe^S?%{;6GG`lob#>7U&7p)ZJmK}C!~LTxJpOJ4y4Ltifg z3+Qe-CSK6Jf(%@s`lEklTZ;-Cg9MX<1$Yd8{Q?Go{yhveAoc4&{&JY0$|S}hsV2d| zxUPbM0d&72s9nIoP$0zQC!n~-fq|hp1f7;^fzG8FW0V<_q0&QQ_6kD&pSuGRN4bU@PeuNGLk z?(b_TSihg4MD^T6o%MTA(=aIgg3`R|4N$poLbdZC1H;UN49uW%dbJ`0!)`?e=FWrv zf6P4i|F^m&1J7#3|37vs{{P*1@c*Bg2O()|wc`IjqBs73+^zWkKTLmrM^6S^{|yF~ znKu~NRX73!82(=g_5TWR*hMkw~CFfgcFE@c6wM^HJ>lmI@Hq(Du8fl*B8|5r6b z2A2LQy&NDjKxTo=hML6(G9PSS57fMg8H&A2Am%X$Xh7zru$kB2^#>HMz3)LJ1B2iL z2JQa+3?-m@Gnp4SsH#g$xT7w~-~qck6I8CQWMp92$;iOm&G`SvY{vh;RXG@VRx!=_FhGhTiY_w z(d>2_;2gtvmbO@rs{#(INfb2(*xFiFEvL+(~vnm?{ zqssCB{|$aJFbgX%@PW+e)&KvcSLgo^byWsN#wP-bj4cw16LSCmS80Ki{or=tlK;OK z`2PPV(8eGLGOt(f|Ce5i|34Uy2q-eMNGMLI1gmFR5c&WAgnR}DaQ*22|IdUR21Za@ zae>eOzY}u*{}XBZ{}p5oDBeUAAosNP>iz$r!pPvxctSvNLIfmDiZep)Q=Jg`|DOsY zgPyn|0}DfkfZ_tL|NjIS7}yth|NpPb!N3R=L$JO7{|BX^1r7`hpfm(>t4IQa42bTZ z*^!~b$^c#)2MSYgSgm9zQDOZ5Ps9;=FR$wVFa0yyz+nptQ|LX%pnHsE`u8)WfZW~R z+AXo50hE86AM`9mX0v%XQku+A3Gh<$_2;&f5bWef86PaC>K%;toqWlsi{ot_Nr zy^Pq?^7<7FIqTP=rr-V*3^^cI_s?v*0Fp-zE3kMA=&tg{9<)2v6F~Y@oEaD;5*Soe z(xB=29RsuA0S10hdhVauo6yVu{|o3|Zq=iZG|j9cp*SHEoJPUz8F-rZ1gB{suzg*< z3B3~kzku3>%q#+mj4l$26SBd2SU~A*LJl-t`~3eiAs3piegFTRkOxiIe*gc0(nkNx z<_Enj|G%K5jr|NMp!5ccPxZYF1(5js>;Z|-e?LI|!}a?auBcloe_6ke;llbo3}@DF zXE?Eb8^e+HTNw_l-@>qG{bq(8>o+lMS-+8C!}<*j;PZym7cp}5?_oI8zZA5GvTaX) zOHYmp8wOdGh2m+ff1hOH5piDYoexka2sni zBLjN*y?zZey{`t>g^+mY?FBiNVd7da#h|+obaymk35W*@e{69i;=l;WCw-vu;Qjz|+<@g9d%%5xHA)N&VEyxY zJ^H8jy7W)$X6c{QlhHr1+rez>|Nn?EUkqN80@k|+a<_T^%$5rvK8D#dTfyx~WN{S% z295s7-QfOLUol7*1A|loBa>P&10#d*f(E9^3lted790Sz%|Wt^A0!leDnKj-2B94c zUqP%%;2rf03_6YsOaclFmO73M%u_NLR6ugNoQw&A3JmNF94DO_Bm)|lUPUPOfE z%^N=%Sa$xz<7Zg=8`IA$0tyVaDvS(_ec+mmfq`*?gW^;Ph@bWO7!w2!FmNzPoOJH* z@AYAj%xGX-kMK7$w+D-+9s`5m0R|nA8T}ogv5yK>RgTF#s=N#yos0|&GePYjP+RyR z1H;aT49uO3|9{K`wU6I}!UF1V#{Yk2!rI3mfAd294b`tAf#h#q29}w;P=CK=VA=T= zkH1mdaPYVWxmCcC!5S2MeVQPWfq~H=L2+sy#NWC%854vR7&sXCGC}@6z`*O!z{rpA zH{? z&|Njx~`u}lf;{X4!^bQ)6SP9eL#lSMNi-BGB+$5QmSqvI{QO6?~d_+%z#v>T~Vfs~g*+W+=GC=g7WMG+j z5|U0GlsGc~BgIXt?@* zXuLqj26P{S;|0>L>*@iIM^E$u>0n?GbzootvHBZ(E`ZuK3qWI@Gh2>;#4yb5?gqPH zVm3&Yfk7|<(kJV0=@RIl*){{cEeTT9-vn_BXj~e^2i4Ug3edDLqo)8=|HAUHFatzf z093Al+k$N!puB+Y4saWDKf{&&4Ge4gH!^JK-^8$`e>205{w)l9`nNJ1=-+ncPAA4l^GaJK=lK2z#&FQ4s8(y1}PP}{|Eb5GhFHK?>S+Z!|^{)EasM8M8c_ds z{UU}t{WF^y)R#czSQ$X={2H+Mq^=MBiy7{K#!J<=Gh6_TElD{ro&njvuBDSigzkh6*PGp9%*9Z+}Hk5W7#0fratm0hRST7_Nx2FtDy)$8dpJ?u3fD z76XR>0|VRoRSZ`^{s)CSV_kxZX)gm8$j^NS3>^Jy7_Lm>gN$Db9$=UQQZtF4!L%P_ z)&qtapz!JAW-#dQ>UzMyozTG8ouJIXlh6QiD~Qd^ctQolU%!*#3ZqYk;>1N@J1cb@ z8Myk_FEn!PybGcxUn|Ff72`uka!F@EZ0E9 z4f`1Wo1W(ciHEIU&v2!GM$Z>cI86I80^l4 zNMo=wdotkqVPmk|3`{F`FtF_0!N3mchlBb?>vu8)fcr{Fb2IA~Gl1)b^{W{|KxrS8 zuEA-LlYviwfk6tCZbcLrSXCGq_yrvQcZ1?tfZ_iMkRL&DFQD)rTz2(0HWV;01vD^d zaVYj^O`QQ!#~2f!$mjqmv-%_$WK8=R7#aABn3(x8)EIbAF@VC7SwBJz6lS6-43ilc zCaCr=Vz|*~!obmI%D^+pj6qPv>HmKT2L^KnhZ(92OdSnON*&4!f*l7yc?o0(D1Cxx z#=r)}J|2i&Vm%CMAhA9PNZu0L!Jq`D`$86+k&FhxvIW)PZipuevRJk|=DZv?4lywsrB#|!myFM}#btWOf^=ba3S zApRtNu%G!vA2P^-`P@)HpJtE*@j>N6e{T;cK3PC*E5>;TRLuDpxIp+t%g8Ip;A>%2qK4X7>PX=r}rE@g{%gogb?4Y*DN^b_1o!$_)gT{h{aS__Dk2PQ{rz2E`qwbb z0K01k!xP3g9g2OHkhCr?$*AAIo?!;K++zH1FVMiKWzfX%A5?GjX)~~>c>Vv+crZgn z*O5VT{aS`A0tyV)>sK>e0GC-@@G|QF$X&=~mH-2TjS4dZivRJ{*7#L(!m>GD$|8U*{e4GcWT z4lz`mP-BpcJHWtQ*2H)|LrshU(x#ZC1u9qm{}bzCU}IdEpkg?K;XkOZHkSm~|Jya; zFcTyPb{hk@PBrN7?Rvn#bD)8l=YTTE-3$^38hY0=ImhjZ_W*Fv!sFQMNk?Bi-X!$Kf!I51W?%aBe!vS!EKf(P}&BC5lFo;H^YC^ zJaC&O1XPyy_xEf8wR1r2VPh?Z|AG$~{7ikoZ5AJp{e8U9HcNLy!5Uo#hCT^snzfnjDM1G8#2XpR^t6A6WUb3R3=n@(9SkNNtpU5MO}d{~3^< zKyfXg@E_a<1Lt?9j0Of>4#ghbY2a~7#yuH|j0+%jC@Adu^cgtJ`4|{MVb=SaL56|v z6cb}*fEoi=5(8sjh8j4GXF%&N*jNYyR6mxw3)GhY)nB;U1fX&Y8|d&=7pUz{>DILv>9A14sW(h5!Ku2Ie)93_NQb7&z8AF!1!RUwhyk;`7$o{vGh~3--V8GRYZy|%Y##=d{WpaRBad)7#JH5s4j6~P!M2XU|JKwpt8i7K>^&}SiztH zYH#$fWKa=Sj{f}&GW|1~a#~dwz-tXbegnyY>;%cF z?`6;c^>smfNci9Q0}cNQ29}D3{=TjUj87_*8Tcz2KUyV-CIG z)+GZ2qlAMZC=Lx~GW=&&<XWYMzVFLq4#R0~54vIQE7!(*JPAJ4zJP`GAOi~ndq4vNLxd`*@5#WBpxVEK;Y9yVhAsWv3=I7`ppao; zU^tbb*t?&BL47?#kMIKqKaePFyuN=Y!;aMp8CZ5NWMJ=vuKQ!wDo|X#gMnlB4hHVd zhYTDuA2M)*+90bJGVttP$iUzEgMnw}4+efv+hp|)27%o>7=$|?G6>9k$RG?_Z?<|N zgUIfM4C0+X7({0NU=Z(L!f2P1-@l&W!0H_g3cGhODEA&_U|@W8Kym#JhJ^KN7);i$W-wU4pFwB+Vg{Aq!Zv9$@jP*MiKx=L_K>k&?JPtma9mMWm z#Bid2Ekj0+9|J@0dIpC6#SB~e_b>#2;vckzvws~!LQf?FLoakb8I%UrRDjoTgn-uk zpr*NN9iTMFz#;)oZwx6C$_&gB;PeJ#tMC1Pfbp<{;zTwE4$v6)`uz+l>-R7ytY6CD zvVIYRjQ}Vf8!S{+Kx2sq8Ti0%oY{JS;ediFXq<1bcB0Lls^C}eA>N7C(H+H9h%vht&z%Y@Efup~%`vn8LM8g6t zP6T2I5Oz;?`Kfy@9OPfVDe~S)HE0QCz%>lgZ2A?p&L>lZ*}5kJ_@ znH>y0DG)i3esGwA(oJXg3)S=gBw*v{44eTCjIT~8u2%xby^8u?1_#u*ztRJWd+1t( zob`JcGS+WoNLjyuA)%+4L4%>8K~*M!L7QPghbm|sf_cFSRn>FTd_dz5$m0(1I+%>L zUn*P-OmO|saR-o}kk@|oF=AQ!23w=FkRbrn9`4`6kg<-LK|>=EJg>;3k;uT(-_!Mm zK`^5M)D8og$=EBP*y9gkF)*n90JovFK=}ovRzQJ)Pa~0mqrVTN=L9(YgW7$frJFbHgD zSihgaX8j%pll9vf4AyUD&{)5PL1q1B28H#T7-ZIOWRO_Dgu!F|QU;&(%NPRIFJ}l@ zzlgzw@fu{@6%-=U3=H-C`x$Kdr*`px#*+I`*Xf#o`2DTme!~J4HU>!*b_Vd7HY!V} zE$iRI0Fj^Bwm^L;186Nhcpat+I|D0R4xyJzg`EMs=T2qmv^jA3nQh=PB2fMUxu^do z0|Q8o*~~$)7rg3WfvTheLnwp5ga)Pn@c0Lq?w{QCfI(-^3u( zznMXye+z?3|5gT#{%s68{o5G~`u8zdK+~lMqFJWK+m1#YG|9^nmIiPwA zROd0UN;HUr@)C-5j;H~``!g~yro ziTJBb(R1j2YaTV>`g0 zyM7y^irP^IMuR0FeKSDyr65R*fnh^K|9WPP{vFIJ4A(jo85$&18NW3sGK&c)u471|7DHC{~w?|18W@q|LLFD%L8gh_Zc!UsE9H!3PILohN>_#lupuQ zFkw>Ipem9H@-G9!A{7RcMWzg<>kfg|whO5CU4*o)#T5R7*U0oY_VR$t1Fh>pGA~O- zoWZ4kN^ggX90QAr7z3w@FavX+76Z5kDe1rv2a4@J9R`E`ZqS%UMg!xT3}pu1j0Vu$ z35-3-fWd?@w?J{?B?b;LaRyEmMurrzP>8z(7#LJl1Q^`K!Wfi6W(hDbD5?lB1c@;+ zaH%jdI3cN%RuN!G7Yl=o{|YcLh^q)N6oJ(+GO(#IG9-xwGq8YY@OY8{LokRf29a}y z$~g-#FmS2}FchmWGB|_eKz2^jXD|cNf)5y&K(vYggR4+51M?yS1{1M3==d~r4}?Gi z#Qr`d25>sm0ImOY&`@P?Fi;gyU|<5}XV5qms2v7se<7zw5eEjYbxokP{yiC>^0;3W zRED-CfXXFgbs#r@=D$IE5Y#QtUSV>8^n2A8F&lvL0!SVdM<7~E;XimztiP%2jSV9M zBV-<3LAA$&fv3llfu+ZXL8Ql*L4uJpK#|cWLJ<@Xj0ZtwDucEPD+3Q?O_PJF>ic=Q z7;BoK>%ie_nm}t`pzFX<)-*9f*EBIA)-)ln1Bb0?B4Zu+836_!$$ror?ix^;(V(%m zfx)1EHM54g<>?!s@BoF|+5`r0xPZ#A{@$J&Dl80~pf)uqd;}Ll_PX@9^jrajDX4q| z>4l9MfXsk}X@67C6;N3S3PVs?2-?5Gum~Jh!VC)}R6%P$*Dq!i0nO=v%mS@}0GXwh z`X7A94%n=9j3OZOKxKwl-v4hPH-O9p(I7KHG)OPVjUc@s_k;C8);56WpF#2<_o2&! z_0H(oqQb(!1nRGV_`(d3ya>{x!ot7~(xbu(xw98$t_lkS=*}Ju6;_BmvYjBaz^Lpn+@)h%mkau3et-v z2fB9yq>mAc9O%vskQ_6H9B3U&D|8*pQjqHy7z7rAma;K0fZ|_eF#{tg{=qU!!12n% zkfNb%uoJwdosFSkhAOj)fFdaFM1ueS1E~{AW?%-D&tl2{|AT0#f0@-SFS&sB?V`CG zv=1HRHYSifiX0;YQ-6QgkN)M%I>R-Y1s zfequ&gAA?=k_=1^4Gb?l6d4!-gqXY%6eo5=#{G12859_J3zQiT9#CPdIKjfM2ysuJ zK7&9ncx5bTJRw1GoeqNlsJszifR}v+HjFBW?{Y~8`K=ll$&n(0U8K)N# zgVZr%;*h$o&xAn(6uuz!eI}r3Zw3Yd2L>N7Uxk53P5A$T2{RcO^fDL}gcTUF88{9o z+c4JuH&OimfSJ)lg(D=Gf(7?bO(4czG+k){_gko6ooCJzIHXagwRKx?d;-}I?6 zsHm{~|IgH50G_vH0<{+*<%QHbB?cKG2L^u79@su*h@W~qAvB{hcs>@qb{aHR+T#SC zM*!Dxpmu|Z1ElU3X<%Skr^LXq&Il~e%A_zswWlBA&vp6?9BU>raHwqs_g&T2nKFn7 z9|4Uufaf}r^mzDVc(j)n#X?h_5F9Nq?uk_Qy~ z!7GRv7#PoZuxM&AFbFz;=IQ_c@6(0srxRQNnO6~T1ciZyYX8jUH=y`N_CLryAiF^R z2e}E9K0zTUrtlvel0ps){wg929{m%#B~*kNN>l_HLMFL0m@qkPP!&>VU{_)J|4%F( zlHMnIGgyN3iY7qoe-=>NwfRk-D}zd(8w2>vPLTX04+cw+oq`MuQtO-;WF|Q=IDpD= zp(apYTtl@_l7XSmjlpC6P6m<0-U|`^$WNCA?jCTTI)fZCOU z@OF3e2TQ@`l|NkLtB$!Wt z>sh9Z2F69;w&Q{Rd0j8ouVuKiei5Tge|Ogx6-EYjPhpib#-e-=yX87R$KcYPUKkhvE|37TaF{q6O-)GLlz%rAEfnD|e+_Njs zFtC8u2JAe;zz!Rm2CvCo$Pln|Aww{{-3D5#y^z6U=RyW=ly=)f1|Lz-`hbND{xJP2 zoXp`XVftS&fY%3r!fE9yhLD}B@T@~z30a2-3PX_k{?*JX3@j%a7%K%7dq8`3*D>p; zb}(?P@nB#8sp&h*zyccgXS@-h*z3>0(BIrWg>k)y;<}RzEEAF$WQ@8Qm<1CUSacE@ zm{cUeWe?Nhos7zh7ceS|C_w7;$!i#u8CVJ$L>n0R8IKew_jhzXVBjkNk8OeYAT}f4 z0mXjM3JsBrCI;S$21b7m#a=@OhRGKgK#2&NCR!Vq8X#?K6*dMIQ2GVQGdOgp3NbM7 zG6=>o*f9QQU`#xr!XTK&WZ1#*--eOlKZD>Q24=<#6=sbBMFzntCc~Hi85qw7C^C9> zDE3`|<|hV7T{P)5Xx^EDO)!y}6O?Af7(i(zKozon^?<5s&)iz{_13Ey85njmGQiib zg7#*vX8iwSHzVr$)zzT(cL!+CJL>vXxPIt*Yt?gebyssRu&ADA@Yv0Px^{J?BSXMW zN5tAyRq(nD29KSN3@B??S2{BIh@JWpMof-O~W_BZII*6N6x4 z18XA#DYh z`2WXDN3{8I$Nzt3IwH-Fdqd~Pq5464R^j@+8CYg|L(;-(Z3dRz+K~BiZ2n)5w7&sV zK7jHdC~t%2Y+!jA)NY2cLHSdFfpI_MI{`(IdQkW@w>~J&`uLI3nmz+VA0Kor!rD2upmk87 z@Q1BsA~~(0t%U-wdxE7^=vpX{8<5vRVGU>4Is~M&1`0pWye|WbM+2jZhcW}F2Y4<5 z#%3}-pkkE&|34_qnEAnBmdJQg0JMe=)ECzQwPP8xPAK+kFfjD5Vbn0v|Nozn=YTRZ zKXQ1TP{jx@P`YgF-T~TU1PYrzPFQ%&eyh5Q!DEdk0|Rn+!P6CV?U=eHXe|eHzdzF2 zG4Q&LRnT+^&D$vZ{Z}!t%v=Rtx52nti-Bdg79?GQ=0rgAv!Hof(41^PXv`QEUXcC% z;JtWcgqJ8Nyi^z&m;@Xl^#Yc)LZE$<6G3qZYV&~BGlSACXq_lyIe5LKN`FUh3j^Vqlq>#lWsEG20guuIl`t@})o(6uz+Y0YG)w z%7Y96I}b7hcf-yX0Jnu0Ja!&r@J2ab;2?vKI6tT@#NZFpufoH;2(F)>fn_#7qu7sGdlw`fnix1L z8YZ7(U|`HYpxDm@-XA7x;M2e`Aq6}y%`ecvz{J3m#vszjzyoe0G-jwUF!?bVYC+ow zOim1pj1ek~t4=5~Fdbqt=KIgUtX-i9Dz`x92sSXVGYFnxF!25VpJ{D?DubX81EZD$ zXughxQFw-;f%pIa%-RPOnT2O48s#^D&Tn90GR;t75H10&%VSo(4B7{o!o=7xL)9qr z|9?=K22P)#_3$hX4U8-f$_yM1koE9THYgtpFfbG_dO*s~{+V457+4}27*isY8Mq@F zK-+biw01Gi-TEPK#@tILY47rfhtqp3`LNAAh!rGFvNoFHPWg7&y+Jm5hMnZ z6JTHn2Z$u z=1heh;Q9elz9HK6;I%E#Ha^HKkU9Yd25rVO&@kx)g-JjItj++Z5tjgEqul@hLG=nq z593BqS;!#As0GynYJakvXkb=3q0At80^AOTu|etu7#M^ZB?S~g{T0~SMvyqD-vSyB zQ(#R1G#+w-xmdKAArgb_`WKn_QA@;|9?b1{zLXvLE8u5z6@+%l?MaM zOb<|BX4cY`84N6{Zx}pwW}x+D6d3|`g7#EBgr3i($-uKxk-=jpXipXL`5B4~KB8~_ zf842v)R*C7zP=Ks{|y7n%s0@oLWdz_rw*R7VjWsvrnh^_BcQvWta6;Pj;?Er%X1H%kewPOs721gi}1sWK@b6EXr znN=7XG*lTFPBehls4?yoQ0#GLU;vF{GB7(FVq^i&-7=|UF>tK$Vqg&2{QrlF69bD- z8gv{7)K?SU0M^UErqRGy2GxI!L4bid;SggBRDT5n2Wag=k27REje)u15aSc5TqXm@ z8qj=$Go*e)THnT`lFPuc#+QMk#~CuN!@zvv5VHzYUk12O$Rl?2|6|ZRS3mgdhUPz@ zaavG50EY+ooC0Q@{;r-A{mYm&Kzq{GFJfFF>cAkRzJyVue`bqI|59chkX-+AW)=0- zj4JAD7+0w8VBDa-p3!6ddIp*GI~XL^uVD~bzZx>01J(x_L*oP4p}vz5G;Sl)KeJ^D z*o>8oD(dSPSE#RL+^~KvgT(rE4B)$a)~|$&;ehn?Pw06AIv;xyxEE=mD#*aF5-bi{ zo6rhggKz*e&ja#@%FnHTA#qD!p;D`Q$}U!tZ8t0^fd;17|x*S6IWqp z0N?eavUFBG3Ho?d*crfg+^8&_RRq`9+C8OzX4{gUr3|2R+8M#_h0GtL+bgHS4!MI{ zW$7%?z8i=;;`ykI!C36?O*j-5n}RXX(S;O`5&haD51S zLFd5ZvsXohodJAigv!!c>~Q_0*~<*qhp-oPe*r#wg;m%Yz;{WhES>oQt{<1ZGaE6^ zO#rX8oY~F*I)@Gv?%;F@s!KrY(n0xXY8MYEAA!V09U$dm|IChp{w0hnK z3zDD2%>cSTP)9I<)l`L@L8rf`=ZN}hrZup&WP%Nl^LRjIyZR2MC93adzJQGJ{t%zOv2Yc(Hue*)ibK2Y1cp+J2t(-L*dnGd?5XJ>%)!S;rAYca6Q)`I9;xr%{h z=PCwv(6|X`eVA&`%p0&hyQ=4AUVzt4GZ1Gbg~-=Bck|W!%0tG@gHU-AIM-1X}iWmHcvFfwq=XaJ2jf%lKCV3YyP zm8frIywcwb-9HIE`-gG+2E|D?A?;6L1%@t=S)lP|6;=irAqEC+@cjGC28})z1|D_G zOKU*lATf|XKzux$kn=Q=*AMocf%c_& z4m5!JGq8P2puP-@%@k3gIPo2%pDcQi!2q;g4YUTZA88#U@|wfG6HqfbG8!0Hfaik1 zG$?*RYl@hBH565rGH`;{jj6Cf&d^k0XMohpc-At4!V2VP2FZW}AhVdXG!&s`fY0KG zo3RAcCP!P}327r5f!gD6w}Z~YgRTt)nbUU?>Tb@62F6TC9~wq8c_%1NoB>*Y(Y8Q+ z9n%s93D6z|9QNb!1IYc8PB4JZPguafk#T@Y7l#=*`~ZqekRQZ8{|BFL1WMbWG!BYy zkQ~T-5WgRhw$)YG8Nm0AsVto_2`-N-ZO`lipXCMWr-RLdt{-6F@@P`k{{Npf0o3+p zlu^xLU|he3QHFtGfhy>H%l;W%5Bg`eJ^{_EO+L=R(9aK9tIGJHK(Y52WW70PZl-?) zqYTImYEu{(#XA0f0Ap;|5d>Z6m(AXZx zzl=o*ioG)+er6V^Q0#q%LMYU@TETH*D6)px&RgM{M zu(?7|K3~0%fnoPT2Ifvl29}wiGdGtoFs$Cmz_NQM1A8YU1IJ8825!*!=IVtE9J?1X zaCb^F@XVBC;0KL+uHMPOvwJ54eV*sfyB9JDcS7>KL=ui!V+{IQhz6?uhgKSsyRaqc1AQv9o!!}3@kHs7}!DMv8&fGu+lE5L12j+qD1{BweVXXXh8h<{cv@a$f}z~6b0L15-V zH2<7n5Se)b8ZRptM0T%W5br$5ATjeGntx6($jm&!AisVmXkS@_#_AOeGN5n5>NWitysc(=ehu9Ho(wEAJ)!Pj$-uIEB?Eh>BLl}wM>O|)GVsjw zgt~tv1JCZ24E&vr3<5J9(cJIJATrYv8XqeeM0T%a5btzkkeKO+=6+8GnVFsp^6S?y zD6C!yjgOTOcQb(EV+JH0sY^^h25Z--@G-E#+}+K~z%rW`>h84+EW6h-uy->uaLh)_ z58b>BJhOQjAmP52foJzx2L5hF27%dV`JtPaL1Z>BgE%M*SFdFd*}axQyql3hVm2da zuNFAI!TF(^mqBJWFN6I0bqort*FxRB7UFIdE(TUmJ_d(3$Mj|Je2g64+zc!;xuNb} z&A_sIHI97D&A>C08|v=W3_QD6|T!}-|92)%+!avdp!fs?)5nGtv-XuOns=k z*E5LhUXLT+>NCj9)Q9HV^-y=OhqxPDrcdmJ>>V+Ll(h_?w1YXu;-JFL0KN}IW$AP` zP@V_t#Zv!)#S!(UzY05pKPXSBES>fppFSZ4h8G~a`*ayZR9G3r1s5|I;8Mp%)KH4l+x9HRBNmz7q$SwKWt$W`gWSYE!cIX+izSl>qT$7i0|% zXkLr4D?u5g2XvMX$SsUKkhUOFJCF@z2S^Symer@q02*Uq1BD;REogF}`x1g`}G??{4-M0Nu?A+na{)7ov;ITpuPJB1GJY7Y}e9yBF0HE`*vV|gZ38?eMTI!0Z0#I&)3WYpgmNe_MZCQ z|1(t2%?Itb2A@3-+ONvIfadoVFd^?*1(lPa_ByB?4{G0o+RN)<=cR(yFQA?!ogvV` zzy+#X4AwP(&OK#iV3lD4VbDGY&|Wcvr2qe6w872>&>5ku28;jy2VomVh#W(rfFei@ zLxO-RBur+kfrLrt0rkEAA4~-8{oKzWBY1!za{V3#iT<{p1)%VQt!LLb2wqRa2U;7# za1gv+nFqw~Z|(lk-`=^We`ZU`gry7&6P`orY84iSOwhhI0R{%}NtGbAAblbV3=$@w zbM+u*h^nwKgn-Rx1Dg>5HUrw9RAI0G4>AL67Ra8qo&_*_!0uWAxg$j7SOe&sP0&6) zb XSSRH&C`O?8^Zzc9UT%XEDTX#duFzP?EuXOf#n@6RH1f=g5@E8@d3L7>KBFu z24FSdvHDi98_t0GvS9s?HVMf5Ot5}vIDqyUf#nxK%m=%xu@k%o4s>S>^o$3zy?)cd z=fC&&bskaQ`~L7UsGb~DIM z6?O(t9~`uwT&90U@0tFl?jN8z`ToYv6AL0hV<$~dKyH}e3N8a=LHiovYmFCx*BXQG zO97d!j&Tmfv=UId0p+9qrrwnGOBgbyuVctkVPvoatrrHJTQ7Q$!2xuyLw|oacrPWy zz2LL!!J`eJv3ceN9;)gR^BdGT(9W(`WMJ5-h;(*6cpmxxkDZEWXV)wK|0B);nny;Q zT@O0*WhG2M2LsD&4hD7=&^dJ)3@ke}K=T)E8K8AK7_EmFmMJq^v`T*Vf4;WoVtX8p~sbh2NZYUbOO2)gMoo}`U-|D zke>ejUKs|S0td$PClsfvfa0&E1-4clrXECt)I;wlO0kq+uw#%opsl`_Ap?}}7g#Vb zK=S<**#1}0ne!U`Q+iWCdiwf6=C*admGzq#6xMHKkXgThK|+O} zfwA`z1CI&|=!j9sI@|@Ia~1Y57%(`j0G&nt0yOUp@&{9c0w~WIXgM+niYPG1st7U& z_BAswFl`o41g#@i5dfdB&p4st|9?>3vLNFB{|S}Q^YVzy z1pj|s;Q9Yw|IF4GOa(I(LFe451^xekZkK?<|7W1ESigb6qJIN}g_Hw>ikd3}qsp@X z{|!ztFbg^`@Pq8`@99lp+7O`#ibKX?0Yz0821dpSkb5yed!fN@1l^Z50dg;f5G#W) z)8+t0(3$s48wwObW5bM>1r$N&m=o;>R)`-!<}e0CC@xF@?O$k{018i#KR|KX4-QKW z)&2>+NBVnu6V@>?Fo4|1;83Be+Q<9{HdapZInRBl=REhf^lpL8PxQ}h@_^0bGeOEa z0}%%XZtyrddNV-n1&|v-XI6mR2wFed-v~K@9hA2E_cNIEZ(xw<-^d`-zllMi ze=~zh{}u*~{;do;p!5eiUjmZ;CYeCX4~zb0aQSg!`Z|VFDvXRNJ&-$Lwul~N-~io; z)<3i54k#``_JZjCJq#NJ7#N>|?%$eF!NAeq*`v{u&%gsd(?a4L1B0ZS)8Z8j#|0G_ zV%D!`IM9;?&VwurT+s~--04iBjSOKRbEdBa*~f5Ja3O;$XzdKBT>xqWsGeK20Ms6U zjRk?u&4ka(ka2zmXuJTfA9{X;D#xM#P+LHii@^hQe-UgP0ep8)B16E=M22AadF9}9 zkQqF7CNg+;BJVv&WbhH?0oeA391ql>`{>bt;<9UH`pE*2?my#5}>*1g#w_v z5LI6?cxaWnG4_Zz%qV43+6nkGFN zLUwu*2)EU!X%cj%&H4oldjvr1FhTY4%+@8KybMaeAR1IQtY5?cYKNZbU&?R*Bo3;- zLE@k^3`)zOG>g*iTf(phBoAs|tFSWg_V;ve=UfYjjJ*b+vpqI| z?djC+^;;)zmws><^_ zt8g+(!S(You*~Fx#Pw=2@(3udL3f^sG%$eAkO!@!0IlO!eZN3K^$pq?tFX28DCrY& z*AdDdD$qHlpmm2x_j!QVeZcfX*Bz>^oqqweW&^b61hj4gHkS_G2f)Y>uoLNSOHi1t zWMuHziFUW;O6c8|I~kGhwq%r93Db|f=Y)?TWG8{UEkWfpsB8wMRZ!S~(;=4h-@gQ0 zX7_;7J1E_P`XC@ZpmRMzWi%-5sW38}6;*_+@9SU9Z~&xMG=YHwls7H*o!4idw14-LfLW^mhe1E}2qYMX-Eq7#y! z>l&GkF)&D+b5hs*|3FuZL4koQLYYxJfrYh^!ENzQhV!7fXI^kXRdwxBE!Fj?XWzot zHo*2TNPzAzh3@A<-oF6a&$S-9p9{8sVP-=CT>p9omYM58d-<2#TFuYEqOJ{EXYZl9 zo1cLlzCOYdyiOLpcD5UKcM-VH16e!UjeK{JB7=`O=#ExJ27j1-6&}V|*xK1{Z3dRv z+K_y=Qkx-Ur#68y7QNnw)J@C`Or-}H_`r1&+xi6zC#K|r_NOv181AtD587M4eh0%I z6-EXY5l04&$!i#{Psw87Qjz@s-_YCsKeM)nGH8rz{Yr*CAURO{2{u61p@Pm31f{3- z>pk?2}2E{ixeeYoa*OBWNF`NLE^F2x6_5=q5Q*{Fazc`bKBgkJ4s#7W$IMy#< zIKUtQsz1*;2{15cEZ)g*PKA+y2c!nnp6khE;8Edb@L0T>;hYKwXip+@{Q8v)2SDql zK>I&cdzN&m_A{W~nF1?kVRuj0h8`8~Zd{i{H6 z)sn&Z2GURMU(Rp>Rz|E}1zuyjL4bi-2~tLMgXdXcdv?X)ceS*D&qoEtHOQ@?G6_sW z%M{Q#fDk!onIdq&0n|tC2d9&k3}$W*#i=R`43n2KoCnztnzsO{U%w7+KNHw~EbayA znY@hQ97rEn58Ta6UqN~%?_@YPc{Rg%aRml86hQS?_)huymP7S{!ea?oZVkf$=s6JoMH?BoRah9j``1F!FDU*&{cCvI zT?yU!hIc$z4iT2oP&rWg0G%xWb`#jl zhYaBRXrO5$5UdX~Ed7ZHO9in1!C}cL3k^$KEMe*2PdF@j!DfN{Ccr2M4NEO7VaWta z8rzVPObV z;bpLgx=BZc1$<_PzW@V+CddscTnqtF_o=F|Fa)SbGWdhs2QI5v82mxwMNqfNg6y8Y z1Z=OgO5gtjnDO!dCrBPGKEUIznDO!d9b7FuK9+&cDMXGBkUhHR85C?786-^<8yFb) z6O@j}2Gyw`cf$M(+NT9|^FmO1XW$7?HjGGYV3Giz;mxDQ^q&EguR!%LEMI}k zCRPUUz8a7@Q2i4@`gQyn9KdOv$(g)H5(u-){GGu}Dg4+3@ zabk6e#a^I2)7^{=@HRbcoEO%nhm4&-_Pisv=|Owm#rZ*FCrI;Foec$W{m?xrs+x;_ zf$l0$)dlq#6I6HWgV$s+%v5AxRt5DB8yNz2HZlZvD*pd56LjA#_`Y%mkDZMS-kpm7 z|ICElciYI|BdQC^yA1xYwO=Y+Oi?Rg`gIvtX6l0aRtyX)dl^D@_F~UZ(C`4=W{S@(5%cqFY3L@Ba&+JOMlRRqy}oA zPRU?k>hJ26nUMPbKLdvcXnwB)wC8w=3j+h_UWCQV8MHv*vwkUf4U9zpBFI^?{WDuS zCNE>q0;vPZt1M+;1kDeF=A}VnD(ZU~3?P1~_yP7yQ*Vm;-v0*R`PK~#YkENIQ$S~_ zF+=(#$YU&m4;ef_<1C=FnIPkh8LE(U44Qvk!9?Bp*MQ* zuyv~7ab(!}MJQvN(DRQ_#x@yzM8RX54E`|vDtt_Jf{$2LK6wsH+a$j&v`(=cdk z0TjOLA^V0mfX>PX=~3hVzd-i|!vaCj-81VM4uH!Y{)5g85+0zk=MG~gqU>ROmBFI9 zf`LJlfdPD4_ym7Q+GF4cjW@+Psb>CvpsT~604fI=wZLcfxq`+n`@wfDf$ryBo}{`0 zb-W2S57!ADZvxF%ti*Lc?+WNV9&Eg6MneHy{|W|{nJYkJ56gvCzF=Tc=V9;w-Pwv< zPQk|GVdWG!9vmU#`N-uIXgpsWH0R=oJodn}2Ckonfn_!iwA}Dv2-)dFAk1N74~rPU zc^tH+s>g$YgMs-R0|Q5P1B0ZT69aEOlL{jPtLQ@p_Qi`C&QI}%hAnsM0S2C9P67-J zw?KV!0S1N}ix)GTgSNlUf!fcoG8?om5>%gn+hv{I8~VGt9YALSfad)fI8QV%Yo1V? zyn*2y=>9~;$O1(nRtAxU2N;z4SAhDJ{}+fdGH|M}FsOp+R}~fpQ6>h+S$?235+HLy zcOQY$3`ib}9BjN2)E;L9r8ThHJq(cX%6{fX@b+3f)GKPVg+ zxK1=MYn@O8``@wvG&b-P?Ejf9J|HtDFJ}OSrx?WTkntD+28NH|vK2`Un*2+2c@-80 zH8eF3u&4p=TLHNn8n)L#YE&2*ti>SlAOQCNGKTXYcR|bpujc{zT^{5=6-EXds9Hfh zYQgO<6-Gt}@Oi~73`WRmRah7d(ac7KD;B#!_V#x`*S3IFGJr0ll+GX`c3>VZbHRhnnmx1K< z7#UuOC@^U2F*5pyC@_fYF)}U_QD9)#V`N+_puixl$H=%+K;i!*kRL&3JcDRGM#d}w z1%?DQu75Li9T}Jf6hOfOI?Jk|0CW}yFgU4k{O8hRWONcx zVDQpoWONWv_+JM~3;ihV45lrJcE)nhovEO-;0blJornU1f*vD7x`+Y;zX~J6Z6U`0 zK`JZ^;%c1#<#iPq*aZ~+zgfP4;S#vr0q-xa0FP~<^cNW!qJ$X#PgY@JkXDoYzd#?N z_b$loV7>5j%~pW>rO4-+2{HV;slv!$D8%@`8?;_ajqm?a-GiX;_+;eP|jTmgpv;ITA4 zM#e<~3jeF2Vvw?DKf{)OjJ8q13UGU(4>FI^Kcnjhs9gb?O97p`0@~{Zno|MwjgjYU z7B65pEY8Rv2ph-mJpx(t2eJ>Gj~y7e)-Pf>(m%6BqsN6o0y%ww%o1^AU;>THFJ8fL zxPK*hE`hCAiGgGK8iq>@Ou-EdT%hrOM$kMtdw)~c4;4lRWl&p3w2|Sd3MYdH^n50E zs96vD*E8&yyq4iG$bQiU40l0%Y;#5s@zy21Pf*#EH>n~@v1c3Ykx`zYo7RZ{&4Pdu}>Z}>iIq~-l44^cj!pgu5QpflMGA}N` zz!2TPf?-d8U(Xa!Sq^GrgVt;c9$?S|ncELCpM@a`#0Keu)umwbXLfJs@96FTt+xiv zsjILuNHA+)4;xT@3=L}^P&mWP1GyU;l~@0+IvU1qmm}{Js|h z1E@X(sRgNH^o08ba-TXhPC@p7+gw zKd|Tm20?H*VXiHNQP9A6qX4qD@ZAZ;#R}kd${riW|9^V9 z7&uH6?f)}6dZ>WTlQ&U3z|h~@d4y3hLUk=S0|)4?RTUlvNzfdG-~xuVpn1Ih8J*y^ z7icXg$bG`_d&gTa=3YVaC}GXQAPL%^j2spM3=A_SuVFY3%2%Mg*!vDV2gkO49m9#q zI~fkEo?_q;R$yQTjUTLE#c%>dFJ8%T9<+xUWWGQHqZ5fPukz@gmsV^a)kfwJU#M%uU1YG=%mQkjEK1k>{or|NjvM z%}p!*{|{Tk09xk;8)xW*&P}VHTe$)}&Tx{!13boXkO4ks2b*W?gsy#qoF4^Uk9P3? zpP2_C=S!{xtw%fg|KrX?q%k`VW=FXGlME~~PeS_&nG7L2GqLv-Kxu3J3dndJDE>fc zONEKSL$HYfe18Qfu2mQrl*Adq>lHZqXSOsjBF=;L0Od~s28O2~y`Z&)HjMw6L2Cm* zXG((Bw1LDK*lG_j@S8b_xH0fe-obDlv~I1xuQ!ERF#wd0Y8V|oRM%uOaDd8ckou{| zpz+EUdw_x4%n76iBreXzU<9HebIK=FReM%OsP>}HDZ|4WI;V^hS4eZppfMrQUdWhG zCu~l+t0x1lzn6h!W-kM~3MT{8YF!4F-MV+nmqV;!SYi^)v7}5uYuGv9K!{EDxcY@ZGA*JC?q`QToXR?6rMUG@(*%=897fmep zBE#-PUI|{~4GEW-tzSU(0?6NBzwTk!AmRWmJHX@S6{@P)D|V<>ppBb9WMJ6&kbxOK zZvLKu2i{*t9yfpZ|Bq+|w7;GRxz`jlJ`C@#S1_>5tbpc=9}Fxze=xB3uK~52+A?|@ z@!x9(iX*U_LG6#3;JJz;Q(72zpv-YDfXz!n&T9w74=DeLDuVmCUi~v$3i_8Zfc6x4 zLc##vx8mqu2XY5Q9$5}-=Q@TXDy$4_f(ID57!N3@_IGq|=!dltI3R5VkRC<}q`D9( z9Zg@)a7n-sd>0I(h$Dj_sO>&^H6$I0CNS`T+$adTml4!vo!PShGzSZ6AAsx@R%BoW zsqb&>JODadb%74}{<ZVh zA3`ceR)W$S`Z{mq@u5BjmYIE^@uAfnE8juaro2O2n*u$D4?aEw8f%80wG(N=5JQKba33+XbB}2$gOYCL-`V|bII~T$0HP<87d>#PR@u0Zu$px>u;AG$h zjcukg2{wYlt3Va9Ch&l&>ig9e==b5k*Iz-`1cKJwz|Z4GTC)m1kNYQd{T6hsFletd zT>no7mYF{p*i|)Gy;v>DzycbJ-z|wY4u24GMk;(99_fr!lyUfj&~f;KNaOH4%(GU) z^dpbMpJfQyd6tOqLag6{hZkb~TNnca*EuJ3{r?Yie}K-KjZkKM4W85S0Iz@R1f4S* zpsK35YKE!~g9mJG06ezYO(kUgTZJlUT_tS&8mLZO`H&%C=R<~I`1&_+dCK6i^C5#b%KEp5(DiQ*k=DQQ zGS7kQM_&K-njvK8Ya+sMEu_8CznB3YhEvei!GYRmB9088wQxtKWHN9~Wno}2)B>-C z6I#Ct+%^TRg<}V;ftykRkvHZBt%a)qt%c)UzaCVUBCU4=^_4()55oqKS)g(0>1!D- zf$Ct@b^jf7&oCqig6<#T^K|Z?0h$8~Xi%5%{=m$2La`s*vSnakJYB(}`G$c3tPZpm z6LeoMq#gjzSwqi11dWXdfXmAny)vNuq%OgDOjH7Lf5zek4CkR^sOLfTK>u=vBcO5{ zqz+!cK-P9%KrLGn3Xsay6VS31a_{Q~@E$^r^-CBm`e$PFD?s;@!rIywK=vTn2ibFm zWlbj{K8_w>kbtjCG?`KWS(j+U0geknMurB^J+q*=0N>XGiYpcF|No(J#mSh}pbYA3 zAgwzD-B|~^<5g$;?wjawgG(4EzjC5f1&JFlVZ8VEl1HaY8Bs2XyaNO8+tj69!gL+g}g7mjXJT3o?%f zwC4^qhXjfj#;gRzsVxi)AoVJ&kTVWoYC&NKR=a^g1{62ydl@Vs^y+Ljp!+X>aIRm%0M2uuHJtq|-7or=Gw6Ws#A0yJ zP!%`=zCW2sq>(`p6u$j4dV9ckfIg{E1l@D4F7f{j;|~eN36+rb#KNHaKtX#!I(kz; zd%Zy8M<9K@oRB^nqbGQuGWZ@PMuh;-+%5N-EKt~Yr}TGsy#ep>$Yx*wx6N`36hU`l zFGyoxS(C)Tu_m8^N1y@RMr9Ic1n=456li2%2Hk}sa)f~gMEB3^oxsd;K#@V>Km)U+ zgknzy)Ltfpy$lWxs%tVBI0PCPctPh12sAQqGq8JT^|y4V^fz`#^v`TP($fNRHDsP? z0jTe?hXGU;aD(&r%%&$QEDYSB@h8x@8J>N*2B0(nG6|9!i;h3&Ea?Nvj5kiGFhn}A5PO#>=pIp41_sadOBfqK?Ih*}3971^Yb8{*(b^A< z3=BIP8JOX1BJkP-=(-~0_5)~L5okSo|O2F|AjcZ7q2cBC4-&4>(71TeU zq1v~Cfk8!xL9kbhfkQ=vfl=xJL$rz)=6qbz5J6&Q^e! z1)keEqawt>2#RY^Izw`YDcC)Z3?^EM3=RFw-6{QDU2i~rl)je?3=DM)lAyUk2Ihzc zMsEeho{8W+;f$d3vl$o?gcx-i6#Mug`He{*yzWU1WM2Qwww6A21_m`2$eppEbO{QJ zzIP0uJAzXBXF%)#sRh}=zCfgwYP@oa-4XiqC>j1wfsED5m_#0L4lkCTCcQ7Axh zqWAy*jD`t{3%eN@dip`K3=FF8!0Tm&*Yq(kfczo?Tc4o|dhA%3t3=N=s0tu5D zp#8_-@a#QSG9y_md=u^D79Qv$dT4Yn5~2UeHB zUA(C&W&Wx;}0Y$-ux^2%b+si4#zK zfZb2@*&K`wkTNPv15{^#>MB^>BhbJg47rCHV@y~AeD`v5CwQ$bXfFxKMU3Y)6xXDJ z@H!*BkzmZ`BsQd%PF*rZ(VK@Pb%l?VoFZw6+rc6>|VCVyFd;z5y z76t(k(3(2GKy`zKDkz_T%vcXOXW;~B{$Mg}~t z2HV$yvc?9w#};Lc&Hq1;H8%hM!}NpJ3BmWZK-bu)ORUWR?H>g1YgvOfb^zVq1|K^B z-$M)8ABQq_zzE&f!iY3>z|YbQ+aHIruSJp}WTzzdejGR)A?+*hyhfiW14o|_1CP;4 zhW}Cy3`UF!D^&Z=Fff4XdIp{o4gI}c514hJcRqmTZPqd{!1xS20S%zL-&I5ybQrS~ z6d89mfXhNq{sQMYNd6K5JC41EUUVzETVN|DUliKyhIx14B(;0QJdEfZFPy{tu{~ z4%&AG4nxr1DCqvH{+TTnJ!uR)puE(R%D}OH5u{JJei>x1EO_p-x$8&&GKM{1vsW-2 z0qy0Oyo%wpNHgRPwTXNTHXvV!9$>hw!pOiek%_@X*O7rs#sB{S-5(4N!VHjpTYpbO z0|Wm_X9mfL2Gt(#KaAZOitxKe-<@F5wqO7qmbe{c7O2h7yZ|&FyKaSQ9tGpEd1&LY z5)6#+@wGe#mYI3b@z{3^EIZ#p$CDYcjKw0|g9Yj<3otNj1hvyucp02k_!xK=@-mo+ z9ATKXmXE!&>g1>`58=9BpI9*N-~&8BtYz* z$irZ&BEi5S*Z{c~Re*t^W32>(L4R*I_%2iM+96Q+yb@gIgYONMRA69M;bUMHU|^^P z*(q{_fklO%fklNIELO3Wo54VUfuU?IKZ8O4Oo%zKF;!+wusPsC@g_<7+_75Y2uAn1BG^l+D z8V>@MP3o5GBGfI=`hd`~3El@p+H;4}2VD67kGKV7&mFuE2wHy*({I7RGTQ>Q{(K$B z${mn<^LFk)U4IT=?+TmC0=G#SAnRq3=dwWSWzR#`%R=YER3un#!u2EHo7c|}va=t1 z*#z2exPApR@9cn%F(Ks@0R{#UP~H#$g*Q07{?7uXa{-3`8&wz?bX6n&|Ik-tU=mRH zzZS#?uLFUvIa&7uq!xM23CJu#M+O!ZUT`~6R}_@S7#TPh@-mpJFfwq8g4SGcGcYdX zW-#w>?7Xs;lR;yR0%&axq&@|+A!9wr`*`=N&+%&k)s>)jC20NZ1UCi-&|EL9Z?}F4 zgMq+71{Q;MhX0^-86pRvd3$E-0fqw#s-U_ORK_e`&S2cXhe2U7h=#V6``da``g^)l zdd@L0EO2LFSliCP(0h`BL*xOYAjp4$3XJ?J{0#gH{6Y15>kE*1AhXu5g!Cc%L3Df1 z4bT`*&r=2ln0cb93?3l;{WE&5sH!nA!rGc^elRddDlnL=ox#AMa{T{)gLe$ff(IDH zKx z;|l>r#uK2vE!a$!1(6IK6DpwR;Y2X7PRNIzhvUz{HX-l-KT)>-Ul)MxDqO*!0Xml$ zbPpMWL`4JRj|yc_U%5AufdRzsU%{XO;xp@m+;siei&I#a^Nem34HyC&r zH8`|D;R2#TYsMHnPAD>T6ev!-@&Es1eNa1yfkE)c|L-8XKxzaOAm!ZJW(Ee(-QS>d z%|PxEQ22izq-H(Hk24tu}0@&OhaKGpQC{6WtGcc?L z&3Df1dcz26&s#FEfbJV*tOSPgT z{+8YpgZB)~pf;}H0|r5GymB9CVCIIVODN44aYB(;C1FtC90CAUNaGxG_>^$H9O@V3L@3dOY#7#Kih zmWm_;BdE**g}1-~Xn*b?q@4oJH;r9SKysk_MM39af##AISc1yM?g-HM%L4FSoSip7 zYw$tsEKoTKX=i!nfXYSnz5fsN_jSEkzmY)&G!D+NphI>2eg>WOdl)pKX^Qlaeap( zD2=Hw{s-T)1Zs!&On}Vg8c8xRgYLitxm`_wftiW%fC@81gKB?s*8?U74OLLv3?$c+ z$(RD7nK;4sIPrtnpmf!f&X}N*!k7Ze2cWduzlQ;Qk0wYz$WEC4HA##Kpfm&0*OSed zz#tIN#K4u%z?f5@xb`9g!{qf0-fFxIEP@Xhtk(20DD+S4`qJOg^`Xy_fdw=kr^3b{ z!6*q%*Sw4j8lZgn1!RApIwW0#?1$z(E+`C0lKc1fy1Mr&w_!0Q3HJ6W*c2Bmkw1O}cpUZ6Hk>k`HU1@JxW>lcI1tJUZS z(H&hMK;wHLw}IMUpmPR5d=TB=*!7{uhe1Jwmw`jIkAZQGAA^DlKLf{_Tn3&6`3wT8 zk_?P%Kxtz?gHHbj28I5O3@V^B0X^GlulgMK2vC~n@9WtD>eGVK1E^msc!0qle5T@z zt|$HdU2j0?7F4f*>Kw+O4vL_)xc#l&XL>n7>8^K9VLjiQp zCTLFxNW8zbcMeD&NF7K$NF69FL24mtKw;gT(cjix09Mz+z%bz$0|Q7c7Iis<)hVd< zw{};6%~}dE2h&cF`@2g(X$5q?V1HwG0TLTLCIZSo{f)hIK;jT~cLfqV1Bng3{{XCJ zKZ6WrAKvv1Qdq;zN(7x>sSXb7CeWA~0|RKD0%T?nbe{%nZ%_ZsR?wM^?4Ym!$%DcS zbhZU(yr6$(>l#r12P6mDw*!&`@6~DS`O*`?z@WmxU<)ZPdQbF3GVrJ{L(@fL&j*lM z3qbd)Hun4hvz0+%(gQjvkYNFc4e^TxDBXbMA!UiH0>m%9D?sxrpmd`Sonry@*F+C6 zxPkg>kU4J$Rn_;&CG4W09boK5rp$4<~4)JSvQD?w+L{QUoMC*%MB zu=`v$7h&wIo6kHO}Mk=xTKW4sJLqTn%Jq%)=YSN z8al=c3X7H93?VzaakQsl^C__TTIhUA|I8Mh9#ETpj48C^MU$^s|D` zArS$UohmG#{hg5Ud(ap?sGSS47gT?sou9c^eU3Bu{5x0_e`e1lC3dPOzCx-7hAuWatKulQJ^!3pg->`=A1jj4Zl}4D#T5myv-VBo9&# z8Vd*0_{YM*>*zsYt-{2>xByfaH1>R$yq2N6e+NU&0$p%E`qB^HmCwMi26PT4ERQLH z`y|qW3&Hifp6Egbx5;Z5xfghVuznFkOaIIk16ckB$%DkfbYC~P)&b=| z5MS^Bg9+H2oeba^ntn~lxk(ejH6?h@hYnbNW?PI33uH|+NMHXdh8B>Sy)F>-6S_g7 z3=Dz^&@suGjo|VC*Vy1@6w^gdu z_CtW|1K9$RZ>#~ygY|;u$M!IQ!xrRL6-EYW(ME>&$txJT`)726PA~(n=?3YQW?(P? z(fz&Mdq8WhVB-v;3!!WJ`atu!4yvl>)~`}M$>4!}P9nVgfc3AzV}H={2f2R@Dt|z0 zMM32cw0{jgw-r`?LD!0c&u!&oVA;tD9fR@0vZfE)xvh8NF{982WdB z;=Hj3bgz6r3(6RA0w~S*&+Gu7UxFN7{c9Oo`kTAwfaKRCf$~S=0>s*R@K|3$|4NX# z-E;aIdwziWb1HoQ|F5-V-~rcJjga$`*Ff5jpmE*=kefi^uENM5A?*xx&Lc}{k=YRx&*ecxMb7Ab)uV!da;b#DyZoK4VE<+;IsgdYh41$PiX$G>7UuU0hCXAmq7MOs4s=2XB9~XNdX21h4nib z8sK|!SXmE((jUkSm1FBc`-2m}=Z&pmr~#D)BA|11SQtS2`cwoJ|6c>8F9C-C;CgcM zItFmgP(AVgu`cM&ZH51@K=R7at|ovY!-;0_cNrZ?`7x!mH!}nAmzU;wES-<0G(;9dTs+~K9rtk zgENB80|lK0+CQ@`1Jo|XIG-4{rWecE;1EC9K<5AZ;C={!)g_>_7(jd0k@M&t0Xe;GcZ;%OFm%WRQ(8=b7_6S zH6%+jb6U^VwpwhpAL8N~pgGB!(`1%h;P6oFHo(v`+`#^d@c7bRC2k_cmnf^wI|3T#$C>$}{_ErMmIB4w!&542TyJY~U zi~S5TAf2Fi0F^iJee|IH^o^ZYde$*8fX1SsW$q2oT5C{QJi!?}?yew`2wulgD!{-X zy1*YSRw|Onz^o#{5DJ>QTMz*jOA<+BU{zscNCAz@3otNnErcgn;F*t(G zuU_ECU;^rYg2qOAe=u+?h-5Hb6TtvlCy1q=WdRxgh0G^)fZPrm|DBM+zy>N~7+A^} z82HqiL>d`_KyBBaBuJZw#eu<3!;yhiK!L#*G%nmfqgzIWg+T$7C%|bTg25R?_s?vb z0BW;?-MN^d0Mw4@2hlT|O?pxoc-AjsC;`cV)(3&)zXsXyP;*_G3J(Jl zZ0%|{bX^(9ji7a9p!H;+^0|LCLkULtyau}GVl{YgK|=o$hLZl7ZBsz)HL%-}+F<>? zkbWtwZPmL75?=j{-7*3U46i|BgrM*eX=K;#GT_w|5BT#?$U zknn8l`T+{(p7S783=9JP47MN^>EV0=d`<*Nue!v>De9c4=k&ws5ZGKVavg#^*9)pc z#5o~#2<#jJP}>f!pOb-QHYcQ9T&>B#vRf0<-s@k5C7jXPdw9dSsq;dATi1^XJ`4iiqf%G!4xE=uM1*HuJ4mBsJ9%1mf zN>gvjLxV&K+uQgvaF293{v z%!01Bfvhp#&!B=iE@L;T2x1ZM_rQ2eRn{r?X+w}??#g_Ug?xQ_zg z!@n84{~mb{e}6Ni%{Cz)l(HEZL?1x%Z~qKPn-NwI3NtW(*Qz6rdk8QvGA(EV^*MVw zz+)jv3=ET@;UuoW@COtxpt}V?dtp^MHtT`z5`f(U03P>CWMJ5t$iR$xkHG&QI}`u^ zM!iSi{~yRb0!Zh>_w;1I?_h@BBcQ^|z_c=pfn{eFv>fZfl0Vi$^T!%U9Vo!Sa0%?r z#-1Jh&D}a+e<(39fYxoP@H;Sw9$)~k%UuI%AH%|`0uolj4A8Ke2@NZ#--Q(rVFgkN z8Y2>5VAu`{D**)R%P?3w^RC6j?cQ~_#M7sM=3c?!}i=zuT_q#kP45~x{= z7J&Nv&E4R0p(cPwrNQlV9+2MtZm3z%cDG;xRL;9K^-4%t4c_k$s-qgaw}8SHv*z(AucR z9#A>&3DE;)yMgsI_J}~ua{|kO(hZLTLr*pX18Ci^XadxX98mq&P|)AlBcgh4Q=jTt z1`m*alrof&fnhgjJRH`?MLxqDxsMB~%g;jVG*}-OIh@Wiu*^IQ-FwT+z_J^3FDaoq z4G~U);P`Cpo&xn3&jKX|mj1@>DWG$(7bq~Wz{gQQV?VdS(0(irXnh8BjUwm_ zcwW%@Sx{MvR&IjEuMSdgo#K`R+OJdGB0!sUitLOOuTx}Z;7}1}(2+=B$Yx0BPz9~| z1g{rl325l=>3YEE5}*t^F9+0K1g-yt@flbm8v3Vpz3HFQlL5NRol#prk+G{mvB#N# zp^q25hJcYF7c$q%09v|+L{I0goh1O{-4 z3tImP+MB8_vH1Y{d57?G-WdP?n9cbAH+bKmB942y_(A(b5$7GMa4|5#^+V4)1lhb& zpMhm3=pNdcZ5e%ySn8Nn&^l%zxQ+qsTW0K^+13Hl3##KmG}wQ>3=9k`1r3Zx!1r<> z=yeT>AU{I<&A`wH>PfLUG=SDS^!PI{s2TqM&yasWaWMk}LysrOGzJD$Z3ad$h5yUf zc!TGUNLYud=>yH99P2@AHD|USVQ5&Ox_%$S1<=}Jh65{985Vp1trfTeT4UV5gpq^c z!3@>)dl=5F-ws`ajI{0;bhkRhkKlE|XFz=du|@`A6#)jO{=V)6P@f#s76Xlqi5_HN zVi2uxW_$p;ldJ26(T@NBLG1@-h83#93JhWl5>5;Z5>6o4+D6ef?xv!H)t%0L9~v^@CU(%w`Kc0IU$Ee4j^T9AJ3N-c(vom$xEIYDs@Jp%(gU*5ll zkpr}5fPtr=0o12kzmDMsX`_C8t|04?8f4=blfA~2TGkP-MYsjJd&sDe?7+0=iVA;72(w+phg+c8Ol>0DY zef=HaynaT2fk6l42gq7?2US(CtqiK33?8tx>fp8Ru>QB>{~t3Q|NjQJg&Co9P{?cD zL3O?-wEqsfE2qCF1K$6K-kS~@gIkF_2L(F+XgLE9iaTNFO00*w6Wp#{ynx}e^Z|yo z;C&H2U2po=GTZ=_<^9vUzVuJ)`oP#Lq1aQzz#x>skUn`W!{@$>3=Dlg7+Cr~FfcGd z)|&G$DS*~+bb;5)fY#A~_I|?ZW$2ojGa!BIK&P-dG^jENMl>)MMks^M6J+8RP+a4{ zz_2EWfn`lF14myagF^obMh;NftFFnwxGs}HVNn)?Ei?^qukm2u>F#q zA2Kkj@Gx)*Ffdpz@M8eA*(?|MFbGUu%gC=H!5}2KfWbtCkAb6qX6u&)5s>qbm=eJE z{+$tVfX*3$&(R1_Rn6YAK{XR?-8OU&C;S`@q&=XW$a^wD`^+;Tdq81(I>G&TnEp%# zmYJCh>?-^WjL2hkSm#pKGlW3%80fA?a2^ANA!sd-nhpaa$e$p3-5CZ3P`rT3Wx)ju zyi5x;K=&JVFgZZx`I#EPXZM}y-^p+Tv@Wf`u{!~jjzMD=pgulmKVW}n*Mt7m3=cr{ zIFo~hDx-FTVjmX+3uw<2lNUG-@`BdTfY(E@L&s_%XLg+FU(fIWbbmM~&4c^_qG9_8 z`un=x^siyK0kRWRwpukYFoEn9abRF)JR_ml$IHOLAauY9w9k`qrw3@wC)-j}1_tmR z9wE^BEr$lij0(lIUl|yfLJAbs@BRNTe&B!1nmlkFcLm>GgZ}LdC;Im>fcJx|?`8O5 zBLg~PS1AEn*DzI9M! z-~rW%{}~whJQNwVD-_qSXXIGFh>@p%JEKVdjIIX^;u#H$+cT6IcrzOMB^VeW>>Ulv z;tq-v!TF%KMfVJY0;nGaI{%ef%R`0nWCROq0<=!+2bHm)^*h@hsQy5^#|l<<5wm{h z2ej;Z$iOi3Ap$G*?HSpm4*1sAYo^KeqA>r7+laXQl zT82B!ycLSQFBllqwf_HSa%f*gf`NfSIHRe5B_ju@ zz1iQZ&SL7{&oqlh{`Xs){J#kzh5g*BcG zJfN@yg()a3L2&^N%QyxBPMXiv5g-Hh-Zv3En1Qu?fwgM=8!F3z74grM$ z$bBFh>^@NVU5ADrsE!ak(A2-0kq5kQV7-UpT5ZsnW7nJhb&M?is~AD+?eBofGSwUZ z|1)JJfY*hu@d2$Z`yaf12O|qOt%JrLaO_J%tt%Ko_Ydz?pCbcZ|JL23zW4tGPXLm<`OV0|>S)`!y2^0oBEs(YdBc}oA-pd5= zdgGZbXJGTRFgGHd9V(;3#vlW>8(}_kKj^&8ZY1+TXKrRQFu=|ChL}HjIYU0^Y-G^+ zo*=h^%mJAPniuK^gg{`Yrvo&eqVJ`q}02s%K*8RR~Y zIM{8F`_(~fuQ)+-^8M|-ko(u6_r-(!0h(_IhZAJIFY-O_d)4Pi8i3kM$a4*#@wf@j z46LBMV35aP56TOo2N~EH4@jt@pJOTdfPqtmkwH-;k--wAuYU&gj5JW02r3pC8H~Z= zGePZ*09AF%9SYQ(C-3h@oWTd1CkLIyhSK)V#xj0`Hct)?AGCGapfCW58{{(BGcJ$- zo#(?Zk_hgnDE7BO{0Um)1yUn$kii@j4xlq=KzzYtV1Fw@$`B7#)%V*ksJ=jJXF>0W z?}W9pz-=GMxE0EMp`i0KUx3;^Nb96$_GG}utvX*Yu*`hH0GjJ$1l?}{y4wI$R)We8 zoa5)nbDg;Soy}m+m;m-SD1OaB{=%}h&k!U&!Iy!fzoYjI18*6m&f`1gB+LQrcY)iQ z0iZBwz$iyy{U%r#AoshF*NTJsU7)q%$akh9#eFBN9OYqPT#0=CBC&Db3oS>X=i^E) zV8{oTqfNajp!5rxg9H2153*m!@CJjuI3q(8NDOp$0BF4=C{3)fNL#(g=U`FS^x z9uWlwQ4_}h|3T^n6c~h%%0fmJHU?QpIZ^)~WRD69LjlO0AUA;A337)DJ9O>tu?9wv z8UY3d1CY7>Gh5Dp%6X7}h6CWUBodIyaYoSiJXj7^&ayCwg32ZpRtAv0j37A`sQkt!J}9KK7F7C|GC08M0npqr zXr34BwpPgcm>$p|ENC1SJhH{W0J@_YEI+e#31~kL$h}}bXpKH-Ur%dq3aGubei4Js z`UMO&6EeVSxcCkE80;<2GYIIuU;u3@We4l&fTlZet-`=yDZ#*`&jCIEV?Bcd(t0)U zn3I4bgSPHN2G;(a3=aKE7##E!8CXRW7$gn(82*FqgzTT$`hsDBf-1~i>sK|f1b(?7E{0o*olXW#&t1v=ZSCzXL`{c6bg$@(=6A|Sn>IW_P+d2csp z4O|SUEdf&31G$^sX8k$_5l|SchumWbIxolzq#oo>5zrX#0tMBc3h>y>3%I*>Ah~O1 zZ%Y441{-jhwT!`}Umc{j=?TaV&|J9+3xg2Y{FU&t&Wu3j_pf4b0M)IcjtruPJPiN) zyP;!7*$fOSEDVC8i41(8b^>Tl3Dh2i%_V`%gu7z}bpI|W-az9fD;RV@?Ie(Sf}nGf zSQz;G*MhSn`*%QXKL{=WrPKbV?v(!K z?iZl+3Yrg?0NS%C!N92^$-ucLl7V4C1*m=80vgwVoOQQ^!D0PU1{cuYzV+)FOhE2h zypF*d6o2a%G3bEzpP;Qn?FXHIHM4bt`cei1ka}=>1f^k+cpEsbPxLQkFaVVkDDo>9 zJV0rue;I>A|8fQw6;1}u^(z@fR9GPA3xU+GUjd1$$*UNw`y0Do^si{>JW< z{zVK1>U$Z$eqW;vn@bdctbc9+pBG`!)5O5Aej~#cP@M{jXZX2p`x*AE-@~wD{RV~& zptGvQLF*$089YGypFny}l|?KnW)^)ZOMwmPBfmsL4-6oA$* zgVs@i)>MGjVxz662-um(5RAH>0(uTM(!J>5bFjIf=U~I`Md#rtgP(&9T~7fDi0}TAfoEZ4dIW6A7aF~sefyLO6;Xi1<0l2JO#c*c*0){i7b)qVa3?9g3 zEXZ7tT_74{7w8-i74Tik3_=S$7;J?ULDNPI3_=PFd|Hg)I+q7jhcYpO>s-(sI!T~& z|0geHILxE~>3e|2uR&%BFfhpW?`PQ4KeM%@e+k2x{$-GJ5@7xU>FJ-@CZod5-~lQZ zRah8uV09FzJOP;ja<7mg1L%yjJwgiLw!G@(WekTwbs>|21$f^lwEl#IA;`WB3>*44 zGHe0meZ+Ywyx{b&zV|-^Xbnz(Q_mmJT7v$@o(=2wGaLc2CqUMqA6UPcVbA(a3_C#i z1DX$>tY5(JV*LV!H-ZNk($_Cw_|V_qePV$F0|RW_MDzheA~*~u^n6fZWU!qC9!0TG z6-i_O^}reWTYJ9rxAmR?m6xD88kFx{8(a@AFVvzmDOHjw6Gr2;__kJpsr6k3sf=?neaq zNym{vUO<6?N5%jD3*CpHyH%iTZ9w-1!|!R^3m)@BzNbxvkwHbk@jrN6ryu2R7moFa zy(D`NfZPJI2NFim{T@3Q{(!=&e+dJ4k1Qy>Q1*N5U=Wxj3ErOrx_ekcSdksnraaO= zq31(?OHa-sP``R++Zvdk!RGH_I3VJ{p4z{k;Yj~v(A;|W1{Fb2d!RQ(eFei4Sh>~X z$iTqh(4e}Ok%6Jd3v%w(S}q2b9!E$YaV;YQM~@dI4Aycn@bs@{0PigqOkj`&*)zch z+$NDQ>}9YQTnOC@*4GPO{R0{Y0jUu@0MXw+v&jdxe;FhW3XAoN7@mOou^>LE9}A+_ zJ_6NAt!w(1Fg!uZui*Vmpt@`l3j^zfWCjL<84UIU2@EXE3<|J5l>E(XREO|I)l&X;Rt9@?eURe>_VK+!_XJOqM6CSAgI8g2T~7NE0Cb7 zF0r=&<4!r~d4RCB!r(Dz=slyzYlT7gjEZxB&R#*R6#$tHI}fm%gMno>2Xwr-gMnpd z2V{)4FA+;$b0c(~2eMY+04N+l;bG9nU=Iop(7ELT3E=&Lp#G(iK@-FOK5qsFoqh%f z$pi*H5MK~<=PHY*bAJcu4BitBsvJHdjFJZw`@yTgK#kJ?7EOQfovVuAGh-XUcMfrb z&b#bmVcIZ2*~$UxPY_TW26o@fRt_cwl>ImG^azp%g}(p;n>UEvKeH8l z-UR`3p=q@h+}@&gpl$%|1xLQK3!8hv_l<$}jT7NF@O@(-wV?YH z2)F^Zmj>KE#jlq2AIQBbj10UYjnHv===pW9@=S#le5MI#zaS?#&11@g?#u%F4=g{k zWsN~MgFVPzP=+gNg-zyg3=Th zNMAp+p8~S0e<{Nska_~~5dhW)$&;J})Ve~|`haKxYQc3?|IAjf`2^I0+sdH62&nx4 zs?$N^v^}m296fHJIu|jg25WPH><5J%hz5n700S#zPyNi+5cMStj|tc(4AR%%*nL8P zfmHw;PcvI1Kw<>+f%nq)&urZS3SW>~SX_eiqPmCW7g%g&s|4Y)ndLo1ZSx*b-2^(5 z5@a@5Y!Bp)dNi{igXLy6A0Sfwb%=U!o?{_kHn>d)&7Y|CB&dCcQva|V1e@E~yF!Ht zwokejv`6^|cwVHjw?T!EK^Ds10kRi#W)HY*+XK4OlR+9(zKJF>aDmIWna$w-07xCk zT$nn8P6m6>`5%l5;P#Q8NF(UJO$LVkjvf}!9&OOxM^GFJf~rIY28O;!1_sa`Q*{dl z#&r>(Hdxagka;k3`+OJ}KxV6U{r_*!%U}=6zl;kMRM&y_u{ZXx^v`V70htHNyC6NF zybDqTG6O9h8o^>STfwIefYgHd*yF4WEH|?iT-Os&3tqk6KeH9Q=bwOD$o}b>ttKGz z38)PPsp;?U1cx)CAH)Lgzx4NYpHN|8V28DLMGt_wEDQ|bz1)!Uhog^;fd|^A7XaCX zJ3q2O@_$SB4A5B*usRTIKe$cLpuc_*!ym|Aq7$mB*?SdKGf>wc!Sf`>J9tp-?3n}KDwHYH)r46gqd1Tt77 zg>?v0SVus^dOpa${-$nFTagV^e}MQB4$Lz_^dxrB_-XT(K2`<>Q2J$H2aS!}f$nyL zq~S&2ab0kG05z_e!Drd^&uq0JT&FPCf$Zwz0N*#kEXc@Q1>!@}_W@Pa>^%*tm1yZ3 zwhsb&?*YpC807Q~S`%3bT^|Fx_kfpy3BJCjl7VGrB{Y3YGO&Q|!2!*gW9@sv_5wls zUSKz(lDJN`1K1%3?n(>Nh{oq_Z00R~Ao(B0RH3p^McrZIu<$MRrc0^LV<%t@G$ zfgjYzn8eD!1202CXHB!FF@VZY1|B^pkUV@mX$K@7g6^>fxdl^S9z-9n9wO~R+kYVU zg7kpWZ+~Ow9tJ)?1_sV^PLTY;bRBeVokgks(1H zv^Jv;H0A~3J7lN}FfawL(Pd!i1Fef}>;|{bLFY2`aWe4qH+BaIFfe(q(PUuh;|I+p zc7w}B(0LPml3@7*0t`&fYb?Qgr4m5v#RV9c>_KxD{f#|G1Q?iXz-^})kUf@&`%Ib4 zK&qL!Gx-Sjn9=Lv_ zbBICrcY^Nj#91C=iRWo7pu0^N*D|oUHZX9g9ujGU-e=hbDnlz&RlRn7z*t}Z5PI(+ zY<)fWp058tc0T<7yAyeRJ?I`f(E9p^h_mEDZinx?hOVy%i@juE+4+*h{My*l1Db0B zooNb+A8=X#kC8Ke0gvI%=-B`o%j@sxRRE=p^{W|vFmxm+F5bcLXkrt{Rt5$gM+QLw z1qMhP7&KnZl+nPT%c0n#yBB57@Lkm<6BVB^d{D#Q2fX8Xj%q)Y* zwPExh1Q;0dA#yF?_9B|T45%FVtR^(MM5x>o&|EK?TohCeyhaX9E*K)$3f}39Cg%f{ z0|h7e+!7E28rH60IdI#uKvh+9*8)|2v^!@GGBE5sh;-)+_NBvbTkZ;2d7gmp=1UpV^AgyKxyAe86XygYG&|WMG)B$iS?^!}$unhY)&pImoXoB^W|>N)VhA z1ecYd@Brx%TmTub2aN;wcXc~}@&ahQ3AEmTfvKW_@e%m$qyvop9*PS=_eZZ|0LP2! zX$D5YB*?wGh_U-!4AdOESK()1g4NL^jori6S3}#60t}$L*+6$H^mO#EWB37Hr^5i= z+YO$3=!;}v0Q;vBxy_NGs>-o*gDMYNn*+9&iShrBnV@}($a|TP+Z>?1Og#TT?gZ^+ zg3aY}GBCmSGVw65%;bU8v!H#ZJJ;YT!(iukLHz@YxBk8!@YzwYzM0?w==r>aH_D+G7CmC2k zcl(0Y8SFfXdSBdXMTUUgiVVT1;{psGyA>I{k@qI82JMlk0M*kB{;+WY6<#g@xPGKN zepg#CgzUD!lfNNnn?m9hDSSX-CZr6Wt6~yKWRRG=j^Xhn9_X65eg=EpmkbWz`8xhU z$Xpdy0cfs@hmr4qVn6KOp4TT>v^Bx=b?l&fN&35bdl;L+>7qf^>;D_ZE(gVh3=AwF zvqAQW9)P56YoWY{}wi0 zF0R191+J%CdUE=)%*6^g{8$Lm3swW2v+v);u%mx7!yd@oJtIgOj3N7v-a^*@Hg$_I zFi5C^)^CB%JQr~QpSi-ouuMZyW$FL_DlZur4fPn98TdSu1r-=%7#O%Hd-znAg72haR(a0A z2)5(-|Nkn-{{IJ^&ku5-3d{fh0!N^G7eRJ`_QxWh(|-^;F*D{!fc9}Qf$e$z|NjI~DbAb)k=ubL2O8;RE`rFNN0S4cu*iH0 zEXS;cDyMSn{~wVf|3SM689?ETIP>LA19W|q$oeIav*T2r{QnQWAFGprk>R+3BFN83 zVJpo5+8+nF3_1hRs)^B0Z0nPcW-@qWlaJ)ki zyw6>9K?Bp&1kXu1{0W_~>RLSt4K{$wsQP4wi zp(O(Y$X$#MGr;i-a+jJR10(1@B(bpnkokxG3^x567-af4GAQ(KVo>Sd%%IV~g+Zr( zD}zD*HU<+=IDyu*LCS%bH$dUUumrqsN?v6V10#crg);P>4?czl&|3O#2hiP(;5-hw zyYT?y5d%fW9~z3FdnXnwU{De{{Qs}YQU(oyBvAbZ8r$!7U|@D=0M)IG%nphS91aJV zHNfgwK+YI*klWpfgZG=dVqj%RIG_s3*D6aHSVR{6|HB|D(Eu|K5*IIE=O5fyzmY-4 zU?RhRJw=8F_*qdK7$gJ~7#!CxVbD<1`~N`qJVOF_y#?PvNF62tUT+b>DCwaHTGs?} zFXO2Q7R`L{dJADaT?U2z30*w>Gu!5X?p*_&wFgRvu=PVs4B&mp3SfF>+Z<4O1<8Zb zDM$@yjivwtLkeh3D+BKVWhM&;7FI?EVHGw8CNy*7K>9#>KzhOE?O}kMtES4}0FnpE zfz&|F^#hsP-_pg?-`Y^nKeKHCXl_D<9WocKvUI-@R2}F{M-?^0{|!c#4FAx zVn`5lVBlg_=uic(z2Pi$X5a(ekL44=*j=I63#xxW`?z!uuxN8Z&H~l5#0ZNRkefj6 z0l5p^%{amWd@dJ*WPvi1UIGg%=xhnhu&BdlE{?DOtuz*8|$q13C|O{StQGLJP1a_vq`Z@+Zc%SYS1Ix@; z4D1XG8dO)FVqn>Mih;fJAp^(EhoE~^Jycg7WZ>9&kb%4N6$8)AR}B2>OBr-mo?_tH zd5VF*e>Fpd3LArgW+DTphynwX`Vs~^6>bI&*#rh=25x}{(AX51_W1vYm4QKU{c45? zMu7x2!(Ik{hP5XYCo3^9iYhQLGb%`^GPp^oF)&ML8&oj-7iVB#GRS23Z}5oWzbeQ7 zKcKUsSQ-C+RB2&g>|X~yD{n#na)yZBBMc1cOBw7y@u5Y5rw)XM`pSH8y&vhH9_9|KGO zdIpy@E({Ek4;aK5AA;L*qTqO$(S3sPfr2V%EJb}OgN--?1HbxC27~oGLHj^EV$_#0 zSb*H8#tvD33_3ep#F0T@9TVsr*>CX)hxKXrhmM9q2B#Zm3uySd0xU)&~^>&-OAf zfW>w)SoE)9aIw~8knivA-lMC@z^KB(z@x&&P`ZwRL0}OBgZUx`28%@u43>)+7_1gC zFjy~QU@%?8z+kh8fx&hWCxhKO4hDlo3=C$AxEM^;MVl#}&{p_5hu?1PW8o{R}J(44|`5 zH}v=QvViV9>pcfqqruPzu7@D!a)QTxL3_Usm|*P3A!YA3Xg?0r;{ZmxA(fakUeO<7A zJ@URTE~u(naK^>Kfm8)r8WZ#=q!|-+Nk^I;r9hY&qIOC zsX^}>Mmi4#eBW>%Xikm6AHIKHl2Hb(A9@}NC>%(*Zx|Ae;BX26p9urf&-f}ru{RmS z0`JAy0y@J%eJ{ffQ2Ir*;~(sRrr!ggG6I@@A$u8?GPtlTWME=gP@&4eTA{ptJ%a)0 z?n_XckMRe%&BqPe&jPyh7j(u9B=5JiFh0-#ueAogAK^s{>2PB z{YxPCN`lU@0M$c`$q9;UTR`oz)&>1b8C*c>K_LKA52hjKe9M5s0MSOgzXciw;4_lf z?_rQ&X<*=BXaJw@v7*1F7kTXpXpbkP%$?Z^l0#mrA_27n%bCgd13-54&um=+Izt>* zUxC~QzT0*WgT#ag29y52?mhke-8(?-ZWTrbg*AQ*F}?2@7{nPFnAi9-B&bL-l!DHl z?q9(G9`jwx1ddxQ_T2;be?etG$jjYwZqnL zV1S%8y_CVFAEX8pzJ1+0`un^0fZPE(cYTc?LjuSh3=Rua*Z4EUfcp8MI}-XuA>-j{ zn<0DGpl7`pfX*FR*Tev7i=oe>f#+SM7BGmaFfj-+C3L8&2r~$R&ZrUzMvO0j*3p2% z1{|Jy7z{w|WYCyiUl#)pvyy}2M9%;J83Q5|L1(yw?%ER*{QqHL=KueFJq+NLxQtUX z6c;XFU;x!${p%oUWG(0(>irBR{aYDy`nND>^lxTR>E8stvq`2O6b26%I1p*#E@c1D z%ofnu**8G(1#%B4ZGiUiu3yBUfMqX_ME?@7_!5x2LFz#?tbT^3Ip~@4cfsd>gW_lX zRtA&)sog1{GhF(XGBAL`oPo8Xf$_YAVh`xd$?onK3@!&0)g}M`XI5d5>hJ1p0o^SI zI$L1o-B}7!zrL_6uPBg+@q!L0l0k4(=~FfbXpXxsj0tbgsOI z(3(sJ2GBSoXsj51cD!$a3S(Xc3+qD$6-GmFzE@H;0iCUSq5*UU3bQKYem2nBML2s> z*8|XbcFd9uihUf=vmG?RdU5s>`_?cp^m#HcFhb6uvtVEd5MtDV^cTVB*MQo%8w(Uc z{XsF4|F0Gv0H=LWUl4rnR{th&oPy%kpnofRKk)ViQ2tZj``@C!ueSqKM}z8Q&>c#k zdVBp6h7;?TGMo`Sz_4rmI)(%NGkSX%SSlJApMb~88`LHKzhV3Vx{Hy4g@MJPL0ADY z*4C5BzymtZ5_EPWqgI1*e|Og#kUXgU06N!{F(W~-7u44WxqV%OG8-d<7wGO&P@5HW zrkU#dgDMzxKdjz?&ijJvXy`e5ok;V(D?#-ZsO|@?iGkJqT@3~B{m8Jo-|N7Ym6i-F zpz{@XS~9SsoR77TAzlZWZ0p*SLkn>+Q^e<-E(?6rPqkjd%j(+Ifyl}I%xAnuszVwwMgLe!yNzr*y)HiUj*6%tph!K3c41l zzZbFpy;FyQWu^|KEL-Wrz_QZ^G7r$Z7R#OlXn3rLoh1!9KL+BD6%63@auf2v?Ql@q zgsipQ!EmOh5>oCmTX1L#C_wTwGs6k+n8}(-27xvC3pJRI|E94pmYkV>%eqxH+W_Qblwe!FSq~_cl|S4 z_kij%boCJX9U2%#9F!S292)v=GJqTlX7^9-dIQ>bHBpO!qYrd;R!?sa16M=?V^)MB zIBY;;wA`S+`~NqLIT?y;LE~bRyWR*nFvu{7bTlxTbSN_jB4`yM27Zt^eJ2L3^@6@{s$b zBUIHb50nT>_3=(&lr~Na#9r|bV@PNis!R-hQ@ED&6$j{c8pi-h2{S;>fns>UAlcv6?ZCi)0(^fIvp(dWJcgSdpnYB8ptcDESA;U7wu0i6 z9!OhUw2=Y47oevXe2;gy=t2f5#^(~s3>gfPptD#R7z%_K&Iu?^asB^C#p(YIk%i#9 zXVSp@4%0T6XscMHXuEqv%^4bdZrKtNj1 zGJwWXKzq(X`b8WVSXHyw~ znAcgLz7#yK696(3dS)7I&If$&5?CCxR|z!61UkQC1ANY60whhI1~HDKz_R{9LcjqUUya=g{r%n0`y_jFKznIGVFB;owDcb7pV_zt zG`9qI&mQppel@Uvn!3SdC}OVyWV{4w?-7_j6;|-LJ!Cu!O;3MEZ$|$P1_jVs+I~p} zhF(qv78M@`#$H8`4GawH6&V#)Q4Nk0vUUSpGgJE51_oTj=`Y6tM^KO zXYYkxC+J>UricbcZOHgYe`D{JwP(Tg4Co$485Ms9M)kc62H>#Khn-7viU$-nJ*^B9 zu=tW#z`(YC4}%0~-U@VgF~dS|eGBe4g4)8MIqV623??9X)${)k=>A|(V30VWY@+!8 z0kfim3gZh%I~U|X&=?M=&DuY+MFn(r6U^T_&J2tOSqz|ayCfJLz;_@a(o%weDkR=c zLfXHL-3_3zN^saV_LhL%uLN`dNl5_A4}AHTqk+ zTR?FNYI}j&VxYM`(3l6vT`2JhH4nKB)(ct%zXXaKnlS}+ ztb^n?fj$Oq24@Z}&{!;p769GL!&GsAVf_I`P#FPID>C!{4-gHK7g1nPVc_&Q&<{Eb zvZLDp)K&$RCk)&P4UFC3HE0JIcruhhbv~o70O&poa2^*(fb@U*Te?2<_jP>%l~>?4 z1!SyFnSsCJ0O&pe(3!OBnZa#^5B)PC>cH(q7Ka8#7I44)0H~k7R)GP$u4#=6151B* zcMAhk!U2$5K<)&suj)yKcr-AocqoIygOM`=)F$Ivn+$b(4^&+b=>Cd; z2I##X2SDd;tX+WQc2IcCfT#uapI~=g^sHxKVc;t`z|40-aXskn&J2iu*0M0LfYK(& zPms7jwgD9P;PL2v3>NFRGZ=v8(n0e<3BIq0 zc?hZ-LGI`^0lNu&4*;vr!p4obV z>4AYN14D-pV_<_KXy5fDR!IE>G8a5%?gSY#X8_4_gZoJ)3=A1U488@5Yfu0G&?g2` z$-p4h0NKCHG?_uN&mUY)Utm4}HTxqLvv)EufYyyO8#73P&6a?f?I6V9;i0(J;{S&} za1Whvh!2*;9L31u3 zJunPOk4F?h=@E417ib(w_1wV=pz$KmSP|&#FXja&R8j7Bg6$(EW)BS=?k{F&)lg(v z2pP}n@q?^SWLT%63|cb<@-xE%SiN!B0_0CneLr~}gEQ#N7+5<5RJRKrWMEmp6nw8N zv*dvCoJAfmFl#(y;1pnBaAjZ+0G-9e#PFa(RRy$fYDVW9P~8ja-%p0jp$n{E z%%B3&r^3jFFSB{^vq}U$+dXt_9T_pmQcc;S366kbfi(Fc_>~&S2Bu54|7d zJp;I)s8*4%)r0prn2|8z)0d!v( z3&Vi`Rgu#S5)2O%RC|3H3_$lfG4K{NFrEdU%ihr2!@$4@WrM<#v9CgL;tvLno>T^o zo?{FGz3vPe>X!F4K;a4s-}O7dZFI1G{mnfppta2){|YcLD1y>Oe{1)K{+Uf{deRse zK=n0959l0GP&;n&5(aaS9?)7>70@|v3=AS5JpzpocVp8FG8?29qzA+Xr5li*{$|Ks zW<8Y zvKg5A*D$p7uVv@}#hYac1LNeS49&f53=F-?85qWdgEKxe9g z?lcx~U;w*x@;ZjeAag|zF!1y*V(1V^U=RV(V7!B&0(AByXlznzZ~9t>X;{J*Tz_K=TM-9_i(ozd&~OE#ct1BNJV5>ixdTkEWat2$8Q2RB6$S`< zG-30R;Q2b(ULKVB%>O@jE=1dp2-?fz1KrC5+Y{1dKx_0s=eL9UJTqIseJr^Db~3bp{MfGou6M!f)!}lWyI>t4=fU-_2Zzm> z-lvdwg67wR$x9jP`&)Wt`rEsIfX)n_(!vk|9|Lm$--(jYzmlP)zq@-we@}M@`0Vy< zaGGG~RROQH;Ro5rm;*UqU4VfBa@JN?&lHf^ptH?EX9^2CfaXaJRH5fI)`Rpw&sR+7 zU(3+a-`BmNe+Jb2bCAAY?-H>2Vj#7QHz4LuUdB)lb*m4^ouG4dK=RP@7ZWBghx%t` zO9{v?pgIdI{{V8nF#*4bgVZAVMXY}ZLl4gIVSt9uDu$N+-tGX)fxPK;O4;IpXl@pWKFf{k~cZ2&Spm7+G9^HowOaclF2f=cf z`?DZtrhww8vm4Uq(PUsi?(;C}1c2KA8x}e+D1q{i3L~Sh=t2fxaGqHQO&dqCq>Y&^ z0igJUhob}dE~13~9Skk~GrKo{`z@9X44{5XKj=IteFH^M8UdXR1`11%+rjB`HPnt& zG&?}?3A4iid0!|mKAoCf0A>rDO%MbX>2j!jq?hW9+ zA|(G@0Qm#dPg7xqte<9l4KZJUfguST_K-5>Os^`MKS22i<_`wQ8Kj`GJg^=}odDXy z23cF!)w=>zri1bZD0~DR80h9>}hL#1O+K}0kp}((p4Pz$guE-3kJ$V&Fy3p$9Cl&%n^XnxRGT0Ry)RD+6c97|0@cwB9BUmw^+L;;9%MIw^2#2DgtdoI+Cl8#bJ#(7y0J$Emaf)-?w^I+gMoJU z_%_)5*9}mAzJEgJ7ucE&hK3IK+=H4BV*}_e5+(+eGa428R2X>rXEsVOI6&5Pg4_*i z1A^L`Y61+PGsam!V?<&?|3Rxh7{Kj8(D*k}-w)K^0gW|5+JD=??LW{Qq59tc9iVgv zYXb`Of!5<2sDkDOLH2<1IEWVMhxC;N7#QAy>;km`LE^A>iiRV2e2N9sE)-w@ov$hY zI?t3*#1YcpoiGEk{!f?zZq99xJ0~=O`&G`My)-I}3}FHc3|B$oAhw7jWG%&nnGEJC zoD8Aj3Lw1#p!GFp7IZS0fZBPWcAUE9>kd%c6_hsCFJq_yrHlS03>E#$7-~T6WEBpu zx%)xpLhm790kv;HcLa!l%>?JM?I8J{ZqOKM*8^yMpv=IN02y2AP5`qReKHg$E@j{V z&BX{jWsp;0WMCFp$RMk6@c##pUu+l!7*zcJAJ9F|puoU?K-ol*iGi8%gbL$L@E9j} zjHSQ3TcD?zK?9V3L1D<43@%^5J{$jzX2k{}wCcEI#W2JpNUgC|&j5=gAS8`^)% zhRn$eCP40p0ELqZBLgVTA$MGY+mfKOEe;(}^=0rtX-hsN;cN@v{~vcEoo&$%y5kb2 z-)mTsNSt7XhcG9pHP!5s(S8Ff$C}0b3|bK>N}xhAjoIxb|Rf40y;vv*E2u*^IS zzQ=@VWj6!M&Tc&G*I;)cLDsE->mkV4n}F(qb_O$s2Lh^~@=AR#16sMX3AX5%+WkHo!Rx=(_x{&VS^xh5Y#xH~rw3?GXA5{8>Jo+<>z6XzS-*_o!TRM4 zPu4GIxWcNypuKo0!)3@Fr=UL1;SGbZ&$B^*fyEZQo^S=j8_+nDC?kU?Xe_ILX19pS z8U{vK7zryt@@jv7&xFY<89u|>&7uz&*g)Ygs=&aavYLT$@lu9MpuKpDS2J7&wdoeG zVYmb`Pn3~C3RKSbcXf-XEM{N?warv285ji}82HuoLHF17OaPe!TgxX3y}J&iRwa*t zQS}Dc>cOE`aP1WMpswjWdGw(=aax zP*v4DoIu?*qYVWsVQWrxAZtcd*B%xCtr=C_!QcT}H`=+7fnnxC24>Z@3_S4j0~Y@O zF>~Sn-;nd5pyv-P{Qqa>Ldf|d;PVG|K+hk5>Q~`s3V`e1!N4+e2c&)@c>ch8@EwgC z`d2W3cAhg#Ud`}%`VNL$f(f8~s0>V^j11hMb#c?zFx*mMWGEMHWMEO@VyIQ&WT*zM z~|3?iU;Qc(U@U(WDg{Q}7N(E7CuGW}~9 z-t_Nb*Z^ub3MepudT9)xHe&x$hAW`*8QMnNFdcMP!OWJD$x9h7GeGZw1=Y_Wy&yM& z+k{=g4e*ujPfZPLeOaC&6J5k&M>Z8raX@f`Z1t77vv_;T4n}`N{0T<-ZhNp1r!-`6BO6@{0I9H$sLze zL2I+T{(k|v0~Bs5#~4`PVFPNzg2oa+ZCCJ00|o|W3+(Ozhb6Rs1DiJmiGk)#LGz^` zc7F?^e*~Q`6+r7JLBhMax1_(Zw*u7P0`=j*bG4vxfu8OT(7Y+gZ{YA{j$~kbEuh%n z)w_mqjfdhIPX->)osHn|YwRsijReo5vVi(a{p%Rsfci_|GU_1HFK}77jNuAWSX@L3 z1JGJFh+ANBKC|@?sJ#mcTTnPLzJ{a^lzt&EQok@4+}0t~FND~E&A+g;z{9`*_Kzi~ zbLz>!*eRe0?i)rPPz2op3idB(oCnl5oY_(WN*Ai<85r02Gq9*+GcZEa+Xax{KxeUm z+^%wrfd?MP&~WVs`42QE&;w2XYq0o_6Ul#>6#8!lWSpm$3pz#xY6CEzWMGUGQ0(vS zUBk>*p}58$8lRxM$w2X$%fPtCmw`nk2b8CnI>2jFRx&)8yo%wwpaR3s{xu9wL>(Bu zfzAW&pV=nRzZ7!6g8FiX^C15UI56ab$`YhFzudo!;mPFX4Cg`N0#2i#Jqk-09)QPW zkkUR#AF~ByOa`P5u6`Y~90ISSWdiL@-!geU!{y1V8Nl;xqOTb^Kz8)cYy*!&!S(H7 zfW-YWh9^kwxdd|yEFboR+=7Us3$U~gc8|gjPR2C`iv6n~ZUCokM<&o5=N6DTlUFia zn!Jn)lb14_#+nB9Fl-QD zV0;R4D^gs7(iXTb0_DB_bqo(cX;AP012^al33y#HvlZ@tu=$`kg^ZQK(g$)GbqQn^ zD2%}AV=dIo1q|GvbE;uuNuam^m5-ou18!y)ByPZQyb|07WD!+l+zv7iRAwN#8xiL_ zA?6D!FmN*~D5!$R%b;Vku(*er4~u)S`KaY8xa@(tnFoAF`W}W2f)5yHfcB?@$E`qh z7bqOE85lt68)hbBF2v0O42*r?uw4ThJ78eYYy{t3#H`s^|3^fDQ2^Ap=kUatqA!q#yJYZl4 zjhTbS%0TMD{$pbR-3y3eJ~3?(aC!rcPl4)xO$G)~{SO+mVzk6k=Inr^Z*4}2JcaXhccR}u#0QoNj=06oS$bL}JxEaWAps+yJ1CGZ%49M-L zOX%$<(0R0Abu(Me!0mE{v>!m_2PjQVUdn)>53C0?PXSu11B!QOTM85gAU}iL%y`~F zv41thpWt#Wk&zed&$VEG{t#Wr;0Ur4|d?{f^+Wg#`az zME5Vqec=0XLF23-cZ0^!HNoSn%piLiJt66}e<|pmEJT=q{fiow7qFU*R^EWa0$ZH} zE^io4g2Q7exc)e!vJ`T6&3cgCsCHrZ2bS;$+XpItAYuOmlrB^l>%WL5GRUH*574{> zSe^wmPSO$p$^%%^)E-d$z~Y6Na1daCj4NT-w-nN5K}uH`VF)%KOI-!5w6tpaN(O2LnU@PKGxiyR{WTd5%F3MxC|>_z~wJ$d|iUC31w$s?1$!c zP#zFxWbg*9F$9?bGHdcu21r>AQip2B1r;_19+Y96SK0W%NW#sI|~$Q<>(3^zdI+aNwDL>=XPLgmv;66a?}hiUB{Rpcz}VIfw$7RzpJ64e`aq0XkDeMm!Aq_M1&%A9UVh2_!Mde21cC< zRmSxvShV#R7(}7#=s-u?(Qw1`W7@U1hP}qfdO(K_so_Pi1P?K=fY+-qGw6vP zW?-GZgQ05jdWL!xW(K{*>lsQxe9%2!;*1O%`d2eFfbLf7U&jDGHw@%HaRmm*I5hZ7 zbkI5VM?Qe=oP?cet_nIs7P{vUekMB7p2be&b4(Kd{}JW-|8Zv`;+*>ao}LW&IrY%H zCRKPD7*`_gSp>D^Fwz9Kxcq~+}*#Pp=I(8hHlXZ;4>&agc+g! z0N*d}psH?pWC6zBOX!(4-6-ed{{OL)@&9j>y_by8y_byt;d?K^_lv{yL-$^S_LQvT zVqn?H1s$IT_2baS($}NiFD}5qJQ?JV{+X>``j;>?Af<-{0SBlbdO_!1A5c|Ydn7=0 zJ%b0z7#!^G1lSmy1Ov}%#{WNdGyebGi97}ex;tS#=$x1T|6%(3J9{!#!}PCbV41ld zJjTwrnxBDXH$T)5ptc#hA7EqbE8%gG1n~pf8k0Q?kaZ$$;58xv6OMt-jfCWF_!^ES zpfuRMp}(WM1Jnittv^;_W#DJlz|sx`txI8G2DSfEKxudSdWI^&1g6=LJ9EJO-6&8jh zkRHg`J_7?t9Yj52G7j}2Q1#$_mMV;l$pVR>dG`d+{lj|TyQ`Qp9QyluW%_5fRDjmc zO?|?^FnK9MdH*tomdVQ*N(6Q(lVD%-8J3JJps({tkL)Difs|V|Yjhleh z=7PqpmM}ChMnb|4Rv&}afz4<70g5M)L`LxWnV@+~(AYR^-crDkfe$p!EaJ#`3#?}a zLj#BwWPs08X!No`#w0=FAis+^FoOI2=<^^TIZ%2ArE8E{WOoZVK+bpW?}qkapyvpS zCNOaHF9pr#W8P^FG6N(BqBRzR`$Ld--oQl=>xZS!E;Le{gCxHNb>~}lb17e_xD2A-$3t+ z*IfwilM907aIL=q^@C<~JAlSxLH$ey&VU9+&j3XRu7Cr~TqhJ4D=;X5^n==N0uLE@ zCNEQz`6Bn8>veMBEd2H5;LWL*w8 ztRQ_va9#kl^FZc+%m$@>P~QU7mjKzp09tdfhXE2^ps`rA^En-#RC6|wdO$zDji64rNH0CB4T0~7dudvr5R7#oB^dO>USz;oFS z2C6oU|Nk>Mg7QOyj`|{o3Uy0J+E~Agp#Y?|A4FqW#|BC>Ah&|j2v{Acoa%$FTLSfk zpnW)SSq1Auz}DLJLemB`4TvsafTWF1Xxade-ZL=hLdI+Grwvg42Bi&9{sxUnbDd~l z)`IN)2DL*LGN7al@SM8914w?Iyp*8~ls-Ud0^}E1yb+3PP?`b7H&_pB-4@9IM8vfK z1LJ*A8G|b?g2S_~X9{TS0Wxo5p(=O)RL?=y_<`EzAbS^s+zv}){YY!M-b2PrR9G1x z>-*k9@+8==khO@Y>-(T-6)Zoqr9_2=Aroc?12jE>^F1gJLgqy-fbt=zU8=&$09n_k z1+hbb0kVDrTUmnPX3)4H(poEUI*|mW!&cOFn6Na{0ZlXD6|4*lq6`cQpgiB--OU1` zL1!R=;!QUZT%Jfk%K{eAS~rmgkahhaHb{+N0|Wjv1q#o;ZU^xAK4=`8Kcj(hJ!D@# z<5|cV{2)7_b`V?M@PgL%fzl3WeHFO8abw^BiGk7}BYeFMBoBk!36cZR+Msh|6&S$f zIWr@8oZSGlj;Vhpq<(S}Qz{(|1SqF+gkXxX7 zaE%*5)``OUyRdQzx<*uhfl&dR_E$52+9CCV35?R9d<3!|w9XV{2V(-n{{jq*qF}W% zQOhNm8$j(A(A*%XJ)^#!p+$WiLkXx%TE7lDN65m!2+B+9%NZKr^Ms2TWWf4BWh*12 zuSg>+BHO&5rSq0xRe9w z6-WfP$wBQQ$hjLx@dR@Z*xjAIG7O;h5~!`TGC*;v3%Ko525%=p*A>I=_QvKWusJh9 z<{WSUm5-o)`&1UNIrWp5Gl1(z&{z~G48UOxs_(nO^Pv~O^*yM~zJ#G+@=}HpkbfAv z;dy^0D82+AF@Wzg6MW2232J|W*0h7n(L9J~lQ13xr{O}dJeK$c#VN>saQ-^Tpb3gs zfdkO}d}|q6K<8;NE(FgRgIAqPE?`iAr6W+BgWRRUUjHBLS8!Z2sDRq349p%5ptdY1 zy@BEv8n@thQF-0~8mk4Z-zf+Aqra2Xwchq^}-Ox^Qp+`fA!71shIBy(&^kc|2GInDZbryHa?o69%;aSZ$)Gq?U(R6HzlT9X zz=6R;eF=l(=2K3_gMfu*{t;1U~%LGDMg3sv8G1|N_-Xr52>A$U&42iaceoD6dKpstGt<(s7pD0;wQ zzlVX4Tf4z-MbitqM*!p=B=>^yDI^_3!$yFCp$4QElt#ey`$I^12-+h%c?U!K;sp%J zAi94iLxeB`gEy$G5msOTog?FjHBGHRN>hx`G=;f0kWiZH0jGy$3=xp{0^d8JF?ks{ zUHO3B%EBNDmOG#Us=t#buVQcp`Bl^%dd|yC@EQqN*#!18Xx;{-1}Quc@dw%Cq#?k- zU;zpbP+9`11C<5vv;kEE5(mj6r!|<_0t^fqApM|ln!J`F8KhRUmqCaT)OTCP5ChT& z5(DW4xgS^wIM;~g47_D-QfBFrUq6fgUrHa2Uy*H1|87(_MrL> z#D~;ptzSU(894qM8H7Oh(dhIsfaVl97+5Nu`)BsXfaViG?bBXPkS+!WhRy&MO+WDb z0eIbMe-mWA_yi{g@Y&EHRU(MF1#^Z45~@9CVS9Ef8W`U~&p8C`*@dzh`wu8iW&)qv z#vNx>f_pZqZxnlt2 z9u*D-j{Z*2{%!^a(0K9L;IR`O=@hJFCA2yX_ z1_5mT?Cz6|Ik~97=Q0x-~&#Nm4DZs-FWt@5v(l|Af0_r{$Q26w5{{Pay3S!4Jmj53>d)E7x zL(U9mgp4VG%;pB^1+NQ18%G114;ov7jH5yJRYUf&Am2X$J@>L1eE*U9-v0*cmoQvd zzntOD^yLhfK<5gpy!-Ee#c;52?t zpaDAm-UVH=jaXX)PQQznF&qZn@nmq0;Xf!W7!MezE?&)WSl}T8mkJ9*Pyfu8j>$_I zt}kB30G^v&zMSC_Xs#J#FDNcRc7n=yP`#&aDf|BQXHKsGtu05M*J>z$-$A>Afo0|j26k1= zqYj`u?^X2}JV5u}que)<$PlnIks-JfcFr<*K9j*?XCi|)%DtS43_hZIp!rM&f0%w1 z9@c=BF#UQAEHm{Oz;*G;Jcf{+dDzdK28Gf3HIQ}e;5Y<@#mtr(6&3~!6?O&%kUVI- z2o%QPaDvEbqRWBxg2Htz!*xLh22h)Ii|S4W#>G1st|P}U$UIP51DOZX1Bx^Cy$lzS z%FaFNbLwIHUo=4Hj~i@Y_zx;Oz-0#7J`jNeOit^UGl0(b5&)gQ0ZQKt&^s2?mouCM z*(2bq9|u;B&&7{yXSIG8_0HL;Ax=0{ zfcysHgVfkCGBBDbHZU;o9Z+UwbWmaN2w-7#WUx?S1n(<3F9O=Pz`~FPDrZz!7}8W& z7_vZZmHuT6ptT<-L2d_y6DX{~Ygw@LYhd$#(0&bQo$48o8IzYYoCKK%G6SRrZU$&9 z47N702R_aY>8JLB`$nKObxi#;TWUadgU&Gon*loid=CRiP7*Y>gC++WciJGpz`PU` zz9NkbVW7P$Ab0dHV>knKOD@P9kUqFuKx5RPwSn*9YXcb>e`1cGPhJN}Z{R-HK?Y_O z76xWem>ID${0I9D>{iGb?I1fAFJ(9ZvSTuchO8flho=e)LoP@T9G;-QHfTHC9O}i!^%_GeK5%7De`?Vpz^dITAnsCFwAUZVD9fjDo^_v zSZ4M!u&bUsegJf*x9SN75752d$Y&p|bYuwF>BtZa-}mRmz_Zek!DFW*gEz{)KSu^1 z(G#F^>lyrE`c*htC&2ZeU|^Yf0$QGWFof*%z*C;Cgp{WO49wti5VZdXJif7v;kEi| zh70Oz8IFVY%B^3|AhCWegUI^T3<98d0ljjzptTz zLBgRy^_*V@ z&Tt&GHUv}#tzW|+0!ruLvS>ZHEP|9n>%eETg4TfF2IZ6fj&2d1NCt(8p!p!l3S~hC z1~yQ6(Z7lTJb$F>3EC6Dz_xxR!2VMURH4juDGJ)JqT3%oRw}Ynd z1pD`rxFSOc=w1sX_vM1jgu8D&)V~iHxItq};5Fr-eGs5I-X6$a4Y+@2K*~TQ_c4Ra zLU$jij0V{UDo;T2aJ$gg#CJf>LIAH{=YZ^cf!oD}Vi#zi3uf4Y_Mm~*mMbuDgZF^Y zK5R|EX%oDr>VT@c*yGYYGD7+6$KF?j6eVPJ=q6RM!Ql@%ERc7pCdhV3r~uT5m|*a^D-7FqVp!>9t${B9feJf%5Pcg8}JOwRhv=~BmYT+qoR>R5}#*g5zSj+Ha@*;-MnvgXq zLMpuVe?%M@xcgT!JOPzKHjHcxsx$vB(6<1c^XZ_>$QYo)tR=vr;m5$hctAiEq>ce} z?&#_YWyY7_IiFvXcQCx}?}4-}KzB!g(wiu#e+3$6!yGrnSbq;4Hw4wkSl3s8%?H)j zj0~W4a^N)s!VKWPhA6212IXJS8eUMkWo7`+S7O)!YVU)~N*3(vp;5|G4~7GR44`&g zAfzniIsqw5Z)Pa=t_Jyzfq}u>gGEz=0W{botm6%8LpA7t%h6SkaumJ%1dW4&){w1V zz#srFOLsulB_Y~#jGf^4>FWlU&7idgpz>4j00S!nw}-NdBm?961q>Gi7#LXAgZiJm z(6Vy@!x=`!3Ka%_@H$atQ2qtQqY5L#dC^92`vP~_32NspV*t0YFv>wtc(X8&*>++K z1NjBC&lS`@6lY}6WnSO_Iui+2E})ia5WARhwbO8xPqcHt8p!>KJ>$nNs79ilZ9vL7 zS&?YxWOX+b!0)_|WMG*Y$-u6feXL>SP6ig$dE3i6)(>#~`3x*G^P%MiKSRh)emvy{w7)07!0;Fp7N9(+ z0?B{ivo6FL7??qM2DBz0L{DDB@EY6>@nbk3cmR}lPCEDZHZ(9u1~jOy^~+#f<)PTC z56wIN5iFW{3=EKUGz<)4JkWJ2GazLMtnVcbJ{}NsP5{Q-11x|0fckQvxmi#d0LuTM zJO;`upuE0#C&O!S8wXV8tzvi$8b6u59+E#nZ5vQtf#pkZo?OcyuznST$oiGgyty9M z#$i|l3WNUcZV}KPM$p=p{uK;Q1QQroRA(?Ss`7!`Hq7hSF`NPSw{|dGz_J#EQ^yxn zPGIkAfkFl(4{Dcz@;w7@fHI?_hYEuy_}(zp=_?p+O|{tBpG2Z@97Hz<5Seg=gNtnCg8H(1#Tz84CT7xDCq7~(-;0dfy0Z;LWANH8y` zfah(fT`2t{P#*`Bw?TH{YI`8-1E~YKQGkH~beHcIP(2IoC!9NG06M!AxlUaT>nA|# zRLGwG|37vs{{M~Kc3%zZC!n8O+KbdrxWT|O^9BRE>e{0ZR$DNzsIFx2*loeU4qJN+ zIzM3LLxzBz4;g|xp<_I%?-_VjK4kFN`H;aIdF}GbhYUWVD?#U(F!;mtt8lYP!u79Y zV41lRnh#$xgzS8YCm%xVZ&3OGg*(!HQ#Wj6`1h#K$%CDLYO#I^!-?tZ7*44$GL*r` zLY6X|S-%WCzIp|G7V08~Bj9re4l=N)NHAPf;fIWqE?>`ZYWWU^Q~f&`E`avv3oC&3 zD=Dag_UTSu#&8>ycGQZ59j+J;y*i1_qG>4B+!~LFak(w{*S$ zg&jx+tRB1`qZNFw9Ev!ot=rgp17sHHJOr3o{jH$A1Z^@Z5)2+7H-OHZRbgRJf#^kQ ztL|smqP~~m1nL-P7UceyzV0cYIk}1F7-ZHjWnf|GlhC$EW?&S6odw(~p$*mtIZJsm%&=@61KWGg%XpVA1 z1xRn3%#;)cCS?6!wU9G+HNfEsnTrIUVGZI#%Ck)H`XA7|P=8-<3aA_dt!amj>t0w7 zoeu)d7fn6P06Mdbje)uL00Y0glSm?y6@!C=>hzrqmnN@fc&x9;kSC(Rq^GX=ze`t< zflWYxu?KV>N`GTR0RyK;1A``qVvpu&@O`R`HXe$M3XpZk{axKGlb0}D2kn8HzJ}qF zt|J4pfC7URXl+mb%r*(wnThLHFq{FUiGI+$)XWAQSeU}rldoUGum>!^g5ivS1B0vz zHv?n;8iqa7*D_qvZG^6im1OV$nJWsq%ZihMQH2j&9y2dr$8br7pW)*2^$eHR?_>}G z#l_?u43DQTVYmdEv*};PaHD@Y!yRyZtYna21kEji#)l!{yFq|~X)7p?PhQ3FxPNAw z0=hoX*)8DsSOq=<8KfSxUT_Q8Esfy$A!d-Bpt@V#(!xfCl`$2h9%K*5PXY`~b3x{V z)vz+Afz+VMPX)JSMNfj3-bzr*3JY0UFDL>t6#8doNH}_0Q~PnY@nSF=%`q6kq!Kp#E2z2&jBV zj&l`G2FCR(8Dv1^J7{hI?3Q(Kv&=zeP2_@xyCVbh`c({jL>-{v4z70(sH*mynt)#K z!p1^6q4h4PeuVGMLaKLHgZ5^D@8CwNcV{B)&4SjuD*OygtN9pMcJnc?gX$Pin6KZ- z5CDn;l=FXAFq{GVVLbzAe-a|xJE8dyyfPQO{{WN^K_iR|So7fu25j-g3=eNueuc!B zDCj)7{#D?44p1Hkojc2?!V3!X1|3lOfgI)-akm;4-i+Y!PXPu7j)e^WKlS%P_e_A+ zsWUJz=$>I&$ znr={gEkRW^`;>!f9)m|`A_K$BLJ+`Gj8KV~NW{|y?yU)lKo$Iiz8zdIBE z|CyNxZLc-{|09|QJvR@kAAHUqOn)8&%gj9JIe&c&EIa#%KIae8CIFS&>lq${%56~C z>iRM;S*``QjZn%=70`W4d<=~1*D=U|*AK3R_xA+Aer8}y1BExJt`JRRs091J2YPlE z^xP=H28Lp=IOOcCJD@#jp!IH;XJ>)-Z-D!-0id=RsJ{t{BTzpTWEa>B(A*JZ%o=ir zktXzvpO;w9_<`Ot2-1go&miLLCeRoY$PVZoH;}Nwc7_pX{1tR&6EEbBThMxP2IfMB z{u#Y%7}p6XGUl96TocK_0h&+hhn!#Jqms|SIC(k4<24cBy^*3IKf(HsYe46@g2rT) zg4?g~Gbcc91^IRQN`_1Qy^#IOpnfUnewV37!0Q>WgVwl%-3;9i57q;9ANcGe(AYcd z?4uk=xPaAw&e)pSTLC{OOae0h2HO(@K4Yt|cMY??fFh$7^z1Ka-c&se?zg{M;|)Ih z3$%{$4#*9#u|iPY-w#@w&jVVUU!e$cGju=Xbx;_9)k4oX(o!9^N}2AA_^A!FXKJ~!xYSh)VP3@kIxGO(*#o?Nh+mw`oHlfh#*F9SPl zd>qslhs}+_#@8YJ1<2eQ^7#5nM+P5pO;CSKR`` z=1BTMeYmbJ@V!dlwg~9#FvuOp$_(5Q2PUs&c+9LVps3>X|HT>~1`z=U2FC@y41y|* z46GuFpsiNm@}vah4rtwR2c8~5bpa?3E@8L8v^B5uv;MK%x@52V1S$# z(GM!$PpGQCKN+CEU%z*u~7Y>edlof zuNYWnzG7epjg7C?Vqn>=g{RMly6+rPhC%vBXzM^?!Q&s``{f#YXMoP5Q{VevVM-+f z*MvL<4r5LG|4TF(7<#f8ctB@EGw{_hFz_F90`)7PeG1UIg;y5uV7M=^fPrWIDux^V zGh3G+-(Lob-}Q?au7KItf^z7xwgsB6I>_L$^B~&T)Lh(%G0RZ!m=HyulE@eka3% z{+Vq#p!OefyAPBOLE!-kUobthC1CPWhWns;6uqA8U&3$&e6|m4Ej;LKpKNgX3U1Rd zdPDLSNI!J#c?77A1=|7HQwb`guYk*F*t$hf8QlXm19HYb(Mv#F9oHK7SP-#cx?sP-Fp~ddO&-NB0&3lFzf}D3$VNhS|cI>wij~l`wtYiql21fYhk)F?fK+OH^1Gz~Kl}1JVnc%bdKN;hqW$gDS|+pmr5h ze>y0nsDZ6QmcUZv6s=DR zT`E||a2Ua7m>D=TfbLdj1g)_Lr5lk1@n;_#ep!>Z+ zX;}w4Mqs#z;Xi0R2$BxkL?&ZN2kRFxAmR=_-p0rPG9NTH12PXZ_5h-xV>9rvDs=yY z_8o%!hZZ*Avz;O0c*6!VCIfCi9#B=)JUs)w{Rr=)LEDcgV|hsJM{plc8`{T%w;z$l z@}TWU@K_!<1Iuo1Nd5zz1B%|BTfd$Gymxy&MMaW<1r#pGVXNx{85cv( zC+pW>3uA`m;4lWIm(`g0Q-zbk13C^a0^0wHnFbi9L-e zx`2%N^XNE&(i?be4JG}8^<(M*jUg6IUIS|TgZfhis_GJ_J=FObJYaK%pm>1gIry9- zxUCJzvnX?p2mk*O=ZEB3n119u+s)6wGMgWqXBk(XXJFZRp7=Z~z`zg$^7r&L43DO- zWO$_8$WSAqz#ydC$mj>Un?$#fFB|fkA^& zK|&Qg55t?$z@W>a*rR*a0%Ql{o(x6C1(10dP`_&WI)+EO4;i!t6c~6^fBe6x&&a?c zpuivrvIDGN;y?p~1&3mf#aZy260^(!MP}%jrwSv3kKn<-??G)9(A*SA52!6CtoR>% z{t_q;g2X`W0+8Lhj*O`S3jfnUY>+spy@sAXL1||_ble`K4itv!dl?>p=ieB>_f+pu zpX0X#I{$V7d^hHD2Ak>28H`}_Zz2a65Y; zG78jh1c~c|&yi)Y?qAE`(Lb{Xv`@%mvL$%@ZKkjS1DE=028)So3>=_+FAQvc3=EuR zP9S$OFo4f00PSf6&DH4iCW6Newya;sz|fn^z|y~jfnohx2A1A5@Htj2>z6Tb^rkcL zs7NrdtzXW-Gr{ja_(oq)oj1Y%|DpA;HEZh`MEZ9!c!1{oCaW@V^!IeL^tbhjpx1#a zTntPMtZtBbRSrET@Y?dsGZ-EFTN0SddxY@oEGp~}E^j)6ha%?T7Hs<3lUAblo~ zJ&_=LR2Uilh&*J_QD4Jgp}vyAqE`_qd~~4Uvxb4CR}CqA)ERhG_!wBh;p6=u5Z~CHWA$%NExld zi58EbJ@?RZ8tP7zcm$dv+%L2em8zA;w}DIo2;=c(Z;1 z!-w??7{07u!0-dqKM`YO&|1HM;SOX>^MtDExpNX!T?f?BlK~&2g02GswbwxFfIw@2 zK=W0g{S+AW-AZVEw*u1MR1skK+uz-rqP~jZ4QOl^6b_&~2cp+HGBEV!L&hD~`ZKWf zCW6u_1H)QJ29Dl*$UeTc{-C?UTITdGVE~_f0MZAlqd@6Yj1hER0V8P54lihrBIwQ) z6($C5P=8E)C&MX7-=Jkl{}M*f`30BNmoeN>U(RqER1SdF4oqIb@C9TR0|%&l$aB(N z%%Fh0hCp{QgMEKbPlG`g!+%gd2H7px06E`N(1Ae_>IP1bc>m1ioc<*YH^62uW;g;e zw|_Bs?<6O9Omt>*21vetDFb926-f<9UWJi`LBNrLhe061p})Tu)Ncmey%EEh4>{L` zfwc^B$10zm6Ub}<28M^Aa<;#tr)Kg}hA$I27#IvP8U710Fvx@MTN6}ZkhS7r_}kyx zEuh=OzzAxaFz^I4sCqN7Fs=rlZ6m6_p5aFCLk0%*oeXc*FJ$28eaFB88jD)Lj)AB5 zAp-{}Zr3kl5a@l!zyn)L0y10OGI)>rB1R6dU)O>2HE7IqFW5aZn+rhY8*DC~fkO{m z?t=D?g2Dsjb`b}LjRra3{?i{ZMg~^UIoK)!3}q_J;JF786($B=P#K{jz)%hWA5=#yWdN7+{p?_W3iQux0ga0>sIO!=1D;b} z%y0$V&RxME0=5Ix$65pF8-wf+Y+w*szlh-v_?$0LT)@hTe8@T^2G%eJ1};4((A+dA z{6O&y8m9o26YCd4&0GLqR|y`M2dzgFVq|b;UXY;*TE7KaE37VY_Jq15TDu8$ektSs zAG1Mgk3eU;GD6QkW&HnVHt6g;1_p+ejQ{_LOM=$HBAxBq*-)?&reBhQWws<}kLB5l zm68lBs#**lJ0%&|VS6N1LF@7tG6d{gh_uIYEd$TWg$y1$7c!vkv0TXDBdP^j-;1=z zlA9x8B}~5-1ItV;=)A=$hLD}Bu+Lk7!x}ng0g6Y^y{O={{vKS<=jc8Jk6ZAA(i=z| zw5Fqf8N(mYx*|}1Vc^qq0?jLf#+5+f4K@!xE&yGxH?s|NhSDDuE(VYFs~7}e=@q0N zl#amm&TN|kDnmf}RiNk6gT?nVY(cC&WCZtXK;keAS-a!92HNhqv3?_i3@D8oTmfGd5Vzr`=EOfo%;7Ps2DtAU=(m* zP%wDMz$AEpK|tjRXw0rnN973vBTUcYr40I@I~6B`XvkS-;!FxC_hW+01D%ni(m%6J z2ai5cEc!raq=D`RXJcS!P-S4Ra5DVCz^Ep`z$nb{{}1B>3ssTF44j}l$-!$}Ss0jL z<})Gu!VmHb9=kzfzDywXpm2wdHRIYpuK@{b7wG=ie;?K_VHB9Yj!_6yr>dSu+>K_e z$?$;jWdIAx-q@v#BI}niO0YUGxU65!DANy~*Dp|2%|3TPH5Y9R2R60<8^b~Br=ZO1 zgT@weA^jBCx&Tlh}Y(brq!2`5r7&OKJ>(_w$MbP!N@O}|^ z%m}i+7NuYGkikbBw6^degFj5a3Kv5KY<+DvCj-lDPH3JZw7wQ;E#~AkjLQ9M88rkO z7#Sw-U{n@e!0-=5_pfGD>0igFBANice~}S1P77Ld4q8i%K2HG}BL&qBq6Zmx`&Tlm zOx_7TQ%_V#lJPCG0wleI^nv3Ua-In2Zj$F9Js|ZejQ{_ODuUL-JE%_I!6>A{$Y3eX z2p-E52iZG$IoLcgEM{B-n=!M+2c!mz{5i1vdPWt{xG(EN23GaO3=bIi6OliLfUdbpuc^RX$7$<|KCZs>3 z4k|nPF~{*aC$C~S-#@eE#QGJCkahs1-M*oJ1tUlc14tee{(=q+JfLxHq;L@j@nLZS z(hn-vK>9%aKk(Q$D14SNN`uNgP#hqu0T~Vo2avkO%NY44uVwhJ!owghx`2Ue{ThZl z>Wdlv_pfHSqmumpziQt9|LfN=+?fDg9Rk`@`TrM4Zu&|{oQWzjn5eKYi1g3s^Z>aJ zG+qgc6Ll`|daN4^2O#AW$R1ET3FJyBZGzLK~VYx^+7s8YZn|gr%GoBMH5XU<8@oa0$6r{Z%fJ9y zH{IXZ^#QcEYK=DN?g&N|P*^ZXdMK|4<=GvK%9EEf$_s;!HDzGv?}zM5K{`7bI}vgkwyki6&40TaF{Ox=WEDZBc$IB3NM&FKA^k< z3NL7%9yYcHUX285H-g+R=m076`XT2wgXb1O;vl<0v=9TsSx^};eJ#}fg$#)*EDU`8 zGg}%!aSt+Ig$>-V2kpgU0o7+9aZow{%ds=a!_2~R7B;;K~;}gU{OIM&d0chF+rA0fa z(C`7ZOYyaHO$fAe)v>f!VeMQKm|a-f$EsNLk=oAHfSC`fXF%<5=vknkHa0H1LG4@( zka|!!6W7kQjDYkhpzYj6j6yby3>GR*{}zDGC1K#JP-c91Kn2wHWr#R|wXMspz~BaM z>w@P?KQ0q}a8^`N%y0gUxFs~H&rc7yhG zLidt^+P|wA89a7__H-hj7X;eV3BCsddA$vz1zbP$9t==gUCqxBvYQ|OdYko&plyal zkT%2QRgB90s~I%}9T@&iUdN~`n!xY}M1$I*{c9LiL={llysDr)f}Y0(7#Kf+@(Jh+ z$^P|>DwEfN>oQd#KE~G|^`QC)IStRT%%>6oJfL ztAq4`+OjGv3~C^Az-b22X1)rt6Q%}>Jh-mwU(2WhT9?nd5Zd15J)yjK2eiGrlbH5y zfHS1M8-Qr z)FuU`HNggGdv_hE?qbXqJ;-1T+SkX2O`?K z;5wNxOEeMM*6r-{0qtV}tt$qdd!?%L|DPx$1IPL`1lzhMptc~${~))5+8dzpTTmMp zZ(DaA!wvAcvTGTxfcg%Mhbk1Ac_ow?@S zDY&hhz`(jji-7@@uR-z0z?q;7>hFQ_I;gEHcmS0D7#Ohh#|X7O@V9lrZB52((S_i) zt`RuxLfX29pfG{8XF+puAa}v!k>$YRX!n;0J|MEKyAzT=#TD_kb+xdxb?rfM1-6^? zyDLHM32@&OW z3%wHobZ-a$i3VnU$UPg3JK^m*j5d`D3j;U!?8eS+2ax@s^bB2p4r#CIz}k zQ_#S8ra+N_uiyZqUWMYq2jH;9XorLLhxLQjNrKwCYZ(~&K=+pLo@ij!g@h-wBs@Gb zz~?aGYU_g9tDTUxE;w94iHEbGf$=2N4SjGoV8lxwFF5ak+q$6q4sPp8oM>RSfVcrE zPBGiM+zbq$b*&)l5cZ;`D^Ob(nzlgUM?zay{|2c2)!)~np}zP31JJo7>-RIrfbOna zzl1?y{Za;%^~)GE1P?GU8!QK(GwA_dXVc#;19lInKg7VmAo+j+eCJgE4Cpzo5)4cr zd0_?yP-rvsxAlPg;62A6XRfk<_TaKPH1yBxc3@<4Pz1N(IUEi!YX~S#@nit273pLE z&qq!0VvwD@nn7FS735x#2|f&RDvS&sf;sTDp2{FMf$t((%b?xg+P$HFX49IUrI39# z;IZ313=#qk3@nq^GH44hfY!YVsDjvFa~49+Qw8a3>rsK}1-TWJzro{Q5dGk@F(74` zfNFnV_muv|?kTC-2Hg_`l4Cq5plZ-u4_622pXkB%|L%bFYg;FP z`nBNmWtT8`fZPEdk6+5*vwj&v!20D3A?p`0xU65#;IMcBgFVPk;4oRj-~!qkJf(?& z3DmytU(67qSqQH1w#sB{Um5BfQL2DBP6c`VJ;u3W|#`z;4F|_plyI5Kp^$7b|<30#RxvZ2Xf8^10zEs2WV{xmr4p~UID!R9BhXQ3qv^A zj`aWkp?1s#*#TN3sJ;la-l+HkNPhhi1`UurXw5o!-8tsnPzwDZHIREXJk%{q!1HQg zv-W`36yv(P1+>o78x$s>a8iNZV+I;O0^27Enm=T$SiF*-mNDjoXplKr!WMi+14s|3&27WN03O>0>tD{`ufoCrzOx7vh9Ely7#P9pvL`QP z@SnVb!5fsP1X&rF8B#bvd4>^`#sw4@)WGUzwxp=IGcc`R&Hxz$V_`7sUk(i`Mh0e) zhYZ{x_uzY|#~nif zNR3DegC3IGm_cq+VPPRl*U1B0;PLUI-p5f#}fun|AXfKy+L^& zbPh1cJ)kkbe#o7U3apCY^T5O>FJ}Pf8CV!IJOGb9L*~*z<@e0i9?%}1{v`|!u=0QL zY6ehS4;0o*Kz0#Vjxbb%)Pl}C0hJ*l3Jiguv;@jSA}I`9;INw65`Zht1sEXbn1jj_ zSU7|H1PW_fg)zvzpmYSvzaY25!bpW3e1`(w@&;5UfW}}|co>*K>)$}*eK7s7ya>vB zurd%7Hz5DO$}6aT(ESeLATf{}Z2U)s7gUxps4rd%zHcK1s7Imm2~InaEL zQa*#k!S3T@V1kWD!puN&AE(7S#)Lr?#D z2JpI0(FY7&lUFfJ?qAL@W%@dXCXojWmY}(2&>lCCxv;g0;tUKXx<42kK>I{N`%%>` zFUWxQg~Il9g7yxsgq|UTx+nDikDZQa_t-lA{{z_*igu4JOh0r_C@4*?By@(%8t7Ur z$Qd#T;C|4|7Em9D9VyHbKxwhRv8P9XfiY=;E&~I|FT$WYh~Lqcz-Z;;O!7#LqCuxQR;U@+!m_%C>Xfy0KefkEIQ13RefVR^{F3ZfaJ%|3%aifbUqm{Fa>ny4opw~GKLu-H-Pkk z)pLXMyUpU&47H$i1XkDI175$2G{K58X3l_~J8*-6W#WgyIy)onGCOmoe0W&0Wlp0Scr3#S9rD z4h*ZOuViQfwGF`PmN9fsUJg+Q8aJ7|mZ2S_R&)Ua|MWEsP5m<uhLq!AQ>k35% z{)z*P`tWfF^zs>`mm545*4ym>>KlXC_enT3FiJQmGH^H?U|f-)xUd1-x5voO;4}m} z6BslH2D+0JGzSLRYpn>{Yt5_;xj(XhJp;HcEck%I4;>|?BNC}4GJ?G#sdth`u`v3zGF~;oD-j+!uS?^E-7f9n+G&5G?g9A`^=}1 z>PGOsIeNGey)OfEBPiTKaR7=dnEPSrL4bk51ms7wa0Tz#$Kqx#kQr!W0X3dHI4nV71d2m&8s5X8(7zUZzfp|}AA%3P~74357cgOyo2(n3JZf4NH55Y{`KH}01B*-dvMf=>WhNf3CMlXmGHjkbdX)p z{LTeRyI?;rW$*@t5zJqRJkO8|QV&Yop#4>#^Z`o8ptKKD3-3#NL z6f8c`>Ku@L-Y_#@_Ti{=Abm)v`Jj7xL47<>_<-A_d%%4q@cEyjOyD(*NuackD_seI zkJkpR<7h!SI|&|_kh`jCRJgIkWfmkZL16+52T+*6`~eFKP#A#26%r2MyA447Q*b(1 z3LZ)j>3tegGtIVeL{!2)p=bRvh6#cP7~0n_XPDBzo?!vVEus$?S|+b#nBBjeVb1im z3|%4*7>rfd{W}0!Hw-!_R$b!44bXY5u=Ty5^${x-85njdGBCr}2ZPq>EB^nnQ}O?A zl=Z=i|NlVFYDHTA--S3Aup4?-D`?(lr3M4bP7UauR#5v8wBKPFWFJ-k67ZZpWKZiV zaNdTrMImh})P5rmti8{exilAwCM!9aZx zLx;L$Gvr<;(AX=a-)I18hk?c;Kye1^V~9idT4G5rpnfB)UDE?V#XAmHra|J#}_zd(6f`beUGY>K__xJW> zz|Rpr!@x503e(0Ok3F{>9+4N48Ag!O#UNzo7lY z$&;5u)Pehls~P%1;U=2Ez(0K*Lsx$fq<@ICziT%*PBGVug4*O;Kyn~`pgxD{`F{s= z-!eFW)@LyApL7P_!zX#5L6yUA3Zn#4ntm0*qL~ZsAI>&h2kjrOW5@yZjV3Q;XjS20 zU;_1zVC68hJ^_UjBWMn@A2hcNTB`_}732(PVDt=7WZ()oz|4hn?i8e#8@yH#G_MYt z`^{!xU_f50m<#V)V(%Y=%b$AQLp7&Sb=>rdfpKUXp2fYO_w14B4C%=^1H zOkT|}8??>^RL`ltVPF(ZU=UothM@#prym3vZ8lZL)D6hcGRAC3VB@#gC7P>zW z)Q6mm&0ZY!Imle@en@$T*@qbb2bKqgs|}+8gF4s01G@eU3ZT6SjExa0 zjNTb6tdR91us&ozfj(qED6hc!m*B92+%?{T+J_YQ1FEb^`-%Ig<(_0~0gH2{rgUI&@Fe z`sEBJj0qB|OClNAL=Q3utnmib3IG3?DBAyLOsr6`VPs%te0V_BhVdV>iQ@nN%#0o? z{c9L3Y#138)ISHR^iE&Hpw-{o`GbKc!a;TIKhXUjPZ)Cx6hY@Sg2R** zoZcj`rI*R;89@86Bvcp~SVSK(FsrbF>rwE&{{EI;8BjW!(gK@r1FyZ7=wHI10GW?( z?LkQs`@wqzB|!0|zLx>I=ZW736kqCl|6c%|v$}o*g9vCng24rb|GEbmnBd{Lgu!6_ zQU(*y9(xf520l-e>Lcia*TEVpwfx~D%UYF_5Uvw7KT0*HU@c+xu7)?{d*X&huIni zW00I+1B18<3q!CF0|PUtJq+rbg7%xK2=F(6@_qj@1{F}=2AQYE&cF=PGkGn8F-XpG z9RoAt1q($L7KTWe8c-PkQX{|sx#u2iE-QH4l}Sb5{~r~B4>cgYuyPo*eh#F*e>sB+ zs6GMp-OD{= zKz;>H-Gv*&(34_Y4dLLJWQqit86JD6C(=pt61eg9bx_hpI{?g9^ig z09DXA0iZpi;62@n|9^nav|Q`>|3@$AjtR^EKh`?_|HH6?K@y~nA)!JQq)z1(cpk=p zfgwVO!P`KQ;lKe^m2(U#{frC@ptkMWhYSq;jQ@Xt+9+!u{{PVr+QZ8C|Hs;g|Nns0 zFg%D*WjK(b3Q`B!Q?8oLz_S)~jzi-AAE5L5)-L@2qc`#YAJMG;Kh`e%{|BT76doWo zknrFU0ELJ8-v2w+FJbVQzK+3b{YC~A6-I{l3=SQtu(K&d4>GW<-@u@t!p|TMny*;C zp21E_9dHbZ!CI4J#Q0RIsesn!bv`3uG543`89n zSU`5GaD&Hfn3u0+uv6h-NLs#z!LENfg8|46(E0Zuw}R|oUxOpwYjQ!J!}AwrXhs&7*+k+!#3n zl-I9fZ~&{uA2L17M32Qmv}CdgkPH)G3paQ_gK??7eS z%ofyq2U%YN%6G0H_k!Gp&rKlvklh4I12Ff(mZzk0JFt z)~|r%t^QRE4&c7k%$63=`cP25VAP6GUcVYCAFhF@)omQ;e8>vD|Ks0_{=S|K{T;n2 zpf=w64GbGV{xg{HA9T<2k@b5R4y@nIuxI@yh8^oSGHek%z~Hfd38O?m+B$L32MkW& zc$v}T0-|B#7Qze+HXyzL1B1REBWUihp#XGNvAX5eIqJHgJv#-eC~Fp=d)eV@7LfMB zqnu-X@c$oiUC3NBOh0J+5H?rct;@hNTNko+9kdr7vhrB{%Fhk+~g00U3HljTkZHqiMM`j!lgptB+t?_d-XU|@(a)&ifG!X&Z~atA9y zALyQ!<4)E*3~ZotUO;+`g28K!y$!n<{zKNB98guayy~N_&)@+If6$r}*m-!c_ye`M zV0T*}#~r0Wu3@23X$;hBqK{CNF0c0+}Jezg?i8W@-jDj5C?GeG7(AFBSH-Q zz1`sU!$i=22?hoR!37M)MtThVf(ICkj4T=0LGjGI0CYFXl{Km}8Bo@mz~UbkpUCM4 z`A#xW`VpN8Nk8!T1l@xIy(hMFCIidNnUMUyT9ScfwiXGlKX9v~K1~jA}2cUtnbs%rD@vQrMZH$Z7N7|39L= zkg^Q!7YPO?xc*)SmYKZ}zYr?RQ2eq3x)uwIUqEpv=)fomqWgQH{cmV|i9*i>><66< zv62CPW-}fHV8wX{|fuu`;28PX`vzkC{ zeb5?LP#XePmqXhSkaHHAA$NgH$ODfeSIC1WB>oFurNq5DM0!Spfn9q z!vGoEUjx#EtQS;fg2X^$SpEIo9sM&~|A5A=Kx302b&Ti1_hlRa+cC3u4aj^@+g*i) zK?dZe{+TU0pz&gmTCh2wx^)r5m;RZpYe04)i}!=iqiO}`L1b}IdC=e1y9RX5IQZ@} z2gn%=p!2FgZtvg0$k5-@^`XDF>kDWu7toghW_5J5B)t|UqEJn%wpgzXka{B05PZUfZ}?|{~!86cXs!K z`Vp-c!0JHzl_2JU*FiD91)sTopnnY`L;p<3eH@@L0fifMf4VYgk38dz3dOZ=KyCuB z7fzu82 zOnUJ8CeS_J5VwN;&ddXK>w2hLd%M1X>;T!tAX(7BcoXXPb)dUL7-y~L|NjA$js+V~ z#*L#uZbwhgpfK*A*}VZAUX~0DATvR6#;j`qay$6$cDUR3FdV?P#uv1g9ONgkS$*9b zplR>|C@eu~5OjVv$PC8w5PvWT9B}CG>6Kw}&`@ROIiWaR1(YXRe3%jp!2M)sfAoL= z17kWkeENE27z8pLK>3n!U4|VRevAo4A%rz)pJ*P(9au$?-z&7Eg|2}fIPPZ zy7TA;^nM1|+|o>>`x&6;4XRsS-m`KB1Ix}Cp!UQ8RV?in@P2XB_6uacIBNTa!3WZQ zLApnUkM$00zj!ya{Q?SC*nV+rcQe519Z4B)jjkb35Xs%p>W z9Myi*dIo-`B6NKwxE%(&Hw3Ak0pAbz*@!;x}+6fbDL59$0U9@e|CHdi+<1Iuh)XubB9A!O%U>}R%t>Sb{FK<-Kg zhYu)R`)9U*?>>T+-yn6M{J|h_!lAzpn(p;7Kx5DWQz|t}3{)YY)3~xYcL2WXS zSpp3V%Rn@!od%*o_JL@S8c^8`E;}G){snN^0Xi>^m4OeWj+q~t-$3IrpfaupT5f`2|!SGDuW3F#f1e2Cq|He*#=jt=9w933%!$P`v`Gr)EIvDUewVycG?M zZz1M@!k3x9KymGv{~thY6;Rj+G%zS=DK-d-C@?T)yB0) z7ScYM+0w(LfU!;+RCa^+#UYoSh_V)P25J8cq_TDg?y?r-9#A`8fPr(;0tE(!{)yci z)Oh|Y^cgZR==L!z5In%ZrDn*$*biF!z;n`>K{5lh{$UO?Z-rv-Pmpc~2F95OShV@T z_ke@49`0u7qQdpbe>2c-|N z9LAXooS-vDgheI3Gm zC4L4*P+v*+G3d?`23e^27p#~VLZN1Y%r}FwVdh&v&8NICmBa8~umN(9ou~r?q)wgz z=}RGvrx+UPGVlv7U@!pnLlAZ6r8BBG(bi?a?lvN(?!1XwcY@BLhu6I~8CYiCgqG7Y z8CZ7CB-ocagVB##$#4eRhXT*BgWN8x0NN+WzyR?>hN|khOEnnv|3U_aoeLS5J7InR zpAY)~$IgYQ_l~bz`2UY6sQzF0|37SP3V1vSrXO1WgVNv19SkfxcM#zR^f4i*A3$aZ zIxt#;XrW+Oeung+VDTi*z`zEQ2bDjIH!+HU${qm*1|iVdt|Xj01u17*dY6Fq%Ye*S zyp~Y}WCqA=kpu=#V$(iIeg8~Ie+*W>F;&9*V`~laK;t@~eYuPxpgtLT`xUGoRwsd1 zXfQB{HZaJ8&U^vy>F@9ESWp3J*MjPx{-)kFjO!H?Vf`=_zW8{3goV*KfR!~yaZ%T5aSG_epnxUS|h?#F`kIYI6N^*P@&Fo5Eef&V}QGyefdA8|$o=+4H#wLAZR z0Hs&K0}LAd>lm(p`YRweV@tQ-z7nW^3Tgv^?u&$)3+{U<{NQAK18KWWUdAW_G6&S} z0`+r1{$V%(-qU&jYzC+u1?ua9+EHtvcYERJy9qEr=fKuM&WaX10NaDw5&$;eK|>W( zr-AK&%r!#n!0t|Pp98IFVFybm%S2$~}R@dXbsglQ=@F!saB1n|mN@FIu+ zuy{YDoeD}DVD%3fyuji;&~_@cEh?tN-~tv$>({Se$#4d1zn#yu23L)}0A41C&=8BnlcBZ$QQq`d2cX0ma+exBowY!UD9G1~h-jqzImW z=LUsee-AYLq2VUjz@U%ThSgDFWC#-qW`MNuFwc7hw^u-C$ARi2ENxv5@OtT)7;A38 zbr48y@j7rG0jDWYT7sls1JFG}2f*V7{ou7nK8))V6sNW@FyKf};4xH?TSXNaSXCGq zLKy@*KzlY-RRkD9KzxvR{|<%=P;q$`0ft~Op8=e{So(J|ToGVkkOYhGgyb<{1<)P! zjFzBvI1qCfEkWj}Ffv*|&EZuMU`PV-q2gvxads5}hC~%cMl(@G1{RPS(3&8ym;eKK z%{i#849XX!zA0yrF);c?jmXP?VZ0R}czu(}!DETH*7aQl$8x&gA+jX{8c zU!Mtdr_5A#1`fzwDrQcg{ucv#?g4eni75=cc1|Gotl!80KC>3lS7QU6b$$f2_Z76q z$^dk)R>c2*pf&OOjNmiu{lM{xvXAcS8;}_CK044i323}zA}a&OR5k_^*zX6T8a$}A_@#Fu<}Yo0di&#mNqWeYV*tC60Wyw{=xehc1Gy38 zxBi(e5o#>|V?gKoFtCE|c+hhKo$mv32k3lFkR1XHth+$!`%%spU^|7_2Xd(hs%`^F zoj?L3E6Ck!;Bf>71rY@XZ4e(aRtK6Bx}=0YzXhMufsWPTofDdgF(cuAcPZ9EX#$Aa${LF%KS>=#-1|BpD||BpKtBJCFejnTsN z^D(f@<^$bxeX(ifItG@V>pfz@^3ybm2$hvgA? zyAjm(1+^O?cftxY>tP@B2e<7&?O)K`4XB+8nvdg8XkhG5PzIlIyyk?W00XPQdW-)b z#1z1D{jNg6th}JO1g~uY-S2>k+i!pPu)C4Ukc>jIrA3tDT; z2&%(CVFL4~3O|DaXiYrhM+?weK_*aGfaMb)Z37h+21$_nK;lf$@)40oSwMGb9s#*Y zj1gKFVa`Vq<2EMHybFfgc%W{Z2zDDY$PFa8Z5t@u!0VX>K4Cxp6lb8eoeOB57PNK% zHm@$a0BZismJ=XxkiWp`a}VUqS&;dlwFD|G4B+$nA@cAzVFk$}hZ!tRKzhJ(EDUTQ zw}JG5{0b`j2*hO;$Y0R71i9J2zo&Z($Zbe%7kFHP#6f10;AS?kyFhCyp?M99n^{S8 zvn|xk{z8llOe&0w%fuKNm{lYgSOpjuxR&o=|ZhwDe0i(0v!fo11+BVz%i9AeDJ z(hq^B4^X;*=m+m%H~`{<${E;xVwm~xa)=kaKDLH&BRH>XfZPDm4^l@s?J|S*XdO{u zWXy+`LzwMuV%!E^I|;HAY&YmG63~3E1jKF3f?&64lIXT6pl}1Ve;5P`92n2T`|LF! zbI|P)U|{Y5sfUz9NO9H+-IoTcR~Q%=L>DmEfz%O*vr>>6P@IV>GJx{53k7)^e2y|G zTtMwRXq@PQ?Z=;|^+Emw=>z!{st-?{!t4QYGlL7n&5Tx{{gj~c2HgH;03SRFk4um^ z$ZT->!Yn(nxmlkGH|vq;W@(6<8Lhzm5=KUAXkSH7g^|%3EGEEU0PU;js|bMBhqw5E z`UdFs2rw{%&iOb39`Bpk2A=BysR4!E`o#o-F02V2Jgo%dn-1G2jxyzZgR0%j(L z`t@-2AHeE&GBSYFLhf;Eb3nEO6rLb^Kyf9&!1M&H9yAUzv&{vh2U#sh9a#NZxcN6g z>ID)QN}gMWhrM_)Qr9{|EK;LHDgf-3S^RjD(p5D$_vb zf%~1HHHIr0&Im9-!hubZK>#*RgglUP99%L@aOjuk9Ffh4*)QCDT zD623s_=+(y2&ynL_z5I1@Yyid{|D{y69Uzl0t^8H3=C3gp!w99Euiz|7-421*=Gnc z3#4C+kwHL>_x}Nb1W;T2|9_|%fuQq92$%u71L6osukH?TzbnW@(Sd0p!SOZ1B2b-b&O&H3=B4lmotii)~_z!4CY%bUd||rW$Xd6 zo)J6`EulK`J;+rI45F|z{y^3cBvg^gBZR;4*aI4m zhuH=5H)uQ#7RHNrGKvZ$Fo>!!GRTNA!t+4DwKS(Xe98hS1)YvdG9Mk6moh=2r^CLrrnHQAC7>hya z9+b~O`yWAiF#B?h;PyXkObIlm-9NJ>Vd@iXbNP(m`G3$@7iiC+y5(dM(7FAvHGhb4 zF2+!Zy$uEo3<|1v)Oo|yA)5zFTS(?P!qg#~hee$^OdaT)Nj&y~&iOk6^#?N^b;{Vx z!(y)_k~+9~Skytr{}Ag)5*T+t#@)ejgXkZD?vDno@nZ&=+bhYy0U8fwkSuOs;Hzg6 zeFz=1#$gUPeL(y10t^hG`$vvoi(eI11_xMrU`l|s_Zgmn>_l4Y;)Co)G_!Am)xyVi zD?oj19BGH)0$44|I2~&rVw~x}OS7eYD zQ25^gH$(D71A`@pVvprD7LXatHYXIBq338q-2UGVBrd@4AAD9Y$nOFQ|H1pj1Q`C8 zf#mcU8SV)v{0Eyys1ik>S69!Y^>0A;9n-ysANs@83_|gA6>dxB%T#4~h?P zxbqb>Fz9h8_UK&$hYjPM0!79H5WlGL|J$hh5Jg`ETp#@0+3VnXgAwW6SvB5&({vXy z@PYgaif@n}P&|Xufq=q)caS^4cEisYx(;45i=1}UB>vUtGcpJYDEtSnNdc>er;+Oz zXXkF&sCBc zSU~22;!A~(A%O9Kg|fkW24)6+3uP5%h5&&F41A!o&{du>1gNkxC@?f@C{Eb%|365* zzz>9ZpmY4ecP}3P|3hWz|NjC>46<vRk2Njrm2aYug3=AMX$V|~j2G+@IL2_Vs`Y%voU;y*`yIA^XHoGwJ7CJDVS5O3* zy?zOU3fOG$zKlk2IRO#}xf&!6KFa{)wwY}(cR|inasbyu5-MyAOc-uw2c5kaAH?sXJ7}pS!L<< zOCY;I?HsTQs=?>(3m`RM`}Q+{?zu2PO>3t+z-g_y^AG4g z5zrnQSXvW2z`(}PprP8|-vd626?9)aXwAx+Mh1rduAUUoIl~Jw85m&qU5di)yX@{c z1F~--c$XIggJ1$=?z+DRYEB~qD9wqkSqMri-FramltKOi=@DpzwPQOH)-Pp%#1CjL zcMpR^|565p{^rg<0t^gnYZig}dl2*b6+t=~7(nJNNC59C2l*3zp9dsQomv3$C+Iwx z{+VqNU_UNl&`@8(paKeS(ETZ(aOwx8p_y$Vlb14RgT%ZctgUo}qpMc=b601LF^HSpdE}hVj7x)ddmYv!?1n{?k_k?_GwB zpLO(r>!XR_o)7pUS66V^GP5lL76%|bps+!TgL<&PKyk2#K|&pTZ%11INF7KVM1$0; zFJ;gG=Mi{bV*syL2Cv^=1wOx9Vxl(#11NtBCNRjWuw&+Pka;RguRj2p*T00J0!N;% zK(z-)o}Sr;QPzU``e6Tp;{{V5>=#J>)BvS35FZlv$6tWr9#jv2)9nTZ5%moWI-q!3 zzk~riW(SIYP<;S8UkBum^~)J-K>p}s0p*dl5coPqL^w9|&%_#z4gC|qb;SaZUKKW^ zaNNTn0TSznmRBll49I2G6D0eV^e<(&04ldYZh@6iXnL7IaR8QIdi@cSUU10@5(oKz z@(uASmWdd=*|{MoXu_{sO7%pV_vce<_283L9QOaj38}a6rv`4Kfp| z7u8*`at{<=h`55DQ*~qsG!H@I3Upr*F)N8DtrtI3*RxwL&Mq!)Q5n(5fpzI_1__||543mVZd!RGw6I0(7m_Bm<_A{ zPJr_+sNUPaAhLcrgG)~n1B1pw76uUq1{H>e2364dB^7=a291A~GPs2vLT52y{WoIypzfq{d;p+U8OW*hkYXk>W-1_o15dYZhG!5b7` z!U_zav16J3nT-vwvYX+70ciassC}#nGKb+1gCql!g9F0~4()Xu3=E760;&uQ5<;N8 zN}#w_S;WA&4pb|-dIBjbp9E#{r!s>G(hK!5pW~uo)ekLs~EhQ zm=zQS9l-aTpt|v~0qDGD36T9D|1dEKs3Mh{7LfYvpae88qK5Yp1`Al2Gc0IO6>(sY z2blx%2ZI}fUDk1cfx$uubcPei{p*)AD1h_qas~wgZZ`tCXYzVT_zFH?0Nu%q z>UKooI;DBQPP6qIKdFw5}_JhL_6wd3xVadP%iE|3WbOkg_8AuOPP#D25Bz*Vp zfQIh|(0P3Q6MFA}?wRWoU;yP8h4q^lWY%wFkPu>EkX*lnA)tR!LxK861{1ZQ8v^|^ z8^L=7L17Cr6Lgj_X#BZF;-HPBd3_e*HKw|12pFY>c@inFY0?4pylh{ z2T*t2fVxX&{SpQZP#FlSyFhlTEMZ^-=Lb-GcqZ6AI!NvTnJED}x3GU5gAUj|=TO~) zc$vBca_=0-tzi52 zFi3#<6d?BrfXYS&4OLKi*S`#^ZV@=XK<80{@0JAF3F>=+>||&VP=(mF=M2cM{+S&+ zV08{CJV0RqD&s(UklYFFOYNBf(gUtb_cQ3M-@~ART%UsK*9m<`j%qF4ClE|R9rkR0(p~yi|l7T^HodyE~qkw`U!vqcGJ|zYg zgOv=-ptF;iJSHeJ8b~Nk;$mP>6JTIeabjQ;Dfs_qf!F{4LM)JbEGKb;0udGvMU|8EC~4jcR|4aeT89s!L1)r~=>D0FHYzL(;5*g8e9)b%3=E>6eAlxRB*MU;uJQjr zD91J7tMFsT0g|DRovfn&{1xcku6L)^EL zfklObfoGux14GX$sQbJb7}u=E={^IH`#^33)x#PG8JG+0FUZQEplp3Z6+} zU{IHY`tc{kk66^lfYrZ*_-mm714GX%2wT+~+|~_V^O}LBe+{Vp$iSf4`2W8EY)@`) z!v>If;Ju5GGn~M4VxY7Eat|o%k=tpY@CUiS=N$uhO_1vO|NmJZGH|W|?K7O&sDeWe zc+{xpC&W#QLGF72VXJa7Fs^yYzyb=t{#6VbD%}77gTfHhMpR*i)TxYFkanp61Gr3- z>FONP77Jao=JA z1_qeB)ioFx*SvtF7f?F{RF|pmWq{U8+Zd433#k5qrDxEXqR0aVLD0R<49gT01(q=I zfa<^r{r~@~Ff%BKUp8FdT+7RvoQA#up84j#AT zWcX>I3=X>`khBN#J1E>heh1yZ3eqd_fPn)v=Z;YK^aMy9tWN?`14=)be%h)7_0tVd z9$+}o06NzelKw$$m*os50t>)%87dPFgG>P(Iw7Df;K0BJs>>!Zf$JMa2BrdS(F2fq zlu67C44}Chkp#$Dbf9(&xGgoa@eQbLgH(or?sx>{1v!x0L>Byi#lS3}J&B)z0TgBo z`3h<}EewnT(6|?9U|xuHRQIYX#Qa?ApT00wE5=l}nUfwCLOVeFtb zM}YvSEjkfgJ_rac_`$#+;_&|~NE&3GiX?+BNY4ULd9jiqfswsISxtaJk%<$s&k&qG zW;Ph~uVP5(U&0Up%5R|aY(Zhb7y!v@pz}jP=0Vd;gu3O^6QDc=Qo{tgZ(~c> zOajVGOki_4;O0Wj1gT|!ng=!uG&X=3+lhd*0XLn1hUo@)egXC0moNl~JOGDf1n#iB z$pLbM00RSP4TnsBQ$vIL28I9?r?x&Ru5uknvG_1gP1~aO|!wTGnhK5xDD6Bwf z3KZ|4FaX_)+`ot+0-PV21R#CvM_}`j!z=(~Hb^~#JH%WpVHN-hvyD@rVFpTvGV7Nz z#DL<4p#hv0RX}|mnFoxZdq)#g4*mb7;mE)Y8dp%^V_*WMv-OJ@eAcgH@HxJOA;zV_ zg2AQ1fWeJHSY2B5qN@sEP43L69X{4ABFH^Fz8fz*Qh z49Z&|x2v#1#&$vVAE@sH5(mk{%ur!t0N+!kvh*fsd|N?)f$0V0Zk$FL_4Sak>hmfu$ehmsJcNAisdj7F1y10JRT5Zl34@Ia6W%YVeu;pu3X5 zXXW(qfC?TBRn^}A|5+C@aINEIVCY{D3b#g;iBA|9RDVG33tPVfu8$Aw-kl5{eVhy| zlfgNIfdSO+>f?gA2W00uZg6`9Jf{R|C$3-1-~nn2g7kvgf*=~)4g|#~q#dXS3JZ|C zpx9u>}J|9|ttdI2jn% zaWb&I)K(nFfg!!@&*foHUoEp^7=L4bD{C2M`e(U`cU1)4|dlM zh7c7N25ojm1{Ma16Uv}_c?1~1=j4FWHnubgUPlDFpHGF0L6?=0ft7*7LwWs5hLApP zXu8Z|VCdszU{T>=&|bKPfdQ0WLH2|0`dG)$zyj)@^eLnFI3KX3IWw03d==#gMT(fdmF{`3On} zV7tI0SK##-;8+EfPoT0Dq#qQnApHUi43PW}Ue$%@r-H`PL2->mJ=iQzngpd&P(QVg z2NcH)450F79WMh5f$|4DZ;4?)?(zp+J;Z)aa6i-lYx#qxUxTGQ6YXEc5Q3J6Ily^% zW}^xg^_*b!kg`P&J&l0U2S~nuIYSBqSA;TSI=FozwSG0E9RMl|LG>uCj%Ng|6zcXI{wuVP4HkaSRHWcE;I)PmIC&~$bkoELDUGXVyM z^I-Wk3<>>f!EQ}qY>rT7%!Q}b|KPN`m>~eFFart#X3Z^MJ=xbQg9pFo4o6C~v6dGBASEDm2_dbrs`z4lNM{1}l);L4E*dL28lw37V&e+(*~}?OTIWD|i7Km<7#)=yfV24}wPw7#LKw z{{LrnWZ+oG1+U-G)q~9f*9F`RdJ9)$sS6-=a0)W|23*!a)P%tN z2vP@<2es2c^>aU{EwYlq2XyuXv!sI}qh)~d`V|ZwpmBort3YWIJnn_=Hc?O*^?^@e zVPH_r1-ExN!0jDe`DrJEPoD$>sJ*2JZf~L2)u1q6#gGDu4`wZJ9C3o(3UdEa1`n9~ z86o{nP@78#$$#+t0@eeX7g@uQ0*>F+puF@v0wfL!8&DWAc0=+6D2;&40Hx<03?U4> z1lj?zR1!e_4i{*@15#$RHWYxu2jn)SeuoPr)JHY)0XurdOjD83BJ{54dgW?F$?{EQyDab9LFa?DzQoq9i z?7n3TE+9XGFvq5%~-|uh$`2|!a;^=pP?yUjk0et-q2Ti{SF6^e?ayA z`n3!W1nPbCaspE3;jZ`5)kDfWNWG7*-{I1~l)(X%9zbaU6#lUE400=|Tm#XdG7Ut7 z$}$iQEtk>z5fC?`w(pVK2I%S`ZiKWA@bx=<2=qIAkopSXHZaH^V0S|L!T9{SF@$MursBc6@{o zmVO5>$c+9q3}E#{^*dHT)iN?jf%<}=z6T^uJOtLSWbhGmfb>Hc6&a*JX#Y|E!G+yz6+t{U(rmxKQ0+Af$Q(!wg8jX+79YT#OGHq#*s(148PO z3v=Gb=JkfyxR71_uFEE(U{zT1f4z9MHT8W7|3& z(A-30jQUyz56~T>p!BQ`YS)6+6D$Jl^>6F}&4Gi&!RdT4g9oTR3@XbRmV=QkeNpC^Kt->tRSgX&q=h1=0QmnFXpdz-B=DN#Jo3ct5EN+D1c+ z0f6%_D88}udmv>2tc|7(9(&>d_ctN!8uYd**ep;VU4@rH7d)l}?hAv)SQr@BNr1uw zVn6tNJJ4Be3Xu5=sQu{u9*F&5QyCakxiH#@=<2~LL47k7ZU%#e-H@>ZP}r)jV_;mz z$H3B$XD&?zbKFO?e=WG31~LLZm$pt4XB(9htR7Teb1~?lrwMR+Sj*r8?kDjUC^H_1 z_LJ6u+LeengtbW+4}ja>DWEjhzk3{X%j;GNmsyWA9p|L3|M|WLqb2O zU$%lFh4FELGUE+MS_QRNK=l!Nn`S*Iy@N2Qd{1Cd0{fG+^a*Kq6Q4dgL3V(~XTa(6 zEm9xi1~h$w+TAM{!1XD!2Dsgg+&2Q(v7kK02%5(Lwb{UZf(C>Bm7w+*TD#g45{96} z)87qA_n@*1#1~9JN%!dWJ|x|POGwZd1Ht|TB;AAh6MPJMi}@HBAY(e9u?+@B@c1pL z->{4Uci#xw_QW=x-M^B-2b6EXcbBbUZ~@IjGkQiSGInNw?=1t(N3UNCYFFdv8?9t; z=>xa07#LJ<5FBge1cfE2><5pvg4S@Qg3ilK2j71T+KT~N+Y4HY1e!Aitw92# zei_4p{$&hnKw$(5A6VF}U&1g$bK^$bh; zCpI*wNH8#{Z(x|Qeg}ia`eh6@>(?;^fX*scGmKf#KeI6dG?&-Elp&;l8MutK0fjwi zzK}`TLvf-OWbSDZWE>-*AG99>qzB zOc+maXoJ@%voa_!?f{RYfkz`i@!G$HVFsfTyo1KyivINsYh({F zaI0@%n9F*Afm!z=DO>dcG>6dCy8^AfD;~W&<>MIyx(?+?Fgj$Yu3yDq!&&YmP4EI3|hK)i#1&=z>+RN>ns$&^Y}_&vys!q0wUAJ0#Le# zq>V{GplRcQ4rqTdXs^Z|1_=?+7=MF?>V#&<+>SvW0}}(EgtkZmgA8b`MGt5#CIbV5 zMg;?-Fav`aGx%JSh6mX95H|FH_8h7t|NpQiiGe}Hk%1Z11_z&`!~!}Gw*kEG9-N** z`2xJRL_w8-MM4{7m-=1?@Y-BZHv{Ts7aVTZ1nr;1;${_)IWRZNB!Kn}fZCHJyO#sB z|F3^$!wqcy1g)0_xmhFuvaY;mC!`LY4DLlUFj!8FVWFh9Z8RR}aN z$bkIQ(+7$z1_s#!uzgu%xEo|IPIpVFB8^XRsxUDq^sEP++swc<@iD}1kwgY&Q247b zGbn&)6hAO9FhJsE!Wv{h2sALrfz}7(9nTY5SmVGUlN)(Khj1rK9{`*_gYr%HzVgc%$pR7r6kXzx!?6U2QJTp1WtJQx_) zfZV%4LKW1n6#%b~`2Qai#vs3d!Wcxu-Jc);U4Py019krmSQ-JX?-poaPzCRI>w~s; z&w)Y-e6I|&&4M+Yg&7B=Nd8DLfcWDeXr0IZ{~`w&m_hg5tFSRBfav~J z3u4C3OV^BeACxG`*gVvXUd;$#%$Ue;ju(0R@?|%ZXE8oB% z0UgUmSzj*Fz`zA+n;_eRWCy6-rXj$<;0|8fI~fvoec+RKQNs?@W<^SKAU)tT0AI@h zUDFEbqc%LiqMi*@-t|H6Tbtkl2|G|9fuTV{RYj12OQ4WJMMdcUe}N(f(0MdEeVHJi zGcbV0UO}w>nN0#%%!RlEb)5=ytbj;&_(JBVK<*GI1m_zaks`<$D&TOzy9cdj4>UcV zfbEY1wIe`r!Em5Mm0`gI(E3A@^?Mi$)^BCdS-*ur0~{xt8C0;x$t|7!Jq)0;^dc8I zFfjB_g~rJ`Pzd0S6ObNZa2UhJdGW^yNIe@UAH(AWnx4UNlAr+E+s7p^nL$%U=5f?uo^_Xsg#ZQ8Qs=#E( zT2p~3kTpzl3jgnd+$Ay@vW6a1FM-AnktN623Am+4sz!rCk6&Nh5vs+ZtvgE zV1mA;y?+aXM*mg@9cbGhx`(Xm3N)S_Kta^^FV`I*km~puUDqBZH%e0)v50BSSQ3O*oX#0_B5tATof; zxJ4=q41InK3~Gi9jEHqv7-a~^jSxRkDU4xmhPe0tO_2LQ7~~I-8$}fUUjgy4q*aAQ zpnKG2HcEi|&`Tg^I;t$awFK1XK-w=W3{FRoJrtlb3M@eBU1jO5H86GR%NQ&``~N{_ zo!}^Ewt&=v&4KipM9}uA9e}iF+V4Qqy#c7~0@Wqp^6f!`Drk&=;lKja@(s36cqzjb zP@Y)4jKLX){a2vn++naA@Rf54kb7i7=>e(-5?|1LMyjwp0p2g!@BlPc016Kz^^i2E z1Z{u7$~g@N7I2;rVo(s6gp?$5md&h2s3b@FFhSB51E)?S zg8`IpB?2n<7#UQ+d7Y6VUZjx$e9qLO6b6RAbqow@#b|j0m*1!q)-d-&+z!d>Q1>%K z-2eY3$iGlOfW)jo`2{4V0`|xMi%@pFK;wUKD-WEHp!?B4a-cNA*1({$2y`yX%ti@V zn?W74re_a>frtYn9ZX)y;4Hwvpv-6@pbT2$4_b@Qz#O102-*uU<^O+#ScJA{0(36` zbZnH#M?g)-iGdNakC1^uzyZ3JpBJ*0U&t4+mY)q;rXlA8^<@kmpfU=SPF0rP76G{# zoDT@sM;9RZvIW-v+X2dxpu7m*hY!nx8yF-&d2szw1|MX*k?aMnY1R;6U~~uDji>F5 zmWHA2KMPgZUO!kLWt}C~G!IhG2HN8c+NTJLqX_}f_MZj=3loEdstPC%eqvx%5oX{N z_zY@8GjNGKWYADyWY7hz0S1YK=Hfwm@#IC2J;Iqb9>8z}*$;A~s3Jq<`UMOoD$oC4 z(0Rzf1v*nu?JV;;v zat0UB*v2~4aScut0m!%p=nh;4h6eDx&d7Q|VJODHAg99k|1&sU2qiR3aA#m(oRpvl zbGLv3gD3+}f`bj?XX8F)1_l#FV-qGva6gJmCHMb-khqDWu_;JQK!Jfpg`0s<=i&dK zpfXa$kAZRhY6cS!&DcIcah)#c45MZBUwDr^&zqnbT%q0G(3+ z(g$uop_Zqh^ae?v;M-Uj7*rv1*c|J0P{S6ie-8slJ!bm!V_*dN0hB)b`x_cSb4#l4 zV;(TPKcG07nSr4n6n~ZAFyaQqA#$99)+Zw6e^9#uWCu9^GbBt>au84z03C55BmnM< zqW2M?eFG008UEesbLwE{AArt!f$Rxd3f|`}0UDD4mGPjxF0ei541VCbBR0_3L;rdP zaQ}o6vbTo7n8581puIzQ#solaf$e|W0q$>Z1dX3{s4^^AfoP{~VSw*H2iFgv{w>z9 zxdS@u!a#t5Q50M*5MQo=`f-qS4r@2S`l8tD2atNqbPnpb;Hn=)7`Q~fFsOm^NoT_b zSpA?PLQGrDLKRl7LHD%~Xsb1-g3>O?E^xhtr+yIl0_nGiZDFWczktC4R*vB>fA7SA z>VE+ShTY(B2IXH^`Kt%A6+G@K4q_qaM`&4UKt}ls)&nw6jDbM`Uj8yLFo4QmkT}fU z0tyV`HjI)pO%!L&1eLL%G8lArD^zS2NDN%=@`K7<@LV0Z|FwQSg9TFvgQQC3|No$| zK5!WcYHu?f5MpKr=iO6%dZ6_*;BuH7S`KqU%VEg*ZJp3^SQF$T@Hi0cp1?v-{shHg zpAKXVJSZMPYvVv|?sd8hETH{3Ob#nlQTlzTWicqtQ8kVBcQ!PD%3f8?mG(c)eD2EL|dc+tQ#QRq= zSb)-Ue=oEgUK{hk;0;4PV{d`tMA&}VQfL{xlEH#0ltB_y=Yir7RNo=uu|kOPF*qKt zf!qo*7i5Q^0s|K)Zjk+nsBi8Z0l6Eb4y=Z7TNhfsRz^VkpdRZtGH5{Cx;E?gFj%bL z!eFv~GlRkUO$<8gH!!F?-_9WMd>ezz^Q{a5A`J{Y&$lp$;BX7*+&v4I1`Y<722i_z zDYt(=gAKlMdbBn$sDDjL`T?njlyS`YJN;6*w>+uTWgSo?(s3 zjQ{^tDj66-Z8QOf|Jyb?(wt1h>6+ zfW-Q{dLJC$%CG>`mOj3PVTq^%!zPe8sEp~;g{-3kwVA=|>U0z@U=JzzAyZ zgT{dSdm0*yxEShHdtx4}U&Y|U=#!y15p+)MI)*ij4i>5me&Dj77i1rDIt1;XKuU+8 zHU7xy&dj^^1rna>K)HVi{NwN>7jpSLjyP+TE;vu_`y&Q+OIN^iGcwWugnYa7+e}AfV{!rX4Jv}N?!s87`WUFTpK`ltg03N|F6QxpeOQ>0d&8avd94j z4zS%S;PW3DRl5HFU#A61@BjC&(*frTWs!#rN+1LKbQu`>v>8}HXJ)A8gZoLKIb-p4 z`rtL7@UcO7KE<9#arIpxd3!kn_?$2?1_m}zUh4z*Nf;O=gJ(z>7(im{7cfkCzLjCd z^DPW>o^NMZ@O&G?lH*$$W*pzbFz5Joh6TsBF)UGGWH1$Y2p;PY6?w?e-M@li0;oUJ zr^Ue1-`lVOv@cZE2b|UzK>kEJ?*u-l35tJExdZY$D4m1u+W?P$K--O~r=e?Sv5!S! zFZ(ON`4}=T!^ofu9plJADc@&8<}fhV(>4jf(=u}+hL0Xg3x`2n*&0DvP*UW=q?&mH>_XAkOI;J z+9QOe?8crhko17e6=Pr!?BB_d0m>^3Yz5%F!g#Czc}#-?RCa>OG?fYlM%DcP{~3=P zD6Z27r|BE(EEqudNQ1&#S6mS?&jmUI0aQ*irOi+Tr4#j)3?+gLkh27YIvJR?6926c zP+(xwN@O&3Y1qNw(y#$^-nBvhI))7(F%bm@HuWV8B{q!pA6y#Y@}N8FH}ubJEMaQV z0I$sg-Kz!izW@V+f|~+sn@|FSoDHM>2ew28W~KyapIBHx*`<+#!G_Vnz@<@x0klU7 z)P{0XS;}nS!@wxmz`(@7l;PxN!oVcBfPtBD0Z8BfpKc~gnLy@%!U*IaH-)XuZVFqQ z`e!y4xG8LA1E*tQ1JF5879hJpZU^_r4U{bY)k=-x2|8x&;o6T>e#T>|3^8~Z3BaZ z$(3n_b3TTZOgJXdrSnoOpkM-*rd~oRj&FO;dWk}Fa zRbhjid0@ldzyKQe0qq-PsPs@|wB*ocP;vn6h1Ot{a8O*of+0c-bgs)vh8UFm0YCHa zE~qTiP+k6>|K43uFe!eL{{5EbBKhRDjAyF-Hc){`CwkpnWbNc~CnB zL=zqpq+VEp><76~^dZB>^$QqM)PnwB&~pTj0rN09oKQth4{B~G?cq0|FoC8C9dMeM z+|UDBm%4rjL&5q@3?-oPL{J?C@)MQE2>n29#Xe027SQ=V6O9-c`j;}qz}zmNz~Baw z@1NPI0Lug5Go@EC6oA~^znYCxc^<5P z4OIVHh7txJuv!tuCNK@w&yWjd3#dqd^DXE+9Tfd4d<+bXhd8uAZV*vmU}tiu0JZr* zdz+aU^1iXdG);K`*8U@!os&-H5 zFq@};6+;Gc9ze7g?t#WTp=BaN4mkaT)UIa8fyajq$oC8kvJE)LWyl#H*9C=rpB}i~ z*D&!C1B2??mm&IMV+U;y%K|5^qU#u*&i>vu3@Fe;n?t+$n3zmg$` znFs7QW=36bnv(>X2dXn*>8&4h7W{Gs6HuB1`JjJ2Lr(uXh75*$4@J-#ZBX68$Oo=B z3f8Y=C;|16!0k{_x|96>AAJ6eC8)0Wzki)J_#7P2ISLV?4Uo05{VNy>`qwkWfYOxc z2?l}w9SjwsFB$kibpKj#*{CbHkO6ehTLq4=4*}&Nu-kS()QdARaP}`^C;;Qd3?&Q> z0_r-642%qp0*atD$_&gB%5XW*n%VsfxXuf2fYklz0?>N=LjTOR4WPRVK(7YV@ zWD(H%zy3uG8vTpm>ykic^zK%llV$_;Q^Wc#3@V^FXIQX6b^S)rdcY3Qm_Ks+1acPh z1_lvaZ4GkTC;iJAV)~acM1bs8c@7>2W(2iaKSaES#&&OijUWkBmmVC61o4-+`8AdOjo`H;CkNE?evZ5hy7D1Zi#vwY_i;bO#44+?m1QKDnU>Tvo!` z3bZLNgFy8jxQ<%FkT7u*xUG-^bGLv3gBM7?e`aF>C~bk#6}YZn2d(SZGn6nM0+*L+ z(D4~?UC;O!ECy>UB=j#~Na%;2GX&PZ1FC-~LkU9!Sgi;%6PO0;XMoJP3aD^_+X|rl zIw<HYguJ+6o@33?5+pObnUeGJy%Ccl|1c98lhXmE9^l3=Hc*g)gi!E@!>3=E*LGm_fH z&@==+&y52#k56cXMwv>R<2PoY$6nH2y8i3M;gCeNy0PPn->UVtx2C&(nv;m46 z9|lGyh7+ow`7;5A|EEFYO(6S0{t{fkzy*$5q;dc$Tzo+38Ke%Z22@WY>SFks!v4(+ z3jJH)_jiEr{R8Py;S*qBJjx&qx{pI-0RwpM5Pa_C0trfS`UoNDfRx_6O`%pA!$8|HgXP!}1TL#w?im-Dz1Ty~r1lcEWfI&><2sn>VSih73ybo{vG6v9@9-#Ze zZ2BSR;5)2e!~otW4yp_L7c&_2L)9>(c_=Oft@B*PU;$dMvep@V=A7>O)eJiQYan+& z^!7s9!lDZp)Yq?NFc4w@orkLcIO2)?(s5j|al)@28R_gG@4YXy+KpmYrilOFI* zccA_142)}Xv8HPUP(0&F*Ax2Jf$x}7SbKqiMM!}Gyk-=V2bx%z6b!&?*Ho6?UjSM& zEdp8#=g@&Nj)GJkg4R?isIV~b_RnnV0J#qwKA<=Soj1S$-G2|w41JHfLkZ^|NJIK9OkbRR7?}GN|f&2@; z|DnIH>juLz2}N)_CP6@zp$}ZQfX_ha@9(<9z;d7g)=p>qaYC_Qje$X6F{DfYogJ=n zjDb-AdY*#HQU*qWMGUM97XSYblM_jRo`b%KL4d(kLD`^#fmx7&fsK(>LJ@Qx7D$gs z>i>TWmi+%Ou!w;jD#o&4$^SnKmi+&_V9Eb~B8&e22FZiU0gx9U`9A`j|3T#=c;Ehh z2JrdjpmYSfp9LI7p!D3_um;pmRmo=%5IqkHcLPxUVKE_vK^CMIWFAPZ0C+vL0k~{b zVPkLrm5-pZ5qyu@a>!kkpgO022ZIVI9fI_L?|<4c80|pmU+u2vg7@GuFo4Ve@xf*=FfjD8Fv#@sF(|0AGAJ1Pz$_`D*gvyfV*O%R zxP#AI2H&GIA(Me&NfHB-q4xiJ!(4{_hU*#bFUV$KF#O5zenBn+!-9MU24hWz?+Yp! z7(jQVPRU|mn2^c9W9a>ZVM#W4jirX6)_>+TISefQYZ-KG7#aB2>lf8-f&c&IMPWZ;=l$-rx(`2WAL*8lelvKV;#S2I}j zBr)(XCMKvbHf5+W@K!T0@E0?wFfs@+9y*{V#K<7BrhiBs1PG4U4qK&wl^&)kb7@I;n4#*OIu<>CIk5VTtmzMzZX<8*nq+jBo7Zi zCI%T0U&V`oaV-~QUpCqq_`B8Tgu>4MgWpTS(!jt4+E?7)3{6+bAX69^dh#IVF&+V* zHvnGk4@(=MHUcPZsI)u)odE!9>nUL9&u5STrAY?XgAAbb2uhcXKLivZ=`v&jC|!c| zsPFxMq9>Vw0ao6wU&3G^lEAjepm2lf2em~(YC(LES}>i%VAGS$V4=RA!2opUF9T1;0mj?{#kB_+7Z8UeQ ztUbxV0#}~|Nf)4aUy}tX2SDv4Pz6a=^qyy60iDMp3cGuyrJ(`j7L}Id1IS?t@^gQ4?-LLW3nNf^0`dD1 zdj1g7(^CNnS7S*ACSe6gU5C)0f>|!3*$KKGxhIo>qnCw2L?xAhgP{{#J_@O@f!fdQ zGCe8K^Yqyv{Uxybx_Y00+};a48*Hr;QanTNbM8%njJGqeWHj{TFt9K#$xvqC&1mQc zjmh>3C{FNX;8^1aKIdJ9LBOE_RL(JSMW`T?3XY!_aGOD!`iC&(oaV>s7;^%Dvv?#>*Zu%0jGIQ0c8fJz-CZ>WOM-USKqBZ#~)Ju z^>wSDyA|xt1`SnF*cvXVorwIFd;nAig8FD6x3MgM-X(=z9#%loEW-|Py2DX^KZNzw zG0X2t@cwTZ23E%gus7Y%5OjL`9ILGzJVOp5cgYv+|SLhzyQ=Y0OwQC*#w|| zC@9~7@+{a7%NTUP_iBLJON{mZLFr87A+%pGv+V|~y$kXuNWB09gRY7b0}IOo1~Je+ z0+s`ibkW}gDZ_i5Kq?s+dLp2H{{gPMz~}JvL^7~2usb#|Ye*>eWJ1*SYC-ffoC1fD z5ChwR22eQ%DpwfTBOBJQW>8tb400E(O3OpgdKiiRbqp%~J>4q(%NTTE=Xv%*$0!)r zNhpHM=*eebVP-p^%ph@~0aWLK(u4Y526+1rQug`wfXZZO7(PG_Ln@?K&^c=gi1I2K zv%K30=~uAB$~G+J7bui^IU)Npm^Hy+1ZwMm%q;+g5hx8p;`8AgQ2c<@gUT-u4J&*5 zS2HN|WHEr}co?`7;Ax4`2bPw6T5yE}BrO?$(h`piWBq@af53IZGRXZ>@U#TF^Bvk( z0;vV3rGv1v)GolV0Md5?xeer2*x4feGuz(4(izCyo(S+5x=KGY0}ohT0s|YvVsJWQ z0qO0DWDo(Z*kYpD4R72o0Ot|#$$7~Bf`lhDk1uBcxAj48 z>|X-$@A~BoDquJ6VUUL4AD#;9tQ@t6qRF*QBFl2+qegA(}X#wfQ^b^Qmpz=$FiNO)#KQD0pSKs^p z0PIdvh6Np}pnCz=?`N=CzmLIU{T>FB_1hT?)^B6bS-+J*12iYMelvrDNCN{4sBZ6{ z1R1+h3t|v3(qm5(Jiwr8q|d+z8Ea^K1G+0292QGo?CIYFa#w?De`7;W|IBuUH42cm zKOlF31&unLbjYomTFhF`hdt5S08$Uy%Lh^q(g%_kW?%>cv9Y)xbbg76jW`2; z|Kx5Jv+w`^_f>+=7hvkwV6agUU=Yw`1mE%FWFuPtzkgmsLI1Rdg8nHD1!i0S|5v~F zl0)sf=a-Wv^)2bt8{3pIN~fnx75=(yE0OtYDh&CX|FzzmC* zG9b5t%c^xFvijQw=!t- zZ)4Eu-_BsrzmLHJlup(6GB`lesRyk8djWn%#S#XC^-CE{Ky%m7;+^WOb4J4AYp zprk3#m>UOZytjV`=ziG_pMDlpd9d6f28;f#E{UE<1`d#486@4B7&tr{KzsRmL17EJ z7i|fHL5~{)i^|fM;CrXmuVE1AU&{a*H&*Cf!obnr-zCGqV%WgIR(6Pi&!Pdecd;LI zzdI{~AOnkB6X*<5k;M!O>vuBfs4z0H2p)ut%?lo75Ciou1rLJzk-~z|vQB`3p$Hsi z9SsE_T9xCajQ|5f?s`yPrxPls`O-yzfgxl4N(P<&E~uE-OVF9k$?I1!==66(#j;<< z2rw|jfyU!O^Q0n)44f*A416NXz;`di}mXnboysN#MC8T)(9{#7_Z*}9+L(8UET6!ivRPLi4j{pOM8Ypa37#ZXtXD=}*h$J#dg2Gnd00XDaK?Vf@1;~EN{?0D&m^Elm6R2$p z+B*RDOG`r!DE>k71S&1iKIYPwGeBdcVEN_-@NI`G$qXC<3=CZB7lXq|NCa{>mZZo* z$T&MvxX%HFImFDyH=uEGP z0J0y{?gIHsfPrBNh6_h92lSE}*-C*7!3pz}!c`t}{q>J-}ht9FScE%z1+_ z=N06hXV~34kh?iSdAbW^PR}BUe{N5#|^mnd1U-6P9=g1)0;olEH+5 zC9pvdv`?HX?hq*N2_`ZK5pZV!lKCk(%m>|dsM3!d&px1(0i9>?MZ_}$OJM^8UmeJ9 zNzsP{?JhvFy9I~ca$vuK((^I~6JZ8|W==pda|sSJ;df_%!cyHbDFhrZknwWJSo?kk z70}(^pt=O)Q%GIn2s{4;w72;Sygq^6=?-esfX1AAKqC*JGhq&NK-wV-Ca8k)%Q`3U zS;q`2jQsyW`C}dEjyF(Sa|we+KX?`wbpNI)lgL5X9+tK*j1N%StP1Otz~>4xfZ`N- zFB}8tu4B+XtX_A}*kL31ZgWt+28~(wf_4Qzj8I`rumHP7W$7#Md6A$p2;?tNS_g#@ z$UKl9hC~Y$P*|ueeRT%pX0V!>ZD0D(>OQbvz&%O^2Gte@#&s+pyW75i)PwYcXpnxe zdqHP%wl);N{R~>i3G%l(NDsJd)98n; zYxKH7>S&dvuON35g68NpFu>akp!fv!!yxhL0AByDzW4u(_4^r6&Lu;?lYIRGhKThG z7<_sbF>t`c%CSHNbWbe!Y_ot;TKI$^ zV=ao}j11zSJI#a?7}!BH=sq1#Jg94e=gIg%ce;VaXSRJ&>4x6>2f80>54e4TXsbc{ zNh(WUv%vPK!u9n+^{r(HS-*%OrN@zh0i;HK9YX+Ud~)(ih5!{t2312X276IQ2CIJ1 z`L3Y5;XrowK=rNx>y7B~h3Ez42L|4wOyZ0TY#=xHuV)AWxm)!e1LJzoJxMzud}aj& zRghmm=>p^zP?&+#f!xu*f*}I#mQ@S^YaJOFdO>&9GV=dtUx}7Z83I6YWw?WZU(AAm6BLJ_vz9^k!K+&) zw1D>SfZPmT53~m|hB0|PLm~uiG(n$nZ6EU7X#mECSt>|A5wNPGH@n1F!0155=~^_1(j!@v=7Py zX!#0J_U&K@5McQ4x1N!K0i=HNGKK&{9R_>dMg}JV1qMjD)77QGfRvUQvoaKWmoYGa z(kwKMf##z?=P+ugTY>$kwF4vPXA7Z z1Wf*q z6#V}g_`u}^lj@HDf7b6{NC2Is1S%Uu6&P3yXENA>>=svKkOQUh{?!nBdy^pkVPJxk zx1jV0vkz8&_NFngFgRMMfZPl96KK6M$lu&xv(U?1M_7C0^$Aeg0h_rBT*ojnaFrht zJ;=ZTG7Dx;|1!wBb(N*B@4(fsXNUml1C8T=>QI znL!2Z49pBj+rb<*{+WAo2B!7+fSA7&;gjCa8kPhNeTuho(Zth(P;6)bG8~QTzTzM(x@g0ky4fSk$Jx z{-ah5+UMJL19=>!#hHN#WTph@-eZRb@Hz*E1PfIL1`E(UsS0ep7|d=kJ+mEs-qHlT z#tAfT3Tm<{`~Z((g8F_SvwM#-7=YH|FtAr>3qD|AWqe?v3ffZuGRxox3j>3Mh4#91 zNZSuSjs>|x&!mlwfeDoELHa>qz_b7|R@KK2Qr}>}!0vEB-7?C8fy4d~NDXNH1W274 z8v{!pXx|=aoRB&Eke~wtCj)Z==)SQxAax)$Owh3@kUEfCK=Q1OAawSmZ)LYXiaOweDdsVe$lznYDrZ1KKAKniGSaT?t!fier2XdY*_Wc>Rz1 z-v0{yGuu_xZ(>M*j^XC4-@}lxelr7Tk7vyK4GaHT{cKx z^-qM1Kd2eL=>V}o=BgRKnWEzet~=R5X}Q0%ON4>Rp@ESzKoL3y10I*}Z-$HmsU*Ld z0SmYOWeiW&Z)6ZyznDP;rr83U{YyeU|G}5zyLcJd*X2hTd+Fz$|lhV49uXs z4vt@T1}2e*&^62q7OLPirwpJyQw%H&p!I?iA#tT<_*S521|&>`85qFp3qkP+HY541 z42TUfUnTji2`oI;FJ=&ch978;W(FvHU~(!;--7Rh1nB|!U5J5UJD5GQu?M!k5X|4h zkf9O?Ubl=P&cxK92$=(H>``fX>jSb2qz5!+&k*RL*ssCBqpAg7x0S)@0iG9{2Rc_5 z>IMnWyaLQFm8EYZK<*H6V3-Or1F8mTtoD^?{h{fYr*0mcg}3= z0oeyq4^jt;QzoSj#oinS9y4SYgF|IEf0ptW@nwcvY$GS)9*n9@J9iAQ}2G9N5r{kR2*Z-wE`kK-@K@nL(?sfWbr{fgzHCp+mKg9h6@F z{}*@&=^ytrGl(#-pJ)(BU|?rfKcU=L!N9^Gd7^2M85m&eg8OGe>L8F?z<%1pkO8{$1(bjLXJX9HXMn^(?gEwfpmYuj15i2# z`E~tj29Z7<1`g2t=lV4a5`DZ3JSt1yf$n&e>Ei<(_W|DDq0q+=ENgref4#WCI;I)G`ZQ!^B-%I4s z#?7F%emSJCv3@m!3v#%E{01r;nUukE>MPX*7~pjm$n7Bit1Nvl07`ctwV?O{(T2SY zEP@Ldtorve)+AAs&5XiyabM+ayzH3N&01Ou}$ z1El;@m-zojoB=Xdh{ZewkXfKJhCp^>kq4(iWVt?dNIeb8Lr_2Hfa*k0n(fzQ0L|-W zFmZy@>}~Arm-nDHFeJ@_{J4Q3qJJYpO#dc^g#OJ8DbTUm2Ov8^7}C$u$^fkm0j*yK zuT5_2@&JvogVqv(-Q3c!1{6-9v3St_9Pk|k%Na~mmVSVoHPXTW@~1-oI`AGr3-DTd z(46d21`W`BTK{tJeO?0V*F)QfQ1u}D!D^v-2(c#r11R1=dm0!q_B4Rbj^6{hn@D{x z1L&T#-Rg5R!Rx=ta6hEI3Uv<^-46~A$h}2qdor-PU*iQR{8<_pctK||VysoogXAO7 z+HcU=m!NR#$%pK1V|*f@2#QmX7$hz==77w?yCw$f`n+`HaddEB6n%{m=K9VI@ID=o z-Jmr*U>bdW6KLNT=$soS$XYQ0P@fSr2ecD>PmKaIh-) z`GNRL{RqroAbUXTxWM!w$UYMg8>$ZC|CZh-pf!IzEs!?g%0H?4045<5`mN6LgEMi~)%~62PWCxwmBhUa^m-+v{ zNF##|1CxV;$O8t!b>O}=c)uJYlAQ`74h$UNwmM`#0FO$`2k_hw)J@=dG64n#LnZ|Q zRnXm%ptbX$J!g#P86-h>7NeP^1~RKpf&p|^4|uGFSrVj9Lr7o&g96A5NShn9=ix&N zvR(lO1__Y-I?%iicpY`42O}4QB&Z+Gz@Q<7tX9Np0`2}P)c#aV|?gNcmX#Q0Nr+-kI1*t`fTON=)kQgK$R1d(?04Q!j>X6p6EA$?M z%;ShSF!1;9U;wS31FwlxX~B}V(bl8)K7!~4>ucXsifKy%!^%>OSiuzE6x zBrq^Ds(L7c%mSr%@VX98j{^+M0S7>9SyX#Id|=GUQ0!gwAF_`Nx&|BKcNK8@2i-3# zaDahLr;&lbzp=|gg^yJnWERNGHF^vTpmVnv*bXv)<@i}e;Bxv54E>!A1<>`92N+mR z900jZRrA9Ka39|r6v_+?jH#gXA^_h93o;iZ19b!V{wD_3LeM#CQ2!PjU|^{@0P*jK z4v~{fWixOPC5f?K?6iy0JKLMY7UlgWBPvqWH&@DEbNuR_aA}sv-;lu zFF?1M@^y1||mPD29n_42+Da35pCnSqz}F78#cnC^GO>F);Wa zP!##Wz{GCloF|a;n)G3C!9FioKoS2C5Qx4<~4?8A~Ap;}KAKQ~+^@Uxp&%q6$R@=7S8q&lp&k znGY!UgU0M74jf=$2Iaj(2F8dJiXgW$9tPmp~%dCKpAxY zD1*d-1HI`C42(NYD1zivdomIja|#rDPeRf#$PFsotXz!G8KgmL$3XGK_#i`773 z4Bl_ga6oAN4hEk-Nd^vv8=x{rLWo%zydM&rXFy>rz`&ph3g7;oF3`CX5ukP8p!E%+ z{S2a@`?p1oGYErd&^m@bRZxsFFbK3l$9o}r;*r}Y3ZS?IsRG?M)~5^Vql3-~WDr=# z3*PtY13KRbbj}nrgMli{Oh$ztoa+}u_UiU8hP1=hF*9(0&fsKX5Kvtw30}XCzULKm z*YR%kIr8B1fBI)On1Jf5^`N$eWkUt19RjLPRoEf-Qi9qZ%nukiK=lkHKgfa4|HGvZ zG!6i&pRnj#0IHWjd%eJO9~&7YK1XbriB&(iy}XDSH0FU- zUIVnwWf3z2D-Qjjab1x4Y&hgC)C?KGeqb`<&|bvMz|N2WI!o#Qe$bj&XuAY`{R-$F zw%zJ;WMTI|g6`Xs0iAP1Vwkeya1+=)icNfpl4))_>epzy#;$( zFJ!=#)a~F*9)D2p3qqap91M#Tz#cd04#h;E;#K8!rxdSiJG!kO##Z*p1M< zz%Qcke}|d?g8=?~AO*Ys2`wLx6y7Y0I2c$L@iVY3l4M}V65jmCZbl1lT>b(3Wf3#z z`~$3I2Q0jCg(ob$am5ELym7@REWB~02lVjfATGQmVD~?6KrPD)8?dEsAwdRq$oP80 z9oRT5c#rrV$XMGnWd_imaRvtFD&|G}41$Z883d-OFbILtGXu*Z=0y?=!i!iKg!+^q zZ6XGyQ%np@E=&we;Cv#!h=W0FktBoYA|?irK5Yh>J}m}`^{W|dK=+3);%1P5#+yz5 z5|q8WpfXt!Sq_v3q45ffHz^$Quy~WkArFf;865Jkc$38;4~sWB9P*%XG?4q{`*ayp z`g9l+K<7Jx&c#~9%b)<&V**;+isUC)nGRat1S&VsQUp!OT+{J};13>r{9I-oVLSp2MsLmuX5EgbSN zKWpQVhxu6thdj*Bx;W%ve%8Yw5A(Brp9+J4njwP&1Ir;M29`5S3@mO;i#QmJ7fCW0 zEs|g`T*Sg)FirLU7f`v$!0N@kh?Bu|5i5hqG`0WV)C3qD7}$cC7jganzKHGrw`od{ zxiAK%DCR}n|9>uG`u}5^GUR*?2IeH@MLhq1FJk`xYnlq=o<9bbEapYL|Nkyx`Tu8{ z>i>VBdX9m$hJc0QcS9t{UGp_Os=4TBY<%Pi_Ne0735)4L*SQw1a z$_tZ4tPG}T<;Ax}Z2!Nbl@~u2G5!CER$lyC#Qgs^T6ytj5zGI-XywH}XnFA;S9!s} zR^Y&RR6udcVg?44r3_42kMi8%OTwALH8ari70^8 z|A(oEw9f@Zpyd%-dvUZcN`7CI4?O-&LH~ZVFS-dbUj#b41(HsAbD-&T256jw@fc|A ztKa}^9Fp;9g(7-;d;NNbls+W}22dM_f$0zv1JfBM1}1P@fq9W61Jfc22F689kh_e) z?Q3Q)CI;pZCI;p>rbXNg?2EV<*cNdzu!6=r`g9q1`g9mL)`RwXtYHXP1R9HijFE)& zFJTA(wUt465IX(=>tlfBK=y;=RoEF|WhShTf-Vm$Ghuxkba_~r3F{-F%fre{Sf3MJ z9#&?;`e^9#uriasPoF`gPmcjK7wofs9fQXre$bw8aKFu`e+h#JlAmC8qad^%L6?X5 zSqO(b%+JC&1o- z(x<_ouzn?j&H5D#7K=FHeI{_54~w5+Z47jIn4e*76m)r*pJ8nrba|McVQnOId6=JJ zZ7g(on4e*7G<12GpVj-c8Fc!z7&O+eW-tMrMYV_<-eC<5_SihD*XZ;!mjYYhmGq}L{ z8CSc{5Sm}m$iw_>ibEdeXEPk~Fh863uVYA2Gi0z}(gUqM z`d6zazyLab3w;hC15&@R!}mW@p?+alB+0ZB5fcM5=)NZ`^$W`)E(X>`oD6KB zac(U23v7%HTtuJRk^XI$k!%+I*$515~E)ju#lH`59OF5A!pw z`UB=?T=fsk&$#L@n4fXge=t8QV5whVeQfmd8RlnP{(|`#SN#X` zGw2RI66zO*HPHSGT0a~2yv#_M^M&@A*!xr%IMfUo1Q=MHm>5`mm>5{5f=l`B<=ryL35dlxEXjS>HPl(nj2fh^Z(x@UGP}!`bE6| zagD7&=Zycu&VMC0PKIqi9U3Q~J6N&B3CAK%2F^ts3|xy?7`Uk$Cx5}`->L8YzXNnf zCa9l}GOxx*a9qk}{SF2T&^$4;{J~Yvz~;-* z_G2vKWkBxt>p-&?m3Pq7rT}qi^9OAG(*y># z!Uh84qB%4e7mZoJh9LrJTr>uBUng3e!1{$?IZ*ll$s?5)uzn@FJS!}1BbJj~C?*ytHb(*=<+Z>!}^uz z@-RQc`laadFh9fkwdnFNKg0UP=<+Z>!}`_e@-ROmkBhpjU%}vjG%kv(uMX=MqRYel z4C_~-%ftK(>zAU-!~6{E*P_eA{0!?Cqsznm4C_~;%ftMv-lqatOUl3!#Kgc7!^FUn z#tl^3_76p1Osap69a1r69X%_jjq3lk3nw{FN5wPRtB9u zO9qoZ3kHMrI~hzscdsr2?dONgm4N%dpgfOMPQ&_HU^%4x0}D4;KMh?T7H+V99=bd% z++h7gba_~~!TOo#^007&^;6O1Vc}-pr^#T`r@>$WIzM#%3I>fuoS-vO@s6!pLhEO6 zy@kckRygEgezwLT5A(AP4tbcLZE?uM{A`Cq9_DBJ{#6V)pfxy5THvwO9MHNNXxmAm zejH$xvCfJxNxO_)Thq%gqSUSX2cfjHVSKR}P6I^u{ zEKYFMeXuyeRd>ST1bIvqRyV=gN9bictZu?p_QU*)tL}jL8CTr{^E0lx3+88Bbsx;n zxav-rpOME@VRaL1OclLshxr*-*$?wGuDS!}XIym;%+I*$E|{Nj)qOBOR|%>YZ?WRIh4hou!0}oV1llrYi-f&E z&)-19l(exg`1-3VCI+S>Obkrtm=;Mgfc7zf#`eMMuO?|Quz>m$i#QlqCTT+UcY@Yk zO;d*K|72hWt=DE?2kpT^nkP4buJH%m?FwH*k5+!e+DzcG9ZNeK*5*Q&hs6`D&4w-y zizir{4_zJ>Pp~#4x;!kNU~Nuxd01J7Jl=qHJQm4M;CKbC|He_i!_p?K&4r#eV19t{L1`20258y@jmZ`e9+Q0uu6T#V5w3It4xdG!yLgcL(@1Fm7Du?!Ei8_3rF&Q$;mS9# zbcx*8fTc@VUjsc}Vd)ZAyuuaF9A3a@y#$)lO zOCs6@bZA#R0^k2e!5U=HIr5-#6+Jv)@rkRBfyF1TItmt_xav4qeB!DjVeyHpj)lc1 zt~weNpI|>g%NY{(7(al`|Deqm6WvxDZC7Bd>%I?b|K0%Y*#@n>W9aKp1kd?yU=U$o zt2n?g(Lx(`z69tzR)+NriUJQ9!qg1^|LC9DXfTQO|9>@s|36e%AZxurWi6;ZF-ekv z4Kx?TtgNBPAnAS>q?TbZhc<(Tf+9ncf+AA6$uWtGffb~d(OCo37c~H@<4Qlwpo2v% zHv{M{00qWmB(>b-hZ*#+sFh$~2ARvujHFh={V-NHNP^EJR)DxS9N}IqEavin&)igC zY(_Gd2ZtL#=LLYy;!^fdWK`zRW{^C7n8Ct9k&($kktxtZ8x)S~G#EHU9{gXkP7{1L z9cYat`aXN;89;ZRK;$eI=fkc$oK-s0g>?qj$0z*3!G+%j4yCn zBr?9(A>lxc__||)8efGBsQIgs0Z0B?u4efE11Qfx^VbI~`HK(YPNMP`FGwws@dY~1 zk=Xpj4KkO=_~HVq1*b29`HK^zmZUQl94n*@dNi;D?q`kCD{!<0yByAY~MhaRbSB#Fc%J{7hWg z2f8~&fmu02kr7lzONJk2&`MBbY)XKYQ6JXnFbIe|_#eGamq7$N*MOspx(Vz5L(3?# z(mbe)!j|U2=>n4H3Dzm#^hRX3g3~c-I>1q$OMvgz$iDkp>-EZ8p4_8A?b~{G!H4~iA(d~a-PVz0hjYc#tpcfCo*oJ{HGWgZyr!wX2D=JiSz%@NgV%wFmOgOFmeYdF4JPL zn8f@4`y`(K-xzqS7#RBt6qo5Sm`#%S|8j<-`8LgD}y>l81gZwf$bqKuYvDzV?+ruah(N&!a7R^(0mvu4COJxkb^-E zlah8LiGldlxiHjR)u(`y=jTBfdG5Lm@K@zN%xVQoL z^O>0=6d98_v>CvCo&ZHgrvSxuS_~5Fv>9Y3Niv8};$;wHkW6BjB*7rc*b6zka1s}T z2;&b2MFtKp21d^a#dX>YB9nL+geOTd2!YNyWYz_jCqk1X7z8KrGYBw9I59B32v8I< zVBlD$1=^`+}9RGi!m8ah(@%;aeR-S&DB>Dd(*~COA;|zKdxLmcZn(kc=M&qP0+;DTmZ#vlg2;BIIyejo zm!}dKVaNe3bCA;u?(!5;mJwH;Ldr6a3h z&msL%;_^ATUrJ;d4DOc_Sq6jqr9|~NBpIOnQs{UVMdQWCVdsBB^H-q*cuc>qLy_@W zg))4cpC4B~V|=V;_#bo+I;igl8s|TOQAbEJn1Rbi;^NH|q?X8jzX@0^aq(shQcGmK z8G+S;-Aiyx#t@{IsCWaN=>Q#vTnD;?WF}~Cgh3x8ym+APAL80dkaiVuZ6$DfjmW+a zxE;tyTwM)mUlLbWL)xvx)z#p+L`LTd#dZ1&p!sD`pANHMED7lsL-HBHask|iA}W3H zLEC1;`3utKBgS9c43M@YO1cG&17K-m^FZ6E#H9sDzj(2S;yO)GKMS0`F#Etf&^|D6 zW65v8;OetNFSJ(c;I3H_kp453$#`Ul)l6<@}ne!7$}bu znZ86pYKcr=B4D+|`AZnAmKc9=GYEmz5|_RN!D@+13*fZ_pm~&anhc3$T>65{0}vMv;Q0k2`+?wf4AAt&GD(7geG&%)8)(dQ z5)T6_vxbKv17{G!Bz^`K(D*F_ZxI9IJMegl#3Ts@=1Ck3Oi;CqaJ764;IUrNI0I;I znDIPVJ%h-DfAZjZ7<4bv28?x=(7ECLCs5mF6xH>hHX63N9$X(1nODH|EKzxdn*m&Z z6FJ5YZWj<)*Mr*|5cd+S>%r|9BI|l{aK3_+#h^V2puD1iC9gp0L*nuuq@E=%uR!W= z;_?clT|iu3fwVV>%PWvEe`3lkE(XXr4r*PGIc6gXsShFXMX;`i)U(9&0r(go^*3?; zf{d3F<1cOoNPC00vKTyOLuC4bjM+fa7w8NCQ2N3gpW%Uy&k&csAoVP9=?hYS6PLaq z?E>P`7o@#GTs%O=XNZXhE(Y-U474nU)%5}x`B9PqTptpdz9981ap?( z7Y~qj3^DP*#Q>Rahm>ESx}Iec2Lmg#{$_*M-~0^hSn7I)NgND}P_;~OwR{ZB5Vchd zq}TP^@1WK7#I7sK0<9|o&5fuD{Qt1Xf`NaMBm*BP-WORi@J-@i;03MATcp9jJBbr| zK7=L%&m=Ae?nyihT%dcaCh;?Hg6>)ZwPz-AFmQnGGz0mKQ4-uQfu$vO&>9=iKI2KF zYiu~7>mi95&B8k?>3j(?6xJPe%B_~$~3e{LM{55Dsh8vo#NJ=C@x&UseIxE^u& z7c#C#T>b@*>k-)&1&`~Yx)+~69@UJ!4FacDTQXwya z`pnq!5+uE$q)nW836hS93j;|0ATBRK@*Q#IDx}Sc;$EEdt&lb+F>PdS21uKex_OCX z5+4I6G%s->WM`W8FoS%stO9R(SM9u|(>m};s zrM0m8&tUUSSk~=e+fTwI4qg)ko-+aOC&64}D9K<4>a#$?mEhQbEl4eqWxNeoElM8? zXF9M3sU*+hX9cGa}c|fXC!e+Y30$49Hj?ab*T%43W6Ffs9Qemz}uRHi7r4VO#IM zPKUu@oi2mPBt8cHNfHctp!<9$Niyid)^JSXVbEc;gx=xXouLR?(>aNcL3@$}gBDb+ zCR{Byg9b!x5(B8syiON<);%b0Fz31WA@f|QVTiMyfQ&mK`xW=P9LRVUarFc#<7ANW zH{$9E$XYDo;v6#1g}t7@zy6aGI`@U*SDbTikg+J@+A)wZF5=oTq>P7!Fx|o*MCCV{|uP(VZ6|`KZ;**mWSZB0+Hn*xD5g+zX`T6A#EGt z;s(-YLUAw7d;@8V5tnZuZGS9n%yoJU0!VY#;PyYL-4E|SNkZnxAburSS3$T*Wh*q-g&bn;PyYL z9}Vt9vlWulW&ySRv9(#i^*SV638n*Zdx6L{3%DJET94z*qu}-pk?8>3Zi2X%U^)P| z$B1mR*n`_Q*wX=Wo5cW2n+062qxuzR83}1G5LZS*+9AZ%Uy$|!5pJ_!&g=0)=Jinf#yHDE zaC?EsJO^%v5Lq6A+c!j(hv0S-s(W#^Ss-I9#KjF{jD>KU1#_-X5;E5Z@hic)3fx{G zvaSNRLr}|aoN)tg-w+u$;C2(ly#(tj$Xp+B`35rAhrO=i0PQEA#Kph@TH^z4hp@rh zAsh_skaox^2IzbksLjGKiHCs^s+I|^R+51kqL#Ea3v@ky19Uxq18AK+bUnX-O3VL0 zp!N3?R{Z}5nv{vp}%pIAE}>;GpHvHl<1zS+_9N5JhVV$w6-^G5^_=Z`oLbNr1 zJB5rDfY#FXfzLl+n?86h$8VcVDN^fa~rV=-S#T;QNoMkdHuR-{>46?z6oh?N`G2 z2($gl32DC)nU5f8n3(#LmjRMDi0el|@*Hvb2$GkH%SVv*D{=V<(tgFCkJu*hFtCHx za4{0jN1(L{jL>|r)WzQfyYCH36AKG^+_(0OUH;tN!EV~a1a zpNNbva99!9ZwAK!k^N?H+!EPu2B#T_dkOZN!D*4G_6FW|EAjCKS~Cdg8}|GF4 z22K^m|Nr}2x-39)JuM)TfkC8!fuDgzhzZhX6;KsvWZ(wzv8ZDOi#IhCfYhou{fzo_v73n(xMGAxi#?eA}BU|=dZp!z;*1LJuG#hw`qEMS{n8GecoOr1_qFsAi4ggh5`_+;`BEICI8`(psOOm$^y~{)pKTz1p|Ws1H&m0 zzkg=q1QiyB8KC*A^&1#KbK?>s4h(Dz4h;~yBw2Vt>I4`V_N}pGVCe5?XkcPUP*vr~ z`k>0qFrk-`fkBmnfoE+a14A$4{~xM7Aol+sy^R0=h;sk`v9|I5ACMXqJ_bgx8g2#_ zCI$i3wcQLX{c9Nv`uG_-*6}g0nEqgBSSP{IA;7?}WF0R9hX4ZuqY4|t0g(p`+@O%^ zpV?r-#Gs(6ZYk3Pax23D4bXTl$gT1qw+b*YOar;I=O;sl3MZ=ovs!?Pz$wU?=16|; zU8Bjs(DRzX2V|yzH{_i2o)-)(3=afURe2Z~1sE7w*1Tb0LD(n71Geu0+&*TgeN|xl z{1{ABco`Ub+!-`<4>AadC@^TP@dfE`UjTA11A~St=o}o78S9sW&xn%fU(TQ*;=rH) zazn#=1_l*IhI-M53^HK;4+cgRMg~`LMg|Em|0e^J3L}G$xFUlHnE#4_S%s0oP1KP= zK!uZmc^xN%Ps3{l78M=_#&z5b9t|%TSXFo#1lDmdI5a$h_)o-vfoUBRgUdP|2A6fb z3_1b~4BntP=;LDmhpFyC1`ZJgko_8}{WIGasIW0`z}*XVvxozO2*U#f)&ACog8rEe zPhe_Pmi}$%-@^ck2Og07`e(Lp0QnoFAI#swAfdv~z^Ed@z_E^>!DpQW*nVx0{r$~d zE+92Ml^~LVL0Ex77R2iBf{6Dzfp`oIAoJEQW>8^p_`%8GZ~`3f{fik?Bpeu67#tK- z*Re482rw{+fy@+eVBi4h>Yv%(0Mdu-4gm(xJ)8onJxL5KD#;8iA`bswfzXLDiRGLa!qOgQ^z;&)S0w484y3f2f`VvH$<*b^QNF)c607wFm$I0jU9n zGgyr;q%2>1mVu?`J%p|LgMo3)4+fSs?hFk5I~fdmJQzCGL^5#nuVk=T=?|3dK3~MzQSo&8nX!LY5bgb!O;OJk&paW9F zn3JKprkA0ke`foV^-CC3K<)yGgVVqg1{DDZ22N1_pnqoL4UjmpyZ|WcGYF`H<@Ynl zsPARafQ11_EeJ!xq6NJFRiFWqS9+Qt@eEGCpep+Ts7w%0?Qv%CP+?_Y6j;o_3DPT) zz`(4+$I2?ez`(l3mB9lPKA^MjV_)I;q8xBrQ>i-}yjK=y$!#Li~K z`RAZ^!2xi)KxO?N1_jVL9wH44%%JrP0t^fjLGJHqV(Z3=GB~eIPZU`W@t+^$WmtyF&jm1`PoR25peK9%o4U(Me=r5>bG-hv6`Tv`7L2 zq)o{Vs*e-|7*ZsZ1sWJwpl+36IBcNE#N43V6Uo2;3IkyU22PM0dORTRXW{_69o$Ck z(*(EWgc%J46nmVZ@(@3Bfz0XC0_`PepR#@#r2J*#Y5>o#gWM_N@c%lFr7=Y>u4UjoKeGCbpFcLk$0KV_Ke`foZ z^`PPK;~8O;m{DiRFL0tujS6i^j808Kyn zptg{Js>phHeag*{AOKFw0t^fsp!RJ~G6RFkvH$-?68?VzxdZG+NmgEP8x}`d0#XO@ zUqc1de-Dt`;oy9>he1Msfx#E#zCI=f4;5wxMu8+~dE$U5Pu4Lb$`b(w21iid0=0EP zb{PI(a1dsIhf5Er4Z^JO16(G7%0)DMzdF!VP5|Di6yz_Xt5|Bv3r|9?dL|NmIe`2P<`4ai*}HGPr{9UwQD zYcMc@+^~*=p#$WGb<7L_pn43c9i?C+!@o;?PCX9^Va-HgSWh4$tg-1K6xI$Tgmn)z ztZhKyNUN|0r40~JMg6zfFLFfouIb1{F|U0>ndmY4CK~Vpk zfq|hXpFsrV7u6pOOrUnfatj8Vo(u+&o-T#}RZa$`rJf81J*ycM7#0Yqn&vPtu35vN z0LmB0?K_YkVHgr$)v)^i0jRu1iZ4U38~YeURQOp1MGv5aofb4cI8>S#G{m9hP0vh* zgq}`@l>Y862T-|Us>Q&xrh_42O&3GTnkEL0HBAgWYg!l_db7cCBe|v%lbOxH0mn*Ly5T9d*cu_lkfVoe2u&6*r= z`0#+s3uOkGHO=6AFFf$N(lh7J`DRt|$m1_5CO237-4h6W@xGePNC zRDpq2g^N`TNqjP>FW1w=5TL@%#wY@6V=*u=Ajx-w%42~C(0b2}K}3azRb1yFxIF=> zS3&(hhR*;*K%qw4`%fKLV0FpNa9x$+h`{sNMjBETDL_qEkU;w2d z28K2M5I#u1zypZb1UCjyTNzwOgV-QBkprN*nSr6dxywXFf|VOo?}Eh>AZ>9ZyCXp1 zB=7)UXEQBuW?%*3o|z0&RM;38jWrlp1Q{44LHY$AK-x>7aTriuSGP3(14@7EmxIsl z0<{|q`j>;o1i<}MRR#tFRfJlTCwSCKfz%2-0JXh9{nG{$i23>pU~ME6JC=d_s44;s z3_PH|Fv1S4E%?-f)CxF2(oFwK1`|+wTvQQKehEB)v==~Tf&8j&>3~vSfZ8x1{RnyM z7?6KJYC-J-kemo;>|+6V43G(w4ngG!dN~5g8|AR^?-T3yGnlO3!(gy}8-vdJtqdCL zw=k%z-wf$Pfcg)hwocD9h5!{lhWfrMpfZKQRYiiqM@5psO@)JjanU&jhDGNY7#H1O zU|MvOfqBsh29`xv7})w}wx3{VXi!yQVPFRJuRv~PYA{fpb`pG!umOX^3ROV`27zUV zKzm@?L1zoGp{P5}pkv_m|39NQ18ARv!MdvqGRqDzXfZG(2r;c$0cw-8^a(R0tUJIU zv+Mwa7KjZRa}!H|rzMeP2N(?c`@3wGon-fXF=lyp#Cgu zya3dn{Rtf}cnAtv1_sc0L0>V1EtJ4;0>qkjg24bpt8y|hE<4F!(3b{D?>(m=c|z0y z(%73p6@c3N6I6v57)(KK1jR!i z3j+&s*!J&XFo2ZP9iVc04Y-`1*?tD34rYEI2LneRGlKvl69Z`7C`diLe*)^eFfe$4 z>s^o?Oq!tl*&(z}kikF%S|1~Y33yDC(HY!70h_VrFoObOI6(SW zj7ck$*IZ=~0O?g>WZ>vI1c@^NM+Rma#sUVWO)C^Zw22}EtB50m2iQ(BzR0n1mx}> zPX?Xd)e!eHb{|k&6Tu(@irXG<29w?w5OHRW0>w3c3@UwD3<5nK3^u*K5OGG`1jRKz z3_5)k3<5pA3@-hkv(_0H7#Q+Qw37@5 z1|I+aGeXur8!S7-pvS-vAjGr^lFykI2&k?*z@V_~0D~Tg-M^o~1k`8f-^d`*zllMn ze=~zZ{}u+7{;doe{o5FHKvV9Gb)dbOu(D2Q z*&zm#{+aDMDl81BW!+f@3j?43{~3GXWu1x&7X!nxLkwo?PJz;Pfe_O=a9FT|%Q*=K z1{FyLhIKa?RMy=9hl?3loS%Uat^Bj;@9eT!cAmjTRg)nDlr~kh8EkqL85qE0c%c59 z;{PAuxf)RaP4WL9QSJXf)`I$PilEqJU|7q@zyOP5p#+AjAkk@O7;IEHAno2|XBlk3 zd5M#OvF98lFNq$2mVYxq8yvm4OZ*_kzM4RJI|fIkYlx53~$40I7qQfs&9ikXZ?P8K?r9jY&A6%D_;8C=2yb z%0g+7{h;t!znH;h{SF3;o>L44J*OE=n7KH#nHd~ZMHCn~84^5H89l&bQsDBOF%w)? zg4;;#ZAp3efLGxA&49uEfaUF13=g(l%uL~9D1(%H`pfVP$-WMXy_!cZ~11^(2 z8GL$wLd9=pD6a8kaDl6jgo;~&#ldA}k1s|3BjjNcpks z5Q7z{er8$;E;Cp`W#+nb3>xdsGw3Wkz+eU96Iq5XfV3BLYoKN5f%W?tY}W5#uvovH z!DRh527~om8FbcfVbEB=nL%a!CI*G|8yRHQZ(xw1L7UNn!C?oe&B%$X&Dg((!2&ct z0BR?K+Jw_iF=$OY&7jkFmO%#8js%TcsEC5vM+riVYbGc%eFEn*aIMbdutOD8hJxY) ztqe8jpV4Kr>>Psus2l^O4RsC%6;L?^F3TQ5%QDdX$U|sZ#_|8h+J}&`3}oKghbU#J zKS&Hz=P@u$P*v4pU|e>J!2nWbF@QP);5iZ;?KTUfc3TLv%tCFqaWjC{O9z|Bq4n*W zrYB&%;5cDu*r5umd&Cm{ZwA>l?GyuOPavltVon#OErFB<^g!)}X{Qz@b zWnhHm3uYY;MW&aCIAB!3nJ;WW{TopI59;55$~x5w1{+u(2ULH9`Z(ZuS;zlBdO>}h z3P>FfQUi)hkQ!M03MDWkg2blX1kHy|P*vAsU|e<%R+ppX3ms4$ja>eL{D+h;(xCYQ zwJzs}=8H$@`N9E_FEl{u1JaKH)kz@t^y)&>>RL!z?Sr1(#5j?-d;zLQLF0_zdX0-i zd;KZ~4-o|h?)9q~e4uqcGb4I_k%Z?LW6<104`}Vk4h9dQwG1Lm4=Pl9d>Lf=cQW|& z_%KK??u<}mtmM#U&iV0#?auV!!&QD9(a1hp?tf!i0%jIYt+7TUKJ zOZdMK=I#KOQS*Z}b_sO^Lv*3dH63RIU&JIi1-?FNHQ-+2Zd#vP#WJ0ZmQ6P|{^ z`3sbWNX%aqko=X-0*6QFqjB9FtGG5 zXV@UXz{m+sQy}q~?RWY?=0Aa~hf!a~Py1jUEuK(P`%N=ilG2BC)(ozp8w@wV6adXXk=h!$XcKX zUem|Gz<^XY`hxWLaYNQmFqS5$tm9#@K&p>^g5(7l7+gT*iV%3baDpn6GC0k1G87sp z_s?u>=sU{5z|^Lo4D!qR!=wo8wVcc4wvW}m@LI^bO z8q%T2@Ca-sJA*sIOptj@Y6{9A^T1|FfXXrk24hJECUFILewxCRpr8s?>i{0dF%b!1 z$N`1p`i%@T`uIS1E4E(&#S17NVE3l2N2G%UCWZ;BeO!>Sk^a>T3qbWSqql`3C_F*- z_V|Fu2*7K@7<)SuL16(B7fblR7(~O;5STr!%RuM>1HXy{17|N2g90c`Fe!ok#>o(f z>Nm!Z3gCE0)(_IBBFUh!eg{L#`kf3Ny?hJ`pg0AY&3Gz8as6tB8B=*c{dsWOTY!`n z!0WpDav5a$Di{<%;ma&~LS*ux9;Yh7Ic%G0d3a10M6RQQya~p??`e#rh2lM?mR%{bGg=^`+1?rfV2> zfXo+gVEEg=nBheKT80y#vaNR=Lyrn40~_Pj3YE3%8G8D6Fo0LdPM2h`m@dd*0xIkJ z*D;*vUBM6nn!5tqzk*>#?<$4}&|DSFE&aR6{E^(>WL{ z`e(M=fX1CbZUVUnH14#16~m5xe#p8c##ivN?i$!_s~Jv!)_?U@LdrU3(*TvVSqu}_ z?_gL1atkP}^j?OSci=U^DCONwh7M4@4XVS}uVIK-zm_4U#~G>YOJrbX+_?ZWhRF{y z3#mMc1oOF|WnXB7$~tbWWnTa&?F&5streZ1+P{V&0yIw1zm_3}aR!I>`W*}&%nSvp z>o+p^h$t}dGbvQ4GV_4j1}u#04V0O5p?M!P=Y&~S=78dp=A*e%d;Q6UD%x~@Jh zXjut$8;#1!5>Py>-^j3`j|W^<+JNE}6o2rt5|N%Vz-1*bw5(jmumfCHu0tv-Jt1Qb zApbCGqm-54d=H8{p$80-pz)>t^$ZQ`*D!d1!mjrngGTRr1|7yT9NLTx4ysHF9-y{H zgopwI-}?0oF^qlCFnwvD%%~3u)Bd##4gEVn>)s%B5UAW?7KD_kAp1e`Dv}JGDm)Ah z>vuBDS-*y1LH|mIj^6bQI{iBsPB6XJNkv;X-x*CrmvDg zrZ0~{f!Q=c1(a{rt9Hxv@3qW&c?CbTwW$6h}S<;gaku!b4z_=!Z3}XHlI;X|Z zumH4nUT6It1`W^}IoSLbXkM6sVFqX}iPfw1s^aluj^-E5ny1r&G<92nd|D*FN<^}dh-gCUr&0+~A&Xn?GL z!?MOv1FX&fH0}%T_kib^`&fw7#{p?`7;-W&3MwG%KwIMiu|tc&rq6&u#?YIAQ7{2X ztpcQd0&++H9tN;lF^2yanHV}$`+Oj48w`6H7zG!A>J=_-f`KoCLSG9* z3|_Uq3<`n^7&s057#Kn7`dS!}*SToG?e}9~6g+?k^S%~_0#JSg`2*xm5Z%`gA{iJ& zA28^HSbZ&!vY%kuX@SHUL3J}A<_R-E)?C8e#=vxffnAY-i-F0Zp?_xkioO;Gg}zou zeF$;~$bAU44h^i(wVY7@BCiPnryYOpz1 ze?Nl`wmBYX+X>u%0J#N(A^APx2DBZ8z8(hLRuNbLv7=`Zcz#s`G%w!M1j(x+p!LS! z`VPD<3E}=FkoAZ#b)fzr$i5yYuo=uCGoWroS*rqdj|UF-K-Lg}*5l$>C%C4W0lw~7 zfPsMzwC1FznIQmVw@3m57igUfbnPUjTcPT}YW9QIN5j|9K-?9+fe3eDT~kM6cS%6q zHDNt;e-pS|ZZJ?4U|{41g|i4a4h2+uj)V6CvGg2fkmy+s8CwUjLE$5i0EuVNxT63A z!{0T^pmX2gYXW|P%;|Xt+JC~zDFB|Yg0Cz41YR5U15$p1`fS1qaDA^qdx1dn``~uw zDu#@nHw-GEHl|<$1M8aC3?iVl`~5o@GDH_Z@>0(`1{;tb)AQgpU$@u1XRzr9tqo;l zU_x4h%?(;Z0b4@{c0V{TIzZN7O0u$o+$+Gqa2hlY1X~BwbBIBp=LrK#k2iyjKm&u0 zE@UmS7HFKNe+@$hXw0U!jlpI83I?C`%NcS&C zmx%`yR#1C3g4P1T&39%{5oll#0nPV==JmnmuLGNZqW2h@`HLAW`ayUP18AQ}4%B>B z6@C=+XM)4{F@p*ytXL8lxK+5BxcZ@W8$$}Xodg~??s>(a!O(m{nOO@W*1v=y1IeB3 zpfyk+F;JNG^g_xz#>EAS>(?;^^t^}g*RN-Y==lLj59@a@g!Ig00PihYzmp*av>&GD z8G}a8Qw9}KIDx}xIRmJDi*P?^{AVRYh5!QtXyuz~|4N1o(AwT!B?cbQ+8qIBQ2E8c zAm9k;dxF;Vg2J)qF#}8gYK91%L!23Hv zVFD@lf_8w)7f_j^!pOh^sz*S2MHVu!t1vP!_w+&PLdIhPsvx;FO$-(wagl`#Y$}|r zJUyVg^1umoW=R1Rm^{dzATvOFl0afecKHyn3%rIK$*vwWyLuQGPsER}DH8BU!nkR6X1m1fH>f5L&{{JuFz`zb#O9$FpqQdh3zeoq99t4@Wu7!c4 zuaiLlGzP-3QbUnpVT209CILl*Rs8=|ocRCSFfuSPtm;r^;7(=&nZ@8(pu)iF;>5rd z;>6giz{0>+&BVar(ZIkJ(ZKlQ1Pepv3`K_Q3`NlTne{sv9M-R8a1qM|**8H|U?zh- zD7^ZTKqLbLLqLIw-~k3DhJXlFAqNIICIt=EzJ3Okz8MS(j2{J*8G^uJ!o)0Sp$M9% z?4Q~2qOXO4WBqd2J_iF;(B48&`&9(gF9Yr0o!M{!qy|*RFgX~gg5(5(7}%JMIuya- z%E8PA4Ob`7dR@?*tpEc9x0;~G^mQ@{67xzVgF7B@Ol+7$^VBzd?D~2CjnKE`&9T? z`B)kmSV4XUy9=_uR~FPZBoqb=37c~>3?=mxdyfe;eRHG|G|3?@wLqZAnDr| z*8aT!T0;to3ve7m+jc!Ip!!b(>@F2H2GBVOp#8$k3=S5cez*_Fe&{|}HU=gcC$L-i zn8E8>LF4-%e={&wG^jpiU@=HxU>5-GHA*m0Wk@klRyhXR-_$sP0W_Dg46;TYzJ3?9 z$7nf&3aDON$HZU(HdlfLmUr|(^V8rt0u}}fkRH&UBv9G_?dbyTN9yBX=z!K)DhzBV znix1dK=IGKPLja}ROf-*4cc1+tK&dsz|=$S)BxMb1-DZWlur717&`j688mDd6&M&B zGgQ~HGw7^iXE0gE&Y-f6m!V@FH+bC~eE&GeO)6{*ptB}GtB^qZvrzUU!|EeYI)cQ9 zH@N<5SO?x)t}l8J(spTB58eY0(e&;bmfE zSS6rr;LX6yuv$X7CkL|kTA&Bb99;$m(7tS#IiPR@g)b=XVPYzL4Eiek4D}1vF)%Dx z&%g*?(+_E5bA#*!xf|pLWOswyye0+W*EMON{niYiHUHqfRy`e%aTkUa0?G!S49pBG zC6qz?!a?fSq`}$^ussG|u=)Q3@bxbn7$j8q7#Kk7coI7Q!XJ>lz@K>D^Sd`!%sxCG6ug5ndjuDyQ=gNM3h*a}eE z2A6YtkoW&Fg3`DO=v<8^eFiHPr+*U~A{ZD{IGLD4e?aRgXe>sEBA_fN6b?l(_b;BJs76z5| zOBgh8s59wb!vMM~R(~B2gG7@q1B03bgQ-9-XfBU5$gmO^^u^4h^0Rj4DnHj3Sx; ze}lvY7#K zpCCW?uVU~3kBRSLPyqRtv57;w*PEdMw6;M-l8KeU2b^A+8M483GPs@6>&H+73UkK8 z2SDrhL)S?#Fsy^@_X=7k$)F&T%D@b=7qo9|5d(u+6B`3~4ZBDi19&xR69 z;VAkLYOe&?9l_#^P%jIE1w!0olhVK2`j1_o=9Rt9zzZYItqO$H{A zI+09>`#}AzMGOq)pfCj04koT)O%fZ_~vz5*!Cg5petjRAbd**a#>IV24xpgp!~ z>I_OCb)dKf#VNA7{w1Kbh7Bg`m>D?KR2eit>Okfpt69g)zyq=mYL)>=4Vqb?wP>Kd z;yNI8>zEk?Kx))f8LZIE5dq0V@_%>>ET1re_V4UrP=KDdp#m#^pyiH-4S27p3%LKI zzW4tOQsz&4rZZ^t^f8!#+Odq+D-_qSXGlT`LB9AuCJsR!i+6-EX}QANmpswN$|*jWa7P&oIkfW$Yb zUI(RPCJuOfi!qsdC^HEqC^GSIXs_GAP_u3mLxX?<1J}Bh3@uII-FXZQVttUkD2o^% z^){&96;b&A1LUto4FCUw{0r(|8u>FYiXZ%+#FRfn5o9m6@o?Clhkn$x1>m_8ka-{s z$tRBB_8;hM5YRXtY>XAuHebJ#L8Ygefd|x95m*cfpPoL*Jc;3X1_!|hkg)5S!QcaO zmoOtF%mf%1%0P7`c+Wee%>^5m0k2O6@2ixA>7m+}ErYC1!~rx%4{jqs%_)GC9}EhrAa^6xKQhp8?oeU;|J%TmfkjY(frG&@ zKxG{l$Q_M0`dAo3KxTu&3ZxfAuVY{c0l8C!@&8`~Zw4m81dtx^nyC)ZoJ=1JLjV>% z0bn|acIE>AiKZ=o=oe483fjaFbMRW zV@Ob8WXNFht59Zq$RMQ_z@V`%fPrUS0I0uwKxkbAgUC7|28q6#5Vx z0wf1oYui7w-JtI%12}Jj_R@jHQ$X$C#)Q69(007WIsG#mQ$TeV z(*jgEP@AH!5;BjxPLe^VFAEYr!qEMbeYsFMUIq;T1_lGQVg`r4PEb9}z_5;!L7=Y> zvR-^0AA?H&%=QalKea&i2BG=s1Rg(~LH1K$KZ6L!UyL6aq{U$8`+?75IUocw6NH(W zK<&K~LhC^Lf;u2;-Pdt2==61=xxWW0$HSnZHibb$&50pnof88?|5}CsP?~1&1=ZpI zvq5I61pS|}?h-@FItK=ZzDo=VpmkKBJhIN4L1mo-1IIcC@LqV(x^!aKl|?|xdu#Ce z2T=Y}-}@gtCkomF4~|MP=K+X^gh1D``9z`!7c;j;(7*y7P_A!Fag~2*EYBdGqE^zs_fk6bc2Ln_m!t2VV3^9Fd3@)I&0S!lH(0O?v z_k!ANp#CibXbcflX7Mv|L(43G(0FYB4u%*VM+OsN2FRR0XkG}kX10%sL1UdH0}se= z>zKf67C>h&g3o1HzYM%KRib|xLkK9Y!15roIaqk0W?O*9lZPotY6Kbv3?nYP9G103uwM;{Tc>~K3?!%ZWBU0iZG$R6m3Kw0H~QEZz`397u>Khrt(5=CJ!;L47munWdn1!1|>OIX&$R0ie7!h~!>8Fczv zyBrv9g4eH~=~>Fa0P5R<_S`Zs7znLj#*hLs6IAxX&3wTCI%_J0!Gl3kg`0^Fw0Ca( zN`{1<$B?xJ0tt|`4LTDNq>mv9Jf^|I;2faL=muu9^{-*bL2^p~IPHSO)-ogrHZX88 zoCTHn3>*e|49uW&TS5I!P@Y{U!N9}d3_fE_WF0?v9nysUB@78LcY@pw@^}9-h7^!{ zq2)jb*e*#Heo#IVU|=u-wWmR2(;zcVIT={iaWZuDykd}10o|qN1zy8vuzn4L3Fs`! zK3)cw{uy21xt2aYhLHaC3<>=bpmu2cg7xbdJV0f_`W*~0Jx@{ATfxc%kN%nM$Yp{7 z$bFzPp?@Vq0<=u{4O)XG3~r-3sH_8xna{-CMg@&yfcyc{4~qMBoD315Ib2YG2in)q zumSh=O};?$eFr?RZ(tBvzm%b-rvs9nrt&dZfZ`e{JuL*830e~YPfsftZ2CcX4}-*1 zeg-of>1i@3Jx!Hlus}*r2H^Cxg24u42Q)o_`x>Bh0XLJA!2;ATXYd5I7XpOVuVN_Z zccBA2(MqwpaVN2lrcX; z8M=3emocA1o6#>pxql@?31ee|GRQ9I8eVQjg%hfvb-ti8OBq*!(ljJ|6Cize(As~{I5gvVa9R}t-C@~3voQlSehj+19+Yp^L&FW^SJ=8K zkpu>ISY6i3%K$3>c^G`bV|+sEB;aWpyuJ-hKifJc21r`wf~RFuklXsWp>sK*^^l>wU^si$m0G&4k zuJcwiM66%Okg$FYLryO%WDOgrzJsP&P#qW1KeHXV>~w(234-=9z|*ro1B)Q&%t%KM z6;R%S_Mfo!x!~z}6+;0i?XBZtKu^!m{Y^$H(DaP2d<5@z1f>^HyF-A1p%!E&p7K#o zMS@8HR6c^!B&fXr>Hp+|(({zZ34=5F#X*^o4a{ciUxiZMMS#cFL1L>J5F#;Tpa3ds zL1`S8KA`2Tp!yO9c$o)NqrMb!E;dLF()q$WraXnL_k@`t0B$P@s6x}xcLRS04oEsW zpt4Q^-cCY2%ZC9xE)MF8g6BKI@r~LJf|iH+PoU`sUwH^Bt2mL;&wQ|XGuw4=l!sP0 z($7Rt`kBhYU;`>|7+e@68CX0U)~{qJ0F`453@3!v?_?+6h;=D(BWR6oAXQUa(o@m2>R!%zS% z=aAEJ&iXar^c~U5%Af-(V^Pxa3I-cc{j9!(0bbU@)Tl3o^aVlXIdVFl%F2K;7KM?H zeHl0e7l6i-P|8D6(=oIh)RlpzW6*h2@OENP9|HrZjktatgGo<2gGNs$gNfh)23AJ( z0L9)L;IT+Xq_Ifwet3Ze(6UPsRF*L?F#H71GqZ~(FmN*_2!PfWc!AP?9}iUijexR& zF9Wma0tRMA$k|z-)xD~Hd<-HCj~tX44{0c`<6zKO#|rKbF6dvvV6uJ{g9_-}_Vp_u zXDTx)8G!c1N%SuUw^KFxSAowkhK+@S#{l~zKx^n43XCNg*cl{GG%#3lDE3(XTL3Df znQcxeGK1PmAn(3rU{FbBU{ra|z_=j$|Nn+JNc^1t{~O*S@pJ$GZ+M5q&-?!$e0Drc zfBygf4L^|NEB^m)_=&`?{QtiJWZ!cJMut}$+8}#H6#m}_*$WCIv^E&{tXGhGA#E}3 z3{afuG&1lAfX=aHEokVU*-*fEv_P4GuaJR(rJ@0}c2V8(zXh|TgJLi9{|gMPo(!P# zl^In%ltJw}upOZFjGP_^7?=YNfbNn}?fG|rF(*T@chP_FI(>*b*nGPdxcvt@!&Tq_ z1Dj4G13$Q4;9~`!4GU5W8Xpi*U|?flI|w;5kDpZpWDi(QpMjyjv!Q^Q?SL|a#DN10 zEGG_t+@`Ae?*JobfMPH7ykN#uP+28_8216y`wVb56oCBAz*@+F@NdBZ29}Bg5dZ!I zo7v0szXxO|BD}OLK>9%81!|iyuog5xMJ7_)3`eh6epf%I|>lh+HXA*+K0mKHK$p_loqWchhW*{qQoh&FELGs}BV-^ey zeJr3cECE%OmjC}n8W_Oyw|&YWF;M#X|6c(4EI&zBaRCN~E^r@2gMmebn^i=Y5wiA` zkwF7Iz63S95!5ddc)*~{z$$Q{zpJ5ufhCcFu>~~mm2g1S>)!#;{!Ne^FHNzU}0Q;KoKOTnw^uttev3P+X)_bRqE4c;DETJkb&_CDD4(N+~Jp@ z$hfFNk%9RjL+>*N7G~xH%KhsZBEac}8I-;g85ko@D1zM1co?Lwkb!|Gk%58#AOo{f zgd$^Kh9Wcn0pyGC-T5L7?~(U|`S$g>QdP zmkB7mKy6^v^9+ol{S2c0I~aUKjxz{@=sp$(hCWqLs$yUeXa$WcgZh3Aclwt>$}^A* zXdOeJ2E={qI2c&^bQw56^RS@xxuCl^K<0q@8o~?=9Lx*`sxUJd6@GB8Ukp9>dNE|Z zF?hV!5^~4KI!Oi==vmU>b2dQfT754Abj_GL`2J7O{0nT%Qr)tm1U_!b&cFyRllCx3 zK=nb-3s$=W%3HYff%cT6>tkRmXka`lpxCpRfk9;{0}E(>$7P&uq8@vIA6ygJ@8H1WcoiSu(H{96<5|2QK$7Xl7vOS@!=A*pF;ZObl#3 zObl#cObfag*cWs%ur26dU{z@W-S_eT?SeKGKjJeV?!N`i49qypXIaq6z`CG=fep!g zv@lRr0L2|>UJ@Lp$3S_hpn>sNfghFbFSVVG!z5`u{*pfWd@; z=@b(KlM53AlONL}&i{`War}R@Nb>)~MNI!6^r`-T0y2|Hmv9mH%(R zYFG|2F|eFrVqkG&TEy}H{UXW#?-oh?f4hj~|C>Ig{~y3=n7o)6m_nEsnBtfgasU6k zi0l8SMV$XXE@JxsVVd&)FJLvyNz99Q{(oJ>{Qt`|rT^c+VoX`gi+KNkU&QqP+cf3> z;JIZ6<|5`reE)wgV*dYQn#%uQV0A2@aQXjx5zGHy(^UWe0gJJM!sY+pMXdk-OjG** z4=l!Xig}Ub|NkNi{}(S}`u`7_hv9P)pmeRimjOCYs0?2JPNz5(Sj5aAh!&?pi&z+h zam49^MI8ShE|UEJXc5!@$2j8j$s+FmPZx3hf3}GA|8pF1`eG5^|Cft+|G!$q^#3)E zIDNB7^8edK693;VV)_3bN1T3G#P$ESix#KVq#!VVPas z`54oJ8UNoe=>Pw2LErzk3!4AG=~)IX1K3V6F|fHXF|heDE$ICJc|phjPYY)L|G1#- z|A(H%ureTsiGewWiGewdX+h8b?+d#Be_PN6uCu=MEQjWQ_ADj__7Wxr_By5o{r`V2 z===X`LGS;c3)=tx=vfTS`^<-!7?{s6F)+I^E$I0Ff5FWE{}#;n|5rre{|?mp4{w;E z*A3Xh3|==ZXk%c<5oRwI^!$Ihp!@%;1?~S|;|Q}i3;O@RUC{Uc-Gb)-?{S3LhXoz~ zKQ5U0|I>oD|DSP$*_Q>~|GzHi`u}Y~^Z)NS!tBR_zW+ZL^#1>~p#A@E9AWln!OZ`E z7tHt%%2%K;Lr&-T>Qi`oW3blO;Cu?JpAq?$hd_S$K`_58{{Kg%g@K2GIf{vaIfaRV z8Ju7KFX;LIZ$URW?L9?Jd*JqgGN?@eDwm-77Tq1_X%L$`P}3lGcl=q<^Z)OHZg6~p z+<_dQ;C2cFA4)q+gFtxPAs8OZ|36Rx?cqi(KOQgW`TuA^_y30r+W$Z3SqyE9pq3xc z7xe#swxI7n$emAmmOZY$ zKRz$$`~PV{@Bfbr+L6m4l=9>If|>unEtmlOIDFX;OJ zYeDD#p9|WM%b_GD2Id?l2IexR1%3bjFX;XM4-^j~3jdd3NehYu;s8A@V2cCPw17Ph z9xUkj|8PO~|3?ej|3AhN2TvCC|9`rm@Bgy}&Hta{h=UgkI{v?0F!TSb1#QUX8cH0z zS~Zj8LD&DE3p)S* zTF{1EuA#)ip9Q`D|AO))G!9Vn0iryhdtZuyt&jn!91tLo|Gp5B|9+^nFbJU4-@h01 z{QtF}8&Y3RSO=*u7xexAGhzMzzo2%{g8u)1r!0oHmzfVSFPH&tFW*9K8{u^;dOF4C zR`hg=&8{}*b8{JakA=O0i%KL^=^=4X8FA?Rl$_xzZ!;{Q*mdwwCg z=QpwLfsBQSg3o_oV3TNINRv=zV3ueA_aD@iX8`Xl zVrZD4%CNXWQNV#AN6qm6nMwTr|4-uk|Br$H5Ch|l6N<|$8H^@z{{K6P&?RxvR47bq^%W6+x<`Tyr6iT^(sB)u4zIUN+2X)x$a;{N}A z64(E44BS}^jJ^qq%XApDCh`6MI*I@P7Y4pl42(YyC@!;L(3r&e|MMj7|DPB*ofszZ z{Qt$7#Ot!6qji+2uw+j(bB|+N!nar2^fO3I z*zy1Sgcbk4LFNP|36Py@&6N4?MJxUwf{dr)D|&7%@vri zq!{TVI3X zg{|}*RAHmhG{r?!Eme_bHz}Jo<*gl1(Ymj?}UAqomZ-dHhW{C!d zW(7qC7Yl8M#TtqN4;a)`TK<2Tunt;g^HniSSo!}i;}6h!G$)1$YySTM&B-%xMKLgT zXDF`eW#E{w?*H!zJO2M-fT;ZmSG)TE4~W_%2F4t)T9ygx{(qma(W^Yf}@&6W7?M=Aa z)&Flm)FwgFY)%HKU2_APX8S?$h?Zsv#W}HQ78K{irdd#&6HK#6asFY#j{hH_e*J{x z*UvD&Lh~{x&fiSf@&7GU?K`;IHUHm3)WX9M6z4A{?D+o@s`eFJ?dt!pA!^}q1B&w} z6L$Q63RU|Iu6E7;=Mc4Ub3t(qYX3Zhs(l1kyZZlQh+4S0pg6xXVaNZwP__5qYS;X~ z4^ay@7Zm3=ChYis6RP$WT15!Wugf$G@6V@?sfyRI)>|o#owP_gm zPcckb#lXRA;h@OC;l;q{8KJnQn}K7(8V2?W>loOeYFXiGS2D0b)CMtt)~2oLW?-4H zhJks)ItC`FT1L3qRSXOewQzG8L=ygA2DuxaH^K2#h|hoUJ_iy0d1G+8+ zyfz24E(dhq@tOmmwNi}}7#5(Mkqp`!!@}SI-%ANTvlX=FNPRB@RXweq0-3jIqU`yW7K)gZTl%>7|m)ps*$heCM-_hyw%9ngj-s{+5O{P&3|u=F6damw?;_+V|Gq*Z{iU zUU!W?gG2w!M$ldj4HZ_%K3~|`SD<}VAUk9nz-LG)K=mlBv0!lM-^ri>IzvoY5qi!5 zcKfb??c-ozgz6PsqXD*0q$h6s1Sb+GD|i*zvL8XI~*YSt()IDo*tRMqBuNbR;7+64S_dxFGGl2LTbl@ zaGFwp>fO+%!XVM7${+yJ4@#dP^FekAF)#=+2xuGt`J+#TK?LLnkQyZSa)HPBu)Eg- zWCqxd{S4@5yg=6z{rdwCH_*P^2@O40bxlhra<-PWOWL_Orm!Ech%#36Py2 zw}Rt_ok0TRUa%XWXUB;+FmUznV9>x}R|`Dd?_kjAgPb*>uug(O2Gn2f)nZ`jZ)|7) zh4&h*+ze2fN7}Oojk~`N(73w*iZgH-x17Od%>xF8{`CwFEDa1MYacK$Xe?x85Kv$+ z)Hn#H4M1i|EMU+B(+3!IKy?4i1`E*r?dq0`!FxDCdl^CQ1MN@iU&a8s8&3(Wt_9>K z1_qE{LE$9Oz#sz_Z-QidX<@LMneE^;exNV{>75Y4z|g;n!DjIe z29^Gukp0gLk`4|G9R5ygJsBAKS2L*euVZjv;7(*<;K^rRdzJxoP8sMta05`82{Hqc z_y2&`e}m!zw6+!GHc)s7G%#?1!UR-4gVe(81^ElahlDQ!!y1L$oc<)pwQ#O z0KVTxpaE7dG~NKI$Iy?YXN?1B4?|-|j|(h~K->zl3*=T<9nb?_FA6e^fq~(0fi^>0 zg*Hf@@w|XC#4o?Wt8x zF*K;~Gcd35`~PQ+|NkHTI~Ww!I54oRabVzB1F9E5;f=P=6=LVFAJBBPVf`ismGv7L zK;@$hcunYo4pq=uJg{?ALF=a1FJ%Z(5oBQOWBUK6kMI8v2BwMz#zWwE=IP(bkg$&b z|DXPujUEjA8sKwB)L8!i=-;TBxHHJjAhrD~7(!rYriwB!Fsm*FSkcW`ObpD2;*B7ii75!VgZ+JSI#ps-7R<^Z#LO7xlgW4`92` z9<)b-;lT`5&^ceQ^TI&)_cA^eP-JlB&_=mm4m8i`FhNy?88na2V9l^#folJ}hJya> z3;_(!Hz=y#W4OQ+ctDw1j6q6;jX_uJ0Ajs9sQwW<$iQO5*uWqTJ*$X;4Rrq73BOEFsW&IZ1Fq30L_11LQR9ALN)DsOs@K+ZW9Xkg$6g}Fc@125Uz)z2ZIybA5#Nc2zaRsr{E z^cWbxXTWX(-wiDydVqlgbRH_Wtee^Fpwhzd0c1WXC&K#z>mhrGM4@}{plU5tS{RZ0 zU9i4M59ka^m>GQr;Cfb}kC{QEPl7>*A?bu7vjw>B7g7mgVC-R87fWliOfq`fJQU)Dp zSURY*F#3S}4$=>51A=LE`;!(*4G8t@o zDj6(5{S*eyfCC_NnYAJm*H$nvfXwV)!=M9lV^1!F1p{9NSe|jchvHft1{RP!$j+W5 z$h|HqkqnG$D&coTfX6;S@{sWR06zZ-WIlTMfx~VIxSv$e4^Fd;Eg*M;^x|~)APKwv zWeggi@PmaN1KUw1 zW3XXZV4=#e43wWBV-&D72|A-56s{^Qj0ZsB+P|E^1Y`~12fwR#eV3XNRSx} ztbq)MISl-aJ{hXZ*MifR1t^@rcK%>s>0iO10}3l<#uF;c8Xjs4oY4#n+`&wY9tmpe z*D&a)uVc{ZJqSMY4SZMC+J(@*)*=RQzYsJw1W9x6!1*84wtwyCd z5hoP;L1z}S6&zsjt55{pS>LY(DR0)kVgT*g1odelW0~;1&~H;fb z1^bx?tOwLq2IoblEg1 zRQsE|JVYEAgx4f7Fkl~VVR`~m3mzYu*#_DFuJ8kVERbXiyyl zj%Sbv$d4ekAa{fO2@-?&@iqAT*Z!8?Cm^?j^n=_Fx?cs9FF|+Pg3eaypV? z(7Cu+`{b{|@sB0kctG|e*=++3w?0T49u&SHyFvDX!malZB%O&kFz|!M13+UWkTNzG zd02Aegj85lrik-8-V&)P%~`~MHsY!LhZkAB7ff5i3v|5%&&{|`tF$d4d3Aai@x zF);M#d#`7ms7gRFX^nm=ahT%sqs4d5HpkYEjgN-pC1B>C$|Gyb; zMyM{xX0QR--M@q3PcP_ZZi&K%36%`CAXgY`|F>s6ouRrQm%+AwW(WA*V^Ep^$${cV z$De@_6n2I`85n!kfXkDD-ev{{l@{hT6Y?N#F+BbMAG0>t44eL$9pFAWvKjqL7(QSV z2iwuw`=r0Ws{mv+h~GN{L^3d}XJTLhwdwlTG5isI!0-x`-vkdZFl!!UU=~qecn0D_ z%K8oml@@03_ytHO$jzX$P5WmyG^nsLI5b=4f$vurS71o&U&HVLG|t)I0-g&wus}Nx z+{RaFVYmU($KnV%lNu}!nR8kIk^}igWhwI>kQxE#`IAU$b|9$%wv1vxyme1(a2s7`Q;^*{)v%IUiyDS_W`A z-M^UO324p;G={!LiBSRK?`DVor3^aj7c)Eo+tI=d8oL3V4Feum?w{Fs0wmAC0GU4o zsROwI%`6ohWZ!xA(eV}@pkAbnjA2J`%`#ulcMiYGiIXfPl z7H2jxz~X3)ULN?2L(n;ap!f#+3GC;FGi#I>Jycp4!Sk>xOIcz-{s!9twHGD_76Zi# zIL|e%P+!Vmf$U!vM+Q#yB@723@dU~{ED6Z+0t^iN;JgL3w|^N!21s6IDN72-POx4q zc^qsnr0)IzstZAUNL~1N1*k3r)!m@>07jjB9#XF&^}ic%*2&Gi;PeP`W9lc&49s|Q#Ck7svA9}#2Gcz#s zrZ9lhMo$g{kNSEB1<-lJ3@jN9{T;ne7<&s8*B)eG=mp)S!@$7M3%;3!fuUy+M30Im z1LK;N4B)veSX%^S6D0f}f$x7CeBsYXN%&h#Wns`#NoBBL=!BoGW&#a=@R`Oc?2xnl zLE+Gk8U7~d;XgHnK?|f-g`L5Kp`AgpzrUfUCx^jA^*v*N>Q7KOX9$7f0i*^LH{iM& z6ekb=|4=>0z_a$?{~x^%|NjyF`Txh-ga7}4)PUj~6mKBA`d2V0^kjk4j>%MS2Ce=X zy-yg^LF4iXLX0{YifdOeuz=1+1)1Lujo&GYpl*s}U|h13K?{^GG2{0E`2MrO7r)?p zuVMWsSe_;}e`)lxFvzH+GH77QU*Ng{G>!%;kHF!D8NVu^FbByYH3=F+mpfZbrf#DRmei8(ULhAfx2L|@YhV`q#Yr&xH zUl#ECi~e;CD*Zj(pm7@=(3xH!J-xk<`k8T^gkn!VI6P$-*bX#+&fo!s1!8RD_5n~{ z7^GnV&ih1$1-PA0L|CYR%46(daSPo4hla%ibkWd)22}wE23CfK4pq?EfS|b{kwyj`1||mwkp~Qdkh|&{L3a-@g7N?;je*KM zQ2zmZ=SK@@tzR>!to(v34^k(wzz_~{4`|&Wh*mRXT+lzW z?FZ7DKG1!j8cd+E#+i*0pfx5ScY)OQL)NxH?$d>q$tunN|Fa~3=A9TAK(ko~(a4gAFJwLF&O_y$3QE*FUoveT-D2 zPm_V6zqO$UG#93_lyOPV3Xsbf7#KA`=0oSZAbrAso)*SAATw1U<9pyV2I^OWbgWTg zoYOzE0~|vjH6Sst|Fjtx`nwu>Kx=q5U3&{M3FH=#z5O%WKA?r8L5~Y0 z9@Z}a-Ax3(E0Y7{K4|zGfbSQb+4cdXA0!Ua51LQvac1BEjWL7LB@?5E3Zrs>8Uq(- zE-4vwC$a%!bB5X)U(kKV9U5we49I1(0TX!q`2QZT+h%s?^e;gfQvml{`zJJj#&2$@ z2{6t9ozV%g8{9TC03~`*y6fN1V6sMmaRHbOiVNr(ul~&p8vR=sbkz4UctFZA#wC!r zy$oLe*FUrE0rdWIaN8f$&hBvpo2{U}j==-m#{#v17#JAV-UQt-)%FH-$0N)Q(0Ef2 zNMH~J)kgw}kofEI1o?=8p;rYSZ@dgF0S$~U0m=+q0SydU5sJO3|Np2kGH@`krZtH+ zGO#kRW;1}!a0clVU|_I=%w=HYBL$HCpm<%s2v)X2+zSzJ`_R9X0eMaww9b;De`ed0 z^@|u>u*U5Q1{Y8~_A*1_k-f`lG7#Mn= zg2J*xV*OIcT6mBekQ|ua&!7TYmj{Y35FZj>7x#ecuI2{NnHncll1q>DB!Slks0cWK z@19oxm;Ve3s=enJr-0I?=0VUoeGIB9Yz*vc5+G?Cl$Jqp2MPy}ed`x7fco~}yaEyj z*#{EuUk?&*=mCwj_ggYf>6c)fpuU(v2Q+@Vem#Q$cuk|E!vWA9m$i!je}L|P2I*a^ z^Z!pz3dpVw(0mL-Pb$QJAb*0)6<`3jb3tzA1hs)c^*UrsN*JTB1(t_|g#~I@T-X2# z3-!JKPk{Op@c!X41_zNt3|#A%Gq`}p7;HEg_9|6lL{r2Yeq3xdWi*C>@9 z0i_Ahosj*@A$KFe!UVcDLS_95=$*@;aV*dsxhohe=snL zGBPl)wE&-o3=UUFSq6;*SJXHF#S^HVq`sE{EnLsT?texJS5TNT9I#LYr7v)po`Z(z z0hBOhhlMF9y@CC@0K6VVf#mR94-L0L8VA3=BQK(D3wS zVCmI^h9~H}Wl(tPQyQM zU|8eFz|zaYzyUI=e`ebqP`EHOR;Z{xfvimcxe4k|9cX=l(jNicjSdbANEzdRTE?7# ztbc*8y@$jdNIfX-Kx#qp2PvD+D1hP_bmttXK845S2FTq@>z6P@fbucOE$ZtSTwrx7 zXl@!@r>}O)kP+?rq0J=kgbNyP- zohab=ap_+Qxleul0*GDx8yGx5=HN&-F3|8qp8rtj-vPS&uI))b3j@RY4OrVypt{=y zlt`JX%^P+LrSZl_A@9?Mu5!))jgm+RiOH35ko{jC`~$pH+*!BkIACUb$&X9KRglx#z zvSH5u-wSdWY(Q}ck_W{FQhITKlvT&U>z_dTJ)!9Zyv7T(CkwO}3*5ny0YfV9=YWr+r8ZX9F|NUq0|funy7g9#|jfW}oo>1J&= zxZdUHU(aB{z3t1$PO9+sHF9!yU9|tH+6f1LQsiCch?2Ee0kA zE&*);2L^V~*j7&xWb7SOrdj4N@Giku=KBIND*LQZ~*B6v3mj-7*yXeFfv{M z?XzL9T)&PXMMaK*T}7OMTSbh4Peqi0O+|!3Kt-5=RYiz_Sw#@sRs!`&QQhbYjvEsO zR=Fl2WdIBscwoEtFi3#vK~Vb ziPz*q)?CBJ;X!I3<nAxEL z8s`V80f~dgd?g$h{J?S(A^U#8W6;>f`x6vY`>~Jrn}W;&jp2f53dj4EKxTmYbqp*W z2l_1`WAx015{f+;knwpT4hAu>nn?`>AX+U*c#E3h{~v6M3_L2ypgo|?4zTfbrUVV} zoCZi8XiNk|_i94SWCWR+1u;{M>;DIk89hnhaeQt9YkB|!J{*##< zIn7HM%t2>dtX~J}uNbI;?im8b-})sCIv_p$AbMtF#d^>g8;Et>3ZOGLKyCoFu|V!Y ztuyxtK+@8`2Mnxb3=DjA%qu6(I%&7Ld8d zk_;Te3Jh`T>lhAz&NTtGQ$b+?T3Y}zyMH~SLH{~NjsBSp7t}W}8~~YN`h$rBq!)BX ztO^?gWWAeThcZaL3L`^;fFlD-`!a?D0u0PQRG9w%1+i5a3pfQ1GRUeh7J_JL6-Lei zfrAXpDvX?kA_qb703JVV0Qm)EKZpjI2kI;J&+M3h+_&n>V*s_24M2C-g36V(HyI+J zV~Q3ktOcAP{VFZOpnbLAvGn%!42Sx6FkH}l$S5bEz`)(VlhFWl?>UHu>T^(O5dp6= zgV_tFcQP8N@c#cVt_!M?K2X>)FicQoa5$l=5&_m11JwswM;!uN2i330 z5FrlM_x}$>4+DeY5AfaXeCu~GWb{=sFsLtOSkMn0cNb}3-~_1yjYak^XLtZ|uL>Ij z56F!mH?KX!AOezC-^j4Q@COTM@E&AN3dkI=zf>S|ylCct*Q=)GbNY8O z#DL5fRsiikU^D=k2U6F2gaN#QA8hXqMgyohN1*yy`at!|9tMN8j~G1qcQAs}h_NJt zg0KPu-};>l5lH5^fXqiT2eQT=6rKokT#(FhfSMD6WR4G}IgH@*Sis?lFvkaB4kKti zAILocNah4!n!|7d>Ms){e+3}SVPJ&1#|LCi|8ho&-Xownc@0%$e}T?<2AlJoff30Z z34}QuF!y*s%>m8Nser;8%^XIkIUGpls36Q?5P-VJ1!N9Le=l?|II=nY%NZ_!&0%9e zHpc>C4in5h4oK#J*A_v{f$YubU(N`b&tqfoKynX9{|-?5o`Hcu;)J%a0)sp#TtVi5 z=-vyEHj)?vWK2j{fkB{uDI zkN)-G^ug7?lfeZ^y$+Ik@H+i9eheBQHT~-uE(j|yfYdu6sdqq958h|6#*e|KeA(z}Ealn+Hg;n2UH;SSi0oeVcXdKn}u z8W?|8C^PVbX+_YvGT=DluV?_7-+P=P0BrtxxcMyoI~Xzq7?{Gr=I>z00K1ccK^ScQ zI)*3xI~g_lcQ8C)ylDV2FCUa93K|%1K<={xoBNzW1Z*y*yB)#i?qrAno2vjdcRj-! zsJmYvyBmvpUBKp|x;I6DfeF+vH|gI2>f!!23sCog z+GG}>cmkQ%dmOS(0LgvOz6j%dka?hd3eH1(4B!<&f(IDN`xk@rF=&5Y2A2Iu1|YZh z&+J&zzm(xd?-NM=0gX$5{13|Cp!@@(g+comKkDq@D(s%NXrEs5{p5FJ*Yq`-B0UFHp>Yme){sgkbdxs9iX-V+yFe?L7iX8z^S% zWC#KK1>9a>@WE;Zs4kw_F{6Jeqd@NyNP0jqV+RAcE{D1UG$(@T7l=C+^e=_fwOGOf z+^ztJ$6`hfJnmT0zm(xZ?-NM8qqt)+BL}G8DUrZ16WoSm=uidCnZWvKAb*0>!yX2M zem+q9m4Sir;t9nyk>I_A86bJV2MmJXGR6W_zDcM`GcfRi_&xay0-!XVT~Vy2-F;KI}TLd^{-=y0h=RmpkYcLgBG*E0cF7h3_PH)2ARVw za6qy5Cqn>;4{}dWB!kTwKL(R2`3zd-7K{vQA{cC#_!|^K=78KLcz{6=l;^=_g4X2a zL*^GHA3*w#ptgBW9)m=`1%n4D{6OKx%zr}B^acaVnn(r}ka-~eYC#N)OwORW`2SgI zhM@KaLySrhcuhqS$R0Ka2Jlz`dYS{-3o1K$Dj8%{xc~nE^`C?l7?MEiI(zaM9Qt=K z%mKNbf#HX$-~)yj#v2Zbpmf~h#bBcTpMjAvKti!69gD z60(L-bSLzFYdw&Q7#OA=W6%;{U~pxA#-R;z2dFPQrGi1LCzC-&7}S<~$)N>WZwOk? zIQ1E14yvb_fdf4D`53(Zo0nl3hj!0QsC_#bIKlir1|5b>4lTiTkoKH_0s}KhoFTyj zbQXfPh{FGODlH5q3@6+WMFKRU|=xTWBAV?QN_S`UP6_D`3wVtZI zJ$?)-pnJU;4_7FzeFnPEn}LO;@&7Nd`&WYF>M4) zp#T5b9RE)O$%EQ*{p%PFdLkfsgqg2Gb&WqmNdHa-@LEz~1qOD|cr@rdFOYh0IR=_{ zfwo&g;}oEJr+)*3LjOhv(7phT{>=qcGY=-$zm8D^bOz1(MT|0_{mLNyYu|z9K^xbA z%m$eQqCsu~&8tGrQ)`k?StsN!uz(D8GiGcP3 zn}F1T_3U5--`#C23EpS*w0{TVo&Gh9A}V74|4TM79O&Q4sIz_nqlEfCh73@d*S~~O zV*LWhzFLr(J-*;EDUVpIW{Es(&ln!&+Cwa1?U)CblPe88}rnK?mm z?G6Ts^=lY))~;r7SigXgW9mjoUKLVcnA^XDv19!LhKOEW2Jn6GAonq@b5QK%hm?y# z=NWqX*D!MQN8Ia!Wg)i7Ozm$YW)9GM1g@_tC4{N zyf;H6k%4j23DrfC;PqZypmn@LVGJA$B2~bVUjCQX522J zD3%NvW0!>OLz>xmrhhpj4`>Vll=j!JVED6sCF7O#s}O0be^4#o*Gvh*1KZ?wuGIMST9dt_SgVGU_mJHz*4$FvuD4 zGB67+V2}i@Cj#%MhWZ0E7R|W8Koyi1KzUT9g>eHYkAm|+07`jnflwm~Iy(xU2UW8{ zasK}gV`6~{sK=xtY6P)0?LmdKN<5dG6*&>xc0AQywksvQ3h0AFl%Qh zu3yV2BYA+ql7S&YwSQ7q1t_no2!PhQfz~cFg3p5n+1umKz%YFWHM#e)GitE=iI;>yJC?Qhu|IG45jNAIxFgk$zF4(}p3<`(!I~iR- zbpNET3d3~_Oo9g(ocnh&-T{RlC@vXaA5dJsgHcAZfx#RUKG3iMtwnkRD#t+a1#%x~ zeO3Qj#yRVEGIsQ|RsecXQ zo&I%?OtP{L#<;~HpM0iR(23S*GJKxw6)hXGPQ_%LwxgVo^)6OjB`#tr@J89PAstzXBu zruPZxTw_Lw{vC_~pgf?i%fQIYlAySL4P(IiwTu#?>%d_G(gPX`mJxiwzzp*H`W=iR zAR3gH3}=G(?1R$Uo&L3qGX3irMHp8XD6U_}C?oj*R3AjBg3<~`n1IguUBkFz{SL;C z{+*0_`q>x^K=BLm7vszfMFuv7hV{G*Isyk6L_qll8U{R|Fam`EC~QIJ!Grt*($o6` zqF*3_fwO-N;|{#(10)Z!a~)#`$gcHk8F%y^VKC@l!zj_eo-v|-Eu#pioMU_fPV*7# zcQQ(d>;6B#ehK5A{&kEIpgaLO_XJd)tY6O<1EN7;Va&tOAlSeV4dR3H7AQ=S$`xar z=>xQ$cL(E?{xys<)~{#m0EI*EGw_-@a9OhUCj$pK9MU2bq2VBc77mQC@}u`W0}n_) zsQl;$nTao-faKRO&VZF4>vu9v>0QFW0~&woU&olxzmri!ori&u@d!ALC#+w?C?PuY z|AqBS7-xXWaw?bOCZKo(xg8Xi=;gRz0t3tX)r<+Cum{PnU(c8V3TF`8n1=&Yp1bs~ zXS~zj(GAL9GQCU;44`z_6Um?fN{gVd7gk`9UB8ntqsJR8meb?R0J>9vQ6PaqoFTyg zG>;A{lT|=r3rb(0bOv)%{|v}{D11*k52QUK;KRTP3JXwr>u>3*LDvUzA4uLvl7U%R zfkBd4p+S{d0b&=p?pw~t1FH8xc7gN~S?7Vy8iCgXh_C{!(TxDrpBeD5nAlZg_>PG| z5Oj|E8pb=IZ~>KXpgqfs-Qe<11{^jF450G8pvRkmXZ=pb5(e&y13k_RJdCd)=O_sz zFi0{!h=7F=2PllzuV+*Mwevyl28SQCZUXJG1^FAa#}-WAfQ)SjL_pe}ps<4Ng#!5- z7RDg8p!fsRpfYwnql{rMgM;7#27AWWClo>XY5h)c9gVxJg_J7?z~#zX#v}b~3>Kg? z1+s&&w*peG@H3cz^HT~uKk0z|18di_GO)n&(+!AzXt{C#>~;qQ@E$b`x36J5&=0b6 zCu0Z5uJ!8~5A>@rSb)owb&M6DvQf1cl%K%mN(H!#T@Nl-j==rBld%F+w+JgRFoV+f z`gM#oAQ}`V#ykv+f(;B>ptuFc<9bG!9$y9-P}qRN1r(2h3mD|ruVrlL@n(=&zmu`0 z$C*Kff%_l>DE^p1?HWkCLjvsI9pLx_&mp43Uk@a$_kwSvHR>mhw1 z!*>h!KWZI zF!a8Is9Sr00n~2+X=Uh_gov$IVBi6n52}NDd>CvPSA)we8Nmhysr73ZE!MARwCQnX zumSlSyypybemf*AERfSL$WV;D4n2cGAd-O{EDtJEQTGOd`#t?L8*BQPFe0x3Fah!V zXEtsCjRk}4VF2IFV4}jqEZpDQRRSu{Th}r$fZVlw4WkyQj|?ggU~3|luVvH#rCsQn z2=Lq_tS_q4B8q$tDa;KWAUh#;f!9ER_5hfG&Ytbx$RGhecVRPwLjM*9mHw>^8vWZC zbo#e581(Oh?CDY8%XkB_K4x|cXk4Pdv8x2M?+i2^vjn``3$~wmHu(HMfd8>AfUiMhUE|8Y(%%nRFQocjdf^mjBgFy1(! zx@ITnT%Ph13@jcEjGO_Ay-o}aAibctgX)Exe*`)Milv}I^?msT#`6ah`<(zZDWEJxj}vfXowEz`)nPiXo#o)vP@X3QSB5iXc58{R~`jO}dE;4gw0y*FpUL#)bk0?uZ5kZ4SjAZ5i-73dWiU zMaBeZIkAQzrhhF%jA#P`zu`Itd&oFT;|`ErAiGtTN`TI|Pyq2k=W2q?1c`%akedV; z*vmlnt1vMrg6=j_VPw!11h4mDP!&DMVAa2aA!hn|$odV#9}M#13=F0qG0>Wh=_?uH zj5QeSMLZbz7&wCti8?UwFi1u=FmR_G5^Z4Mn!bb~4&t7MGa&mx_NpwE0QJEX1Q-~k zL2dx6nb`muW2<3c$vUKN$qugH85bz1g51}?1RR!7`N9T}JOiKFA&^<%{gI%(7t6qV z{|Z214zdSy9}-AjWvRpjkQpF*Kz;|wfyBZ5Jq!v04D9A0zk~b(_6rAty(j~N1k^8L z;Bzh|;|_^}_B~6aIxz4+_B)9#WDo$2<74sL9FTn=dqDPq>_M|n8f@P>hM4}&t^mXH z4E7BC4xn@Jc7XGcD`adAtRIvv7{KceG13bt>_O?mSewBfkv3#wKxQMS4b-qb1P@zg zkhyyp6s9AEtw9fiJSc1#8=&>>A_fysx&rx!fw!=Mfv@fm1Fx?G183MF27X5eMlMjh z20Ryi1{@B{7)(I!Mhbh-JyQw-3~cxNS2HA_x+Mzk7Dmw8N_4l(fVc(ZPEh#4;~A9J zTS4b!G@N1JDRlt3sec)R322@b&2G?`2FUIMn08~PF_duVgxC!_Zxd=aXbc*(Hwu)e zq3O^Ok`6gA(xCx3EI@gGIV3#RFM{4tvQz>zb_{aUY_OYFGsLLyF{Bw*Ffa-;Ffgm| zFqDAC$=0u7Fj&8i!2mV9su1Dz09(Gugt&(n;hyO$7(ne;1w$?dc?PZ%P3w1p&Jb#V z#gzf*+-FdjA-V4aD6Rz<*owjK1La+KzQl|#)O>jmV!s63esGwfgliu(Tn`|nFG$|S z7iOUIDM4Z8hv_EFFah}o7XF|)SWx__ER_I_AA`)WMK(i)mw~B&DMJkdix)U-*RN&B z0jUSYJ187b{f9HYL3@s|l{+s$W(Y8_DS+%$kz`<6zmp*c)yzn6n1SqM;8r^XQjf#^ zpff2!?&k%Wg=$73!VDgW87N`i4-NAN7-5df-CscN5MW^a1hQ-TT821qy~OKvh=J>@ z11M}6B;yV-a5_3La$A7z7-msfD)9#_&cMK+vQ&}*T$Zk7h+&XOYyg$V3_N9r82Bn3 z3|BJ9GrokZF9G`#T>i4&0NaC-)`GzC0SXt;{2$oAp!LEmCmR?f)eeEyfq>!-R91o1 ztX~A4BSJ09x}p9~!0;ei5%3$|^ z>SVrx1_nJ2#U4F5NS%DAK#}nPv`$7UR~c9!c@yMT23}|!tz?Ml@8}9K)B@+t24;;2 z#r7QxaiH)5g=KFV0|O|GKxOIr9kB94QUn?|-5~dY-2u;^Skl2-hM4}Yt`NiZ4Dt;8 z9u16IClveDKx=m)WdO{4kh@ftN`mH&6jV4E7zG$ui`K6It!F~6cQMmyKd3D3@A6^b zDQjZj%V+?(8{~e_dG@_(2=_zH2eq#iRJg$AN3CDQkOHd1rh~#*(y@Vo16;@QfWlg| zfq@(BH*h(R+>Vh1mnoq0fCLy=JwbbW!0O;(fF+!f;=us3TsHxwZBUppaGh)F@9y$p zkObAmknmyTKA_mo2I?~~n1ISiPm@dJap1_KKtV}uGQzt}J`|A+1YQDA0FQ0ZUK(7?b`(9qx6 z(7>3Np}6)f14FN7`591qLQsK05VW2e)V_eZ2_z2kNB=4YxZR+(0Giz{AT=PhApHUi zEI&YH60E#1=m6)L9UylyLfZ!*xApgR`7lVNH8Jo+z|97^sdpK~U!XJ!(xb9e5`51f zsGlIf!18eYdWM94NILgn;0$YG;5yMTeK|u6v&I3?`aMWJ#Kyp2@P;~-x7hqsnx_%`?LjNL$nCXidVi=f$4lr`GwxK`*XkLYZNd&ZS7c_6% z-cSJAE1>dRvZB8o(uY%dE(yA`Q)B&d1`i~$6#@(l%4lLc1Q;0P(8Nv%Ffd4>i9HZt zU=RU`i6lVg2|?yU?fn2^gVW4&$sYm?;PX3>?3DtYnZ^pzi%=(}0_Jx$G=Rzo24;^2 zRj-PG{@yMhP#MI)6W7!a+U>(#0InZEpx6ij@k!7v`qXb*53mvN8FkiI1V&0^F%04Ux!+*gW6rN@?`xw z(0Z;PoGMGDd_ZYQfPqB>c7gLNq^|@zduk7Z z0=oUkc7xo4Qm?FohcURFD8Rt{6>K-OJcZS-uy8~zYeDD9v)3^2qxm1y@14=*11e8J zWhtXXg5vbmNd9j_El=04hWkGQ;(z8VU^lE|h-qKR5XZom*}%YCcS!UBgJ}CshB$2g zU%ryT4IEFXz)tYdjP{eKce{5OszWxW6pGz#InlKh(`g?pT4<9a!QC>=w}7!7Si@?gNaz zBhE1bsWl)w1Q?i2L2f|tFSJh#_HP5E--TSBFtA4*VoZS42}tQ|2h==84D+zmU8v?| z9b#O7VIJswdr-QCwEx$G+GSlShA$cH88`zP7$Y6v^=U5~r2GWAS7oWx1&BMC{)5~B zt>Y4mc^K@m)o(~)4()R>eFW=U#t;LGI|epTd1Q77NiAsamVy8S(=)KzRgg9_0~e^R z?siC*kwHvAfeGCI2d7^ShXw`>4#ge~xj&#Z%_!rb$Ox_bKyAV4s~BQHZ9oQ|h$g`V z27Zt|{rz1rhM>ELakMc(;ScpMw9m!B3u+@8Ml#6v&*+K)l|!Ji0OSWydDPnm8Dmjd zDh0Za6nt(lNWB09(-v@>5+e;tgZ8i~VC02fr1BR!R)t7|;J)b&&^}&}+u-9DIMbjs z_)cj72Bsj zEGXZzgYvzFDlB|K@rB3-(%?RY00UDz$WJKw3S0g~s;3#)4;^A=K+gx#;60xL3{2i2 z^FZwY6-EX@!#)Ok(Sr=KAiF{1l>Mt2Vhmq0FbXO#FoVQEV=5}_3?(Y;3~8YI2n@48 zV`hmB{T*Eq;Jzu>i3U*rMfH6d1E}1FwNHDs{vQCP8BiYpe$VVuX$wf6f}CptDz8Cp zbOy=7hW_rZ2nN2qL!j|cP~8ve2dHY6F~Gux@nwJ_Gk1a_DE;-i|33hV6P2aX@HRO{ zdmc7^Bf(&=&i((7ZX$z?fC9rJP`e(Sm*8W<^5C`d$m4#nx|)F{)j{2o9o(j8K#UK7 z`k59CEJdJx_6|@R8srut(g(DS!uT2-{%aXxKxvJEx7LAy-|r9uXF!vn1A`nWUxUO! zbt(gk6W9)r`LI3(EFBm?#`tz%DW{Rjn^*_XSTd;YWZ*Gq0>vk&?F2GUWvO%sBrX__ zgWUrz`yqY;$%Fg_l84&|$*(&=?HQ0f5&i|;`=B7ez_=c4K1w^F77?!e&^|rp7{(4z z9f@ogcuWqOw+$s2!s-fZ`TdpA(ceki!YI1{j?8u#Tfj zL+1||J;CnS0j>{ojJZMiI-!AaW&xr;Jce8!N>2f~9~91@yar0AAUi=csJ#u6GhEML zulta}T0nu(5T4KYD;gN|ITU;J6~KEz82?l#GQ#f6gr*4w7GFeq;Do0KMEMCV?~wcn z4hL911;q)@w&gMgd~pJ9rwK4HvVp<^k?)ca`L01h6&&|_7!(X0lh!+V+yddPjV`e)*(M%C#$?d?vua5C!%(cDupj z^;qpj&qpx3cOaz^klhkdhp?2Xu=b%f$Zl9Xg7Sd@w4D#1`+}Lf6JjodWD#iG88n~k z0NNvn<|lAFQh8nEdSkRyfI=7$Uzz5KIGB)eCGgz$O#$d93 zD+A;_?M={oPK6mj=fB%9DRn3cF@V;lO;GKh-cZm#t)ZcRYC}Q)l!gMe?=lW**UAs5 zZIv-ln<8Ul#K*uWcz{8YL0CYWK}e#3`LKf`WWVnW@S1d{1_M>52L`Hr=NUM9B^ekP zA0JTcXJ=r5?(;pv1YHBev;cgbiw%h1kGX~b>?Q^Q4<|;2231jo|BpcH+{F?YIQ#d* z#vvMafb@dmOl7GIsND&^;}k59k&Z!e%V3@cDbhhgP1{VF}42=B~x*7x+7?{-r7#cuqa9o4VxCiHjjuIvY z167q484swxKy6f;{_U(h>RT8d^zUQ^ujK*Bf%WZSun~H|zz#YSk!gW~Drg@B(}N$J zObMK|ttY5((0?J=Z4GOBD@CVriGE03q3#cpspGPU;$RNky zut8P$0A&4E{}Prb%m;pOG9Q4LDd51s0kWrmX5$W!IUxNow}AFi^)F?40g6v_x&CD= zPx`@rY&gRZq5$5Hud-AIG&XJn8p8$YV{v2<2hl=_*%pefapuUD7hB0S?A`_B5>zo)E7z8t%7#DP?iZ1y78B~{Gbt5Rf!2`a|q3EE$%$*3Tp+5^2q&Cr{HUoZip4s^yiNUwnp*gSd0 z1_9LxzL2$D47`P){RM0w`3Xr-F{Vn8d7_LD1XL$PFff7Sj3pWPg%u#?O-O=>8F+xr z<7Q+KP@Uol5))8m;0$IGbbzRv0#(Pr6b&+ukud@5zPp|3b4tMHKY`A5g@q3&Y`|f( zltE>JGq^mJU|=p}0)>-7#s3eCKN3_I_%JYn&ZwW@!oY0U%fQdT8OgwyTcFCoQpq&I zlYzN&lB_mW9_%SdV=7Q8DGA!_BU}o$s0EsbA@n>K%)cF5_f&VZQ$dAk# zU~#7Y)eI^iyBN4L85q|eP+btgzyv*85qZzxPW3s(FF#Ko-fRHD z*z_z#J*SXiVTB6lo)Osn3gEk6mqF^Xo*UqMm)IC2&NYcEGB7g;Iy9&VGBAQ@MkWo# z35yvRR2Ugl4Kf+*LH7`dDl%|0DoCg@2nIATctt4o<}fg*u=D?C;K^kYc?*gY1_qEi z0R{#o5Dgj&5lCdc5l95v$0LvkK4*{@dd?s}^qfIHkwgYg&^^?>KcMDH zoMjUEiDE7f)La3uT0w^f1`iL#UM;A4u2?3K*9i4$h78P8)-W)sFf%ZN&e|8rW#9t4 zSFoS~W)CR6F`(I_X2`%YVFd#d$e)Is4E!RQ3>+~3g4Lt>7p#6ADEtmIFz{6}iR3eI zfbZ4@%_)I2aQHHbyhL#qOV1KeITX=g(8a(nlEuKm;0?O-1f-aOfq}P_N#q@>`U&en z@p7Vpf&UI4X-Czd;Kd3BVkT}U;sP&(pSt|n6p3+|6&A>FlnSse* z9Rt5X4gdCDyzg97}!8%jKNL@eq&7renyP|)dgM*j36{-HK0V;FAW#=*m2hf?0pm=29s|B5{X`}m)|G$6&gBYlu(PZTRFQNcCE{uVp z#|d(GG3Xp6&|MCo^aNgOu#~}KJ?PGe6$}Cljut8mOr}gKEsEeX;@0nA0FMRtgU;_< z0jY<3DnTiOfq_BNmq}Lz6QSfYO%w z63{slkn;mU=W>Den@`@!pknxg!QNQoKlm@We_2iYGE&Nra^1&S}w9&c#+2kqkq=>w;K&>5uD*E8sV{A>E-|A*x}7|Pag;@j1-x&#NNah=?U&ElIzLr6!cL`{HPKSy5A_fi6+HP=MgT(eQNc1mZ z0G*H40os=i5(mWw%su^!5N9t!@?@?KDC|J#2W!0x+6%RZLBjM0L&E~lUXGa^9iVVR zHy7$p(D?v6)#v2gfSL)qlLmaoC`dghK0sjtEr)t~p!ZoIyAREr2~cw|+DsD=?s5RT z3$3gGnF+(7J4>cCF);MBGO#c(RWUFy9b#hqaYA)UGXs+i2g82`)*^-_GZ`2dPgJNd zu;wxJv@vji>U##(Q_Kv^K@1GcQB0sbZ>;&BftfQvm4PjbfpJBJ3IkgiLr*&c&ypSn zCdTt8R2f*~m>Ad&F@x1|{%2s;3{YiYFJf5J!@vSIn=Ousf&COS1A86=NDasin3+?W z7zC!wU=UincS178*c15*_fgG3M$gM=3YH{{IL2l_!gdfjNqSfwhWZ zNhbrit;G1^gbD-eF|faxB|TIbSc8}ief~2n>0@AG)QM1KV9f*h3#^uz=EB?yGZzxRCSY?B?$rUC%M`~1 zZa0I%7?d8EgP0kZk1>GE1*L^GeGCR*GnwOkpkO&@~^DBblmF>rv>7E=`i2Ie#-P#OiR1)0fO28u%wu$iDRfvDvHo6DNU#K4ARE+~CAF-U;TWrLe5 z05+E`4V*9F=0e;m12z}x)-}BhB4Bf|xOYk`g96xGsC%chF(|F+Wsm@y&78*6)6Sp* zGMj<*5XAjIPN*`lMKLk31%dn~vt%ZN0x0i;$^~$l04opHA5aCA1xtDul)z;SvV&+ysqhD-~iddz;+HC&Y=7ZN<)m#BUBie!ocMo z1CtZ;nob5DL*D-kpgi5v${+!@=Xrn%1Jf}k24+77kewj+fZT1!^PgeOOa=i+xK@GE zfehnw4;2RHGA0Jrb6~fE>@?(tl(`^3ubIIh!oXI=!1x?gwt>p8V_@nnm_#bRO zTN)F{+%B*ufXY(VC(VR5xHklBE*qq71Gis5 z`HejYe8v~ZTxcB_0XCBzq7GbM^fAOh+R=&N{g3K<|AX$N1@%Eda{@Z+w=ig|-@qUN z+Dpi=V1X*bffb;61B3OO8C2G9Vo(6Li#I~<+>~lyOlDx1p~}P{p=u+<@Lzo+gM$qV z!+(Z^1FB34CsbAP89e$K85qiNqU7;hd>W#BJjHoWd`x0NH$S8{x?TmGwIr0zhZ9gWSl# zTE%Sm?mt8SGKL6dy#uNYtaVJx{2Hp@Ho}nuDhzDr7?>?8KzxXsmovnG!-uVmiJ8wp zm4W>f1GCBjaM{fGqX5KbHrD^o(7%Eq0W>zizACos4{S$VqjJ&P+{Oc#sE4Gj)D6Wv$4g0(0$A$VE=KSV`97+p~}Dm3iARL z2A(fZ8i?2y8FdP63de4XW!mfcNq?tY6Dev3?Ch z$@;RkSsW0Ecu_E@n(hUf_w(hxtTQ}BN!yg8W{M_ADWN{Qd7}j z_=ADP@aF&DpmYmXw~hg#j_;TQgT(nm5VI;A4Bs&@8B6~E3o~!>4u*P&d4-1zZ!$0% z{$TjWY*C=PAdkUj@=k`j3Hc1Rp!rzCpa1Pad2m4mgKhtMsM-9dnx^D4*cn^M|2KU1 zfPtCs1Zcd)V@V~0T~9t(e?0^Lu|vju4D!bM{~v(T_2L~2^*xo4F&qZTLI(!E`a=x- zCmoFS7!;TpDpU=BGTaB*16G$0RmTt7?|J?ZgJflc;X4KgW`+~0#`+BVVdjCu0OSe2 zlLwd?3RDfxGt@KdA5aCEF(Hq^cJdB}ItIRzO~(2R%*K5G|A4}G@lJ-i{&fsBJ)kh= zJJn>&FaMwMC+Hs6ss_e)C)5}us~8wR6{s*sLerJxAtqx``xBHeBtdzuKot~6>(?>V zfYJdd4S>=DG3h|9n1NBOLB)xIk%8?H12ZS6eOSl9z!t@9nDd_j zR1bmsUuOtKcM;&loTNK zWz-hX*pB+%{|7*4<$}j9H!{e8>q^iZ`+*KnJqf8Fmq6ByNHH)>0^b3$n85+m-vsrA z)R!{ofbOtWImW=aW+4MZPd;Q{%9`~IEIo;k`L{I-89-;lgU8#zV<_qYDhv|mAbnDa zB)6=3})+hFc|bK1o@1CVGZbR*HutAWHGSxEQGotkpXm18u&~I2L2)j#uF!0 z82IxT82FQz3}^gjVBG1U%4iXx%D^AS#F&+#x_&K#$pp~+25&-xp~Zh@#u?x;hNFKq zgUJ+-ICrQ60~ct&WTu1RPUZ)OI)CJubq=U5sesrsA(MfVfj^dkfjj&V16Lt~;aLU& zL(Bi~8FwbAF34fv?BBs)0!j-E64gwMPa@P9xIuSz7Bev(@lX?BU@%*g$-vQ*%fK;t z2ZK2S@3|&p9R_=2{{IIU`y*5ruVygs$ztG`zJtMxfeV!XL2EiQ8w_`{A28?Oi|G$IWv3L!GSx-LremE1*m@nf)PKX>#A|}I={~4I|BUBkP52!NmhB1M{iJ2=wb^RI! z6O=fBp6j|M4>b-%F8nW1Ne183q|y(%|7RnE3@BZy?_~hptG82qPJ|3JU4rgP2eso= zK=%dVNSEM!Y*GviA3^uc^e<-c0HsUyWef&3tPKCb>GC-PGC{Mx;)6h(UT9k z*J%ytoTwcP;BWw^Q4NeVYJoM4c7VbRZyGfbQ({P2zk|V|=O9uVJ%yA;434F%J?D%#-jw&tIdQ=1|9~~^vct}n!#oYNE~;11=}+rlYtjcdIgp}HiKfnfsZ-0+K z!+r)n{{{xm^g|3hCmW0{7#x_nq4J>ei;d+L@43Y&741Az+DZ#;T1_Ki_e}d}b zHBk9ZhJOr_<%bMUF)%WELiF|TfX1!FDF$ZM0u=^{ItB)bBqqbI{|t=pB2*c(JX9GZ z@|YNPPk_o~1C(?QJcZLQD zRZx8n%HusL3=BPK3@i*RWlRh#bqowFrx=(u0#rcl9tM^qCQx2w=86EF)2hnAc8Y;n z6V&fWVg`?$r!a7=$zxz({1KpP*!`b@(K|zx0bKu|P-S2N)vF0A3@lO1Aai@t7nuNP+?#zf|)C@rh z6EiQUZjWMM%q)P`?R6lxi>%3E;9-0hpbF{>Fh+pPO=Dv01&!esf$BdM&|C)8y%KA( z83aIW6=NPyIsusr9WMs?8{{{ZB$#_;*5omWp!kgi)V2YQgF^kr76o&!!kS732^7D9 z+ASczu|WOCQUo@4O$F#&EhK-j9Aj$9V^9J4ZA}h?LQ4*Vn&J8X{~7qBm>BqiKkCwuR5GYAummwMdY({W0J}L36c##5@)*<@D-WoG8 z&MAZRoxpJiYGY+FgT^|0QWy-@WHD$k<{VHpT=yT+pJD^GpFnX3a&v|X1K7=R3~MSG zbU^n48lL*kz{~|Q^BfbX9muSo0BRSRh`9dGTa$xm7eUjSKPaskEM@?mgC_|}Z#``c zpz%Z&P#OWn2P8c~(;6FET4N7lU|_FfVqiZ9?(>7%him#67#P^In85DkiBM(Ct58*8 zVqg?-WiVOO51JD@ae#p}-~gkGgCfIBXd5$$0ThNT;PF@{&>;hm^ux@Pp~}E?iV4&v zWL#IF%J}MlDg#Rq1E^gHZZoDaaDdvdjNKWkj3+^19K>W80czh=sDjq(fZPt6H)CLn zV*89fiEtjPw=k0mjI z^UV%Wc~t-kOGq0t4iw87L%)oMp8C0&W$z@<+ z)CT3jFeWVK3V`}l3u~Jnx|@ro>>qekFrR&qJhk)GMTR)I&r&s(%f5ejhYPz`(fdfC>Xo90RB? z#lTYqT32RZ`0_ufj8$de31ec`%1~wCu3}((1{$MDVgilRtY6EZ!_4QQYB=*h1EVEq z3@49i@(uH}))cQEMmuB)fWnF~FG1Cq>p#RS&O9c@x6rl#a$Nm@##IFaOAk_9i3N44^%K;Pn@RhZwl~LHj#e8rDG8<~F`jX@QLQsw`CmuR9T7U}ylZ z%UBOOmzRM-_aXS)m^@JG0`J>{?Q9b^EN^9yrmthro6yO?$iNrOWEjc7Z)oxV19;4;kAZRWS_VDCQw;nJ zyp9ZvTwpsHC+}p?pU@3jD|Da25 z2UVE@nlt5%WH7A!|G}`2fuC6qypD-?Nk0Q10%Gb z$sm!$3~u{qLEEenpuW-xP?@K{eka=a#tsG+P?)Z%U|<2=2@lHe3_Mv3jLR#)^g!hssJxlHlfi_6yYPUq&i{H)IkI>agGo;X0}G=AsEqMzVBiGxu__K2 z{$!{yJj2iq8oyY)9z6cSZupAf2Loqjli_LxcE&7lzsjVi5?t1qFi0jbF?NFbQim8A zB&wJgUxNBqMGTC`PpB|(hcPg4XEA}tGjL$(k2pvy0PP(RPzASX*ctwV%6~{d1T@zT8oPteMX(^P2LR85gWCR} z^+`_53~YG}j9Ce);5l>XS^!Xc3|uc~27uaA9BXp^{}6Hg|6)xRqHcz^Pi5e3Dtg<$ zlz|15KS5~^z6RnUWDNuZ6U4uu`5(|416<87d6iX$%b9PE3Z#>mRrg>mNYlMQgekSm0|iSdrFbJcYZ53A7#q<{nbr z0=A*J{XvsQ0)M%;qgvT1+DvFU_QhET3^EeTCcOdK$V%@L4|?YiwWdUL#_Xy z@kdqAnh)?g7ts0{);tEr-U?OFx+(BF5B35T239Yoo+j|PAp_$(2USoSVPH#RV3Z6{ z1+AF?jc0?_doZ(CsDS!b3~XLZps{4|ICC?Dh@l3kZwo5(4uS1sX3tOo*|BCOc+3k_ zPBMYk*BR>lXJB-UP+?#`$H2gx#0;_vTo!2`P-W%?tqrPUV$?5CUDE+s@3y9oK?EN5 z#DoiIO%rGh432aF3NL2Rx;Lb>015-p+~SmO20qxD7|_}g23BagxB*)4=f}jr4Qj7d zf!F#mzR6GphsOg3jwQVed~i2{+LugaObkqQ3=B-C7?>3u!2JydrXVIm@Ba+U93HBm zwlO%)dl(o{^;I!2BGNe4_{PvjOqhVfq6)PBiUYJ>2C_y7vOb7`*$I+PB>#ig34+s! zq=zav9Kh>^(ilK_201)H;RQ_zBwq3fYxC$zC54;ntx_s4PxqPV~|+V%OC`bTaeqCL47~gJSIj^ z{sPYd1*kyQgn`$O%B<;U5MexZLe((mKLfK)hAIPF9TRA6D5(F-=oz8Hz@Eg!z+MJw zUns1Z!63nS`UGU0LKig8a*PQy*22I9>Ypd5Ffe5?LD%1@tm$HqVLWp})o?v%%=~~V zC~tzsq!^f?;}pzQObpCr3~Ra>6d2E*PzB9%GFt?wGBC$6O=)G&n9|0e1&W6?J)paN zvOsBp3F7V`hAHg~I#W6r^uX&;y%SWI%w*75(!-#|z+T0~z@Ejxz!Am7z!AhSrHR2{ z$_xf0m^#p!)+I9;be8lm=poj&MuFD1Le{oI%rXGQ^^zV2BXD_-B|U?}6_j2;Wh^Ld zLCSda^b9TYiC^=ETISH-35-k6A3^Tq_SlZZ8M zOrU&9Xw4h0aE663D7<0e3`!GFKX5?G4b*T3)iI!a%m6Mc!0YBv))s=?11m@2p5`Q4stJOO(7_}p=BI+9VhboLXe$cf3rC;fx;WKrVwO4 zsQl<@W>5jI*95OWEd!TzpgI(kenIX7`FRcKTz{0hDi7>VPf%nF& z=?3j_0QDLn7*t-XEMiCyH~_h$sizMzE+GirpCaJK0KQ`ul*bqt1XMxyC4zJs^zyi>{dJGIbGZ-X5^1{&lhYZdq6opmM%b*q1r|Wv+|8iC;GCc+m;l*RBiM>&M=yhd3L66t<1)~F z-UUJoc@l~^+z-Ap8_E6P-CqRU4_3p-1~S`22#=e=^SMZFHXz_;15ns8@D?=SaW8mJ zEs}e|_bw1{FIWvjhJ>O)CId6*JR^`jNMQ>;j|A?{E(Qk%=LkhX2WZ%)qJ?b_1Nh!> zh8zh+gIw_4V5sS(6>?uL+`K*p4+iH7MOgY0e2Qk?3{Op)IR!Kh&_A=| zj{4sJH$dwn`rCS6fY%Fx&RGDRVX%h*od4DLGC=niStfw>wDyAcWB06JU{GoM{{wUn z2k6`f0S8Dt2s~hrW;hPITNIk7A4BHCSP~hS7!nRBGB6)dV)$`Fky#CVUm)1sJv;|mWnk#}0dYS&1Jpl97+6$z{{La<(NJMH>Y>P};Go*e z#lT`PlL55<&y>+8LZ#;<1B0O-10(1hHBr!B{v!#>46PN4jIR|GdtNbcXf!f1h$t{{ zXeu%?2q-YHt28k%_4+b!tnFgpS=-CNv33mu&srY_4v_fTCI%M977azsM6e#uHA@&6 zdU+XmdRZW4_L^P>9#Ibl=e0|~_a-{7dCS1T(5j#awSx<42d7Fi0~5$@kgu@X)y%-O zwwZxNwSs|htpvzU2Sot}2HmwR3=D>m42Ye4+45bPdyhNB6JAoJFo zV&GYGmVsmKG6tTtZVVhC@wKfC3@Ymwn4oT#T62zp1&iB7pl%lexgBJOhynvAqe6lz zvU}0Z2g!rYU(dj_<~#$7Y7zq@D1WSFVqgK$Ab&#U3e0jqX&#hE`dfQnfbKe3zn=lR z56vt9CI=E*zlT8voF`fs_yrjloK<-L|LEmp;9%%gQ0diTV9{t~5DiwUAp&P88k5LP}2b*PW3Il^_ z4+GO$(Aue#2xXHV21YR3B|v#?76XH+7X#B;Ezmgx47#dG3>>}M3>>{W3_QKM3@mGN z7CI!;hKeKTThz8pYI@5R$gM

    |NkP649pA;5}Pa*Q&&q*KLZbF?<{D4CF6qws;mzgm_Ym782Aq; zgZ#W^2Kerqo$7OpVf+6d^v~=#0rDrv9Uy;#!Vu)2^-CF4`qx3+(!UHGC&FtFF)%Q= zDJZJ6{Qtqwq@m2fR-vr2ae~wjA`bt-=XI`0VPIL)%)kJe0|BX7tIq&B?;qS=>X(GXJ-Z?U6SG2qDuZNz z@_H`NJ$Vc!D*Oygy~zw5pz|bp(ivD(QWyjn9ww+Tp^z| zLDwCE`aq!bN(5XXZBPLR$o*2FebFHO0?@XHhy$dq5O83S1&z`6YyinJFbIK;&thO; zSjWJ?BE-PJ3li<)gZP#8AjHf*aBT`!%L_e`Gw;@t_819)yu$ zA%_+?9qeI{0F`y>OBi&(X<%l@1(5xqvNUP2E_#f=zJUr6uXe+L17Cjqd?&Rx;qS1{($C=K;e%KgXFP^kBW_kz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQLSwdL^k9;K5)TdRBl@1v1COz`*eTKlmJD(7YD7 zuMg%ks({8o*g;N!@a?m7ay2`aw;O@0Lf17w^EDi0dDK{kH}ntIT^ z&v1E|+t6sxnXDiT@*4<){ECjjXA491f#je}Fa?r>jtYVKD1-o`Izs^i14te`?+TL? zU{vQRU|WMkhp`2GB5}*s)N!eC@w*MKo-|2 zU;y7;0!pvQ;wA+Q45ADWHzAAL6fiJ|!NM0NA;75aQoz6<4q8iaeLlBN{X>c+@F$32TcBXC? zRt82!Nd|^SNu~xKF$OLMb~t@YgN2C<%n+r(j14p0QeZ*BT?$f6*zhd{P9`{3VPU$3 zzzke2Y+&5w!o~o?TrT1a5G=>Q1pXnsdz|hDb|BpqM6wHhs*Y_9{m{G9`^F0PQ7Qeut2*M(9 z3`$@e1iGgIDNSBrP-TFnQ%IQr&U3Il0uDPa6&Wzyr30eXn3`17n3{CJG^nhEmffH- z6jYXi>LnN(EDbuY8H5=bm>58qL4k<@Csu@Nfz-F4@|YE*7lc82K^Q|XSPK%NAjH6+ zpaiyqM}>)jMMa2#MFqlVP+?+Vau#M_a#m&lojStg%*?>xU<}0|>lncL7*x0r1}Yda zu&7vp`Ap8n3=9d(3=GcP3=9q+?=nF7)^K?y0g(3@7(g@xL(F9oU}gYe$aD`>FIX2E z0jjkbn4mQ!6I2h#JcxcK24)7l7-WwqR4s@N!bp6WZ6LS6F_JtetkE$<56mCv{zK)1 z;s_Z-^dd-PIT#xx3u41)5F3W!ZUp&5fSCbwiwPJDgTjai3^EjfL5>9lJ_v)@_%KKf z2xC*j!vJY7f#g7UpR_{Tw+sRdJQ+|nNDhWU=72E5B@h-!41^&(1PN;2fZLD=AutPM zuP~TJ909W*T{WrV==w+bqai>_2!PTXayo|;CXjvwNDgKeOdQ51mIj#(!o;c{Y3e{> z48rLC28n_2s5m4o(kdK4|6@<~v0f~X|U>8Ss z-zcB{A%L7;Kxqbq(bFJE41`H_9Y_xdqw52SfiSxGNaKUrdLWGMZ;%)WkBSeC@gH2} zJg#~H6t^HuY5aofC=f&4T*E=;EM$0r(6FGzrk0 zFt%|aP~3trnsV@%5Gms5`l-zag#ieon+p;HVM@i(^^fxD9|Fkn2xG%&m}}7aFmXaO zNFN9jQa4iNLG>&Mqx&Bu2EwD_v~B-`R&{|edN_l`K$uu@(3wq;vx`u5fW$#-`cXw8 z>*zpr$w(JR_dkpe3L6lH@nJMb41{5P7!48wVHlqf4VtS5#SOYTkT__M2Dc{aa`drDh`QpT89Iuj0a(eZ3q(72L@q;2!sU^17Qdc zL4wK+%ym9`3``AJ`Y-?g|NjTV2<=p7(K_5{Z9dflWYj>CLjV-VFik=X3=B#z4iXJg zgRQ@cqy#Gyqz{DAB|%~!j4nRX_@FQaVRV0k#6Wmd980;%01=}`_<%N=fG~PEgTz1> zT^tvm51Rz2><3{iav-;ZFcvASLLjvuj4lZh1L2`6j_&SJKK(-gIsJgvyn)s@Ba4At z1gaN6av(M-7-S9zqw4{QfiSxGD1S5r=otc_Gzh}zc7nt}7+oAR#tFjc;*y}-u+Rme zVjwwmDUjJ9JkrI{{Xfd5e+VF_Ll7H=kzImK3|Sr*8<##@;<(HiuHv}DVN@IvEF2sha9V&dX@dY`(hdQ}qyqwsNhbstlP(A_CfyKV zOnM-|nDjz`G3kQ3sE-4h(*|L5HmFYn!l3=tP7DkTAk57GIU^Z#PBOZBkQpG1 zEDqv>Fg7ueI0z%l4RJPOLjnT>19-yW0VuFR%f&!69D~Ln%iugTMtp8^era9_g8~i! zIYtRIYywK2APhd!2^3}wvgl@|7sRJz78l?$3{^SA-3$z%W2aDMPeeE5xS}(oevB1pFLdP?VpXno?Sn8efu_l#`0?6m;>! zMFfIJfk5ym5C|SnQi4Sv0|V$JF$52j#e_LD4?f5Pi#QwTcrHE$eg<&{2?i+!UQnV2 z=>}T}N|vC6hGGL)1}x&4SCU$kmzaYdRu-Qpfv&$H0eK?= z^2P+@O$f;6Waeh#F2{B8dtX5}$OXUoA$X+~bdfVCC_$iM-L#xcd?x6o;geNR&`l!{ z{%HilKaD{6rx6JMGy>s|J8OYMLN}d&`_l=yKb?U4(+RjAXUPF}o`Npk+^?XZi@zFE z&@CX~zXAgOD8a?!shgWwP>d%C!18#404$Fu2*C1qvY>8WenEad?nJJen3I{FXMyS| zaLhvph`ga0E(H*IW1K#K$eZDGAw(V&zPac@3wD5RdO>`7Vi8)XgQdWPZeD&~d_iV1 zPWKfV8yMipg1SW}1mw+#koWNj#o++mB9MNca9p*#Zb?yMK`HJ`28zGbRNRG(Zb52l zK}r(NQdT!Fzqq_0vjA5$q+48$Pdg}o6j$aJrKV%aTc8Ng&C9PyO2XlJQ2COWo?aA> zTZwK(QW75LE9mB>mS<$<;4Fo8Q}T055^;K8K{u_SxFj(rCq6G9Yar_8<)`Q5C*f>B z>gMGqT(6*@o12=Fmx$N?{DS2C6rAyE zW|D-b`2z|cW22%}oB^ntT2WG5nTsR#LG@o|GM?4fMJ7fB z%11N2@+E1g212q0oYXBcF*Y!W&n?AK1>wp!FayAyJO%~^14AQY6H_yD3(Lf$Q5m7O52}vnw8Cf}b1w|!ghynug{983aJz0>`z?grl+XnuvVW9J|!F&(_ z>*m75nV0*sFY1Q;Kw2rxd<5ny~|BEa~_Mu72=ivZ&z9|6WkAp(q#Vgwi; zr3f%S$`D|DR3O0k2y`C@I8+1}A2kRtKI#!*d^AIV@zD|i#z$)e7$0pAV0^Skfbr20 z0merc1Q;LP5MX@tK!EYl8v({gKLi*bGYBv~<`7_fEFi%6SVn;Hv4#NSV*>%k#})#N zj~xUUANvR}K8_Gze4HY{_&7s=@o|m-XWBjE^e>7$4UNFg|V&V0_#n!1%aB zfbnsU0OR8c0*sHR2rxdLA;9=}jsWB11pBdjuGtP7z>yxoiqvjqZ-&z1-BBEa}OLxAylg8<|676HcR9RiHcrwA}UpCiEde2D<#^ECpD&$kFLKHnq2`22_f zU$U(^UNzGx9(e9Qz!YvH$uUZ(~SBWsVf0bcy z-|oZU!PdgyzWoe?2fGi0`>qlO53V%~?)#T8cnI1sxF1kq@DO5w*a@<`RfNI)NDYH~ zhYW-JNd*S?-aQQN7gHGAC&@6lUuR%&pS*y<{l*^#_t_x~?vG|LxG%3@aQ}FL!F{m@ zgZrBn2KNmc7~KC}U~u2w!{EX8g28>K0)q#~9|rfmJPaPZUl`o?KVk3?T)^Odu!6xu zc#8nz#{~k69}fsHe!L^V`0G&-#Y{tzpoHr{C+@y z@%sY-#vd#Kj6YNa7=JhjF#d=TVEmCI!1$v_fbqu~0mdIE1Q>t35McbtBEa}lL4fh6 zg#hEv2m!{QB?62;mk2Qaydl8&^N#@IFAV|4UmgOCziI>+e=QMU{B=Tr@z)0d#@`YG zjK3`e7=OnIF#c{4VEny8fbsVO0meT90*rrb1Q`Fs2r&L>5McbXM1b+n4FSeKKLi;6 zN(eCiwGm**1nvD~5n#v!P4jaIFl2(J4MhYPGC}t+a|$qIg8F|V0t{K8>2C=EhO8yv zsbo;%AI0dHuE5~YV!+@rje)_Vje)^q#sUV9P7Vf-Ifz+kkIoJTkGTO1 z9$gO@Jm!Pec0l|Hwi9G`^&bY0?jsByH4hj(dUh~))Qd29^v5uGG)gddOx(lZ(b&P@ zF)4?^qv;QW$CL~PkJbtXkLeE>JX$6&cubqX;L+Z~;4y0ogGZ+agU6gV5W^W57(BX6 z7(C_~FnDw;FnG)d-3(|v8@nbVp}7?#I`|ziEWDj6Wa~}Cbm5SOl$`PnAna8FtMEwU}8HX zz{GY%fQjvf02A8-0VcK=0!(Zl1en;q2r#kz5ny6x5ny8H5MW~G5ny5$5ny7M5ny6h z5ny815MW|A5MW}r5MW}r5ny6>5MW|=5ny8X5MW~W5ny5u5ny7E5ny6Z5ny7^5ny63 z5MW}j5MW|&5MW~O5MW}TAi%^vLx72WfdCWx3IQhe4FXK;I|P{64+t=^pAcYTzaYTG zenWtX{eb`z`wIak_74I~>^}sU*#8JHaj*z5aqtK*afk>oamWZTai|C|acBrIaTo|N zahM1&ao7kjaX1JtakvODad-$Yarg)@afApkal{BPaU=*ZabyTEaTEwJaa0H}aWn`p zadZeUar6iCXNjPOdLA|m^cmyFmap^VB)wSz{GJw zfQjRQ029Xx0Va+Q0!$n~1eiD(1eiEE1eiDl1eiD_1eiD#1eiEA1eiDt1eiE21eiD- z1eiEI1eiDj1eiD@1eiDz1eiE81eiDr1eiE01eiD*1eiEG1eiD{2rzNZ5Mbh5Ai%`A zLV$^Lg8&of4gn_40|HE(Cj^){F9Ok0!&;C0!&;i z0!&;S0!&;20!&;Y0!&;I0!&;o0!&;g0!&;w0!&;c0!&;s0!&;k0!&;!0!&;X0!&;n z0!&;f0!&;P0!&;50!&;L0!&;D0!&;T0!&;J1emyH2rzLi5Mbh3A;847L4b*ChX51T z0Rbki69PxTdnH-i8ZH-`Wdw}1c>w}b!_w}Jo@ zw}t={w}Ai?w}k)`w}Su^w}$`|cYpvBcZ2{FcZ>iNcZvWLca8uPcZmQKcZ~oOcZ&cM zcaH!Q_Y?sp?l}TX+)D(QxYr0Uac>b|;@%^`#C=47iTjKI6ZaJXChi*oOx$+_n7AJZ zFmXQ-VB&ruz{LGVfQkEq02B8Y0VZycoBjwe@h}K5@vsOm@o)$*@$d*R@dyYo@rVd8 z@kj_T@yG};@hAu|@u&ze@n{Gz@#qLJ@fZj&@t6oO@mL5j@z@A3@i+)D@wf;u@puR@ z@%RWZ@dOAk@q`F4@x%x)@uUba@#F|F@stQK@ze+~@w5mq@$?8V@k|k5;+Z4B#Irzv ziD!iX6VC<#CY~JvOgsk!n0QVIF!5XvVB)zVz{GP$fQjdc029v}0VbX=0!%!A1ekbP z1ekbv1ekb51ekbb1ekbL1ekbr1ekbD1ekbj1ekbT1ekbz1ekb31ekbZ1ekbJ1ekbp z1ekbB1ekbh1ekbR1ekbx1ekcI2r%)^5n$q7BEZDEMu3TTivSbv9swraBLYmkX9Spd zuLv;l-VtEpeImfb`$m9?_lp1%?;imsJ{AEcJ{|!kJ`n*XJ{bWfJ{18bJ{z8C=}z7zo_z8nE2z7hc@z8V20z7_!{z8(Q4z9|Asd~*bt z_?8GT@vRYH;@cv?#J5L)iSLL26W0!;jC1eo}@2r%*Q5n$p!BEZCdMu3U` ziU1S;9RVi(Cjw0TZv>e5zX&k#{}EskU=d&v;1OUF5D{P!kP%=KP!V7f&=Ft~FcDx9 zun}Mqa1me<@DX4V2oYcsh!J2CND*KX$Pr)?C=p;1Xb@l$=n!BMm>|F;Fh_t%V2J>e zz#0K2fh__|0y_kl1P%x=2^CFbOIMFbV1iFbSFnFbUcSFbR4HFbM_-FbPHoFbO6IFbQS|FbNh2 zFbP%&FbOsYFbQ@DFbPf&U=o}mz$CapfJtzL0F&Sb0Vcs60!)Gj1egR*2rvm=5MUC# zA;2W~K!8c`g#eS_2LUF*9|BB53<69-90E*20s>4z5&}#@3Ia?*8Ujp01_De%76ME{ z4gyR<9s*240Rl`y5dus?2?9()83If~1p-V$6#`5`4FXI;9Rf^369kxqW(Y6|Ef8Q5 zS|PwBv_XJLXomok&;bD^p%Vg3LKg&>gl-5h2|W;C5_%!PB=kXmN$7_FlQ4q-lQ4$> zldymQldyyUldysSldy&WldypRldy#VldyvTlduQ8B8D;wI2jnAReO0+W=X0-L0V>N zP7116a%qtQc%>nz%oJT9z$CgvfJtNeD2B$p|osDF`r$ zsR%HMX$UZh=?E~183-_mnFuh6SqLzR*$6O+IS4R`xdohv*a872u_XdbVk-og#MTHfiER*I65ArcB(_6Gj72hV+>X^?;}vPLWfb=U!KTcfCzWdJSwwu6f~?AQP@@c;k+f8b&a3&Hyh&niz!C~i$35?)7jj`E_q;6LP9`_-_(P7sb zgeD{w#NJN0h{G;We;Ce%Ga%~b!TAomKETZxuL-hGT+X}$`V2nqoJMjf--VwMM149MWyh^y3!x@nC z;9NKZY#yA)z~FFZ#sqe-f05ni0Wl9*-30}x`;gT+K-4jwhpTkB21{4S;imyn2Uo?w z;Bf5?$btX=|3~((0j9d^El~eXLDIbfQ{7Dms6UX?Jr;X!;YrU-esDV+Zfi{72Zsx? zd05NG|hby4wA%`EV{DUiFaCp=JjbCJS&~$}R#^CS-IsOq680q=R6XNWB z8Ujtv;BjiGfzW&j<$)-NcO6jkkn>vvB>X@MpxEK-3y44doq>vguB3$KOXg6xn8SYo zsCmfw2%6uR+u`aQ*nhucs%YYd!j{G{f&0|pon*|~q1*YK6Z!F;LRUl;y zj)Dac^Zp_EgAp1oEbd@6Ai_~J0iy2z6A%}Qq3NClk#`&=GN9^^%wvFsODZ~l9r>X7^aOIJuXI0g{cE^!RHfjhmhM#D{X3_)4{1sBJNkB|)v zka{249|92n!gVn)IEEpI8$trZyl`ZH;!zg~x;GIa4`X4N7m2T(2-C&D;21?@x{pFG z2N3!(?2XQWhBLB%pydH8qW*P^bAY7N|5p%(F%)2iU&0w^J_5}P!IVzGRF|#;wUcahD5<~M{k2FC&)X!{D;A03$fsJ#Gn zA96VfHIEf^XEVf5$9jDI1&A6D>DYiRexc!%Q~ciI+ceZB|DHJI%o$GJr2%XufD=@~h_K-)t|HaM=w7QfK?5=C7NaqioK z93BV*Fyd{i1T_5cx9c3YpMd6bWPi-SO!s@PK-D3e2lX#2qK)aef5(J+aD9Ya?n2{@ z^*P+Zjt5QPY-9$8KMo?h3!xH2-6096`>@%25w6kka0fJ;k<~%VKe#Fe2FJsHCP4bh z$m+19=aX}wMkJWaFM)+8NU}`=>@orMcq$Cp9M)fW;p-+0nO*g?u44hC;`{% z_)i5IAE0wUpu&up<$)6)qHPXU1*X8^2WCMCCq8`Rrw}zD(uvOmcRFPc0x1DwClL;4 zxFClgv>ak@2CD%PPNE1uf%q^Cb|3pB7?;6G6xQ!X4j0V);UpFVwU>Z8@f@f+Z0GSNx(09+240a1r2h*4nD$sAAq1*?D%PUa=V*=w-@q5+Krr#~byC#wfg^9Z=l8rF|O9 zFFB^dO>}aAjb9Nk&&dE9&dBY1n0YG@=DDuG(yoJ+<8W0B3{LKdvH?jLqh4_Gz|(%= z*a_F_VSi&Xj0<<1P zRtL>*$o9tI@dw8VxJsuOSiOpzk1*SlPDux#`5ZZ3p#2ZHX$%Zb>06-Tf;^s%*^hV1 zNr9?E_6IayBAb_I0#!$#T+4@!|NTewg+QnKfb$2(Q@Dvv#T`(8Ae)CJoJ(8adXO1l z^N<9b%8464bt(_R;twq4M#Ti^cnPxmpyebd=!`Uoz7u>J>fyB&*po1Q?^0dji5 z5^q~&h>MSH4bXB3**s`EWk-xpI_-efm&oIQ(0&wWF*t5PgcH7X3Y<+KC1C8d1J?e- zVlT^4uo@8Iv=cUeghd_aERYf~cG?AtH)M6tb~fiyuo@8Ivdv`asb~`j& zIQN2#0%ND$c*gZOPlDBe2&diP)BHe86b#OnoJj56-FVuuoY&!cop%3#rc*?lm4N|P zZm1#D?Sai(Ve>EOJVuC8r#;B|0wM+?A@0)$F~Qhr51#QlPQ<){(_W-`8L&2g#p8hYVIYbkv{k-=FoQ=$Ym=_2aa@s!wce%!yiBNX{(MEv_GC=En&X;f@r-N`N z3Ik&AN4S{NK_6&*U}p2rk5YsMBTS`US2XQm%3N!UdeJDBvzP;HnrHoUXv~C6;hOR(CZ3T23OX zgQjN`bsvaRcMY}y}3bH?*8W7hmegPY2 zK#pH5=Dlu#jz=Kdi^U)BVDW*h4oiLh0XBb0pdS1L8;`(Jz99Se^B$=CkkvuUQ)G2t zVDpm5?NdzuI!nODJCXYz4Ulw-WS+AEEPj#g#S9l`l^xJ{Lso~G{+w0ulz+(fs=?;> zk=+MvXLBITa5lnIA94JKo9Jvi0h;cS-3P7T;HnrHob8b7XM_ZLx#4Vg0oooyZofe5 zbA&bqXTLj8d$FVgPDG#AIp7Uc9diDF#qTe;iOxZ=aSJT!SP|o9&OylG2GMoRc&Vl1MCYe6TKp zi#R92=GCyoFDs%Fa!!Kv_pzzFi7+pD3GVdFH65WY1=g>{VjkB@gt}DNJR+8O<3jYo zoYP?Ab;#tIkNzFJ;U}N;l8XKXnIEW2WGkEoV^8iI%Stan3u}~?RO)a z2lWSg5t6z)(Da9_4(boCScJMfJn_bL7NM>b&-f%4qTS?Nim`ScYz8=8aUt4}&ZV$$ zMvf0?zU2B0)&nA(%kcEOxuK^YFfcGUm*E+|=avH*1;);0uyGpXavVCI$c@Mo&ed0- z;fE#va!&-C1tOelVdJb=%wy97DFI{Wc0A$2jTFx9u=zYJ;lh0vY!--cZpYJ4;YJGQ z4m|mY2Qd!p+<~XOXR-oW3C7MHu=YK2x`M_V6JjpIxf3>ChpY~o{&*1M)Xtr-`F(8a zKIMwr(P9k>03q>dF@9`GRM1Dtzd{>73Gco6IGocmzwEwK3msXXn&(+}W5^s$`# zVe2fh^xxQZ5&oC}8#lwEj@b)I-3Q#|6Adm)mT?Pce6XEDs9UuJOZtP3gRsv>s9SRZT8<<81Evnqw{zYI^9L4n zyok9@=gkth&ErKXueKRraUV2a@*>urIB$ckt3pm!(E0=J3kC+~?XZ3sHuo99RXXon zgU5Y{^@Ps*u(=N!F1(2S0nUf8trLW)L#$hOJ_c*wBl`ooj*$&9-tK&w1?oO5>Ubj& z{8$ zobPjB89%rHNzYvT2zwtP;u&GJrI6sEvH!SrV2V#7~`8l?DgO;bfo8cxpKi@%I zJLeV5Jf!ju%X(_(*Rb$IR);yB==^2}w7-hnUx0-lqFwC5sDLGZK;xIM6z&ffCI&3w z47HaJv3}fz8MZzaOT6(R&Q5gUMa)6NEx{5WE_}qTXLaF&g&%TyhURl53taf{^iz=4 z@vA_~XXNq}I)0C=PDlc(4td@MvtQ;S1}is^(-ju;q+#_Na{hqD2O|Bs$c8}eMNS9M z_8J>v9lVR24K#j{)j`W~Uc_A)E^@GT6S6vJznc%Sp4vqL7Qe{h0-a~#Q-_C)iz1@W z3>U-}ze zavHY&06CpP(=*&w1_qb2SFrR$vH17=8ff{9>^^9^M>g*gp8Z=W>efKx137-Nq^rv@ z5PSb3g CJ@X;@DXtu_ei^cP(DFb4k#}4K<3#HPC#79L~^q6F}@qaTUO}U+4rRT?ruO zgpzRIhbO6nl0*HQ(s|IYm9XWqM!x<4w46d3Pc+6W5SLtd9+b4(3UPSxK)n*Db z9bi*;2w|QhY;}jL`92LFfs?3=9meKCp2qEdCHgtch^-*?^_J0gYcl zMTEWnuy8>RKWKUp)JCWahK>6mr$4Aa1Wgg@BECS&4P^76=@hPtfx$Hz+k7K5KG+d+ zX|6G_^+U+^Li3RzV!ya+tOGQ?AghDMn;@d!?HY$|JOXAOBJ5q`VfhG4dqWU09_yNd z%{*xS6-2Dla!tjSUSR6V;UVLi<^t_sBF8VxeTemwu4%A#HnKWs_zCtR%*((t?jtx2 zp)M2FjztbXn7s>;)ZrPo6Xc_XG64=TpJjm>JWB-7Ic8?4>o(a zPh8tz=?XcVq4laDQoV(5d`%Fc*R>PYZpY?d#CWl5AGUEMXucEz-B}26qU!|M`UB*0 z7phJGu@=a6;vOvd99q5zut5w1l~+^tK*!~g+V_kMkot%Zu@BdE3u3JzTr;e_%a0f@ zaovh%T><}gxK`Kg30UG6>JMIo-&}Vf&ZdKFhS|%DSij-A6LE$GhB_g{_@C=eJmaxK zi1i1qJCVWz$v|*=5kQQIyY3Q!hBI>fLeo7zVr<%VPXe_5Mbvo=4A6N*e#AJE>)sZq zIz$*SFhIja2&uiX?*&vHvc1suI2&TWz3V~Pc^TNuTLAZ&>mfYtI$p$j5ZA+a#vOSP z^F6MI8}PJ;5dAmTBe3+0$TJMEeWZMd@jBO|3Q+Tq{R<5jex!EOG1$B$a=8YrFZq$m z=abm>DM8yMY+{ITIgKrxq2(VNVw~FbES~p5)WXsW>?E;!OZ? zCXMS&Z2o}8n-F3hitA0p+#@^?VC9uiDqP6*_6BHugzP?OdKN-zZ`^~mn~>E()1MGx zU%Bgj;>M9&@5B1>$oT^resI?@Ft|Q|jmKgMXJmDcVD%QVdC+!*5K=qhbqDTt6S8@4 z@R^5LzvlV@)*eC*7ifAGLd;9LeuR}*$nAq0koryNE!<`|CT#OZuy97KdvIfh%?~1n z3p5?TO=DniV}X@xSi*%3u@1mZ1kXA$Wb;H}{XArUKXEzJj_#bk7 zVDX0qEPe_2!xiQ}q;?`~+(!U0#_kr3tzUtekKDqpK+7wn@io|ZlK^78*ewROKN&ea zL(`S8C_H4`;$Y#7G_Jx3J=Z`Ov0lI}eGW8!v6+YHU%F*-K;4JUJj8gXTM_J>7-aLH z`ArzH9@DKDPk9RW1p|Xy38JlvBn-)yNCIvpu=qtz_t1I}SzQfme;IQ8Li^{!h~pFz`QP4dk9$_bi7U&G2i1h5jL)eoc^HkhU~t{u<;z^{DvjHOhvRU5!$h+n-&0# zUu6Gc3746$^(q9^&4HbhfSgXD`!59$^_JUZ#2PDv`=I>=VZ^#ux66nzFHCiazJ%Kq z*g6U<;UbI}hjY6I8yCfv{t)dUx9hNS7fXC_BAIssRxe;Nk7qyJ$!<6B^rv|d>!93j zz}$z$US7nFQ*O5^p!p4pe|Zt(LvD8jpz5%g$Asv|yWNGALs--?BIaw|?$tp1dC2~S zrYk13PhsPt*uoDnp5ylP1n&5N`+|YN?Rf-o>R#YEkC7KCf4qdX>#(>_7_rXW z?Gx=K@uS-2aBo`|%@{yYFW} z)nV&T`y=fAa0ZJysCmMOb?|O~Vd)P`x)MQ*zqoV3&ILpEFEqV~Akv>Z_XKG9jJ$sa zy1z#RvCq|=*9WQ&u||`D0lLp$1hJmRogZ7j5tc6zcDM`RIcGv74IVD;02HZ3&e3!ihV`Scqyv%32=|F7;7<1LlHSU0h zGg7_J0Btvk$|BTR!^WwR-3KjCMV%4qY+&mOu$hM#zjt>+jHSXg!}`ghAU{Dw-JN0O z268w<Md;Hf*9X* z4}ta1v6+YHAGwFZ=0C8g6TOcJmoPl_DmP->);%20I5lE8k-+y$&LI$fy|Ddn1k_DL4iALG(Z>@(_rD=z5iCq~uyYoX&BYSVlNS)@-zl*5 z49M#qv6O4GVdsJoP`7XkarQ3uAWq#9*m`v2aU?9|>GBGwc?8t0g3UJ~`q&Iu&gFF9 zumPHn2&mgm+`eAWeSL^nMX)g9cl#NrKM2I{P6guB?J9w)BM>fod5BZDA6q#D9lt_& z3w#eD5*NONi|&c9z_^$Y=j{3Xsj(A}a)(F13q$1mtEP`D%#14A7(hm?v>=*Ko!!wU4j@S?DA%~}Y7DvpfdMLuyMPhNEIHFDOp@?nW2(*1F zj%e?CD8ue)K#n(dTg4;9$H2`u3!jwl>G)L`c+U^5TVKk`sVxD_M(BoOOHJk(+P zG_lw#Aq3azp|u6edM?a%ornGcs5<0zBhc|qxM>Uw9wtwq`+Jc60bL(~tj-*EPA~F! zF?9U_vN~(%di4Lu{Z-6;EFKQ9bI%cdAqED_`DqW=8PIV!WcR_+Jz_r8!xK;cLjrN1 zjR$-j3E4bYIzWtLdU)X(j}S+!v-I$WjSnG@!$H?EiX+CFJ^T@UC8XejETHj*+@6HaABiLU=n)EA--PT=So|W!J3Yei^rt2A;12N!!xPSMRSXOs;fT0F z5{CE#Nx&og4|LoX*?m~@MUybes!$+z~qOB8iyC@koP}FWAyOVm#X;9oxQHSpIkn4;hbi*nAIidVtys zSH-~KkqJAOlYqKx8K{4e+o{lSK{hWJcCP{=&%p1kLRMD*y9bMac}1{u+6b6e3Y#xO z4reUoZW&_E6UjM{bS0q;7xE}a)OBz{c>YD4r{GbJXPt)xQo5?ZGcF~GR8LpH&d)|p zf6#o1s*whtkJ zp{@qDUIke_)Lw)(@V(tgTsRZcJUr{E;kp<=_kR=DPOK-c{|3589Lab%6T^Lth`9^6 zB3ODs5&+#tj>LsCG0np>jtqg8eA_-%rgKp&d0HG2iTzc@7YY1%&9zBRLW+Y)udwXHy ziOA^{OTVW-hPZq_5wTVgue}qAEdM4EnO-L0sXve$;xP%arvOP9GhC+N>8~Pb^gv7z zA&Fv+>v>EARSPIez#NSDola!BnoeXook3)Oe-@%{0y_*!V7PA%k@;;7a{CZ!7`F0x zE@G`aLKT+qn}?X&!>evS;;bM1>X7?c2$dNAoex`Ihnzp4^{NEo91)KN*!Ek&)Fr|# z@K}K7oK#7~Jx(4AzJL-8_Io_}l@R7F(t)G;v8I$l?j z>vEy_LlUXKx*E^sGxnIz&q7LSdv z{XJOHpCn>EoX2L^IxQ^ePl^>0A6xLO8<7%3QU^W%3gz5xXgZZbtef-Lil_c%&PSNH z72AGOn0bivhCQ~y)?XoqGgKWjV*RPdHe`9YHIVv<1u5RP<5}0jjM!)Gu^qO49I^L{ zf#CzhJSjvQ$YUS2bq`SYNg?H<1F-cV$nJ!y<3`lE9*1D-k+7*lO3#OT%|?($g@aX!DtN!Yq!Eapie_8EGd!Zxo4E1&(kJrVg?0(BlfW z^YEbMsT9&U%{9ar8r*ZR_J%Y&T*%{^1GFAQUXKJFr;$eT?~OfBb;#ozPFfagMqtJDze9p^d?low$CZ zCp&Td4^IvjXg)$7cZALd2qEsN_SAsQe<1q@T3*Q@+Pj{b(DP7!Bds4{fu6e{gBVZr z)Irou2=779TarSo+w|0d?QcZ37g~%i0X$RS2a6eQU(O>X%sDZAdMIM)j?t7O;+_&iI zhR1!lvL3*Yl_D(`v0wKZiCXJW__sqZ+F3|RYFyh<=Pej)XVi1%Bo5zSaKh`r7 z(FTAjK~S2)*$8cH|K4E6+SU z=laPZ)|q?e;aN8#hZqa>%!iHBAeTeX_P8vu&q8eH$U*BjS$Mhj|Nno)nM!a=a5IWa5=%0Z6$*;-lT%Yli&7Od^70k( z5_3~E8B!}UOBmwgi%SxVKy*=RVoGXWS$uJ3dRjp$LvCVb9z%R?a(-!E2}5E^N_=8U zN>OTYaeP5yW)VYfVopweGDC4{395KnQEDnfT4r8maR!P+F+*NyZc=IynqXRHQ8Ahc zd8rj>BFUviMX7nHf>2jumC8xYOE1Y_0J|`;BsD%cBQ-gjAw4xOKB*|aAh9GlBej?z zv7jI|FQp{4qNF^(D1{-tD8D>Dv8X7qlA$2KxFk8Xs3^aPp}3$ZGp{6#AtgUPEx)Kd zu_z@zsVFfIY(NFrt10>M8Hsr*IjK;I`~n7q9*Elb{DKltkihiDmn0UYrm7N;^KC+6klm&BJ8B^EHGK@CaEFUn>}tw>ESD_|&3%q(F@PRz-PPb@ZI zD9J6zOUz|R%P&aHV@ONR$uCZ2sDQ;vNl{K}9z$tfPG(*gD^5<# zOJhh&Pc2CXi{%zDWTxbS{1=~EQIcAe7hhbNo0Oje7fsB|hl{0UR+JWi6y)VI6qJ_4 zCl<$-B!c{qnv)h^ToMm*O@2}q1BhFeT2!2wpT__a0}G@U73JlFSxKqsnR#GVYEe;c zaXLdrVoFMJNfAS0adB!KP-a15X+?ZyVrd0P9GaFg(^5dZ;?xod zqaZmgB_1T0o>~$QO#<`ttiP&1RGfZO3NTV)TQyo zsmV}xo0-JtrIx2cdB#S_JP^A$84^HwspTn&C5d1I@=_{b!o?-=r3ER8C8=NuBxY(} z3OK2QoLHQk2Qt67q$n>rw}2tB7%W&4UtUz4nhXkMhTPQL60 zCWhpqRB$@?owlE-8S89N3)r0KWY+yaL9;?xq5GLTGOKHScNqWqlv^!UWQl=#$wOb|0E zsh9yAR9W#UscG>!nPsUEJ~-f@Nh~cVvmibxv!oanQOJ@-si}D-sYRe%4JrYlUP&v> z1Lqc~2_;2|prQ>N*~Q5jsVSwP0M3uENJ;`n7^q%|M>ZAgCQ#VKXQU<;FeD`=XO|X0 zLkr}o#GF!Nuy+%4N;APOPD)~cL_>T@WdW!@&B=*}2r#5&f-8XJ%uEy!kns$V(z&20 zH90i}6j$KTFJ?%~DJ{;3&&kY7jnB(xh>y?7iO(s{$V>xO`Z+oAMG!VfG(RyVJ~KBr zH3gg~AuNy!Au8hIOA*SU$s82O@kOAtU(5h*V-y!dLoYKK6bqPwpsFsf6r5{{;}gpg zGjqTdNMdnuW_n&csJsW~9fr)}_`Lj-)cB;-l9JRShQySt(&CbMXsknHJU=b1I293< zDT(O};MPohNoH;;lnDx%qEc`KG8Co4BMh8<67w>v!0`xzMlF2NNFD^|2vGR*RNfXpI0`b5#Hdp|ZJcgmW2PdMR-~k+fdaiCB`-cR1>ANhD6Y%} zRsZpsP@_Suq4WZfs^ZGr#1u$lp`-}PDoBAcQY%WJEKutzGcP5zB0ep(0$gXMWmc4@ zCT2r<1qI;t1>6FNjVXEYkkk#b36x%-rhyVxep+#5E~I9Mx41yIq~#aIm*zqJkXlhv z3~?4r3S0#igQ|Z}qDoIKVgT2-APdUDu>v)+yeKihv;@w9w<6$GdT|M)O&t#|0d}&^8ei^u+%S$bXgnLdNga$QFL4`nhQECp@=>xu78l2ZT9_sAX$8sg$;CzB zJ|LW3QdE+k!jM>!4+$%%X=&gph#@sU4O9fDmVktX16*r@9G3&J72L2Y zhO!e&KwS|~0|*}R;NqdUBp1}K0yiz<(+e2Ni$Jjs4ircp098Yf0s|Tr#Umq- z1SR_9QgF^s0ky_5OEMF4KxKAHN<6sz%21RFPH)gSLdh}l$%#cNnV>=$tRy};BN0?V zr6AH~VsSPS2ULV5mL!52KyXi#7lCz^7iFYYFeK(=rsshI1=eZ!+F0@6c3pgCNop=bZens#J~WYmRVJnt z73F~3Q@~J=U!GcI1Wk68xsVXeEzK#(j4uLp0zlO(B$vDjQpY^goQBKB7`6~R3VlXCue3d6s6{-f(IcWJ=}Ou zSqjkx3Tg-|IX@SgZHiN&HBl$S_b5NTRqT9zFgcgDK#q0wh&1AX@mKmIkQ#4(f-4s?wA^NMb0i%mww^ z!2>U#I<_P+i6JSmIJGD>9hwx2Q%gz<;!9F<3m`qL)a2~=%rsEGDoV{sECDy~i&41g zsd;GyV8<2YfU1?W{G#O4_>|OQP?rMKB1*|G1&vk|=a%MxxFD)H1w^K&=7H&=)Y9VA z_>9b)e2{!fW*L}*&?WJSMd=KAphj>>YEf=x9;iVDc0YLF2%4NAWpxFpAq$G>RB+YL z0Iu&qjZ08f4ldw82?8Vv;uK`2FvJ%WC70wd#DhlVAVW$F@kKc)ps|2>Q0Y^Y28!nR zd1hV-SUxQ?2h_GJ%>xf4rRL}4F%+bxW<$zCP){7fijOZ& z%>^p~4KG5(;4DbT0W`*wl9LCfV3iYC3Cv|+4%km%7AP=4jTdANl1Yfd8LR;6*Z4$G zy_A!ZT2TP82plkA6)+#=d zqEzsJS8-}d87P22V-FxYvpBJ&q!OeYlq%wLQ$WLIkhB8jfc#Yis#KtS=wKd{hdMfy znU)d{8kmBY@t`rP;$jAPfjm#Gl{RrNi0bPwR2GUxu9V#Gn06Tkr3nIN>RAEVB0}C0yM4&G6lp2^?N}> zM39~UShOq`Jo*J1U;xP^7J(ZBU@1^x4rU}4<$|&RNIo+!HxZQUa?&7UOW^TGkRqhv zNDvp4fDVddSfGKu!1Cvjp7k;XlxXZh_?9r(h{T~fQLRv z7f7zSGA|iy9;mGg4XSuhK>%_hB#Mw7Z)^mMYiNvt#^n&s2JsLc1@m&!AjX3@1)$yu z*k%w9WCMZ&k^;pTNCs>mi~}|g&dEswrKxz3DzIrV32?;bfb%k_c!1amiZ7Tgpilv) z-&Al~fG0_WkH97)xVezgf9U)PsDwyN0W~kd{hQnZ&`=M!#{(WXf;SN3p`8_Q7Edh! zj~jzJUXaO<0vI2p38VyCS`?RnIuu(?e~DM|6}S!|b3U3OdwY0ICHcy=o8(G-!~X8K0X2E)+p6u>3qoPAx8pPt8k7 z%*g@Omf+EQ(3oaYPJVJWLws?1Ca4ev^We&{@IcwQxFjAd1M1g-{0*88%LBO_)Z$5o z>jupQ#3$z$RF;5y2x*`uT4D|?+|n{DK&2|EFAwr0gj)>m@`C&QNa{dkA}F@N!@`gN z26+Ld0+h0fOBf(MjpFjef_PA>%}D`u?DLCKQi~YCf(0oM8r;AKsRB(Ufn`8*6Ci=K zOo$5bSOQ1@Vi&lshW2#QQot2bN@)Q@8dx0UcF?d{Np50#W-_Rm4;gU-kJA*V<|gH& z7J)h-knk?d$V|_O2L%jRA86dLq!7e}40%IiG%+OwO%#^!5=$$RU_&8^r4^uI6i~wy zG#XP{0aAqEC6$0H2^1+6@ zalwj;VBraNG)NZQg@J@%QDRQcfml$^v9kE?hOZOahw$E`-1=a0vvS_KGh`1&0WPlag5s z?lePqpm78ktD+>nI5`P2;~AfuSdN#{L-8hg``vkSgTqgKTW}efq}sZJP)dnSfXH1p<1DkkyxydUs?i^1&;

    F7e57-TT0pQ4}&vOPIJ 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�*w#B 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 diff --git a/tools/ido5.3_compiler/usr/bin/cc b/tools/ido5.3_compiler/usr/bin/cc deleted file mode 100755 index 2936fc3fda571fd738734a8d764797a45de66fee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275168 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ȄuqG){hoPfqWNOm{R#} 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%0AP*KC-~aSCL) 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 $@ || ($(RM) -f $@ && false) - -# cc and strip are special and are stored in the `bin` folder instead of the `lib` one -$(BUILD_DIR)/%.c: $(IRIX_USR_DIR)/bin/% - $(RECOMP_ELF) $(RECOMP_FLAGS) $< > $@ || ($(RM) -f $@ && false) - - -$(BUILT_BIN)/%.cc: $(IRIX_USR_DIR)/lib/%.cc - cp $^ $@ - - -ifeq ($(TARGET),universal) -MACOS_FAT_TARGETS ?= arm64-apple-macos11 x86_64-apple-macos10.14 - -FAT_FOLDERS := $(foreach target,$(MACOS_FAT_TARGETS),$(BUILD_DIR)/$(target)) - -# create build directories -$(shell mkdir -p $(FAT_FOLDERS)) - -# TODO: simplify -FAT_BINARIES := $(foreach binary,$(IDO_TC),$(BUILT_BIN)/arm64-apple-macos11/$(binary)) \ - $(foreach binary,$(IDO_TC),$(BUILT_BIN)/x86_64-apple-macos10.14/$(binary)) - -$(BUILT_BIN)/%: $(BUILD_DIR)/arm64-apple-macos11/% $(BUILD_DIR)/x86_64-apple-macos10.14/% | $(ERR_STRS) - lipo -create -output $@ $^ - - -$(BUILD_DIR)/arm64-apple-macos11/%: $(BUILD_DIR)/arm64-apple-macos11/%.o $(BUILD_DIR)/arm64-apple-macos11/$(LIBC_IMPL_O) | $(ERR_STRS) - $(CC) $(CSTD) $(OPTFLAGS) $(CFLAGS) -target arm64-apple-macos11 -o $@ $^ $(LDFLAGS) - $(STRIP) $@ - -$(BUILD_DIR)/x86_64-apple-macos10.14/%: $(BUILD_DIR)/x86_64-apple-macos10.14/%.o $(BUILD_DIR)/x86_64-apple-macos10.14/$(LIBC_IMPL_O) | $(ERR_STRS) - $(CC) $(CSTD) $(OPTFLAGS) $(CFLAGS) -target x86_64-apple-macos10.14 -o $@ $^ $(LDFLAGS) - $(STRIP) $@ - -$(BUILD_DIR)/arm64-apple-macos11/%.o: $(BUILD_DIR)/%.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) -target arm64-apple-macos11 -o $@ $< - -$(BUILD_DIR)/x86_64-apple-macos10.14/%.o: $(BUILD_DIR)/%.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) -target x86_64-apple-macos10.14 -o $@ $< - - -$(BUILD_DIR)/arm64-apple-macos11/$(LIBC_IMPL_O): libc_impl.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) $(WARNINGS) -target arm64-apple-macos11 -o $@ $< - -$(BUILD_DIR)/x86_64-apple-macos10.14/$(LIBC_IMPL_O): libc_impl.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) $(WARNINGS) -target x86_64-apple-macos10.14 -o $@ $< - -else -$(BUILT_BIN)/%: $(BUILD_DIR)/%.o $(BUILD_DIR)/$(LIBC_IMPL_O) | $(ERR_STRS) - $(CC) $(CSTD) $(OPTFLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS) - $(STRIP) $@ - -$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) -o $@ $< - - -$(BUILD_DIR)/$(LIBC_IMPL_O): libc_impl.c - $(CC) -c $(CSTD) $(OPTFLAGS) $(CFLAGS) $(WARNINGS) -o $@ $< -endif - -# Remove built-in rules, to improve performance -MAKEFLAGS += --no-builtin-rules - --include $(DEP_FILES) - -# --- Debugging -# run `make print-VARIABLE` to debug that variable -print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/tools/ido-static-recomp/README.md b/tools/ido-static-recomp/README.md deleted file mode 100644 index 83ae760f..00000000 --- a/tools/ido-static-recomp/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Static Recompilation of IRIX Programs - -Convert selected IRIX C toolchain programs into modern Linux or macOS programs - -## Supported Programs - -* IDO 5.3 - * cc, acpp, as0, as1, cfe, copt, ugen, ujoin, uld, umerge, uopt, usplit, ld, strip, upas -* IDO 7.1 - * cc, acpp, as0, as1, cfe, ugen, ujoin, uld, umerge, uopt, usplit, upas - -## Dependencies - -### Linux (Debian / Ubuntu) - -```bash -sudo apt-get install build-essential -``` - -### macOS - -[Install homebrew](https://brew.sh/) and then: - -```bash -brew install make -``` - -## Building - -First build the recomp binary itself - -```bash -make setup -``` - -```bash -make VERSION=5.3 -make VERSION=7.1 -``` - -The build artifacts are located in `build/{7.1|5.3}/out`. Add `-j{thread num}` for multithreaded building. - -By default, debug builds are created with less optimizations, debug flags, and unstripped binaries. -Add `RELEASE=1` to build release builds with optimizations and stripped binaries. - -### Creating Universal ARM/x86_64 macOS Builds - -By default, make build script create native binaries on macOS. This was done to minimize the time to build the recompiled suite. -In order to create "fat," universal ARM and x86_64, pass `TARGET=universal` to `gmake`. - -### Manual Building - -Example for compiling `as1` in a Linux environment: - -```bash -make -C tools/rabbitizer -g++ -Itools/rabbitizer/include -Itools/rabbitizer/cplusplus/include recomp.cpp -o recomp.elf -g -Ltools/rabbitizer/build -lrabbitizerpp -./recomp.elf ido/7.1/usr/lib/as1 > as1_c.c -gcc libc_impl.c as1_c.c -o as1 -g -fno-strict-aliasing -lm -DIDO71 -``` - -Use the same approach for `cc`, `cfe`, `uopt`, `ugen`, `as1` (and `copt` if you need that). - -Use `-DIDO53` instead of `-DIDO71` if the program you are trying to recompile was compiled with IDO 5.3 rather than IDO 7.1. - -To compile `ugen` for IDO 5.3, add `--conservative` when invoking `./recomp.elf`. This mimics UB present in `ugen53`. That program reads uninitialized stack memory and its result depends on that stack memory. diff --git a/tools/ido-static-recomp/elf.h b/tools/ido-static-recomp/elf.h deleted file mode 100644 index 91ba5fe2..00000000 --- a/tools/ido-static-recomp/elf.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef ELF_H -#define ELF_H - -#include - -#define EI_DATA 5 -#define EI_NIDENT 16 -#define SHT_SYMTAB 2 -#define SHT_DYNAMIC 6 -#define SHT_REL 9 -#define SHT_DYNSYM 11 -#define SHT_MIPS_REGINFO 0x70000006 -#define STN_UNDEF 0 -#define STT_OBJECT 1 -#define STT_FUNC 2 -#define DT_PLTGOT 3 -#define DT_MIPS_LOCAL_GOTNO 0x7000000a -#define DT_MIPS_SYMTABNO 0x70000011 -#define DT_MIPS_GOTSYM 0x70000013 - -#define ELF32_R_SYM(info) ((info) >> 8) -#define ELF32_R_TYPE(info) ((info) & 0xff) - -#define ELF32_ST_TYPE(info) ((info) & 0xf) - -#define R_MIPS_26 4 -#define R_MIPS_HI16 5 -#define R_MIPS_LO16 6 - -#define SHN_UNDEF 0 -#define SHN_COMMON 0xfff2 -#define SHN_MIPS_ACOMMON 0xff00 -#define SHN_MIPS_TEXT 0xff01 -#define SHN_MIPS_DATA 0xff02 - -typedef uint32_t Elf32_Addr; -typedef uint32_t Elf32_Off; - -typedef struct { - uint8_t e_ident[EI_NIDENT]; - uint16_t e_type; - uint16_t e_machine; - uint32_t e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - uint32_t e_flags; - uint16_t e_ehsize; - uint16_t e_phentsize; - uint16_t e_phnum; - uint16_t e_shentsize; - uint16_t e_shnum; - uint16_t e_shstrndx; -} Elf32_Ehdr; - -typedef struct { - uint32_t sh_name; - uint32_t sh_type; - uint32_t sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - uint32_t sh_size; - uint32_t sh_link; - uint32_t sh_info; - uint32_t sh_addralign; - uint32_t sh_entsize; -} Elf32_Shdr; - -typedef struct { - uint32_t st_name; - Elf32_Addr st_value; - uint32_t st_size; - uint8_t st_info; - uint8_t st_other; - uint16_t st_shndx; -} Elf32_Sym; - -typedef struct { - Elf32_Addr r_offset; - uint32_t r_info; -} Elf32_Rel; - -typedef struct -{ - uint32_t ri_gprmask; /* General registers used. */ - uint32_t ri_cprmask[4]; /* Coprocessor registers used. */ - int32_t ri_gp_value; /* $gp register value. */ -} Elf32_RegInfo; - -typedef struct -{ - int32_t d_tag; /* Dynamic entry type */ - union { - uint32_t d_val; /* Integer value */ - Elf32_Addr d_ptr; /* Address value */ - } d_un; -} Elf32_Dyn; - -#endif diff --git a/tools/ido-static-recomp/header.h b/tools/ido-static-recomp/header.h deleted file mode 100644 index 0a72f1ab..00000000 --- a/tools/ido-static-recomp/header.h +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "libc_impl.h" -#include "helpers.h" - -#define RM_RN 0 -#define RM_RZ 1 -#define RM_RP 2 -#define RM_RM 3 - -#define cvt_w_d(f) \ - ((fcsr & RM_RZ) ? ((isnan(f) || f <= -2147483649.0 || f >= 2147483648.0) ? (fcsr |= 0x40, 2147483647) : (int)f) : (assert(0), 0)) - -#define cvt_w_s(f) cvt_w_d((double)f) - -static union FloatReg f0 = {{0, 0}}, f2 = {{0, 0}}, f4 = {{0, 0}}, f6 = {{0, 0}}, f8 = {{0, 0}}, -f10 = {{0, 0}}, f12 = {{0, 0}}, f14 = {{0, 0}}, f16 = {{0, 0}}, f18 = {{0, 0}}, f20 = {{0, 0}}, -f22 = {{0, 0}}, f24 = {{0, 0}}, f26 = {{0, 0}}, f28 = {{0, 0}}, f30 = {{0, 0}}; -static uint32_t fcsr = 1; diff --git a/tools/ido-static-recomp/helpers.h b/tools/ido-static-recomp/helpers.h deleted file mode 100644 index 9e031e0f..00000000 --- a/tools/ido-static-recomp/helpers.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef HELPERS_H -#define HELPERS_H - -#include - -#define MEM_F64(a) (double_from_memory(mem, a)) -#define MEM_F32(a) (*(float *)(mem + a)) -#define MEM_U32(a) (*(uint32_t *)(mem + a)) -#define MEM_S32(a) (*(int32_t *)(mem + a)) -#define MEM_U16(a) (*(uint16_t *)(mem + ((a) ^ 2))) -#define MEM_S16(a) (*(int16_t *)(mem + ((a) ^ 2))) -#define MEM_U8(a) (*(uint8_t *)(mem + ((a) ^ 3))) -#define MEM_S8(a) (*(int8_t *)(mem + ((a) ^ 3))) - -#endif diff --git a/tools/ido-static-recomp/libc_impl.c b/tools/ido-static-recomp/libc_impl.c deleted file mode 100644 index a6a11b96..00000000 --- a/tools/ido-static-recomp/libc_impl.c +++ /dev/null @@ -1,2971 +0,0 @@ -#define _GNU_SOURCE // for sigset -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __CYGWIN__ -#include -#endif - -#ifdef __APPLE__ -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libc_impl.h" -#include "helpers.h" -#include "header.h" - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) - -#define STRING(param) \ - size_t param##_len = wrapper_strlen(mem, param##_addr); \ - char param[param##_len + 1]; \ - for (size_t i = 0; i <= param##_len; i++) { \ - param[i] = MEM_S8(param##_addr + i); \ - } - -#if !defined(IDO53) && !defined(IDO71) && !defined(IDO72) -#define IDO71 -#endif - -#define MEM_REGION_START 0xfb00000 -#define MEM_REGION_SIZE (512 * 1024 * 1024) - -#ifdef IDO53 -// IDO 5.3 -#define IOB_ADDR 0x0fb528e4 -#define ERRNO_ADDR 0x0fb52720 -#define CTYPE_ADDR 0x0fb504f0 -#define LIBC_ADDR 0x0fb50000 -#define LIBC_SIZE 0x3000 -#endif - -#ifdef IDO71 -// IDO 7.1 -#define IOB_ADDR 0x0fb4ee44 -#define ERRNO_ADDR 0x0fb4ec80 -#define CTYPE_ADDR 0x0fb4cba0 -#define LIBC_ADDR 0x0fb4c000 -#define LIBC_SIZE 0x3000 -#endif - -#ifdef IDO72 -// IDO 7.2 -#define IOB_ADDR 0x0fb49454 -#define ERRNO_ADDR 0x0fb49290 -#define CTYPE_ADDR 0x0fb46db0 -#define LIBC_ADDR 0x0fb46000 -#define LIBC_SIZE 0x4000 -#endif - -#define STDIN_ADDR IOB_ADDR -#define STDOUT_ADDR (IOB_ADDR + 0x10) -#define STDERR_ADDR (IOB_ADDR + 0x20) -#define STDIN ((struct FILE_irix*)&MEM_U32(STDIN_ADDR)) -#define STDOUT ((struct FILE_irix*)&MEM_U32(STDOUT_ADDR)) -#define STDERR ((struct FILE_irix*)&MEM_U32(STDERR_ADDR)) - -#define MALLOC_BINS_ADDR custom_libc_data_addr -#define STRTOK_DATA_ADDR (MALLOC_BINS_ADDR + (30 - 3) * 4) -#define INTBUF_ADDR (STRTOK_DATA_ADDR + 4) - -#define SIGNAL_HANDLER_STACK_START LIBC_ADDR - -#define NFILE 100 - -#define IOFBF 0000 /* full buffered */ -#define IOLBF 0100 /* line buffered */ -#define IONBF 0004 /* not buffered */ -#define IOEOF 0020 /* EOF reached on read */ -#define IOERR 0040 /* I/O error from system */ - -#define IOREAD 0001 /* currently reading */ -#define IOWRT 0002 /* currently writing */ -#define IORW 0200 /* opened for reading and writing */ -#define IOMYBUF 0010 /* stdio malloc()'d buffer */ - -#define STDIO_BUFSIZE 16384 - -struct timespec_t_irix { - int tv_sec; - int tv_nsec; -}; - -struct FILE_irix { - int _cnt; - uint32_t _ptr_addr; - uint32_t _base_addr; - uint8_t pad[2]; - uint8_t _file; - uint8_t _flag; -}; - -typedef uint64_t (*fptr_trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, - uint32_t fp_dest); - -static struct { - struct { - fptr_trampoline trampoline; - uint8_t* mem; - uint32_t fp_dest; - } handlers[65]; - volatile uint32_t recursion_level; -} signal_context; - -static uint32_t cur_sbrk; -static uint32_t bufendtab[NFILE]; // this version contains the size and not the end ptr -static uint32_t custom_libc_data_addr; - -#define _U 01 /* Upper case */ -#define _L 02 /* Lower case */ -#define _N 04 /* Numeral (digit) */ -#define _S 010 /* Spacing character */ -#define _P 020 /* Punctuation */ -#define _C 040 /* Control character */ -#define _B 0100 /* Blank */ -#define _X 0200 /* heXadecimal digit */ - -static char ctype[] = { - 0, - // clang-format off -/* 00 01 02 03 04 05 06 07 */ -/* 0 */ _C, _C, _C, _C, _C, _C, _C, _C, -/* 010 */ _C, _S|_C, _S|_C, _S|_C, _S|_C, _S|_C, _C, _C, -/* 020 */ _C, _C, _C, _C, _C, _C, _C, _C, -/* 030 */ _C, _C, _C, _C, _C, _C, _C, _C, -/* 040 */ _S|_B, _P, _P, _P, _P, _P, _P, _P, -/* 050 */ _P, _P, _P, _P, _P, _P, _P, _P, -/* 060 */ _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, _N|_X, -/* 070 */ _N|_X, _N|_X, _P, _P, _P, _P, _P, _P, -/* 0100 */ _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, -/* 0110 */ _U, _U, _U, _U, _U, _U, _U, _U, -/* 0120 */ _U, _U, _U, _U, _U, _U, _U, _U, -/* 0130 */ _U, _U, _U, _P, _P, _P, _P, _P, -/* 0140 */ _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, -/* 0150 */ _L, _L, _L, _L, _L, _L, _L, _L, -/* 0160 */ _L, _L, _L, _L, _L, _L, _L, _L, -/* 0170 */ _L, _L, _L, _P, _P, _P, _P, _C, -/* 0200 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0210 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0220 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0230 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0240 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0250 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0260 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0270 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0300 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0310 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0320 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0330 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0340 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0350 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0360 */ 0, 0, 0, 0, 0, 0, 0, 0, -/* 0370 */ 0, 0, 0, 0, 0, 0, 0, 0, - // clang-format on -}; - - -static char usr_lib_redirect[PATH_MAX + 1]; -static char usr_include_redirect[PATH_MAX + 1]; - -static int g_file_max = 3; - - -/* Compilation Target/Emulation Host Page Size Determination */ -#if defined(__CYGWIN__) || (defined(__linux__) && defined(__aarch64__)) -#define RUNTIME_PAGESIZE -/* ARM64 linux can have page sizes of 4kb, 16kb, or 64kb */ -/* Set in main before running the translated code */ -static size_t g_Pagesize; - -#define TRUNC_PAGE(x) ((x) & ~(g_Pagesize - 1)) -#define ROUND_PAGE(x) (TRUNC_PAGE((x) + (g_Pagesize - 1))) - -#elif defined(__APPLE__) -/* https://developer.apple.com/documentation/apple-silicon/addressing-architectural-differences-in-your-macos-code */ -#define TRUNC_PAGE(x) (trunc_page((x))) -#define ROUND_PAGE(x) (round_page((x))) - -#else -/* A fixed 4KB page size for x64 linux (is there anything else?) */ -#define TRUNC_PAGE(x) ((x) & ~(0x1000 - 1)) -#define ROUND_PAGE(x) (TRUNC_PAGE((x) + (0x1000 - 1))) -#endif /* PageSize Macros */ - -static uint8_t* memory_map(size_t length) { -#ifdef __CYGWIN__ - uint8_t* mem = mmap(0, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); -#else - uint8_t* mem = mmap(0, length, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#endif - - assert(TRUNC_PAGE((uintptr_t)mem) == (uintptr_t)mem && - "Page size too small, try increasing `page_size` in recomp.cpp"); - if (mem == MAP_FAILED) { - perror("mmap (memory_map)"); - exit(1); - } - return mem; -} - -static void memory_allocate(uint8_t* mem, uint32_t start, uint32_t end) { - assert(start >= MEM_REGION_START); - assert(end <= MEM_REGION_START + MEM_REGION_SIZE); - // `start` will be passed to mmap, - // so it has to be host aligned in order to keep the guest's pages valid - assert(start == TRUNC_PAGE(start) && "Page size too small, try increasing `page_size` in recomp.cpp"); -#ifdef __CYGWIN__ - uintptr_t _start = TRUNC_PAGE((uintptr_t)mem + start); - uintptr_t _end = ROUND_PAGE((uintptr_t)mem + end); - - if (mprotect((void*)_start, _end - _start, PROT_READ | PROT_WRITE) < 0) { - perror("mprotect (memory_allocate)"); - exit(1); - } -#else - void* addr = (void*)TRUNC_PAGE((uintptr_t)mem + start); - size_t len = end - start; - - if (mmap(addr, len, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == MAP_FAILED) { - perror("mmap (memory_allocate)"); - exit(1); - } -#endif /* __CYGWIN__ */ -} - -static void memory_unmap(uint8_t* mem, size_t length) { - if (munmap(mem, length)) { - perror("munmap"); - exit(1); - } -} - -static void free_all_file_bufs(uint8_t* mem) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(IOB_ADDR); - for (int i = 0; i < g_file_max; i++) { - if (f[i]._flag & IOMYBUF) { - wrapper_free(mem, f[i]._base_addr); - } - } -} - -void get_env_var(char* out, char* name) { - char* env = getenv(name); - - if (env == NULL) { // No environment variable found, so just return empty string - out[0] = '\0'; - return; - } - - if (snprintf(out, PATH_MAX, "%s", env) >= PATH_MAX) { - fprintf(stderr, "Error: Environment variable %s is too large\n", name); - exit(1); - } - -} - -static void init_usr_lib_redirect(void) { - char path[PATH_MAX + 1] = { 0 }; - - get_env_var(path, "USR_LIB"); - - if (path[0] != '\0') { - strcpy(usr_lib_redirect, path); - return; - } - - // gets the current executable's path -#ifdef __CYGWIN__ - uint32_t size = GetModuleFileName(NULL, path, PATH_MAX); - if (size == 0 || size == PATH_MAX) { - return; - } -#elif defined __APPLE__ - uint32_t size = PATH_MAX; - if (_NSGetExecutablePath(path, &size) < 0) { - return; - } -#else - ssize_t size = readlink("/proc/self/exe", path, PATH_MAX); - if (size < 0 || size == PATH_MAX) { - return; - } -#endif - - strcpy(usr_lib_redirect, dirname(path)); -} - -static void init_usr_include_redirect(void) { - char path[PATH_MAX + 1] = {0}; - - get_env_var(path, "USR_INCLUDE"); - - strcpy(usr_include_redirect, path); -} - -static void init_redirect_paths(void) { - init_usr_lib_redirect(); - init_usr_include_redirect(); -} - -/** - * Redirects `path` by replacing the initial segment `from` by `to`. The result is placed in `out`. - * If `path` does not have `from` as its initial segment, or there is no `to`, the original path is used. - * If an error occurs, an error message will be printed, and the program exited. -*/ -void redirect_path(char* out, const char* path, const char* from, const char* to) { - int from_len = strlen(from); - - if(!strncmp(path, from, from_len) && (to[0] != '\0')) { - char redirected_path[PATH_MAX + 1] = {0}; - int n; - - n = snprintf(redirected_path, sizeof(redirected_path), "%s%s", to, path + from_len); - - if (n >= 0 && n < sizeof(redirected_path)) { - strcpy(out, redirected_path); - } else { - fprintf(stderr, "Error: Unable to redirect %s->%s for %s\n", from, to, path); - exit(1); - } - } else { - strcpy(out, path); - } -} - -void final_cleanup(uint8_t* mem) { - wrapper_fflush(mem, 0); - free_all_file_bufs(mem); - mem += MEM_REGION_START; - memory_unmap(mem, MEM_REGION_SIZE); -} - -int main(int argc, char* argv[]) { - int ret; - - init_redirect_paths(); -#ifdef RUNTIME_PAGESIZE - g_Pagesize = sysconf(_SC_PAGESIZE); -#endif /* RUNTIME_PAGESIZE */ - - uint8_t* mem = memory_map(MEM_REGION_SIZE); - mem -= MEM_REGION_START; - int run(uint8_t * mem, int argc, char* argv[]); - ret = run(mem, argc, argv); - final_cleanup(mem); - return ret; -} - -void mmap_initial_data_range(uint8_t* mem, uint32_t start, uint32_t end) { - custom_libc_data_addr = end; -#ifdef __APPLE__ - end += vm_page_size; -#else - end += 4096; -#endif /* __APPLE__ */ - memory_allocate(mem, start, end); - cur_sbrk = end; -} - -void setup_libc_data(uint8_t* mem) { - memory_allocate(mem, LIBC_ADDR, (LIBC_ADDR + LIBC_SIZE)); - for (size_t i = 0; i < sizeof(ctype); i++) { - MEM_S8(CTYPE_ADDR + i) = ctype[i]; - } - STDIN->_flag = IOREAD; - STDIN->_file = 0; - STDOUT->_flag = IOWRT; - STDOUT->_file = 1; - STDERR->_flag = IOWRT | IONBF; - STDERR->_file = 2; -} - -static uint32_t strcpy1(uint8_t* mem, uint32_t dest_addr, const char* str) { - for (;;) { - char c = *str; - ++str; - MEM_S8(dest_addr) = c; - ++dest_addr; - if (c == '\0') { - return dest_addr - 1; - } - } -} - -static uint32_t strcpy2(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr) { - for (;;) { - char c = MEM_S8(src_addr); - ++src_addr; - MEM_S8(dest_addr) = c; - ++dest_addr; - if (c == '\0') { - return dest_addr - 1; - } - } -} - -uint32_t wrapper_sbrk(uint8_t* mem, int increment) { - uint32_t old = cur_sbrk; - size_t alignedInc = ROUND_PAGE(old + increment) - old; - memory_allocate(mem, old, old + alignedInc); - cur_sbrk += alignedInc; - return old; -} - -/* -Simple bin-based malloc algorithm - -The memory is divided into bins of item sizes 8, 16, 32, 64, 128, ..., 2^30. -Size requests are divided into these bin sizes and each bin is handled -completely separate from other bins. - -For each bin there is a linked list of free'd items. -Linked list node: -struct FreeListNode { - struct Node *next; - size_t free_space_after; - uint8_t data[bin_item_size]; -}; -At most one value of next and space_after is non-zero. -If a node exists in the linked list, it is the memory node to return. -struct AllocatedNode { - int bin; - uint32_t current_size; - uint8_t data[bin_item_size]; -}; -The returned address is the data element. -When the last list node is returned, and free_space_after is big enough -for a new node, a new node is created having free_space_after set to -(free_space_after - (8 + bin_item_size)), and is appended to the list. - -If the list was empty, a new memory chunk is requested from the system -of 65536 bytes, or at least (8 + bin_item_size), rounded up to nearest -page size boundary. It can also be smaller if it leaves holes bigger than -4096 bytes that can never be used. This chunk is then inserted to the list, -and the algorithm restarts. - -This algorithm, for each bin, never uses more than twice as much as is -maximally in use (plus 65536 bytes). -The malloc/free calls run in O(1) and calloc/realloc calls run in O(size). -*/ - -size_t mem_used; -size_t mem_allocated; -size_t max_mem_used; -size_t num_sbrks; -size_t num_allocs; -uint32_t wrapper_malloc(uint8_t* mem, uint32_t size) { - int bin = -1; - for (int i = 3; i < 30; i++) { - if (size <= (1 << i)) { - bin = i; - break; - } - } - if (bin == -1) { - return 0; - } - ++num_allocs; - mem_used += size; - max_mem_used = MAX(mem_used, max_mem_used); - uint32_t item_size = 1 << bin; - uint32_t list_ptr = MALLOC_BINS_ADDR + (bin - 3) * 4; - uint32_t node_ptr = MEM_U32(list_ptr); - if (node_ptr == 0) { - uint32_t sbrk_request = 0x10000; - if (8 + item_size > sbrk_request) { - sbrk_request = 8 + item_size; - sbrk_request = ROUND_PAGE(sbrk_request); - } - uint32_t left_over = sbrk_request % (8 + item_size); - sbrk_request -= left_over & ~(4096 - 1); - mem_allocated += sbrk_request; - ++num_sbrks; - node_ptr = wrapper_sbrk(mem, sbrk_request); - MEM_U32(node_ptr + 4) = sbrk_request - (8 + item_size); - } - uint32_t next = MEM_U32(node_ptr); - if (next == 0) { - uint32_t free_space_after = MEM_U32(node_ptr + 4); - if (free_space_after >= 8 + item_size) { - next = node_ptr + 8 + item_size; - MEM_U32(next + 4) = free_space_after - (8 + item_size); - } - } else { - assert(MEM_U32(node_ptr + 4) == 0); - } - MEM_U32(list_ptr) = next; - MEM_U32(node_ptr) = bin; - MEM_U32(node_ptr + 4) = size; - return node_ptr + 8; -} - -uint32_t wrapper_calloc(uint8_t* mem, uint32_t num, uint32_t size) { - uint64_t new_size = (uint64_t)num * size; - assert(new_size == (uint32_t)new_size); - uint32_t ret = wrapper_malloc(mem, new_size); - return wrapper_memset(mem, ret, 0, new_size); -} - -uint32_t wrapper_realloc(uint8_t* mem, uint32_t data_addr, uint32_t size) { - if (data_addr == 0) { - return wrapper_malloc(mem, size); - } else { - uint32_t node_ptr = data_addr - 8; - int bin = MEM_U32(node_ptr); - uint32_t old_size = MEM_U32(node_ptr + 4); - uint32_t max_size = 1 << bin; - assert(bin >= 3 && bin < 30); - assert(old_size <= max_size); - if (size <= max_size) { - mem_used = mem_used - old_size + size; - MEM_U32(node_ptr + 4) = size; - return data_addr; - } else { - uint32_t new_addr = wrapper_malloc(mem, size); - wrapper_memcpy(mem, new_addr, data_addr, old_size); - wrapper_free(mem, data_addr); - return new_addr; - } - } -} - -void wrapper_free(uint8_t* mem, uint32_t data_addr) { - if (data_addr == 0) { - return; - } - uint32_t node_ptr = data_addr - 8; - int bin = MEM_U32(node_ptr); - uint32_t size = MEM_U32(node_ptr + 4); - if (size == 0) { - // Double free. IDO 5.3 strip relies on this. - fprintf(stderr, "warning: double free: 0x%x\n", data_addr); - return; - } - uint32_t list_ptr = MALLOC_BINS_ADDR + (bin - 3) * 4; - assert(bin >= 3 && bin < 30); - assert(size <= (1 << bin)); - MEM_U32(node_ptr) = MEM_U32(list_ptr); - MEM_U32(node_ptr + 4) = 0; - MEM_U32(list_ptr) = node_ptr; - mem_used -= size; -} - -int wrapper_fscanf(uint8_t* mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - STRING(format) // for debug - - int ret = 0; - char c; - int ch; - sp += 2 * 4; - for (;;) { - c = MEM_S8(format_addr); - ++format_addr; - if (c == '%') { - c = MEM_S8(format_addr); - ++format_addr; - if (c == '%') { - goto percent; - } - for (;;) { - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - return ret; - } - if (!isspace(ch)) { - break; - } - } - bool l = false; - continue_format: - switch (c) { - case 'l': - assert(!l && "ll not implemented in fscanf"); - l = true; - c = MEM_S8(format_addr); - ++format_addr; - goto continue_format; - case 'd': { - int64_t num = 0; - int sign = 1; - bool found_first = false; - if (ch == '-') { - sign = -1; - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - return ret; - } - } - for (;;) { - if (isdigit(ch)) { - num *= 10; - num += ch - '0'; - found_first = true; - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - break; - } - } else { - wrapper_ungetc(mem, ch, fp_addr); - break; - } - } - if (found_first) { - uint32_t int_addr = MEM_U32(sp); - sp += 4; - MEM_S32(int_addr) = (int)(num * sign); - ++ret; - } else { - return ret; - } - break; - } - default: - assert(0 && "fscanf format not implemented"); - } - } else if (c == '\0') { - break; - } else { - percent: - ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - break; - } - if ((char)ch != c) { - break; - } - } - } - - return ret; -} - -int wrapper_printf(uint8_t* mem, uint32_t format_addr, uint32_t sp) { - STRING(format) - if (!strcmp(format, " child died due to signal %d.\n")) { - printf(format, MEM_U32(sp + 4)); - return 1; - } - assert(0 && "printf not implemented"); - return 0; -} - -int wrapper_sprintf(uint8_t* mem, uint32_t str_addr, uint32_t format_addr, uint32_t sp) { - STRING(format) // for debug - char temp[32]; - - if (!strcmp(format, "%.16e")) { - union { - uint32_t w[2]; - double d; - } d; - d.w[1] = MEM_U32(sp + 2 * 4); - d.w[0] = MEM_U32(sp + 3 * 4); - sprintf(temp, "%.16e", d.d); - strcpy1(mem, str_addr, temp); - return 1; - } - if (!strcmp(format, "\\%03o")) { - sprintf(temp, "\\%03o", MEM_U32(sp + 2 * 4)); - strcpy1(mem, str_addr, temp); - return 1; - } - if (!strcmp(format, "%*ld=")) { - sprintf(temp, "%*d=", MEM_U32(sp + 2 * 4), MEM_U32(sp + 3 * 4)); - strcpy1(mem, str_addr, temp); - return 1; - } - - uint32_t orig_str_addr = str_addr; - uint32_t pos = 0; - int ret = 0; - char c; - sp += 2 * 4; - for (;;) { - c = MEM_S8(format_addr + pos); - ++pos; - if (c == '%') { - bool l = false; - c = MEM_S8(format_addr + pos); - ++pos; - uint32_t zeros = 0; - bool zero_prefix = false; - continue_format: - switch (c) { - case '\0': - goto finish_str; - - case '0': - do { - c = MEM_S8(format_addr + pos); - ++pos; - if (c >= '0' && c <= '9') { - zeros *= 10; - zeros += c - '0'; - } - } while (c >= '0' && c <= '9'); - goto continue_format; - case '#': - c = MEM_S8(format_addr + pos); - ++pos; - zero_prefix = true; - goto continue_format; - break; - case 'l': - assert(!l && "ll not implemented in fscanf"); - c = MEM_S8(format_addr + pos); - ++pos; - l = true; - goto continue_format; - break; - case 'd': - if (zeros != 0) { - char temp1[32]; - sprintf(temp1, "%%0%dd", zeros); - sprintf(temp, temp1, MEM_S32(sp)); - } else { - sprintf(temp, "%d", MEM_S32(sp)); - } - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 'o': - if (zero_prefix) { - sprintf(temp, "%#o", MEM_S32(sp)); - } else { - sprintf(temp, "%o", MEM_S32(sp)); - } - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 'x': - if (zero_prefix) { - sprintf(temp, "%#x", MEM_S32(sp)); - } else { - sprintf(temp, "%x", MEM_S32(sp)); - } - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 'u': - sprintf(temp, "%u", MEM_S32(sp)); - sp += 4; - str_addr = strcpy1(mem, str_addr, temp); - ++ret; - break; - case 's': - str_addr = strcpy2(mem, str_addr, MEM_U32(sp)); - sp += 4; - ++ret; - break; - case 'c': - MEM_S8(str_addr) = (char)MEM_U32(sp); - ++str_addr; - sp += 4; - ++ret; - break; - case '%': - MEM_S8(str_addr) = '%'; - ++str_addr; - break; - default: - fprintf(stderr, "%s\n", format); - assert(0 && "non-implemented sprintf format"); - } - } else if (c == '\0') { - break; - } else { - MEM_S8(str_addr) = c; - ++str_addr; - } - } - -finish_str: - MEM_S8(str_addr) = '\0'; - return ret; -} - -int wrapper_fprintf(uint8_t* mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - STRING(format) - sp += 8; - - // Special-case this one format string. This seems to be the only one that uses `%f` or width specifiers. - if (!strcmp(format, "%.2fu %.2fs %u:%04.1f %.0f%%\n") && fp_addr == STDERR_ADDR) { - double arg0 = MEM_F64(sp + 0); - double arg1 = MEM_F64(sp + 8); - uint32_t arg2 = MEM_U32(sp + 16); - double arg3 = MEM_F64(sp + 24); - double arg4 = MEM_F64(sp + 32); - fprintf(stderr, format, arg0, arg1, arg2, arg3, arg4); - fflush(stderr); - return 1; - } - if (strcmp(format, "%s phase time: %.2fu %.2fs %u:%04.1f %.0f%%\n") == 0 && fp_addr == STDERR_ADDR) { - if (wrapper_fputs(mem, MEM_U32(sp), fp_addr) == -1) { - return 0; - } - sp += 4; - // align - sp += 4; - - double arg0 = MEM_F64(sp + 0); - double arg1 = MEM_F64(sp + 8); - uint32_t arg2 = MEM_U32(sp + 16); - double arg3 = MEM_F64(sp + 24); - double arg4 = MEM_F64(sp + 32); - fprintf(stderr, " phase time: %.2fu %.2fs %u:%04.1f %.0f%%\n", arg0, arg1, arg2, arg3, arg4); - fflush(stderr); - return 1; - } - int ret = 0; - for (;;) { - int width = 1; - uint32_t pos = format_addr; - char ch = MEM_S8(pos); - - while (ch != '%' && ch != '\0') { - ++pos; - ch = MEM_S8(pos); - } - if (format_addr != pos) { - if (wrapper_fwrite(mem, format_addr, 1, pos - format_addr, fp_addr) != pos - format_addr) { - break; - } - } - if (ch == '\0') { - break; - } - ++pos; - ch = MEM_S8(pos); - if (ch >= '1' && ch <= '9') { - ++pos; - width = ch - '0'; - ch = MEM_S8(pos); - } - - switch (ch) { - case 'd': - case 'x': - case 'X': - case 'c': - case 'u': { - char buf[32]; - - char formatSpecifier[0x100] = { 0 }; - - formatSpecifier[0] = '%'; - formatSpecifier[1] = width + '0'; - formatSpecifier[2] = ch; - - sprintf(buf, formatSpecifier, MEM_U32(sp)); - - strcpy1(mem, INTBUF_ADDR, buf); - if (wrapper_fputs(mem, INTBUF_ADDR, fp_addr) == -1) { - return ret; - } - sp += 4; - ++ret; - break; - } - case 's': { - if (wrapper_fputs(mem, MEM_U32(sp), fp_addr) == -1) { - return ret; - } - sp += 4; - ++ret; - break; - } - default: - fprintf(stderr, "missing format: '%s'\n", format); - assert(0 && "non-implemented fprintf format"); - } - format_addr = ++pos; - } - return ret; -} - -int wrapper__doprnt(uint8_t* mem, uint32_t format_addr, uint32_t params_addr, uint32_t fp_addr) { - assert(0 && "_doprnt not implemented"); - return 0; -} - -uint32_t wrapper_strlen(uint8_t* mem, uint32_t str_addr) { - uint32_t len = 0; - while (MEM_S8(str_addr) != '\0') { - ++str_addr; - ++len; - } - return len; -} - -int wrapper_open(uint8_t* mem, uint32_t pathname_addr, int flags, int mode) { - STRING(pathname) - - char rpathname[PATH_MAX + 1]; - redirect_path(rpathname, pathname, "/usr/include", usr_include_redirect); - - int f = flags & O_ACCMODE; - if (flags & 0x100) { - f |= O_CREAT; - } - if (flags & 0x200) { - f |= O_TRUNC; - } - if (flags & 0x400) { - f |= O_EXCL; - } - if (flags & 0x800) { - f |= O_NOCTTY; - } - if (flags & 0x08) { - f |= O_APPEND; - } - - int fd = open(rpathname, f, mode); - MEM_U32(ERRNO_ADDR) = errno; - return fd; -} - -int wrapper_creat(uint8_t* mem, uint32_t pathname_addr, int mode) { - STRING(pathname) - int ret = creat(pathname, mode); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_access(uint8_t* mem, uint32_t pathname_addr, int mode) { - STRING(pathname) - int ret = access(pathname, mode); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_rename(uint8_t* mem, uint32_t oldpath_addr, uint32_t newpath_addr) { - STRING(oldpath) - STRING(newpath) - int ret = rename(oldpath, newpath); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_utime(uint8_t* mem, uint32_t filename_addr, uint32_t times_addr) { - STRING(filename) - struct utimbuf buf = { 0, 0 }; - int ret = utime(filename, times_addr == 0 ? NULL : &buf); - if (ret == 0) { - if (times_addr != 0) { - MEM_U32(times_addr + 0) = buf.actime; - MEM_U32(times_addr + 4) = buf.modtime; - } - } else { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_flock(uint8_t* mem, int fd, int operation) { - int ret = flock(fd, operation); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_chmod(uint8_t* mem, uint32_t path_addr, uint32_t mode) { - STRING(path) - int ret = chmod(path, mode); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_umask(int mode) { - return umask(mode); -} - -uint32_t wrapper_ecvt(uint8_t* mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr) { - assert(0); -} - -uint32_t wrapper_fcvt(uint8_t* mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr) { - assert(0); -} - -double wrapper_sqrt(double v) { - return sqrt(v); -} - -float wrapper_sqrtf(float v) { - return sqrtf(v); -} - -int wrapper_atoi(uint8_t* mem, uint32_t nptr_addr) { - STRING(nptr) - return atoi(nptr); -} - -int wrapper_atol(uint8_t* mem, uint32_t nptr_addr) { - return wrapper_atoi(mem, nptr_addr); -} - -double wrapper_atof(uint8_t* mem, uint32_t nptr_addr) { - STRING(nptr); - return atof(nptr); -} - -int wrapper_strtol(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - int64_t res = strtoll(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (res > INT_MAX) { - MEM_U32(ERRNO_ADDR) = ERANGE; - res = INT_MAX; - } - if (res < INT_MIN) { - MEM_U32(ERRNO_ADDR) = ERANGE; - res = INT_MIN; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -uint32_t wrapper_strtoul(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - uint64_t res = strtoull(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (res > INT_MAX) { - MEM_U32(ERRNO_ADDR) = ERANGE; - res = INT_MAX; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -int64_t wrapper_strtoll(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - errno = 0; - int64_t res = strtoll(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -uint64_t wrapper_strtoull(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr, int base) { - STRING(nptr) - char* endptr = NULL; - errno = 0; - uint64_t res = strtoull(nptr, endptr_addr != 0 ? &endptr : NULL, base); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -double wrapper_strtod(uint8_t* mem, uint32_t nptr_addr, uint32_t endptr_addr) { - STRING(nptr) - char* endptr = NULL; - errno = 0; - double res = strtod(nptr, endptr_addr != 0 ? &endptr : NULL); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - if (endptr != NULL) { - MEM_U32(endptr_addr) = nptr_addr + (uint32_t)(endptr - nptr); - } - return res; -} - -uint32_t wrapper_strchr(uint8_t* mem, uint32_t str_addr, int c) { - c = c & 0xff; - for (;;) { - unsigned char ch = MEM_U8(str_addr); - if (ch == c) { - return str_addr; - } - if (ch == '\0') { - return 0; - } - ++str_addr; - } -} - -uint32_t wrapper_strrchr(uint8_t* mem, uint32_t str_addr, int c) { - c = c & 0xff; - uint32_t ret = 0; - for (;;) { - unsigned char ch = MEM_U8(str_addr); - if (ch == c) { - ret = str_addr; - } - if (ch == '\0') { - return ret; - } - ++str_addr; - } -} - -uint32_t wrapper_strcspn(uint8_t* mem, uint32_t str_addr, uint32_t invalid_addr) { - STRING(invalid) - uint32_t n = strlen(invalid); - uint32_t pos = 0; - char c; - while ((c = MEM_S8(str_addr)) != 0) { - for (int i = 0; i < n; i++) { - if (c == invalid[i]) { - return pos; - } - } - ++pos; - ++str_addr; - } - return pos; -} - -uint32_t wrapper_strpbrk(uint8_t* mem, uint32_t str_addr, uint32_t accept_addr) { - STRING(accept) - uint32_t n = strlen(accept); - char c; - while ((c = MEM_S8(str_addr)) != 0) { - for (int i = 0; i < n; i++) { - if (c == accept[i]) { - return str_addr; - } - } - ++str_addr; - } - return 0; -} - -static void stat_common(uint8_t* mem, uint32_t buf_addr, struct stat* statbuf) { - struct irix_stat { - int st_dev; - int pad1[3]; - int st_ino; - int st_mode; - int st_nlink; - int st_uid; - int st_gid; - int st_rdev; - int pad2[2]; - int st_size; - int pad3; - struct timespec_t_irix st_atim; - struct timespec_t_irix st_mtim; - struct timespec_t_irix st_ctim; - int st_blksize; - int st_blocks; - } s; - s.st_dev = statbuf->st_dev; - s.st_ino = statbuf->st_ino; - s.st_mode = statbuf->st_mode; - s.st_nlink = statbuf->st_nlink; - s.st_uid = statbuf->st_uid; - s.st_gid = statbuf->st_gid; - s.st_rdev = statbuf->st_rdev; - s.st_size = statbuf->st_size; -#ifdef __APPLE__ - s.st_atim.tv_sec = statbuf->st_atimespec.tv_sec; - s.st_atim.tv_nsec = statbuf->st_atimespec.tv_nsec; - s.st_mtim.tv_sec = statbuf->st_mtimespec.tv_sec; - s.st_mtim.tv_nsec = statbuf->st_mtimespec.tv_nsec; - s.st_ctim.tv_sec = statbuf->st_ctimespec.tv_sec; - s.st_ctim.tv_nsec = statbuf->st_ctimespec.tv_nsec; -#else - s.st_atim.tv_sec = statbuf->st_atim.tv_sec; - s.st_atim.tv_nsec = statbuf->st_atim.tv_nsec; - s.st_mtim.tv_sec = statbuf->st_mtim.tv_sec; - s.st_mtim.tv_nsec = statbuf->st_mtim.tv_nsec; - s.st_ctim.tv_sec = statbuf->st_ctim.tv_sec; - s.st_ctim.tv_nsec = statbuf->st_ctim.tv_nsec; -#endif - memcpy(&MEM_U32(buf_addr), &s, sizeof(s)); -} - -int wrapper_fstat(uint8_t* mem, int fildes, uint32_t buf_addr) { - struct stat statbuf; - if (fstat(fildes, &statbuf) < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return -1; - } else { - stat_common(mem, buf_addr, &statbuf); - return 0; - } -} - -int wrapper_stat(uint8_t* mem, uint32_t pathname_addr, uint32_t buf_addr) { - STRING(pathname) - struct stat statbuf; - if (stat(pathname, &statbuf) < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return -1; - } else { - stat_common(mem, buf_addr, &statbuf); - return 0; - } -} - -int wrapper_ftruncate(uint8_t* mem, int fd, int length) { - int ret = ftruncate(fd, length); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_truncate(uint8_t* mem, uint32_t pathname_addr, int length) { - STRING(pathname) - int ret = truncate(pathname, length); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -void wrapper_bcopy(uint8_t* mem, uint32_t src_addr, uint32_t dst_addr, uint32_t len) { - if (dst_addr % 4 == 0 && src_addr % 4 == 0 && len % 4 == 0) { - // Use memmove to copy regions that are 4-byte aligned. - // This prevents the byte-swapped mem from causing issues when copying normally. - // Memmove handles overlapping copies correctly, so overlap does not need to be checked. - memmove(&MEM_U32(dst_addr), &MEM_U32(src_addr), len); - } else if (dst_addr > src_addr) { - // Perform a reverse byte-swapped copy when the destination is ahead of the source. - // This prevents overwriting the source contents before they're read. - dst_addr += len - 1; - src_addr += len - 1; - while (len--) { - MEM_U8(dst_addr) = MEM_U8(src_addr); - --dst_addr; - --src_addr; - } - } else { - // Otherwise, perform a normal byte-swapped copy. - while (len--) { - MEM_U8(dst_addr) = MEM_U8(src_addr); - ++dst_addr; - ++src_addr; - } - } -} - -/** - * IRIX's memcpy seems to allow overlapping destination and source pointers, while the C standard dictates - * both pointer should not overlap, (UB otherwise). - * Because of this, we only use host bcopy since it can handle overlapping regions - */ -uint32_t wrapper_memcpy(uint8_t* mem, uint32_t dst_addr, uint32_t src_addr, uint32_t len) { - wrapper_bcopy(mem, src_addr, dst_addr, len); - return dst_addr; -} - -uint32_t wrapper_memccpy(uint8_t* mem, uint32_t dst_addr, uint32_t src_addr, int c, uint32_t len) { - while (len--) { - uint8_t ch = MEM_U8(src_addr); - MEM_U8(dst_addr) = ch; - ++dst_addr; - ++src_addr; - if (ch == c) { - return dst_addr; - } - } - return 0; -} - -int wrapper_read(uint8_t* mem, int fd, uint32_t buf_addr, uint32_t nbytes) { - uint8_t* buf = (uint8_t*)malloc(nbytes); - ssize_t ret = read(fd, buf, nbytes); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - for (ssize_t i = 0; i < ret; i++) { - MEM_U8(buf_addr + i) = buf[i]; - } - } - free(buf); - return (int)ret; -} - -int wrapper_write(uint8_t* mem, int fd, uint32_t buf_addr, uint32_t nbytes) { - uint8_t* buf = (uint8_t*)malloc(nbytes); - for (size_t i = 0; i < nbytes; i++) { - buf[i] = MEM_U8(buf_addr + i); - } - ssize_t ret = write(fd, buf, nbytes); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - free(buf); - return (int)ret; -} - -static uint32_t init_file(uint8_t* mem, int fd, int i, const char* path, const char* mode) { - int flags = O_RDONLY; - if (strcmp(mode, "r") == 0 || strcmp(mode, "rb") == 0) { - flags = O_RDONLY; - } else if (strcmp(mode, "w") == 0 || strcmp(mode, "wb") == 0) { - flags = O_WRONLY | O_CREAT | O_TRUNC; - } else if (strcmp(mode, "a") == 0 || strcmp(mode, "ab") == 0) { - flags = O_WRONLY | O_CREAT | O_APPEND; - } else if (strcmp(mode, "r+") == 0 || strcmp(mode, "r+b") == 0) { - flags = O_RDWR; - } else if (strcmp(mode, "w+") == 0 || strcmp(mode, "w+b") == 0) { - flags = O_RDWR | O_CREAT | O_TRUNC; - } else if (strcmp(mode, "a+") == 0 || strcmp(mode, "a+b") == 0) { - flags = O_RDWR | O_CREAT | O_APPEND; - } - if (fd == -1) { - char rpathname[PATH_MAX + 1]; - redirect_path(rpathname, path, "/usr/lib", usr_lib_redirect); - - fd = open(rpathname, flags, 0666); - - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } - } - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(IOB_ADDR); - uint32_t ret = 0; - if (i == -1) { - for (i = 3; i < NFILE; i++) { - if (f[i]._flag == 0) { - break; - } - } - } - assert(i < NFILE); - g_file_max = i + 1; - ret = IOB_ADDR + i * sizeof(struct FILE_irix); - f[i]._cnt = 0; - f[i]._ptr_addr = 0; - f[i]._base_addr = 0; - f[i]._file = fd; - f[i]._flag = (flags & O_ACCMODE) == O_RDONLY ? IOREAD : 0; - f[i]._flag |= (flags & O_ACCMODE) == O_WRONLY ? IOWRT : 0; - f[i]._flag |= (flags & O_ACCMODE) == O_RDWR ? IORW : 0; - bufendtab[i] = 0; - return ret; -} - -uint32_t wrapper_fopen(uint8_t* mem, uint32_t path_addr, uint32_t mode_addr) { - assert(path_addr != 0); - assert(mode_addr != 0); - - STRING(path) - STRING(mode) - return init_file(mem, -1, -1, path, mode); -} - -uint32_t wrapper_freopen(uint8_t* mem, uint32_t path_addr, uint32_t mode_addr, uint32_t fp_addr) { - STRING(path) - STRING(mode) - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - wrapper_fclose(mem, fp_addr); - return init_file(mem, -1, f - (struct FILE_irix*)&MEM_U32(IOB_ADDR), path, mode); -} - -int wrapper_fclose(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - wrapper_fflush(mem, fp_addr); - if (f->_flag & IOMYBUF) { - wrapper_free(mem, f->_base_addr); - } - f->_flag = 0; - close(f->_file); - return 0; -} - -static int flush_all(uint8_t* mem) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(IOB_ADDR); - int ret = 0; - for (int i = 0; i < g_file_max; i++) { - if (f[i]._flag & IOWRT) { - ret |= wrapper_fflush(mem, IOB_ADDR + i * sizeof(struct FILE_irix)); - } - } - return ret; -} - -int wrapper_fflush(uint8_t* mem, uint32_t fp_addr) { - if (fp_addr == 0) { - // Flush all - return flush_all(mem); - } - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (f->_flag & IOWRT) { - int p = 0; - int to_flush = f->_ptr_addr - f->_base_addr; - int c = to_flush; - while (c > 0) { - int r = wrapper_write(mem, f->_file, f->_base_addr + p, c); - if (r < 0) { - f->_file |= IOERR; - return -1; - } - p += r; - c -= r; - } - f->_ptr_addr = f->_base_addr; - f->_cnt += to_flush; - } - return 0; -} - -int wrapper_fchown(uint8_t* mem, int fd, int owner, int group) { - int ret = fchown(fd, owner, group); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_ftell(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - int adjust; - if (f->_cnt < 0) { - f->_cnt = 0; - } - if (f->_flag & IOREAD) { - adjust = -f->_cnt; - } else if (f->_flag & (IOWRT | IORW)) { - adjust = 0; - if ((f->_flag & IOWRT) && f->_base_addr != 0 && (f->_flag & IONBF) == 0) { - adjust = f->_ptr_addr - f->_base_addr; - } - } else { - return -1; - } - int res = wrapper_lseek(mem, f->_file, 0, 1); - if (res >= 0) { - res += adjust; - } - return res; -} - -void wrapper_rewind(uint8_t* mem, uint32_t fp_addr) { - (void)wrapper_fseek(mem, fp_addr, 0, SEEK_SET); - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - f->_flag &= ~IOERR; -} - -int wrapper_fseek(uint8_t* mem, uint32_t fp_addr, int offset, int origin) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - int c, p; - f->_flag &= ~IOEOF; - if (f->_flag & IOREAD) { - if (origin < SEEK_END && f->_base_addr && !(f->_flag & IONBF)) { - c = f->_cnt; - p = offset; - if (origin == SEEK_SET) { - p += c - lseek(f->_file, 0L, SEEK_CUR); - } else { - offset -= c; - } - if (!(f->_flag & IORW) && c > 0 && p <= c && p >= f->_base_addr - f->_ptr_addr) { - f->_ptr_addr += p; - f->_cnt -= p; - return 0; - } - } - if (f->_flag & IORW) { - f->_ptr_addr = f->_base_addr; - f->_flag &= ~IOREAD; - } - p = lseek(f->_file, offset, origin); - f->_cnt = 0; - } else if (f->_flag & (IOWRT | IORW)) { - wrapper_fflush(mem, fp_addr); - if (f->_flag & IORW) { - f->_cnt = 0; - f->_flag &= ~IOWRT; - f->_ptr_addr = f->_base_addr; - } - p = lseek(f->_file, offset, origin); - } - if (p < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return p; - } - return 0; -} - -int wrapper_lseek(uint8_t* mem, int fd, int offset, int whence) { - int ret = (int)lseek(fd, offset, whence); - if (ret == -1) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_dup(uint8_t* mem, int fd) { - fd = dup(fd); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return fd; -} - -int wrapper_dup2(uint8_t* mem, int oldfd, int newfd) { - int fd = dup2(oldfd, newfd); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return fd; -} - -int wrapper_pipe(uint8_t* mem, uint32_t pipefd_addr) { - int pipefd[2]; - int ret = pipe(pipefd); - if (ret == 0) { - MEM_U32(pipefd_addr + 0) = pipefd[0]; - MEM_U32(pipefd_addr + 4) = pipefd[1]; - } else { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -void wrapper_perror(uint8_t* mem, uint32_t str_addr) { - STRING(str) - perror(str); -} - -int wrapper_fdopen(uint8_t* mem, int fd, uint32_t mode_addr) { - STRING(mode) - return init_file(mem, fd, -1, NULL, mode); -} - -uint32_t wrapper_memset(uint8_t* mem, uint32_t dest_addr, int byte, uint32_t n) { - uint32_t saved = dest_addr; - if (dest_addr % 4 == 0 && n % 4 == 0) { - memset(&MEM_U32(dest_addr), byte, n); - } else { - while (n--) { - MEM_U8(dest_addr) = (uint8_t)byte; - ++dest_addr; - } - } - return saved; -} - -int wrapper_bcmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n) { - while (n--) { - if (MEM_U8(s1_addr) != MEM_U8(s2_addr)) { - return 1; - } - ++s1_addr; - ++s2_addr; - } - return 0; -} - -int wrapper_memcmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n) { - while (n--) { - unsigned char c1 = MEM_U8(s1_addr); - unsigned char c2 = MEM_U8(s2_addr); - if (c1 < c2) { - return -1; - } - if (c1 > c2) { - return 1; - } - ++s1_addr; - ++s2_addr; - } - return 0; -} - -int wrapper_getpid(void) { - return getpid(); -} - -int wrapper_getpgrp(uint8_t* mem) { - int ret = getpgrp(); - if (ret == -1) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_remove(uint8_t* mem, uint32_t path_addr) { - STRING(path) - int ret = remove(path); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_unlink(uint8_t* mem, uint32_t path_addr) { - if (path_addr == 0) { - fprintf(stderr, "Warning: unlink with NULL as arguement\n"); - MEM_U32(ERRNO_ADDR) = EFAULT; - return -1; - } - STRING(path) - int ret = unlink(path); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_close(uint8_t* mem, int fd) { - int ret = close(fd); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_strcmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr) { - for (;;) { - char c1 = MEM_S8(s1_addr); - char c2 = MEM_S8(s2_addr); - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - if (c1 == '\0') { - return 0; - } - ++s1_addr; - ++s2_addr; - } -} - -int wrapper_strncmp(uint8_t* mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n) { - if (n == 0) { - return 0; - } - for (;;) { - char c1 = MEM_S8(s1_addr); - char c2 = MEM_S8(s2_addr); - if (c1 != c2) { - return c1 < c2 ? -1 : 1; - } - if (--n == 0 || c1 == '\0') { - return 0; - } - ++s1_addr; - ++s2_addr; - } -} - -uint32_t wrapper_strcpy(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr) { - uint32_t saved = dest_addr; - for (;;) { - char c = MEM_S8(src_addr); - ++src_addr; - MEM_S8(dest_addr) = c; - ++dest_addr; - if (c == '\0') { - return saved; - } - } -} - -uint32_t wrapper_strncpy(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n) { - uint32_t i; - for (i = 0; i < n && MEM_S8(src_addr) != '\0'; i++) { - MEM_S8(dest_addr + i) = MEM_S8(src_addr + i); - } - for (; i < n; i++) { - MEM_S8(dest_addr + i) = '\0'; - } - return dest_addr; -} - -uint32_t wrapper_strcat(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr) { - uint32_t saved = dest_addr; - while (MEM_S8(dest_addr) != '\0') { - ++dest_addr; - } - while (MEM_S8(src_addr) != '\0') { - MEM_S8(dest_addr) = MEM_S8(src_addr); - ++src_addr; - ++dest_addr; - } - MEM_S8(dest_addr) = '\0'; - return saved; -} - -uint32_t wrapper_strncat(uint8_t* mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n) { - uint32_t saved = dest_addr; - while (MEM_S8(dest_addr) != '\0') { - ++dest_addr; - } - while (n-- && MEM_S8(src_addr) != '\0') { - MEM_S8(dest_addr) = MEM_S8(src_addr); - ++src_addr; - ++dest_addr; - } - MEM_S8(dest_addr) = '\0'; - return saved; -} - -uint32_t wrapper_strtok(uint8_t* mem, uint32_t str_addr, uint32_t delimiters_addr) { - if (str_addr == 0) { - str_addr = MEM_U32(STRTOK_DATA_ADDR); - } - if (str_addr == 0) { - // nothing remaining - return 0; - } - uint32_t p; - for (p = str_addr; MEM_S8(p) != '\0'; p++) { - uint32_t q; - for (q = delimiters_addr; MEM_S8(q) != '\0' && MEM_S8(q) != MEM_S8(p); q++) {} - if (MEM_S8(q) == '\0') { - break; - } - } - if (MEM_S8(p) == '\0') { - return 0; - } - uint32_t ret = p; - for (;;) { - uint32_t q; - for (q = delimiters_addr; MEM_S8(q) != '\0' && MEM_S8(q) != MEM_S8(p); q++) {} - if (MEM_S8(q) != '\0') { - MEM_S8(p) = '\0'; - MEM_U32(STRTOK_DATA_ADDR) = ++p; - return ret; - } - char next = MEM_S8(p); - ++p; - if (next == '\0') { - MEM_U32(STRTOK_DATA_ADDR) = 0; - return ret; - } - } -} - -uint32_t wrapper_strstr(uint8_t* mem, uint32_t str1_addr, uint32_t str2_addr) { - for (;;) { - if (MEM_S8(str1_addr) == '\0') { - return 0; - } - uint32_t s1 = str1_addr; - uint32_t s2 = str2_addr; - for (;;) { - char c2 = MEM_S8(s2); - if (c2 == '\0') { - return str1_addr; - } - if (MEM_S8(s1) == c2) { - ++s1; - ++s2; - } else { - break; - } - } - ++str1_addr; - } -} - -uint32_t wrapper_strdup(uint8_t* mem, uint32_t str_addr) { - uint32_t len = wrapper_strlen(mem, str_addr) + 1; - uint32_t ret = wrapper_malloc(mem, len); - if (ret == 0) { - MEM_U32(ERRNO_ADDR) = ENOMEM; - return 0; - } - return wrapper_memcpy(mem, ret, str_addr, len); -} - -int wrapper_toupper(int c) { - return toupper(c); -} - -int wrapper_tolower(int c) { - return tolower(c); -} - -int wrapper_gethostname(uint8_t* mem, uint32_t name_addr, uint32_t len) { - char buf[256] = { 0 }; - if (len > 256) { - len = 256; - } - int ret = gethostname(buf, len); - if (ret < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - for (uint32_t i = 0; i < len; i++) { - MEM_S8(name_addr + i) = buf[i]; - } - } - return ret; -} - -int wrapper_isatty(uint8_t* mem, int fd) { - int ret = isatty(fd); - if (ret == 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -uint32_t wrapper_strftime(uint8_t* mem, uint32_t ptr_addr, uint32_t maxsize, uint32_t format_addr, - uint32_t timeptr_addr) { - MEM_S8(ptr_addr) = 0; - return 0; -} - -int wrapper_times(uint8_t* mem, uint32_t buffer_addr) { - struct tms_irix { - int tms_utime; - int tms_stime; - int tms_cutime; - int tms_cstime; - } r; - struct tms t; - clock_t ret = times(&t); - if (ret == (clock_t)-1) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - r.tms_utime = t.tms_utime; - r.tms_stime = t.tms_stime; - r.tms_cutime = t.tms_cutime; - r.tms_cstime = t.tms_cstime; - MEM_U32(buffer_addr + 0x0) = t.tms_utime; - MEM_U32(buffer_addr + 0x4) = t.tms_stime; - MEM_U32(buffer_addr + 0x8) = t.tms_cutime; - MEM_U32(buffer_addr + 0xC) = t.tms_cstime; - } - return (int)ret; -} - -int wrapper_clock(void) { - return (int)clock(); -} - -uint32_t wrapper_ctime(uint8_t* mem, uint32_t timep_addr) { - time_t t = MEM_S32(timep_addr); - char* res = ctime(&t); - size_t len = strlen(res) + 1; - uint32_t ret_addr = wrapper_malloc(mem, len); - uint32_t pos = ret_addr; - while (len--) { - MEM_S8(pos) = *res; - ++pos; - ++res; - } - return ret_addr; -} - -uint32_t wrapper_localtime(uint8_t* mem, uint32_t timep_addr) { - time_t t = MEM_S32(timep_addr); - struct irix_tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - }; - uint32_t ret = wrapper_malloc(mem, sizeof(struct irix_tm)); - struct irix_tm* r = (struct irix_tm*)&MEM_U32(ret); - struct tm* l = localtime(&t); - r->tm_sec = l->tm_sec; - r->tm_min = l->tm_min; - r->tm_hour = l->tm_hour; - r->tm_mday = l->tm_mday; - r->tm_mon = l->tm_mon; - r->tm_year = l->tm_year; - r->tm_wday = l->tm_wday; - r->tm_yday = l->tm_yday; - r->tm_isdst = l->tm_isdst; - return ret; -} - -int wrapper_setvbuf(uint8_t* mem, uint32_t fp_addr, uint32_t buf_addr, int mode, uint32_t size) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - wrapper_fflush(mem, fp_addr); - if ((f->_flag & IOMYBUF) && f->_base_addr != 0) { - wrapper_free(mem, f->_base_addr); - } - size &= ~0xf; - f->_flag &= ~IOMYBUF; - - if (buf_addr == 0) { - assert(size > 0); - buf_addr = wrapper_malloc(mem, size); - f->_flag |= IOMYBUF; - } - - f->_base_addr = buf_addr; - f->_ptr_addr = buf_addr; - f->_cnt = 0; - bufendtab[(fp_addr - IOB_ADDR) / sizeof(struct FILE_irix)] = size; - return 0; -} - -int wrapper___semgetc(uint8_t* mem, uint32_t fp_addr) { - assert(0); -} - -int wrapper___semputc(uint8_t* mem, int c, uint32_t fp_addr) { - assert(0); -} - -int wrapper_fgetc(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (--f->_cnt < 0) { - return wrapper___filbuf(mem, fp_addr); - } else { - int ret = MEM_U8(f->_ptr_addr); - ++f->_ptr_addr; - return ret; - } -} - -int wrapper_fgets(uint8_t* mem, uint32_t str_addr, int count, uint32_t fp_addr) { - bool modified = false; - uint32_t saved = str_addr; - for (count--; count > 0; count--) { - int ch = wrapper_fgetc(mem, fp_addr); - if (ch == -1) { - MEM_S8(str_addr) = '\0'; - return modified ? saved : 0; - } - modified = true; - MEM_S8(str_addr) = (char)ch; - ++str_addr; - if (ch == '\n') { - break; - } - } - MEM_S8(str_addr) = '\0'; - return saved; -} - -static void file_assign_buffer(uint8_t* mem, struct FILE_irix* f) { - f->_base_addr = wrapper_malloc(mem, STDIO_BUFSIZE); - f->_ptr_addr = f->_base_addr; - f->_flag |= IOMYBUF; - f->_cnt = 0; - bufendtab[f - (struct FILE_irix*)&MEM_U32(IOB_ADDR)] = STDIO_BUFSIZE; -} - -int wrapper___filbuf(uint8_t* mem, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (!(f->_flag & IOREAD)) { - if (f->_flag & IORW) { - f->_flag |= IOREAD; - } else { - MEM_U32(ERRNO_ADDR) = 9; // EBADF - return -1; - } - } - if (f->_base_addr == 0) { - file_assign_buffer(mem, f); - } - uint32_t size = bufendtab[(fp_addr - IOB_ADDR) / sizeof(struct FILE_irix)]; - int nread = wrapper_read(mem, f->_file, f->_base_addr, size); - int ret = -1; - if (nread > 0) { - f->_ptr_addr = f->_base_addr; - f->_cnt = nread; - ret = MEM_U8(f->_ptr_addr); - ++f->_ptr_addr; - --f->_cnt; - } else if (nread == 0) { - f->_flag |= IOEOF; - } else { - f->_flag |= IOERR; - } - return ret; -} - -int wrapper___flsbuf(uint8_t* mem, int ch, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (wrapper_fflush(mem, fp_addr) != 0) { - return -1; - } - if (f->_base_addr == 0) { - file_assign_buffer(mem, f); - f->_cnt = bufendtab[f - (struct FILE_irix*)&MEM_U32(IOB_ADDR)]; - } - MEM_U8(f->_ptr_addr) = ch; - ++f->_ptr_addr; - --f->_cnt; - if (f->_flag & IONBF) { - if (wrapper_fflush(mem, fp_addr) != 0) { - return -1; - } - f->_cnt = 0; - } - return ch; -} - -int wrapper_ungetc(uint8_t* mem, int ch, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (ch == -1 || f->_ptr_addr == f->_base_addr) { - return -1; - } - --f->_ptr_addr; - MEM_U8(f->_ptr_addr) = (uint8_t)ch; - ++f->_cnt; - f->_flag &= ~IOEOF; - return ch; -} - -uint32_t wrapper_gets(uint8_t* mem, uint32_t str_addr) { - uint32_t p, str0 = str_addr; - int n; - - for (;;) { - if (STDIN->_cnt <= 0) { - if (wrapper___filbuf(mem, STDIN_ADDR) == -1) { - if (str0 == str_addr) { - return 0; - } - break; - } - --STDIN->_ptr_addr; - ++STDIN->_cnt; - } - n = STDIN->_cnt; - if ((p = wrapper_memccpy(mem, str_addr, STDIN->_ptr_addr, '\n', n)) != 0) { - n = p - str_addr; - } - str_addr += n; - STDIN->_cnt -= n; - STDIN->_ptr_addr += n; - // bufsync - if (p != 0) { - // found '\n' in buffer - --str_addr; - break; - } - } - MEM_S8(str_addr) = '\0'; - return str0; -} - -uint32_t wrapper_fread(uint8_t* mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - int nleft = count * size; - int n; - for (;;) { - if (f->_cnt <= 0) { - if (wrapper___filbuf(mem, fp_addr) == -1) { - return count - (nleft + size - 1) / size; - } - --f->_ptr_addr; - ++f->_cnt; - } - n = MIN(nleft, f->_cnt); - data_addr = wrapper_memcpy(mem, data_addr, f->_ptr_addr, n) + n; - f->_cnt -= n; - f->_ptr_addr += n; - if ((nleft -= n) <= 0) { - return count; - } - } -} - -uint32_t wrapper_fwrite(uint8_t* mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr) { - struct FILE_irix* f = (struct FILE_irix*)&MEM_U32(fp_addr); - if (size > 0 && count > 0 && f->_base_addr == 0) { - file_assign_buffer(mem, f); - f->_cnt = bufendtab[f - (struct FILE_irix*)&MEM_U32(IOB_ADDR)]; - f->_flag |= IOWRT; - } - uint32_t num_written = 0; - while (count--) { - uint32_t s = size; - while (s > 0) { - uint32_t to_write = f->_cnt; - if (s < to_write) { - to_write = s; - } - if (f->_cnt == 0) { - if (wrapper_fflush(mem, fp_addr) != 0) { - return num_written; - } - } - wrapper_memcpy(mem, f->_ptr_addr, data_addr, to_write); - data_addr += to_write; - f->_ptr_addr += to_write; - f->_cnt -= to_write; - s -= to_write; - } - num_written++; - } - if (f->_flag & IONBF) { - wrapper_fflush(mem, fp_addr); // TODO check error return value - } - return num_written; -} - -int wrapper_fputs(uint8_t* mem, uint32_t str_addr, uint32_t fp_addr) { - assert(str_addr != 0); - - uint32_t len = wrapper_strlen(mem, str_addr); - uint32_t ret = wrapper_fwrite(mem, str_addr, 1, len, fp_addr); - return ret == 0 && len != 0 ? -1 : 0; -} - -int wrapper_puts(uint8_t* mem, uint32_t str_addr) { - int ret = wrapper_fputs(mem, str_addr, STDOUT_ADDR); - if (ret != 0) { - return ret; - } - struct FILE_irix* f = STDOUT; - if (--f->_cnt < 0) { - if (wrapper___flsbuf(mem, '\n', STDOUT_ADDR) != '\n') { - return -1; - } - } else { - MEM_S8(f->_ptr_addr) = '\n'; - ++f->_ptr_addr; - } - return 0; -} - -uint32_t wrapper_getcwd(uint8_t* mem, uint32_t buf_addr, uint32_t size) { - char buf[size]; - if (getcwd(buf, size) == NULL) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } else { - if (buf_addr == 0) { - buf_addr = wrapper_malloc(mem, size); - } - strcpy1(mem, buf_addr, buf); - return buf_addr; - } -} - -int wrapper_time(uint8_t* mem, uint32_t tloc_addr) { - time_t ret = time(NULL); - if (ret == (time_t)-1) { - MEM_U32(ERRNO_ADDR) = errno; - } else if (tloc_addr != 0) { - MEM_S32(tloc_addr) = ret; - } - return ret; -} - -void wrapper_bzero(uint8_t* mem, uint32_t str_addr, uint32_t n) { - while (n--) { - MEM_U8(str_addr) = 0; - ++str_addr; - } -} - -int wrapper_fp_class_d(double d) { - union { - uint32_t w[2]; - double d; - } bits; - bits.d = d; - uint32_t a2 = bits.w[1]; - uint32_t a1 = a2 >> 20; - uint32_t a0 = a1; - a2 &= 0xfffff; - uint32_t a3 = bits.w[0]; - a1 &= 0x7ff; - a0 &= 0x800; - if (a1 == 0x7ff) { - if (a2 == 0 && a3 == 0) { - return a0 == 0 ? 2 : 3; - } - a0 = a2 & 0x80000; - return a0 == 0 ? 1 : 0; - } - if (a1 == 0) { - if (a2 == 0 && a3 == 0) { - return a0 == 0 ? 8 : 9; - } - return a0 == 0 ? 6 : 7; - } - return a0 == 0 ? 4 : 5; -} - -double wrapper_ldexp(double d, int i) { - return ldexp(d, i); -} - -uint64_t wrapper___ll_mul(uint64_t a0, uint64_t a1) { - return a0 * a1; -} - -int64_t wrapper___ll_div(int64_t a0, int64_t a1) { - return a0 / a1; -} - -int64_t wrapper___ll_rem(uint64_t a0, int64_t a1) { - return a0 % a1; -} - -uint64_t wrapper___ll_lshift(uint64_t a0, uint64_t shift) { - return a0 << (shift & 0x3F); -} - -int64_t wrapper___ll_rshift(int64_t a0, uint64_t shift) { - return a0 >> (shift & 0x3F); -} - -uint64_t wrapper___ull_div(uint64_t a0, uint64_t a1) { - return a0 / a1; -} - -uint64_t wrapper___ull_rem(uint64_t a0, uint64_t a1) { - return a0 % a1; -} - -uint64_t wrapper___ull_rshift(uint64_t a0, uint64_t shift) { - return a0 >> (shift & 0x3f); -} - -uint64_t wrapper___d_to_ull(double d) { - return d; -} - -int64_t wrapper___d_to_ll(double d) { - return d; -} - -uint64_t wrapper___f_to_ull(float f) { - return f; -} - -int64_t wrapper___f_to_ll(float f) { - return f; -} - -float wrapper___ull_to_f(uint64_t v) { - return v; -} - -float wrapper___ll_to_f(int64_t v) { - return v; -} - -double wrapper___ull_to_d(uint64_t v) { - return v; -} - -double wrapper___ll_to_d(int64_t v) { - return v; -} - -void wrapper_abort(uint8_t* mem) { - abort(); -} - -void wrapper_exit(uint8_t* mem, int status) { - final_cleanup(mem); - exit(status); -} - -void wrapper__exit(uint8_t* mem, int status) { - assert(0 && "_exit not implemented"); // exit() is already overridden -} - -void wrapper__cleanup(uint8_t* mem) { -} - -uint32_t wrapper__rld_new_interface(uint8_t* mem, uint32_t operation, uint32_t sp) { - assert(0 && "_rld_new_interface not implemented"); - return 0; -} - -void wrapper__exithandle(uint8_t* mem) { - assert(0 && "_exithandle not implemented"); -} - -int wrapper__prctl(uint8_t* mem, int operation, uint32_t sp) { - assert(0 && "_prctl not implemented"); - return 0; -} - -double wrapper__atod(uint8_t* mem, uint32_t buffer_addr, int ndigits, int dexp) { - // ftp://atoum.hst.nerim.net/irix/src/irix-6.5.5-src/6.5.5/m/irix/lib/libc/src/math/atod.c - assert(0 && "_atod not implemented"); - return 0.0; -} - -int wrapper_pathconf(uint8_t* mem, uint32_t path_addr, int name) { - STRING(path) - if (name == 5) { - errno = 0; - int ret = pathconf(path, _PC_PATH_MAX); - if (errno != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; - } - assert(0 && "pathconf not implemented for the specific 'name'"); - return 0; -} - -uint32_t wrapper_getenv(uint8_t* mem, uint32_t name_addr) { - STRING(name); - const char* value = getenv(name); - if (value == NULL) { - return 0; - } - size_t value_size = strlen(value) + 1; - uint32_t buf_addr = wrapper_malloc(mem, value_size); - strcpy1(mem, buf_addr, value); - return buf_addr; -} - -uint32_t wrapper_gettxt(uint8_t* mem, uint32_t msgid_addr, uint32_t default_str_addr) { - // Return default for now - return default_str_addr; -} - -uint32_t wrapper_setlocale(uint8_t* mem, int category, uint32_t locale_addr) { - assert(locale_addr != 0); - STRING(locale) - assert(category == 6); // LC_ALL - char* ret = setlocale(LC_ALL, locale); - // Let's hope the caller doesn't use the return value - return 0; -} - -uint32_t wrapper_mmap(uint8_t* mem, uint32_t addr, uint32_t length, int prot, int flags, int fd, int offset) { - if (addr == 0 && prot == (prot & 3) && flags == 2) { - // Read/write, map private. Just make a copy. - uint8_t* ptr = mmap(0, length, PROT_READ, MAP_PRIVATE, fd, offset); - if (ptr == MAP_FAILED) { - MEM_U32(ERRNO_ADDR) = errno; - return -1; - } - uint32_t out = wrapper_malloc(mem, length); - for (uint32_t i = 0; i < length; i++) { - MEM_S8(out + i) = ptr[i]; - } - munmap(ptr, length); - return out; - } - assert(0 && "mmap not implemented"); - return 0; -} - -int wrapper_munmap(uint8_t* mem, uint32_t addr, uint32_t length) { - return 0; -} - -int wrapper_mprotect(uint8_t* mem, uint32_t addr, uint32_t length, int prot) { - assert(0 && "mprotect not implemented"); - return 0; -} - -int wrapper_sysconf(uint8_t* mem, int name) { - assert(0 && "sysconf not implemented"); - return 0; -} - -int wrapper_getpagesize(uint8_t* mem) { - return 4096; -} - -int wrapper_strerror(uint8_t* mem, int errnum) { - errno = errnum; - perror("strerror"); - assert(0 && "strerror not implemented"); - return 0; -} - -int wrapper_ioctl(uint8_t* mem, int fd, uint32_t request, uint32_t sp) { - assert(0 && "ioctl not implemented"); - return 0; -} - -int wrapper_fcntl(uint8_t* mem, int fd, int cmd, uint32_t sp) { - assert(0 && "fcntl not implemented"); - return 0; -} - -static void signal_handler(int signum) { - uint32_t level = signal_context.recursion_level++; - uint8_t* mem = signal_context.handlers[signum].mem; - uint32_t fp_dest = signal_context.handlers[signum].fp_dest; - uint32_t sp = SIGNAL_HANDLER_STACK_START - 16 - level * 0x1000; - signal_context.handlers[signum].trampoline(mem, sp, signum, 0, 0, 0, fp_dest); - signal_context.recursion_level--; -} - -uint32_t wrapper_signal(uint8_t* mem, int signum, - uint64_t (*trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, - uint32_t a3, uint32_t fp_dest), - uint32_t handler_addr, uint32_t sp) { - return 0; -} - -uint32_t wrapper_sigset(uint8_t* mem, int signum, - uint64_t (*trampoline)(uint8_t* mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, - uint32_t a3, uint32_t fp_dest), - uint32_t disp_addr, uint32_t sp) { - void (*handler)(int) = signal_handler; - - if ((int)disp_addr >= -1 && (int)disp_addr <= 1) { - // SIG_DFL etc. - handler = (void (*)(int))(intptr_t)(int)disp_addr; - } - - switch (signum) { - case 2: - signum = SIGINT; - break; - case 13: - signum = SIGPIPE; - break; - case 15: - signum = SIGTERM; - break; - default: - assert(0 && "sigset with this signum not implemented"); - break; - } - - signal_context.handlers[signum].trampoline = trampoline; - signal_context.handlers[signum].mem = mem; - signal_context.handlers[signum].fp_dest = disp_addr; - - return (uint32_t)(uintptr_t)sigset(signum, handler); // for now only support SIG_DFL etc. as return value -} - -int wrapper_get_fpc_csr(uint8_t* mem) { - return 0; -} - -int wrapper_set_fpc_csr(uint8_t* mem, int csr) { - return 0; -} - -int wrapper_setjmp(uint8_t* mem, uint32_t addr) { - return 0; -} - -void wrapper_longjmp(uint8_t* mem, uint32_t addr, int status) { - assert(0 && "longjmp not implemented"); -} - -uint32_t wrapper_tempnam(uint8_t *mem, uint32_t dir_addr, uint32_t pfx_addr) { - STRING(dir) - STRING(pfx) - char *ret = tempnam(dir, pfx); - char *ret_saved = ret; - if (ret == NULL) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } - size_t len = strlen(ret) + 1; - uint32_t ret_addr = wrapper_malloc(mem, len); - uint32_t pos = ret_addr; - while (len--) { - MEM_S8(pos) = *ret; - ++pos; - ++ret; - } - free(ret_saved); - return ret_addr; -} - -uint32_t wrapper_tmpnam(uint8_t *mem, uint32_t str_addr) { - char buf[1024]; - assert(str_addr != 0 && "s NULL not implemented for tmpnam"); - char *ret = tmpnam(buf); - if (ret == NULL) { - return 0; - } else { - strcpy1(mem, str_addr, ret); - return str_addr; - } -} - -uint32_t wrapper_mktemp(uint8_t *mem, uint32_t template_addr) { - STRING(template) - mktemp(template); - strcpy1(mem, template_addr, template); - return template_addr; -} - -int wrapper_mkstemp(uint8_t* mem, uint32_t name_addr) { - STRING(name) - int fd = mkstemp(name); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - } else { - strcpy1(mem, name_addr, name); - } - return fd; -} - -uint32_t wrapper_tmpfile(uint8_t* mem) { - // create and fopen a temporary file that is removed when the program exits - const char* tmpdir = getenv("TMPDIR"); - if (tmpdir == NULL) { - tmpdir = "/tmp"; - } - - char name[PATH_MAX + 1] = { 0 }; - int n = snprintf(name, sizeof(name), "%s/copt_temp_XXXXXX", tmpdir); - if (n < 0 || n >= sizeof(name)) { - // This isn't the best errno code, but it is one that can be returned by tmpfile - MEM_U32(ERRNO_ADDR) = EACCES; - return 0; - } - - int fd = mkstemp(name); - if (fd < 0) { - MEM_U32(ERRNO_ADDR) = errno; - return 0; - } - - // the file will be removed from disk when it's closed later - unlink(name); - - // fdopen: - uint32_t ret = init_file(mem, fd, -1, NULL, "w+"); - if (ret == 0) { - close(fd); - } - return ret; -} - -int wrapper_wait(uint8_t* mem, uint32_t wstatus_addr) { - int wstatus; - pid_t ret = wait(&wstatus); - MEM_S32(wstatus_addr) = wstatus; - return ret; -} - -int wrapper_kill(uint8_t* mem, int pid, int sig) { - int ret = kill(pid, sig); - if (ret != 0) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_execlp(uint8_t* mem, uint32_t file_addr, uint32_t sp) { - uint32_t argv_addr = sp + 4; - return wrapper_execvp(mem, file_addr, argv_addr); -} - -int wrapper_execv(uint8_t* mem, uint32_t pathname_addr, uint32_t argv_addr) { - STRING(pathname) - uint32_t argc = 0; - while (MEM_U32(argv_addr + argc * 4) != 0) { - ++argc; - } - char* argv[argc + 1]; - for (uint32_t i = 0; i < argc; i++) { - uint32_t str_addr = MEM_U32(argv_addr + i * 4); - uint32_t len = wrapper_strlen(mem, str_addr) + 1; - argv[i] = (char*)malloc(len); - char* pos = argv[i]; - while (len--) { - *pos++ = MEM_S8(str_addr); - ++str_addr; - } - } - argv[argc] = NULL; - execv(pathname, argv); - MEM_U32(ERRNO_ADDR) = errno; - for (uint32_t i = 0; i < argc; i++) { - free(argv[i]); - } - return -1; -} - -int wrapper_execvp(uint8_t* mem, uint32_t file_addr, uint32_t argv_addr) { - STRING(file) - uint32_t argc = 0; - while (MEM_U32(argv_addr + argc * 4) != 0) { - ++argc; - } - char* argv[argc + 1]; - for (uint32_t i = 0; i < argc; i++) { - uint32_t str_addr = MEM_U32(argv_addr + i * 4); - uint32_t len = wrapper_strlen(mem, str_addr) + 1; - argv[i] = (char*)malloc(len); - char* pos = argv[i]; - while (len--) { - *pos++ = MEM_S8(str_addr); - ++str_addr; - } - } - argv[argc] = NULL; - - char rfile[PATH_MAX + 1]; - redirect_path(rfile, file, "/usr/lib", usr_lib_redirect); - - execvp(rfile, argv); - - MEM_U32(ERRNO_ADDR) = errno; - for (uint32_t i = 0; i < argc; i++) { - free(argv[i]); - } - return -1; -} - -int wrapper_fork(uint8_t* mem) { - int ret = fork(); - if (ret == -1) { - MEM_U32(ERRNO_ADDR) = errno; - } - return ret; -} - -int wrapper_system(uint8_t* mem, uint32_t command_addr) { - STRING(command) - return system(command); // no errno -} - -static int name_compare(uint8_t* mem, uint32_t a_addr, uint32_t b_addr) { - return wrapper_strcmp(mem, MEM_U32(a_addr), MEM_U32(b_addr)); -} - -static uint32_t tsearch_tfind(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr, bool insert) { - if (rootp_addr == 0) { - return 0; - } - while (MEM_U32(rootp_addr) != 0) { - uint32_t node_addr = MEM_U32(rootp_addr); - int r = name_compare(mem, key_addr, MEM_U32(node_addr)); - if (r == 0) { - return node_addr; - } - rootp_addr = r < 0 ? node_addr + 4 : node_addr + 8; - } - if (insert) { - uint32_t node_addr = wrapper_malloc(mem, 12); - if (node_addr != 0) { - MEM_U32(rootp_addr) = node_addr; - MEM_U32(node_addr) = key_addr; - MEM_U32(node_addr + 4) = 0; - MEM_U32(node_addr + 8) = 0; - return node_addr; - } - } - return 0; -} - -uint32_t wrapper_tsearch(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr) { - return tsearch_tfind(mem, key_addr, rootp_addr, compar_addr, true); -} - -uint32_t wrapper_tfind(uint8_t* mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr) { - return tsearch_tfind(mem, key_addr, rootp_addr, compar_addr, false); -} - -// qsort implementation from SGI libc, originally derived from -// https://people.ece.ubc.ca/~eddieh/glu_dox/d7/da4/qsort_8c_source.html (public domain) - -#define CMP(x, y) (int32_t)(trampoline(mem, sp, (x), (y), 0, 0, compare_addr) >> 32) - -static void qst(uint8_t* mem, uint32_t start, uint32_t end, fptr_trampoline trampoline, uint32_t compare_addr, - uint32_t sp, uint32_t size, uint32_t minSortSize, uint32_t medianOfThreeThreshold); - -uint32_t wrapper_qsort(uint8_t* mem, uint32_t base_addr, uint32_t count, uint32_t size, fptr_trampoline trampoline, - uint32_t compare_addr, uint32_t sp) { - uint32_t end; - uint32_t it; - uint32_t prevIt; - uint32_t byteIt; - uint32_t hi; - uint32_t insPos; - uint32_t cur; - uint32_t smallest; - uint8_t temp; - - if (count < 2) { - return 0; - } - - end = base_addr + (count * size); - - if (count >= 4) { - // run a rough quicksort - qst(mem, base_addr, end, trampoline, compare_addr, sp, size, size * 4, size * 6); - // the smallest element will be one of the first 4 - hi = base_addr + size * 4; - } else { - hi = end; - } - - // Find the smallest element and swap it to the front - smallest = base_addr; - for (it = base_addr + size; it < hi; it += size) { - if (CMP(smallest, it) > 0) { - smallest = it; - } - } - - if (smallest != base_addr) { - for (it = base_addr; it < base_addr + size; smallest++, it++) { - temp = MEM_U8(smallest); - MEM_U8(smallest) = MEM_U8(it); - MEM_U8(it) = temp; - } - } - - // Do insertion sort on the rest of the elements - for (cur = base_addr + size; cur < end; cur += size) { - - // Find where cur should go - insPos = cur - size; - while (CMP(insPos, cur) > 0) { - if (base_addr == insPos) { - // This isn't logically possible, because we've put the smallest element first. - // But it can happen if the comparator function is faulty, and it's best not to - // write out of bounds in that situation. - break; - } - insPos -= size; - } - insPos += size; - - if (insPos == cur) { - continue; - } - - for (byteIt = cur + size; --byteIt >= cur;) { - temp = MEM_U8(byteIt); - prevIt = byteIt; - for (it = byteIt - size; it >= insPos; it -= size) { - MEM_U8(prevIt) = MEM_U8(it); - prevIt = it; - } - MEM_U8(prevIt) = temp; - } - } - - return 0; -} - -static void qst(uint8_t* mem, uint32_t start, uint32_t end, fptr_trampoline trampoline, uint32_t compare_addr, - uint32_t sp, uint32_t size, uint32_t minSortSize, uint32_t medianOfThreeThreshold) { - uint32_t sizeAfterPivot; - uint32_t sizeBeforePivot; - uint32_t totalSize; - int32_t i; - uint32_t afterPivot; - uint32_t last; - uint32_t newPartitionFirst; - uint32_t median; - uint32_t partitionFirst; - uint32_t partitionLast; - uint32_t pivot; - uint32_t swapWith; - uint8_t temp; - - totalSize = end - start; - do { - last = end - size; - pivot = partitionFirst = (((totalSize / size) >> 1) * size) + start; - if (totalSize >= medianOfThreeThreshold) { - // compute median of three - median = CMP(start, pivot) > 0 ? start : pivot; - if (CMP(median, last) > 0) { - median = median == start ? pivot : start; - median = CMP(median, last) < 0 ? last : median; - } - - // swap the median so it ends up in the middle - if (median != pivot) { - // Fake-match: use partitionFirst here instead of e.g. swapWith. - i = size; - do { - temp = MEM_U8(partitionFirst); - MEM_U8(partitionFirst) = MEM_U8(median); - MEM_U8(median) = temp; - partitionFirst++; - median++; - i--; - } while (i != 0); - } - } - - // Partition the elements start, ..., pivot, ..., last, such that values smaller than the - // pivot are on the left, and values greater than the pivot are on the right (equal ones can - // go wherever). The pivot may end up getting swapped into another position in the process. - - partitionFirst = start; - partitionLast = last; - - // Loop invariant: Elements partitionFirst, ..., partitionLast remain to be partitioned, - // and pivot is in that range. - for (;;) { - while (partitionFirst < pivot && CMP(partitionFirst, pivot) < 0) { - // Skip over smaller values on the left. - partitionFirst += size; - } - - while (pivot < partitionLast) { - if (CMP(pivot, partitionLast) < 0) { - // Skip over greater values on the right. - partitionLast -= size; - } else { - // We have found a value we cannot skip over. Put it at the front. - // If the pivot was at the front, it gets swapped to the last position, - // otherwise, the value at the front is something we know isn't smaller - // than the pivot, so we can skip partitioning it. - newPartitionFirst = partitionFirst + size; - if (partitionFirst == pivot) { - swapWith = partitionLast; - pivot = partitionLast; - } else { - swapWith = partitionLast; - partitionLast -= size; - } - goto swapFront; - } - } - - // We have hit up against the pivot at the end. Swap it to the front to we can - // skip over it. The front element is known to not be smaller than the pivot, - // except if the pivot is at the front also, i.e. if the range has been reduced - // down to size 1 -- in that case it's time to break out of the loop. - partitionLast -= size; - if (partitionFirst == pivot) { - break; - } - swapWith = pivot; - pivot = partitionFirst; - newPartitionFirst = partitionFirst; - - swapFront: - i = size; - do { - temp = MEM_U8(partitionFirst); - MEM_U8(partitionFirst) = MEM_U8(swapWith); - MEM_U8(swapWith) = temp; - partitionFirst++; - swapWith++; - i--; - } while (i != 0); - partitionFirst = newPartitionFirst; - } - - afterPivot = pivot + size; - sizeBeforePivot = pivot - start; - sizeAfterPivot = end - afterPivot; - totalSize = sizeBeforePivot; - if (sizeAfterPivot >= sizeBeforePivot) { - if (sizeBeforePivot >= minSortSize) { - qst(mem, start, pivot, trampoline, compare_addr, sp, size, minSortSize, medianOfThreeThreshold); - } - start = afterPivot; - totalSize = sizeAfterPivot; - } else { - if (sizeAfterPivot >= minSortSize) { - qst(mem, afterPivot, end, trampoline, compare_addr, sp, size, minSortSize, medianOfThreeThreshold); - } - end = pivot; - } - } while (totalSize >= minSortSize); -} - -#undef CMP - -uint32_t wrapper_regcmp(uint8_t* mem, uint32_t string1_addr, uint32_t sp) { - STRING(string1); - fprintf(stderr, "regex string: %s\n", string1); - assert(0 && "regcmp not implemented"); - return 0; -} - -uint32_t wrapper_regex(uint8_t* mem, uint32_t re_addr, uint32_t subject_addr, uint32_t sp) { - STRING(subject); - assert(0 && "regex not implemented"); - return 0; -} - -void wrapper___assert(uint8_t* mem, uint32_t assertion_addr, uint32_t file_addr, int line) { - STRING(assertion) - STRING(file) - __assert(assertion, file, line); -} - -union host_doubleword { - uint64_t ww; - double d; -}; - -union FloatReg FloatReg_from_double(double d) { - union host_doubleword val; - union FloatReg floatreg; - - val.d = d; - - floatreg.w[0] = val.ww & 0xFFFFFFFF; - floatreg.w[1] = (val.ww >> 32) & 0xFFFFFFFF; - - return floatreg; -} - -double double_from_FloatReg(union FloatReg floatreg) { - union host_doubleword val; - - val.ww = floatreg.w[1]; - val.ww <<= 32; - val.ww |= floatreg.w[0]; - return val.d; -} - -double double_from_memory(uint8_t* mem, uint32_t address) { - union host_doubleword val; - - val.ww = MEM_U32(address); - val.ww <<= 32; - val.ww |= MEM_U32(address + 4); - return val.d; -} diff --git a/tools/ido-static-recomp/libc_impl.h b/tools/ido-static-recomp/libc_impl.h deleted file mode 100644 index b9f50b37..00000000 --- a/tools/ido-static-recomp/libc_impl.h +++ /dev/null @@ -1,182 +0,0 @@ -#ifndef LIBC_IMPL_H -#define LIBC_IMPL_H - -#include - -union FloatReg { - float f[2]; - uint32_t w[2]; - //double d; -}; - -void mmap_initial_data_range(uint8_t *mem, uint32_t start, uint32_t end); -void setup_libc_data(uint8_t *mem); - -uint32_t wrapper_sbrk(uint8_t *mem, int increment); -uint32_t wrapper_malloc(uint8_t *mem, uint32_t size); -uint32_t wrapper_calloc(uint8_t *mem, uint32_t num, uint32_t size); -uint32_t wrapper_realloc(uint8_t *mem, uint32_t data_addr, uint32_t size); -int wrapper_fscanf(uint8_t *mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp); -int wrapper_printf(uint8_t *mem, uint32_t format_addr, uint32_t sp); -int wrapper_sprintf(uint8_t *mem, uint32_t str_addr, uint32_t format_addr, uint32_t sp); -int wrapper_fprintf(uint8_t *mem, uint32_t fp_addr, uint32_t format_addr, uint32_t sp); -int wrapper__doprnt(uint8_t *mem, uint32_t format_addr, uint32_t params_addr, uint32_t fp_addr); -void wrapper_free(uint8_t *mem, uint32_t data_addr); -uint32_t wrapper_strlen(uint8_t *mem, uint32_t str_addr); -int wrapper_open(uint8_t *mem, uint32_t pathname_addr, int flags, int mode); -int wrapper_creat(uint8_t *mem, uint32_t pathname_addr, int mode); -int wrapper_access(uint8_t *mem, uint32_t pathname_addr, int mode); -int wrapper_rename(uint8_t *mem, uint32_t oldpath_addr, uint32_t newpath_addr); -int wrapper_utime(uint8_t *mem, uint32_t filename_addr, uint32_t times_addr); -int wrapper_flock(uint8_t *mem, int fd, int operation); -int wrapper_chmod(uint8_t *mem, uint32_t path_addr, uint32_t mode); -int wrapper_umask(int mode); -uint32_t wrapper_ecvt(uint8_t *mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr); -uint32_t wrapper_fcvt(uint8_t *mem, double number, int ndigits, uint32_t decpt_addr, uint32_t sign_addr); -double wrapper_sqrt(double v); -float wrapper_sqrtf(float v); -int wrapper_atoi(uint8_t *mem, uint32_t nptr_addr); -int wrapper_atol(uint8_t *mem, uint32_t nptr_addr); -double wrapper_atof(uint8_t *mem, uint32_t nptr_addr); -int wrapper_strtol(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -uint32_t wrapper_strtoul(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -int64_t wrapper_strtoll(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -uint64_t wrapper_strtoull(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr, int base); -double wrapper_strtod(uint8_t *mem, uint32_t nptr_addr, uint32_t endptr_addr); -uint32_t wrapper_strchr(uint8_t *mem, uint32_t str_addr, int c); -uint32_t wrapper_strrchr(uint8_t *mem, uint32_t str_addr, int c); -uint32_t wrapper_strcspn(uint8_t *mem, uint32_t str_addr, uint32_t invalid_addr); -uint32_t wrapper_strpbrk(uint8_t *mem, uint32_t str_addr, uint32_t accept_addr); -int wrapper_fstat(uint8_t *mem, int fildes, uint32_t buf_addr); -int wrapper_stat(uint8_t *mem, uint32_t pathname_addr, uint32_t buf_addr); -int wrapper_ftruncate(uint8_t *mem, int fd, int length); -int wrapper_truncate(uint8_t *mem, uint32_t pathname_addr, int length); -void wrapper_bcopy(uint8_t *mem, uint32_t src_addr, uint32_t dst_addr, uint32_t len); -uint32_t wrapper_memcpy(uint8_t *mem, uint32_t dst_addr, uint32_t src_addr, uint32_t len); -uint32_t wrapper_memccpy(uint8_t *mem, uint32_t dst_addr, uint32_t src_addr, int c, uint32_t len); -int wrapper_read(uint8_t *mem, int fd, uint32_t buf_addr, uint32_t nbytes); -int wrapper_write(uint8_t *mem, int fd, uint32_t buf_addr, uint32_t nbytes); -uint32_t wrapper_fopen(uint8_t *mem, uint32_t path_addr, uint32_t mode_addr); -uint32_t wrapper_freopen(uint8_t *mem, uint32_t path_addr, uint32_t mode_addr, uint32_t fp_addr); -int wrapper_fclose(uint8_t *mem, uint32_t fp_addr); -int wrapper_fflush(uint8_t *mem, uint32_t fp_addr); -int wrapper_fchown(uint8_t *mem, int fd, int owner, int group); -int wrapper_ftell(uint8_t *mem, uint32_t fp_addr); -void wrapper_rewind(uint8_t *mem, uint32_t fp_addr); -int wrapper_fseek(uint8_t *mem, uint32_t fp_addr, int offset, int origin); -int wrapper_lseek(uint8_t *mem, int fd, int offset, int whence); -int wrapper_dup(uint8_t *mem, int fd); -int wrapper_dup2(uint8_t *mem, int oldfd, int newfd); -int wrapper_pipe(uint8_t *mem, uint32_t pipefd_addr); -void wrapper_perror(uint8_t *mem, uint32_t str_addr); -int wrapper_fdopen(uint8_t *mem, int fd, uint32_t mode_addr); -uint32_t wrapper_memset(uint8_t *mem, uint32_t dest_addr, int byte, uint32_t n); -int wrapper_bcmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n); -int wrapper_memcmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n); -int wrapper_getpid(void); -int wrapper_getpgrp(uint8_t *mem); -int wrapper_remove(uint8_t *mem, uint32_t path_addr); -int wrapper_unlink(uint8_t *mem, uint32_t path_addr); -int wrapper_close(uint8_t *mem, int fd); -int wrapper_strcmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr); -int wrapper_strncmp(uint8_t *mem, uint32_t s1_addr, uint32_t s2_addr, uint32_t n); -uint32_t wrapper_strcpy(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr); -uint32_t wrapper_strncpy(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n); -uint32_t wrapper_strcat(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr); -uint32_t wrapper_strncat(uint8_t *mem, uint32_t dest_addr, uint32_t src_addr, uint32_t n); -uint32_t wrapper_strtok(uint8_t *mem, uint32_t str_addr, uint32_t delimiters_addr); -uint32_t wrapper_strstr(uint8_t *mem, uint32_t str1_addr, uint32_t str2_addr); -uint32_t wrapper_strdup(uint8_t *mem, uint32_t str_addr); -int wrapper_toupper(int c); -int wrapper_tolower(int c); -int wrapper_gethostname(uint8_t *mem, uint32_t name_addr, uint32_t len); -int wrapper_isatty(uint8_t *mem, int fd); -int wrapper_times(uint8_t *mem, uint32_t buffer_addr); -uint32_t wrapper_strftime(uint8_t *mem, uint32_t ptr_addr, uint32_t maxsize, uint32_t format_addr, uint32_t timeptr_addr); -int wrapper_clock(void); -uint32_t wrapper_ctime(uint8_t *mem, uint32_t timep_addr); -uint32_t wrapper_localtime(uint8_t *mem, uint32_t timep_addr); -int wrapper_setvbuf(uint8_t *mem, uint32_t fp_addr, uint32_t buf_addr, int mode, uint32_t size); -int wrapper___semgetc(uint8_t *mem, uint32_t fp_addr); -int wrapper___semputc(uint8_t *mem, int c, uint32_t fp_addr); -int wrapper_fgetc(uint8_t *mem, uint32_t fp_addr); -int wrapper_fgets(uint8_t *mem, uint32_t str_addr, int count, uint32_t fp_addr); -int wrapper___filbuf(uint8_t *mem, uint32_t fp_addr); -int wrapper___flsbuf(uint8_t *mem, int ch, uint32_t fp_addr); -int wrapper_ungetc(uint8_t *mem, int ch, uint32_t fp_addr); -uint32_t wrapper_gets(uint8_t *mem, uint32_t str_addr); -uint32_t wrapper_fread(uint8_t *mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr); -uint32_t wrapper_fwrite(uint8_t *mem, uint32_t data_addr, uint32_t size, uint32_t count, uint32_t fp_addr); -int wrapper_fputs(uint8_t *mem, uint32_t str_addr, uint32_t fp_addr); -int wrapper_puts(uint8_t *mem, uint32_t str_addr); -uint32_t wrapper_getcwd(uint8_t *mem, uint32_t buf_addr, uint32_t size); -int wrapper_time(uint8_t *mem, uint32_t tloc_addr); -void wrapper_bzero(uint8_t *mem, uint32_t str_addr, uint32_t n); -int wrapper_fp_class_d(double d); -double wrapper_ldexp(double d, int i); -uint64_t wrapper___ll_mul(uint64_t a0, uint64_t a1); -int64_t wrapper___ll_div(int64_t a0, int64_t a1); -int64_t wrapper___ll_rem(uint64_t a0, int64_t a1); -uint64_t wrapper___ll_lshift(uint64_t a0, uint64_t shift); -int64_t wrapper___ll_rshift(int64_t a0, uint64_t shift); -uint64_t wrapper___ull_div(uint64_t a0, uint64_t a1); -uint64_t wrapper___ull_rem(uint64_t a0, uint64_t a1); -uint64_t wrapper___ull_rshift(uint64_t a0, uint64_t shift); -uint64_t wrapper___d_to_ull(double d); -int64_t wrapper___d_to_ll(double d); -uint64_t wrapper___f_to_ull(float f); -int64_t wrapper___f_to_ll(float f); -float wrapper___ull_to_f(uint64_t v); -float wrapper___ll_to_f(int64_t v); -double wrapper___ull_to_d(uint64_t v); -double wrapper___ll_to_d(int64_t v); -void wrapper_abort(uint8_t *mem); -void wrapper_exit(uint8_t *mem, int status); -void wrapper__exit(uint8_t *mem, int status); -void wrapper__cleanup(uint8_t *mem); -uint32_t wrapper__rld_new_interface(uint8_t *mem, uint32_t operation, uint32_t sp); -void wrapper__exithandle(uint8_t *mem); -int wrapper__prctl(uint8_t *mem, int operation, uint32_t sp); -double wrapper__atod(uint8_t *mem, uint32_t buffer_addr, int ndigits, int dexp); -int wrapper_pathconf(uint8_t *mem, uint32_t path_addr, int name); -uint32_t wrapper_getenv(uint8_t *mem, uint32_t name_addr); -uint32_t wrapper_gettxt(uint8_t *mem, uint32_t msgid_addr, uint32_t default_str_addr); -uint32_t wrapper_setlocale(uint8_t *mem, int category, uint32_t locale_addr); -uint32_t wrapper_mmap(uint8_t *mem, uint32_t addr, uint32_t length, int prot, int flags, int fd, int offset); -int wrapper_munmap(uint8_t *mem, uint32_t addr, uint32_t length); -int wrapper_mprotect(uint8_t *mem, uint32_t addr, uint32_t length, int prot); -int wrapper_sysconf(uint8_t *mem, int name); -int wrapper_getpagesize(uint8_t *mem); -int wrapper_strerror(uint8_t *mem, int errnum); -int wrapper_ioctl(uint8_t *mem, int fd, uint32_t request, uint32_t sp); -int wrapper_fcntl(uint8_t *mem, int fd, int cmd, uint32_t sp); -uint32_t wrapper_signal(uint8_t *mem, int signum, uint64_t (*trampoline)(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t fp_dest), uint32_t handler_addr, uint32_t sp); -uint32_t wrapper_sigset(uint8_t *mem, int signum, uint64_t (*trampoline)(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t fp_dest), uint32_t disp_addr, uint32_t sp); -int wrapper_get_fpc_csr(uint8_t *mem); -int wrapper_set_fpc_csr(uint8_t *mem, int csr); -int wrapper_setjmp(uint8_t *mem, uint32_t addr); -void wrapper_longjmp(uint8_t *mem, uint32_t addr, int status); -uint32_t wrapper_tempnam(uint8_t *mem, uint32_t dir_addr, uint32_t pfx_addr); -uint32_t wrapper_tmpnam(uint8_t *mem, uint32_t str_addr); -uint32_t wrapper_mktemp(uint8_t *mem, uint32_t template_addr); -int wrapper_mkstemp(uint8_t *mem, uint32_t name_addr); -uint32_t wrapper_tmpfile(uint8_t *mem); -int wrapper_wait(uint8_t *mem, uint32_t wstatus_addr); -int wrapper_kill(uint8_t *mem, int pid, int sig); -int wrapper_execlp(uint8_t *mem, uint32_t file_addr, uint32_t sp); -int wrapper_execv(uint8_t *mem, uint32_t pathname_addr, uint32_t argv_addr); -int wrapper_execvp(uint8_t *mem, uint32_t file_addr, uint32_t argv_addr); -int wrapper_fork(uint8_t *mem); -int wrapper_system(uint8_t *mem, uint32_t command_addr); -uint32_t wrapper_tsearch(uint8_t *mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr); -uint32_t wrapper_tfind(uint8_t *mem, uint32_t key_addr, uint32_t rootp_addr, uint32_t compar_addr); -uint32_t wrapper_qsort(uint8_t *mem, uint32_t base_addr, uint32_t num, uint32_t size, uint64_t (*trampoline)(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t fp_dest), uint32_t compare_addr, uint32_t sp); -uint32_t wrapper_regcmp(uint8_t *mem, uint32_t string1_addr, uint32_t sp); -uint32_t wrapper_regex(uint8_t *mem, uint32_t re_addr, uint32_t subject_addr, uint32_t sp); -void wrapper___assert(uint8_t *mem, uint32_t assertion_addr, uint32_t file_addr, int line); - -union FloatReg FloatReg_from_double(double d); -double double_from_FloatReg(union FloatReg floatreg); -double double_from_memory(uint8_t *mem, uint32_t address); - -#endif diff --git a/tools/ido-static-recomp/recomp.cpp b/tools/ido-static-recomp/recomp.cpp deleted file mode 100644 index 683e750d..00000000 --- a/tools/ido-static-recomp/recomp.cpp +++ /dev/null @@ -1,3813 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "rabbitizer.hpp" -#include "rabbitizer.h" - -#include "elf.h" - -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#endif /* _WIN32 && !__CYGWIN__ */ - -#if !defined(_MSC_VER) && !defined(__CYGWIN__) && !defined(_WIN32) -#define UNIX_PLATFORM -#endif - -#ifdef UNIX_PLATFORM -// TODO: determine if any of those headers are not required -#include -#include -#include // for __cxa_demangle -#include // for dladdr -#include -#include -#endif - -#ifndef FULL_TRACEBACK -// Change to non-zero to have full traceback, including names not exported -#define FULL_TRACEBACK 0 -#endif - -// set this to 1 when testing a new program, to verify that no false function pointers are found -#define INSPECT_FUNCTION_POINTERS 0 - -#ifndef TRACE -#define TRACE 0 -#endif - -#define LABELS_64_BIT 1 - -#ifndef DUMP_INSTRUCTIONS -// Set to non-zero to dump actual disassembly when dumping C code -#define DUMP_INSTRUCTIONS 0 -#endif - -#define u32be(x) (uint32_t)(((x & 0xff) << 24) + ((x & 0xff00) << 8) + ((x & 0xff0000) >> 8) + ((uint32_t)(x) >> 24)) -#define u16be(x) (uint16_t)(((x & 0xff) << 8) + ((x & 0xff00) >> 8)) -#define read_u32_be(buf) (uint32_t)(((buf)[0] << 24) + ((buf)[1] << 16) + ((buf)[2] << 8) + ((buf)[3])) - -#define UniqueId_cpu_li rabbitizer::InstrId::UniqueId::cpu_USERDEF_00 -#define UniqueId_cpu_la rabbitizer::InstrId::UniqueId::cpu_USERDEF_01 - -using namespace std; - -struct Edge { - uint32_t i; - uint8_t function_entry : 1; - uint8_t function_exit : 1; - uint8_t extern_function : 1; - uint8_t function_pointer : 1; -}; - -struct Insn { - // base instruction - rabbitizer::InstructionCpu instruction; - - // - bool is_global_got_memop; - bool no_following_successor; - - // patching instructions - bool patched; - // lui pairs - uint32_t patched_addr; - // immediates are 16 bits wide, but they can be either signed or unsigned - // a 32 bits signed member can hold all those possible values - int32_t patched_imms; - rabbitizer::Registers::Cpu::GprO32 lila_dst_reg; - int linked_insn; - union { - uint32_t linked_value; - float linked_float; - }; - - // jumptable instructions - uint32_t jtbl_addr; - uint32_t num_cases; - rabbitizer::Registers::Cpu::GprO32 index_reg; - - // graph - vector successors; - vector predecessors; - uint64_t b_liveout; - uint64_t b_livein; - uint64_t f_livein; - uint64_t f_liveout; - - Insn(uint32_t word, uint32_t vram) : instruction(word, vram) { - this->is_global_got_memop = false; - this->no_following_successor = false; - - this->patched = false; - this->patched_addr = 0; - this->patched_imms = 0; - this->lila_dst_reg = rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero; - this->linked_insn = -1; - this->linked_value = 0; - - this->jtbl_addr = 0; - this->num_cases = 0; - this->index_reg = rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero; - - this->b_liveout = 0; - this->b_livein = 0; - this->f_livein = 0; - this->f_liveout = 0; - } - - void patchInstruction(rabbitizer::InstrId::UniqueId instructionId) { - this->patched = true; - RabbitizerInstruction* innerInstr = this->instruction.getCPtr(); - innerInstr->uniqueId = (RabbitizerInstrId)(instructionId); - innerInstr->descriptor = &RabbitizerInstrDescriptor_Descriptors[innerInstr->uniqueId]; - } - - void patchAddress(rabbitizer::InstrId::UniqueId instructionId, uint32_t newAddress) { - this->patchInstruction(instructionId); - this->patched_addr = newAddress; - } - - uint32_t getAddress() const { - if (this->patched && this->patched_addr != 0) { - return this->patched_addr; - } - - if (this->instruction.hasOperandAlias(rabbitizer::OperandType::cpu_label)) { - return this->instruction.getInstrIndexAsVram(); - } - - if (this->instruction.isBranch()) { - return this->instruction.getVram() + this->instruction.getBranchOffset(); - } - - assert(!"unreachable code"); - } - - void patchImmediate(int32_t newImmediate) { - this->patched = true; - this->patched_imms = newImmediate; - } - - int32_t getImmediate() const { - if (this->patched) { - return this->patched_imms; - } - - return this->instruction.getProcessedImmediate(); - } - - std::string disassemble() const { - char buffer[0x1000]; - int32_t imm; - - switch (this->instruction.getUniqueId()) { - case UniqueId_cpu_li: - imm = this->getImmediate(); - if (imm >= 0) { - sprintf(buffer, "li %s, 0x%X", RabbitizerRegister_getNameGpr((int)this->lila_dst_reg), - imm); - } else { - sprintf(buffer, "li %s, %i", RabbitizerRegister_getNameGpr((int)this->lila_dst_reg), imm); - } - return buffer; - - case UniqueId_cpu_la: - sprintf(buffer, "la %s, 0x%X", RabbitizerRegister_getNameGpr((int)this->lila_dst_reg), - this->getAddress()); - return buffer; - - default: - return this->instruction.disassembleInstruction(0); - } - } -}; - -struct Function { - vector returns; // points to delay slots - uint32_t end_addr; // address after end - uint32_t nargs; - uint32_t nret; - bool v0_in; - bool referenced_by_function_pointer; -}; - -bool conservative; - -const uint8_t* text_section; -uint32_t text_section_len; -uint32_t text_vaddr; - -const uint8_t* rodata_section; -uint32_t rodata_section_len; -uint32_t rodata_vaddr; - -const uint8_t* data_section; -uint32_t data_section_len; -uint32_t data_vaddr; - -uint32_t bss_section_len; -uint32_t bss_vaddr; - -vector insns; -set label_addresses; -vector got_globals; -vector got_locals; -uint32_t gp_value; -uint32_t gp_value_adj; - -map symbol_names; - -vector> data_function_pointers; -set la_function_pointers; -map functions; -uint32_t main_addr; -uint32_t mcount_addr; -uint32_t procedure_table_start; -uint32_t procedure_table_len; - -#define FLAG_NO_MEM 1 -#define FLAG_VARARG 2 - -/** - * Struct containing information on external functions that are called using the wrappers in `libc_impl.c`. - * - * name: function name - * params: first char is return type, subsequent chars are argument types. Key to chars used: - * - 'v' void - * - 'i' signed int (int32_t) - * - 'u' unsigned int (uint32_t) - * - 'p' pointer (uintptr_t) - * - 'f' float - * - 'd' double - * - 'l' signed long long (int64_t) - * - 'j' unsigned long long (uint64_t) - * - 't' trampoline - * - * flags: use defines above - */ -const struct ExternFunction { - const char* name; - const char* params; - int flags; -} extern_functions[] = { - { "exit", "vi", 0 }, // override exit from application - { "abort", "v", 0 }, - { "sbrk", "pi", 0 }, - { "malloc", "pu", 0 }, - { "calloc", "puu", 0 }, - { "realloc", "ppu", 0 }, - { "free", "vp", 0 }, - { "fscanf", "ipp", FLAG_VARARG }, - { "printf", "ip", FLAG_VARARG }, - { "sprintf", "ipp", FLAG_VARARG }, - { "fprintf", "ipp", FLAG_VARARG }, - { "_doprnt", "ippp", 0 }, - { "strlen", "up", 0 }, - { "open", "ipii", 0 }, - { "creat", "ipi", 0 }, - { "access", "ipi", 0 }, - { "rename", "ipp", 0 }, - { "utime", "ipp", 0 }, - { "flock", "iii", 0 }, - { "chmod", "ipu", 0 }, - { "umask", "ii", FLAG_NO_MEM }, - { "ecvt", "pdipp", 0 }, - { "fcvt", "pdipp", 0 }, - { "sqrt", "dd", FLAG_NO_MEM }, - { "sqrtf", "ff", FLAG_NO_MEM }, - { "atoi", "ip", 0 }, - { "atol", "ip", 0 }, - { "atof", "dp", 0 }, - { "strtol", "ippi", 0 }, - { "strtoul", "uppi", 0 }, - { "strtoll", "lppi", 0 }, - { "strtoull", "jppi", 0 }, - { "strtod", "dpp", 0 }, - { "strchr", "ppi", 0 }, - { "strrchr", "ppi", 0 }, - { "strcspn", "upp", 0 }, - { "strpbrk", "ppp", 0 }, - { "fstat", "iip", 0 }, - { "stat", "ipp", 0 }, - { "ftruncate", "iii", 0 }, - { "truncate", "ipi", 0}, - { "bcopy", "vppu", 0 }, - { "memcpy", "pppu", 0 }, - { "memccpy", "pppiu", 0 }, - { "read", "iipu", 0 }, - { "write", "iipu", 0 }, - { "fopen", "ppp", 0 }, - { "freopen", "pppp", 0 }, - { "fclose", "ip", 0 }, - { "ftell", "ip", 0 }, - { "rewind", "vp", 0 }, - { "fseek", "ipii", 0 }, - { "lseek", "iiii", 0 }, - { "fflush", "ip", 0 }, - { "fchown", "iiii", 0 }, - { "dup", "ii", 0 }, - { "dup2", "iii", 0 }, - { "pipe", "ip", 0 }, - { "perror", "vp", 0 }, - { "fdopen", "iip", 0 }, - { "memset", "ppiu", 0 }, - { "bcmp", "ippu", 0 }, - { "memcmp", "ippu", 0 }, - { "getpid", "i", FLAG_NO_MEM }, - { "getpgrp", "i", 0 }, - { "remove", "ip", 0 }, - { "unlink", "ip", 0 }, - { "close", "ii", 0 }, - { "strcmp", "ipp", 0 }, - { "strncmp", "ippu", 0 }, - { "strcpy", "ppp", 0 }, - { "strncpy", "pppu", 0 }, - { "strcat", "ppp", 0 }, - { "strncat", "pppu", 0 }, - { "strtok", "ppp", 0 }, - { "strstr", "ppp", 0 }, - { "strdup", "pp", 0 }, - { "toupper", "ii", FLAG_NO_MEM }, - { "tolower", "ii", FLAG_NO_MEM }, - { "gethostname", "ipu", 0 }, - { "isatty", "ii", 0 }, - { "strftime", "upupp", 0 }, - { "times", "ip", 0 }, - { "clock", "i", FLAG_NO_MEM }, - { "ctime", "pp", 0 }, - { "localtime", "pp", 0 }, - { "setvbuf", "ippiu", 0 }, - { "__semgetc", "ip", 0 }, - { "__semputc", "iip", 0 }, - { "fgetc", "ip", 0 }, - { "fgets", "ipip", 0 }, - { "__filbuf", "ip", 0 }, - { "__flsbuf", "iip", 0 }, - { "ungetc", "iip", 0 }, - { "gets", "pp", 0 }, - { "fread", "upuup", 0 }, - { "fwrite", "upuup", 0 }, - { "fputs", "ipp", 0 }, - { "puts", "ip", 0 }, - { "getcwd", "ppu", 0 }, - { "time", "ip", 0 }, - { "bzero", "vpu", 0 }, - { "fp_class_d", "id", FLAG_NO_MEM }, - { "ldexp", "ddi", FLAG_NO_MEM }, - { "__ll_mul", "lll", FLAG_NO_MEM }, - { "__ll_div", "lll", FLAG_NO_MEM }, - { "__ll_rem", "ljl", FLAG_NO_MEM }, - { "__ll_lshift", "llj", FLAG_NO_MEM }, - { "__ll_rshift", "llj", FLAG_NO_MEM }, - { "__ull_div", "jjj", FLAG_NO_MEM }, - { "__ull_rem", "jjj", FLAG_NO_MEM }, - { "__ull_rshift", "jjj", FLAG_NO_MEM }, - { "__d_to_ull", "jd", FLAG_NO_MEM }, - { "__d_to_ll", "ld", FLAG_NO_MEM }, - { "__f_to_ull", "jf", FLAG_NO_MEM }, - { "__f_to_ll", "lf", FLAG_NO_MEM }, - { "__ull_to_f", "fj", FLAG_NO_MEM }, - { "__ll_to_f", "fl", FLAG_NO_MEM }, - { "__ull_to_d", "dj", FLAG_NO_MEM }, - { "__ll_to_d", "dl", FLAG_NO_MEM }, - { "_exit", "vi", 0 }, - { "_cleanup", "v", 0 }, - { "_rld_new_interface", "pu", FLAG_VARARG }, - { "_exithandle", "v", 0 }, - { "_prctl", "ii", FLAG_VARARG }, - { "_atod", "dpii", 0 }, - { "pathconf", "ipi", 0 }, - { "getenv", "pp", 0 }, - { "gettxt", "ppp", 0 }, - { "setlocale", "pip", 0 }, - { "mmap", "ppuiiii", 0 }, - { "munmap", "ipu", 0 }, - { "mprotect", "ipui", 0 }, - { "sysconf", "ii", 0 }, - { "getpagesize", "i", 0 }, - { "strerror", "pi", 0 }, - { "ioctl", "iiu", FLAG_VARARG }, - { "fcntl", "iii", FLAG_VARARG }, - { "signal", "pit", 0 }, - { "sigset", "pit", 0 }, - { "get_fpc_csr", "i", 0 }, - { "set_fpc_csr", "ii", 0 }, - { "setjmp", "ip", 0 }, - { "longjmp", "vpi", 0 }, - { "tempnam", "ppp", 0 }, - { "tmpnam", "pp", 0 }, - { "mktemp", "pp", 0 }, - { "mkstemp", "ip", 0 }, - { "tmpfile", "p", 0 }, - { "wait", "ip", 0 }, - { "kill", "iii", 0 }, - { "execlp", "ip", FLAG_VARARG }, - { "execv", "ipp", 0 }, - { "execvp", "ipp", 0 }, - { "fork", "i", 0 }, - { "system", "ip", 0 }, - { "tsearch", "pppp", 0 }, - { "tfind", "pppp", 0 }, - { "qsort", "vpuut", 0 }, - { "regcmp", "pp", FLAG_VARARG }, - { "regex", "ppp", FLAG_VARARG }, - { "__assert", "vppi", 0 }, -}; - -void disassemble(void) { - uint32_t i; - - RabbitizerConfig_Cfg.misc.omit0XOnSmallImm = true; - RabbitizerConfig_Cfg.misc.opcodeLJust -= 8; - RabbitizerConfig_Cfg.misc.upperCaseImm = false; - insns.reserve(1 + text_section_len / sizeof(uint32_t)); // +1 for dummy instruction - - for (i = 0; i < text_section_len; i += sizeof(uint32_t)) { - uint32_t word = read_u32_be(&text_section[i]); - Insn insn(word, text_vaddr + i); - insns.push_back(insn); - } - - { - // Add dummy NOP instruction to avoid out of bounds - Insn insn(0x00000000, text_vaddr + i); - insn.no_following_successor = true; - insns.push_back(insn); - } -} - -void add_function(uint32_t addr) { - if (addr >= text_vaddr && addr < text_vaddr + text_section_len) { - functions[addr]; - } -} - -map::iterator find_function(uint32_t addr) { - if (functions.size() == 0) { - return functions.end(); - } - - auto it = functions.upper_bound(addr); - - if (it == functions.begin()) { - return functions.end(); - } - - --it; - return it; -} - -rabbitizer::Registers::Cpu::GprO32 get_dest_reg(const Insn& insn) { - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_jalr: - // jalr technically modifies rd, so an empty case is here to avoid crashing - break; - - case UniqueId_cpu_li: - case UniqueId_cpu_la: - return insn.lila_dst_reg; - - default: - if (insn.instruction.modifiesRt()) { - return insn.instruction.GetO32_rt(); - } else if (insn.instruction.modifiesRd()) { - return insn.instruction.GetO32_rd(); - } - break; - } - - return rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero; -} - -// try to find a matching LUI for a given register -void link_with_lui(int offset, rabbitizer::Registers::Cpu::GprO32 reg, int mem_imm) { -#define MAX_LOOKBACK 128 - // don't attempt to compute addresses for zero offset - // end search after some sane max number of instructions - int end_search = std::max(0, offset - MAX_LOOKBACK); - - for (int search = offset - 1; search >= end_search; search--) { - switch (insns[search].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_lui: - if (reg == insns[search].instruction.GetO32_rt()) { - goto loop_end; - } - continue; - - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_sub: - case rabbitizer::InstrId::UniqueId::cpu_subu: - if (reg == get_dest_reg(insns[search])) { - if ((insns[search].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw) && - insns[search].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) { - int mem_imm0 = insns[search].instruction.getProcessedImmediate(); - uint32_t got_entry = (mem_imm0 + gp_value_adj) / sizeof(uint32_t); - - if (got_entry < got_locals.size()) { - // used for static functions - uint32_t addr = got_locals[got_entry] + mem_imm; - insns[search].linked_insn = offset; - insns[search].linked_value = addr; - insns[offset].linked_insn = search; - insns[offset].linked_value = addr; - - // Patch instruction to contain full address - insns[search].lila_dst_reg = get_dest_reg(insns[search]); - insns[search].patchAddress(UniqueId_cpu_la, addr); - - // Patch instruction to have offset 0 - switch (insns[offset].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_addiu: { - rabbitizer::Registers::Cpu::GprO32 dst_reg = insns[offset].instruction.GetO32_rt(); - insns[offset].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_move); - // Patch the destination register too - insns[offset].instruction.Set_rd(dst_reg); - } - - if (addr >= text_vaddr && addr < text_vaddr + text_section_len) { - add_function(addr); - } - goto loop_end; - - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_sb: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_sh: - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_sw: - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - case rabbitizer::InstrId::UniqueId::cpu_swc1: - insns[offset].patchImmediate(0); - goto loop_end; - - default: - assert(0 && "Unsupported instruction type"); - } - } - goto loop_end; - } else { - // ignore: reg is pointer, offset is probably struct data member - goto loop_end; - } - } - - continue; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - if ((insns[search].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) && - (offset - search >= 2)) { - // stop looking when previous `jr ra` is hit, - // but ignore if `offset` is branch delay slot for this `jr ra` - goto loop_end; - } - continue; - - default: - continue; - } - } -loop_end:; -} - -// for a given `jalr t9`, find the matching t9 load -void link_with_jalr(int offset) { - // end search after some sane max number of instructions - int end_search = std::max(0, offset - MAX_LOOKBACK); - - for (int search = offset - 1; search >= end_search; search--) { - if (get_dest_reg(insns[search]) == rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9) { - // should be a switch with returns - switch (insns[search].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_lw: - case UniqueId_cpu_la: - if (insns[search].is_global_got_memop || - (insns[search].instruction.getUniqueId() == UniqueId_cpu_la)) { - insns[search].linked_insn = offset; - insns[offset].linked_insn = search; - insns[offset].linked_value = insns[search].linked_value; - - insns[offset].patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, insns[search].linked_value); - - insns[search].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - insns[search].is_global_got_memop = false; - - add_function(insns[search].linked_value); - } - return; - - case rabbitizer::InstrId::UniqueId::cpu_addiu: - if (insns[search].linked_insn != -1) { - uint32_t first = insns[search].linked_insn; - - // not describing as patched since instruction not edited - insns[search].linked_insn = offset; - insns[offset].linked_insn = first; - insns[offset].linked_value = insns[search].linked_value; - } - return; - - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_addu: - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_sub: - case rabbitizer::InstrId::UniqueId::cpu_subu: - return; - - default: - break; - } - } else if ((insns[search].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jr) && - (insns[search].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra)) { - // stop looking when previous `jr ra` is hit - return; - } - } -} - -// TODO: uniformise use of insn vs insns[i] -void pass1(void) { - for (size_t i = 0; i < insns.size(); i++) { - Insn& insn = insns[i]; - - // TODO: replace with BAL. Or just fix properly - if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_bal) { - insn.patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, - insn.instruction.getVram() + insn.instruction.getBranchOffset()); - } - - if (insn.instruction.isJump()) { - if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jal || - insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_j) { - uint32_t target = insn.getAddress(); - - label_addresses.insert(target); - add_function(target); - } else if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jr) { - // sltiu $at, $ty, z - // sw $reg, offset($sp) (very seldom, one or more, usually in func entry) - // lw $gp, offset($sp) (if PIC, and very seldom) - // beqz $at, .L - // some other instruction (not always) - // lui $at, %hi(jtbl) - // sll $tx, $ty, 2 - // addu $at, $at, $tx - // lw $tx, %lo(jtbl)($at) - // nop (code compiled with 5.3) - // addu $tx, $tx, $gp (if PIC) - // jr $tx - - // IDO 7.1: - // lw at,offset(gp) - // andi t9,t8,0x3f - // sll t9,t9,0x2 - // addu at,at,t9 - // lw t9,offset(at) - // addu t9,t9,gp - // jr t9 - - // IDO 5.3: - // lw at,offset(gp) - // andi t3,t2,0x3f - // sll t3,t3,0x2 - // addu at,at,t3 - // something - // lw t3,offset(at) - // something - // addu t3,t3,gp - // jr t3 - if (i >= 7 && rodata_section != NULL) { - bool is_pic = - (insns[i - 1].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_addu) && - (insns[i - 1].instruction.GetO32_rt() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp); - bool has_nop = - insns[i - is_pic - 1].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_nop; - bool has_extra = insns[i - is_pic - has_nop - 5].instruction.getUniqueId() != - rabbitizer::InstrId::UniqueId::cpu_beqz; - int lw = i - (int)is_pic - (int)has_nop - 1; - - if (insns[lw].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_lw) { - --lw; - } - - if ((insns[lw].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw) && - (insns[lw].linked_insn != -1)) { - int sltiu_index = -1; - int andi_index = -1; - uint32_t addu_index = lw - 1; - uint32_t num_cases; - bool found = false; - bool and_variant = false; - int end = 14; - - if (insns[addu_index].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_addu) { - --addu_index; - } - - if (insns[addu_index].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_addu) { - goto skip; - } - - if (insns[addu_index - 1].instruction.getUniqueId() != rabbitizer::InstrId::UniqueId::cpu_sll) { - goto skip; - } - - if (get_dest_reg(insns[addu_index - 1]) != insn.instruction.GetO32_rs()) { - goto skip; - } - - for (int j = 3; j <= 4; j++) { - if (insns[lw - j].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_andi) { - andi_index = lw - j; - break; - } - } - - if (i == 368393) { - // In copt - end = 18; - } - - for (int j = 5; j <= end; j++) { - if ((insns[lw - has_extra - j].instruction.getUniqueId() == - rabbitizer::InstrId::UniqueId::cpu_sltiu) && - (insns[lw - has_extra - j].instruction.GetO32_rt() == - rabbitizer::Registers::Cpu::GprO32::GPR_O32_at)) { - sltiu_index = j; - break; - } - - if (insns[lw - has_extra - j].instruction.getUniqueId() == - rabbitizer::InstrId::UniqueId::cpu_jr) { - // Prevent going into a previous switch - break; - } - } - - if (sltiu_index != -1) { - andi_index = -1; - } - - if (sltiu_index != -1 && insns[lw - has_extra - sltiu_index].instruction.getUniqueId() == - rabbitizer::InstrId::UniqueId::cpu_sltiu) { - num_cases = insns[lw - has_extra - sltiu_index].instruction.getProcessedImmediate(); - found = true; - } else if (andi_index != -1) { - num_cases = insns[andi_index].instruction.getProcessedImmediate() + 1; - found = true; - and_variant = true; - } else if (i == 219382) { - // Special hard case in copt where the initial sltiu is in another basic block - found = true; - num_cases = 13; - } else if (i == 370995) { - // Special hard case in copt where the initial sltiu is in another basic block - found = true; - num_cases = 12; - } - - if (found) { - uint32_t jtbl_addr = insns[lw].linked_value; - - if (is_pic) { - insns[i - 1].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - } - - insn.jtbl_addr = jtbl_addr; - insn.num_cases = num_cases; - insn.index_reg = insns[addu_index - 1].instruction.GetO32_rt(); - insns[lw].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - - insns[addu_index].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - - insns[addu_index - 1].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - - if (!and_variant) { - insns[addu_index - 2].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - } - - if (jtbl_addr < rodata_vaddr || - jtbl_addr + num_cases * sizeof(uint32_t) > rodata_vaddr + rodata_section_len) { - fprintf(stderr, "jump table outside rodata\n"); - exit(EXIT_FAILURE); - } - - for (uint32_t i = 0; i < num_cases; i++) { - uint32_t target_addr = - read_u32_be(rodata_section + (jtbl_addr - rodata_vaddr) + i * sizeof(uint32_t)); - - target_addr += gp_value; - // printf("%08X\n", target_addr); - label_addresses.insert(target_addr); - } - } - skip:; - } - } - } else if (insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jalr) { - // empty - } else { - assert(!"Unreachable code"); - } - } else if (insn.instruction.isBranch()) { - uint32_t target = insn.getAddress(); - - label_addresses.insert(target); - } - - switch (insns[i].instruction.getUniqueId()) { - // find floating point LI - case rabbitizer::InstrId::UniqueId::cpu_mtc1: { - rabbitizer::Registers::Cpu::GprO32 rt = insns[i].instruction.GetO32_rt(); - - for (int s = i - 1; s >= 0; s--) { - switch (insns[s].instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_lui: - if (insns[s].instruction.GetO32_rt() == rt) { - float f; - uint32_t lui_imm = insns[s].instruction.getProcessedImmediate() << 16; - - memcpy(&f, &lui_imm, sizeof(f)); - // link up the LUI with this instruction and the float - insns[s].linked_insn = i; - insns[s].linked_float = f; - // rewrite LUI instruction to be LI - insns[s].lila_dst_reg = get_dest_reg(insns[s]); - insns[s].patchInstruction(UniqueId_cpu_li); - insns[s].patchImmediate(lui_imm); - } - goto loop_end; - - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - if (rt == insns[s].instruction.GetO32_rt()) { - goto loop_end; - } - continue; - - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_sub: - case rabbitizer::InstrId::UniqueId::cpu_subu: - if (rt == insns[s].instruction.GetO32_rd()) { - goto loop_end; - } - continue; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - if (insns[s].instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) { - goto loop_end; - } - continue; - - default: - continue; - } - } - loop_end:; - } break; - - case rabbitizer::InstrId::UniqueId::cpu_sd: - case rabbitizer::InstrId::UniqueId::cpu_sw: - case rabbitizer::InstrId::UniqueId::cpu_sh: - case rabbitizer::InstrId::UniqueId::cpu_sb: - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_ld: - case rabbitizer::InstrId::UniqueId::cpu_ldl: - case rabbitizer::InstrId::UniqueId::cpu_ldr: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_lwu: - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - case rabbitizer::InstrId::UniqueId::cpu_lwc2: - case rabbitizer::InstrId::UniqueId::cpu_swc1: - case rabbitizer::InstrId::UniqueId::cpu_swc2: { - rabbitizer::Registers::Cpu::GprO32 mem_rs = insns[i].instruction.GetO32_rs(); - int32_t mem_imm = insns[i].instruction.getProcessedImmediate(); - - if (mem_rs == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) { - unsigned int got_entry = (mem_imm + gp_value_adj) / sizeof(unsigned int); - - if (got_entry >= got_locals.size()) { - got_entry -= got_locals.size(); - if (got_entry < got_globals.size()) { - assert(insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw); - unsigned int dest_vaddr = got_globals[got_entry]; - - insns[i].is_global_got_memop = true; - insns[i].linked_value = dest_vaddr; - - // patch to LA - insns[i].lila_dst_reg = get_dest_reg(insns[i]); - insns[i].patchAddress(UniqueId_cpu_la, dest_vaddr); - } - } - } else { - link_with_lui(i, mem_rs, mem_imm); - } - } break; - - case rabbitizer::InstrId::UniqueId::cpu_addiu: - case rabbitizer::InstrId::UniqueId::cpu_ori: { - // could be insn? - rabbitizer::Registers::Cpu::GprO32 rt = insns[i].instruction.GetO32_rt(); - rabbitizer::Registers::Cpu::GprO32 rs = insns[i].instruction.GetO32_rs(); - int32_t imm = insns[i].instruction.getProcessedImmediate(); - - if (rs == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { // becomes LI - insns[i].lila_dst_reg = get_dest_reg(insns[i]); - insns[i].patchInstruction(UniqueId_cpu_li); - insns[i].patchImmediate(imm); - } else if (rt != rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) { // only look for LUI if rt and rs are - // the same - link_with_lui(i, rs, imm); - } - } break; - - case rabbitizer::InstrId::UniqueId::cpu_jalr: { - rabbitizer::Registers::Cpu::GprO32 rs = insn.instruction.GetO32_rs(); - - if (rs == rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9) { - link_with_jalr(i); - if (insn.linked_insn != -1) { - insn.patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, insn.linked_value); - - label_addresses.insert(insn.linked_value); - add_function(insn.linked_value); - } - } - } break; - - default: - break; - } - - if ((insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_addu) && - (insn.instruction.GetO32_rd() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) && - (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_gp) && - (insn.instruction.GetO32_rt() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9) && i >= 2) { - for (size_t j = i - 2; j <= i; j++) { - insns[j].patchInstruction(rabbitizer::InstrId::UniqueId::cpu_nop); - } - } - } -} - -uint32_t addr_to_i(uint32_t addr) { - return (addr - text_vaddr) / 4; -} - -void pass2(void) { - // Find returns in each function - for (size_t i = 0; i < insns.size(); i++) { - uint32_t addr = text_vaddr + i * 4; - Insn& insn = insns[i]; - - if ((insn.instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jr) && - (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra)) { - auto it = find_function(addr); - assert(it != functions.end()); - - it->second.returns.push_back(addr + 4); - } - - if (insn.instruction.getUniqueId() == UniqueId_cpu_la) { - uint32_t faddr = insn.getAddress(); - - if ((text_vaddr <= faddr) && (faddr < text_vaddr + text_section_len)) { - la_function_pointers.insert(faddr); - functions[faddr].referenced_by_function_pointer = true; -#if INSPECT_FUNCTION_POINTERS - fprintf(stderr, "la function pointer: 0x%x at 0x%x\n", faddr, addr); -#endif - } - } - } - - for (auto it = functions.begin(); it != functions.end(); ++it) { - if (it->second.returns.size() == 0) { - uint32_t i = addr_to_i(it->first); - auto str_it = symbol_names.find(it->first); - - if (str_it != symbol_names.end() && str_it->second == "__start") { - - } else if (str_it != symbol_names.end() && str_it->second == "xmalloc") { - // orig 5.3: - /* - 496bf4: 3c1c0fb9 lui gp,0xfb9 - 496bf8: 279c366c addiu gp,gp,13932 - 496bfc: 0399e021 addu gp,gp,t9 - 496c00: 27bdffd8 addiu sp,sp,-40 - 496c04: 8f858de8 lw a1,-29208(gp) - 496c08: 10000006 b 496c24 - 496c0c: afbf0020 sw ra,32(sp) - */ - - // jal alloc_new - // lui $a1, malloc_scb - // jr $ra - // nop - uint32_t alloc_new_addr = text_vaddr + (i + 7) * 4; - - insns[i].patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, alloc_new_addr); - - assert(symbol_names.count(alloc_new_addr) && symbol_names[alloc_new_addr] == "alloc_new"); - i++; - - // LA - if (insns[i + 5].instruction.getUniqueId() == UniqueId_cpu_la) { - // 7.1 - insns[i] = insns[i + 5]; - } else { - // 5.3 - insns[i] = insns[i + 3]; - } - i++; - - // JR $RA - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0x03E00008, insns[i].instruction.getVram()); - it->second.returns.push_back(text_vaddr + i * 4 + 4); - i++; - - for (uint32_t j = 0; j < 4; j++) { - // NOP - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0, insns[i].instruction.getVram()); - i++; - } - } else if (str_it != symbol_names.end() && str_it->second == "xfree") { - // jal alloc_dispose - // lui $a1, malloc_scb - // jr $ra - // nop - uint32_t alloc_dispose_addr = text_vaddr + (i + 4) * 4; - - if (symbol_names.count(alloc_dispose_addr + 4) && - symbol_names[alloc_dispose_addr + 4] == "alloc_dispose") { - alloc_dispose_addr += 4; - } - - insns[i].patchAddress(rabbitizer::InstrId::UniqueId::cpu_jal, alloc_dispose_addr); - assert(symbol_names.count(alloc_dispose_addr) && symbol_names[alloc_dispose_addr] == "alloc_dispose"); - i++; - - insns[i] = insns[i + 2]; - i++; - - // JR $RA - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0x03E00008, insns[i].instruction.getVram()); - it->second.returns.push_back(text_vaddr + i * 4 + 4); - i++; - - // NOP - insns[i].patched = true; - insns[i].instruction = rabbitizer::InstructionCpu(0, insns[i].instruction.getVram()); - } else if ((insns[i].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_lw) && - (insns[i + 1].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_move) && - (insns[i + 2].instruction.getUniqueId() == rabbitizer::InstrId::UniqueId::cpu_jalr)) { - /* - 408f50: 8f998010 lw t9,-32752(gp) - 408f54: 03e07821 move t7,ra - 408f58: 0320f809 jalr t9 - */ - } else if (it->first > mcount_addr) { - fprintf(stderr, "no ret: 0x%x\n", it->first); - abort(); - } - } - - auto next = it; - - ++next; - if (next == functions.end()) { - it->second.end_addr = text_vaddr + text_section_len; - } else { - it->second.end_addr = next->first; - } - } -} - -void add_edge(uint32_t from, uint32_t to, bool function_entry = false, bool function_exit = false, - bool extern_function = false, bool function_pointer = false) { - Edge fe = Edge(), be = Edge(); - - fe.i = to; - be.i = from; - fe.function_entry = function_entry; - be.function_entry = function_entry; - fe.function_exit = function_exit; - be.function_exit = function_exit; - fe.extern_function = extern_function; - be.extern_function = extern_function; - fe.function_pointer = function_pointer; - be.function_pointer = function_pointer; - insns[from].successors.push_back(fe); - insns[to].predecessors.push_back(be); -} - -void pass3(void) { - // Build graph - for (size_t i = 0; i < insns.size(); i++) { - uint32_t addr = text_vaddr + i * 4; - Insn& insn = insns[i]; - - if (insn.no_following_successor) { - continue; - } - - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_beq: - case rabbitizer::InstrId::UniqueId::cpu_bgez: - case rabbitizer::InstrId::UniqueId::cpu_bgtz: - case rabbitizer::InstrId::UniqueId::cpu_blez: - case rabbitizer::InstrId::UniqueId::cpu_bltz: - case rabbitizer::InstrId::UniqueId::cpu_bne: - case rabbitizer::InstrId::UniqueId::cpu_beqz: - case rabbitizer::InstrId::UniqueId::cpu_bnez: - case rabbitizer::InstrId::UniqueId::cpu_bc1f: - case rabbitizer::InstrId::UniqueId::cpu_bc1t: - add_edge(i, i + 1); - add_edge(i + 1, addr_to_i(insn.getAddress())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beql: - case rabbitizer::InstrId::UniqueId::cpu_bgezl: - case rabbitizer::InstrId::UniqueId::cpu_bgtzl: - case rabbitizer::InstrId::UniqueId::cpu_blezl: - case rabbitizer::InstrId::UniqueId::cpu_bltzl: - case rabbitizer::InstrId::UniqueId::cpu_bnel: - case rabbitizer::InstrId::UniqueId::cpu_bc1fl: - case rabbitizer::InstrId::UniqueId::cpu_bc1tl: - add_edge(i, i + 1); - add_edge(i, i + 2); - add_edge(i + 1, addr_to_i(insn.getAddress())); - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - - case rabbitizer::InstrId::UniqueId::cpu_b: - case rabbitizer::InstrId::UniqueId::cpu_j: - add_edge(i, i + 1); - add_edge(i + 1, addr_to_i(insn.getAddress())); - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - - case rabbitizer::InstrId::UniqueId::cpu_jr: { - add_edge(i, i + 1); - - if (insn.jtbl_addr != 0) { - uint32_t jtbl_pos = insn.jtbl_addr - rodata_vaddr; - - assert(jtbl_pos < rodata_section_len && - jtbl_pos + insn.num_cases * sizeof(uint32_t) <= rodata_section_len); - - for (uint32_t j = 0; j < insn.num_cases; j++) { - uint32_t dest_addr = read_u32_be(rodata_section + jtbl_pos + j * sizeof(uint32_t)) + gp_value; - - add_edge(i + 1, addr_to_i(dest_addr)); - } - } else { - assert(insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra && - "jump to address in register not supported"); - } - - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - } - - case rabbitizer::InstrId::UniqueId::cpu_jal: { - add_edge(i, i + 1); - - uint32_t dest = insn.getAddress(); - - if (dest > mcount_addr && dest >= text_vaddr && dest < text_vaddr + text_section_len) { - add_edge(i + 1, addr_to_i(dest), true); - - auto it = functions.find(dest); - assert(it != functions.end()); - - for (uint32_t ret_instr : it->second.returns) { - add_edge(addr_to_i(ret_instr), i + 2, false, true); - } - } else { - add_edge(i + 1, i + 2, false, false, true); - } - - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - } - - case rabbitizer::InstrId::UniqueId::cpu_jalr: - // function pointer - add_edge(i, i + 1); - add_edge(i + 1, i + 2, false, false, false, true); - insns[i + 1].no_following_successor = true; // don't inspect delay slot - break; - - default: - add_edge(i, i + 1); - break; - } - } -} - -#define GPR_O32_hi (rabbitizer::Registers::Cpu::GprO32)((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra + 1) -#define GPR_O32_lo (rabbitizer::Registers::Cpu::GprO32)((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra + 2) - -uint64_t map_reg(rabbitizer::Registers::Cpu::GprO32 reg) { - return (uint64_t)1 << ((int)reg - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero + 1); -} - -uint64_t temporary_regs(void) { - // clang-format off - return - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t4) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t5) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t6) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t7) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t8) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_t9); - // clang-format on -} - -typedef enum { - /* 0 */ TYPE_NOP, // No arguments - /* 1 */ TYPE_S, // in - /* 2 */ TYPE_D, // 1 out - /* 3 */ TYPE_D_S, // out, in -} TYPE; - -TYPE insn_to_type(Insn& insn) { - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_add_s: - case rabbitizer::InstrId::UniqueId::cpu_add_d: - return TYPE_NOP; - - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_addu: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_addi: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - case rabbitizer::InstrId::UniqueId::cpu_andi: - case rabbitizer::InstrId::UniqueId::cpu_ori: - case rabbitizer::InstrId::UniqueId::cpu_lb: - case rabbitizer::InstrId::UniqueId::cpu_lbu: - case rabbitizer::InstrId::UniqueId::cpu_lh: - case rabbitizer::InstrId::UniqueId::cpu_lhu: - case rabbitizer::InstrId::UniqueId::cpu_lw: - case rabbitizer::InstrId::UniqueId::cpu_lwl: - // case rabbitizer::InstrId::UniqueId::cpu_lwr: - case rabbitizer::InstrId::UniqueId::cpu_move: - case rabbitizer::InstrId::UniqueId::cpu_negu: - case rabbitizer::InstrId::UniqueId::cpu_not: - case rabbitizer::InstrId::UniqueId::cpu_sll: - case rabbitizer::InstrId::UniqueId::cpu_slti: - case rabbitizer::InstrId::UniqueId::cpu_sltiu: - case rabbitizer::InstrId::UniqueId::cpu_sra: - case rabbitizer::InstrId::UniqueId::cpu_srl: - case rabbitizer::InstrId::UniqueId::cpu_xori: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_mflo: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_and: - case rabbitizer::InstrId::UniqueId::cpu_or: - case rabbitizer::InstrId::UniqueId::cpu_nor: - case rabbitizer::InstrId::UniqueId::cpu_sllv: - case rabbitizer::InstrId::UniqueId::cpu_slt: - case rabbitizer::InstrId::UniqueId::cpu_sltu: - case rabbitizer::InstrId::UniqueId::cpu_srav: - case rabbitizer::InstrId::UniqueId::cpu_srlv: - case rabbitizer::InstrId::UniqueId::cpu_subu: - case rabbitizer::InstrId::UniqueId::cpu_xor: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_cfc1: - case rabbitizer::InstrId::UniqueId::cpu_mfc1: - case UniqueId_cpu_li: - case UniqueId_cpu_la: - case rabbitizer::InstrId::UniqueId::cpu_lui: - return TYPE_D; - - case rabbitizer::InstrId::UniqueId::cpu_ctc1: - case rabbitizer::InstrId::UniqueId::cpu_bgez: - case rabbitizer::InstrId::UniqueId::cpu_bgezl: - case rabbitizer::InstrId::UniqueId::cpu_bgtz: - case rabbitizer::InstrId::UniqueId::cpu_bgtzl: - case rabbitizer::InstrId::UniqueId::cpu_blez: - case rabbitizer::InstrId::UniqueId::cpu_blezl: - case rabbitizer::InstrId::UniqueId::cpu_bltz: - case rabbitizer::InstrId::UniqueId::cpu_bltzl: - case rabbitizer::InstrId::UniqueId::cpu_beqz: - case rabbitizer::InstrId::UniqueId::cpu_bnez: - case rabbitizer::InstrId::UniqueId::cpu_mtc1: - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_beq: - case rabbitizer::InstrId::UniqueId::cpu_beql: - case rabbitizer::InstrId::UniqueId::cpu_bne: - case rabbitizer::InstrId::UniqueId::cpu_bnel: - case rabbitizer::InstrId::UniqueId::cpu_sb: - case rabbitizer::InstrId::UniqueId::cpu_sh: - case rabbitizer::InstrId::UniqueId::cpu_sw: - case rabbitizer::InstrId::UniqueId::cpu_swl: - // case rabbitizer::InstrId::UniqueId::cpu_swr: - case rabbitizer::InstrId::UniqueId::cpu_tne: - case rabbitizer::InstrId::UniqueId::cpu_teq: - case rabbitizer::InstrId::UniqueId::cpu_tge: - case rabbitizer::InstrId::UniqueId::cpu_tgeu: - case rabbitizer::InstrId::UniqueId::cpu_tlt: - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_div: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_div_s: - case rabbitizer::InstrId::UniqueId::cpu_div_d: - return TYPE_NOP; - - case rabbitizer::InstrId::UniqueId::cpu_divu: - case rabbitizer::InstrId::UniqueId::cpu_mult: - case rabbitizer::InstrId::UniqueId::cpu_multu: - return TYPE_D_S; - - case rabbitizer::InstrId::UniqueId::cpu_neg_s: - case rabbitizer::InstrId::UniqueId::cpu_neg_d: - return TYPE_NOP; - - case rabbitizer::InstrId::UniqueId::cpu_jalr: - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - if (insn.jtbl_addr != 0) { - insn.instruction.Set_rs(insn.index_reg); - } - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) { - return TYPE_NOP; - } - return TYPE_S; - - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - case rabbitizer::InstrId::UniqueId::cpu_swc1: - case rabbitizer::InstrId::UniqueId::cpu_sdc1: - return TYPE_S; - - default: - return TYPE_NOP; - } -} - -uint64_t get_dest_reg_mask(const Insn& insn) { - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_div: - case rabbitizer::InstrId::UniqueId::cpu_divu: - case rabbitizer::InstrId::UniqueId::cpu_mult: - case rabbitizer::InstrId::UniqueId::cpu_multu: - return map_reg(GPR_O32_lo) | map_reg(GPR_O32_hi); - - default: - return map_reg(get_dest_reg(insn)); - } -} - -uint64_t get_single_source_reg_mask(const rabbitizer::InstructionCpu& instr) { - switch (instr.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_mflo: - return map_reg(GPR_O32_lo); - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - return map_reg(GPR_O32_hi); - - default: - break; - } - if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rs)) { - return map_reg(instr.GetO32_rs()); - } else if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rt)) { - return map_reg(instr.GetO32_rt()); - } else { - return 0; - } -} - -uint64_t get_all_source_reg_mask(const rabbitizer::InstructionCpu& instr) { - uint64_t ret = 0; - - switch (instr.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_mflo: - ret |= map_reg(GPR_O32_lo); - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - ret |= map_reg(GPR_O32_hi); - - default: - break; - } - - if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rs)) { - ret |= map_reg(instr.GetO32_rs()); - } - if (instr.hasOperandAlias(rabbitizer::OperandType::cpu_rt) && !instr.modifiesRt()) { - ret |= map_reg(instr.GetO32_rt()); - } - return ret; -} - -void pass4(void) { - vector q; // TODO: Why is this called q? - uint64_t livein_func_start = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero); - - q.push_back(main_addr); - insns[addr_to_i(main_addr)].f_livein = livein_func_start; - - for (auto& it : data_function_pointers) { - q.push_back(it.second); - insns[addr_to_i(it.second)].f_livein = livein_func_start | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3); - } - - for (auto& addr : la_function_pointers) { - q.push_back(addr); - insns[addr_to_i(addr)].f_livein = livein_func_start | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3); - } - - while (!q.empty()) { - uint32_t addr = q.back(); - q.pop_back(); - uint32_t i = addr_to_i(addr); - Insn& insn = insns[i]; - uint64_t live = insn.f_livein | 1U; - uint64_t src_regs_map; - - switch (insn_to_type(insn)) { - case TYPE_D: - live |= get_dest_reg_mask(insn); - break; - - case TYPE_D_S: - src_regs_map = get_all_source_reg_mask(insn.instruction); - if ((live & src_regs_map) == src_regs_map) { - live |= get_dest_reg_mask(insn); - } - break; - - case TYPE_S: - case TYPE_NOP: - break; - } - - if ((insn.f_liveout | live) == insn.f_liveout) { - // No new bits - continue; - } - - live |= insn.f_liveout; - insn.f_liveout = live; - - bool function_entry = false; - - for (Edge& e : insn.successors) { - uint64_t new_live = live; - - if (e.function_exit) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero); - } else if (e.function_entry) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero); - function_entry = true; - } else if (e.extern_function) { - string_view name; - size_t extern_function_id; - uint32_t address = insns[i - 1].getAddress(); - - // TODO: Can this only ever be a J-type instruction? - auto it = symbol_names.find(address); - const ExternFunction* found_fn = nullptr; - - if (it != symbol_names.end()) { - name = it->second; - - for (auto& fn : extern_functions) { - if (name == fn.name) { - found_fn = &fn; - break; - } - } - - if (found_fn == nullptr) { - fprintf(stderr, "missing extern function: %s\n", string(name).c_str()); - } - } - - assert(found_fn); - - char ret_type = found_fn->params[0]; - - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - - switch (ret_type) { - case 'i': - case 'u': - case 'p': - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0); - break; - - case 'f': - break; - - case 'd': - break; - - case 'v': - break; - - case 'l': - case 'j': - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - break; - } - } else if (e.function_pointer) { - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - } - - if ((insns[e.i].f_livein | new_live) != insns[e.i].f_livein) { - insns[e.i].f_livein |= new_live; - q.push_back(text_vaddr + e.i * sizeof(uint32_t)); - } - } - - if (function_entry) { - // add one edge that skips the function call, for callee-saved register liveness propagation - live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - - if ((insns[i + 1].f_livein | live) != insns[i + 1].f_livein) { - insns[i + 1].f_livein |= live; - q.push_back(text_vaddr + (i + 1) * sizeof(uint32_t)); - } - } - } -} - -void pass5(void) { - vector q; - - assert(functions.count(main_addr)); - - q = functions[main_addr].returns; - for (auto addr : q) { - insns[addr_to_i(addr)].b_liveout = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0); - } - - for (auto& it : data_function_pointers) { - for (auto addr : functions[it.second].returns) { - q.push_back(addr); - insns[addr_to_i(addr)].b_liveout = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - } - } - - for (auto& func_addr : la_function_pointers) { - for (auto addr : functions[func_addr].returns) { - q.push_back(addr); - insns[addr_to_i(addr)].b_liveout = 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - } - } - - for (auto& insn : insns) { - if (insn.f_livein != 0) { - q.push_back(insn.instruction.getVram()); - } - } - - while (!q.empty()) { - uint32_t addr = q.back(); - - q.pop_back(); - - uint32_t i = addr_to_i(addr); - Insn& insn = insns[i]; - uint64_t live = insn.b_liveout | 1; - - switch (insn_to_type(insn)) { - case TYPE_S: - live |= get_all_source_reg_mask(insn.instruction); - break; - - case TYPE_D: - live &= ~get_dest_reg_mask(insn); - break; - - case TYPE_D_S: - if (live & get_dest_reg_mask(insn)) { - live &= ~get_dest_reg_mask(insn); - live |= get_all_source_reg_mask(insn.instruction); - } - break; - - case TYPE_NOP: - break; - } - - if ((insn.b_livein | live) == insn.b_livein) { - // No new bits - continue; - } - - live |= insn.b_livein; - insn.b_livein = live; - - bool function_exit = false; - - for (Edge& e : insn.predecessors) { - uint64_t new_live = live; - - if (e.function_exit) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1); - function_exit = true; - } else if (e.function_entry) { - new_live &= 1U | map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp); - } else if (e.extern_function) { - string_view name; - size_t extern_function_id; - const ExternFunction* found_fn = nullptr; - uint32_t address = insns[i - 2].getAddress(); - // TODO: Can this only ever be a J-type instruction? - auto it = symbol_names.find(address); - - if (it != symbol_names.end()) { - name = it->second; - for (auto& fn : extern_functions) { - if (name == fn.name) { - found_fn = &fn; - break; - } - } - } - - assert(found_fn); - - uint64_t args = 1U; - - if (found_fn->flags & FLAG_VARARG) { - // Assume the worst, that all four registers are used - for (int j = 0; j < 4; j++) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + j)); - } - } - - int pos = 0; - int pos_float = 0; - bool only_floats_so_far = true; - - for (const char* p = found_fn->params + 1; *p != '\0'; ++p) { - switch (*p) { - case 'i': - case 'u': - case 'p': - case 't': - only_floats_so_far = false; - if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } - ++pos; - break; - - case 'f': - if (only_floats_so_far && pos_float < 4) { - pos_float += 2; - } else if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } - ++pos; - break; - - case 'd': - // !!! - if (pos % 1 != 0) { - ++pos; - } - if (only_floats_so_far && pos_float < 4) { - pos_float += 2; - } else if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)) | - map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } - pos += 2; - break; - - case 'l': - case 'j': - if (pos % 1 != 0) { - ++pos; - } - only_floats_so_far = false; - if (pos < 4) { - args |= map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)) | - map_reg((rabbitizer::Registers::Cpu::GprO32)( - (int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } - pos += 2; - break; - } - } - args |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp); - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - new_live |= args; - } else if (e.function_pointer) { - new_live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - new_live |= map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3); - } - - if ((insns[e.i].b_liveout | new_live) != insns[e.i].b_liveout) { - insns[e.i].b_liveout |= new_live; - q.push_back(text_vaddr + e.i * sizeof(uint32_t)); - } - } - - if (function_exit) { - // add one edge that skips the function call, for callee-saved register liveness propagation - live &= ~(map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3) | - map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1) | temporary_regs()); - - if ((insns[i - 1].b_liveout | live) != insns[i - 1].b_liveout) { - insns[i - 1].b_liveout |= live; - q.push_back(text_vaddr + (i - 1) * sizeof(uint32_t)); - } - } - } -} - -void pass6(void) { - for (auto& it : functions) { - uint32_t addr = it.first; - Function& f = it.second; - - for (uint32_t ret : f.returns) { - Insn& i = insns[addr_to_i(ret)]; - - if (i.f_liveout & i.b_liveout & map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)) { - f.nret = 2; - } else if ((i.f_liveout & i.b_liveout & map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)) && - f.nret == 0) { - f.nret = 1; - } - } - - Insn& insn = insns.at(addr_to_i(addr)); - - for (int i = 0; i < 4; i++) { - if (insn.f_livein & insn.b_livein & - map_reg( - (rabbitizer::Registers::Cpu::GprO32)((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + i))) { - f.nargs = 1 + i; - } - } - f.v0_in = (insn.f_livein & insn.b_livein & map_reg(rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)) != 0 && - !f.referenced_by_function_pointer; - } -} - -void dump(void) { - for (size_t i = 0; i < insns.size(); i++) { - Insn& insn = insns[i]; - uint32_t vaddr = text_vaddr + i * sizeof(uint32_t); - if (label_addresses.count(vaddr)) { - if (symbol_names.count(vaddr)) { - printf("L%08x: //%s\n", vaddr, symbol_names[vaddr].c_str()); - } else { - printf("L%08x:\n", vaddr); - } - } - - // TODO: construct an immediate override for the instructions - printf("\t%s", insn.disassemble().c_str()); - if (insn.patched) { - printf("\t[patched, immediate now 0x%X]", insn.patched_addr); - } - printf("\n"); - } -} - -const char* r(uint32_t reg) { - static const char* regs[] = { - /* */ "zero", "at", "v0", "v1", - /* */ "a0", "a1", "a2", "a3", - /* */ "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", - /* */ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", - /* */ "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", - }; - - assert(reg < std::size(regs)); - return regs[reg]; -} - -const char* wr(uint32_t reg) { - // clang-format off - static const char *regs[] = { - "f0.w[0]", "f0.w[1]", - "f2.w[0]", "f2.w[1]", - "f4.w[0]", "f4.w[1]", - "f6.w[0]", "f6.w[1]", - "f8.w[0]", "f8.w[1]", - "f10.w[0]", "f10.w[1]", - "f12.w[0]", "f12.w[1]", - "f14.w[0]", "f14.w[1]", - "f16.w[0]", "f16.w[1]", - "f18.w[0]", "f18.w[1]", - "f20.w[0]", "f20.w[1]", - "f22.w[0]", "f22.w[1]", - "f24.w[0]", "f24.w[1]", - "f26.w[0]", "f26.w[1]", - "f28.w[0]", "f28.w[1]", - "f30.w[0]", "f30.w[1]" - }; - // clang-format on - - size_t index = reg - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0; - - assert(index < std::size(regs)); - return regs[index]; -} - -const char* fr(uint32_t reg) { - // clang-format off - static const char *regs[] = { - "f0.f[0]", "f0.f[1]", - "f2.f[0]", "f2.f[1]", - "f4.f[0]", "f4.f[1]", - "f6.f[0]", "f6.f[1]", - "f8.f[0]", "f8.f[1]", - "f10.f[0]", "f10.f[1]", - "f12.f[0]", "f12.f[1]", - "f14.f[0]", "f14.f[1]", - "f16.f[0]", "f16.f[1]", - "f18.f[0]", "f18.f[1]", - "f20.f[0]", "f20.f[1]", - "f22.f[0]", "f22.f[1]", - "f24.f[0]", "f24.f[1]", - "f26.f[0]", "f26.f[1]", - "f28.f[0]", "f28.f[1]", - "f30.f[0]", "f30.f[1]", - }; - // clang-format on - - size_t index = reg - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0; - - assert(index < std::size(regs)); - return regs[index]; -} - -const char* dr(uint32_t reg) { - // clang-format off - static const char *regs[] = { - "f0", - "f2", - "f4", - "f6", - "f8", - "f10", - "f12", - "f14", - "f16", - "f18", - "f20", - "f22", - "f24", - "f26", - "f28", - "f30" - }; - // clang-format on - - size_t index = reg - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0; - - assert(index % 2 == 0); - index /= 2; - assert(index < std::size(regs)); - return regs[index]; -} - -void dump_instr(int i); - -void dump_cond_branch(int i, const char* lhs, const char* op, const char* rhs) { - Insn& insn = insns[i]; - const char* cast1 = ""; - const char* cast2 = ""; - - if (strcmp(op, "==") && strcmp(op, "!=")) { - cast1 = "(int)"; - if (strcmp(rhs, "0")) { - cast2 = "(int)"; - } - } - printf("if (%s%s %s %s%s) {\n", cast1, lhs, op, cast2, rhs); - dump_instr(i + 1); - - uint32_t addr = insn.getAddress(); - - printf("goto L%x;}\n", addr); -} - -void dump_cond_branch_likely(int i, const char* lhs, const char* op, const char* rhs) { - uint32_t target = text_vaddr + (i + 2) * sizeof(uint32_t); - - dump_cond_branch(i, lhs, op, rhs); - if (!TRACE) { - printf("else goto L%x;\n", target); - } else { - printf("else {printf(\"pc=0x%08x (ignored)\\n\"); goto L%x;}\n", text_vaddr + (i + 1) * 4, target); - } - label_addresses.insert(target); -} - -void dump_jal(int i, uint32_t imm) { - string_view name; - auto it = symbol_names.find(imm); - const ExternFunction* found_fn = nullptr; - - // Check for an external function at the address in the immediate. If it does not exist, function is internal - if (it != symbol_names.end()) { - name = it->second; - for (auto& fn : extern_functions) { - if (name == fn.name) { - found_fn = &fn; - break; - } - } - } - - dump_instr(i + 1); - - if (found_fn != nullptr) { - if (found_fn->flags & FLAG_VARARG) { - for (int j = 0; j < 4; j++) { - printf("MEM_U32(sp + %d) = %s;\n", j * 4, r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + j)); - } - } - - const char ret_type = found_fn->params[0]; - - switch (ret_type) { - case 'v': - break; - - case 'i': - case 'u': - case 'p': - printf("%s = ", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - break; - - case 'f': - printf("%s = ", fr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0)); - break; - - case 'd': - printf("tempf64 = "); - break; - - case 'l': - case 'j': - printf("temp64 = "); - break; - } - - printf("wrapper_%s(", string(name).c_str()); - - bool first = true; - - if (!(found_fn->flags & FLAG_NO_MEM)) { - printf("mem"); - first = false; - } - - int pos = 0; - int pos_float = 0; - bool only_floats_so_far = true; - bool needs_sp = false; - - for (const char* p = &found_fn->params[1]; *p != '\0'; ++p) { - if (!first) { - printf(", "); - } - - first = false; - - switch (*p) { - case 't': - printf("trampoline, "); - needs_sp = true; - // fallthrough - case 'i': - case 'u': - case 'p': - only_floats_so_far = false; - if (pos < 4) { - printf("%s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } else { - printf("MEM_%c32(sp + %d)", *p == 'i' ? 'S' : 'U', pos * 4); - } - ++pos; - break; - - case 'f': - if (only_floats_so_far && pos_float < 4) { - printf("%s", fr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fa0 + pos_float)); - pos_float += 2; - } else if (pos < 4) { - printf("BITCAST_U32_TO_F32(%s)", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos)); - } else { - printf("BITCAST_U32_TO_F32(MEM_U32(sp + %d))", pos * 4); - } - ++pos; - break; - - case 'd': - if (pos % 1 != 0) { - ++pos; - } - if (only_floats_so_far && pos_float < 4) { - printf("double_from_FloatReg(%s)", - dr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fa0 + pos_float)); - pos_float += 2; - } else if (pos < 4) { - printf("BITCAST_U64_TO_F64(((uint64_t)%s << 32) | (uint64_t)%s)", - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } else { - printf("BITCAST_U64_TO_F64(((uint64_t)MEM_U32(sp + %d) << 32) | " - "(uint64_t)MEM_U32(sp + " - "%d))", - pos * 4, (pos + 1) * 4); - } - pos += 2; - break; - - case 'l': - case 'j': - if (pos % 1 != 0) { - ++pos; - } - only_floats_so_far = false; - if (*p == 'l') { - printf("(int64_t)"); - } - if (pos < 4) { - printf("(((uint64_t)%s << 32) | (uint64_t)%s)", - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + pos + 1)); - } else { - printf("(((uint64_t)MEM_U32(sp + %d) << 32) | (uint64_t)MEM_U32(sp + %d))", pos * 4, - (pos + 1) * 4); - } - pos += 2; - break; - } - } - - if ((found_fn->flags & FLAG_VARARG) || needs_sp) { - printf("%s%s", first ? "" : ", ", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_sp)); - } - - printf(");\n"); - - if (ret_type == 'l' || ret_type == 'j') { - printf("%s = (uint32_t)(temp64 >> 32);\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - printf("%s = (uint32_t)temp64;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)); - } else if (ret_type == 'd') { - printf("%s = FloatReg_from_double(tempf64);\n", dr((int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0)); - } - } else { - Function& f = functions.find(imm)->second; - - if (f.nret == 1) { - printf("v0 = "); - } else if (f.nret == 2) { - printf("temp64 = "); - } - - if (!name.empty()) { - printf("f_%s", string(name).c_str()); - } else { - printf("func_%x", imm); - } - - printf("(mem, sp"); - - if (f.v0_in) { - printf(", %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - } - - for (uint32_t i = 0; i < f.nargs; i++) { - printf(", %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + i)); - } - - printf(");\n"); - - if (f.nret == 2) { - printf("%s = (uint32_t)(temp64 >> 32);\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - printf("%s = (uint32_t)temp64;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)); - } - } - - printf("goto L%x;\n", text_vaddr + (i + 2) * 4); - label_addresses.insert(text_vaddr + (i + 2) * 4); -} - -void dump_instr(int i) { - Insn& insn = insns[i]; - - const char* symbol_name = NULL; - if (symbol_names.count(text_vaddr + i * sizeof(uint32_t)) != 0) { - symbol_name = symbol_names[text_vaddr + i * sizeof(uint32_t)].c_str(); - printf("//%s:\n", symbol_name); - } - - if (TRACE) { - printf("++cnt; printf(\"pc=0x%08x%s%s\\n\"); ", text_vaddr + i * 4, symbol_name ? " " : "", - symbol_name ? symbol_name : ""); - } - - uint64_t src_regs_map; - if (!insn.instruction.isJump() && !insn.instruction.isBranch() && !conservative) { - switch (insn_to_type(insn)) { - case TYPE_S: - src_regs_map = get_all_source_reg_mask(insn.instruction); - if (!((insn.f_livein & src_regs_map) == src_regs_map)) { - printf("// fdead %llx ", (unsigned long long)insn.f_livein); - } - break; - - case TYPE_D_S: { - uint64_t reg_mask = get_all_source_reg_mask(insn.instruction); - - if ((insn.f_livein & reg_mask) != reg_mask) { - printf("// fdead %llx ", (unsigned long long)insn.f_livein); - break; - } - } - // fallthrough - case TYPE_D: - if (!(insn.b_liveout & get_dest_reg_mask(insn))) { -#if 0 - printf("// %i bdead %llx %llx ", i, (unsigned long long)insn.b_liveout, - (unsigned long long)get_dest_reg_mask(insn)); -#else - printf("// bdead %llx ", (unsigned long long)insn.b_liveout); -#endif - } - break; - - case TYPE_NOP: - break; - } - } - - int32_t imm; - char buf[0x100]; - switch (insn.instruction.getUniqueId()) { - case rabbitizer::InstrId::UniqueId::cpu_add: - case rabbitizer::InstrId::UniqueId::cpu_addu: - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt())); - } else if (insn.instruction.GetO32_rt() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs())); - } else { - printf("%s = %s + %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_add_s: - printf("%s = %s + %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_add_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) + double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_addi: - case rabbitizer::InstrId::UniqueId::cpu_addiu: - imm = insn.getImmediate(); - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = 0x%x;\n", r((int)insn.instruction.GetO32_rt()), imm); - } else { - printf("%s = %s + 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_and: - printf("%s = %s & %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_andi: - imm = insn.getImmediate(); - printf("%s = %s & 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beq: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "==", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beql: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), - "==", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgez: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), ">=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgezl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), ">=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgtz: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), ">", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bgtzl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), ">", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_blez: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "<=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_blezl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), "<=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bltz: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "<", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bltzl: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), "<", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bne: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "!=", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bnel: - dump_cond_branch_likely(i, r((int)insn.instruction.GetO32_rs()), - "!=", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_break: - printf("abort();\n"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_beqz: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "==", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_b: - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1f: - printf("if (!cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1t: - printf("if (cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1fl: { - uint32_t target = text_vaddr + (i + 2) * sizeof(uint32_t); - printf("if (!cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - if (!TRACE) { - printf("else goto L%x;\n", target); - } else { - printf("else {printf(\"pc=0x%08x (ignored)\\n\"); goto L%x;}\n", text_vaddr + (i + 1) * 4, target); - } - label_addresses.insert(target); - } break; - - case rabbitizer::InstrId::UniqueId::cpu_bc1tl: { - uint32_t target = text_vaddr + (i + 2) * sizeof(uint32_t); - printf("if (cf) {\n"); - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;}\n", imm); - if (!TRACE) { - printf("else goto L%x;\n", target); - } else { - printf("else {printf(\"pc=0x%08x (ignored)\\n\"); goto L%x;}\n", text_vaddr + (i + 1) * 4, target); - } - label_addresses.insert(target); - } break; - - case rabbitizer::InstrId::UniqueId::cpu_bnez: - dump_cond_branch(i, r((int)insn.instruction.GetO32_rs()), "!=", "0"); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_lt_s: - printf("cf = %s < %s;\n", fr((int)insn.instruction.GetO32_fs()), fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_le_s: - printf("cf = %s <= %s;\n", fr((int)insn.instruction.GetO32_fs()), fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_eq_s: - printf("cf = %s == %s;\n", fr((int)insn.instruction.GetO32_fs()), fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_lt_d: - printf("cf = double_from_FloatReg(%s) < double_from_FloatReg(%s);\n", dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_le_d: - printf("cf = double_from_FloatReg(%s) <= double_from_FloatReg(%s);\n", - dr((int)insn.instruction.GetO32_fs()), dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_c_eq_d: - printf("cf = double_from_FloatReg(%s) == double_from_FloatReg(%s);\n", - dr((int)insn.instruction.GetO32_fs()), dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_s_w: - printf("%s = (int)%s;\n", fr((int)insn.instruction.GetO32_fd()), wr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_d_w: - printf("%s = FloatReg_from_double((int)%s);\n", dr((int)insn.instruction.GetO32_fd()), - wr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_d_s: - printf("%s = FloatReg_from_double(%s);\n", dr((int)insn.instruction.GetO32_fd()), - fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_s_d: - printf("%s = double_from_FloatReg(%s);\n", fr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_w_d: - printf("%s = cvt_w_d(double_from_FloatReg(%s));\n", wr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_w_s: - printf("%s = cvt_w_s(%s);\n", wr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_cvt_l_d: - case rabbitizer::InstrId::UniqueId::cpu_cvt_l_s: - case rabbitizer::InstrId::UniqueId::cpu_cvt_s_l: - case rabbitizer::InstrId::UniqueId::cpu_cvt_d_l: - goto unimplemented; - - case rabbitizer::InstrId::UniqueId::cpu_cfc1: - assert(insn.instruction.Get_cop1cs() == rabbitizer::Registers::Cpu::Cop1Control::COP1_CONTROL_FpcCsr); - printf("%s = fcsr;\n", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_ctc1: - assert(insn.instruction.Get_cop1cs() == rabbitizer::Registers::Cpu::Cop1Control::COP1_CONTROL_FpcCsr); - printf("fcsr = %s;\n", r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_div: - printf("lo = (int)%s / (int)%s; ", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - printf("hi = (int)%s %% (int)%s;\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_divu: - printf("lo = %s / %s; ", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - printf("hi = %s %% %s;\n", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_div_s: - printf("%s = %s / %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_div_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) / double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mov_s: - printf("%s = %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mov_d: - printf("%s = %s;\n", dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mul_s: - printf("%s = %s * %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mul_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) * double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_negu: - printf("%s = -%s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_neg_s: - printf("%s = -%s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_neg_d: - printf("%s = FloatReg_from_double(-double_from_FloatReg(%s));\n", dr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sub: - if (insn.instruction.GetO32_rs() == rabbitizer::Registers::Cpu::GprO32::GPR_O32_zero) { - printf("%s = -%s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt())); - break; - } else { - goto unimplemented; - } - - case rabbitizer::InstrId::UniqueId::cpu_sub_s: - printf("%s = %s - %s;\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs()), - fr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sub_d: - printf("%s = FloatReg_from_double(double_from_FloatReg(%s) - double_from_FloatReg(%s));\n", - dr((int)insn.instruction.GetO32_fd()), dr((int)insn.instruction.GetO32_fs()), - dr((int)insn.instruction.GetO32_ft())); - break; - - // Jumps - - case rabbitizer::InstrId::UniqueId::cpu_j: - dump_instr(i + 1); - imm = insn.getAddress(); - printf("goto L%x;\n", imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_jal: - imm = insn.getAddress(); - dump_jal(i, imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_jalr: - printf("fp_dest = %s;\n", r((int)insn.instruction.GetO32_rs())); - dump_instr(i + 1); - printf("temp64 = trampoline(mem, sp, %s, %s, %s, %s, fp_dest);\n", - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a1), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a2), - r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a3)); - printf("%s = (uint32_t)(temp64 >> 32);\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - printf("%s = (uint32_t)temp64;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v1)); - printf("goto L%x;\n", text_vaddr + (i + 2) * 4); - label_addresses.insert(text_vaddr + (i + 2) * 4); - break; - - case rabbitizer::InstrId::UniqueId::cpu_jr: - // TODO: understand why the switch version fails, and why only it needs the nop - if (insn.jtbl_addr != 0) { - uint32_t jtbl_pos = insn.jtbl_addr - rodata_vaddr; - - assert(jtbl_pos < rodata_section_len && - jtbl_pos + insn.num_cases * sizeof(uint32_t) <= rodata_section_len); -#if 1 - printf(";static void *const Lswitch%x[] = {\n", insn.jtbl_addr); - - for (uint32_t i = 0; i < insn.num_cases; i++) { - uint32_t dest_addr = read_u32_be(rodata_section + jtbl_pos + i * sizeof(uint32_t)) + gp_value; - printf("&&L%x,\n", dest_addr); - label_addresses.insert(dest_addr); - } - - printf("};\n"); - printf("dest = Lswitch%x[%s];\n", insn.jtbl_addr, r((int)insn.index_reg)); - dump_instr(i + 1); - printf("goto *dest;\n"); -#else - // This block produces a switch instead of an array of labels. - // It is not being used because currently it is a bit bugged. - // It has been keep as a reference and with the main intention to fix it - - assert(insns[i + 1].id == MIPS_INS_NOP); - printf("switch (%s) {\n", r(insn.index_reg)); - - for (uint32_t i = 0; i < insn.num_cases; i++) { - uint32_t dest_addr = read_u32_be(rodata_section + jtbl_pos + i * sizeof(uint32_t)) + gp_value; - printf("case %u: goto L%x;\n", i, dest_addr); - label_addresses.insert(dest_addr); - } - - printf("}\n"); -#endif - } else { - if (insn.instruction.GetO32_rs() != rabbitizer::Registers::Cpu::GprO32::GPR_O32_ra) { - printf("UNSUPPORTED JR %s (no jumptable available)\n", r((int)insn.instruction.GetO32_rs())); - } else { - dump_instr(i + 1); - switch (find_function(text_vaddr + i * sizeof(uint32_t))->second.nret) { - case 0: - printf("return;\n"); - break; - - case 1: - printf("return v0;\n"); - break; - - case 2: - printf("return ((uint64_t)v0 << 32) | v1;\n"); - break; - } - } - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_lb: - imm = insn.getImmediate(); - printf("%s = MEM_S8(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lbu: - imm = insn.getImmediate(); - printf("%s = MEM_U8(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lh: - imm = insn.getImmediate(); - printf("%s = MEM_S16(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lhu: - imm = insn.getImmediate(); - printf("%s = MEM_U16(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lui: - imm = insn.getImmediate(); - printf("%s = 0x%x;\n", r((int)insn.instruction.GetO32_rt()), imm << 16); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lw: - imm = insn.getImmediate(); - printf("%s = MEM_U32(%s + %d);\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lwc1: - imm = insn.getImmediate(); - printf("%s = MEM_U32(%s + %d);\n", wr((int)insn.instruction.GetO32_ft()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_ldc1: - imm = insn.getImmediate(); - assert(((int)insn.instruction.GetO32_ft() - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0) % 2 == - 0); - printf("%s = MEM_U32(%s + %d);\n", wr((int)insn.instruction.GetO32_ft() + 1), - r((int)insn.instruction.GetO32_rs()), imm); - printf("%s = MEM_U32(%s + %d + 4);\n", wr((int)insn.instruction.GetO32_ft()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_lwl: { - const char* reg = r((int)insn.instruction.GetO32_rt()); - - imm = insn.getImmediate(); - - printf("%s = %s + %d; ", reg, r((int)insn.instruction.GetO32_rs()), imm); - printf("%s = ((uint32_t)MEM_U8(%s) << 24) | (MEM_U8(%s + 1) << 16) | (MEM_U8(%s + 2) << 8) | MEM_U8(%s + 3);\n", reg, - reg, reg, reg, reg); - } break; - - case rabbitizer::InstrId::UniqueId::cpu_lwr: - printf("//%s\n", insn.disassemble().c_str()); - break; - - case UniqueId_cpu_la: { - uint32_t addr = insn.getAddress(); - - printf("%s = 0x%x;", r((int)insn.lila_dst_reg), addr); - if ((text_vaddr <= addr) && (addr < text_vaddr + text_section_len)) { - printf(" // function pointer"); - label_addresses.insert(addr); - } - printf("\n"); - } break; - - case UniqueId_cpu_li: - imm = insn.getImmediate(); - - printf("%s = 0x%x;\n", r((int)insn.lila_dst_reg), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mfc1: - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rt()), wr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mfhi: - printf("%s = hi;\n", r((int)insn.instruction.GetO32_rd())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mflo: - printf("%s = lo;\n", r((int)insn.instruction.GetO32_rd())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_move: - printf("%s = %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mtc1: - printf("%s = %s;\n", wr((int)insn.instruction.GetO32_fs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_mult: - printf("lo = %s * %s;\n", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - printf("hi = (uint32_t)((int64_t)(int)%s * (int64_t)(int)%s >> 32);\n", - r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_multu: - printf("lo = %s * %s;\n", r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - printf("hi = (uint32_t)((uint64_t)%s * (uint64_t)%s >> 32);\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sqrt_s: - printf("%s = sqrtf(%s);\n", fr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_nor: - printf("%s = ~(%s | %s);\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_not: - printf("%s = ~%s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_or: - printf("%s = %s | %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_ori: - imm = insn.getImmediate(); - printf("%s = %s | 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sb: - imm = insn.getImmediate(); - printf("MEM_U8(%s + %d) = (uint8_t)%s;\n", r((int)insn.instruction.GetO32_rs()), imm, - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sh: - imm = insn.getImmediate(); - printf("MEM_U16(%s + %d) = (uint16_t)%s;\n", r((int)insn.instruction.GetO32_rs()), imm, - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sll: - printf("%s = %s << %d;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt()), - insn.instruction.Get_sa()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sllv: - printf("%s = %s << (%s & 0x1f);\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_slt: - printf("%s = (int)%s < (int)%s;\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rs()), r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_slti: - imm = insn.getImmediate(); - printf("%s = (int)%s < (int)0x%x;\n", r((int)insn.instruction.GetO32_rt()), - r((int)insn.instruction.GetO32_rs()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sltiu: - imm = insn.getImmediate(); - printf("%s = %s < 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sltu: - printf("%s = %s < %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sra: - printf("%s = (int)%s >> %d;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt()), - insn.instruction.Get_sa()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_srav: - printf("%s = (int)%s >> (%s & 0x1f);\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_srl: - printf("%s = %s >> %d;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rt()), - insn.instruction.Get_sa()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_srlv: - printf("%s = %s >> (%s & 0x1f);\n", r((int)insn.instruction.GetO32_rd()), - r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_subu: - printf("%s = %s - %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sw: - imm = insn.getImmediate(); - printf("MEM_U32(%s + %d) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_swc1: - imm = insn.getImmediate(); - printf("MEM_U32(%s + %d) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - wr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_sdc1: - assert(((int)insn.instruction.GetO32_ft() - (int)rabbitizer::Registers::Cpu::Cop1O32::COP1_O32_fv0) % 2 == - 0); - imm = insn.getImmediate(); - printf("MEM_U32(%s + %d) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - wr((int)insn.instruction.GetO32_ft() + 1)); - printf("MEM_U32(%s + %d + 4) = %s;\n", r((int)insn.instruction.GetO32_rs()), imm, - wr((int)insn.instruction.GetO32_ft())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_swl: - imm = insn.getImmediate(); - for (int i = 0; i < 4; i++) { - printf("MEM_U8(%s + %d + %d) = (uint8_t)(%s >> %d);\n", r((int)insn.instruction.GetO32_rs()), imm, i, - r((int)insn.instruction.GetO32_rt()), (3 - i) * 8); - } - break; - - case rabbitizer::InstrId::UniqueId::cpu_swr: - printf("//%s\n", insn.disassemble().c_str()); - break; - - case rabbitizer::InstrId::UniqueId::cpu_trunc_w_s: - printf("%s = (int)%s;\n", wr((int)insn.instruction.GetO32_fd()), fr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_trunc_w_d: - printf("%s = (int)double_from_FloatReg(%s);\n", wr((int)insn.instruction.GetO32_fd()), - dr((int)insn.instruction.GetO32_fs())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_trunc_l_d: - case rabbitizer::InstrId::UniqueId::cpu_trunc_l_s: - goto unimplemented; - - case rabbitizer::InstrId::UniqueId::cpu_xor: - printf("%s = %s ^ %s;\n", r((int)insn.instruction.GetO32_rd()), r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt())); - break; - - case rabbitizer::InstrId::UniqueId::cpu_xori: - imm = insn.getImmediate(); - printf("%s = %s ^ 0x%x;\n", r((int)insn.instruction.GetO32_rt()), r((int)insn.instruction.GetO32_rs()), - imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tne: - imm = insn.instruction.Get_code_lower(); - printf("assert(%s == %s && \"tne %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_teq: - imm = insn.instruction.Get_code_lower(); - printf("assert(%s != %s && \"teq %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tge: - imm = insn.instruction.Get_code_lower(); - printf("assert((int)%s < (int)%s && \"tge %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tgeu: - imm = insn.instruction.Get_code_lower(); - printf("assert(%s < %s && \"tgeu %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_tlt: - imm = insn.instruction.Get_code_lower(); - printf("assert((int)%s >= (int)%s && \"tlt %d\");\n", r((int)insn.instruction.GetO32_rs()), - r((int)insn.instruction.GetO32_rt()), imm); - break; - - case rabbitizer::InstrId::UniqueId::cpu_nop: - printf("//nop;\n"); - break; - - default: - unimplemented: - printf("UNIMPLEMENTED 0x%X : %s\n", insn.instruction.getRaw(), insn.disassemble().c_str()); - break; - } -} - -void inspect_data_function_pointers(vector>& ret, const uint8_t* section, - uint32_t section_vaddr, uint32_t len) { - for (uint32_t i = 0; i < len; i += 4) { - uint32_t addr = read_u32_be(section + i); - - if (addr == 0x430b00 || addr == 0x433b00) { - // in as1, not function pointers (normal integers) - continue; - } - - if (addr == 0x4a0000) { - // in copt - continue; - } - - if (section_vaddr + i >= procedure_table_start && - section_vaddr + i < procedure_table_start + procedure_table_len) { - // some linking table with a "all" functions, in as1 5.3 - continue; - } - - if ((addr >= text_vaddr) && (addr < text_vaddr + text_section_len) && ((addr % 4) == 0)) { -#if INSPECT_FUNCTION_POINTERS - fprintf(stderr, "assuming function pointer 0x%x at 0x%x\n", addr, section_vaddr + i); -#endif - ret.push_back(make_pair(section_vaddr + i, addr)); - label_addresses.insert(addr); - functions[addr].referenced_by_function_pointer = true; - } - } -} - -void dump_function_signature(Function& f, uint32_t vaddr) { - printf("static "); - switch (f.nret) { - case 0: - printf("void "); - break; - - case 1: - printf("uint32_t "); - break; - - case 2: - printf("uint64_t "); - break; - } - - auto name_it = symbol_names.find(vaddr); - - if (name_it != symbol_names.end()) { - printf("f_%s", name_it->second.c_str()); - } else { - printf("func_%x", vaddr); - } - - printf("(uint8_t *mem, uint32_t sp"); - - if (f.v0_in) { - printf(", uint32_t %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_v0)); - } - - for (uint32_t i = 0; i < f.nargs; i++) { - printf(", uint32_t %s", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + i)); - } - - printf(")"); -} - -void dump_c(void) { - map symbol_names_inv; - - for (auto& it : symbol_names) { - symbol_names_inv[it.second] = it.first; - } - - uint32_t min_addr = UINT32_MAX; - uint32_t max_addr = 0; - - if (data_section_len > 0) { - min_addr = std::min(min_addr, data_vaddr); - max_addr = std::max(max_addr, data_vaddr + data_section_len); - } - if (rodata_section_len > 0) { - min_addr = std::min(min_addr, rodata_vaddr); - max_addr = std::max(max_addr, rodata_vaddr + rodata_section_len); - } - if (bss_section_len) { - min_addr = std::min(min_addr, bss_vaddr); - max_addr = std::max(max_addr, bss_vaddr + bss_section_len); - } - - // 64 kB. Supposedly the worst-case smallest permitted page size, increase if necessary. - // Ensures the hardcoded min_addr and max_addr are sufficiently aligned for the machine running the - // recompiled binaries (and not just the one doing the original recomp build). - uint32_t page_size = 0x10000; - - min_addr = min_addr & ~(page_size - 1); - max_addr = (max_addr + (page_size - 1)) & ~(page_size - 1); - - uint32_t stack_bottom = min_addr; - min_addr -= 0x100000; // 1 MB stack - stack_bottom -= 0x10; // for main's stack frame - - printf("#include \"header.h\"\n"); - - if (conservative) { - printf("static uint32_t s0, s1, s2, s3, s4, s5, s6, s7, fp;\n"); - } - - printf("static const uint32_t rodata[] = {\n"); - - for (size_t i = 0; i < rodata_section_len; i += 4) { - printf("0x%x,%s", read_u32_be(rodata_section + i), i % 32 == 28 ? "\n" : ""); - } - - printf("};\n"); - printf("static const uint32_t data[] = {\n"); - - for (size_t i = 0; i < data_section_len; i += 4) { - printf("0x%x,%s", read_u32_be(data_section + i), i % 32 == 28 ? "\n" : ""); - } - - printf("};\n"); - - /* if (!data_function_pointers.empty()) { - printf("static const struct { uint32_t orig_addr; void *recompiled_addr; } data_function_pointers[] = {\n"); - for (auto item : data_function_pointers) { - printf("{0x%x, &&L%x},\n", item.first, item.second); - } - printf("};\n"); - } */ - - if (TRACE) { - printf("static unsigned long long int cnt = 0;\n"); - } - - for (auto& f_it : functions) { - uint32_t addr = f_it.first; - auto& ins = insns.at(addr_to_i(addr)); - - if (ins.f_livein != 0) { - // Function is used - dump_function_signature(f_it.second, addr); - printf(";\n"); - } - } - - if (!data_function_pointers.empty() || !la_function_pointers.empty()) { - printf("uint64_t trampoline(uint8_t *mem, uint32_t sp, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3, " - "uint32_t fp_dest) {\n"); - printf("switch (fp_dest) {\n"); - - for (auto& it : functions) { - Function& f = it.second; - - if (f.referenced_by_function_pointer) { - printf("case 0x%x: ", it.first); - - if (f.nret == 1) { - printf("return (uint64_t)"); - } else if (f.nret == 2) { - printf("return "); - } - - auto name_it = symbol_names.find(it.first); - - if (name_it != symbol_names.end()) { - printf("f_%s", name_it->second.c_str()); - } else { - printf("func_%x", it.first); - } - - printf("(mem, sp"); - - for (unsigned int i = 0; i < f.nargs; i++) { - printf(", a%d", i); - } - - printf(")"); - - if (f.nret == 1) { - printf(" << 32"); - } - - printf(";"); - - if (f.nret == 0) { - printf(" return 0;"); - } - - printf("\n"); - } - } - - printf("default: abort();"); - printf("}\n"); - printf("}\n"); - } - - printf("int run(uint8_t *mem, int argc, char *argv[]) {\n"); - printf("mmap_initial_data_range(mem, 0x%x, 0x%x);\n", min_addr, max_addr); - - printf("memcpy(mem + 0x%x, rodata, 0x%x);\n", rodata_vaddr, rodata_section_len); - printf("memcpy(mem + 0x%x, data, 0x%x);\n", data_vaddr, data_section_len); - - /* if (!data_function_pointers.empty()) { - if (!LABELS_64_BIT) { - printf("for (int i = 0; i < %d; i++) MEM_U32(data_function_pointers[i].orig_addr) = - (uint32_t)(uintptr_t)data_function_pointers[i].recompiled_addr;\n", (int)data_function_pointers.size()); } else { - printf("for (int i = 0; i < %d; i++) MEM_U32(data_function_pointers[i].orig_addr) = - (uint32_t)((uintptr_t)data_function_pointers[i].recompiled_addr - (uintptr_t)&&Loffset);\n", - (int)data_function_pointers.size()); - } - } */ - - printf("MEM_S32(0x%x) = argc;\n", symbol_names_inv.at("__Argc")); - printf("MEM_S32(0x%x) = argc;\n", stack_bottom); - printf("uint32_t al = argc * 4; for (int i = 0; i < argc; i++) al += strlen(argv[i]) + 1;\n"); - printf("uint32_t arg_addr = wrapper_malloc(mem, al);\n"); - printf("MEM_U32(0x%x) = arg_addr;\n", symbol_names_inv.at("__Argv")); - printf("MEM_U32(0x%x) = arg_addr;\n", stack_bottom + 4); - printf("uint32_t arg_strpos = arg_addr + argc * 4;\n"); - printf("for (int i = 0; i < argc; i++) {MEM_U32(arg_addr + i * 4) = arg_strpos; uint32_t p = 0; do { " - "MEM_S8(arg_strpos) = argv[i][p]; ++arg_strpos; } while (argv[i][p++] != '\\0');}\n"); - - printf("setup_libc_data(mem);\n"); - - // printf("gp = 0x%x;\n", gp_value); // only to recreate the outcome when ugen reads uninitialized stack memory - - printf("int ret = f_main(mem, 0x%x", stack_bottom); - - Function& main_func = functions[main_addr]; - - if (main_func.nargs >= 1) { - printf(", argc"); - } - - if (main_func.nargs >= 2) { - printf(", arg_addr"); - } - - printf(");\n"); - - if (TRACE) { - printf("end: fprintf(stderr, \"cnt: %%llu\\n\", cnt);\n"); - } - - printf("return ret;\n"); - printf("}\n"); - - for (auto& f_it : functions) { - Function& f = f_it.second; - uint32_t start_addr = f_it.first; - uint32_t end_addr = f.end_addr; - - if (insns[addr_to_i(start_addr)].f_livein == 0) { - // Non-used function, skip - continue; - } - - printf("\n"); - dump_function_signature(f, start_addr); - printf(" {\n"); - printf("const uint32_t zero = 0;\n"); - - if (!conservative) { - printf("uint32_t at = 0, v1 = 0, t0 = 0, t1 = 0, t2 = 0,\n"); - printf("t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, s0 = 0, s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0,\n"); - printf("s6 = 0, s7 = 0, t8 = 0, t9 = 0, gp = 0, fp = 0, s8 = 0, ra = 0;\n"); - } else { - printf("uint32_t at = 0, v1 = 0, t0 = 0, t1 = 0, t2 = 0,\n"); - printf("t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, t8 = 0, t9 = 0, gp = 0x10000, ra = 0x10000;\n"); - } - - printf("uint32_t lo = 0, hi = 0;\n"); - printf("int cf = 0;\n"); - printf("uint64_t temp64;\n"); - printf("double tempf64;\n"); - printf("uint32_t fp_dest;\n"); - printf("void *dest;\n"); - - if (!f.v0_in) { - printf("uint32_t v0 = 0;\n"); - } - - for (uint32_t j = f.nargs; j < 4; j++) { - printf("uint32_t %s = 0;\n", r((int)rabbitizer::Registers::Cpu::GprO32::GPR_O32_a0 + j)); - } - - for (size_t i = addr_to_i(start_addr), end_i = addr_to_i(end_addr); i < end_i; i++) { - Insn& insn = insns[i]; - uint32_t vaddr = text_vaddr + i * 4; - if (label_addresses.count(vaddr)) { - printf("L%x:\n", vaddr); - } -#if DUMP_INSTRUCTIONS - printf("// %s:\n", insn.disassemble().c_str()); -#endif - dump_instr(i); - } - - printf("}\n"); - } - /* for (size_t i = 0; i < insns.size(); i++) { - Insn& insn = insns[i]; - uint32_t vaddr = text_vaddr + i * 4; - auto fn_it = functions.find(vaddr); - - if (fn_it != functions.end()) { - Function& f = fn_it->second; - - printf("}\n\n"); - - switch (f.nret) { - case 0: - printf("void "); - break; - - case 1: - printf("uint32_t "); - break; - - case 2: - printf("uint64_t "); - break; - } - - auto name_it = symbol_names.find(vaddr); - - if (name_it != symbol_names.end()) { - printf("%s", name_it->second.c_str()); - } else { - printf("func_%x", vaddr); - } - - printf("(uint8_t *mem, uint32_t sp"); - - if (f.v0_in) { - printf(", uint32_t %s", r(MIPS_REG_V0)); - } - - for (uint32_t i = 0; i < f.nargs; i++) { - printf(", uint32_t %s", r(MIPS_REG_A0 + i)); - } - - printf(") {\n"); - printf("const uint32_t zero = 0;\n"); - printf("uint32_t at = 0, v1 = 0, t0 = 0, t1 = 0, t2 = 0,\n"); - printf("t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, s0 = 0, s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0,\n"); - printf("s6 = 0, s7 = 0, t8 = 0, t9 = 0, gp = 0, fp = 0, s8 = 0, ra = 0;\n"); - printf("uint32_t lo = 0, hi = 0;\n"); - printf("int cf = 0;\n"); - - if (!f.v0_in) { - printf("uint32_t v0 = 0;\n"); - } - - for (uint32_t j = f.nargs; j < 4; j++) { - printf("uint32_t %s = 0;\n", r(MIPS_REG_A0 + j)); - } - } - - if (label_addresses.count(vaddr)) { - printf("L%x:\n", vaddr); - } - - dump_instr(i); - } */ -} - -void parse_elf(const uint8_t* data, size_t file_len) { - Elf32_Ehdr* ehdr; - Elf32_Shdr *shdr, *str_shdr, *sym_shdr = NULL, *dynsym_shdr, *dynamic_shdr, *reginfo_shdr, *got_shdr, - *sym_strtab = NULL, *sym_dynstr; - int text_section_index = -1; - int symtab_section_index = -1; - int dynsym_section_index = -1; - int reginfo_section_index = -1; - int dynamic_section_index = -1; - int got_section_index = -1; - int rodata_section_index = -1; - int data_section_index = -1; - int bss_section_index = -1; - uint32_t text_offset = 0; - uint32_t vaddr_adj = 0; - - if (file_len < 4 || data[0] != 0x7f || data[1] != 'E' || data[2] != 'L' || data[3] != 'F') { - fprintf(stderr, "Not an ELF file.\n"); - exit(EXIT_FAILURE); - } - - ehdr = (Elf32_Ehdr*)data; - if (ehdr->e_ident[EI_DATA] != 2 || u16be(ehdr->e_machine) != 8) { - fprintf(stderr, "Not big-endian MIPS.\n"); - exit(EXIT_FAILURE); - } - - if (u16be(ehdr->e_shstrndx) == 0) { - // (We could look at program headers instead in this case.) - fprintf(stderr, "Missing section headers; stripped binaries are not yet supported.\n"); - exit(EXIT_FAILURE); - } - -#define SECTION(index) (Elf32_Shdr*)(data + u32be(ehdr->e_shoff) + (index)*u16be(ehdr->e_shentsize)) -#define STR(strtab, offset) (const char*)(data + u32be(strtab->sh_offset) + offset) - - str_shdr = SECTION(u16be(ehdr->e_shstrndx)); - for (int i = 0; i < u16be(ehdr->e_shnum); i++) { - shdr = SECTION(i); - - const char* name = STR(str_shdr, u32be(shdr->sh_name)); - - if (strcmp(name, ".text") == 0) { - text_offset = u32be(shdr->sh_offset); - text_vaddr = u32be(shdr->sh_addr); - vaddr_adj = text_vaddr - u32be(shdr->sh_addr); - text_section_len = u32be(shdr->sh_size); - text_section = data + text_offset; - text_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_SYMTAB) { - symtab_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_DYNSYM) { - dynsym_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_MIPS_REGINFO) { - reginfo_section_index = i; - } - - if (u32be(shdr->sh_type) == SHT_DYNAMIC) { - dynamic_section_index = i; - } - - if (strcmp(name, ".got") == 0) { - got_section_index = i; - } - - if (strcmp(name, ".rodata") == 0) { - rodata_section_index = i; - } - - if (strcmp(name, ".data") == 0) { - data_section_index = i; - } - - if (strcmp(name, ".bss") == 0) { - bss_section_index = i; - } - } - - if (text_section_index == -1) { - fprintf(stderr, "Missing .text section.\n"); - exit(EXIT_FAILURE); - } - - if (symtab_section_index == -1 && dynsym_section_index == -1) { - fprintf(stderr, "Missing .symtab or .dynsym section.\n"); - exit(EXIT_FAILURE); - } - - if (dynsym_section_index != -1) { - if (reginfo_section_index == -1) { - fprintf(stderr, "Missing .reginfo section.\n"); - exit(EXIT_FAILURE); - } - - if (dynamic_section_index == -1) { - fprintf(stderr, "Missing .dynamic section.\n"); - exit(EXIT_FAILURE); - } - - if (got_section_index == -1) { - fprintf(stderr, "Missing .got section.\n"); - exit(EXIT_FAILURE); - } - } - - if (rodata_section_index != -1) { - shdr = SECTION(rodata_section_index); - uint32_t size = u32be(shdr->sh_size); - rodata_section = data + u32be(shdr->sh_offset); - rodata_section_len = size; - rodata_vaddr = u32be(shdr->sh_addr); - } - - if (data_section_index != -1) { - shdr = SECTION(data_section_index); - uint32_t size = u32be(shdr->sh_size); - data_section = data + u32be(shdr->sh_offset); - data_section_len = size; - data_vaddr = u32be(shdr->sh_addr); - } - - if (bss_section_index != -1) { - shdr = SECTION(bss_section_index); - uint32_t size = u32be(shdr->sh_size); - bss_section_len = size; - bss_vaddr = u32be(shdr->sh_addr); - } - - // add symbols - if (symtab_section_index != -1) { - sym_shdr = SECTION(symtab_section_index); - sym_strtab = SECTION(u32be(sym_shdr->sh_link)); - assert(0 && ".symtab not supported - use a program with .dynsym instead"); - - assert(u32be(sym_shdr->sh_entsize) == sizeof(Elf32_Sym)); - for (uint32_t i = 0; i < u32be(sym_shdr->sh_size); i += sizeof(Elf32_Sym)) { - Elf32_Sym* sym = (Elf32_Sym*)(data + u32be(sym_shdr->sh_offset) + i); - const char* name = STR(sym_strtab, u32be(sym->st_name)); - uint32_t addr = u32be(sym->st_value); - - if (u16be(sym->st_shndx) != text_section_index || name[0] == '.') { - continue; - } - - addr += vaddr_adj; - // disasm_label_add(state, name, addr, u32be(sym->st_size), true); - } - } - - if (dynsym_section_index != -1) { - dynsym_shdr = SECTION(dynsym_section_index); - sym_dynstr = SECTION(u32be(dynsym_shdr->sh_link)); - reginfo_shdr = SECTION(reginfo_section_index); - dynamic_shdr = SECTION(dynamic_section_index); - got_shdr = SECTION(got_section_index); - - Elf32_RegInfo* reg_info = (Elf32_RegInfo*)(data + u32be(reginfo_shdr->sh_offset)); - uint32_t gp_base = u32be(reg_info->ri_gp_value); // gp should have this value through the program run - uint32_t got_start = 0; - uint32_t local_got_no = 0; - uint32_t first_got_sym = 0; - uint32_t dynsym_no = 0; // section size can't be used due to alignment 16 padding - - assert(u32be(dynamic_shdr->sh_entsize) == sizeof(Elf32_Dyn)); - for (uint32_t i = 0; i < u32be(dynamic_shdr->sh_size); i += sizeof(Elf32_Dyn)) { - Elf32_Dyn* dyn = (Elf32_Dyn*)(data + u32be(dynamic_shdr->sh_offset) + i); - - if (u32be(dyn->d_tag) == DT_PLTGOT) { - got_start = u32be(dyn->d_un.d_ptr); - } - - if (u32be(dyn->d_tag) == DT_MIPS_LOCAL_GOTNO) { - local_got_no = u32be(dyn->d_un.d_val); - } - - if (u32be(dyn->d_tag) == DT_MIPS_GOTSYM) { - first_got_sym = u32be(dyn->d_un.d_val); - } - - if (u32be(dyn->d_tag) == DT_MIPS_SYMTABNO) { - dynsym_no = u32be(dyn->d_un.d_val); - } - } - - assert(got_start != 0); - - // value to add to asm gp offset, for example 32752, if -32752(gp) refers to the first entry in got. - uint32_t gp_adj = gp_base - got_start; - - assert(gp_adj < 0x10000); - - assert(u32be(dynsym_shdr->sh_entsize) == sizeof(Elf32_Sym)); - - uint32_t global_got_no = dynsym_no - first_got_sym; - // global_got_entry *global_entries = (global_got_entry *)calloc(global_got_no, sizeof(global_got_entry)); - - got_globals.resize(global_got_no); - - uint32_t common_start = ~0U; - vector common_order; - - for (uint32_t i = 0; i < dynsym_no; i++) { - Elf32_Sym* sym = (Elf32_Sym*)(data + u32be(dynsym_shdr->sh_offset) + i * sizeof(Elf32_Sym)); - const char* name = STR(sym_dynstr, u32be(sym->st_name)); - uint32_t addr = u32be(sym->st_value); - - addr += vaddr_adj; - - uint8_t type = ELF32_ST_TYPE(sym->st_info); - - if (!strcmp(name, "_procedure_table")) { - procedure_table_start = addr; - } else if (!strcmp(name, "_procedure_table_size")) { - procedure_table_len = 40 * u32be(sym->st_value); - } - - if ((u16be(sym->st_shndx) == SHN_MIPS_TEXT && type == STT_FUNC) || - (type == STT_OBJECT && - (u16be(sym->st_shndx) == SHN_MIPS_ACOMMON || u16be(sym->st_shndx) == SHN_MIPS_DATA))) { - // disasm_label_add(state, name, addr, u32be(sym->st_size), true); - if (type == STT_OBJECT) {} - - if (u16be(sym->st_shndx) == SHN_MIPS_ACOMMON) { - if (addr < common_start) { - common_start = addr; - } - - common_order.push_back(name); - } - - if (type == STT_FUNC) { - add_function(addr); - - if (strcmp(name, "main") == 0) { - main_addr = addr; - } - - if (strcmp(name, "_mcount") == 0) { - mcount_addr = addr; - } - - symbol_names[addr] = name; - } - } - - if (i >= first_got_sym) { - uint32_t got_value = u32be(*(uint32_t*)(data + u32be(got_shdr->sh_offset) + - (local_got_no + (i - first_got_sym)) * sizeof(uint32_t))); - - if (u16be(sym->st_shndx) == SHN_MIPS_TEXT && type == STT_FUNC) { - // got_globals[i - first_got_sym] = got_value; - // label_addresses.insert(got_value); - got_globals[i - first_got_sym] = addr; // to include the 3 instr gp header thing - label_addresses.insert(addr); - } else if (type == STT_OBJECT && - (u16be(sym->st_shndx) == SHN_UNDEF || u16be(sym->st_shndx) == SHN_COMMON)) { - // symbol defined externally (for example in libc) - got_globals[i - first_got_sym] = got_value; - } else { - got_globals[i - first_got_sym] = addr; - } - - symbol_names[got_globals[i - first_got_sym]] = name; - } - } - - uint32_t* local_entries = (uint32_t*)calloc(local_got_no, sizeof(uint32_t)); - got_locals.resize(local_got_no); - for (uint32_t i = 0; i < local_got_no; i++) { - uint32_t* entry = (uint32_t*)(data + u32be(got_shdr->sh_offset) + i * sizeof(uint32_t)); - got_locals[i] = u32be(*entry); - } - - gp_value = gp_base; - gp_value_adj = gp_adj; - - free(local_entries); - } - - // add relocations - for (int i = 0; i < u16be(ehdr->e_shnum); i++) { - Elf32_Rel* prevHi = NULL; - - shdr = SECTION(i); - if (u32be(shdr->sh_type) != SHT_REL || u32be(shdr->sh_info) != (uint32_t)text_section_index) - continue; - - if (sym_shdr == NULL) { - fprintf(stderr, "Relocations without .symtab section\n"); - exit(EXIT_FAILURE); - } - - assert(u32be(shdr->sh_link) == (uint32_t)symtab_section_index); - assert(u32be(shdr->sh_entsize) == sizeof(Elf32_Rel)); - - for (uint32_t i = 0; i < u32be(shdr->sh_size); i += sizeof(Elf32_Rel)) { - Elf32_Rel* rel = (Elf32_Rel*)(data + u32be(shdr->sh_offset) + i); - uint32_t offset = text_offset + u32be(rel->r_offset); - uint32_t symIndex = ELF32_R_SYM(u32be(rel->r_info)); - uint32_t rtype = ELF32_R_TYPE(u32be(rel->r_info)); - const char* symName = "0"; - - if (symIndex != STN_UNDEF) { - Elf32_Sym* sym = (Elf32_Sym*)(data + u32be(sym_shdr->sh_offset) + symIndex * sizeof(Elf32_Sym)); - - symName = STR(sym_strtab, u32be(sym->st_name)); - } - - if (rtype == R_MIPS_HI16) { - if (prevHi != NULL) { - fprintf(stderr, "Consecutive R_MIPS_HI16.\n"); - exit(EXIT_FAILURE); - } - - prevHi = rel; - continue; - } - - if (rtype == R_MIPS_LO16) { - int32_t addend = (int16_t)((data[offset + 2] << 8) + data[offset + 3]); - - if (prevHi != NULL) { - uint32_t offset2 = text_offset + u32be(prevHi->r_offset); - - addend += (uint32_t)((data[offset2 + 2] << 8) + data[offset2 + 3]) << 16; - // add_reloc(state, offset2, symName, addend, out_range.vaddr); - } - prevHi = NULL; - // add_reloc(state, offset, symName, addend, out_range.vaddr); - } else if (rtype == R_MIPS_26) { - int32_t addend = (u32be(*(uint32_t*)(data + offset)) & ((1 << 26) - 1)) << 2; - - if (addend >= (1 << 27)) { - addend -= 1 << 28; - } - // add_reloc(state, offset, symName, addend, out_range.vaddr); - } - - else { - fprintf(stderr, "Bad relocation type %d.\n", rtype); - exit(EXIT_FAILURE); - } - } - - if (prevHi != NULL) { - fprintf(stderr, "R_MIPS_HI16 without matching R_MIPS_LO16.\n"); - exit(EXIT_FAILURE); - } - } -} -#undef SECTION -#undef STR - -size_t read_file(const char* file_name, uint8_t** data) { - FILE* in; - uint8_t* in_buf = NULL; - long file_size; - long bytes_read; - - in = fopen(file_name, "rb"); - assert(in != nullptr); - - // allocate buffer to read from offset to end of file - fseek(in, 0, SEEK_END); - file_size = ftell(in); - assert(file_size != -1L); - - in_buf = (uint8_t*)malloc(file_size); - fseek(in, 0, SEEK_SET); - - // read bytes - bytes_read = fread(in_buf, 1, file_size, in); - assert(bytes_read == file_size); - - fclose(in); - *data = in_buf; - return bytes_read; -} - -#ifdef UNIX_PLATFORM -void crashHandler(int sig) { - void* array[4096]; - const size_t nMaxFrames = std::size(array); - size_t size = backtrace(array, nMaxFrames); - char** symbols = backtrace_symbols(array, nMaxFrames); - - fprintf(stderr, "\n recomp crashed. (Signal: %i)\n", sig); - - // Feel free to add more crash messages. - const char* crashEasterEgg[] = { - "\tIT'S A SECRET TO EVERYBODY. \n\tBut it shouldn't be, you'd better ask about it!", - "\tI AM ERROR.", - "\tGRUMBLE,GRUMBLE...", - "\tDODONGO DISLIKES SMOKE \n\tAnd recomp dislikes whatever you fed it.", - "\tMay the way of the Hero lead \n\tto the debugger.", - "\tTHE WIND FISH SLUMBERS LONG... \n\tTHE HERO'S LIFE GONE... ", - "\tSEA BEARS FOAM, SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY CRASSSH!", - "\tYou've met with a terrible fate, haven't you?", - "\tMaster, I calculate a 100% probability that recomp has crashed. \n\tAdditionally, the " - "batteries in your Wii Remote are nearly depleted.", - "\t CONGRATURATIONS! \n" - "\tAll Pages are displayed.\n" - "\t THANK YOU! \n" - "\t You are great debugger!", - "\tRCP is HUNG UP!!\n" - "\tOh! MY GOD!!", - }; - - srand(time(nullptr)); - auto easterIndex = rand() % std::size(crashEasterEgg); - - fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]); - - fprintf(stderr, "Traceback:\n"); - for (size_t i = 1; i < size; i++) { - Dl_info info; - uint32_t gotAddress = dladdr(array[i], &info); - std::string functionName(symbols[i]); - - if (gotAddress != 0 && info.dli_sname != nullptr) { - int32_t status; - char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status); - const char* nameFound = info.dli_sname; - - if (status == 0) { - nameFound = demangled; - } - - { - char auxBuffer[0x8000]; - - snprintf(auxBuffer, std::size(auxBuffer), "%s (+0x%lX)", nameFound, - (char*)array[i] - (char*)info.dli_saddr); - functionName = auxBuffer; - } - free(demangled); - -#if FULL_TRACEBACK == 0 - fprintf(stderr, "%-3zd %s\n", i, functionName.c_str()); -#endif - } - -#if FULL_TRACEBACK != 0 - fprintf(stderr, "%-3zd %s\n", i, functionName.c_str()); -#endif - } - - fprintf(stderr, "\n"); - - free(symbols); - exit(1); -} -#endif - -int main(int argc, char* argv[]) { - const char* filename = argv[1]; - - if (strcmp(filename, "--conservative") == 0) { - conservative = true; - filename = argv[2]; - } - -#ifdef UNIX_PLATFORM - signal(SIGSEGV, crashHandler); - signal(SIGABRT, crashHandler); -#endif - - uint8_t* data; - size_t len = read_file(filename, &data); - - parse_elf(data, len); - disassemble(); - inspect_data_function_pointers(data_function_pointers, rodata_section, rodata_vaddr, rodata_section_len); - inspect_data_function_pointers(data_function_pointers, data_section, data_vaddr, data_section_len); - pass1(); - pass2(); - pass3(); - pass4(); - pass5(); - pass6(); - // dump(); - dump_c(); - free(data); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/.clang-format b/tools/ido-static-recomp/tools/rabbitizer/.clang-format deleted file mode 100644 index 414e3cff..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.clang-format +++ /dev/null @@ -1,23 +0,0 @@ -IndentWidth: 4 -Language: Cpp -UseTab: Never -ColumnLimit: 160 -PointerAlignment: Right -BreakBeforeBraces: Attach -SpaceAfterCStyleCast: false -Cpp11BracedListStyle: false -IndentCaseLabels: true -BinPackArguments: true -BinPackParameters: true -AlignAfterOpenBracket: Align -AlignOperands: true -BreakBeforeTernaryOperators: true -BreakBeforeBinaryOperators: None -AllowShortBlocksOnASingleLine: true -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: false -AlignEscapedNewlines: Left -AlignTrailingComments: true -SortIncludes: false diff --git a/tools/ido-static-recomp/tools/rabbitizer/.clang-tidy b/tools/ido-static-recomp/tools/rabbitizer/.clang-tidy deleted file mode 100644 index 8534b8a6..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.clang-tidy +++ /dev/null @@ -1,9 +0,0 @@ -Checks: 'readability-*,-readability-magic-numbers,clang-diagnostic-*,clang-analyzer-*,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,bugprone*,-bugprone-branch-clone,modernize*,performance*,portability*,diagnostic-*,analyzer-*,misc*,-misc-no-recursion' -WarningsAsErrors: '' -HeaderFilterRegex: '(src|include)\/.*\.h$' -FormatStyle: 'file' -CheckOptions: - # Require argument names to match exactly (instead of allowing a name to be a prefix/suffix of another) - # Note: 'true' is expected by clang-tidy 12+ but '1' is used for compatibility with older versions - - key: readability-inconsistent-declaration-parameter-name.Strict - value: 1 diff --git a/tools/ido-static-recomp/tools/rabbitizer/.gitattributes b/tools/ido-static-recomp/tools/rabbitizer/.gitattributes deleted file mode 100644 index dfe07704..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml b/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml deleted file mode 100644 index 6baeb371..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/ci.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Build and upload to PyPI - -# Build on every branch push, tag push, and pull request change: -on: [push, pull_request] - -jobs: - build_wheels: - name: Build wheels on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - - steps: - - uses: actions/checkout@v2 - - - name: Build wheels - uses: pypa/cibuildwheel@v2.5.0 - env: - CIBW_ARCHS_WINDOWS: "auto" - CIBW_ARCHS_LINUX: "auto" - CIBW_ARCHS_MACOS: "all" - - - uses: actions/upload-artifact@v2 - with: - path: ./wheelhouse/*.whl - - build_sdist: - name: Build source distribution - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Build sdist - run: pipx run build --sdist - - - uses: actions/upload-artifact@v2 - with: - path: dist/*.tar.gz - - upload_pypi: - needs: [build_wheels, build_sdist] - runs-on: ubuntu-latest - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - steps: - - uses: actions/download-artifact@v2 - with: - name: artifact - path: dist - - - uses: pypa/gh-action-pypi-publish@v1.4.2 - with: - user: __token__ - password: ${{ secrets.pypi_password }} diff --git a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml b/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml deleted file mode 100644 index 3079d9e3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.github/workflows/make.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: make - -# Build on every branch push, tag push, and pull request change: -on: [push, pull_request] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: make - run: make WERROR=1 diff --git a/tools/ido-static-recomp/tools/rabbitizer/.gitignore b/tools/ido-static-recomp/tools/rabbitizer/.gitignore deleted file mode 100644 index e433d8d7..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/.gitignore +++ /dev/null @@ -1,215 +0,0 @@ -# https://raw.githubusercontent.com/github/gitignore/main/C.gitignore -# https://raw.githubusercontent.com/github/gitignore/main/Python.gitignore - -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf - - - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - - -.vscode/ - diff --git a/tools/ido-static-recomp/tools/rabbitizer/LICENSE b/tools/ido-static-recomp/tools/rabbitizer/LICENSE deleted file mode 100644 index 10a2aa35..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Decompollaborate - -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 -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/tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in b/tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in deleted file mode 100644 index 1e60716c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/MANIFEST.in +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -include **/*.h -include **/**/*.h -graft include diff --git a/tools/ido-static-recomp/tools/rabbitizer/Makefile b/tools/ido-static-recomp/tools/rabbitizer/Makefile deleted file mode 100644 index e0b92c36..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/Makefile +++ /dev/null @@ -1,140 +0,0 @@ -# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'. -DEBUG ?= 0 -WERROR ?= 0 -ASAN ?= 0 -EXPERIMENTAL ?= 0 -SANITY_CHECKS ?= 1 - -CC := clang -CXX := clang++ -AR := ar -IINC := -I include -IINC_XX := -I include -I cplusplus/include -CSTD := -std=c11 -CXXSTD := -std=c++17 -CFLAGS := -fPIC -CXXFLAGS := -fPIC -LDFLAGS := -Lbuild -lrabbitizer -LDXXFLAGS := -Lbuild -lrabbitizerpp -WARNINGS := -Wall -Wextra -Wpedantic -# WARNINGS := -Wall -Wextra -Wpedantic -Wpadded -WARNINGS += -Werror=vla -Werror=switch -Werror=implicit-fallthrough -Werror=unused-function -Werror=unused-parameter -Werror=shadow -WARNINGS_C := -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -WARNINGS_CXX := - -ifeq ($(CC),gcc) - WARNINGS += -Wno-cast-function-type -endif - -ifeq ($(DEBUG),0) - OPTFLAGS := -Os -g -else - OPTFLAGS := -O0 -g3 - CFLAGS += -DDEVELOPMENT=1 - CXXFLAGS += -DDEVELOPMENT=1 -endif - -ifneq ($(WERROR),0) - WARNINGS += -Werror -endif - -ifneq ($(ASAN),0) - CFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined - CXXFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined -endif - -ifneq ($(EXPERIMENTAL),0) - CFLAGS += -DEXPERIMENTAL - CXXFLAGS += -DEXPERIMENTAL -endif - -ifneq ($(SANITY_CHECKS),0) - CFLAGS += -DRAB_SANITY_CHECKS=1 - CXXFLAGS += -DRAB_SANITY_CHECKS=1 -endif - - -SRC_DIRS := $(shell find src -type d) -C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) -H_FILES := $(foreach dir,$(IINC),$(wildcard $(dir)/**/*.h)) -O_FILES := $(foreach f,$(C_FILES:.c=.o),build/$f) - -SRCXX_DIRS := $(shell find cplusplus/src -type d) -CXX_FILES := $(foreach dir,$(SRCXX_DIRS),$(wildcard $(dir)/*.cpp)) -HXX_FILES := $(foreach dir,$(IINC_XX),$(wildcard $(dir)/**/*.hpp)) -OXX_FILES := $(foreach f,$(CXX_FILES:.cpp=.o),build/$f) - -DEP_FILES := $(O_FILES:%.o=%.d) $(OXX_FILES:%.o=%.d) - -TESTS_DIRS := $(shell find tests -type d) - -STATIC_LIB := build/librabbitizer.a -DYNAMIC_LIB := build/librabbitizer.so - -STATIC_LIB_XX := build/librabbitizerpp.a -DYNAMIC_LIB_XX := build/librabbitizerpp.so - -# create build directories -$(shell mkdir -p $(foreach dir,$(SRC_DIRS) $(SRCXX_DIRS) $(TESTS_DIRS),build/$(dir))) - - -# Dependencies of libraries - -$(STATIC_LIB): $(O_FILES) -$(DYNAMIC_LIB): $(O_FILES) - -$(STATIC_LIB_XX): $(O_FILES) $(OXX_FILES) -$(DYNAMIC_LIB_XX): $(O_FILES) $(OXX_FILES) - - -#### Main Targets ### - -all: static tests - -static: $(STATIC_LIB) $(STATIC_LIB_XX) -dynamic: $(DYNAMIC_LIB) $(DYNAMIC_LIB_XX) - -clean: - $(RM) -rf build - -distclean: clean - $(RM) -rf dist rabbitizer.egg-info .mypy_cache - -format: - clang-format-11 -i -style=file $(C_FILES) - clang-format-11 -i -style=file $(CXX_FILES) - -tidy: - clang-tidy-11 -p . --fix --fix-errors $(C_FILES) $(H_FILES) -- $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(WARNINGS_C) $(CFLAGS) - -tests: build/test.elf build/rsptest.elf build/r5900test.elf build/registersTrackerTest.elf build/tests/cplusplus/test.elf - -.PHONY: all clean distclean format tidy tests -.DEFAULT_GOAL := all -.SECONDARY: - - -#### Various Recipes #### - -build/%.elf: %.c | $(STATIC_LIB) - $(CC) -MMD $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(WARNINGS_C) $(CFLAGS) -o $@ $^ $(LDFLAGS) - -build/%.elf: %.cpp | $(STATIC_LIB_XX) - $(CXX) -MMD $(CXXSTD) $(OPTFLAGS) $(IINC_XX) $(WARNINGS) $(WARNINGS_CXX) $(CXXFLAGS) -o $@ $^ $(LDXXFLAGS) - -build/%.a: - $(AR) rcs $@ $^ - -build/%.so: - $(CC) -shared -o $@ $^ - -build/%.o: %.c -# The -MMD flags additionaly creates a .d file with the same name as the .o file. - $(CC) -MMD -c $(CSTD) $(OPTFLAGS) $(IINC) $(WARNINGS) $(WARNINGS_C) $(CFLAGS) -o $@ $< - -build/%.o: %.cpp -# The -MMD flags additionaly creates a .d file with the same name as the .o file. - $(CXX) -MMD -c $(CXXSTD) $(OPTFLAGS) $(IINC_XX) $(WARNINGS) $(WARNINGS_CXX) $(CXXFLAGS) -o $@ $< - - --include $(DEP_FILES) diff --git a/tools/ido-static-recomp/tools/rabbitizer/README.md b/tools/ido-static-recomp/tools/rabbitizer/README.md deleted file mode 100644 index 18bc794c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# rabbitizer - -[![PyPI - Downloads](https://img.shields.io/pypi/dm/rabbitizer)](https://pypi.org/project/rabbitizer/) -![GitHub](https://img.shields.io/github/license/Decompollaborate/rabbitizer) -![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/Decompollaborate/rabbitizer) -![PyPI](https://img.shields.io/pypi/v/rabbitizer) -![GitHub contributors](https://img.shields.io/github/contributors/Decompollaborate/rabbitizer?logo=purple) - -A MIPS instruction decoder API. - -Currently supports all the CPU instructions for MIPS I, II, III and IV. - -## Installing - -The recommended way to install is using from the PyPi release, via `pip`: - -```bash -pip install rabbitizer -``` - -In case you want to mess with the latest development version without wanting to clone the repository, then you could use the following command: - -```bash -pip install git+https://github.com/Decompollaborate/rabbitizer.git@develop -``` - -NOTE: Installing the development version is not recommended. Proceed at your own risk. - -## Features - -- Should produces matching assembly. -- Fully written in C for fast decoding. -- Python bindings. - - The minimal Python version is 3.7, older versions are not guaranteed to work. -- Includes some minor tools to build your own pointer/symbol detection. -- Configurable, many features can be turned on and off. -- MIPS instructions features: - - Named registers for MIPS VR4300's coprocessors. - - Support for many pseudoinstructions. - - Properly handle move to/from coprocessor instructions. - - Support for numeric, o32, n32 and n64 ABI register names. -- Some workarounds for some specific compilers/assemblers: - - `SN64`: - - `div`/`divu` fix: tweaks a bit the produced `div`, `divu` and `break` instructions. -- N64 RSP instruction decoding support. - - RSP decoding has been tested to build back to matching assemblies with [armips](https://github.com/Kingcom/armips/). -- R5900 (PS2's Emotion Engine processor) decoding support. - -## References - -- R5900: - - EmotionEngine instruction decoding: - - Official documentation from Toshiba: - - VU instruction manual: - - GNU binutils: diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp deleted file mode 100644 index 020761a5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/LoPairingInfo.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_LO_PAIRING_INFO_HPP -#define RABBITIZER_LO_PAIRING_INFO_HPP -#pragma once - -#include "analysis/RabbitizerLoPairingInfo.h" - - -namespace rabbitizer { - class LoPairingInfo { - protected: - RabbitizerLoPairingInfo pairingInfo; - - public: - LoPairingInfo(); - LoPairingInfo(const RabbitizerLoPairingInfo &pairingInfo); - - /** - * Returns a pointer to the inner RabbitizerLoPairingInfo. - * It is recommended to not mess with it unless you know what you are doing. - */ - RabbitizerLoPairingInfo *getCPtr(); - const RabbitizerLoPairingInfo *getCPtr() const; - - int getInstrOffset() const; - int64_t getValue() const; - bool shouldProcess() const; - bool isGpRel() const; - bool isGpGot() const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp deleted file mode 100644 index d3e1cb9e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/analysis/RegistersTracker.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTERS_TRACKER_HPP -#define RABBITIZER_REGISTERS_TRACKER_HPP -#pragma once - -#include "analysis/RabbitizerRegistersTracker.h" - -#include "analysis/LoPairingInfo.hpp" -#include "instructions/InstructionBase.hpp" - - -namespace rabbitizer { - class RegistersTracker { - protected: - RabbitizerRegistersTracker tracker; - - public: - RegistersTracker(); - RegistersTracker(const RegistersTracker &other); - virtual ~RegistersTracker(); - - /** - * Returns a pointer to the inner RabbitizerRegistersTracker. - * It is recommended to not mess with it unless you know what you are doing. - */ - RabbitizerRegistersTracker *getCPtr(); - const RabbitizerRegistersTracker *getCPtr() const; - - bool moveRegisters(const InstructionBase &instr); - void overwriteRegisters(const InstructionBase &instr, int instrOffset); - void unsetRegistersAfterFuncCall(const InstructionBase &instr, const InstructionBase &prevInstr); - bool getAddressIfCanSetType(const InstructionBase &instr, int instrOffset, uint32_t *dstAddress) const; - bool getJrInfo(const InstructionBase &instr, int *dstOffset, uint32_t *dstAddress) const; - - void processLui(const InstructionBase &instr, int instrOffset); - void processLui(const InstructionBase &instr, int instrOffset, const InstructionBase &prevInstr); - void processGpLoad(const InstructionBase &instr, int instrOffset); - bool getLuiOffsetForConstant(const InstructionBase &instr, int *dstOffset) const; - void processConstant(const InstructionBase &instr, uint32_t value, int offset); - LoPairingInfo preprocessLoAndGetInfo(const InstructionBase &instr, int instrOffset); - void processLo(const InstructionBase &instr, uint32_t value, int offset); - bool hasLoButNoHi(const InstructionBase &instr) const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp deleted file mode 100644 index 59bf46f5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstrId.hpp +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRID_HPP -#define RABBITIZER_INSTRID_HPP -#pragma once - -#include - - -namespace rabbitizer { - namespace InstrId { - #define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - prefix##_##name, - - #define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) \ - RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - - enum class UniqueId { - #include "instructions/instr_id/RabbitizerInstrId_cpu.inc" - - #include "instructions/instr_id/RabbitizerInstrId_rsp.inc" - - #include "instructions/instr_id/RabbitizerInstrId_r5900.inc" - - ALL_MAX = RABBITIZER_DEF_INSTR_ID(r5900, , MAX, ) - }; - - #undef RABBITIZER_DEF_INSTR_ID - #undef RABBITIZER_DEF_INSTR_ID_ALTNAME - - - std::string getOpcodeName(UniqueId uniqueId); - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp deleted file mode 100644 index ced9901a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionBase.hpp +++ /dev/null @@ -1,253 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_BASE_HPP -#define RABBITIZER_INSTRUCTION_BASE_HPP -#pragma once - -#include -#include - -#include "instructions/RabbitizerInstruction.h" - -#include "instructions/Registers.hpp" -#include "instructions/OperandType.hpp" -#include "instructions/InstrId.hpp" - - -namespace rabbitizer { - class InstructionBase { - protected: - RabbitizerInstruction instr; - - InstructionBase() = default; - virtual ~InstructionBase() = default; - - public: - /** - * Returns a pointer to the inner RabbitizerInstruction. - * It is recommended to not mess with it unless you know what you are doing. - */ - RabbitizerInstruction *getCPtr(); - const RabbitizerInstruction *getCPtr() const; - - /* getters */ - - uint8_t Get_opcode() const; - uint8_t Get_sa() const; - uint8_t Get_function() const; - - Registers::Cpu::GprO32 GetO32_rs() const; - Registers::Cpu::GprO32 GetO32_rt() const; - Registers::Cpu::GprO32 GetO32_rd() const; - - Registers::Cpu::GprN32 GetN32_rs() const; - Registers::Cpu::GprN32 GetN32_rt() const; - Registers::Cpu::GprN32 GetN32_rd() const; - - Registers::Cpu::Cop0 Get_cop0d() const; - - uint32_t Get_instr_index() const; - uint16_t Get_immediate() const; - - Registers::Cpu::Cop1O32 GetO32_fs() const; - Registers::Cpu::Cop1O32 GetO32_ft() const; - Registers::Cpu::Cop1O32 GetO32_fd() const; - - Registers::Cpu::Cop1N32 GetN32_fs() const; - Registers::Cpu::Cop1N32 GetN32_ft() const; - Registers::Cpu::Cop1N32 GetN32_fd() const; - - Registers::Cpu::Cop1N64 GetN64_fs() const; - Registers::Cpu::Cop1N64 GetN64_ft() const; - Registers::Cpu::Cop1N64 GetN64_fd() const; - - Registers::Cpu::Cop1Control Get_cop1cs() const; - - Registers::Cpu::Cop2 Get_cop2t() const; - - uint8_t Get_op() const; - - uint32_t Get_code() const; - uint32_t Get_code_upper() const; - uint32_t Get_code_lower() const; - - uint32_t Get_copraw() const; - - uint8_t Get_fmt() const; - uint8_t Get_fc() const; - uint8_t Get_cond() const; - - uint8_t Get_tf() const; - uint8_t Get_nd() const; - uint8_t Get_bc_fmt() const; - - uint8_t Get_stype() const; - - /* getters */ - - - /* setters */ - - void Set_opcode(uint8_t val); - void Set_sa(uint8_t val); - void Set_function(uint8_t val); - - void Set_rs(Registers::Cpu::GprO32 val); - void Set_rt(Registers::Cpu::GprO32 val); - void Set_rd(Registers::Cpu::GprO32 val); - - void Set_rs(Registers::Cpu::GprN32 val); - void Set_rt(Registers::Cpu::GprN32 val); - void Set_rd(Registers::Cpu::GprN32 val); - - void Set_cop0d(Registers::Cpu::Cop0 val); - - void Set_instr_index(uint32_t val); - void Set_immediate(uint16_t val); - - void Set_fs(Registers::Cpu::Cop1O32 val); - void Set_ft(Registers::Cpu::Cop1O32 val); - void Set_fd(Registers::Cpu::Cop1O32 val); - - void Set_fs(Registers::Cpu::Cop1N32 val); - void Set_ft(Registers::Cpu::Cop1N32 val); - void Set_fd(Registers::Cpu::Cop1N32 val); - - void Set_fs(Registers::Cpu::Cop1N64 val); - void Set_ft(Registers::Cpu::Cop1N64 val); - void Set_fd(Registers::Cpu::Cop1N64 val); - - void Set_cop1cs(Registers::Cpu::Cop1Control val); - - void Set_cop2t(Registers::Cpu::Cop2 val); - - void Set_op(uint8_t val); - - void Set_code(uint32_t val); - void Set_code_upper(uint32_t val); - void Set_code_lower(uint32_t val); - - void Set_copraw(uint32_t val); - - void Set_fmt(uint8_t val); - void Set_fc(uint8_t val); - void Set_cond(uint8_t val); - - void Set_tf(uint8_t val); - void Set_nd(uint8_t val); - void Set_bc_fmt(uint8_t val); - - void Set_stype(uint8_t val); - - /* setters */ - - - /* more getters */ - - uint32_t getRaw() const; - - InstrId::UniqueId getUniqueId() const; - uint32_t getVram() const; - bool isInHandwrittenFunction() const; - - int32_t getProcessedImmediate() const; - uint32_t getInstrIndexAsVram() const; - - int32_t getBranchOffset() const; - int32_t getGenericBranchOffset(uint32_t currentVram) const; - - - std::string getOpcodeName() const; - - /* more getters */ - - - /* */ - - void blankOut(); - - - /* Instruction examination */ - - bool isImplemented() const; - bool isLikelyHandwritten() const; - bool isNop() const; - bool isUnconditionalBranch() const; - bool isJrRa() const; - bool isJrNotRa() const; - bool hasDelaySlot() const; - - std::string mapInstrToType() const; - - bool sameOpcode(const InstructionBase &other) const; - bool sameOpcodeButDifferentArguments(const InstructionBase &other) const; - - bool hasOperand(OperandType operand) const; - bool hasOperandAlias(OperandType operand) const; - - uint32_t getValidBits() const; - bool isValid() const; - - /* Instruction examination */ - - - /* Instruction descriptor */ - - bool isUnknownType() const; - bool isJType() const; - bool isIType() const; - bool isRType() const; - bool isRegimmType() const; - - // TODO - // RabbitizerInstrSuffix instrSuffix() const; - - bool isBranch() const; - bool isBranchLikely() const; - bool isJump() const; - bool isTrap() const; - - bool isFloat() const; - bool isDouble() const; - - bool isUnsigned() const; - - bool modifiesRt() const; - bool modifiesRd() const; - - bool notEmitedByCompilers() const; - - bool canBeHi() const; - bool canBeLo() const; - bool doesLink() const; - bool doesDereference() const; - bool doesLoad() const; - bool doesStore() const; - bool maybeIsMove() const; - - bool isPseudo() const; - - /* Instruction descriptor */ - - - /* Disassembly */ - - bool mustDisasmAsData() const; - - std::string disassembleOperands() const; - std::string disassembleOperands(std::string_view immOverride) const; - - std::string disassembleInstruction(int extraLJust) const; - std::string disassembleInstruction(int extraLJust, std::string_view immOverride) const; - - std::string disassembleAsData(int extraLJust) const; - - std::string disassemble(int extraLJust) const; - std::string disassemble(int extraLJust, std::string_view immOverride) const; - - /* Disassembly */ - }; -}; - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp deleted file mode 100644 index ef2eec54..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionCpu.hpp +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_CPU_HPP -#define RABBITIZER_INSTRUCTION_CPU_HPP -#pragma once - -#include "InstructionBase.hpp" - - -namespace rabbitizer { - class InstructionCpu : public InstructionBase { - public: - InstructionCpu(uint32_t word, uint32_t vram); - virtual ~InstructionCpu(); - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp deleted file mode 100644 index 0be3a271..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionR5900.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_R5900_HPP -#define RABBITIZER_INSTRUCTION_R5900_HPP -#pragma once - -#include "InstructionBase.hpp" - - -namespace rabbitizer { - class InstructionR5900 : public InstructionBase { - public: - InstructionR5900(uint32_t word, uint32_t vram); - virtual ~InstructionR5900(); - - Registers::R5900::VF GetR5900_vfs() const; - Registers::R5900::VF GetR5900_vft() const; - Registers::R5900::VF GetR5900_vfd() const; - - Registers::R5900::VI GetR5900_vis() const; - Registers::R5900::VI GetR5900_vit() const; - Registers::R5900::VI GetR5900_vid() const; - - uint8_t GetR5900_mmi_function() const; - uint8_t GetR5900_fhi_flo() const; - - uint8_t GetR5900_xyzw_x() const; - uint8_t GetR5900_xyzw_y() const; - uint8_t GetR5900_xyzw_z() const; - uint8_t GetR5900_xyzw_w() const; - uint8_t GetR5900_n() const; - uint8_t GetR5900_l() const; - uint8_t GetR5900_m() const; - - uint8_t GetR5900_imm5() const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp deleted file mode 100644 index f2d32a13..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/InstructionRsp.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_RSP_HPP -#define RABBITIZER_INSTRUCTION_RSP_HPP -#pragma once - -#include "InstructionBase.hpp" - - -namespace rabbitizer { - class InstructionRsp : public InstructionBase { - public: - InstructionRsp(uint32_t word, uint32_t vram); - virtual ~InstructionRsp(); - - Registers::Rsp::Gpr GetRsp_rs() const; - Registers::Rsp::Gpr GetRsp_rt() const; - Registers::Rsp::Gpr GetRsp_rd() const; - - Registers::Rsp::Cop0 GetRsp_cop0d() const; - - Registers::Rsp::Cop2 GetRsp_cop2t() const; - - Registers::Rsp::Cop2Control GetRsp_cop2cd() const; - - Registers::Rsp::Vector GetRsp_vs() const; - Registers::Rsp::Vector GetRsp_vt() const; - Registers::Rsp::Vector GetRsp_vd() const; - - uint8_t GetRsp_elementhigh() const; - uint8_t GetRsp_elementlow() const; - - uint8_t GetRsp_index() const; - uint8_t GetRsp_de() const; - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp deleted file mode 100644 index abd728ad..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/OperandType.hpp +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_OPERAND_TYPE_HPP -#define RABBITIZER_OPERAND_TYPE_HPP -#pragma once - - -namespace rabbitizer { - #define RAB_DEF_OPERAND(prefix, operand) \ - prefix##_##operand, - - enum class OperandType { - RAB_DEF_OPERAND(ALL, INVALID) - - #include "instructions/operands/RabbitizerOperandType_cpu.inc" - #include "instructions/operands/RabbitizerOperandType_rsp.inc" - #include "instructions/operands/RabbitizerOperandType_r5900.inc" - - RAB_DEF_OPERAND(ALL, MAX) - }; - - #undef RAB_DEF_OPERAND -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp deleted file mode 100644 index ceddd8f8..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/instructions/Registers.hpp +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTER_HPP -#define RABBITIZER_REGISTER_HPP -#pragma once - - -namespace rabbitizer { - - namespace Registers { - #define RABBITIZER_DEF_REG(prefix, name, numeric) \ - prefix##_##name - - #define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - prefix##_##name - - namespace Cpu { - enum class GprO32 { - #include "instructions/registers/RabbitizerRegister_GprO32.inc" - }; - - enum class GprN32 { - #include "instructions/registers/RabbitizerRegister_GprN32.inc" - }; - - - enum class Cop0 { - #include "instructions/registers/RabbitizerRegister_Cop0.inc" - }; - - // Float registers - enum class Cop1O32 { - #include "instructions/registers/RabbitizerRegister_Cop1O32.inc" - }; - - enum class Cop1N32 { - #include "instructions/registers/RabbitizerRegister_Cop1N32.inc" - }; - - enum class Cop1N64 { - #include "instructions/registers/RabbitizerRegister_Cop1N64.inc" - }; - - enum class Cop1Control { - #include "instructions/registers/RabbitizerRegister_Cop1Control.inc" - }; - - enum class Cop2 { - #include "instructions/registers/RabbitizerRegister_Cop2.inc" - }; - }; - - - namespace Rsp { - enum class Gpr { - #include "instructions/registers/RabbitizerRegister_RspGpr.inc" - }; - - enum class Cop0 { - #include "instructions/registers/RabbitizerRegister_RspCop0.inc" - }; - - enum class Cop2 { - #include "instructions/registers/RabbitizerRegister_RspCop2.inc" - }; - - enum class Cop2Control { - #include "instructions/registers/RabbitizerRegister_RspCop2Control.inc" - }; - - enum class Vector { - #include "instructions/registers/RabbitizerRegister_RspVector.inc" - }; - }; - - - namespace R5900 { - enum class VF { - #include "instructions/registers/RabbitizerRegister_R5900VF.inc" - }; - - enum class VI { - #include "instructions/registers/RabbitizerRegister_R5900VI.inc" - }; - }; - - #undef RABBITIZER_DEF_REG - #undef RABBITIZER_DEF_REG_NODOLLAR - }; -}; - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp deleted file mode 100644 index 332101e8..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/include/rabbitizer.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_HPP -#define RABBITIZER_HPP -#pragma once - - -#include "common/RabbitizerVersion.h" -#include "common/RabbitizerConfig.h" - -#include "instructions/OperandType.hpp" -#include "instructions/InstrId.hpp" -//#include "instructions/InstrSuffix.hpp" -//#include "instructions/InstrDescriptor.hpp" -#include "instructions/Registers.hpp" -#include "instructions/InstructionBase.hpp" -#include "instructions/InstructionCpu.hpp" -#include "instructions/InstructionRsp.hpp" -#include "instructions/InstructionR5900.hpp" - -#include "analysis/LoPairingInfo.hpp" -#include "analysis/RegistersTracker.hpp" - - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp deleted file mode 100644 index d6fba253..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/LoPairingInfo.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/LoPairingInfo.hpp" - -using namespace rabbitizer; - -LoPairingInfo::LoPairingInfo() : pairingInfo{} { -} -LoPairingInfo::LoPairingInfo(const RabbitizerLoPairingInfo &newPairingInfo) : pairingInfo{ newPairingInfo } { -} - -RabbitizerLoPairingInfo *LoPairingInfo::getCPtr() { - return &this->pairingInfo; -} -const RabbitizerLoPairingInfo *LoPairingInfo::getCPtr() const { - return &this->pairingInfo; -} - -int LoPairingInfo::getInstrOffset() const { - return this->pairingInfo.instrOffset; -} -int64_t LoPairingInfo::getValue() const { - return this->pairingInfo.value; -} -bool LoPairingInfo::shouldProcess() const { - return this->pairingInfo.shouldProcess; -} -bool LoPairingInfo::isGpRel() const { - return this->pairingInfo.isGpRel; -} -bool LoPairingInfo::isGpGot() const { - return this->pairingInfo.isGpGot; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp deleted file mode 100644 index 5294d58f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/analysis/RegistersTracker.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RegistersTracker.hpp" - -using namespace rabbitizer; - -RegistersTracker::RegistersTracker() { - RabbitizerRegistersTracker_init(&this->tracker, NULL); -} -RegistersTracker::RegistersTracker(const RegistersTracker &other) { - RabbitizerRegistersTracker_init(&this->tracker, &other.tracker); -} -RegistersTracker::~RegistersTracker() { - RabbitizerRegistersTracker_destroy(&this->tracker); -} - -RabbitizerRegistersTracker *RegistersTracker::getCPtr() { - return &this->tracker; -} -const RabbitizerRegistersTracker *RegistersTracker::getCPtr() const { - return &this->tracker; -} - -bool RegistersTracker::moveRegisters(const InstructionBase &instr) { - return RabbitizerRegistersTracker_moveRegisters(&this->tracker, instr.getCPtr()); -} -void RegistersTracker::overwriteRegisters(const InstructionBase &instr, int instrOffset) { - RabbitizerRegistersTracker_overwriteRegisters(&this->tracker, instr.getCPtr(), instrOffset); -} -void RegistersTracker::unsetRegistersAfterFuncCall(const InstructionBase &instr, const InstructionBase &prevInstr) { - RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(&this->tracker, instr.getCPtr(), prevInstr.getCPtr()); -} -bool RegistersTracker::getAddressIfCanSetType(const InstructionBase &instr, int instrOffset, uint32_t *dstAddress) const { - return RabbitizerRegistersTracker_getAddressIfCanSetType(&this->tracker, instr.getCPtr(), instrOffset, dstAddress); -} -bool RegistersTracker::getJrInfo(const InstructionBase &instr, int *dstOffset, uint32_t *dstAddress) const { - return RabbitizerRegistersTracker_getJrInfo(&this->tracker, instr.getCPtr(), dstOffset, dstAddress); -} - -void RegistersTracker::processLui(const InstructionBase &instr, int instrOffset) { - RabbitizerRegistersTracker_processLui(&this->tracker, instr.getCPtr(), instrOffset, NULL); -} -void RegistersTracker::processLui(const InstructionBase &instr, int instrOffset, const InstructionBase &prevInstr) { - RabbitizerRegistersTracker_processLui(&this->tracker, instr.getCPtr(), instrOffset, prevInstr.getCPtr()); -} -void RegistersTracker::processGpLoad(const InstructionBase &instr, int instrOffset) { - RabbitizerRegistersTracker_processGpLoad(&this->tracker, instr.getCPtr(), instrOffset); -} -bool RegistersTracker::getLuiOffsetForConstant(const InstructionBase &instr, int *dstOffset) const { - return RabbitizerRegistersTracker_getLuiOffsetForConstant(&this->tracker, instr.getCPtr(), dstOffset); -} -void RegistersTracker::processConstant(const InstructionBase &instr, uint32_t value, int offset) { - RabbitizerRegistersTracker_processConstant(&this->tracker, instr.getCPtr(), value, offset); -} -LoPairingInfo RegistersTracker::preprocessLoAndGetInfo(const InstructionBase &instr, int instrOffset) { - return RabbitizerRegistersTracker_preprocessLoAndGetInfo(&this->tracker, instr.getCPtr(), instrOffset); -} -void RegistersTracker::processLo(const InstructionBase &instr, uint32_t value, int offset) { - RabbitizerRegistersTracker_processLo(&this->tracker, instr.getCPtr(), value, offset); -} -bool RegistersTracker::hasLoButNoHi(const InstructionBase &instr) const { - return RabbitizerRegistersTracker_hasLoButNoHi(&this->tracker, instr.getCPtr()); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp deleted file mode 100644 index 03e28d01..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstrId.cpp +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstrId.hpp" - -#include "instructions/RabbitizerInstrId.h" - -using namespace rabbitizer; - -std::string InstrId::getOpcodeName(InstrId::UniqueId uniqueId) { - RabbitizerInstrId id = static_cast(uniqueId); - - return std::string(RabbitizerInstrId_getOpcodeName(id)); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp deleted file mode 100644 index 4f5ad5be..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionBase.cpp +++ /dev/null @@ -1,1036 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionBase.hpp" - -#include - -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionR5900.h" - -using namespace rabbitizer; - -RabbitizerInstruction *InstructionBase::getCPtr() { - return &this->instr; -} -const RabbitizerInstruction *InstructionBase::getCPtr() const { - return &this->instr; -} - -/* getters */ - -uint8_t InstructionBase::Get_opcode() const { - return RAB_INSTR_GET_opcode(&this->instr); -} -uint8_t InstructionBase::Get_sa() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_sa)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'sa' operand."); - } -#endif - - return RAB_INSTR_GET_sa(&this->instr); -} -uint8_t InstructionBase::Get_function() const { - /* - #ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_function)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'function' operand."); - } - #endif - */ - - return RAB_INSTR_GET_function(&this->instr); -} - -Registers::Cpu::GprO32 InstructionBase::GetO32_rs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rs(&this->instr)); -} -Registers::Cpu::GprO32 InstructionBase::GetO32_rt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rt(&this->instr)); -} -Registers::Cpu::GprO32 InstructionBase::GetO32_rd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rd(&this->instr)); -} - -Registers::Cpu::GprN32 InstructionBase::GetN32_rs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rs(&this->instr)); -} -Registers::Cpu::GprN32 InstructionBase::GetN32_rt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rt(&this->instr)); -} -Registers::Cpu::GprN32 InstructionBase::GetN32_rd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rd(&this->instr)); -} - -Registers::Cpu::Cop0 InstructionBase::Get_cop0d() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop0d)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop0d' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop0d(&this->instr)); -} - -uint32_t InstructionBase::Get_instr_index() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'label' operand."); - } -#endif - - return RAB_INSTR_GET_instr_index(&this->instr); -} -uint16_t InstructionBase::Get_immediate() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_immediate)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'immediate' operand."); - } -#endif - - return RAB_INSTR_GET_immediate(&this->instr); -} - -Registers::Cpu::Cop1O32 InstructionBase::GetO32_fs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fs(&this->instr)); -} -Registers::Cpu::Cop1O32 InstructionBase::GetO32_ft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_ft(&this->instr)); -} -Registers::Cpu::Cop1O32 InstructionBase::GetO32_fd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fd(&this->instr)); -} - -Registers::Cpu::Cop1N32 InstructionBase::GetN32_fs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fs(&this->instr)); -} -Registers::Cpu::Cop1N32 InstructionBase::GetN32_ft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_ft(&this->instr)); -} -Registers::Cpu::Cop1N32 InstructionBase::GetN32_fd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fd(&this->instr)); -} - -Registers::Cpu::Cop1N64 InstructionBase::GetN64_fs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fs(&this->instr)); -} -Registers::Cpu::Cop1N64 InstructionBase::GetN64_ft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_ft(&this->instr)); -} -Registers::Cpu::Cop1N64 InstructionBase::GetN64_fd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_fd(&this->instr)); -} - -Registers::Cpu::Cop1Control InstructionBase::Get_cop1cs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop1cs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop1cs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop1cs(&this->instr)); -} - -Registers::Cpu::Cop2 InstructionBase::Get_cop2t() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2t' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop2t(&this->instr)); -} - -uint8_t InstructionBase::Get_op() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_op)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'op' operand."); - } -#endif - - return RAB_INSTR_GET_op(&this->instr); -} - -uint32_t InstructionBase::Get_code() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code' operand."); - } -#endif - - return RAB_INSTR_GET_code(&this->instr); -} -uint32_t InstructionBase::Get_code_upper() const { -#if 0 -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_upper)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_upper' operand."); - } -#endif -#endif - - return RAB_INSTR_GET_code_upper(&this->instr); -} -uint32_t InstructionBase::Get_code_lower() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_lower)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_lower' operand."); - } -#endif - - return RAB_INSTR_GET_code_lower(&this->instr); -} - -uint32_t InstructionBase::Get_copraw() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_copraw)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'copraw' operand."); - } -#endif - - return RAB_INSTR_GET_copraw(&this->instr); -} - -uint8_t InstructionBase::Get_fmt() const { - return RAB_INSTR_GET_fmt(&this->instr); -} -uint8_t InstructionBase::Get_fc() const { - return RAB_INSTR_GET_fc(&this->instr); -} -uint8_t InstructionBase::Get_cond() const { - return RAB_INSTR_GET_cond(&this->instr); -} - -uint8_t InstructionBase::Get_tf() const { - return RAB_INSTR_GET_tf(&this->instr); -} -uint8_t InstructionBase::Get_nd() const { - return RAB_INSTR_GET_nd(&this->instr); -} -uint8_t InstructionBase::Get_bc_fmt() const { - return RAB_INSTR_GET_bc_fmt(&this->instr); -} - -uint8_t InstructionBase::Get_stype() const { - return RAB_INSTR_GET_stype(&this->instr); -} - -/* getters */ - -/* setters */ - -void InstructionBase::Set_opcode(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_opcode(this->instr.word, val); -} -void InstructionBase::Set_sa(uint8_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_sa)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'sa' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_sa(this->instr.word, val); -} -void InstructionBase::Set_function(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_function(this->instr.word, val); -} - -void InstructionBase::Set_rs(Registers::Cpu::GprO32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rt(Registers::Cpu::GprO32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rt(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rd(Registers::Cpu::GprO32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_rs(Registers::Cpu::GprN32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rt(Registers::Cpu::GprN32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rt(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_rd(Registers::Cpu::GprN32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_rd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_cop0d(Registers::Cpu::Cop0 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop0d)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop0d' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_cop0d(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_instr_index(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'label' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_instr_index(this->instr.word, val); -} -void InstructionBase::Set_immediate(uint16_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_immediate)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'immediate' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_immediate(this->instr.word, val); -} - -void InstructionBase::Set_fs(Registers::Cpu::Cop1O32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_ft(Registers::Cpu::Cop1O32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_ft(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_fd(Registers::Cpu::Cop1O32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_fs(Registers::Cpu::Cop1N32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_ft(Registers::Cpu::Cop1N32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_ft(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_fd(Registers::Cpu::Cop1N32 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_fs(Registers::Cpu::Cop1N64 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fs(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_ft(Registers::Cpu::Cop1N64 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_ft)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'ft' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_ft(this->instr.word, static_cast(val)); -} -void InstructionBase::Set_fd(Registers::Cpu::Cop1N64 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_fd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'fd' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_fd(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_cop1cs(Registers::Cpu::Cop1Control val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop1cs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop1cs' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_cop1cs(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_cop2t(Registers::Cpu::Cop2 val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2t' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_cop2t(this->instr.word, static_cast(val)); -} - -void InstructionBase::Set_op(uint8_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_op)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'op' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_op(this->instr.word, val); -} - -void InstructionBase::Set_code(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_code(this->instr.word, val); -} - -void InstructionBase::Set_code_upper(uint32_t val) { -#if 0 -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_upper)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_upper' operand."); - } -#endif -#endif - - this->instr.word = RAB_INSTR_PACK_code_upper(this->instr.word, val); -} - -void InstructionBase::Set_code_lower(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_code_lower)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'code_lower' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_code_lower(this->instr.word, val); -} - -void InstructionBase::Set_copraw(uint32_t val) { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_copraw)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'copraw' operand."); - } -#endif - - this->instr.word = RAB_INSTR_PACK_copraw(this->instr.word, val); -} - -void InstructionBase::Set_fmt(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_fmt(this->instr.word, val); -} -void InstructionBase::Set_fc(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_fc(this->instr.word, val); -} -void InstructionBase::Set_cond(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_cond(this->instr.word, val); -} - -void InstructionBase::Set_tf(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_tf(this->instr.word, val); -} -void InstructionBase::Set_nd(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_nd(this->instr.word, val); -} -void InstructionBase::Set_bc_fmt(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_bc_fmt(this->instr.word, val); -} - -void InstructionBase::Set_stype(uint8_t val) { - this->instr.word = RAB_INSTR_PACK_stype(this->instr.word, val); -} - -/* setters */ - -/* more getters */ - -uint32_t InstructionBase::getRaw() const { - return RabbitizerInstruction_getRaw(&this->instr); -} - -InstrId::UniqueId InstructionBase::getUniqueId() const { - return static_cast(this->instr.uniqueId); -} -uint32_t InstructionBase::getVram() const { - return this->instr.vram; -} -bool InstructionBase::isInHandwrittenFunction() const { - return this->instr.inHandwrittenFunction; -} - -int32_t InstructionBase::getProcessedImmediate() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_immediate)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'immediate' operand."); - } -#endif - - return RabbitizerInstruction_getProcessedImmediate(&this->instr); -} -uint32_t InstructionBase::getInstrIndexAsVram() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'label' operand."); - } -#endif - - return RabbitizerInstruction_getInstrIndexAsVram(&this->instr); -} - -int32_t InstructionBase::getBranchOffset() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_branch_target_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'branch_target_label' operand."); - } -#endif - - return RabbitizerInstruction_getBranchOffset(&this->instr); -} -int32_t InstructionBase::getGenericBranchOffset(uint32_t currentVram) const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::cpu_branch_target_label) && !hasOperandAlias(OperandType::cpu_label)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have either 'branch_target_label' or 'label' operands."); - } -#endif - - return RabbitizerInstruction_getGenericBranchOffset(&this->instr, currentVram); -} - -std::string InstructionBase::getOpcodeName() const { - return InstrId::getOpcodeName(getUniqueId()); -} - -/* more getters */ - -/* */ - -void InstructionBase::blankOut() { - RabbitizerInstruction_blankOut(&this->instr); -} - -/* Instruction examination */ - -bool InstructionBase::isImplemented() const { - return RabbitizerInstruction_isImplemented(&this->instr); -} -bool InstructionBase::isLikelyHandwritten() const { - return RabbitizerInstruction_isLikelyHandwritten(&this->instr); -} -bool InstructionBase::isNop() const { - return RabbitizerInstruction_isNop(&this->instr); -} -bool InstructionBase::isUnconditionalBranch() const { - return RabbitizerInstruction_isUnconditionalBranch(&this->instr); -} -bool InstructionBase::isJrRa() const { - return RabbitizerInstruction_isJrRa(&this->instr); -} -bool InstructionBase::isJrNotRa() const { - return RabbitizerInstruction_isJrNotRa(&this->instr); -} -bool InstructionBase::hasDelaySlot() const { - return RabbitizerInstruction_hasDelaySlot(&this->instr); -} - -std::string InstructionBase::mapInstrToType() const { - return std::string(RabbitizerInstruction_mapInstrToType(&this->instr)); -} - -bool InstructionBase::sameOpcode(const InstructionBase &other) const { - return RabbitizerInstruction_sameOpcode(&this->instr, &other.instr); -} -bool InstructionBase::sameOpcodeButDifferentArguments(const InstructionBase &other) const { - return RabbitizerInstruction_sameOpcodeButDifferentArguments(&this->instr, &other.instr); -} - -bool InstructionBase::hasOperand(OperandType operand) const { - return RabbitizerInstruction_hasOperand(&this->instr, static_cast(operand)); -} -bool InstructionBase::hasOperandAlias(OperandType operand) const { - return RabbitizerInstruction_hasOperandAlias(&this->instr, static_cast(operand)); -} - -uint32_t InstructionBase::getValidBits() const { - return RabbitizerInstruction_getValidBits(&this->instr); -} -bool InstructionBase::isValid() const { - return RabbitizerInstruction_isValid(&this->instr); -} - -/* Instruction examination */ - -/* Instruction descriptor */ - -bool InstructionBase::isUnknownType() const { - return RabbitizerInstrDescriptor_isUnknownType(this->instr.descriptor); -} -bool InstructionBase::isJType() const { - return RabbitizerInstrDescriptor_isJType(this->instr.descriptor); -} -bool InstructionBase::isIType() const { - return RabbitizerInstrDescriptor_isIType(this->instr.descriptor); -} -bool InstructionBase::isRType() const { - return RabbitizerInstrDescriptor_isRType(this->instr.descriptor); -} -bool InstructionBase::isRegimmType() const { - return RabbitizerInstrDescriptor_isRegimmType(this->instr.descriptor); -} - -// TODO -// RabbitizerInstrSuffix instrSuffix() const; - -bool InstructionBase::isBranch() const { - return RabbitizerInstrDescriptor_isBranch(this->instr.descriptor); -} -bool InstructionBase::isBranchLikely() const { - return RabbitizerInstrDescriptor_isBranchLikely(this->instr.descriptor); -} -bool InstructionBase::isJump() const { - return RabbitizerInstrDescriptor_isJump(this->instr.descriptor); -} -bool InstructionBase::isTrap() const { - return RabbitizerInstrDescriptor_isTrap(this->instr.descriptor); -} - -bool InstructionBase::isFloat() const { - return RabbitizerInstrDescriptor_isFloat(this->instr.descriptor); -} -bool InstructionBase::isDouble() const { - return RabbitizerInstrDescriptor_isDouble(this->instr.descriptor); -} - -bool InstructionBase::isUnsigned() const { - return RabbitizerInstrDescriptor_isUnsigned(this->instr.descriptor); -} - -bool InstructionBase::modifiesRt() const { - return RabbitizerInstrDescriptor_modifiesRt(this->instr.descriptor); -} -bool InstructionBase::modifiesRd() const { - return RabbitizerInstrDescriptor_modifiesRd(this->instr.descriptor); -} - -bool InstructionBase::notEmitedByCompilers() const { - return RabbitizerInstrDescriptor_notEmitedByCompilers(this->instr.descriptor); -} - -bool InstructionBase::canBeHi() const { - return RabbitizerInstrDescriptor_canBeHi(this->instr.descriptor); -} -bool InstructionBase::canBeLo() const { - return RabbitizerInstrDescriptor_canBeLo(this->instr.descriptor); -} -bool InstructionBase::doesLink() const { - return RabbitizerInstrDescriptor_doesLink(this->instr.descriptor); -} -bool InstructionBase::doesDereference() const { - return RabbitizerInstrDescriptor_doesDereference(this->instr.descriptor); -} -bool InstructionBase::doesLoad() const { - return RabbitizerInstrDescriptor_doesLoad(this->instr.descriptor); -} -bool InstructionBase::doesStore() const { - return RabbitizerInstrDescriptor_doesStore(this->instr.descriptor); -} -bool InstructionBase::maybeIsMove() const { - return RabbitizerInstrDescriptor_maybeIsMove(this->instr.descriptor); -} - -bool InstructionBase::isPseudo() const { - return RabbitizerInstrDescriptor_isPseudo(this->instr.descriptor); -} - -/* Instruction descriptor */ - -/* Disassembly */ - -bool InstructionBase::mustDisasmAsData() const { - return RabbitizerInstruction_mustDisasmAsData(&this->instr); -} - -std::string InstructionBase::disassembleOperands() const { - const char *immOverridePtr = NULL; - size_t immOverrideLength = 0; - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferOperandsDisasm(&instr, immOverrideLength); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleOperands(&instr, buffer, immOverridePtr, immOverrideLength); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} -std::string InstructionBase::disassembleOperands(std::string_view immOverride) const { - const char *immOverridePtr = immOverride.data(); - size_t immOverrideLength = immOverride.size(); - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferOperandsDisasm(&instr, immOverrideLength); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleOperands(&instr, buffer, immOverridePtr, immOverrideLength); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassembleInstruction(int extraLJust) const { - const char *immOverridePtr = NULL; - size_t immOverrideLength = 0; - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferInstrDisasm(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleInstruction(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} -std::string InstructionBase::disassembleInstruction(int extraLJust, std::string_view immOverride) const { - const char *immOverridePtr = immOverride.data(); - size_t immOverrideLength = immOverride.size(); - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferInstrDisasm(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleInstruction(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassembleAsData(int extraLJust) const { - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBufferDataDisasm(&instr, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassembleAsData(&instr, buffer, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassemble(int extraLJust) const { - const char *immOverridePtr = NULL; - size_t immOverrideLength = 0; - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassemble(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} - -std::string InstructionBase::disassemble(int extraLJust, std::string_view immOverride) const { - const char *immOverridePtr = immOverride.data(); - size_t immOverrideLength = immOverride.size(); - size_t bufferSize; - size_t disassmbledSize; - char *buffer; - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&instr, immOverrideLength, extraLJust); - - buffer = (char *)malloc(bufferSize + 1); - if (buffer == NULL) { - throw std::runtime_error("buffer == NULL"); - } - - disassmbledSize = RabbitizerInstruction_disassemble(&instr, buffer, immOverridePtr, immOverrideLength, extraLJust); - - std::string output(buffer); - free(buffer); - - if (disassmbledSize > bufferSize) { - throw std::runtime_error("disassmbledSize > bufferSize"); - } - - return output; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp deleted file mode 100644 index 9488b9a3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionCpu.cpp +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionCpu.hpp" - -using namespace rabbitizer; - -InstructionCpu::InstructionCpu(uint32_t word, uint32_t vram) : InstructionBase() { - RabbitizerInstruction_init(&this->instr, word, vram); - RabbitizerInstruction_processUniqueId(&this->instr); -} - -InstructionCpu::~InstructionCpu() { - RabbitizerInstruction_destroy(&this->instr); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp deleted file mode 100644 index 0fe00630..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionR5900.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionR5900.hpp" - -#include - -#include "instructions/RabbitizerInstructionR5900.h" - -using namespace rabbitizer; - -InstructionR5900::InstructionR5900(uint32_t word, uint32_t vram) : InstructionBase() { - RabbitizerInstructionR5900_init(&this->instr, word, vram); - RabbitizerInstructionR5900_processUniqueId(&this->instr); -} - -InstructionR5900::~InstructionR5900() { - RabbitizerInstructionR5900_destroy(&this->instr); -} - -Registers::R5900::VF InstructionR5900::GetR5900_vfs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vfs' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vfs(&this->instr)); -} - -Registers::R5900::VF InstructionR5900::GetR5900_vft() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vft' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vft(&this->instr)); -} - -Registers::R5900::VF InstructionR5900::GetR5900_vfd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vfd' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vfd(&this->instr)); -} - -Registers::R5900::VI InstructionR5900::GetR5900_vis() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vis' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vis(&this->instr)); -} - -Registers::R5900::VI InstructionR5900::GetR5900_vit() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vit' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vit(&this->instr)); -} - -Registers::R5900::VI InstructionR5900::GetR5900_vid() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vid' operand."); - } -#endif - - return static_cast(RAB_INSTR_R5900_GET_vid(&this->instr)); -} - -uint8_t InstructionR5900::GetR5900_mmi_function() const { - return RAB_INSTR_R5900_GET_mmi_function(&this->instr); -} -uint8_t InstructionR5900::GetR5900_fhi_flo() const { - return RAB_INSTR_R5900_GET_fhi_flo(&this->instr); -} - -uint8_t InstructionR5900::GetR5900_xyzw_x() const { - return RAB_INSTR_R5900_GET_xyzw_x(&this->instr); -} -uint8_t InstructionR5900::GetR5900_xyzw_y() const { - return RAB_INSTR_R5900_GET_xyzw_y(&this->instr); -} -uint8_t InstructionR5900::GetR5900_xyzw_z() const { - return RAB_INSTR_R5900_GET_xyzw_z(&this->instr); -} -uint8_t InstructionR5900::GetR5900_xyzw_w() const { - return RAB_INSTR_R5900_GET_xyzw_w(&this->instr); -} -uint8_t InstructionR5900::GetR5900_n() const { - return RAB_INSTR_R5900_GET_n(&this->instr); -} -uint8_t InstructionR5900::GetR5900_l() const { - return RAB_INSTR_R5900_GET_l(&this->instr); -} -uint8_t InstructionR5900::GetR5900_m() const { - return RAB_INSTR_R5900_GET_m(&this->instr); -} - -uint8_t InstructionR5900::GetR5900_imm5() const { - return RAB_INSTR_R5900_GET_imm5(&this->instr); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp b/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp deleted file mode 100644 index 891a0351..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/cplusplus/src/instructions/InstructionRsp.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionRsp.hpp" - -#include - -#include "instructions/RabbitizerInstructionRsp.h" - -using namespace rabbitizer; - -InstructionRsp::InstructionRsp(uint32_t word, uint32_t vram) : InstructionBase() { - RabbitizerInstructionRsp_init(&this->instr, word, vram); - RabbitizerInstructionRsp_processUniqueId(&this->instr); -} - -InstructionRsp::~InstructionRsp() { - RabbitizerInstructionRsp_destroy(&this->instr); -} - -Registers::Rsp::Gpr InstructionRsp::GetRsp_rs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rs' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rs(&this->instr)); -} -Registers::Rsp::Gpr InstructionRsp::GetRsp_rt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rt' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rt(&this->instr)); -} -Registers::Rsp::Gpr InstructionRsp::GetRsp_rd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_rd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'rd' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_rd(&this->instr)); -} - -Registers::Rsp::Cop0 InstructionRsp::GetRsp_cop0d() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_cop0d)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop0d' operand."); - } -#endif - - return static_cast(RAB_INSTR_GET_cop0d(&this->instr)); -} - -Registers::Rsp::Cop2 InstructionRsp::GetRsp_cop2t() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2t' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_cop2t(&this->instr)); -} - -Registers::Rsp::Cop2Control InstructionRsp::GetRsp_cop2cd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_cop2t)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'cop2cd' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_cop2cd(&this->instr)); -} - -Registers::Rsp::Vector InstructionRsp::GetRsp_vs() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_vs)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vs' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_vs(&this->instr)); -} -Registers::Rsp::Vector InstructionRsp::GetRsp_vt() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_vt)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vt' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_vt(&this->instr)); -} -Registers::Rsp::Vector InstructionRsp::GetRsp_vd() const { -#ifdef RAB_SANITY_CHECKS - if (!hasOperandAlias(OperandType::rsp_vd)) { - // TODO: make a rabbitizer exception class - throw std::runtime_error("Instruction '" + getOpcodeName() + "' does not have 'vd' operand."); - } -#endif - - return static_cast(RAB_INSTR_RSP_GET_vd(&this->instr)); -} - -uint8_t InstructionRsp::GetRsp_elementhigh() const { - return RAB_INSTR_RSP_GET_elementhigh(&this->instr); -} -uint8_t InstructionRsp::GetRsp_elementlow() const { - return RAB_INSTR_RSP_GET_elementlow(&this->instr); -} - -uint8_t InstructionRsp::GetRsp_index() const { - return RAB_INSTR_RSP_GET_index(&this->instr); -} -uint8_t InstructionRsp::GetRsp_de() const { - return RAB_INSTR_RSP_GET_de(&this->instr); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h b/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h deleted file mode 100644 index b6a70ed2..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerLoPairingInfo.h +++ /dev/null @@ -1,34 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_LO_PAIRING_INFO_H -#define RABBITIZER_LO_PAIRING_INFO_H -#pragma once - -#include - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct RabbitizerLoPairingInfo { - int instrOffset; - int64_t value; // could be either an unsigned 32 bits number or a signed one, so use 64 bits to ensure it fits - bool shouldProcess; - bool isGpRel; - bool isGpGot; -} RabbitizerLoPairingInfo; - - -NON_NULL(1) -void RabbitizerLoPairingInfo_Init(RabbitizerLoPairingInfo *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h b/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h deleted file mode 100644 index 36ccbd56..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerRegistersTracker.h +++ /dev/null @@ -1,65 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTERS_TRACKER_H -#define RABBITIZER_REGISTERS_TRACKER_H -#pragma once - -#include "common/Utils.h" -#include "RabbitizerTrackedRegisterState.h" -#include "RabbitizerLoPairingInfo.h" -#include "instructions/RabbitizerInstruction.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define RAB_REGISTERS_COUNT 32 - - -typedef struct RabbitizerRegistersTracker { - RabbitizerTrackedRegisterState registers[RAB_REGISTERS_COUNT]; -} RabbitizerRegistersTracker; - -// TODO: Change functions which use parameters as a way to return values into actual structs returned by the functions - -NON_NULL(1) -void RabbitizerRegistersTracker_init(RabbitizerRegistersTracker *self, const RabbitizerRegistersTracker *other); -NON_NULL(1) -void RabbitizerRegistersTracker_destroy(RabbitizerRegistersTracker *self); - -NON_NULL(1, 2) -bool RabbitizerRegistersTracker_moveRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_overwriteRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset); -NON_NULL(1, 2, 3) -void RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, const RabbitizerInstruction *prevInstr); -NON_NULL(1, 2, 4) -bool RabbitizerRegistersTracker_getAddressIfCanSetType(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, uint32_t *dstAddress); -NON_NULL(1, 2, 3, 4) -bool RabbitizerRegistersTracker_getJrInfo(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset, uint32_t *dstAddress); - -// prevInstr can be NULL -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processLui(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, const RabbitizerInstruction *prevInstr); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processGpLoad(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset); -NON_NULL(1, 2, 3) -bool RabbitizerRegistersTracker_getLuiOffsetForConstant(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processConstant(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset); -NON_NULL(1, 2, 4, 5) // deprecated -bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstOffset, bool *dstIsGp); -NODISCARD NON_NULL(1, 2) -RabbitizerLoPairingInfo RabbitizerRegistersTracker_preprocessLoAndGetInfo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset); -NON_NULL(1, 2) -void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset); -NON_NULL(1, 2) -bool RabbitizerRegistersTracker_hasLoButNoHi(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h b/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h deleted file mode 100644 index daf4b2da..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/analysis/RabbitizerTrackedRegisterState.h +++ /dev/null @@ -1,80 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_TRACKED_REGISTER_STATE_H -#define RABBITIZER_TRACKED_REGISTER_STATE_H -#pragma once - -#include -#include -#include - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef struct RabbitizerTrackedRegisterState { - int registerNum; - - bool hasLuiValue; - int luiOffset; // The offset of last lui which set a value to this register - bool luiSetOnBranchLikely; - - bool hasGpGot; - int gpGotOffset; - - bool hasLoValue; - int loOffset; - bool dereferenced; - int dereferenceOffset; - - uint32_t value; -} RabbitizerTrackedRegisterState; - - -NON_NULL(1) -void RabbitizerTrackedRegisterState_init(RabbitizerTrackedRegisterState *self, int registerNum); -NON_NULL(1) -void RabbitizerTrackedRegisterState_destroy(RabbitizerTrackedRegisterState *self); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_clear(RabbitizerTrackedRegisterState *self); -NON_NULL(1) -void RabbitizerTrackedRegisterState_clearHi(RabbitizerTrackedRegisterState *self); -NON_NULL(1) -void RabbitizerTrackedRegisterState_clearGp(RabbitizerTrackedRegisterState *self); -NON_NULL(1) -void RabbitizerTrackedRegisterState_clearLo(RabbitizerTrackedRegisterState *self); - -NON_NULL(1, 2) -void RabbitizerTrackedRegisterState_copyState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_setHi(RabbitizerTrackedRegisterState *self, uint32_t value, int offset); -NON_NULL(1) -void RabbitizerTrackedRegisterState_setGpLoad(RabbitizerTrackedRegisterState *self, uint32_t value, int offset); -NON_NULL(1) -void RabbitizerTrackedRegisterState_setLo(RabbitizerTrackedRegisterState *self, uint32_t value, int offset); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_deref(RabbitizerTrackedRegisterState *self, int offset); -NON_NULL(1, 2) -void RabbitizerTrackedRegisterState_dereferenceState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other, int offset); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerTrackedRegisterState_hasAnyValue(const RabbitizerTrackedRegisterState *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerTrackedRegisterState_wasSetInCurrentOffset(const RabbitizerTrackedRegisterState *self, int offset); - -NON_NULL(1) -void RabbitizerTrackedRegisterState_fprint(const RabbitizerTrackedRegisterState *self, FILE* outFile); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc b/tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc deleted file mode 100644 index fa01d92f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/Abi.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_ABI(NUMERIC), -RABBITIZER_DEF_ABI(O32), -RABBITIZER_DEF_ABI(N32), -RABBITIZER_DEF_ABI(N64), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h b/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h deleted file mode 100644 index 8b9def78..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerConfig.h +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_CONFIG_H -#define RABBITIZER_CONFIG_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_ABI(name) RABBITIZER_ABI_##name - -typedef enum RabbitizerAbi { - #include "Abi.inc" - - RABBITIZER_DEF_ABI(MAX), -} RabbitizerAbi; - -#undef RABBITIZER_DEF_ABI - -RabbitizerAbi RabbitizerAbi_fromStr(const char *name); - - -typedef struct RabbitizerConfig_RegisterNames { - bool namedRegisters; // Enables using named registers. This option takes precedence over the other named register options - RabbitizerAbi gprAbiNames; // The ABI names to be used for general purpose registers when disassembling the main processor's instructions - RabbitizerAbi fprAbiNames; // The ABI names to be used for floating point registers when disassembling the floating point (coprocessor 1) instructions - bool userFpcCsr; // Use FpcCsr as register $31 for the FP control/status register - bool vr4300Cop0NamedRegisters; // Use named registers for VR4300's coprocessor 0 registers - bool vr4300RspCop0NamedRegisters; // Use named registers for VR4300's RSP's coprocessor 0 registers -} RabbitizerConfig_RegisterNames; - -typedef struct RabbitizerConfig_PseudoInstr { - bool enablePseudos; // Produce pseudo instructions (like `move` or `b`) whenever those may match the desired original instruction - bool pseudoBeqz; - bool pseudoBnez; - bool pseudoB; - bool pseudoMove; - bool pseudoNot; - bool pseudoNegu; - bool pseudoBal; -} RabbitizerConfig_PseudoInstr; - -typedef struct RabbitizerConfig_ToolchainTweaks { - bool treatJAsUnconditionalBranch; //! @deprecated - /** - * Enables a few fixes for SN64's assembler related to div/divu instructions - * - * - SN64's assembler doesn't like assembling `div $0, a, b` with .set noat active. - * Removing the $0 fixes this issue (but not for handwritten asm) - * - * - SN64's assembler expands div to have break if dividing by zero - * However, the break it generates is different than the one it generates with `break N` - * So we replace break instrutions for SN64 with the exact word that the assembler generates when expanding div - */ - bool sn64DivFix; -} RabbitizerConfig_ToolchainTweaks; - -typedef struct RabbitizerConfig_Misc { - int opcodeLJust; // The minimal number of characters to left-align the opcode name - bool unknownInstrComment; // Generate a pseudo-disassembly comment when disassembling non implemented instructions - bool omit0XOnSmallImm; - bool upperCaseImm; -} RabbitizerConfig_Misc; - -typedef struct RabbitizerConfig { - RabbitizerConfig_RegisterNames regNames; - RabbitizerConfig_PseudoInstr pseudos; - RabbitizerConfig_ToolchainTweaks toolchainTweaks; - RabbitizerConfig_Misc misc; -} RabbitizerConfig; - -extern RabbitizerConfig RabbitizerConfig_Cfg; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h b/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h deleted file mode 100644 index d59e716f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/RabbitizerVersion.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_VERSION_H -#define RABBITIZER_VERSION_H - -#include "Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -// Header version -#define RAB_VERSION_MAJOR 1 -#define RAB_VERSION_MINOR 2 -#define RAB_VERSION_PATCH 3 - -#define RAB_VERSION_STR RAB_STRINGIFY(RAB_VERSION_MAJOR) "." RAB_STRINGIFY(RAB_VERSION_MINOR) "." RAB_STRINGIFY(RAB_VERSION_PATCH) - -// Compiled library version -extern const int RabVersion_Major; -extern const int RabVersion_Minor; -extern const int RabVersion_Patch; - -extern const char RabVersion_Str[]; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h b/tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h deleted file mode 100644 index 6255a04a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/common/Utils.h +++ /dev/null @@ -1,116 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_UTILS_H -#define RABBITIZER_UTILS_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#if !defined(__GNUC__) && !defined(__clang__) -#define __attribute__(x) -#endif - -#if __STDC_VERSION__ >= 202000L -#define CONST [[gnu::const]] -#define DEPRECATED(reason) [[deprecated (reason)]] -#define FALLTHROUGH [[fallthrough]] -#define NODISCARD [[nodiscard]] -#define NORETURN [[noreturn]] -#define NON_NULL(...) [[gnu::nonnull (__VA_ARGS__)]] -#define PURE [[gnu::pure]] -#define RETURNS_NON_NULL [[gnu::returns_nonnull]] -#define UNUSED [[maybe_unused]] -#else -#define CONST __attribute__((const)) -#define DEPRECATED(reason) __attribute__((deprecated (reason))) -#define FALLTHROUGH __attribute__((fallthrough)) -#define NODISCARD __attribute__((warn_unused_result)) -#define NORETURN _Noreturn -#define NON_NULL(...) __attribute__((nonnull (__VA_ARGS__))) -#define PURE __attribute__((pure)) -#define RETURNS_NON_NULL __attribute__((returns_nonnull)) -#define UNUSED __attribute__((unused)) -#endif - - -#if defined(_MSC_VER) -# define UNREACHABLE __assume(0) -#elif defined(__GNUC__) || defined(__clang__) -# define UNREACHABLE __builtin_unreachable() -#else -# define UNREACHABLE -#endif - - -#define ARRAY_COUNT(arr) (sizeof(arr) / sizeof((arr)[0])) - -#define RAB_STRINGIFY(x) #x - -#define MASK(v, w) ((v) & ((1 << (w)) - 1)) - -/* - * the SHIFT macros take a value, a shift amount, and a width. - * - * For the left shift, the lower bits of the value are masked, - * then shifted left. - * - * For the right shift, the value is shifted right, then the lower bits - * are masked. - * - * (NOTE: SHIFTL(v, 0, 32) won't work, just use an assignment) - * - */ -#define SHIFTL(v, s, w) (MASK((v), (w)) << (s)) -#define SHIFTR(v, s, w) (MASK((v) >> (s), (w))) - -#define BITREPACK(fullword, v, s, w) ((SHIFTR((fullword), (s)+(w), 32-((s)+(w))) << ((s)+(w))) | SHIFTL((v), (s), (w)) | MASK((fullword), (s))) -#define BITREPACK_RIGHT(fullword, v, s, w) (SHIFTL((v), (s), (w)) | MASK((fullword), (s))) - - -#define RABUTILS_BUFFER_ADVANCE(buffer, totalSize, expression) \ - do { \ - size_t __tempSize = expression; \ - (buffer) += __tempSize; \ - (totalSize) += __tempSize; \ - } while (0) - -#define RABUTILS_BUFFER_WRITE_CHAR(buffer, totalSize, character) \ - do { \ - *(buffer) = (character); \ - RABUTILS_BUFFER_ADVANCE(buffer, totalSize, 1); \ - } while (0) - -#define RABUTILS_BUFFER_SPRINTF(buffer, totalSize, format, ...) \ - do { \ - int _len = sprintf(buffer, format, __VA_ARGS__); \ - assert(_len > 0); \ - RABUTILS_BUFFER_ADVANCE(buffer, totalSize, _len); \ - } while (0) - -#define RABUTILS_BUFFER_CPY(buffer, totalSize, string) \ - do { \ - size_t _tempSize = strlen(string); \ - memcpy(buffer, string, _tempSize); \ - RABUTILS_BUFFER_ADVANCE(buffer, totalSize, _tempSize); \ - } while (0) - - -CONST NODISCARD -int32_t RabbitizerUtils_From2Complement(uint32_t number, int bits); -NON_NULL(1) -size_t RabbitizerUtils_CharFill(char *dst, int count, char fillchar); -NON_NULL(1, 3) -size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, size_t srcSize); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc deleted file mode 100644 index 9a6d85c1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/InstrCategory.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_INSTR_CATEGORY(CPU), -RABBITIZER_DEF_INSTR_CATEGORY(RSP), // N64 -RABBITIZER_DEF_INSTR_CATEGORY(R5900), // PS2's Emotion Engine diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h deleted file mode 100644 index e92f7971..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrDescriptor.h +++ /dev/null @@ -1,141 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRDESCRIPTOR_H -#define RABBITIZER_INSTRDESCRIPTOR_H -#pragma once - -#include - -#include "common/Utils.h" -#include "RabbitizerOperandType.h" -#include "RabbitizerInstrId.h" -#include "RabbitizerInstrSuffix.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef enum RabbitizerInstrType { - RABBITIZER_INSTR_TYPE_UNKNOWN, - RABBITIZER_INSTR_TYPE_J, - RABBITIZER_INSTR_TYPE_I, - RABBITIZER_INSTR_TYPE_R, - RABBITIZER_INSTR_TYPE_REGIMM, - RABBITIZER_INSTR_TYPE_MAX, -} RabbitizerInstrType; - -typedef enum RabbitizerArchitectureVersion { - RABBITIZER_ARCHVERSION_INVALID=-1, - RABBITIZER_ARCHVERSION_UNKNOWN, - RABBITIZER_ARCHVERSION_MIPS_I, - RABBITIZER_ARCHVERSION_MIPS_II, - RABBITIZER_ARCHVERSION_MIPS_III, - RABBITIZER_ARCHVERSION_MIPS_IV -} RabbitizerArchitectureVersion; - -typedef struct RabbitizerInstrDescriptor { - RabbitizerOperandType operands[4]; - RabbitizerInstrType instrType; - - RabbitizerInstrSuffix instrSuffix; - - bool isBranch; - bool isBranchLikely; - bool isJump; - bool isTrap; - - bool isFloat; - bool isDouble; - - bool isUnsigned; - - bool modifiesRt; - bool modifiesRd; - - bool notEmitedByCompilers; - - bool canBeHi; - bool canBeLo; - bool doesLink; // "and link" family of instructions - bool doesDereference; - bool doesLoad; // loads data from memory - bool doesStore; // stores data to memory - bool maybeIsMove; - - bool isPseudo; - - RabbitizerArchitectureVersion architectureVersion; // TODO: consider removing -} RabbitizerInstrDescriptor; - -// TODO: less redundant name -extern const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[]; - - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isUnknownType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isJType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isIType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isRType(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isRegimmType(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -RabbitizerInstrSuffix RabbitizerInstrDescriptor_instrSuffix(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isBranch(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isBranchLikely(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isJump(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isTrap(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isFloat(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isDouble(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isUnsigned(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_modifiesRt(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_modifiesRd(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_notEmitedByCompilers(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_canBeHi(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_canBeLo(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesLink(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesDereference(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesLoad(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_doesStore(const RabbitizerInstrDescriptor *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_maybeIsMove(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstrDescriptor_isPseudo(const RabbitizerInstrDescriptor *self); - -NODISCARD NON_NULL(1) PURE -RabbitizerArchitectureVersion RabbitizerInstrDescriptor_getArchitectureVersion(const RabbitizerInstrDescriptor *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h deleted file mode 100644 index c3838211..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrId.h +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRID_H -#define RABBITIZER_INSTRID_H -#pragma once - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - RABBITIZER_INSTR_ID_##prefix##_##name, - -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) \ - RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -typedef enum RabbitizerInstrId { - #include "instructions/instr_id/RabbitizerInstrId_cpu.inc" - - #include "instructions/instr_id/RabbitizerInstrId_rsp.inc" - - #include "instructions/instr_id/RabbitizerInstrId_r5900.inc" - - RABBITIZER_INSTR_ID_ALL_MAX = RABBITIZER_DEF_INSTR_ID(r5900, , MAX, ) -} RabbitizerInstrId; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - - -extern const char *RabbitizerInstrId_Names[]; - - -CONST NODISCARD RETURNS_NON_NULL -const char *RabbitizerInstrId_getOpcodeName(RabbitizerInstrId uniqueId); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h deleted file mode 100644 index 7c59e334..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstrSuffix.h +++ /dev/null @@ -1,36 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRSUFFIX_H -#define RABBITIZER_INSTRSUFFIX_H -#pragma once - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -struct RabbitizerInstruction; - -typedef enum RabbitizerInstrSuffix { - RABINSTRSUFFIX_NONE, - - RABINSTRSUFFIX_R5900_xyzw, - - RABINSTRSUFFIX_MAX -} RabbitizerInstrSuffix; - -CONST NODISCARD NON_NULL(1) -size_t RabbitizerInstrSuffix_getSizeForBuffer(const struct RabbitizerInstruction *self, RabbitizerInstrSuffix instrSuffix); - -CONST NODISCARD NON_NULL(1, 2) -size_t RabbitizerInstrSuffix_processSuffix(const struct RabbitizerInstruction *self, char *dst, RabbitizerInstrSuffix instrSuffix); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h deleted file mode 100644 index 17e3bab9..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstruction.h +++ /dev/null @@ -1,263 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_H -#define RABBITIZER_INSTRUCTION_H -#pragma once - -#include -#include -#include - -#include "common/Utils.h" - -#include "RabbitizerInstrId.h" -#include "RabbitizerInstrDescriptor.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_INSTR_CATEGORY(name) RABBITIZER_INSTRCAT_##name - -typedef enum RabbitizerInstrCategory { - #include "instructions/InstrCategory.inc" - - RABBITIZER_DEF_INSTR_CATEGORY(MAX), -} RabbitizerInstrCategory; - -#undef RABBITIZER_DEF_INSTR_CATEGORY - - -typedef struct RabbitizerInstruction { - uint32_t word; - uint32_t _mandatorybits; - - RabbitizerInstrId uniqueId; - const RabbitizerInstrDescriptor *descriptor; - - uint32_t vram; - bool _handwrittenCategory; - bool inHandwrittenFunction; - RabbitizerInstrCategory category; -} RabbitizerInstruction; - - -#define RAB_INSTR_GET_opcode(self) (SHIFTR((self)->word, 26, 6)) -#define RAB_INSTR_GET_rs(self) (SHIFTR((self)->word, 21, 5)) -#define RAB_INSTR_GET_rt(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_GET_rd(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_GET_sa(self) (SHIFTR((self)->word, 6, 5)) -#define RAB_INSTR_GET_function(self) (SHIFTR((self)->word, 0, 6)) - -#define RAB_INSTR_GET_cop0d(self) (SHIFTR((self)->word, 11, 5)) - -#define RAB_INSTR_GET_instr_index(self) (SHIFTR((self)->word, 0, 26)) -#define RAB_INSTR_GET_immediate(self) (SHIFTR((self)->word, 0, 16)) - -#define RAB_INSTR_GET_fs(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_GET_ft(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_GET_fd(self) (SHIFTR((self)->word, 6, 5)) -#define RAB_INSTR_GET_cop1cs(self) (SHIFTR((self)->word, 11, 5)) - -#define RAB_INSTR_GET_op(self) (SHIFTR((self)->word, 16, 5)) - -#define RAB_INSTR_GET_code(self) (SHIFTR((self)->word, 6, 20)) -#define RAB_INSTR_GET_code_upper(self) (SHIFTR((self)->word, 16, 10)) -#define RAB_INSTR_GET_code_lower(self) (SHIFTR((self)->word, 6, 10)) - -#define RAB_INSTR_GET_copraw(self) (SHIFTR((self)->word, 0, 25)) - -#define RAB_INSTR_GET_fmt(self) (SHIFTR((self)->word, 21, 5)) -#define RAB_INSTR_GET_fc(self) (SHIFTR((self)->word, 4, 2)) -#define RAB_INSTR_GET_cond(self) (SHIFTR((self)->word, 0, 4)) - -#define RAB_INSTR_GET_cop2t(self) (SHIFTR((self)->word, 16, 5)) - -#define RAB_INSTR_GET_tf(self) (SHIFTR((self)->word, 16, 1)) -#define RAB_INSTR_GET_nd(self) (SHIFTR((self)->word, 17, 1)) -#define RAB_INSTR_GET_bc_fmt(self) (SHIFTR((self)->word, 16, 5)) - -#define RAB_INSTR_GET_stype(self) (SHIFTR((self)->word, 6, 5)) - - -#define RAB_INSTR_PACK_opcode(word, value) (BITREPACK_RIGHT((word), (value), 26, 6)) -#define RAB_INSTR_PACK_rs(word, value) (BITREPACK((word), (value), 21, 5)) -#define RAB_INSTR_PACK_rt(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_PACK_rd(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_PACK_sa(word, value) (BITREPACK((word), (value), 6, 5)) -#define RAB_INSTR_PACK_function(word, value) (BITREPACK((word), (value), 0, 6)) - -#define RAB_INSTR_PACK_cop0d(word, value) (BITREPACK((word), (value), 11, 5)) - -#define RAB_INSTR_PACK_instr_index(word, value) (BITREPACK((word), (value), 0, 26)) -#define RAB_INSTR_PACK_immediate(word, value) (BITREPACK((word), (value), 0, 16)) - -#define RAB_INSTR_PACK_code(word, value) (BITREPACK((word), (value), 6, 20)) -#define RAB_INSTR_PACK_code_upper(word, value) (BITREPACK((word), (value), 16, 10)) -#define RAB_INSTR_PACK_code_lower(word, value) (BITREPACK((word), (value), 6, 10)) - -#define RAB_INSTR_PACK_copraw(word, value) (BITREPACK((word), (value), 0, 25)) - -#define RAB_INSTR_PACK_fmt(word, value) (BITREPACK((word), (value), 21, 5)) -#define RAB_INSTR_PACK_fc(word, value) (BITREPACK((word), (value), 4, 2)) -#define RAB_INSTR_PACK_cond(word, value) (BITREPACK((word), (value), 0, 4)) - -#define RAB_INSTR_PACK_fs(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_PACK_ft(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_PACK_fd(word, value) (BITREPACK((word), (value), 6, 5)) -#define RAB_INSTR_PACK_cop1cs(word, value) (BITREPACK((word), (value), 11, 5)) - -#define RAB_INSTR_PACK_op(word, value) (BITREPACK((word), (value), 16, 5)) - -#define RAB_INSTR_PACK_cop2t(word, value) (BITREPACK((word), (value), 16, 5)) - -#define RAB_INSTR_PACK_tf(word, value) (BITREPACK((word), (value), 16, 1)) -#define RAB_INSTR_PACK_nd(word, value) (BITREPACK((word), (value), 17, 1)) -#define RAB_INSTR_PACK_bc_fmt(word, value) (BITREPACK((word), (value), 16, 5)) - -#define RAB_INSTR_PACK_stype(word, value) (BITREPACK((word), (value), 6, 5)) - - -NON_NULL(1) -void RabbitizerInstruction_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram); -NON_NULL(1) -void RabbitizerInstruction_destroy(RabbitizerInstruction* self); - - -/* Process uniqueId */ - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Normal(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstruction_processUniqueId_Coprocessor2(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstruction_processUniqueId(RabbitizerInstruction *self); - -/* Process uniqueId */ - - -/* General getters */ - -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getRaw(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getImmediate(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -int32_t RabbitizerInstruction_getProcessedImmediate(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getInstrIndex(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getInstrIndexAsVram(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -int32_t RabbitizerInstruction_getBranchOffset(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -int32_t RabbitizerInstruction_getGenericBranchOffset(const RabbitizerInstruction *self, uint32_t currentVram); - -/* General getters */ - -NON_NULL(1) -void RabbitizerInstruction_blankOut(RabbitizerInstruction *self); - - -/* Instruction examination */ - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isImplemented(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isLikelyHandwritten(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isNop(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isUnconditionalBranch(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isJrRa(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isJrNotRa(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_hasDelaySlot(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -const char *RabbitizerInstruction_mapInstrToType(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1, 2) PURE -bool RabbitizerInstruction_sameOpcode(const RabbitizerInstruction *self, const RabbitizerInstruction *other); -NODISCARD NON_NULL(1, 2) PURE -bool RabbitizerInstruction_sameOpcodeButDifferentArguments(const RabbitizerInstruction *self, const RabbitizerInstruction *other); - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, RabbitizerOperandType operand); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand); - -NODISCARD NON_NULL(1) PURE -uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self); -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self); - -/* Instruction examination */ - - -/* Disassembly */ - -NODISCARD NON_NULL(1) PURE -bool RabbitizerInstruction_mustDisasmAsData(const RabbitizerInstruction *self); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBufferOperandsDisasm(const RabbitizerInstruction *self, size_t immOverrideLength); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassembleOperands(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBufferInstrDisasm(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassembleInstruction(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, int extraLJust); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBufferDataDisasm(const RabbitizerInstruction *self, int extraLJust); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassembleAsData(const RabbitizerInstruction *self, char *dst, int extraLJust); - -NODISCARD NON_NULL(1) PURE -size_t RabbitizerInstruction_getSizeForBuffer(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust); -NON_NULL(1, 2) -size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, int extraLJust); - -/* Disassembly */ - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h deleted file mode 100644 index af5e809e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionR5900.h +++ /dev/null @@ -1,87 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_R5900_H -#define RABBITIZER_INSTRUCTION_R5900_H -#pragma once - -#include "RabbitizerInstruction.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RAB_INSTR_R5900_GET_mmi_function(self) (SHIFTR((self)->word, 6, 5)) -#define RAB_INSTR_R5900_GET_fhi_flo(self) ((SHIFTR((self)->word, 6, 5) << 2) | SHIFTR((self)->word, 0, 2)) - -#define RAB_INSTR_R5900_GET_vfs(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_R5900_GET_vft(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_R5900_GET_vfd(self) (SHIFTR((self)->word, 6, 5)) - -#define RAB_INSTR_R5900_GET_xyzw_x(self) (SHIFTR((self)->word, 24, 1)) -#define RAB_INSTR_R5900_GET_xyzw_y(self) (SHIFTR((self)->word, 23, 1)) -#define RAB_INSTR_R5900_GET_xyzw_z(self) (SHIFTR((self)->word, 22, 1)) -#define RAB_INSTR_R5900_GET_xyzw_w(self) (SHIFTR((self)->word, 21, 1)) -#define RAB_INSTR_R5900_GET_n(self) (SHIFTR((self)->word, 0, 2)) -#define RAB_INSTR_R5900_GET_l(self) (SHIFTR((self)->word, 21, 2)) -#define RAB_INSTR_R5900_GET_m(self) (SHIFTR((self)->word, 23, 2)) - -#define RAB_INSTR_R5900_GET_vis(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_R5900_GET_vit(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_R5900_GET_vid(self) (SHIFTR((self)->word, 6, 5)) - -#define RAB_INSTR_R5900_GET_imm5(self) (SHIFTR((self)->word, 6, 5)) - - -#define RAB_INSTR_R5900_PACK_mmi_function(word, value) (BITREPACK((word), (value), 6, 5)) -#define RAB_INSTR_R5900_PACK_fhi_flo(word, value) (BITREPACK(BITREPACK((word), (value) >> 2, 6, 5), (value), 0, 2)) - -#define RAB_INSTR_R5900_PACK_vfs(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_R5900_PACK_vft(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_R5900_PACK_vfd(word, value) (BITREPACK((word), (value), 6, 5)) - -#define RAB_INSTR_R5900_PACK_xyzw_x(word, value) (BITREPACK((word), (value), 24, 1)) -#define RAB_INSTR_R5900_PACK_xyzw_y(word, value) (BITREPACK((word), (value), 23, 1)) -#define RAB_INSTR_R5900_PACK_xyzw_z(word, value) (BITREPACK((word), (value), 22, 1)) -#define RAB_INSTR_R5900_PACK_xyzw_w(word, value) (BITREPACK((word), (value), 21, 1)) -#define RAB_INSTR_R5900_PACK_n(word, value) (BITREPACK((word), (value), 0, 2)) -#define RAB_INSTR_R5900_PACK_l(word, value) (BITREPACK((word), (value), 21, 2)) -#define RAB_INSTR_R5900_PACK_m(word, value) (BITREPACK((word), (value), 23, 2)) - -#define RAB_INSTR_R5900_PACK_vis(word, value) (BITREPACK((word), (value), 11, 5)) -#define RAB_INSTR_R5900_PACK_vit(word, value) (BITREPACK((word), (value), 16, 5)) -#define RAB_INSTR_R5900_PACK_vid(word, value) (BITREPACK((word), (value), 6, 5)) - -#define RAB_INSTR_R5900_PACK_imm5(word, value) (BITREPACK((word), (value), 6, 5)) - - -NON_NULL(1) -void RabbitizerInstructionR5900_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram); -NON_NULL(1) -void RabbitizerInstructionR5900_destroy(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Normal(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Special(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Regimm(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Coprocessor0(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Coprocessor1(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h deleted file mode 100644 index b2fb40d5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerInstructionRsp.h +++ /dev/null @@ -1,70 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_INSTRUCTION_RSP_H -#define RABBITIZER_INSTRUCTION_RSP_H -#pragma once - -#include "RabbitizerInstruction.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RAB_INSTR_RSP_GET_cop2t(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_RSP_GET_cop2cd(self) (SHIFTR((self)->word, 11, 5)) - -#define RAB_INSTR_RSP_GET_vs(self) (SHIFTR((self)->word, 11, 5)) -#define RAB_INSTR_RSP_GET_vt(self) (SHIFTR((self)->word, 16, 5)) -#define RAB_INSTR_RSP_GET_vd(self) (SHIFTR((self)->word, 6, 5)) - -#define RAB_INSTR_RSP_GET_elementhigh(self) (SHIFTR((self)->word, 21, 4)) -#define RAB_INSTR_RSP_GET_elementlow(self) (SHIFTR((self)->word, 7, 4)) -#define RAB_INSTR_RSP_GET_OFFSET_VECTOR_RAW(self) (SHIFTR((self)->word, 0, 7)) - -#define RAB_INSTR_RSP_GET_index(self) (SHIFTR((self)->word, 7, 4)) -#define RAB_INSTR_RSP_GET_de(self) (SHIFTR((self)->word, 11, 5)) - - -#define RAB_INSTR_RSP_PACK_cop2t(word, value) (BITREPACK((word), value, 16, 5)) -#define RAB_INSTR_RSP_PACK_cop2cd(word, value) (BITREPACK((word), value, 11, 5)) - -#define RAB_INSTR_RSP_PACK_vs(word, value) (BITREPACK((word), value, 11, 5)) -#define RAB_INSTR_RSP_PACK_vt(word, value) (BITREPACK((word), value, 16, 5)) -#define RAB_INSTR_RSP_PACK_vd(word, value) (BITREPACK((word), value, 6, 5)) - -#define RAB_INSTR_RSP_PACK_elementhigh(word, value) (BITREPACK((word), value, 21, 4)) -#define RAB_INSTR_RSP_PACK_elementlow(word, value) (BITREPACK((word), value, 7, 4)) - -#define RAB_INSTR_RSP_PACK_index(word, value) (BITREPACK((word), value, 7, 4)) -#define RAB_INSTR_RSP_PACK_offset(word, value) (BITREPACK((word), value, 0, 7)) -#define RAB_INSTR_RSP_PACK_de(word, value) (BITREPACK((word), value, 11, 5)) - - -NON_NULL(1) -void RabbitizerInstructionRsp_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram); -NON_NULL(1) -void RabbitizerInstructionRsp_destroy(RabbitizerInstruction *self); - - -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId_Normal(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId_Special(RabbitizerInstruction *self); -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId_Regimm(RabbitizerInstruction *self); - -NON_NULL(1) -void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self); - - -NODISCARD NON_NULL(1) PURE -uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *self); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h deleted file mode 100644 index 58c26594..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerOperandType.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_OPERAND_TYPE_H -#define RABBITIZER_OPERAND_TYPE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RAB_DEF_OPERAND(prefix, operand) \ - RAB_OPERAND_##prefix##_##operand, - -typedef enum RabbitizerOperandType { - RAB_DEF_OPERAND(ALL, INVALID) - -#include "operands/RabbitizerOperandType_cpu.inc" -#include "operands/RabbitizerOperandType_rsp.inc" -#include "operands/RabbitizerOperandType_r5900.inc" - - RAB_DEF_OPERAND(ALL, MAX) -} RabbitizerOperandType; - -#undef RAB_DEF_OPERAND - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h deleted file mode 100644 index 1c6421cd..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/RabbitizerRegister.h +++ /dev/null @@ -1,143 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_REGISTER_H -#define RABBITIZER_REGISTER_H -#pragma once - -#include - -#include "common/Utils.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#define RABBITIZER_DEF_REG(prefix, name, numeric) \ - RABBITIZER_REG_##prefix##_##name - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - RABBITIZER_REG_##prefix##_##name - - -typedef enum RabbitizerRegister_GprO32 { - #include "instructions/registers/RabbitizerRegister_GprO32.inc" -} RabbitizerRegister_GprO32; - -typedef enum RabbitizerRegister_GprN32 { - #include "instructions/registers/RabbitizerRegister_GprN32.inc" -} RabbitizerRegister_GprN32; - -typedef enum RabbitizerRegister_Cop0 { - #include "instructions/registers/RabbitizerRegister_Cop0.inc" -} RabbitizerRegister_Cop0; - -// Float registers -typedef enum RabbitizerRegister_Cop1O32 { - #include "instructions/registers/RabbitizerRegister_Cop1O32.inc" -} RabbitizerRegister_Cop1O32; - -typedef enum RabbitizerRegister_Cop1N32 { - #include "instructions/registers/RabbitizerRegister_Cop1N32.inc" -} RabbitizerRegister_Cop1N32; - -typedef enum RabbitizerRegister_Cop1N64 { - #include "instructions/registers/RabbitizerRegister_Cop1N64.inc" -} RabbitizerRegister_Cop1N64; - -typedef enum RabbitizerRegister_Cop1Control { - #include "instructions/registers/RabbitizerRegister_Cop1Control.inc" -} RabbitizerRegister_Cop1Control; - -typedef enum RabbitizerRegister_Cop2 { - #include "instructions/registers/RabbitizerRegister_Cop2.inc" -} RabbitizerRegister_Cop2; - - -/* RSP */ - -typedef enum RabbitizerRegister_RspGpr { - #include "instructions/registers/RabbitizerRegister_RspGpr.inc" -} RabbitizerRegister_RspGpr; - -typedef enum RabbitizerRegister_RspCop0 { - #include "instructions/registers/RabbitizerRegister_RspCop0.inc" -} RabbitizerRegister_RspCop0; - -typedef enum RabbitizerRegister_RspCop2 { - #include "instructions/registers/RabbitizerRegister_RspCop2.inc" -} RabbitizerRegister_RspCop2; - -typedef enum RabbitizerRegister_RspCop2Control { - #include "instructions/registers/RabbitizerRegister_RspCop2Control.inc" -} RabbitizerRegister_RspCop2Control; - -typedef enum RabbitizerRegister_RspVector { - #include "instructions/registers/RabbitizerRegister_RspVector.inc" -} RabbitizerRegister_RspVector; - -/* RSP */ - -/* R5900 */ - -typedef enum RabbitizerRegister_R5900VF { - #include "instructions/registers/RabbitizerRegister_R5900VF.inc" -} RabbitizerRegister_R5900VF; - -typedef enum RabbitizerRegister_R5900VI { - #include "instructions/registers/RabbitizerRegister_R5900VI.inc" -} RabbitizerRegister_R5900VI; - -/* R5900 */ - - -#undef RABBITIZER_DEF_REG -#undef RABBITIZER_DEF_REG_NODOLLAR - - -extern const char *RabbitizerRegister_GprO32_Names[][2]; -extern const char *RabbitizerRegister_GprN32_Names[][2]; -extern const char *RabbitizerRegister_Cop0_Names[][2]; -extern const char *RabbitizerRegister_Cop1O32_Names[][2]; -extern const char *RabbitizerRegister_Cop1N32_Names[][2]; -extern const char *RabbitizerRegister_Cop1N64_Names[][2]; -extern const char *RabbitizerRegister_Cop2_Names[][2]; -extern const char *RabbitizerRegister_RspGpr_Names[][2]; -extern const char *RabbitizerRegister_RspCop0_Names[][2]; -extern const char *RabbitizerRegister_RspVector_Names[][2]; - - -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameGpr(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop0(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop1(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop1Control(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameCop2(uint8_t regValue); - -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspGpr(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspCop0(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspCop2(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspCop2Control(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameRspVector(uint8_t regValue); - -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue); -NODISCARD PURE RETURNS_NON_NULL -const char *RabbitizerRegister_getNameR5900VI(uint8_t regValue); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc deleted file mode 100644 index dbbb9818..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_cpu.inc +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_INSTR_ID(cpu, , INVALID, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}) - -#include "instructions/instr_id/cpu/cpu_normal.inc" -#include "instructions/instr_id/cpu/cpu_special.inc" -#include "instructions/instr_id/cpu/cpu_regimm.inc" -#include "instructions/instr_id/cpu/cpu_cop0.inc" -#include "instructions/instr_id/cpu/cpu_cop0_bc0.inc" -#include "instructions/instr_id/cpu/cpu_cop0_tlb.inc" -#include "instructions/instr_id/cpu/cpu_cop1.inc" -#include "instructions/instr_id/cpu/cpu_cop1_bc1.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_s.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_d.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_w.inc" -#include "instructions/instr_id/cpu/cpu_cop1_fpu_l.inc" - -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_00, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_01, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_02, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_03, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_04, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_05, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_06, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_07, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_08, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_09, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_10, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_11, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_12, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_13, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_14, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_15, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_16, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_17, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_18, .operands={0}) -RABBITIZER_DEF_INSTR_ID(cpu, , USERDEF_19, .operands={0}) - -RABBITIZER_DEF_INSTR_ID(cpu, , MAX, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc deleted file mode 100644 index 10f11126..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_r5900.inc +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_INSTR_ID(r5900, , INVALID, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .architectureVersion=-1) - -#include "instructions/instr_id/r5900/r5900_normal.inc" -#include "instructions/instr_id/r5900/r5900_special.inc" -#include "instructions/instr_id/r5900/r5900_regimm.inc" - -#include "instructions/instr_id/r5900/r5900_mmi.inc" -#include "instructions/instr_id/r5900/r5900_mmi_0.inc" -#include "instructions/instr_id/r5900/r5900_mmi_1.inc" -#include "instructions/instr_id/r5900/r5900_mmi_2.inc" -#include "instructions/instr_id/r5900/r5900_mmi_3.inc" - -#include "instructions/instr_id/r5900/r5900_cop0_tlb.inc" - -#include "instructions/instr_id/r5900/r5900_cop1_fpu_s.inc" - -#include "instructions/instr_id/r5900/r5900_cop2.inc" -#include "instructions/instr_id/r5900/r5900_cop2_bc2.inc" -#include "instructions/instr_id/r5900/r5900_cop2_special1.inc" -#include "instructions/instr_id/r5900/r5900_cop2_special2.inc" - -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_00, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_01, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_02, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_03, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_04, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_05, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_06, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_07, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_08, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_09, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_10, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_11, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_12, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_13, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_14, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_15, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_16, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_17, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_18, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, , USERDEF_19, .operands={0}) - -RABBITIZER_DEF_INSTR_ID(r5900, , MAX, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc deleted file mode 100644 index 2fcaa854..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/RabbitizerInstrId_rsp.inc +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// RSP instructions -RABBITIZER_DEF_INSTR_ID(rsp, , INVALID, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) - -#include "instructions/instr_id/rsp/rsp_cop2.inc" -#include "instructions/instr_id/rsp/rsp_cop2_vu.inc" - -#include "instructions/instr_id/rsp/rsp_normal_lwc2.inc" -#include "instructions/instr_id/rsp/rsp_normal_swc2.inc" - -// CPU instructions but with rsp registers - -#include "instructions/instr_id/rsp/rsp_normal.inc" -#include "instructions/instr_id/rsp/rsp_special.inc" -#include "instructions/instr_id/rsp/rsp_regimm.inc" -#include "instructions/instr_id/rsp/rsp_cop0.inc" - -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_00, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_01, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_02, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_03, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_04, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_05, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_06, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_07, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_08, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_09, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_10, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_11, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_12, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_13, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_14, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_15, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_16, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_17, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_18, .operands={0}) -RABBITIZER_DEF_INSTR_ID(rsp, , USERDEF_19, .operands={0}) - -RABBITIZER_DEF_INSTR_ID(rsp, , MAX, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc deleted file mode 100644 index 0aa3df49..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0.inc +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rt, cop0d -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, mfc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true) // Move word From CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, dmfc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true) // Doubleword Move From CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, cfc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true) // Move control word From CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, mtc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Move word to CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x05, dmtc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Doubleword Move To CP0 -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, ctc0, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Move control word To CP0 diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc deleted file mode 100644 index 0165039b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_bc0.inc +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc0f, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP False -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc0t, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) // Branch on FP True -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc0fl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP False Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc0tl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) // Branch on FP True Likely diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc deleted file mode 100644 index 65b808e3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop0_tlb.inc +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, tlbr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Read Indexed TLB Entry -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, tlbwi, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Write Indexed TLB Entry - -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, tlbwr, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN) // Write Random TLB Entry - -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, tlbp, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Probe TLB for Matching Entry - -RABBITIZER_DEF_INSTR_ID(cpu, 0x18, eret, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Return from Exception diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc deleted file mode 100644 index e6defc81..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1.inc +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rt, fs -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, mfc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Move Word From Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, dmfc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Doubleword Move From Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, mtc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Move Word to Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x05, dmtc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Doubleword Move To Floating-Point - -// OP rt, cop1cs -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, cfc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .modifiesRt=true) // Move Control Word from Floating-Point -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, ctc1, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_cop1cs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Move Control Word to Floating-Point diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc deleted file mode 100644 index e339cd4d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_bc1.inc +++ /dev/null @@ -1,8 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bc1f, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bc1t, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bc1fl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bc1tl, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isBranch=true, .isBranchLikely=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc deleted file mode 100644 index a512496c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_d.inc +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x00, add_d, add.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Add -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x01, sub_d, sub.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Sub -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x02, mul_d, mul.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Multiply -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x03, div_d, div.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Divide - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x04, sqrt_d, sqrt.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Square Root -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x05, abs_d, abs.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Absolute Value -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x06, mov_d, mov.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Move -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x07, neg_d, neg.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Negate - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x08, round_l_d, round.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x09, trunc_l_d, trunc.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0A, ceil_l_d, ceil.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0B, floor_l_d, floor.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Long Fixed-Point - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0C, round_w_d, round.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0D, trunc_w_d, trunc.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0E, ceil_w_d, ceil.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0F, floor_w_d, floor.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Word Fixed-Point - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_d, cvt.s.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x24, cvt_w_d, cvt.w.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x25, cvt_l_d, cvt.l.d, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) - -// OP fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x30, c_f_d, c.f.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x31, c_un_d, c.un.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x32, c_eq_d, c.eq.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x33, c_ueq_d, c.ueq.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x34, c_olt_d, c.olt.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x35, c_ult_d, c.ult.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x36, c_ole_d, c.ole.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x37, c_ule_d, c.ule.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x38, c_df_d, c.df.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x39, c_ngle_d, c.ngle.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3A, c_deq_d, c.deq.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3B, c_ngl_d, c.ngl.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3C, c_lt_d, c.lt.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3D, c_nge_d, c.nge.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3E, c_le_d, c.le.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3F, c_ngt_d, c.ngt.d, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc deleted file mode 100644 index 48eea054..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_l.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_l, cvt.s.l, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_l, cvt.d.l, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc deleted file mode 100644 index 4271429b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_s.inc +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x00, add_s, add.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Add -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x01, sub_s, sub.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Sub -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x02, mul_s, mul.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Multiply -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x03, div_s, div.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Divide - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x04, sqrt_s, sqrt.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Square Root -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x05, abs_s, abs.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Absolute Value -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x06, mov_s, mov.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Move -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x07, neg_s, neg.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Negate - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x08, round_l_s, round.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x09, trunc_l_s, trunc.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0A, ceil_l_s, ceil.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Long Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0B, floor_l_s, floor.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Long Fixed-Point - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0C, round_w_s, round.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Round to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0D, trunc_w_s, trunc.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0E, ceil_w_s, ceil.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Ceiling Convert to Word Fixed-Point -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x0F, floor_w_s, floor.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) // Floating-Point Floor Convert to Word Fixed-Point - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_s, cvt.d.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x24, cvt_w_s, cvt.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x25, cvt_l_s, cvt.l.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) - -// OP fs, ft -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x30, c_f_s, c.f.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x31, c_un_s, c.un.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x32, c_eq_s, c.eq.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x33, c_ueq_s, c.ueq.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x34, c_olt_s, c.olt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x35, c_ult_s, c.ult.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x36, c_ole_s, c.ole.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x37, c_ule_s, c.ule.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x38, c_sf_s, c.sf.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x39, c_ngle_s, c.ngle.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3A, c_seq_s, c.seq.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3B, c_ngl_s, c.ngl.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3C, c_lt_s, c.lt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3D, c_nge_s, c.nge.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3E, c_le_s, c.le.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x3F, c_ngt_s, c.ngt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc deleted file mode 100644 index 9d07b6dc..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_cop1_fpu_w.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP fd, fs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x20, cvt_s_w, cvt.s.w, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, 0x21, cvt_d_w, cvt.d.w, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .isFloat=true, .isDouble=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc deleted file mode 100644 index cc93fa5c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_normal.inc +++ /dev/null @@ -1,83 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP LABEL -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, j, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, jal, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link - -// OP rs, rt, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, beq, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on EQual -RABBITIZER_DEF_INSTR_ID(cpu, 0x05, bne, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Not Equal -RABBITIZER_DEF_INSTR_ID(cpu, 0x14, beql, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on EQual Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x15, bnel, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Not Equal Likely - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, blez, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Less than or Equal to Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x16, blezl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Less than or Equal to Zero Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x07, bgtz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Greater Than Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x17, bgtzl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater Than Zero Likely - -// OP rt, rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, addi, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Add Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x09, addiu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Add Immediate Unsigned Word -RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, slti, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, sltiu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Immediate Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, andi, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // And Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x0D, ori, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Or Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x0E, xori, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // eXclusive OR Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x18, daddi, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword add Immediate -RABBITIZER_DEF_INSTR_ID(cpu, 0x19, daddiu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword add Immediate Unsigned - -// OP rt, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x0F, lui, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Upper Immediate - -// OP rt, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x1A, ldl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x1B, ldr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x20, lb, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte -RABBITIZER_DEF_INSTR_ID(cpu, 0x21, lh, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword -RABBITIZER_DEF_INSTR_ID(cpu, 0x22, lwl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x23, lw, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word -RABBITIZER_DEF_INSTR_ID(cpu, 0x24, lbu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte Insigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x25, lhu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x26, lwr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x27, lwu, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Word Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x28, sb, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Byte -RABBITIZER_DEF_INSTR_ID(cpu, 0x29, sh, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Halfword -RABBITIZER_DEF_INSTR_ID(cpu, 0x2A, swl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x2B, sw, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word -RABBITIZER_DEF_INSTR_ID(cpu, 0x2C, sdl, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword Left -RABBITIZER_DEF_INSTR_ID(cpu, 0x2D, sdr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x2E, swr, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word Right -RABBITIZER_DEF_INSTR_ID(cpu, 0x30, ll, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Linked word -RABBITIZER_DEF_INSTR_ID(cpu, 0x33, pref, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // Prefetch -RABBITIZER_DEF_INSTR_ID(cpu, 0x34, lld, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Linked Doubleword -RABBITIZER_DEF_INSTR_ID(cpu, 0x37, ld, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Load Doubleword -RABBITIZER_DEF_INSTR_ID(cpu, 0x38, sc, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Conditional word -RABBITIZER_DEF_INSTR_ID(cpu, 0x3C, scd, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Conditional Doubleword -RABBITIZER_DEF_INSTR_ID(cpu, 0x3F, sd, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Store Doubleword - -// OP op, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x2F, cache, .operands={RAB_OPERAND_cpu_op, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true) // Cache - -// OP ft, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x31, lwc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x35, ldc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Doubleword to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x39, swc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x3D, sdc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .isDouble=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Doubleword from Coprocessor z - -// OP cop2t, IMM(base) -RABBITIZER_DEF_INSTR_ID(cpu, 0x32, lwc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x36, ldc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Load Doubleword to Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x3A, swc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z -RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, sdc2, .operands={RAB_OPERAND_cpu_cop2t, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Store Doubleword from Coprocessor z - - -// Pseudo-Instruction Unique IDs - -// OP IMM -RABBITIZER_DEF_INSTR_ID(cpu, -0x03, b, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch (unconditional) - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, -0x04, beqz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on EQual Zero -RABBITIZER_DEF_INSTR_ID(cpu, -0x05, bnez, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_I, .isBranch=true, .isPseudo=true) // Branch on Not Equal Zero diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc deleted file mode 100644 index 4d47123b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_regimm.inc +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, bltz, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Less Than Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x01, bgez, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Greater than or Equal to Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, bltzl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Less Than Zero Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, bgezl, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater than or Equal to Zero Likely - -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, tgei, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x09, tgeiu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, tlti, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, tltiu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, teqi, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) -RABBITIZER_DEF_INSTR_ID(cpu, 0x0E, tnei, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) - -RABBITIZER_DEF_INSTR_ID(cpu, 0x10, bltzal, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Less Than Zero and Link -RABBITIZER_DEF_INSTR_ID(cpu, 0x11, bgezal, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch on Greater Than or Equal to Zero and Link -RABBITIZER_DEF_INSTR_ID(cpu, 0x12, bltzall, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Less Than Zero and Link Likely -RABBITIZER_DEF_INSTR_ID(cpu, 0x13, bgezall, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .isBranchLikely=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Branch on Greater Than or Equal to Zero and Link Likely - - -// Pseudo-Instruction Unique IDs - -RABBITIZER_DEF_INSTR_ID(cpu, -0x11, bal, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .isPseudo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch and Link diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc deleted file mode 100644 index 1adb970a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/cpu/cpu_special.inc +++ /dev/null @@ -1,93 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rd, rt, sa -RABBITIZER_DEF_INSTR_ID(cpu, 0x00, sll, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Left Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x02, srl, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x03, sra, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Arithmetic -RABBITIZER_DEF_INSTR_ID(cpu, 0x38, dsll, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x3A, dsrl, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical -RABBITIZER_DEF_INSTR_ID(cpu, 0x3B, dsra, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic -RABBITIZER_DEF_INSTR_ID(cpu, 0x3C, dsll32, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical plus 32 -RABBITIZER_DEF_INSTR_ID(cpu, 0x3E, dsrl32, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical plus 32 -RABBITIZER_DEF_INSTR_ID(cpu, 0x3F, dsra32, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic plus 32 - -// OP rd, rt, rs -RABBITIZER_DEF_INSTR_ID(cpu, 0x14, dsllv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Left Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x16, dsrlv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x17, dsrav, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Shift Right Arithmetic Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x04, sllv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Left Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x06, srlv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Logical Variable -RABBITIZER_DEF_INSTR_ID(cpu, 0x07, srav, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Shift word Right Arithmetic Variable - -// OP rs -RABBITIZER_DEF_INSTR_ID(cpu, 0x11, mthi, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move To HI register -RABBITIZER_DEF_INSTR_ID(cpu, 0x13, mtlo, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move To LO register -RABBITIZER_DEF_INSTR_ID(cpu, 0x08, jr, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump Register -RABBITIZER_DEF_INSTR_ID(cpu, 0x09, jalr, .operands={RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link Register - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x09, jalr_rd, jalr, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Jump And Link Register // Special case for rd != 31 - -// OP rd -RABBITIZER_DEF_INSTR_ID(cpu, 0x10, mfhi, .operands={RAB_OPERAND_cpu_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move From HI register -RABBITIZER_DEF_INSTR_ID(cpu, 0x12, mflo, .operands={RAB_OPERAND_cpu_rd}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Move From LO register - -// OP rd, rs, rt -RABBITIZER_DEF_INSTR_ID(cpu, 0x0A, movz, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // MOVe conditional on Zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x0B, movn, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // MOVe conditional on Not zero -RABBITIZER_DEF_INSTR_ID(cpu, 0x1A, div, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide word -RABBITIZER_DEF_INSTR_ID(cpu, 0x1B, divu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide Unsigned word - -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x1A, sn64_div, div, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide word -RABBITIZER_DEF_INSTR_ID_ALTNAME(cpu, -0x1B, sn64_divu, divu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // DIVide Unsigned word - -RABBITIZER_DEF_INSTR_ID(cpu, 0x1E, ddiv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword DIVide -RABBITIZER_DEF_INSTR_ID(cpu, 0x1F, ddivu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword DIVide Unsigned -// RABBITIZER_DEF_INSTR_ID(cpu, , ddiv, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) -// RABBITIZER_DEF_INSTR_ID(cpu, , ddivu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) -RABBITIZER_DEF_INSTR_ID(cpu, 0x20, add, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // ADD word -RABBITIZER_DEF_INSTR_ID(cpu, 0x21, addu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // ADD Unsigned word -RABBITIZER_DEF_INSTR_ID(cpu, 0x22, sub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Subtract word -RABBITIZER_DEF_INSTR_ID(cpu, 0x23, subu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // SUBtract Unsigned word -RABBITIZER_DEF_INSTR_ID(cpu, 0x24, and, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // AND -RABBITIZER_DEF_INSTR_ID(cpu, 0x25, or, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // OR -RABBITIZER_DEF_INSTR_ID(cpu, 0x26, xor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // eXclusive OR -RABBITIZER_DEF_INSTR_ID(cpu, 0x27, nor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Not OR -RABBITIZER_DEF_INSTR_ID(cpu, 0x2A, slt, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than -RABBITIZER_DEF_INSTR_ID(cpu, 0x2B, sltu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Set on Less Than Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x2C, dadd, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Add -RABBITIZER_DEF_INSTR_ID(cpu, 0x2D, daddu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword Add Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x2E, dsub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword SUBtract -RABBITIZER_DEF_INSTR_ID(cpu, 0x2F, dsubu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword SUBtract Unsigned - -// OP code -RABBITIZER_DEF_INSTR_ID(cpu, 0x0C, syscall, .operands={RAB_OPERAND_cpu_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // SYStem CALL -RABBITIZER_DEF_INSTR_ID(cpu, 0x0D, break, .operands={RAB_OPERAND_cpu_code}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Break -RABBITIZER_DEF_INSTR_ID(cpu, 0x0F, sync, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Sync - -// OP rs, rt -RABBITIZER_DEF_INSTR_ID(cpu, 0x18, mult, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // MULTtiply word -RABBITIZER_DEF_INSTR_ID(cpu, 0x19, multu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // MULTtiply Unsigned word -RABBITIZER_DEF_INSTR_ID(cpu, 0x1C, dmult, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword MULTiply -RABBITIZER_DEF_INSTR_ID(cpu, 0x1D, dmultu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_III) // Doubleword MULTiply Unsigned - -RABBITIZER_DEF_INSTR_ID(cpu, 0x30, tge, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Greater or Equal -RABBITIZER_DEF_INSTR_ID(cpu, 0x31, tgeu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Greater or Equal Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x32, tlt, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Less Than -RABBITIZER_DEF_INSTR_ID(cpu, 0x33, tltu, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Less Than Unsigned -RABBITIZER_DEF_INSTR_ID(cpu, 0x34, teq, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if EQual -RABBITIZER_DEF_INSTR_ID(cpu, 0x36, tne, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_code_lower}, .instrType=RABBITIZER_INSTR_TYPE_R, .isTrap=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Trap if Not Equal - - -// Pseudo-Instruction Unique IDs - -// OP -RABBITIZER_DEF_INSTR_ID(cpu, -0x01, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .isPseudo=true) // No OPeration - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID(cpu, -0x25, move, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .maybeIsMove=true, .isPseudo=true) // Move -RABBITIZER_DEF_INSTR_ID(cpu, -0x27, not, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true) // Not - -// OP rd, rt -RABBITIZER_DEF_INSTR_ID(cpu, -0x23, negu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .isPseudo=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc deleted file mode 100644 index 5173361a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop0_tlb.inc +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21--------------------------------5--------0 - | = COP0 | TLB | | fmt | - ------6----------5----------------------------------------------- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | --- | TLBR | TLBWI | --- | --- | --- | TLBWR | --- | -001 | TLBP | --- | --- | --- | --- | --- | --- | --- | -010 | --- | --- | --- | --- | --- | --- | --- | --- | -011 | ERET | --- | --- | --- | --- | --- | --- | --- | -100 | --- | --- | --- | --- | --- | --- | --- | --- | -101 | --- | --- | --- | --- | --- | --- | --- | --- | -110 | --- | --- | --- | --- | --- | --- | --- | --- | -111 | EI | DI | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -RABBITIZER_DEF_INSTR_ID(r5900, 0x38, ei, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x39, di, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc deleted file mode 100644 index 730e7e91..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop1_fpu_s.inc +++ /dev/null @@ -1,46 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21 -------------------------------5--------0 - | = COP1 | = S | | function| - ------6----------5-----------------------------------------6----- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | ADD.S | SUB.S | MUL.S | DIV.S | SQRT.S| ABS.S | MOV.S | NEG.S | -001 | --- | --- | --- | --- | --- | --- | --- | --- | -010 | --- | --- | --- | --- | --- | --- |RSQRT.S| --- | -011 | ADDA.S| SUBA.S| MULA.S| --- | MADD.S| MSUB.S|MADDA.S|MSUBA.S| -100 | --- | --- | --- | --- | CVT.W | --- | --- | --- | -101 | MAX.S | MIN.S | --- | --- | --- | --- | --- | --- | -110 | C.F | --- | C.EQ | --- | C.LT | --- | C.LE | --- | -111 | --- | --- | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x04, c1__sqrt_s, c1, .operands={RAB_OPERAND_cpu_copraw}) - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x16, rsqrt_s, rsqrt.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Reciprocal SQuare RooT - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x18, adda_s, adda.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point ADD to Accumulator -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x19, suba_s, suba.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point SUBtract to Accumulator -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1A, mula_s, mula.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point MULtiply to Accumulator - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1C, madd_s, madd.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply-ADD -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1D, msub_s, msub.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply abd SUBtract -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1E, madda_s, madda.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply-ADD Accumulator -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x1F, msuba_s, msuba.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point Multiply SUBtract from Accumulator - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x28, max_s, max.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point MAXimum -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x29, min_s, min.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) // floating point MINimum - -// Due to the R5900's FPU being non properly complaint the instruction cvt.w.s always behaves as trunc.w.s because is because EE can only do round-to-zero. -// Assemblers like GAS workaround this issue by decoding cvt.w.s as trunc.w.s, so we mimic that behaviour to allow assembling with GAS. -// Here's some reading about the binutils rationale: -// https://sourceware.org/legacy-ml/binutils/2012-11/msg00360.html -// https://sourceware.org/pipermail/binutils/2013-January/079863.html -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x24, trunc_w_s, trunc.w.s, .operands={RAB_OPERAND_cpu_fd, RAB_OPERAND_cpu_fs}, .isFloat=true) // Floating-Point Truncate to Word Fixed-Point - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x34, c_lt_s, c.lt.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, 0x36, c_le_s, c.le.s, .operands={RAB_OPERAND_cpu_fs, RAB_OPERAND_cpu_ft}, .isFloat=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc deleted file mode 100644 index fae81904..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2.inc +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21 ----------------------------------------0 - | = COP2 | fmt | | - ------6----------5----------------------------------------------- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo - 00 | --- | QMFC2 | CFC2 | --- | --- | QMTC2 | CTC2 | --- | - 01 | *1 | --- | --- | --- | --- | --- | --- | --- | - 10 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | - 11 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | *2 | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1 = BC instructions, see BC2 list *2 =see special1 table -*/ - -// TODO: properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, qmfc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vfs}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, cfc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vis}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, qmtc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vfs}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, ctc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_r5900_vis}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc deleted file mode 100644 index 734e0d4f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_bc2.inc +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31--------26-25------21-20------16------------------------------0 - | = COP0 | BC2 | fmt | | - ------6----------5----------5------------------------------------ - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo - 00 | BC2F | BC2T | BC2FL | BC2TL | --- | --- | --- | --- | - 01 | --- | --- | --- | --- | --- | --- | --- | --- | - 10 | --- | --- | --- | --- | --- | --- | --- | --- | - 11 | --- | --- | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// TODO: operands and properties - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, bc2f, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, bc2t, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, bc2fl, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true, .isBranchLikely=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, bc2tl, .operands={RAB_OPERAND_cpu_branch_target_label}, .isBranch=true, .isBranchLikely=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc deleted file mode 100644 index 043c911f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special1.inc +++ /dev/null @@ -1,82 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26-25-----21-20-----------------------------5--------0 - | =COP2 | Special1 | |function| - ------6----------5------------------------------------------6---- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 |VADDx |VADDy |VADDz |VADDw |VSUBx |VSUBy |VSUBz |VSUBw | -001 |VMADDx |VMADDy |VMADDz |VMADDw |VMSUBx |VMSUBy |VMSUBz |VMSUBw | -010 |VMAXx |VMAXy |VMAXz |VMAXw |VMINIx |VMINIy |VMINIz |VMINIw | -011 |VMULx |VMULy |VMULz |VMULw |VMULq |VMAXi |VMULi |VMINIi | -100 |VADDq |VMADDq |VADDi |VMADDi |VSUBq |VMSUBq |VSUbi |VMSUBi | -101 |VADD |VMADD |VMUL |VMAX |VSUB |VMSUB |VOPMSUB|VMINI | -110 |VIADD |VISUB |VIADDI | --- |VIAND |VIOR | --- | --- | -111 |VCALLMS|VCALLMSR| --- | --- | *1 | *1 | *1 | *1 | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1=see special2 table -*/ - -// TODO: properties - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, vaddx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, vaddy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, vaddz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, vaddw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, vsubx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, vsuby, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, vsubz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, vsubw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, vmaddx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, vmaddy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, vmaddz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0B, vmaddw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, vmsubx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, vmsuby, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, vmsubz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0F, vmsubw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract broadcast - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, vmaxx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, vmaxy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, vmaxz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, vmaxw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, vminix, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, vminiy, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, vminiz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x17, vminiw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINimum broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, vmulx, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, vmuly, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, vmulz, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, vmulw, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, vmulq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, vmaxi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum I -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, vmuli, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply I -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, vminii, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINImum I - -RABBITIZER_DEF_INSTR_ID(r5900, 0x20, vaddq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x21, vmaddq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x22, vaddi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD I -RABBITIZER_DEF_INSTR_ID(r5900, 0x23, vmaddi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD I -RABBITIZER_DEF_INSTR_ID(r5900, 0x24, vsubq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x25, vmsubq, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x26, vsubi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract I -RABBITIZER_DEF_INSTR_ID(r5900, 0x27, vmsubi, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract I -RABBITIZER_DEF_INSTR_ID(r5900, 0x28, vadd, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // ADD -RABBITIZER_DEF_INSTR_ID(r5900, 0x29, vmadd, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-ADD -RABBITIZER_DEF_INSTR_ID(r5900, 0x2A, vmul, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MULtiply -RABBITIZER_DEF_INSTR_ID(r5900, 0x2B, vmax, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MAXimum -RABBITIZER_DEF_INSTR_ID(r5900, 0x2C, vsub, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // SUBtract -RABBITIZER_DEF_INSTR_ID(r5900, 0x2D, vmsub, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply-SUBtract -RABBITIZER_DEF_INSTR_ID(r5900, 0x2E, vopmsub, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Outer product post decrement -RABBITIZER_DEF_INSTR_ID(r5900, 0x2F, vmini, .operands={RAB_OPERAND_r5900_vfdxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // MINImum - -RABBITIZER_DEF_INSTR_ID(r5900, 0x30, viadd, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer ADD -RABBITIZER_DEF_INSTR_ID(r5900, 0x31, visub, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer SUBtract -RABBITIZER_DEF_INSTR_ID(r5900, 0x32, viaddi, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_immediate5}) // Integer ADD Immediate -RABBITIZER_DEF_INSTR_ID(r5900, 0x34, viand, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer AND -RABBITIZER_DEF_INSTR_ID(r5900, 0x35, vior, .operands={RAB_OPERAND_r5900_vid, RAB_OPERAND_r5900_vis, RAB_OPERAND_r5900_vit}) // Integer OR - -// TODO: operands and properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x38, vcallms, .operands={0}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x39, vcallmsr, .operands={RAB_OPERAND_r5900_vis}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc deleted file mode 100644 index 6558540f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_cop2_special2.inc +++ /dev/null @@ -1,125 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26-25-----21-20------------------11-10------6-5-2-1--0 - | =COP2 | Special2 | | fhi |1111|flo| - ------6----------5----------------------------------------------- -Note: opcode is flo | (fhi * 4). - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -0000 |VADDAx |VADDAy |VADDAz |VADDAw |VSUBAx |VSUBAy |VSUBAz |VSUBAw | -0001 |VMADDAx|VMADDAy|VMADDAz|VMADDAw|VMSUBAx|VMSUBAy|VMSUBAz|VMSUBAw| -0010 |VITOF0 |VITOF4 |VITOF12|VITOF15|VFTOI0 |VFTOI4 |VFTOI12|VFTOI15| -0011 |VMULAx |VMULAy |VMULAz |VMULAw |VMULAq |VABS |VMULAi |VCLIPw | -0100 |VADDAq |VMADDAq|VADDAi |VMADDAi|VSUBAq |VMSUBAq|VSUBAi |VMSUBAi| -0101 |VADDA |VMADDA |VMULA | --- |VSUBA |VMSUBA |VOPMULA|VNOP | -0110 |VMOVE |VMR32 | --- | --- |VLQI |VSQI |VLQD |VSQD | -0111 |VDIV |VSQRT |VRSQRT |VWAITQ |VMTIR |VMFIR |VILWR |VISWR | -1000 |VRNEXT |VRGET |VRINIT |VRXOR | --- | --- | --- | --- | -1001 | --- | --- | --- | --- | --- | --- | --- | --- | -1010 | --- | --- | --- | --- | --- | --- | --- | --- | -1011 | --- | --- | --- | --- | --- | --- | --- | --- | -1100 | --- | --- | --- | --- | --- | --- | --- | --- | -1101 | --- | --- | --- | --- | --- | --- | --- | --- | -1110 | --- | --- | --- | --- | --- | --- | --- | --- | -1111 | --- | --- | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// TODO: operands and properties - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, vaddax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, vadday, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, vaddaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, vaddaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, vsubax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, vsubay, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, vsubaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, vsubaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, vmaddax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, vmadday, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, vmaddaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0B, vmaddaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) // Multiply and add accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, vmsubax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, vmsubay, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, vmsubaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast -RABBITIZER_DEF_INSTR_ID(r5900, 0x0F, vmsubaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator broadcast - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, vitof0, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, vitof4, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, vitof12, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, vitof15, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Integer to floating point -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, vftoi0, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, vftoi4, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, vftoi12, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer -RABBITIZER_DEF_INSTR_ID(r5900, 0x17, vftoi15, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Floating to integer - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, vmulax, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, vmulay, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, vmulaz, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, vmulaw, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, vmulaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, vabs, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Absolute - -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, vmulai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, vclipw, .operands={RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftn}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Clip - -RABBITIZER_DEF_INSTR_ID(r5900, 0x20, vaddaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x21, vmaddaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x22, vaddai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x23, vmaddai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x24, vsubaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Subtract accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x25, vmsubaq, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_Q}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and Subtract accumulator Q -RABBITIZER_DEF_INSTR_ID(r5900, 0x26, vsubai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Subtract accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x27, vmsubai, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_I}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and Subtract accumulator I -RABBITIZER_DEF_INSTR_ID(r5900, 0x28, vadda, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Add accumulator -RABBITIZER_DEF_INSTR_ID(r5900, 0x29, vmadda, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and add accumulator - -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x2A, vmula, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x2C, vsuba, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) -RABBITIZER_DEF_INSTR_ID(r5900, 0x2D, vmsuba, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Multiply and substract accumulator -RABBITIZER_DEF_INSTR_ID(r5900, 0x2E, vopmula, .operands={RAB_OPERAND_r5900_ACCxyzw, RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vftxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Outer product pre increment -RABBITIZER_DEF_INSTR_ID(r5900, 0x2F, vnop, .operands={0}) // No operation - -RABBITIZER_DEF_INSTR_ID(r5900, 0x30, vmove, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move floating point registers -RABBITIZER_DEF_INSTR_ID(r5900, 0x31, vmr32, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vfsxyzw}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move and rotate per word -RABBITIZER_DEF_INSTR_ID(r5900, 0x34, vlqi, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vis_postincr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Load quadraword post increment -RABBITIZER_DEF_INSTR_ID(r5900, 0x35, vsqi, .operands={RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vit_postincr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Store quadraword post increment -RABBITIZER_DEF_INSTR_ID(r5900, 0x36, vlqd, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vis_predecr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Load quadraword pre decrement -RABBITIZER_DEF_INSTR_ID(r5900, 0x37, vsqd, .operands={RAB_OPERAND_r5900_vfsxyzw, RAB_OPERAND_r5900_vit_predecr}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Store quadraword pre decrement - -RABBITIZER_DEF_INSTR_ID(r5900, 0x38, vdiv, .operands={RAB_OPERAND_r5900_Q, RAB_OPERAND_r5900_vfsl, RAB_OPERAND_r5900_vftm}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x39, vsqrt, .operands={RAB_OPERAND_r5900_Q, RAB_OPERAND_r5900_vftm}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x3A, vrsqrt, .operands={RAB_OPERAND_r5900_Q, RAB_OPERAND_r5900_vfsl,RAB_OPERAND_r5900_vftm}) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3B, vwaitq, .operands={0}) // Wait Q operation - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3C, vmtir, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vfsl}) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3D, vmfir, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_vis}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // Move from integer register - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, vilwr, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis}, .isFloat=true, .doesDereference=true, .doesLoad=true) // Integer load word register -RABBITIZER_DEF_INSTR_ID(r5900, 0x3F, viswr, .operands={RAB_OPERAND_r5900_vit, RAB_OPERAND_r5900_vis}, .isFloat=true, .doesDereference=true, .doesStore=true) // Integer store word register -/* -"vilwr.w", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"vilwr.x", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"vilwr.y", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"vilwr.z", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.w", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.x", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.y", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -"viswr.z", RAB_OPERAND_r5900_vit,(RAB_OPERAND_r5900_vis) -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x40, vrnext, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // R next -RABBITIZER_DEF_INSTR_ID(r5900, 0x41, vrget, .operands={RAB_OPERAND_r5900_vftxyzw, RAB_OPERAND_r5900_R}, .instrSuffix=RABINSTRSUFFIX_R5900_xyzw, .isFloat=true) // R move - -// TODO -RABBITIZER_DEF_INSTR_ID(r5900, 0x42, vrinit, .operands={RAB_OPERAND_r5900_R, RAB_OPERAND_r5900_vfsl}) -RABBITIZER_DEF_INSTR_ID(r5900, 0x43, vrxor, .operands={RAB_OPERAND_r5900_R, RAB_OPERAND_r5900_vfsl}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc deleted file mode 100644 index 1cc9bf5c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi.inc +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | = MMI | | function| - ------6----------------------------------------------------6----- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | MADD | MADDU | --- | --- | PLZCW | --- | --- | --- | -001 | *1 | *2 | --- | --- | --- | --- | --- | --- | -010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 | --- | --- | --- | --- | -011 | MULT1 | MULTU1| DIV1 | DIVU1 | --- | --- | --- | --- | -100 | MADD1 | MADDU1| --- | --- | --- | --- | --- | --- | -101 | *3 | *4 | --- | --- | --- | --- | --- | --- | -110 | PMFHL | PMTHL | --- | --- | PSLLH | --- | PSRLH | PSRAH | -111 | --- | --- | --- | --- | PSLLW | --- | PSRLW | PSRAW | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1 = MMI0 list *2 = MMI2 list - *3 = MMI1 list *4 = MMI3 list -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, madd, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD word -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, maddu, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD Unsigned word -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, plzcw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Leading Zero or one Count Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, mfhi1, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Move From HI1 register -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, mthi1, .operands={RAB_OPERAND_cpu_rs}) // Move To HI1 register -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, mflo1, .operands={RAB_OPERAND_cpu_rd}) // Move From LO1 register -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, mtlo1, .operands={RAB_OPERAND_cpu_rs}) // Move To LO1 register - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mult1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // MULTiply word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, multu1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // MULTiply Unsigned word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, div1, .operands={RAB_OPERAND_cpu_zero, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // DIVide word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, divu1, .operands={RAB_OPERAND_cpu_zero, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // DIVide Unsigned word pipeline 1 - -RABBITIZER_DEF_INSTR_ID(r5900, 0x20, madd1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD word pipeline 1 -RABBITIZER_DEF_INSTR_ID(r5900, 0x21, maddu1, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Multiply-ADD Unsigned word pipeline 1 - -// TODO: check this two instruction, it is supposed to have an extra .fmt -RABBITIZER_DEF_INSTR_ID(r5900, 0x30, pmfhl, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Parallel Move From Hi/Lo register -RABBITIZER_DEF_INSTR_ID(r5900, 0x31, pmthl, .operands={RAB_OPERAND_cpu_rs}) // Parallel Move To Hi/Lo register - -RABBITIZER_DEF_INSTR_ID(r5900, 0x34, psllh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Left Logical Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x36, psrlh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Logical Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x37, psrah, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Arithmetic Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3C, psllw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Left Logical Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, psrlw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Logical Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x3F, psraw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_sa}, .modifiesRd=true) // Parallel Shift Right Arithmetic Word diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc deleted file mode 100644 index d9203e52..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_0.inc +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------10--------6-5--------0 - | | |function | MMI0 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 |PADDW | PSUBW | PCGTW | PMAXW | -001 |PADDH | PSUBH | PCGTH | PMAXH | -010 |PADDB | PSUBB | PCGTB | --- | -011 | --- | --- | --- | --- | -100 |PADDSW |PSUBSW |PEXTLW | PPACW | -101 |PADDSH |PSUBSH |PEXTLH | PPACH | -110 |PADDSB |PSUBSB |PEXTLB | PPACB | -111 | --- | --- | PEXT5 | PPAC5 | - hi |-------|-------|-------|-------| -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, paddw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, psubw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, pcgtw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, pmaxw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MAXimum Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, paddh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, psubh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, pcgth, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, pmaxh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MAXimum Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, paddb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, psubb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pcgtb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for Greater Than Byte - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, paddsw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, psubsw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pextlw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Lower from Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, ppacw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, paddsh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, psubsh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, pextlh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Lower from Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x17, ppach, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, paddsb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD with Signed saturation Bytes -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, psubsb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract with Signed saturation Bytes -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pextlb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Lower from Bytes -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, ppacb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to Bytes - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pext5, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend from 5-bits -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, ppac5, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel PACk to 5-bits diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc deleted file mode 100644 index 64573223..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_1.inc +++ /dev/null @@ -1,43 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | | |function | MMI1 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 | --- | PABSW | PCEQW | PMINW | -001 |PADSBH | PABSH | PCEQH | PMINH | -010 | --- | --- | PCEQB | --- | -011 | --- | --- | --- | --- | -100 |PADDUW |PSUBUW |PEXTUW | --- | -101 |PADDUH |PSUBUH |PEXTUH | --- | -110 |PADDUB |PSUBUB |PEXTUB | QFSRV | -111 | --- | --- | --- | --- | - hi |-------|-------|-------|-------| -*/ - -// TODO: operands and properties -RABBITIZER_DEF_INSTR_ID(r5900, 0x01, pabsw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ABSolute Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, pceqw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for EQual Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, pminw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MINimum Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, padsbh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADd/SuBtract Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x05, pabsh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ABSolute Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x06, pceqh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for EQual Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x07, pminh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MINimum Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pceqb, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Compare for EQual Byte - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, padduw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, psubuw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pextuw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Upper from Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, padduh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, psubuh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x16, pextuh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Upper from Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, paddub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ADD Unsigned saturation Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, psubub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel SUBtract Unsigned saturation Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pextub, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXTend Upper from Byte -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, qfsrv, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Quadword Funnel Shift Right Variable diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc deleted file mode 100644 index a7cd357f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_2.inc +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | | |function | MMI2 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 |PMADDW | --- |PSLLVW |PSRLVW | -001 |PMSUBW | --- | --- | --- | -010 |PMFHI |PMFLO |PINTH | --- | -011 |PMULTW |PDIVW |PCPYLD | --- | -100 |PMADDH |PHMADH | PAND | PXOR | -101 |PMSUBH |PHMSBH | --- | --- | -110 | --- | --- | PEXEH | PREVH | -111 |PMULTH |PDIVBW | PEXEW |PROT3W | - hi |-------|-------|-------|-------| -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, pmaddw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-ADD Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x02, psllvw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Shift Left Logical Variable Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, psrlvw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Shift Right Logical Variable Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x04, pmsubw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-SUBtract Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, pmfhi, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Parallel Move From HI register -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, pmflo, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Parallel Move From LO register -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pinth, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel INTerleave Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, pmultw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MULTiply Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, pdivw, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // Parallel DIVide Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, pcpyld, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel CoPY Lower Doubleword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x10, pmaddh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-ADD Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x11, phmadh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Horizontal Multiply-ADd Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, pand, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel AND -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, pxor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel eXclusive OR - -RABBITIZER_DEF_INSTR_ID(r5900, 0x14, pmsubh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-SUBtract Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x15, phmsbh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Horizontal Multiply-Subtract Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pexeh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Even Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, prevh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel REVerse Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1C, pmulth, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1D, pdivbw, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel DIVide Broadcast Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pexew, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Even Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, prot3w, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel ROTate 3 Words left diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc deleted file mode 100644 index 21edadd5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_mmi_3.inc +++ /dev/null @@ -1,37 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | | |function | MMI3 | - ------6----------------------------------------------------6----- - |---00--|---01--|---10--|---11--| lo -000 |PMADDUW| --- | --- |PSRAVW | -001 | --- | --- | --- | --- | -010 |PMTHI | PMTLO |PINTEH | --- | -011 |PMULTUW| PDIVUW|PCPYUD | --- | -100 | --- | --- | POR | PNOR | -101 | --- | --- | --- | --- | -110 | --- | --- | PEXCH | PCPYH | -111 | --- | --- | PEXCW | --- | - hi |-------|-------|-------|-------| -*/ - -RABBITIZER_DEF_INSTR_ID(r5900, 0x00, pmadduw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Multiply-ADD Unsigned Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x03, psravw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_rs}, .modifiesRd=true) // Parallel Shift Right Arithmetic Variable Word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x08, pmthi, .operands={RAB_OPERAND_cpu_rs}) // Parallel Move To HI register -RABBITIZER_DEF_INSTR_ID(r5900, 0x09, pmtlo, .operands={RAB_OPERAND_cpu_rs}) // Parallel Move To LO register -RABBITIZER_DEF_INSTR_ID(r5900, 0x0A, pinteh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel INTerleave Even Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x0C, pmultuw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel MULTiply Unsigned Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0D, pdivuw, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}) // Prallel DIVide Unsigned Word -RABBITIZER_DEF_INSTR_ID(r5900, 0x0E, pcpyud, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel CoPY Upper Doubleword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x12, por, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel OR -RABBITIZER_DEF_INSTR_ID(r5900, 0x13, pnor, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel Not OR - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1A, pexch, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Center Halfword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1B, pcpyh, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel CoPY Halfword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, pexcw, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rt}, .modifiesRd=true) // Parallel EXchange Center Word diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc deleted file mode 100644 index d5bd5c23..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_normal.inc +++ /dev/null @@ -1,31 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26---------------------------------------------------0 - | opcode | | - ------6---------------------------------------------------------- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | *1 | *2 | J | JAL | BEQ | BNE | BLEZ | BGTZ | -001 | ADDI | ADDIU | SLTI | SLTIU | ANDI | ORI | XORI | LUI | -010 | *3 | *4 | *5 | --- | BEQL | BNEL | BLEZL | BGTZL | -011 | DADDI |DADDIU | LDL | LDR | *6 | --- | LQ | SQ | -100 | LB | LH | LWL | LW | LBU | LHU | LWR | LWU | -101 | SB | SH | SWL | SW | SDL | SDR | SWR | CACHE | -110 | --- | LWC1 | --- | PREF | --- | --- | LQC2 | LD | -111 | --- | SWC1 | --- | --- | --- | --- | SQC2 | SD | - hi |-------|-------|-------|-------|-------|-------|-------|-------| - *1 = SPECIAL, see SPECIAL list *2 = REGIMM, see REGIMM list - *3 = COP0 *4 = COP1 - *5 = COP2 *6 = MMI table -*/ - -// The other instructions are implemented using the main CPU table - - -RABBITIZER_DEF_INSTR_ID(r5900, 0x1E, lq, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true) // Load Quadword -RABBITIZER_DEF_INSTR_ID(r5900, 0x1F, sq, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_cpu_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true) // Store Quadword - -RABBITIZER_DEF_INSTR_ID(r5900, 0x36, lqc2, .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .canBeLo=true, .doesDereference=true, .doesLoad=true) - -RABBITIZER_DEF_INSTR_ID(r5900, 0x3E, sqc2, .operands={RAB_OPERAND_r5900_vft, RAB_OPERAND_cpu_immediate_base}, .canBeLo=true, .doesDereference=true, .doesStore=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc deleted file mode 100644 index c1f27a2a..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_regimm.inc +++ /dev/null @@ -1,20 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26----------20-------16------------------------------0 - | = REGIMM | | rt | | - ------6---------------------5------------------------------------ - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo - 00 | BLTZ | BGEZ | BLTZL | BGEZL | --- | --- | --- | --- | - 01 | TGEI | TGEIU | TLTI | TLTIU | TEQI | --- | TNEI | --- | - 10 | BLTZAL| BGEZAL|BLTZALL|BGEZALL| --- | --- | --- | --- | - 11 | MTSAB | MTSAH | --- | --- | --- | --- | --- | --- | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mtsab, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM) -RABBITIZER_DEF_INSTR_ID(r5900, 0x19, mtsah, .operands={RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc deleted file mode 100644 index 22e1bb73..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/r5900/r5900_special.inc +++ /dev/null @@ -1,27 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/* - 31---------26------------------------------------------5--------0 - | = SPECIAL | | function| - ------6----------------------------------------------------6----- - |--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo -000 | SLL | --- | SRL | SRA | SLLV | --- | SRLV | SRAV | -001 | JR | JALR | MOVZ | MOVN |SYSCALL| BREAK | --- | SYNC | -010 | MFHI | MTHI | MFLO | MTLO | DSLLV | --- | DSRLV | DSRAV | -011 | MULT | MULTU | DIV | DIVU | ---- | --- | ---- | ----- | -100 | ADD | ADDU | SUB | SUBU | AND | OR | XOR | NOR | -101 | MFSA | MTSA | SLT | SLTU | DADD | DADDU | DSUB | DSUBU | -110 | TGE | TGEU | TLT | TLTU | TEQ | --- | TNE | --- | -111 | DSLL | --- | DSRL | DSRA |DSLL32 | --- |DSRL32 |DSRA32 | - hi |-------|-------|-------|-------|-------|-------|-------|-------| -*/ - -// The other instructions are implemented using the main CPU table - -RABBITIZER_DEF_INSTR_ID_ALTNAME(r5900, -0x0F, sync_p, sync.p, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_II) // Sync - -RABBITIZER_DEF_INSTR_ID(r5900, 0x18, mult, .operands={RAB_OPERAND_cpu_rd, RAB_OPERAND_cpu_rs, RAB_OPERAND_cpu_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MULTtiply word - -RABBITIZER_DEF_INSTR_ID(r5900, 0x28, mfsa, .operands={RAB_OPERAND_cpu_rd}, .modifiesRd=true) // Move From Shift Amount register -RABBITIZER_DEF_INSTR_ID(r5900, 0x29, mtsa, .operands={RAB_OPERAND_cpu_rs}) // Move To Shift Amount register diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc deleted file mode 100644 index c6c7d0ea..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop0.inc +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rt, cop0d -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, mfc0, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .modifiesRt=true, .notEmitedByCompilers=true) // Move word From CP0 -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, mtc0, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_cop0d}, .instrType=RABBITIZER_INSTR_TYPE_UNKNOWN, .notEmitedByCompilers=true) // Move word to CP0 diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc deleted file mode 100644 index 344891db..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2.inc +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP cop2t, vd[index] -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, mfc2, .operands={RAB_OPERAND_rsp_cop2t, RAB_OPERAND_rsp_vs_index}, .modifiesRt=true) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, mtc2, .operands={RAB_OPERAND_rsp_cop2t, RAB_OPERAND_rsp_vs_index}) - -// OP rt, cop2cd -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, cfc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_rsp_cop2cd}, .modifiesRt=true) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, ctc2, .operands={RAB_OPERAND_cpu_rt, RAB_OPERAND_rsp_cop2cd}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc deleted file mode 100644 index 4a927a59..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_cop2_vu.inc +++ /dev/null @@ -1,53 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP vd, vs, vt[elementhigh] -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, vmulf, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, vmulu, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, vrndp, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, vmulq, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, vmudl, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, vmudm, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, vmudn, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, vmudh, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, vmacf, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, vmacu, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, vrndn, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, vmacq, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0C, vmadl, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, vmadm, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0E, vmadn, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0F, vmadh, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x10, vadd, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x11, vsub, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x13, vabs, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x14, vaddc, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x15, vsubc, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x1D, vsar, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x28, vand, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x29, vnand, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2A, vor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, vnor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2C, vxor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x2D, vnxor, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) - -RABBITIZER_DEF_INSTR_ID(rsp, 0x20, vlt, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x21, veq, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x22, vne, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x23, vge, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x24, vcl, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x25, vch, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x26, vcr, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x27, vmrg, .operands={RAB_OPERAND_rsp_vd, RAB_OPERAND_rsp_vs, RAB_OPERAND_rsp_vt_elementhigh}) - -// OP vd[de], vt[elementhigh] -RABBITIZER_DEF_INSTR_ID(rsp, 0x30, vrcp, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x31, vrcpl, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) // operands may be wrong -RABBITIZER_DEF_INSTR_ID(rsp, 0x32, vrcph, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x33, vmov, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x34, vrsq, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x35, vrsql, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x36, vrsqh, .operands={RAB_OPERAND_rsp_vd_de, RAB_OPERAND_rsp_vt_elementhigh}) - -// OP -RABBITIZER_DEF_INSTR_ID(rsp, 0x37, vnop, .operands={0}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc deleted file mode 100644 index be73f5a0..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal.inc +++ /dev/null @@ -1,53 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP LABEL -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, j, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true) // Jump -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, jal, .operands={RAB_OPERAND_cpu_label}, .instrType=RABBITIZER_INSTR_TYPE_J, .isJump=true, .doesLink=true) // Jump And Link - -// OP rs, rt, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, beq, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on EQual -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, bne, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, blez, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Less than or Equal to Zero -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, bgtz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater Than Zero - -// OP rt, rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, addi, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .notEmitedByCompilers=true, .canBeLo=true) // Add Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, addiu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true) // Add Immediate Unsigned Word -RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, slti, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true) // Set on Less Than Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, sltiu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true) // Set on Less Than Immediate Unsigned -RABBITIZER_DEF_INSTR_ID(rsp, 0x0C, andi, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true) // And Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, ori, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeLo=true) // Or Immediate -RABBITIZER_DEF_INSTR_ID(rsp, 0x0E, xori, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true) // eXclusive OR Immediate - -// OP rt, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x0F, lui, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_immediate}, .instrType=RABBITIZER_INSTR_TYPE_I, .isUnsigned=true, .modifiesRt=true, .canBeHi=true) // Load Upper Immediate - -// OP rt, IMM(base) -RABBITIZER_DEF_INSTR_ID(rsp, 0x20, lb, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte -RABBITIZER_DEF_INSTR_ID(rsp, 0x21, lh, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword -RABBITIZER_DEF_INSTR_ID(rsp, 0x23, lw, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word -RABBITIZER_DEF_INSTR_ID(rsp, 0x24, lbu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Byte Insigned -RABBITIZER_DEF_INSTR_ID(rsp, 0x25, lhu, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Halfword Unsigned -RABBITIZER_DEF_INSTR_ID(rsp, 0x28, sb, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Byte -RABBITIZER_DEF_INSTR_ID(rsp, 0x29, sh, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Halfword -RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, sw, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word -RABBITIZER_DEF_INSTR_ID(rsp, 0x33, pref, .operands={RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .modifiesRt=true, .canBeLo=true, .doesDereference=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_IV) // Prefetch - -RABBITIZER_DEF_INSTR_ID(rsp, 0x2F, cache, .operands={RAB_OPERAND_cpu_op, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .notEmitedByCompilers=true) // Cache - -// OP ft, IMM(base) -RABBITIZER_DEF_INSTR_ID(rsp, 0x31, lwc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesLoad=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Load Word to Coprocessor z -RABBITIZER_DEF_INSTR_ID(rsp, 0x39, swc1, .operands={RAB_OPERAND_cpu_ft, RAB_OPERAND_rsp_immediate_base}, .instrType=RABBITIZER_INSTR_TYPE_I, .isFloat=true, .canBeLo=true, .doesDereference=true, .doesStore=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Store Word from Coprocessor z - - -// Pseudo-Instruction Unique IDs - -// OP IMM -RABBITIZER_DEF_INSTR_ID(rsp, -0x03, b, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch (unconditional) - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, -0x04, beqz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on EQual Zero -RABBITIZER_DEF_INSTR_ID(rsp, -0x05, bnez, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Not Equal Zero diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc deleted file mode 100644 index 4440fb09..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_lwc2.inc +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP vt[elementlow], offset(vs) -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, lbv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, lsv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, llv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, ldv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, lqv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, lrv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, lpv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, luv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, lhv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, lfv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, ltv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc deleted file mode 100644 index 996c69f2..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_normal_swc2.inc +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP vt[elementlow], offset(vs) -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, sbv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, ssv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, slv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, sdv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, sqv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x05, srv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, spv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, suv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, shv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, sfv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, stv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) - -RABBITIZER_DEF_INSTR_ID(rsp, -0x07, swv, .operands={RAB_OPERAND_rsp_vt_elementlow, RAB_OPERAND_rsp_offset_rs}) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc deleted file mode 100644 index c2132f94..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_regimm.inc +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rs, IMM -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, bltz, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Less Than Zero -RABBITIZER_DEF_INSTR_ID(rsp, 0x01, bgez, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true) // Branch on Greater than or Equal to Zero - -RABBITIZER_DEF_INSTR_ID(rsp, 0x10, bltzal, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Less Than Zero and Link -RABBITIZER_DEF_INSTR_ID(rsp, 0x11, bgezal, .operands={RAB_OPERAND_rsp_rs, RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true) // Branch on Greater Than or Equal to Zero and Link - - -// Pseudo-Instruction Unique IDs - -RABBITIZER_DEF_INSTR_ID(rsp, -0x11, bal, .operands={RAB_OPERAND_cpu_branch_target_label}, .instrType=RABBITIZER_INSTR_TYPE_REGIMM, .isBranch=true, .doesLink=true, .isPseudo=true, .architectureVersion=RABBITIZER_ARCHVERSION_MIPS_I) // Branch and Link diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc deleted file mode 100644 index 9f12212d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/instr_id/rsp/rsp_special.inc +++ /dev/null @@ -1,49 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -// OP rd, rt, sa -RABBITIZER_DEF_INSTR_ID(rsp, 0x00, sll, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Left Logical -RABBITIZER_DEF_INSTR_ID(rsp, 0x02, srl, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Logical -RABBITIZER_DEF_INSTR_ID(rsp, 0x03, sra, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_cpu_sa}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Arithmetic - -// OP rd, rt, rs -RABBITIZER_DEF_INSTR_ID(rsp, 0x04, sllv, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Left Logical Variable -RABBITIZER_DEF_INSTR_ID(rsp, 0x06, srlv, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Logical Variable -RABBITIZER_DEF_INSTR_ID(rsp, 0x07, srav, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Shift word Right Arithmetic Variable - -// OP rs -RABBITIZER_DEF_INSTR_ID(rsp, 0x08, jr, .operands={RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true) // Jump Register -RABBITIZER_DEF_INSTR_ID(rsp, 0x09, jalr, .operands={RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true) // Jump And Link Register - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID_ALTNAME(rsp, -0x09, jalr_rd, jalr, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .isJump=true, .modifiesRd=true, .doesLink=true) // Jump And Link Register // Special case for rd != 31 - -// OP rd, rs, rt -RABBITIZER_DEF_INSTR_ID(rsp, 0x0A, movz, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MOVe conditional on Zero -RABBITIZER_DEF_INSTR_ID(rsp, 0x0B, movn, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // MOVe conditional on Not zero - -RABBITIZER_DEF_INSTR_ID(rsp, 0x20, add, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true, .notEmitedByCompilers=true) // ADD word -RABBITIZER_DEF_INSTR_ID(rsp, 0x21, addu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // ADD Unsigned word -RABBITIZER_DEF_INSTR_ID(rsp, 0x22, sub, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Subtract word -RABBITIZER_DEF_INSTR_ID(rsp, 0x23, subu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // SUBtract Unsigned word -RABBITIZER_DEF_INSTR_ID(rsp, 0x24, and, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // AND -RABBITIZER_DEF_INSTR_ID(rsp, 0x25, or, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // OR -RABBITIZER_DEF_INSTR_ID(rsp, 0x26, xor, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // eXclusive OR -RABBITIZER_DEF_INSTR_ID(rsp, 0x27, nor, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Not OR -RABBITIZER_DEF_INSTR_ID(rsp, 0x2A, slt, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Set on Less Than -RABBITIZER_DEF_INSTR_ID(rsp, 0x2B, sltu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Set on Less Than Unsigned - -// OP code -RABBITIZER_DEF_INSTR_ID(rsp, 0x0D, break, .operands={RAB_OPERAND_cpu_code}, .instrType=RABBITIZER_INSTR_TYPE_R) // Break - - -// Pseudo-Instruction Unique IDs -// OP -RABBITIZER_DEF_INSTR_ID(rsp, -0x01, nop, .operands={0}, .instrType=RABBITIZER_INSTR_TYPE_R) // No OPeration - -// OP rd, rs -RABBITIZER_DEF_INSTR_ID(rsp, -0x25, move, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Move -RABBITIZER_DEF_INSTR_ID(rsp, -0x27, not, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rs}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) // Not - -// OP rd, rt -RABBITIZER_DEF_INSTR_ID(rsp, -0x23, negu, .operands={RAB_OPERAND_rsp_rd, RAB_OPERAND_rsp_rt}, .instrType=RABBITIZER_INSTR_TYPE_R, .modifiesRd=true) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc deleted file mode 100644 index bb863366..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_cpu.inc +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RAB_DEF_OPERAND(cpu, rs) -RAB_DEF_OPERAND(cpu, rt) -RAB_DEF_OPERAND(cpu, rd) -RAB_DEF_OPERAND(cpu, sa) -RAB_DEF_OPERAND(cpu, zero) // $zero -// RAB_DEF_OPERAND(cpu, function) -RAB_DEF_OPERAND(cpu, cop0d) -RAB_DEF_OPERAND(cpu, fs) -RAB_DEF_OPERAND(cpu, ft) -RAB_DEF_OPERAND(cpu, fd) -RAB_DEF_OPERAND(cpu, cop1cs) // Coprocessor 1 control fs -RAB_DEF_OPERAND(cpu, cop2t) -RAB_DEF_OPERAND(cpu, op) -RAB_DEF_OPERAND(cpu, code) -RAB_DEF_OPERAND(cpu, code_lower) -RAB_DEF_OPERAND(cpu, copraw) -RAB_DEF_OPERAND(cpu, label) -RAB_DEF_OPERAND(cpu, immediate) -RAB_DEF_OPERAND(cpu, branch_target_label) - -// composed/aliased operands -RAB_DEF_OPERAND(cpu, immediate_base) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc deleted file mode 100644 index 36cb6efc..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_r5900.inc +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RAB_DEF_OPERAND(r5900, I) -RAB_DEF_OPERAND(r5900, Q) -RAB_DEF_OPERAND(r5900, R) -RAB_DEF_OPERAND(r5900, ACC) -RAB_DEF_OPERAND(r5900, ACCxyzw) -RAB_DEF_OPERAND(r5900, vfs) -RAB_DEF_OPERAND(r5900, vft) -RAB_DEF_OPERAND(r5900, vfd) -RAB_DEF_OPERAND(r5900, vfsxyzw) -RAB_DEF_OPERAND(r5900, vftxyzw) -RAB_DEF_OPERAND(r5900, vfdxyzw) -RAB_DEF_OPERAND(r5900, vfsn) -RAB_DEF_OPERAND(r5900, vftn) -RAB_DEF_OPERAND(r5900, vfdn) -RAB_DEF_OPERAND(r5900, vfsl) -RAB_DEF_OPERAND(r5900, vftl) -RAB_DEF_OPERAND(r5900, vfdl) -RAB_DEF_OPERAND(r5900, vfsm) -RAB_DEF_OPERAND(r5900, vftm) -RAB_DEF_OPERAND(r5900, vfdm) -RAB_DEF_OPERAND(r5900, vis) -RAB_DEF_OPERAND(r5900, vit) -RAB_DEF_OPERAND(r5900, vid) -RAB_DEF_OPERAND(r5900, vis_predecr) -RAB_DEF_OPERAND(r5900, vit_predecr) -RAB_DEF_OPERAND(r5900, vid_predecr) -RAB_DEF_OPERAND(r5900, vis_postincr) -RAB_DEF_OPERAND(r5900, vit_postincr) -RAB_DEF_OPERAND(r5900, vid_postincr) -RAB_DEF_OPERAND(r5900, immediate5) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc deleted file mode 100644 index 7bae435d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/operands/RabbitizerOperandType_rsp.inc +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RAB_DEF_OPERAND(rsp, rs) -RAB_DEF_OPERAND(rsp, rt) -RAB_DEF_OPERAND(rsp, rd) -RAB_DEF_OPERAND(rsp, cop0d) -RAB_DEF_OPERAND(rsp, cop2t) -RAB_DEF_OPERAND(rsp, cop2cd) // Coprocessor 2 control rd -RAB_DEF_OPERAND(rsp, vs) -RAB_DEF_OPERAND(rsp, vt) -RAB_DEF_OPERAND(rsp, vd) -// RAB_DEF_OPERAND(rsp, elementhigh) -// RAB_DEF_OPERAND(rsp, elementlow) -// RAB_DEF_OPERAND(rsp, index) -// RAB_DEF_OPERAND(rsp, offset) - -// composed/aliased operands -RAB_DEF_OPERAND(rsp, vt_elementhigh) -RAB_DEF_OPERAND(rsp, vt_elementlow) -RAB_DEF_OPERAND(rsp, vd_de) -RAB_DEF_OPERAND(rsp, vs_index) -RAB_DEF_OPERAND(rsp, offset_rs) -RAB_DEF_OPERAND(rsp, immediate_base) diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc deleted file mode 100644 index 9d3d63d2..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop0.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG_NODOLLAR(COP0, Index, 0), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Random, 1), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EntryLo0, 2), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EntryLo1, 3), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Context, 4), - RABBITIZER_DEF_REG_NODOLLAR(COP0, PageMask, 5), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Wired, 6), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved07, 7), - RABBITIZER_DEF_REG_NODOLLAR(COP0, BadVaddr, 8), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Count, 9), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EntryHi, 10), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Compare, 11), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Status, 12), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Cause, 13), - RABBITIZER_DEF_REG_NODOLLAR(COP0, EPC, 14), - RABBITIZER_DEF_REG_NODOLLAR(COP0, PRevID, 15), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Config, 16), - RABBITIZER_DEF_REG_NODOLLAR(COP0, LLAddr, 17), - RABBITIZER_DEF_REG_NODOLLAR(COP0, WatchLo, 18), - RABBITIZER_DEF_REG_NODOLLAR(COP0, WatchHi, 19), - RABBITIZER_DEF_REG_NODOLLAR(COP0, XContext, 20), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved21, 21), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved22, 22), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved23, 23), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved24, 24), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved25, 25), - RABBITIZER_DEF_REG_NODOLLAR(COP0, PErr, 26), - RABBITIZER_DEF_REG_NODOLLAR(COP0, CacheErr, 27), - RABBITIZER_DEF_REG_NODOLLAR(COP0, TagLo, 28), - RABBITIZER_DEF_REG_NODOLLAR(COP0, TagHi, 29), - RABBITIZER_DEF_REG_NODOLLAR(COP0, ErrorEPC, 30), - RABBITIZER_DEF_REG_NODOLLAR(COP0, Reserved31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc deleted file mode 100644 index cad6bde5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1Control.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_CONTROL, 0, 0), - RABBITIZER_DEF_REG(COP1_CONTROL, 1, 1), - RABBITIZER_DEF_REG(COP1_CONTROL, 2, 2), - RABBITIZER_DEF_REG(COP1_CONTROL, 3, 3), - RABBITIZER_DEF_REG(COP1_CONTROL, 4, 4), - RABBITIZER_DEF_REG(COP1_CONTROL, 5, 5), - RABBITIZER_DEF_REG(COP1_CONTROL, 6, 6), - RABBITIZER_DEF_REG(COP1_CONTROL, 7, 7), - RABBITIZER_DEF_REG(COP1_CONTROL, 8, 8), - RABBITIZER_DEF_REG(COP1_CONTROL, 9, 9), - RABBITIZER_DEF_REG(COP1_CONTROL, 10, 10), - RABBITIZER_DEF_REG(COP1_CONTROL, 11, 11), - RABBITIZER_DEF_REG(COP1_CONTROL, 12, 12), - RABBITIZER_DEF_REG(COP1_CONTROL, 13, 13), - RABBITIZER_DEF_REG(COP1_CONTROL, 14, 14), - RABBITIZER_DEF_REG(COP1_CONTROL, 15, 15), - RABBITIZER_DEF_REG(COP1_CONTROL, 16, 16), - RABBITIZER_DEF_REG(COP1_CONTROL, 17, 17), - RABBITIZER_DEF_REG(COP1_CONTROL, 18, 18), - RABBITIZER_DEF_REG(COP1_CONTROL, 19, 19), - RABBITIZER_DEF_REG(COP1_CONTROL, 20, 20), - RABBITIZER_DEF_REG(COP1_CONTROL, 21, 21), - RABBITIZER_DEF_REG(COP1_CONTROL, 22, 22), - RABBITIZER_DEF_REG(COP1_CONTROL, 23, 23), - RABBITIZER_DEF_REG(COP1_CONTROL, 24, 24), - RABBITIZER_DEF_REG(COP1_CONTROL, 25, 25), - RABBITIZER_DEF_REG(COP1_CONTROL, 26, 26), - RABBITIZER_DEF_REG(COP1_CONTROL, 27, 27), - RABBITIZER_DEF_REG(COP1_CONTROL, 28, 28), - RABBITIZER_DEF_REG(COP1_CONTROL, 29, 29), - RABBITIZER_DEF_REG(COP1_CONTROL, 30, 30), - RABBITIZER_DEF_REG(COP1_CONTROL, FpcCsr, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc deleted file mode 100644 index affe4948..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_N32, fv0, f0), - RABBITIZER_DEF_REG(COP1_N32, ft14, f1), - RABBITIZER_DEF_REG(COP1_N32, fv1, f2), - RABBITIZER_DEF_REG(COP1_N32, ft15, f3), - RABBITIZER_DEF_REG(COP1_N32, ft0, f4), - RABBITIZER_DEF_REG(COP1_N32, ft1, f5), - RABBITIZER_DEF_REG(COP1_N32, ft2, f6), - RABBITIZER_DEF_REG(COP1_N32, ft3, f7), - RABBITIZER_DEF_REG(COP1_N32, ft4, f8), - RABBITIZER_DEF_REG(COP1_N32, ft5, f9), - RABBITIZER_DEF_REG(COP1_N32, ft6, f10), - RABBITIZER_DEF_REG(COP1_N32, ft7, f11), - RABBITIZER_DEF_REG(COP1_N32, fa0, f12), - RABBITIZER_DEF_REG(COP1_N32, fa1, f13), - RABBITIZER_DEF_REG(COP1_N32, fa2, f14), - RABBITIZER_DEF_REG(COP1_N32, fa3, f15), - RABBITIZER_DEF_REG(COP1_N32, fa4, f16), - RABBITIZER_DEF_REG(COP1_N32, fa5, f17), - RABBITIZER_DEF_REG(COP1_N32, fa6, f18), - RABBITIZER_DEF_REG(COP1_N32, fa7, f19), - RABBITIZER_DEF_REG(COP1_N32, fs0, f20), - RABBITIZER_DEF_REG(COP1_N32, ft8, f21), - RABBITIZER_DEF_REG(COP1_N32, fs1, f22), - RABBITIZER_DEF_REG(COP1_N32, ft9, f23), - RABBITIZER_DEF_REG(COP1_N32, fs2, f24), - RABBITIZER_DEF_REG(COP1_N32, ft10, f25), - RABBITIZER_DEF_REG(COP1_N32, fs3, f26), - RABBITIZER_DEF_REG(COP1_N32, ft11, f27), - RABBITIZER_DEF_REG(COP1_N32, fs4, f28), - RABBITIZER_DEF_REG(COP1_N32, ft12, f29), - RABBITIZER_DEF_REG(COP1_N32, fs5, f30), - RABBITIZER_DEF_REG(COP1_N32, ft13, f31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc deleted file mode 100644 index 1388c93d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1N64.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_N64, fv0, f0), - RABBITIZER_DEF_REG(COP1_N64, ft12, f1), - RABBITIZER_DEF_REG(COP1_N64, fv1, f2), - RABBITIZER_DEF_REG(COP1_N64, ft13, f3), - RABBITIZER_DEF_REG(COP1_N64, ft0, f4), - RABBITIZER_DEF_REG(COP1_N64, ft1, f5), - RABBITIZER_DEF_REG(COP1_N64, ft2, f6), - RABBITIZER_DEF_REG(COP1_N64, ft3, f7), - RABBITIZER_DEF_REG(COP1_N64, ft4, f8), - RABBITIZER_DEF_REG(COP1_N64, ft5, f9), - RABBITIZER_DEF_REG(COP1_N64, ft6, f10), - RABBITIZER_DEF_REG(COP1_N64, ft7, f11), - RABBITIZER_DEF_REG(COP1_N64, fa0, f12), - RABBITIZER_DEF_REG(COP1_N64, fa1, f13), - RABBITIZER_DEF_REG(COP1_N64, fa2, f14), - RABBITIZER_DEF_REG(COP1_N64, fa3, f15), - RABBITIZER_DEF_REG(COP1_N64, fa4, f16), - RABBITIZER_DEF_REG(COP1_N64, fa5, f17), - RABBITIZER_DEF_REG(COP1_N64, fa6, f18), - RABBITIZER_DEF_REG(COP1_N64, fa7, f19), - RABBITIZER_DEF_REG(COP1_N64, ft8, f20), - RABBITIZER_DEF_REG(COP1_N64, ft9, f21), - RABBITIZER_DEF_REG(COP1_N64, ft10, f22), - RABBITIZER_DEF_REG(COP1_N64, ft11, f23), - RABBITIZER_DEF_REG(COP1_N64, fs0, f24), - RABBITIZER_DEF_REG(COP1_N64, fs1, f25), - RABBITIZER_DEF_REG(COP1_N64, fs2, f26), - RABBITIZER_DEF_REG(COP1_N64, fs3, f27), - RABBITIZER_DEF_REG(COP1_N64, fs4, f28), - RABBITIZER_DEF_REG(COP1_N64, fs5, f29), - RABBITIZER_DEF_REG(COP1_N64, fs6, f30), - RABBITIZER_DEF_REG(COP1_N64, fs7, f31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc deleted file mode 100644 index 44ba53e1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop1O32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP1_O32, fv0, f0), - RABBITIZER_DEF_REG(COP1_O32, fv0f, f1), - RABBITIZER_DEF_REG(COP1_O32, fv1, f2), - RABBITIZER_DEF_REG(COP1_O32, fv1f, f3), - RABBITIZER_DEF_REG(COP1_O32, ft0, f4), - RABBITIZER_DEF_REG(COP1_O32, ft0f, f5), - RABBITIZER_DEF_REG(COP1_O32, ft1, f6), - RABBITIZER_DEF_REG(COP1_O32, ft1f, f7), - RABBITIZER_DEF_REG(COP1_O32, ft2, f8), - RABBITIZER_DEF_REG(COP1_O32, ft2f, f9), - RABBITIZER_DEF_REG(COP1_O32, ft3, f10), - RABBITIZER_DEF_REG(COP1_O32, ft3f, f11), - RABBITIZER_DEF_REG(COP1_O32, fa0, f12), - RABBITIZER_DEF_REG(COP1_O32, fa0f, f13), - RABBITIZER_DEF_REG(COP1_O32, fa1, f14), - RABBITIZER_DEF_REG(COP1_O32, fa1f, f15), - RABBITIZER_DEF_REG(COP1_O32, ft4, f16), - RABBITIZER_DEF_REG(COP1_O32, ft4f, f17), - RABBITIZER_DEF_REG(COP1_O32, ft5, f18), - RABBITIZER_DEF_REG(COP1_O32, ft5f, f19), - RABBITIZER_DEF_REG(COP1_O32, fs0, f20), - RABBITIZER_DEF_REG(COP1_O32, fs0f, f21), - RABBITIZER_DEF_REG(COP1_O32, fs1, f22), - RABBITIZER_DEF_REG(COP1_O32, fs1f, f23), - RABBITIZER_DEF_REG(COP1_O32, fs2, f24), - RABBITIZER_DEF_REG(COP1_O32, fs2f, f25), - RABBITIZER_DEF_REG(COP1_O32, fs3, f26), - RABBITIZER_DEF_REG(COP1_O32, fs3f, f27), - RABBITIZER_DEF_REG(COP1_O32, fs4, f28), - RABBITIZER_DEF_REG(COP1_O32, fs4f, f29), - RABBITIZER_DEF_REG(COP1_O32, fs5, f30), - RABBITIZER_DEF_REG(COP1_O32, fs5f, f31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc deleted file mode 100644 index 84e40f32..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_Cop2.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(COP2, 0, 0), - RABBITIZER_DEF_REG(COP2, 1, 1), - RABBITIZER_DEF_REG(COP2, 2, 2), - RABBITIZER_DEF_REG(COP2, 3, 3), - RABBITIZER_DEF_REG(COP2, 4, 4), - RABBITIZER_DEF_REG(COP2, 5, 5), - RABBITIZER_DEF_REG(COP2, 6, 6), - RABBITIZER_DEF_REG(COP2, 7, 7), - RABBITIZER_DEF_REG(COP2, 8, 8), - RABBITIZER_DEF_REG(COP2, 9, 9), - RABBITIZER_DEF_REG(COP2, 10, 10), - RABBITIZER_DEF_REG(COP2, 11, 11), - RABBITIZER_DEF_REG(COP2, 12, 12), - RABBITIZER_DEF_REG(COP2, 13, 13), - RABBITIZER_DEF_REG(COP2, 14, 14), - RABBITIZER_DEF_REG(COP2, 15, 15), - RABBITIZER_DEF_REG(COP2, 16, 16), - RABBITIZER_DEF_REG(COP2, 17, 17), - RABBITIZER_DEF_REG(COP2, 18, 18), - RABBITIZER_DEF_REG(COP2, 19, 19), - RABBITIZER_DEF_REG(COP2, 20, 20), - RABBITIZER_DEF_REG(COP2, 21, 21), - RABBITIZER_DEF_REG(COP2, 22, 22), - RABBITIZER_DEF_REG(COP2, 23, 23), - RABBITIZER_DEF_REG(COP2, 24, 24), - RABBITIZER_DEF_REG(COP2, 25, 25), - RABBITIZER_DEF_REG(COP2, 26, 26), - RABBITIZER_DEF_REG(COP2, 27, 27), - RABBITIZER_DEF_REG(COP2, 28, 28), - RABBITIZER_DEF_REG(COP2, 29, 29), - RABBITIZER_DEF_REG(COP2, 30, 30), - RABBITIZER_DEF_REG(COP2, 31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc deleted file mode 100644 index a937136b..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprN32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(GPR_N32, zero, 0), - RABBITIZER_DEF_REG(GPR_N32, at, 1), - RABBITIZER_DEF_REG(GPR_N32, v0, 2), - RABBITIZER_DEF_REG(GPR_N32, v1, 3), - RABBITIZER_DEF_REG(GPR_N32, a0, 4), - RABBITIZER_DEF_REG(GPR_N32, a1, 5), - RABBITIZER_DEF_REG(GPR_N32, a2, 6), - RABBITIZER_DEF_REG(GPR_N32, a3, 7), - RABBITIZER_DEF_REG(GPR_N32, a4, 8), - RABBITIZER_DEF_REG(GPR_N32, a5, 9), - RABBITIZER_DEF_REG(GPR_N32, a6, 10), - RABBITIZER_DEF_REG(GPR_N32, a7, 11), - RABBITIZER_DEF_REG(GPR_N32, t0, 12), - RABBITIZER_DEF_REG(GPR_N32, t1, 13), - RABBITIZER_DEF_REG(GPR_N32, t2, 14), - RABBITIZER_DEF_REG(GPR_N32, t3, 15), - RABBITIZER_DEF_REG(GPR_N32, s0, 16), - RABBITIZER_DEF_REG(GPR_N32, s1, 17), - RABBITIZER_DEF_REG(GPR_N32, s2, 18), - RABBITIZER_DEF_REG(GPR_N32, s3, 19), - RABBITIZER_DEF_REG(GPR_N32, s4, 20), - RABBITIZER_DEF_REG(GPR_N32, s5, 21), - RABBITIZER_DEF_REG(GPR_N32, s6, 22), - RABBITIZER_DEF_REG(GPR_N32, s7, 23), - RABBITIZER_DEF_REG(GPR_N32, t8, 24), - RABBITIZER_DEF_REG(GPR_N32, t9, 25), - RABBITIZER_DEF_REG(GPR_N32, k0, 26), - RABBITIZER_DEF_REG(GPR_N32, k1, 27), - RABBITIZER_DEF_REG(GPR_N32, gp, 28), - RABBITIZER_DEF_REG(GPR_N32, sp, 29), - RABBITIZER_DEF_REG(GPR_N32, fp, 30), - RABBITIZER_DEF_REG(GPR_N32, ra, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc deleted file mode 100644 index 26685fe5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_GprO32.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(GPR_O32, zero, 0), - RABBITIZER_DEF_REG(GPR_O32, at, 1), - RABBITIZER_DEF_REG(GPR_O32, v0, 2), - RABBITIZER_DEF_REG(GPR_O32, v1, 3), - RABBITIZER_DEF_REG(GPR_O32, a0, 4), - RABBITIZER_DEF_REG(GPR_O32, a1, 5), - RABBITIZER_DEF_REG(GPR_O32, a2, 6), - RABBITIZER_DEF_REG(GPR_O32, a3, 7), - RABBITIZER_DEF_REG(GPR_O32, t0, 8), - RABBITIZER_DEF_REG(GPR_O32, t1, 9), - RABBITIZER_DEF_REG(GPR_O32, t2, 10), - RABBITIZER_DEF_REG(GPR_O32, t3, 11), - RABBITIZER_DEF_REG(GPR_O32, t4, 12), - RABBITIZER_DEF_REG(GPR_O32, t5, 13), - RABBITIZER_DEF_REG(GPR_O32, t6, 14), - RABBITIZER_DEF_REG(GPR_O32, t7, 15), - RABBITIZER_DEF_REG(GPR_O32, s0, 16), - RABBITIZER_DEF_REG(GPR_O32, s1, 17), - RABBITIZER_DEF_REG(GPR_O32, s2, 18), - RABBITIZER_DEF_REG(GPR_O32, s3, 19), - RABBITIZER_DEF_REG(GPR_O32, s4, 20), - RABBITIZER_DEF_REG(GPR_O32, s5, 21), - RABBITIZER_DEF_REG(GPR_O32, s6, 22), - RABBITIZER_DEF_REG(GPR_O32, s7, 23), - RABBITIZER_DEF_REG(GPR_O32, t8, 24), - RABBITIZER_DEF_REG(GPR_O32, t9, 25), - RABBITIZER_DEF_REG(GPR_O32, k0, 26), - RABBITIZER_DEF_REG(GPR_O32, k1, 27), - RABBITIZER_DEF_REG(GPR_O32, gp, 28), - RABBITIZER_DEF_REG(GPR_O32, sp, 29), - RABBITIZER_DEF_REG(GPR_O32, fp, 30), - RABBITIZER_DEF_REG(GPR_O32, ra, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc deleted file mode 100644 index afb88dd5..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VF.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_REG(R5900_VF, vf0, 0), -RABBITIZER_DEF_REG(R5900_VF, vf1, 1), -RABBITIZER_DEF_REG(R5900_VF, vf2, 2), -RABBITIZER_DEF_REG(R5900_VF, vf3, 3), -RABBITIZER_DEF_REG(R5900_VF, vf4, 4), -RABBITIZER_DEF_REG(R5900_VF, vf5, 5), -RABBITIZER_DEF_REG(R5900_VF, vf6, 6), -RABBITIZER_DEF_REG(R5900_VF, vf7, 7), -RABBITIZER_DEF_REG(R5900_VF, vf8, 8), -RABBITIZER_DEF_REG(R5900_VF, vf9, 9), -RABBITIZER_DEF_REG(R5900_VF, vf10, 10), -RABBITIZER_DEF_REG(R5900_VF, vf11, 11), -RABBITIZER_DEF_REG(R5900_VF, vf12, 12), -RABBITIZER_DEF_REG(R5900_VF, vf13, 13), -RABBITIZER_DEF_REG(R5900_VF, vf14, 14), -RABBITIZER_DEF_REG(R5900_VF, vf15, 15), -RABBITIZER_DEF_REG(R5900_VF, vf16, 16), -RABBITIZER_DEF_REG(R5900_VF, vf17, 17), -RABBITIZER_DEF_REG(R5900_VF, vf18, 18), -RABBITIZER_DEF_REG(R5900_VF, vf19, 19), -RABBITIZER_DEF_REG(R5900_VF, vf20, 20), -RABBITIZER_DEF_REG(R5900_VF, vf21, 21), -RABBITIZER_DEF_REG(R5900_VF, vf22, 22), -RABBITIZER_DEF_REG(R5900_VF, vf23, 23), -RABBITIZER_DEF_REG(R5900_VF, vf24, 24), -RABBITIZER_DEF_REG(R5900_VF, vf25, 25), -RABBITIZER_DEF_REG(R5900_VF, vf26, 26), -RABBITIZER_DEF_REG(R5900_VF, vf27, 27), -RABBITIZER_DEF_REG(R5900_VF, vf28, 28), -RABBITIZER_DEF_REG(R5900_VF, vf29, 29), -RABBITIZER_DEF_REG(R5900_VF, vf30, 30), -RABBITIZER_DEF_REG(R5900_VF, vf31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc deleted file mode 100644 index 3e8e9f82..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_R5900VI.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -RABBITIZER_DEF_REG(R5900_VI, vi0, 0), -RABBITIZER_DEF_REG(R5900_VI, vi1, 1), -RABBITIZER_DEF_REG(R5900_VI, vi2, 2), -RABBITIZER_DEF_REG(R5900_VI, vi3, 3), -RABBITIZER_DEF_REG(R5900_VI, vi4, 4), -RABBITIZER_DEF_REG(R5900_VI, vi5, 5), -RABBITIZER_DEF_REG(R5900_VI, vi6, 6), -RABBITIZER_DEF_REG(R5900_VI, vi7, 7), -RABBITIZER_DEF_REG(R5900_VI, vi8, 8), -RABBITIZER_DEF_REG(R5900_VI, vi9, 9), -RABBITIZER_DEF_REG(R5900_VI, vi10, 10), -RABBITIZER_DEF_REG(R5900_VI, vi11, 11), -RABBITIZER_DEF_REG(R5900_VI, vi12, 12), -RABBITIZER_DEF_REG(R5900_VI, vi13, 13), -RABBITIZER_DEF_REG(R5900_VI, vi14, 14), -RABBITIZER_DEF_REG(R5900_VI, vi15, 15), -RABBITIZER_DEF_REG(R5900_VI, vi16, 16), -RABBITIZER_DEF_REG(R5900_VI, vi17, 17), -RABBITIZER_DEF_REG(R5900_VI, vi18, 18), -RABBITIZER_DEF_REG(R5900_VI, vi19, 19), -RABBITIZER_DEF_REG(R5900_VI, vi20, 20), -RABBITIZER_DEF_REG(R5900_VI, vi21, 21), -RABBITIZER_DEF_REG(R5900_VI, vi22, 22), -RABBITIZER_DEF_REG(R5900_VI, vi23, 23), -RABBITIZER_DEF_REG(R5900_VI, vi24, 24), -RABBITIZER_DEF_REG(R5900_VI, vi25, 25), -RABBITIZER_DEF_REG(R5900_VI, vi26, 26), -RABBITIZER_DEF_REG(R5900_VI, vi27, 27), -RABBITIZER_DEF_REG(R5900_VI, vi28, 28), -RABBITIZER_DEF_REG(R5900_VI, vi29, 29), -RABBITIZER_DEF_REG(R5900_VI, vi30, 30), -RABBITIZER_DEF_REG(R5900_VI, vi31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc deleted file mode 100644 index fdac94d1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop0.inc +++ /dev/null @@ -1,19 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_MEM_ADDR, 0), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_DRAM_ADDR, 1), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_RD_LEN, 2), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_WR_LEN, 3), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_STATUS, 4), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_DMA_FULL, 5), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_DMA_BUSY, 6), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, SP_SEMAPHORE, 7), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_START, 8), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_END, 9), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_CURRENT, 10), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_STATUS, 11), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_CLOCK, 12), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_BUFBUSY, 13), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_PIPEBUSY, 14), - RABBITIZER_DEF_REG_NODOLLAR(RSP_COP0, DPC_TMEM, 15), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc deleted file mode 100644 index d22b673f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_COP2, 0, 0), - RABBITIZER_DEF_REG(RSP_COP2, 1, 1), - RABBITIZER_DEF_REG(RSP_COP2, 2, 2), - RABBITIZER_DEF_REG(RSP_COP2, 3, 3), - RABBITIZER_DEF_REG(RSP_COP2, 4, 4), - RABBITIZER_DEF_REG(RSP_COP2, 5, 5), - RABBITIZER_DEF_REG(RSP_COP2, 6, 6), - RABBITIZER_DEF_REG(RSP_COP2, 7, 7), - RABBITIZER_DEF_REG(RSP_COP2, 8, 8), - RABBITIZER_DEF_REG(RSP_COP2, 9, 9), - RABBITIZER_DEF_REG(RSP_COP2, 10, 10), - RABBITIZER_DEF_REG(RSP_COP2, 11, 11), - RABBITIZER_DEF_REG(RSP_COP2, 12, 12), - RABBITIZER_DEF_REG(RSP_COP2, 13, 13), - RABBITIZER_DEF_REG(RSP_COP2, 14, 14), - RABBITIZER_DEF_REG(RSP_COP2, 15, 15), - RABBITIZER_DEF_REG(RSP_COP2, 16, 16), - RABBITIZER_DEF_REG(RSP_COP2, 17, 17), - RABBITIZER_DEF_REG(RSP_COP2, 18, 18), - RABBITIZER_DEF_REG(RSP_COP2, 19, 19), - RABBITIZER_DEF_REG(RSP_COP2, 20, 20), - RABBITIZER_DEF_REG(RSP_COP2, 21, 21), - RABBITIZER_DEF_REG(RSP_COP2, 22, 22), - RABBITIZER_DEF_REG(RSP_COP2, 23, 23), - RABBITIZER_DEF_REG(RSP_COP2, 24, 24), - RABBITIZER_DEF_REG(RSP_COP2, 25, 25), - RABBITIZER_DEF_REG(RSP_COP2, 26, 26), - RABBITIZER_DEF_REG(RSP_COP2, 27, 27), - RABBITIZER_DEF_REG(RSP_COP2, 28, 28), - RABBITIZER_DEF_REG(RSP_COP2, 29, 29), - RABBITIZER_DEF_REG(RSP_COP2, 30, 30), - RABBITIZER_DEF_REG(RSP_COP2, 31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc deleted file mode 100644 index 0f730f31..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspCop2Control.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 0, 0), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 1, 1), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 2, 2), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 3, 3), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 4, 4), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 5, 5), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 6, 6), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 7, 7), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 8, 8), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 9, 9), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 10, 10), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 11, 11), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 12, 12), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 13, 13), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 14, 14), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 15, 15), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 16, 16), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 17, 17), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 18, 18), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 19, 19), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 20, 20), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 21, 21), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 22, 22), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 23, 23), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 24, 24), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 25, 25), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 26, 26), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 27, 27), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 28, 28), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 29, 29), - RABBITIZER_DEF_REG(RSP_COP2_CONTROL, 30, 30), - RABBITIZER_DEF_REG(COP1_CONTROL, 31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc deleted file mode 100644 index 490926cd..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspGpr.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_GPR, zero, 0), - RABBITIZER_DEF_REG(RSP_GPR, 1, 1), - RABBITIZER_DEF_REG(RSP_GPR, 2, 2), - RABBITIZER_DEF_REG(RSP_GPR, 3, 3), - RABBITIZER_DEF_REG(RSP_GPR, 4, 4), - RABBITIZER_DEF_REG(RSP_GPR, 5, 5), - RABBITIZER_DEF_REG(RSP_GPR, 6, 6), - RABBITIZER_DEF_REG(RSP_GPR, 7, 7), - RABBITIZER_DEF_REG(RSP_GPR, 8, 8), - RABBITIZER_DEF_REG(RSP_GPR, 9, 9), - RABBITIZER_DEF_REG(RSP_GPR, 10, 10), - RABBITIZER_DEF_REG(RSP_GPR, 11, 11), - RABBITIZER_DEF_REG(RSP_GPR, 12, 12), - RABBITIZER_DEF_REG(RSP_GPR, 13, 13), - RABBITIZER_DEF_REG(RSP_GPR, 14, 14), - RABBITIZER_DEF_REG(RSP_GPR, 15, 15), - RABBITIZER_DEF_REG(RSP_GPR, 16, 16), - RABBITIZER_DEF_REG(RSP_GPR, 17, 17), - RABBITIZER_DEF_REG(RSP_GPR, 18, 18), - RABBITIZER_DEF_REG(RSP_GPR, 19, 19), - RABBITIZER_DEF_REG(RSP_GPR, 20, 20), - RABBITIZER_DEF_REG(RSP_GPR, 21, 21), - RABBITIZER_DEF_REG(RSP_GPR, 22, 22), - RABBITIZER_DEF_REG(RSP_GPR, 23, 23), - RABBITIZER_DEF_REG(RSP_GPR, 24, 24), - RABBITIZER_DEF_REG(RSP_GPR, 25, 25), - RABBITIZER_DEF_REG(RSP_GPR, 26, 26), - RABBITIZER_DEF_REG(RSP_GPR, 27, 27), - RABBITIZER_DEF_REG(RSP_GPR, 28, 28), - RABBITIZER_DEF_REG(RSP_GPR, 29, 29), - RABBITIZER_DEF_REG(RSP_GPR, 30, 30), - RABBITIZER_DEF_REG(RSP_GPR, ra, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc b/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc deleted file mode 100644 index c2676d91..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/instructions/registers/RabbitizerRegister_RspVector.inc +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - - RABBITIZER_DEF_REG(RSP_VECTOR, v0, 0), - RABBITIZER_DEF_REG(RSP_VECTOR, v1, 1), - RABBITIZER_DEF_REG(RSP_VECTOR, v2, 2), - RABBITIZER_DEF_REG(RSP_VECTOR, v3, 3), - RABBITIZER_DEF_REG(RSP_VECTOR, v4, 4), - RABBITIZER_DEF_REG(RSP_VECTOR, v5, 5), - RABBITIZER_DEF_REG(RSP_VECTOR, v6, 6), - RABBITIZER_DEF_REG(RSP_VECTOR, v7, 7), - RABBITIZER_DEF_REG(RSP_VECTOR, v8, 8), - RABBITIZER_DEF_REG(RSP_VECTOR, v9, 9), - RABBITIZER_DEF_REG(RSP_VECTOR, v10, 10), - RABBITIZER_DEF_REG(RSP_VECTOR, v11, 11), - RABBITIZER_DEF_REG(RSP_VECTOR, v12, 12), - RABBITIZER_DEF_REG(RSP_VECTOR, v13, 13), - RABBITIZER_DEF_REG(RSP_VECTOR, v14, 14), - RABBITIZER_DEF_REG(RSP_VECTOR, v15, 15), - RABBITIZER_DEF_REG(RSP_VECTOR, v16, 16), - RABBITIZER_DEF_REG(RSP_VECTOR, v17, 17), - RABBITIZER_DEF_REG(RSP_VECTOR, v18, 18), - RABBITIZER_DEF_REG(RSP_VECTOR, v19, 19), - RABBITIZER_DEF_REG(RSP_VECTOR, v20, 20), - RABBITIZER_DEF_REG(RSP_VECTOR, v21, 21), - RABBITIZER_DEF_REG(RSP_VECTOR, v22, 22), - RABBITIZER_DEF_REG(RSP_VECTOR, v23, 23), - RABBITIZER_DEF_REG(RSP_VECTOR, v24, 24), - RABBITIZER_DEF_REG(RSP_VECTOR, v25, 25), - RABBITIZER_DEF_REG(RSP_VECTOR, v26, 26), - RABBITIZER_DEF_REG(RSP_VECTOR, v27, 27), - RABBITIZER_DEF_REG(RSP_VECTOR, v28, 28), - RABBITIZER_DEF_REG(RSP_VECTOR, v29, 29), - RABBITIZER_DEF_REG(RSP_VECTOR, v30, 30), - RABBITIZER_DEF_REG(RSP_VECTOR, v31, 31), diff --git a/tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h b/tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h deleted file mode 100644 index 5bae2d58..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/include/rabbitizer.h +++ /dev/null @@ -1,25 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_H -#define RABBITIZER_H -#pragma once - -#include "common/Utils.h" -#include "common/RabbitizerVersion.h" -#include "common/RabbitizerConfig.h" - -#include "instructions/RabbitizerOperandType.h" -#include "instructions/RabbitizerInstrId.h" -#include "instructions/RabbitizerInstrSuffix.h" -#include "instructions/RabbitizerInstrDescriptor.h" -#include "instructions/RabbitizerRegister.h" -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -#include "analysis/RabbitizerTrackedRegisterState.h" -#include "analysis/RabbitizerLoPairingInfo.h" -#include "analysis/RabbitizerRegistersTracker.h" - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/pyproject.toml b/tools/ido-static-recomp/tools/rabbitizer/pyproject.toml deleted file mode 100644 index 35a5cb29..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/pyproject.toml +++ /dev/null @@ -1,9 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -[build-system] -requires = ["setuptools>=61.0", "wheel"] -build-backend = "setuptools.build_meta" - -[tool.cibuildwheel] -skip = ["cp36-*"] diff --git a/tools/ido-static-recomp/tools/rabbitizer/r5900test.c b/tools/ido-static-recomp/tools/rabbitizer/r5900test.c deleted file mode 100644 index bc83f4db..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/r5900test.c +++ /dev/null @@ -1,47 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionR5900.h" - -#include -#include -#include -#include - - -int main() { - uint32_t word; - RabbitizerInstruction instr; - char *buffer; - int extraLJust = 5; -#if 1 - uint32_t validbits; -#endif - - word = 0x4BE1634B; - - RabbitizerInstructionR5900_init(&instr, word, 0x00100000); - - RabbitizerInstructionR5900_processUniqueId(&instr); - - buffer = malloc(RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust) + 1); - assert(buffer != NULL); - - RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust); - - printf("%08X: %s\n", word, buffer); - -#if 1 - validbits = RabbitizerInstruction_getValidBits(&instr); - - printf("word: %08X\n", instr.word); - printf("mandatory bits: %08X\n", instr._mandatorybits); - printf("valid bits: %08X\n", validbits); - printf("invalid bits: %08X\n", (~validbits) & instr.word); -#endif - - free(buffer); - RabbitizerInstructionR5900_destroy(&instr); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi deleted file mode 100644 index c639b4f1..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Config.pyi +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class Abi: - NUMERIC: Enum - O32: Enum - N32: Enum - N64: Enum - - @staticmethod - def fromStr(name: str | None) -> Enum: ... - - -class _RabbitizerConfig: - regNames_namedRegisters: bool = True - regNames_gprAbiNames: Enum = Abi.O32 - regNames_fprAbiNames: Enum = Abi.NUMERIC - regNames_userFpcCsr: bool = True - regNames_vr4300Cop0NamedRegisters: bool = True - regNames_vr4300RspCop0NamedRegisters: bool = True - - pseudos_enablePseudos: bool = True - pseudos_pseudoBeqz: bool = True - pseudos_pseudoBnez: bool = True - pseudos_pseudoB: bool = True - pseudos_pseudoMove: bool = True - pseudos_pseudoNot: bool = True - pseudos_pseudoNegu: bool = True - pseudos_pseudoBal: bool = True - - toolchainTweaks_sn64DivFix: bool = False - toolchainTweaks_treatJAsUnconditionalBranch: bool = False - - misc_opcodeLJust: int = 11 - misc_unknownInstrComment: bool = True - misc_omit0XOnSmallImm: bool = False - misc_upperCaseImm: bool = True - -config: _RabbitizerConfig diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi deleted file mode 100644 index afa18969..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Enum.pyi +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class Enum: - name: str - value: int - - def __init__(self, enumType: str, name: str, value: int) -> None: ... - - def __reduce__(self) -> tuple: ... - - def __lt__(self, __o: object) -> bool: ... - def __le__(self, __o: object) -> bool: ... - def __eq__(self, __o: object) -> bool: ... - def __gt__(self, __o: object) -> bool: ... - def __ge__(self, __o: object) -> bool: ... - - def __repr__(self) -> str: ... - def __str__(self) -> str: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi deleted file mode 100644 index 7d4b7e56..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrCategory.pyi +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class InstrCategory: - CPU: Enum - RSP: Enum - R5900: Enum - MAX: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi deleted file mode 100644 index 87e87bf3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/InstrId.pyi +++ /dev/null @@ -1,631 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class InstrId: - cpu_INVALID: Enum - cpu_mthi: Enum - cpu_mtlo: Enum - cpu_jr: Enum - cpu_jalr: Enum - cpu_jalr_rd: Enum - cpu_mfhi: Enum - cpu_mflo: Enum - cpu_mult: Enum - cpu_multu: Enum - cpu_dmult: Enum - cpu_dmultu: Enum - cpu_tge: Enum - cpu_tgeu: Enum - cpu_tlt: Enum - cpu_tltu: Enum - cpu_teq: Enum - cpu_tne: Enum - cpu_movz: Enum - cpu_movn: Enum - cpu_div: Enum - cpu_divu: Enum - cpu_sn64_div: Enum - cpu_sn64_divu: Enum - cpu_ddiv: Enum - cpu_ddivu: Enum - cpu_add: Enum - cpu_addu: Enum - cpu_sub: Enum - cpu_subu: Enum - cpu_and: Enum - cpu_or: Enum - cpu_xor: Enum - cpu_nor: Enum - cpu_slt: Enum - cpu_sltu: Enum - cpu_dadd: Enum - cpu_daddu: Enum - cpu_dsub: Enum - cpu_dsubu: Enum - cpu_syscall: Enum - cpu_break: Enum - cpu_sync: Enum - cpu_dsllv: Enum - cpu_dsrlv: Enum - cpu_dsrav: Enum - cpu_sllv: Enum - cpu_srlv: Enum - cpu_srav: Enum - cpu_sll: Enum - cpu_srl: Enum - cpu_sra: Enum - cpu_dsll: Enum - cpu_dsrl: Enum - cpu_dsra: Enum - cpu_dsll32: Enum - cpu_dsrl32: Enum - cpu_dsra32: Enum - cpu_bltz: Enum - cpu_bgez: Enum - cpu_bltzl: Enum - cpu_bgezl: Enum - cpu_tgei: Enum - cpu_tgeiu: Enum - cpu_tlti: Enum - cpu_tltiu: Enum - cpu_bltzal: Enum - cpu_bgezal: Enum - cpu_bltzall: Enum - cpu_bgezall: Enum - cpu_bal: Enum - cpu_teqi: Enum - cpu_tnei: Enum - cpu_j: Enum - cpu_jal: Enum - cpu_beq: Enum - cpu_bne: Enum - cpu_beql: Enum - cpu_bnel: Enum - cpu_blez: Enum - cpu_bgtz: Enum - cpu_blezl: Enum - cpu_bgtzl: Enum - cpu_lui: Enum - cpu_andi: Enum - cpu_ori: Enum - cpu_xori: Enum - cpu_addi: Enum - cpu_addiu: Enum - cpu_daddi: Enum - cpu_daddiu: Enum - cpu_slti: Enum - cpu_sltiu: Enum - cpu_ldl: Enum - cpu_ldr: Enum - cpu_lb: Enum - cpu_lh: Enum - cpu_lwl: Enum - cpu_lw: Enum - cpu_lbu: Enum - cpu_lhu: Enum - cpu_lwr: Enum - cpu_lwu: Enum - cpu_sb: Enum - cpu_sh: Enum - cpu_swl: Enum - cpu_sw: Enum - cpu_sdl: Enum - cpu_sdr: Enum - cpu_swr: Enum - cpu_ll: Enum - cpu_pref: Enum - cpu_lld: Enum - cpu_ld: Enum - cpu_sc: Enum - cpu_scd: Enum - cpu_sd: Enum - cpu_lwc1: Enum - cpu_ldc1: Enum - cpu_swc1: Enum - cpu_sdc1: Enum - cpu_lwc2: Enum - cpu_ldc2: Enum - cpu_swc2: Enum - cpu_sdc2: Enum - cpu_mfc0: Enum - cpu_dmfc0: Enum - cpu_cfc0: Enum - cpu_mtc0: Enum - cpu_dmtc0: Enum - cpu_ctc0: Enum - cpu_tlbr: Enum - cpu_tlbwi: Enum - cpu_tlbwr: Enum - cpu_tlbp: Enum - cpu_eret: Enum - cpu_bc0t: Enum - cpu_bc0f: Enum - cpu_bc0tl: Enum - cpu_bc0fl: Enum - cpu_mfc1: Enum - cpu_dmfc1: Enum - cpu_mtc1: Enum - cpu_dmtc1: Enum - cpu_cfc1: Enum - cpu_ctc1: Enum - cpu_bc1f: Enum - cpu_bc1t: Enum - cpu_bc1fl: Enum - cpu_bc1tl: Enum - cpu_add_s: Enum - cpu_sub_s: Enum - cpu_mul_s: Enum - cpu_div_s: Enum - cpu_add_d: Enum - cpu_sub_d: Enum - cpu_mul_d: Enum - cpu_div_d: Enum - cpu_sqrt_s: Enum - cpu_abs_s: Enum - cpu_mov_s: Enum - cpu_neg_s: Enum - cpu_sqrt_d: Enum - cpu_abs_d: Enum - cpu_mov_d: Enum - cpu_neg_d: Enum - cpu_round_l_s: Enum - cpu_trunc_l_s: Enum - cpu_ceil_l_s: Enum - cpu_floor_l_s: Enum - cpu_round_l_d: Enum - cpu_trunc_l_d: Enum - cpu_ceil_l_d: Enum - cpu_floor_l_d: Enum - cpu_round_w_s: Enum - cpu_trunc_w_s: Enum - cpu_ceil_w_s: Enum - cpu_floor_w_s: Enum - cpu_round_w_d: Enum - cpu_trunc_w_d: Enum - cpu_ceil_w_d: Enum - cpu_floor_w_d: Enum - cpu_c_f_s: Enum - cpu_c_un_s: Enum - cpu_c_eq_s: Enum - cpu_c_ueq_s: Enum - cpu_c_olt_s: Enum - cpu_c_ult_s: Enum - cpu_c_ole_s: Enum - cpu_c_ule_s: Enum - cpu_c_f_d: Enum - cpu_c_un_d: Enum - cpu_c_eq_d: Enum - cpu_c_ueq_d: Enum - cpu_c_olt_d: Enum - cpu_c_ult_d: Enum - cpu_c_ole_d: Enum - cpu_c_ule_d: Enum - cpu_c_sf_s: Enum - cpu_c_ngle_s: Enum - cpu_c_seq_s: Enum - cpu_c_ngl_s: Enum - cpu_c_lt_s: Enum - cpu_c_nge_s: Enum - cpu_c_le_s: Enum - cpu_c_ngt_s: Enum - cpu_c_sf_d: Enum - cpu_c_ngle_d: Enum - cpu_c_seq_d: Enum - cpu_c_ngl_d: Enum - cpu_c_lt_d: Enum - cpu_c_nge_d: Enum - cpu_c_le_d: Enum - cpu_c_ngt_d: Enum - cpu_cvt_s_d: Enum - cpu_cvt_s_w: Enum - cpu_cvt_s_l: Enum - cpu_cvt_d_s: Enum - cpu_cvt_d_w: Enum - cpu_cvt_d_l: Enum - cpu_cvt_w_s: Enum - cpu_cvt_w_d: Enum - cpu_cvt_l_s: Enum - cpu_cvt_l_d: Enum - cpu_nop: Enum - cpu_beqz: Enum - cpu_bnez: Enum - cpu_b: Enum - cpu_move: Enum - cpu_not: Enum - cpu_negu: Enum - cpu_MAX: Enum - - rsp_INVALID: Enum - rsp_vmulf: Enum - rsp_vmulu: Enum - rsp_vrndp: Enum - rsp_vmulq: Enum - rsp_vmudl: Enum - rsp_vmudm: Enum - rsp_vmudn: Enum - rsp_vmudh: Enum - rsp_vmacf: Enum - rsp_vmacu: Enum - rsp_vrndn: Enum - rsp_vmacq: Enum - rsp_vmadl: Enum - rsp_vmadm: Enum - rsp_vmadn: Enum - rsp_vmadh: Enum - rsp_vadd: Enum - rsp_vsub: Enum - rsp_vabs: Enum - rsp_vaddc: Enum - rsp_vsubc: Enum - rsp_vsar: Enum - rsp_vand: Enum - rsp_vnand: Enum - rsp_vor: Enum - rsp_vnor: Enum - rsp_vxor: Enum - rsp_vnxor: Enum - rsp_vlt: Enum - rsp_veq: Enum - rsp_vne: Enum - rsp_vge: Enum - rsp_vcl: Enum - rsp_vch: Enum - rsp_vcr: Enum - rsp_vmrg: Enum - rsp_vrcp: Enum - rsp_vrcpl: Enum - rsp_vrcph: Enum - rsp_vmov: Enum - rsp_vrsq: Enum - rsp_vrsql: Enum - rsp_vrsqh: Enum - rsp_vnop: Enum - rsp_mfc2: Enum - rsp_mtc2: Enum - rsp_cfc2: Enum - rsp_ctc2: Enum - rsp_sbv: Enum - rsp_ssv: Enum - rsp_slv: Enum - rsp_sdv: Enum - rsp_sqv: Enum - rsp_srv: Enum - rsp_spv: Enum - rsp_suv: Enum - rsp_swv: Enum - rsp_shv: Enum - rsp_sfv: Enum - rsp_stv: Enum - rsp_lbv: Enum - rsp_lsv: Enum - rsp_llv: Enum - rsp_ldv: Enum - rsp_lqv: Enum - rsp_lrv: Enum - rsp_lpv: Enum - rsp_luv: Enum - rsp_lhv: Enum - rsp_lfv: Enum - rsp_ltv: Enum - rsp_jr: Enum - rsp_jalr: Enum - rsp_jalr_rd: Enum - rsp_movz: Enum - rsp_movn: Enum - rsp_add: Enum - rsp_addu: Enum - rsp_sub: Enum - rsp_subu: Enum - rsp_and: Enum - rsp_or: Enum - rsp_xor: Enum - rsp_nor: Enum - rsp_slt: Enum - rsp_sltu: Enum - rsp_break: Enum - rsp_sllv: Enum - rsp_srlv: Enum - rsp_srav: Enum - rsp_sll: Enum - rsp_srl: Enum - rsp_sra: Enum - rsp_bltz: Enum - rsp_bgez: Enum - rsp_bltzal: Enum - rsp_bgezal: Enum - rsp_bal: Enum - rsp_j: Enum - rsp_jal: Enum - rsp_beq: Enum - rsp_bne: Enum - rsp_blez: Enum - rsp_bgtz: Enum - rsp_lui: Enum - rsp_andi: Enum - rsp_ori: Enum - rsp_xori: Enum - rsp_addi: Enum - rsp_addiu: Enum - rsp_slti: Enum - rsp_sltiu: Enum - rsp_lb: Enum - rsp_lh: Enum - rsp_lw: Enum - rsp_lbu: Enum - rsp_lhu: Enum - rsp_sb: Enum - rsp_sh: Enum - rsp_sw: Enum - rsp_pref: Enum - rsp_lwc1: Enum - rsp_swc1: Enum - rsp_mfc0: Enum - rsp_mtc0: Enum - rsp_nop: Enum - rsp_beqz: Enum - rsp_bnez: Enum - rsp_b: Enum - rsp_move: Enum - rsp_not: Enum - rsp_negu: Enum - rsp_MAX: Enum - - r5900_INVALID: Enum - r5900_lq: Enum - r5900_sq: Enum - r5900_lqc2: Enum - r5900_sqc2: Enum - r5900_sync_p: Enum - r5900_mfsa: Enum - r5900_mtsa: Enum - r5900_mtsab: Enum - r5900_mtsah: Enum - r5900_madd: Enum - r5900_maddu: Enum - r5900_plzcw: Enum - r5900_mfhi1: Enum - r5900_mthi1: Enum - r5900_mflo1: Enum - r5900_mtlo1: Enum - r5900_mult1: Enum - r5900_multu1: Enum - r5900_div1: Enum - r5900_divu1: Enum - r5900_madd1: Enum - r5900_maddu1: Enum - r5900_pmfhl: Enum - r5900_pmthl: Enum - r5900_psllh: Enum - r5900_psrlh: Enum - r5900_psrah: Enum - r5900_psllw: Enum - r5900_psrlw: Enum - r5900_psraw: Enum - r5900_paddw: Enum - r5900_psubw: Enum - r5900_pcgtw: Enum - r5900_pmaxw: Enum - r5900_paddh: Enum - r5900_psubh: Enum - r5900_pcgth: Enum - r5900_pmaxh: Enum - r5900_paddb: Enum - r5900_psubb: Enum - r5900_pcgtb: Enum - r5900_paddsw: Enum - r5900_psubsw: Enum - r5900_pextlw: Enum - r5900_ppacw: Enum - r5900_paddsh: Enum - r5900_psubsh: Enum - r5900_pextlh: Enum - r5900_ppach: Enum - r5900_paddsb: Enum - r5900_psubsb: Enum - r5900_pextlb: Enum - r5900_ppacb: Enum - r5900_pext5: Enum - r5900_ppac5: Enum - r5900_pabsw: Enum - r5900_pceqw: Enum - r5900_pminw: Enum - r5900_padsbh: Enum - r5900_pabsh: Enum - r5900_pceqh: Enum - r5900_pminh: Enum - r5900_pceqb: Enum - r5900_padduw: Enum - r5900_psubuw: Enum - r5900_pextuw: Enum - r5900_padduh: Enum - r5900_psubuh: Enum - r5900_pextuh: Enum - r5900_paddub: Enum - r5900_psubub: Enum - r5900_pextub: Enum - r5900_qfsrv: Enum - r5900_pmaddw: Enum - r5900_psllvw: Enum - r5900_psrlvw: Enum - r5900_pmsubw: Enum - r5900_pmfhi: Enum - r5900_pmflo: Enum - r5900_pinth: Enum - r5900_pmultw: Enum - r5900_pdivw: Enum - r5900_pcpyld: Enum - r5900_pmaddh: Enum - r5900_phmadh: Enum - r5900_pand: Enum - r5900_pxor: Enum - r5900_pmsubh: Enum - r5900_phmsbh: Enum - r5900_pexeh: Enum - r5900_prevh: Enum - r5900_pmulth: Enum - r5900_pdivbw: Enum - r5900_pexew: Enum - r5900_prot3w: Enum - r5900_pmadduw: Enum - r5900_psravw: Enum - r5900_pmthi: Enum - r5900_pmtlo: Enum - r5900_pinteh: Enum - r5900_pmultuw: Enum - r5900_pdivuw: Enum - r5900_pcpyud: Enum - r5900_por: Enum - r5900_pnor: Enum - r5900_pexch: Enum - r5900_pcpyh: Enum - r5900_pexcw: Enum - r5900_ei: Enum - r5900_di: Enum - r5900_rsqrt_s: Enum - r5900_adda_s: Enum - r5900_suba_s: Enum - r5900_mula_s: Enum - r5900_madd_s: Enum - r5900_msub_s: Enum - r5900_madda_s: Enum - r5900_msuba_s: Enum - r5900_max_s: Enum - r5900_min_s: Enum - r5900_qmfc2: Enum - r5900_cfc2: Enum - r5900_qmtc2: Enum - r5900_ctc2: Enum - r5900_bc2f: Enum - r5900_bc2t: Enum - r5900_bc2fl: Enum - r5900_bc2tl: Enum - r5900_vaddx: Enum - r5900_vaddy: Enum - r5900_vaddz: Enum - r5900_vaddw: Enum - r5900_vsubx: Enum - r5900_vsuby: Enum - r5900_vsubz: Enum - r5900_vsubw: Enum - r5900_vmaddx: Enum - r5900_vmaddy: Enum - r5900_vmaddz: Enum - r5900_vmaddw: Enum - r5900_vmsubx: Enum - r5900_vmsuby: Enum - r5900_vmsubz: Enum - r5900_vmsubw: Enum - r5900_vmaxx: Enum - r5900_vmaxy: Enum - r5900_vmaxz: Enum - r5900_vmaxw: Enum - r5900_vminix: Enum - r5900_vminiy: Enum - r5900_vminiz: Enum - r5900_vminiw: Enum - r5900_vmulx: Enum - r5900_vmuly: Enum - r5900_vmulz: Enum - r5900_vmulw: Enum - r5900_vmulq: Enum - r5900_vmaxi: Enum - r5900_vmuli: Enum - r5900_vminii: Enum - r5900_vaddq: Enum - r5900_vmaddq: Enum - r5900_vaddi: Enum - r5900_vmaddi: Enum - r5900_vsubq: Enum - r5900_vmsubq: Enum - r5900_vsubi: Enum - r5900_vmsubi: Enum - r5900_vadd: Enum - r5900_vmadd: Enum - r5900_vmul: Enum - r5900_vmax: Enum - r5900_vsub: Enum - r5900_vmsub: Enum - r5900_vopmsub: Enum - r5900_vmini: Enum - r5900_viadd: Enum - r5900_visub: Enum - r5900_viaddi: Enum - r5900_viand: Enum - r5900_vior: Enum - r5900_vcallms: Enum - r5900_callmsr: Enum - r5900_vaddax: Enum - r5900_vadday: Enum - r5900_vaddaz: Enum - r5900_vaddaw: Enum - r5900_vsubax: Enum - r5900_vsubay: Enum - r5900_vsubaz: Enum - r5900_vsubaw: Enum - r5900_vvmaddx: Enum - r5900_vvmaddy: Enum - r5900_vvmaddz: Enum - r5900_vvmaddw: Enum - r5900_vmsubax: Enum - r5900_vmsubay: Enum - r5900_vmsubaz: Enum - r5900_vmsubaw: Enum - r5900_vitof0: Enum - r5900_vitof4: Enum - r5900_vitof12: Enum - r5900_vitof15: Enum - r5900_vftoi0: Enum - r5900_vftoi4: Enum - r5900_vftoi12: Enum - r5900_vftoi15: Enum - r5900_vmulax: Enum - r5900_vmulay: Enum - r5900_vmulaz: Enum - r5900_vmulaw: Enum - r5900_vmulaq: Enum - r5900_vabs: Enum - r5900_vmulai: Enum - r5900_vclipw: Enum - r5900_vaddaq: Enum - r5900_vmaddaq: Enum - r5900_vaddai: Enum - r5900_vmaddai: Enum - r5900_vsubaq: Enum - r5900_vmsubaq: Enum - r5900_vsubai: Enum - r5900_vmsubai: Enum - r5900_vadda: Enum - r5900_vmadda: Enum - r5900_vmula: Enum - r5900_vsuba: Enum - r5900_vmsuba: Enum - r5900_vopmula: Enum - r5900_vnop: Enum - r5900_vmove: Enum - r5900_vmr32: Enum - r5900_vlqi: Enum - r5900_vsqi: Enum - r5900_vlqd: Enum - r5900_vsqd: Enum - r5900_vdiv: Enum - r5900_vsqrt: Enum - r5900_vrsqrt: Enum - r5900_vwaitq: Enum - r5900_vmtir: Enum - r5900_vmfir: Enum - r5900_vilwr: Enum - r5900_viswr: Enum - r5900_vrnext: Enum - r5900_vrget: Enum - r5900_vrinit: Enum - r5900_vrxor: Enum - r5900_MAX: Enum - - ALL_MAX: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi deleted file mode 100644 index 70e2a1b7..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/LoPairingInfo.pyi +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class LoPairingInfo: - instrOffset: int - value: int - shouldProcess: bool - isGpRel: bool - isGpGot: bool - - def __init__(self): ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi deleted file mode 100644 index 54443526..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprN32.pyi +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class RegGprN32: - zero: Enum - at: Enum - v0: Enum - v1: Enum - a0: Enum - a1: Enum - a2: Enum - a3: Enum - a4: Enum - a5: Enum - a6: Enum - a7: Enum - t0: Enum - t1: Enum - t2: Enum - t3: Enum - s0: Enum - s1: Enum - s2: Enum - s3: Enum - s4: Enum - s5: Enum - s6: Enum - s7: Enum - t8: Enum - t9: Enum - k0: Enum - k1: Enum - gp: Enum - sp: Enum - fp: Enum - ra: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi deleted file mode 100644 index f145ca3d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegGprO32.pyi +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum - - -class RegGprO32: - zero: Enum - at: Enum - v0: Enum - v1: Enum - a0: Enum - a1: Enum - a2: Enum - a3: Enum - t0: Enum - t1: Enum - t2: Enum - t3: Enum - t4: Enum - t5: Enum - t6: Enum - t7: Enum - s0: Enum - s1: Enum - s2: Enum - s3: Enum - s4: Enum - s5: Enum - s6: Enum - s7: Enum - t8: Enum - t9: Enum - k0: Enum - k1: Enum - gp: Enum - sp: Enum - fp: Enum - ra: Enum diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi deleted file mode 100644 index 967ba493..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/RegistersTracker.pyi +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .rabbitizer import Instruction -from .LoPairingInfo import LoPairingInfo - - -class RegistersTracker: - def __init__(self, other: RegistersTracker|None=None): ... - - def moveRegisters(self, instr: Instruction) -> bool: ... - def overwriteRegisters(self, instr: Instruction, instructionOffset: int) -> None: ... - def unsetRegistersAfterFuncCall(self, instr: Instruction, prevInstr: Instruction) -> None: ... - def getAddressIfCanSetType(self, instr: Instruction, instrOffset: int) -> int|None: ... - def getJrInfo(self, instr: Instruction) -> tuple[int, int]|None: ... - - def processLui(self, instr: Instruction, instrOffset: int, prevInstr: Instruction|None=None) -> None: ... - def processGpLoad(self, instr: Instruction, instrOffset: int) -> None: ... - def getLuiOffsetForConstant(self, instr: Instruction) -> int|None: ... - def processConstant(self, instr: Instruction, value: int, offset: int) -> None: ... - def getLuiOffsetForLo(self, instr: Instruction, instrOffset: int) -> tuple[int, bool, bool]: ... #! deprecated - def preprocessLoAndGetInfo(self, instr: Instruction, instrOffset: int) -> LoPairingInfo: ... - def processLo(self, instr: Instruction, value: int, offset: int) -> None: ... - def hasLoButNoHi(self, instr: Instruction) -> bool: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi deleted file mode 100644 index 36ba693e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/TrackedRegisterState.pyi +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class RegistersTracker: - registerNum: int - - hasLuiValue: bool - luiOffset: int # The offset of last lui which set a value to this register - luiSetOnBranchLikely: bool - - hasGpGot: bool - gpGotOffset: int - - hasLoValue: bool - loOffset: int - dereferenced: bool - dereferenceOffset: int - - value: int diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi deleted file mode 100644 index 7215556f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/Utils.pyi +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - - -class Utils: - @staticmethod - def from2Complement(number: int, bits: int) -> int: ... - - @staticmethod - def escapeString(src: str) -> str: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi deleted file mode 100644 index 1bc27a7f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/__init__.pyi +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Utils import * - -from .Enum import * -from .InstrCategory import * -from .InstrId import * - -from .RegGprO32 import * -from .RegGprN32 import * - -from .Config import * - -from .rabbitizer import * - -from .RegistersTracker import * diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c deleted file mode 100644 index 081dcdaf..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.c +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" - - -int rabbitizer_EnumMetadata_Initialize(PyObject *submodule, RabbitizerEnumMetadata *enumValues) { - for (size_t i = 0; enumValues[i].enumType != 0; i++) { - PyObject *args; - - args = Py_BuildValue("ssi", enumValues[i].enumType, enumValues[i].name, enumValues[i].value); - if (args == NULL) { - goto error; - } - - enumValues[i].instance = PyObject_CallObject((PyObject*)&rabbitizer_type_Enum_TypeObject, args); - Py_DECREF(args); - if (enumValues[i].instance == NULL) { - goto error; - } - - enumValues[i].isInstanced = true; - if (PyModule_AddObject(submodule, enumValues[i].name, enumValues[i].instance) < 0) { - goto error; - } - } - return 0; - -error: - for (size_t i = 0; enumValues[i].enumType != 0; i++) { - if (enumValues[i].isInstanced) { - Py_DECREF(enumValues[i].instance); - } - enumValues[i].isInstanced = false; - } - - return -1; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h deleted file mode 100644 index 6cb8604f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/enums_utils.h +++ /dev/null @@ -1,85 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_ENUMS_UTILS_H -#define RABBITIZER_ENUMS_UTILS_H -#pragma once - - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" - -#include - - -extern PyTypeObject rabbitizer_type_Enum_TypeObject; - - -typedef struct PyRabbitizerEnum { - PyObject_HEAD - PyObject *enumType; - PyObject *name; - int value; -} PyRabbitizerEnum; - -typedef struct RabbitizerEnumMetadata { - const char *enumType; - const char *name; - int value; - bool isInstanced; - PyObject *instance; -} RabbitizerEnumMetadata; - - -int rabbitizer_EnumMetadata_Initialize(PyObject *submodule, RabbitizerEnumMetadata *enumValues); - - -#define DECL_ENUM(enumName) \ - extern RabbitizerEnumMetadata rabbitizer_enum_##enumName##_enumvalues[]; \ - PyObject *rabbitizer_enum_##enumName##_Init(void); \ - /* Return true if o is of this enum type */ \ - int rabbitizer_enum_##enumName##_Check(PyObject *o); - -#define DEF_ENUM(enumName, docs) \ - static PyModuleDef rabbitizer_enum_##enumName##_module = { \ - PyModuleDef_HEAD_INIT, \ - .m_name = "rabbitizer." #enumName, \ - .m_doc = PyDoc_STR(docs), \ - .m_size = -1, \ - .m_methods = rabbitizer_enum_##enumName##_methods, \ - }; \ - PyObject *rabbitizer_enum_##enumName##_Init(void) { \ - PyObject *submodule; \ - if (PyType_Ready(&rabbitizer_type_Enum_TypeObject) < 0) { \ - return NULL; \ - } \ - submodule = PyModule_Create(&rabbitizer_enum_##enumName##_module); \ - if (submodule == NULL) { \ - return NULL; \ - } \ - if (rabbitizer_EnumMetadata_Initialize(submodule, rabbitizer_enum_##enumName##_enumvalues) < 0) { \ - Py_DECREF(submodule); \ - return NULL; \ - } \ - return submodule; \ - } \ - /* Return true if o is of this enum type */ \ - int rabbitizer_enum_##enumName##_Check(PyObject *o) { \ - int isInstance = PyObject_IsInstance(o, (PyObject*)&rabbitizer_type_Enum_TypeObject); \ - int enumTypeCmp; \ - if (isInstance < 0) { \ - /* An error happened */ \ - /* PyObject_IsInstance already sets an exception, so nothing else to do here */ \ - return -1; \ - } \ - if (isInstance == 0) { \ - /* `other` isn't an instance of the Enum type */ \ - return 0; \ - } \ - /* Check if both enums have the same `enumType` */ \ - enumTypeCmp = PyUnicode_CompareWithASCIIString(((PyRabbitizerEnum*)o)->enumType, #enumName); \ - return enumTypeCmp == 0; \ - } - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c deleted file mode 100644 index a0d5fb09..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_Abi.c +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" -#include "common/RabbitizerConfig.h" -#include "common/Utils.h" - - -#define RABBITIZER_DEF_ABI(name) { "Abi", #name, RABBITIZER_ABI_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_Abi_enumvalues[] = { - #include "common/Abi.inc" - RABBITIZER_DEF_ABI(MAX), - - { 0 }, -}; - -#undef RABBITIZER_DEF_ABI - - -static PyObject *rabbitizer_enum_Abi_fromStr(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "name", NULL }; - const char *name = NULL; - RabbitizerAbi abi; - PyObject *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "z", kwlist, &name)) { - return NULL; - } - - abi = RabbitizerAbi_fromStr(name); - - ret = rabbitizer_enum_Abi_enumvalues[abi].instance; - Py_INCREF(ret); - return ret; -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_enum_Abi_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_enum_Abi_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - -static PyMethodDef rabbitizer_enum_Abi_methods[] = { - METHOD_ARGS(fromStr, ""), - - { 0 }, -}; - -DEF_ENUM(Abi, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c deleted file mode 100644 index fbc94dda..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrCategory.c +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" -#include "instructions/RabbitizerInstruction.h" - - -#define RABBITIZER_DEF_INSTR_CATEGORY(name) { "InstrCategory", #name, RABBITIZER_INSTRCAT_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_InstrCategory_enumvalues[] = { - #include "instructions/InstrCategory.inc" - RABBITIZER_DEF_INSTR_CATEGORY(MAX), - - { 0 }, -}; - -#undef RABBITIZER_DEF_INSTR_CATEGORY - -static PyMethodDef rabbitizer_enum_InstrCategory_methods[] = { - { 0 }, -}; - -DEF_ENUM(InstrCategory, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c deleted file mode 100644 index fabf612d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_enum_InstrId.c +++ /dev/null @@ -1,29 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums_utils.h" -#include "instructions/RabbitizerInstrId.h" - - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) { "InstrId", #prefix "_" #name, RABBITIZER_INSTR_ID_##prefix##_##name, false, NULL }, -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -RabbitizerEnumMetadata rabbitizer_enum_InstrId_enumvalues[] = { - #include "instructions/instr_id/RabbitizerInstrId_cpu.inc" - - #include "instructions/instr_id/RabbitizerInstrId_rsp.inc" - - #include "instructions/instr_id/RabbitizerInstrId_r5900.inc" - - RABBITIZER_DEF_INSTR_ID(ALL, , MAX, ) - { 0 }, -}; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -static PyMethodDef rabbitizer_enum_InstrId_methods[] = { - { 0 }, -}; - -DEF_ENUM(InstrId, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c deleted file mode 100644 index 299fb386..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/rabbitizer_type_Enum.c +++ /dev/null @@ -1,211 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" -#include "enums_utils.h" -#include "common/Utils.h" - - -static void rabbitizer_type_Enum_dealloc(PyRabbitizerEnum *self) { - Py_XDECREF(self->enumType); - Py_XDECREF(self->name); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static PyObject *rabbitizer_type_Enum_new(PyTypeObject *type, UNUSED PyObject *args, UNUSED PyObject *kwds) { - PyRabbitizerEnum *self = (PyRabbitizerEnum *) type->tp_alloc(type, 0); - - if (self == NULL) { - return NULL; - } - - self->enumType = PyUnicode_FromString(""); - if (self->enumType == NULL) { - Py_DECREF(self); - return NULL; - } - self->name = PyUnicode_FromString(""); - if (self->name == NULL) { - Py_DECREF(self); - return NULL; - } - self->value = 0; - - return (PyObject *) self; -} - -static int rabbitizer_type_Enum_init(PyRabbitizerEnum *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "enumType", "name", "value", NULL }; - PyObject *enumType = NULL; - PyObject *name = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "UUi", kwlist, &enumType, &name, &self->value)) { - return -1; - } - - if (enumType != NULL) { - PyObject *tmp = NULL; - - tmp = self->enumType; - Py_INCREF(enumType); - self->enumType = enumType; - Py_DECREF(tmp); - } - if (name) { - PyObject *tmp = NULL; - - tmp = self->name; - Py_INCREF(name); - self->name = name; - Py_DECREF(tmp); - } - - return 0; -} - - -#define DEF_MEMBER_GET_INT(name) \ - static PyObject *rabbitizer_type_Enum_member_get_##name(PyRabbitizerEnum *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromLong(self->name); \ - } - -#define DEF_MEMBER_GET_OBJREF(name) \ - static PyObject *rabbitizer_type_Enum_member_get_##name(PyRabbitizerEnum *self, PyObject *Py_UNUSED(ignored)) { \ - Py_INCREF(self->name); \ - return self->name; \ - } - -DEF_MEMBER_GET_OBJREF(name) -DEF_MEMBER_GET_INT(value) - - -#define MEMBER_GET(name, docs, closure) { #name, (getter) rabbitizer_type_Enum_member_get_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(name, docs, closure) { #name, (getter) NULL, (setter) rabbitizer_type_Enum_member_set_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(name, docs, closure) { #name, (getter) rabbitizer_type_Enum_member_get_##name, (setter) rabbitizer_type_Enum_member_set_##name, PyDoc_STR(docs), closure } - -static PyGetSetDef rabbitizer_type_Enum_getsetters[] = { - MEMBER_GET(name, "", NULL), - MEMBER_GET(value, "", NULL), - - { 0 }, -}; - - -// Crappy hash -Py_hash_t rabbitizer_type_Enum_hash(PyRabbitizerEnum *self) { - Py_hash_t hash = PyObject_Hash(self->enumType); - - if (hash == -1) { - return -1; - } - - return hash + self->value; -} - -// Checks for the 6 basic comparisons (==, !=, <, <=, >, >=) -PyObject *rabbitizer_type_Enum_richcompare(PyRabbitizerEnum *self, PyObject *other, int op) { - int isInstance = PyObject_IsInstance(other, (PyObject*)&rabbitizer_type_Enum_TypeObject); - int enumTypeCmp; - int otherValue; - - if (isInstance < 0) { - // An error happened - // PyObject_IsInstance already sets an exception, so nothing else to do here - return NULL; - } - - if (isInstance == 0) { - // `other` isn't an instance of the Enum type - Py_RETURN_FALSE; - } - - // Check if both enums have the same `enumType` - enumTypeCmp = PyUnicode_Compare(self->enumType, ((PyRabbitizerEnum*)other)->enumType); - if (enumTypeCmp < 0) { - // Negative could mean it isn't equal or an error occurred, so we need to check for errors - if (PyErr_Occurred() != NULL) { - return NULL; - } - Py_RETURN_FALSE; - } - if (enumTypeCmp != 0) { - Py_RETURN_FALSE; - } - - otherValue = ((PyRabbitizerEnum*)other)->value; - - // Fails to build on ci builds for some reason - // Py_RETURN_RICHCOMPARE(self->value, ((PyRabbitizerEnum*)other)->value, op); - - switch (op) { - case Py_EQ: if ((self->value) == (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_NE: if ((self->value) != (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_LT: if ((self->value) < (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_GT: if ((self->value) > (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_LE: if ((self->value) <= (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - case Py_GE: if ((self->value) >= (otherValue)) Py_RETURN_TRUE; Py_RETURN_FALSE; - default: - //Py_UNREACHABLE(); - UNREACHABLE; - } -} - - -// To allow piclking the object -static PyObject *rabbitizer_type_Enum___reduce__(PyRabbitizerEnum *self, UNUSED PyObject *closure) { - PyObject *args; - PyObject *enumType; - PyObject *name; - PyObject *value; - - enumType = self->enumType; - Py_INCREF(enumType); - name = self->name; - Py_INCREF(name); - value = PyLong_FromLong(self->value); - - - args = PyTuple_Pack(3, enumType, name, value); - - return PyTuple_Pack(2, (PyObject*)&rabbitizer_type_Enum_TypeObject, args); -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Enum_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Enum_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - - -static PyMethodDef rabbitizer_type_Enum_methods[] = { - METHOD_ARGS(__reduce__, ""), - - { 0 }, -}; - -static PyObject *rabbitizer_type_Enum_repr(PyRabbitizerEnum *self) { - return PyUnicode_FromFormat("<%U: %U (%i)>", self->enumType, self->name, self->value); -} - -static PyObject *rabbitizer_type_Enum_str(PyRabbitizerEnum *self) { - return rabbitizer_type_Enum_repr(self); -} - -// TODO: implement hash and int - -PyTypeObject rabbitizer_type_Enum_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.Enum", - .tp_doc = PyDoc_STR("Enum"), - .tp_basicsize = sizeof(PyRabbitizerEnum), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = rabbitizer_type_Enum_new, - .tp_init = (initproc) rabbitizer_type_Enum_init, - .tp_dealloc = (destructor) rabbitizer_type_Enum_dealloc, - .tp_hash = (hashfunc) rabbitizer_type_Enum_hash, - .tp_richcompare = (richcmpfunc) rabbitizer_type_Enum_richcompare, - .tp_repr = (reprfunc) rabbitizer_type_Enum_repr, - .tp_str = (reprfunc) rabbitizer_type_Enum_str, - //.tp_members = rabbitizer_type_Enum_members, - .tp_methods = rabbitizer_type_Enum_methods, - .tp_getset = rabbitizer_type_Enum_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c deleted file mode 100644 index 6027d78f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprN32.c +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums/enums_utils.h" -#include "instructions/RabbitizerRegister.h" - - -#define RABBITIZER_DEF_REG(prefix, name, numeric) \ - { "RegGprN32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - { "RegGprN32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_RegGprN32_enumvalues[] = { - #include "instructions/registers/RabbitizerRegister_GprN32.inc" - - { 0 }, -}; - -#undef RABBITIZER_DEF_REG -#undef RABBITIZER_DEF_REG_NODOLLAR - - -static PyMethodDef rabbitizer_enum_RegGprN32_methods[] = { - { 0 }, -}; - -DEF_ENUM(RegGprN32, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c deleted file mode 100644 index 50cdabe7..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/enums/registers/rabbitizer_enum_GprO32.c +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "enums/enums_utils.h" -#include "instructions/RabbitizerRegister.h" - - -#define RABBITIZER_DEF_REG(prefix, name, numeric) \ - { "RegGprO32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) \ - { "RegGprO32", #name, RABBITIZER_REG_##prefix##_##name, false, NULL } - -RabbitizerEnumMetadata rabbitizer_enum_RegGprO32_enumvalues[] = { - #include "instructions/registers/RabbitizerRegister_GprO32.inc" - - { 0 }, -}; - -#undef RABBITIZER_DEF_REG -#undef RABBITIZER_DEF_REG_NODOLLAR - - -static PyMethodDef rabbitizer_enum_RegGprO32_methods[] = { - { 0 }, -}; - -DEF_ENUM(RegGprO32, "") diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi deleted file mode 100644 index 0ff63fac..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer.pyi +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python3 - -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from __future__ import annotations - -from .Enum import Enum -from .InstrCategory import InstrCategory - - -class Instruction: - rs: Enum - """The value of the `rs` register for this instruction. - The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value. - If the current instruction does not use the `rs` register, then a Runtime exception will be raised. - Read-only.""" - rt: Enum - """The value of the `rt` register for this instruction. - The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value. - If the current instruction does not use the `rt` register, then a Runtime exception will be raised. - Read-only.""" - rd: Enum - """The value of the `rd` register for this instruction. - The type of this attribute will be either a `RegGprO32` or a `RegGprN32` depending on the current `config.regNames_gprAbiNames` value. - If the current instruction does not use the `rd` register, then a Runtime exception will be raised. - Read-only.""" - sa: int - """The value of the `sa` field for this instruction. - If the current instruction does not have a `sa` field, then a Runtime exception will be raised. - Read-only.""" - - uniqueId: Enum - """An unique identificator for the opcode of this instruction. - The type is an `InstrId` enum. - Read-only.""" - - vram: int = 0 - """The vram (virtual ram) address for this instruction""" - inHandwrittenFunction: bool = False - """Boolean value indicating if the current instruction is used on a handwritten function. This is intended to be determined by the user.""" - - - def __init__(self, word: int, vram: int=0, category: Enum=InstrCategory.CPU) -> None: ... - - def getRaw(self) -> int: ... - def getImmediate(self) -> int: ... - def getProcessedImmediate(self) -> int: ... - def getInstrIndexAsVram(self) -> int: ... - def getBranchOffset(self) -> int: ... - def getGenericBranchOffset(self, currentVram: int) -> int: ... - def getOpcodeName(self) -> str: ... - - def blankOut(self) -> None: ... - - def isImplemented(self) -> bool: ... - def isLikelyHandwritten(self) -> bool: ... - def isNop(self) -> bool: ... - def isUnconditionalBranch(self) -> bool: ... - def isJrRa(self) -> bool: ... - def isJrNotRa(self) -> bool: ... - def hasDelaySlot(self) -> bool: ... - def mapInstrToType(self) -> str|None: ... - - def sameOpcode(self, other: Instruction) -> bool: ... - def sameOpcodeButDifferentArguments(self, other: Instruction) -> bool: ... - - def isValid(self) -> bool: ... - - def isUnknownType(self) -> bool: ... - def isJType(self) -> bool: ... - def isIType(self) -> bool: ... - def isRType(self) -> bool: ... - def isRegimmType(self) -> bool: ... - def isBranch(self) -> bool: ... - def isBranchLikely(self) -> bool: ... - def isJump(self) -> bool: ... - def isTrap(self) -> bool: ... - def isFloat(self) -> bool: ... - def isDouble(self) -> bool: ... - def isUnsigned(self) -> bool: ... - def modifiesRt(self) -> bool: ... - def modifiesRd(self) -> bool: ... - def notEmitedByCompilers(self) -> bool: ... - def canBeHi(self) -> bool: ... - def canBeLo(self) -> bool: ... - def doesLink(self) -> bool: ... - def doesDereference(self) -> bool: ... - def doesLoad(self) -> bool: ... - def doesStore(self) -> bool: ... - def maybeIsMove(self) -> bool: ... - def isPseudo(self) -> bool: ... - - def disassemble(self, immOverride: str|None=None, extraLJust: int=0) -> str: ... - - def __reduce__(self) -> tuple: ... - - def __repr__(self) -> str: ... - def __str__(self) -> str: ... diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c deleted file mode 100644 index d02fce37..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_global_config.c +++ /dev/null @@ -1,165 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -/** - * Wrapper to expose rabbitizer's global configuration - */ - -#include "rabbitizer_module.h" -#include "common/RabbitizerConfig.h" -#include "common/Utils.h" - - -#define DEF_MEMBER_GET_BOOL(category, name) \ - static PyObject *rabbitizer_global_config_get_##category##_##name(UNUSED PyObject *self, UNUSED PyObject *closure) { \ - if (RabbitizerConfig_Cfg.category.name) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } -#define DEF_MEMBER_SET_BOOL(category, name) \ - static int rabbitizer_global_config_set_##category##_##name(UNUSED PyObject *self, PyObject *value, UNUSED void *closure) { \ - if (value == NULL) { \ - PyErr_SetString(PyExc_TypeError, "Cannot delete '" #category "." #name "' attribute"); \ - return -1; \ - } \ - RabbitizerConfig_Cfg.category.name = PyObject_IsTrue(value); \ - return 0; \ - } - -#define DEF_MEMBER_GET_SET_BOOL(category, name) \ - DEF_MEMBER_GET_BOOL(category, name) \ - DEF_MEMBER_SET_BOOL(category, name) - - -#define DEF_MEMBER_GET_INT(category, name) \ - static PyObject *rabbitizer_global_config_get_##category##_##name(UNUSED PyObject *self, UNUSED PyObject *closure) { \ - return PyLong_FromLong(RabbitizerConfig_Cfg.category.name); \ - } -#define DEF_MEMBER_SET_INT(category, name, rangeCheck, minVal, maxVal) \ - static int rabbitizer_global_config_set_##category##_##name(UNUSED PyObject *self, PyObject *value, UNUSED void *closure) { \ - long val; \ - if (value == NULL) { \ - PyErr_SetString(PyExc_TypeError, "Cannot delete '" #category "_" #name "' attribute"); \ - return -1; \ - } \ - val = PyLong_AsLong(value); \ - if (val == -1) { \ - PyObject *err = PyErr_Occurred(); \ - if (err != NULL) { \ - return -1; \ - } \ - } \ - if (rangeCheck && (val < minVal || val > maxVal)) { \ - PyErr_SetString(PyExc_ValueError, "Invalid value for '" #category "_" #name "' attribute"); \ - return -1; \ - } \ - RabbitizerConfig_Cfg.category.name = val;\ - return 0; \ - } - -#define DEF_MEMBER_GET_SET_INT(category, name, rangeCheck, minVal, maxVal) \ - DEF_MEMBER_GET_INT(category, name) \ - DEF_MEMBER_SET_INT(category, name, rangeCheck, minVal, maxVal) - -#define DEF_MEMBER_GET_ABI(category, name) \ - static PyObject *rabbitizer_global_config_get_##category##_##name(UNUSED PyObject *self, UNUSED PyObject *ignored) { \ - PyObject *enumInstance = rabbitizer_enum_Abi_enumvalues[RabbitizerConfig_Cfg.category.name].instance; \ - if (enumInstance == NULL) { \ - PyErr_SetString(PyExc_RuntimeError, "Internal error: invalid enum value for '" #category "_" #name "'"); \ - return NULL; \ - } \ - Py_INCREF(enumInstance); \ - return enumInstance; \ - } -#define DEF_MEMBER_SET_ABI(category, name) \ - static int rabbitizer_global_config_set_##category##_##name(UNUSED PyObject *self, PyObject *value, UNUSED void *closure) { \ - int enumCheck; \ - if (value == NULL) { \ - PyErr_SetString(PyExc_TypeError, "Cannot delete '" #category "_" #name "' attribute"); \ - return -1; \ - } \ - enumCheck = rabbitizer_enum_Abi_Check(value); \ - if (enumCheck <= 0) { \ - if (enumCheck == 0) { \ - PyErr_SetString(PyExc_ValueError, "Invalid value for '" #category "_" #name "' attribute"); \ - } \ - return -1; \ - } \ - RabbitizerConfig_Cfg.category.name = ((PyRabbitizerEnum*)value)->value; \ - return 0; \ - } - -#define DEF_MEMBER_GET_SET_ABI(category, name) \ - DEF_MEMBER_GET_ABI(category, name) \ - DEF_MEMBER_SET_ABI(category, name) - - -#define MEMBER_GET(category, name, docs, closure) { #category "_" #name, (getter) rabbitizer_global_config_get_##category##_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(category, name, docs, closure) { #category "_" #name, (getter) NULL, (setter) rabbitizer_global_config_set_##category##_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(category, name, docs, closure) { #category "_" #name, (getter) rabbitizer_global_config_get_##category##_##name, (setter) rabbitizer_global_config_set_##category##_##name, PyDoc_STR(docs), closure } - - -DEF_MEMBER_GET_SET_BOOL(regNames, namedRegisters) -DEF_MEMBER_GET_SET_ABI(regNames, gprAbiNames) -DEF_MEMBER_GET_SET_ABI(regNames, fprAbiNames) -DEF_MEMBER_GET_SET_BOOL(regNames, userFpcCsr) -DEF_MEMBER_GET_SET_BOOL(regNames, vr4300Cop0NamedRegisters) -DEF_MEMBER_GET_SET_BOOL(regNames, vr4300RspCop0NamedRegisters) - -DEF_MEMBER_GET_SET_BOOL(pseudos, enablePseudos) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBeqz) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBnez) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoB) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoMove) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoNot) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoNegu) -DEF_MEMBER_GET_SET_BOOL(pseudos, pseudoBal) - -DEF_MEMBER_GET_SET_BOOL(toolchainTweaks, treatJAsUnconditionalBranch) -DEF_MEMBER_GET_SET_BOOL(toolchainTweaks, sn64DivFix) - -DEF_MEMBER_GET_SET_INT(misc, opcodeLJust, false, 0, 0) -DEF_MEMBER_GET_SET_BOOL(misc, unknownInstrComment) -DEF_MEMBER_GET_SET_BOOL(misc, omit0XOnSmallImm) -DEF_MEMBER_GET_SET_BOOL(misc, upperCaseImm) - - -static PyGetSetDef rabbitizer_global_config_GetSets[] = { - MEMBER_GET_SET(regNames, namedRegisters, "", NULL), - MEMBER_GET_SET(regNames, gprAbiNames, "", NULL), - MEMBER_GET_SET(regNames, fprAbiNames, "", NULL), - MEMBER_GET_SET(regNames, userFpcCsr, "", NULL), - MEMBER_GET_SET(regNames, vr4300Cop0NamedRegisters, "", NULL), - MEMBER_GET_SET(regNames, vr4300RspCop0NamedRegisters, "", NULL), - - MEMBER_GET_SET(pseudos, enablePseudos, "", NULL), - MEMBER_GET_SET(pseudos, pseudoBeqz, "", NULL), - MEMBER_GET_SET(pseudos, pseudoBnez, "", NULL), - MEMBER_GET_SET(pseudos, pseudoB, "", NULL), - MEMBER_GET_SET(pseudos, pseudoMove, "", NULL), - MEMBER_GET_SET(pseudos, pseudoNot, "", NULL), - MEMBER_GET_SET(pseudos, pseudoNegu, "", NULL), - MEMBER_GET_SET(pseudos, pseudoBal, "", NULL), - - MEMBER_GET_SET(toolchainTweaks, treatJAsUnconditionalBranch, "", NULL), - MEMBER_GET_SET(toolchainTweaks, sn64DivFix, "", NULL), - - MEMBER_GET_SET(misc, opcodeLJust, "", NULL), - MEMBER_GET_SET(misc, unknownInstrComment, "", NULL), - MEMBER_GET_SET(misc, omit0XOnSmallImm, "", NULL), - MEMBER_GET_SET(misc, upperCaseImm, "", NULL), - - { 0 }, -}; - -PyTypeObject rabbitizer_global_config_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.config", - .tp_doc = PyDoc_STR(""), - .tp_basicsize = sizeof(PyObject), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_new = PyType_GenericNew, - .tp_getset = rabbitizer_global_config_GetSets, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c deleted file mode 100644 index 66dec777..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.c +++ /dev/null @@ -1,142 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include - -#include "common/Utils.h" -#include "instructions/RabbitizerInstrId.h" - - -typedef enum ModuleAttributeCategory { - MODULE_ATTRIBUTE_CAT_TYPE, - MODULE_ATTRIBUTE_CAT_INIT, // submodules - MODULE_ATTRIBUTE_CAT_GLOBAL, -} ModuleAttributeCategory; - -typedef struct ModuleAttribute { - union { - PyTypeObject *type; - PyObject *(*init)(void); - PyTypeObject *global; - }; - ModuleAttributeCategory cat; - const char *name; - bool isInstanced; - PyObject *instance; -} ModuleAttributes; - -#define MODULE_ATTRIBUTE_TYPE(name) { {.type = &rabbitizer_type_##name##_TypeObject}, MODULE_ATTRIBUTE_CAT_TYPE, #name, false, NULL } -#define MODULE_ATTRIBUTE_INIT(name) { {.init = rabbitizer_submodule_##name##_Init}, MODULE_ATTRIBUTE_CAT_INIT, #name, false, NULL } -#define MODULE_ATTRIBUTE_ENUM(name) { {.init = rabbitizer_enum_##name##_Init}, MODULE_ATTRIBUTE_CAT_INIT, #name, false, NULL } -#define MODULE_ATTRIBUTE_GLOBAL(name) { {.global = &rabbitizer_global_##name##_TypeObject}, MODULE_ATTRIBUTE_CAT_GLOBAL, #name, false, NULL } - -static ModuleAttributes rabbitizer_module_attributes[] = { - MODULE_ATTRIBUTE_INIT(Utils), - MODULE_ATTRIBUTE_GLOBAL(config), - MODULE_ATTRIBUTE_TYPE(Enum), - MODULE_ATTRIBUTE_ENUM(Abi), - MODULE_ATTRIBUTE_ENUM(InstrCategory), - MODULE_ATTRIBUTE_ENUM(InstrId), - MODULE_ATTRIBUTE_ENUM(RegGprO32), - MODULE_ATTRIBUTE_ENUM(RegGprN32), - MODULE_ATTRIBUTE_TYPE(Instruction), - MODULE_ATTRIBUTE_TYPE(LoPairingInfo), - MODULE_ATTRIBUTE_TYPE(TrackedRegisterState), - MODULE_ATTRIBUTE_TYPE(RegistersTracker), -}; - -static int rabbitizer_module_attributes_Ready(void) { - // Sanity checks and PyType_Ready - for (size_t i = 0; i < ARRAY_COUNT(rabbitizer_module_attributes); i++) { - if (rabbitizer_module_attributes[i].global == NULL || rabbitizer_module_attributes[i].name == NULL) { - return -1; - } - switch (rabbitizer_module_attributes[i].cat) { - case MODULE_ATTRIBUTE_CAT_TYPE: - case MODULE_ATTRIBUTE_CAT_GLOBAL: - if (PyType_Ready(rabbitizer_module_attributes[i].type) < 0) { - return -1; - } - break; - - case MODULE_ATTRIBUTE_CAT_INIT: - break; - - default: - return -1; - } - } - - return 0; -} - -static int rabbitizer_module_attributes_Initialize(PyObject *module) { - for (size_t i = 0; i < ARRAY_COUNT(rabbitizer_module_attributes); i++) { - switch (rabbitizer_module_attributes[i].cat) { - case MODULE_ATTRIBUTE_CAT_TYPE: - rabbitizer_module_attributes[i].instance = (PyObject*) rabbitizer_module_attributes[i].type; - Py_INCREF(rabbitizer_module_attributes[i].instance); - break; - - case MODULE_ATTRIBUTE_CAT_INIT: - rabbitizer_module_attributes[i].instance = rabbitizer_module_attributes[i].init(); - if (rabbitizer_module_attributes[i].instance == NULL) { - goto error; - } - break; - - case MODULE_ATTRIBUTE_CAT_GLOBAL: - rabbitizer_module_attributes[i].instance = PyObject_CallObject((PyObject*)rabbitizer_module_attributes[i].global, NULL); - if (rabbitizer_module_attributes[i].instance == NULL) { - goto error; - } - break; - } - - rabbitizer_module_attributes[i].isInstanced = true; - if (PyModule_AddObject(module, rabbitizer_module_attributes[i].name, rabbitizer_module_attributes[i].instance) < 0) { - goto error; - } - } - - return 0; - -error: - for (size_t i = 0; i < ARRAY_COUNT(rabbitizer_module_attributes); i++) { - if (rabbitizer_module_attributes[i].isInstanced) { - Py_DECREF(rabbitizer_module_attributes[i].instance); - } - rabbitizer_module_attributes[i].isInstanced = false; - } - return -1; -} - - -static PyModuleDef rabbitizer_module = { - PyModuleDef_HEAD_INIT, - .m_name = "rabbitizer", - .m_doc = "", - .m_size = -1, -}; - -PyMODINIT_FUNC PyInit_rabbitizer(void) { - PyObject *module; - - if (rabbitizer_module_attributes_Ready() < 0) { - return NULL; - } - - module = PyModule_Create(&rabbitizer_module); - if (module == NULL) { - return NULL; - } - - if (rabbitizer_module_attributes_Initialize(module) < 0) { - Py_DECREF(module); - return NULL; - } - - return module; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h deleted file mode 100644 index 051ea67d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_module.h +++ /dev/null @@ -1,54 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#ifndef RABBITIZER_MODULE_H -#define RABBITIZER_MODULE_H -#pragma once - -#define PY_SSIZE_T_CLEAN -#include -#include "structmember.h" - -#include "enums/enums_utils.h" - -#include "instructions/RabbitizerInstruction.h" -#include "analysis/RabbitizerTrackedRegisterState.h" -#include "analysis/RabbitizerLoPairingInfo.h" - -// TODO: clean up this... - - -typedef struct PyRabbitizerInstruction { - PyObject_HEAD - RabbitizerInstruction instr; -} PyRabbitizerInstruction; - -typedef struct PyRabbitizerTrackedRegisterState { - PyObject_HEAD - RabbitizerTrackedRegisterState registerState; -} PyRabbitizerTrackedRegisterState; - -typedef struct PyRabbitizerLoPairingInfo { - PyObject_HEAD - RabbitizerLoPairingInfo pairingInfo; -} PyRabbitizerLoPairingInfo; - - -PyObject *rabbitizer_submodule_Utils_Init(void); - -extern PyTypeObject rabbitizer_global_config_TypeObject; - -extern PyTypeObject rabbitizer_type_Enum_TypeObject; -extern PyTypeObject rabbitizer_type_Instruction_TypeObject; -extern PyTypeObject rabbitizer_type_LoPairingInfo_TypeObject; -extern PyTypeObject rabbitizer_type_TrackedRegisterState_TypeObject; -extern PyTypeObject rabbitizer_type_RegistersTracker_TypeObject; - -DECL_ENUM(Abi) -DECL_ENUM(InstrCategory) -DECL_ENUM(InstrId) - -DECL_ENUM(RegGprO32) -DECL_ENUM(RegGprN32) - -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c deleted file mode 100644 index 31b844a8..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_submodule_Utils.c +++ /dev/null @@ -1,81 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include "common/Utils.h" - - -static PyObject *rabbitizer_submodule_Utils_from2Complement(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "number", "bits", NULL }; - uint32_t number = 0; - int bits = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "Ii", kwlist, &number, &bits)) { - return NULL; - } - - return PyLong_FromLong(RabbitizerUtils_From2Complement(number, bits)); -} - -static PyObject *rabbitizer_submodule_Utils_escapeString(UNUSED PyObject *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "src", NULL }; - const char *src = NULL; - Py_ssize_t srcSize = 0; - char *dst; - size_t dstSize; - size_t wroteBytes; - PyObject *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "s#", kwlist, &src, &srcSize)) { - return NULL; - } - - dstSize = 2 * srcSize; - dst = malloc(dstSize * sizeof(char)); - if (dst == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error on 'escapeString'"); - return NULL; - } - - wroteBytes = RabbitizerUtils_escapeString(dst, dstSize, src, srcSize); - if (wroteBytes > dstSize) { - PyErr_SetString(PyExc_RuntimeError, "Internal error on 'escapeString'"); - return NULL; - } - - ret = PyUnicode_FromStringAndSize(dst, wroteBytes); - free(dst); - return ret; -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_submodule_Utils_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction) rabbitizer_submodule_Utils_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - -static PyMethodDef rabbitizer_submodule_Utils_methods[] = { - METHOD_ARGS(from2Complement, ""), - METHOD_ARGS(escapeString, ""), - - { 0 }, -}; - - -static PyModuleDef rabbitizer_submodule_Utils_module = { - PyModuleDef_HEAD_INIT, - .m_name = "rabbitizer.Utils", - .m_doc = "", - .m_size = -1, - .m_methods = rabbitizer_submodule_Utils_methods, -}; - -PyObject *rabbitizer_submodule_Utils_Init(void) { - PyObject *submodule; - - submodule = PyModule_Create(&rabbitizer_submodule_Utils_module); - if (submodule == NULL) { - return NULL; - } - - return submodule; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c deleted file mode 100644 index 5471408d..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_Instruction.c +++ /dev/null @@ -1,436 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" -#include "common/RabbitizerConfig.h" - - -static void rabbitizer_type_Instruction_dealloc(PyRabbitizerInstruction *self) { - RabbitizerInstruction_destroy(&self->instr); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_Instruction_init(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "word", "vram", "category", NULL }; - uint32_t word; - uint32_t vram; - PyObject *category = NULL; - int enumCheck; - RabbitizerInstrCategory instrCategory = RABBITIZER_INSTRCAT_CPU; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "I|IO!", kwlist, &word, &vram, &rabbitizer_type_Enum_TypeObject, &category)) { - return -1; - } - - if (category != NULL) { - enumCheck = rabbitizer_enum_InstrCategory_Check(category); - - if (enumCheck <= 0) { - if (enumCheck == 0) { - PyErr_SetString(PyExc_ValueError, "Invalid value for 'category' parameter"); - } - return -1; - } - - instrCategory = ((PyRabbitizerEnum*)category)->value; - } - - switch (instrCategory) { - case RABBITIZER_INSTRCAT_RSP: - RabbitizerInstructionRsp_init(&self->instr, word, vram); - RabbitizerInstructionRsp_processUniqueId(&self->instr); - break; - - case RABBITIZER_INSTRCAT_R5900: - RabbitizerInstructionR5900_init(&self->instr, word, vram); - RabbitizerInstructionR5900_processUniqueId(&self->instr); - break; - - case RABBITIZER_INSTRCAT_CPU: - case RABBITIZER_INSTRCAT_MAX: - RabbitizerInstruction_init(&self->instr, word, vram); - RabbitizerInstruction_processUniqueId(&self->instr); - break; - } - - return 0; -} - -static PyMemberDef rabbitizer_type_Instruction_members[] = { - { "vram", T_UINT, offsetof(PyRabbitizerInstruction, instr.vram), 0, "vram description" }, - { "inHandwrittenFunction", T_BOOL, offsetof(PyRabbitizerInstruction, instr.inHandwrittenFunction), 0, "inHandwrittenFunction description" }, - - { 0 } -}; - - -#define DEF_MEMBER_GET_UINT(name) \ - static PyObject *rabbitizer_type_Instruction_member_get_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromUnsignedLong(RAB_INSTR_GET_##name(&self->instr)); \ - } - -#define DEF_MEMBER_GET_REGGPR(name) \ - static PyObject *rabbitizer_type_Instruction_member_get_##name(PyRabbitizerInstruction *self, UNUSED PyObject *closure) { \ - uint32_t reg; \ - PyObject *enumInstance = NULL; \ - \ - if (!RabbitizerInstruction_hasOperandAlias(&self->instr, RAB_OPERAND_cpu_##name)) { \ - PyErr_Format(PyExc_RuntimeError, "'%s' instruction does not reference register '" #name "'", RabbitizerInstrId_getOpcodeName(self->instr.uniqueId)); \ - return NULL; \ - } \ - \ - reg = RAB_INSTR_GET_##name(&self->instr); \ - switch (RabbitizerConfig_Cfg.regNames.gprAbiNames) { \ - case RABBITIZER_ABI_N32: \ - case RABBITIZER_ABI_N64: \ - enumInstance = rabbitizer_enum_RegGprN32_enumvalues[reg].instance; \ - break; \ - \ - default: \ - enumInstance = rabbitizer_enum_RegGprO32_enumvalues[reg].instance; \ - break; \ - } \ - \ - if (enumInstance == NULL) { \ - PyErr_SetString(PyExc_RuntimeError, "Internal error: invalid RegGpr enum value"); \ - return NULL; \ - } \ - \ - Py_INCREF(enumInstance); \ - return enumInstance; \ - } - -DEF_MEMBER_GET_REGGPR(rs) -DEF_MEMBER_GET_REGGPR(rt) -DEF_MEMBER_GET_REGGPR(rd) - -DEF_MEMBER_GET_UINT(sa) - -static PyObject *rabbitizer_type_Instruction_member_get_uniqueId(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { - PyObject *enumInstance = rabbitizer_enum_InstrId_enumvalues[self->instr.uniqueId].instance; - - if (enumInstance == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: invalid uniqueId enum value"); - return NULL; - } - - Py_INCREF(enumInstance); - return enumInstance; -} - -#define MEMBER_GET(name, docs, closure) { #name, (getter) rabbitizer_type_Instruction_member_get_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(name, docs, closure) { #name, (getter) NULL, (setter) rabbitizer_type_Instruction_member_set_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(name, docs, closure) { #name, (getter) rabbitizer_type_Instruction_member_get_##name, (setter) rabbitizer_type_Instruction_member_set_##name, PyDoc_STR(docs), closure } - - -static PyGetSetDef rabbitizer_type_Instruction_getsetters[] = { - MEMBER_GET(rs, "", NULL), - MEMBER_GET(rt, "", NULL), - MEMBER_GET(rd, "", NULL), - MEMBER_GET(sa, "", NULL), - MEMBER_GET(uniqueId, "", NULL), - - { 0 } -}; - - -#define DEF_METHOD_GET_UINT(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromUnsignedLong(RabbitizerInstruction_##name(&self->instr)); \ - } - -#define DEF_METHOD_GET_INT(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - return PyLong_FromLong(RabbitizerInstruction_##name(&self->instr)); \ - } - -DEF_METHOD_GET_UINT(getRaw) -DEF_METHOD_GET_UINT(getImmediate) -DEF_METHOD_GET_INT(getProcessedImmediate) -DEF_METHOD_GET_UINT(getInstrIndexAsVram) -DEF_METHOD_GET_INT(getBranchOffset) - -static PyObject *rabbitizer_type_Instruction_getOpcodeName(PyRabbitizerInstruction *self, UNUSED PyObject *closure) { - return PyUnicode_FromString(RabbitizerInstrId_getOpcodeName(self->instr.uniqueId)); -} - -static PyObject *rabbitizer_type_Instruction_getGenericBranchOffset(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "currentVram", NULL }; - uint32_t currentVram; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "I", kwlist, ¤tVram)) { - return NULL; - } - - return PyLong_FromLong(RabbitizerInstruction_getGenericBranchOffset(&self->instr, currentVram)); -} - -static PyObject *rabbitizer_type_Instruction_blankOut(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { - RabbitizerInstruction_blankOut(&self->instr); - Py_RETURN_NONE; -} - - -#define DEF_METHOD_BOOL(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - if (RabbitizerInstruction_##name(&self->instr)) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } - -DEF_METHOD_BOOL(isImplemented) -DEF_METHOD_BOOL(isLikelyHandwritten) -DEF_METHOD_BOOL(isNop) -DEF_METHOD_BOOL(isUnconditionalBranch) -DEF_METHOD_BOOL(isJrRa) -DEF_METHOD_BOOL(isJrNotRa) -DEF_METHOD_BOOL(hasDelaySlot) - -static PyObject *rabbitizer_type_Instruction_mapInstrToType(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { - const char *type = RabbitizerInstruction_mapInstrToType(&self->instr); - - if (type != NULL) { - return PyUnicode_FromString(type); - } - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_Instruction_sameOpcode(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "other", NULL }; - PyRabbitizerInstruction *other; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &other)) { - return NULL; - } - - if (RabbitizerInstruction_sameOpcode(&self->instr, &other->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -static PyObject *rabbitizer_type_Instruction_sameOpcodeButDifferentArguments(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "other", NULL }; - PyRabbitizerInstruction *other; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &other)) { - return NULL; - } - - if (RabbitizerInstruction_sameOpcodeButDifferentArguments(&self->instr, &other->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -DEF_METHOD_BOOL(isValid) - -#define DEF_DESCRIPTOR_METHOD_BOOL(name) \ - static PyObject *rabbitizer_type_Instruction_##name(PyRabbitizerInstruction *self, PyObject *Py_UNUSED(ignored)) { \ - if (RabbitizerInstrDescriptor_##name(self->instr.descriptor)) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } - -DEF_DESCRIPTOR_METHOD_BOOL(isUnknownType) -DEF_DESCRIPTOR_METHOD_BOOL(isJType) -DEF_DESCRIPTOR_METHOD_BOOL(isIType) -DEF_DESCRIPTOR_METHOD_BOOL(isRType) -DEF_DESCRIPTOR_METHOD_BOOL(isRegimmType) -DEF_DESCRIPTOR_METHOD_BOOL(isBranch) -DEF_DESCRIPTOR_METHOD_BOOL(isBranchLikely) -DEF_DESCRIPTOR_METHOD_BOOL(isJump) -DEF_DESCRIPTOR_METHOD_BOOL(isTrap) -DEF_DESCRIPTOR_METHOD_BOOL(isFloat) -DEF_DESCRIPTOR_METHOD_BOOL(isDouble) -DEF_DESCRIPTOR_METHOD_BOOL(isUnsigned) -DEF_DESCRIPTOR_METHOD_BOOL(modifiesRt) -DEF_DESCRIPTOR_METHOD_BOOL(modifiesRd) -DEF_DESCRIPTOR_METHOD_BOOL(notEmitedByCompilers) -DEF_DESCRIPTOR_METHOD_BOOL(canBeHi) -DEF_DESCRIPTOR_METHOD_BOOL(canBeLo) -DEF_DESCRIPTOR_METHOD_BOOL(doesLink) -DEF_DESCRIPTOR_METHOD_BOOL(doesDereference) -DEF_DESCRIPTOR_METHOD_BOOL(doesLoad) -DEF_DESCRIPTOR_METHOD_BOOL(doesStore) -DEF_DESCRIPTOR_METHOD_BOOL(maybeIsMove) -DEF_DESCRIPTOR_METHOD_BOOL(isPseudo) -// TODO: create an enum type for architectureVersion -// architectureVersion - - -static PyObject *rabbitizer_type_Instruction_disassemble(PyRabbitizerInstruction *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"immOverride", "extraLJust", NULL}; - const char *immOverride = NULL; - size_t immOverrideLength = 0; - int extraLJust = 0; - size_t bufferSize; - char *buffer; - PyObject *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zi", kwlist, &immOverride, &extraLJust)) { - return NULL; - } - - if (immOverride != NULL) { - immOverrideLength = strlen(immOverride); - } - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&self->instr, immOverrideLength, extraLJust); - - buffer = malloc(bufferSize+1); - if (buffer == NULL) { - // TODO: signal an exception? - return NULL; - } - - RabbitizerInstruction_disassemble(&self->instr, buffer, immOverride, immOverrideLength, extraLJust); - - ret = PyUnicode_FromString(buffer); - free(buffer); - return ret; -} - - -// To allow piclking the object -static PyObject *rabbitizer_type_Instruction___reduce__(PyRabbitizerInstruction *self, UNUSED PyObject *closure) { - PyObject *args; - PyObject *word; - PyObject *vram; - PyObject *category; - - word = PyLong_FromUnsignedLong(RabbitizerInstruction_getRaw(&self->instr)); - vram = PyLong_FromUnsignedLong(self->instr.vram); - category = rabbitizer_enum_InstrCategory_enumvalues[self->instr.category].instance; - - args = PyTuple_Pack(3, word, vram, category); - - return PyTuple_Pack(2, (PyObject*)&rabbitizer_type_Instruction_TypeObject, args); -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Instruction_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_Instruction_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - - -static PyMethodDef rabbitizer_type_Instruction_methods[] = { - METHOD_NO_ARGS(getRaw, ""), - METHOD_NO_ARGS(getImmediate, ""), - METHOD_NO_ARGS(getProcessedImmediate, ""), - METHOD_NO_ARGS(getInstrIndexAsVram, ""), - METHOD_NO_ARGS(getBranchOffset, ""), - METHOD_ARGS(getGenericBranchOffset, ""), - METHOD_NO_ARGS(getOpcodeName, ""), - - METHOD_NO_ARGS(blankOut, ""), - - METHOD_NO_ARGS(isImplemented, ""), - METHOD_NO_ARGS(isLikelyHandwritten, ""), - METHOD_NO_ARGS(isNop, ""), - METHOD_NO_ARGS(isUnconditionalBranch, ""), - METHOD_NO_ARGS(isJrRa, ""), - METHOD_NO_ARGS(isJrNotRa, ""), - METHOD_NO_ARGS(hasDelaySlot, ""), - METHOD_NO_ARGS(mapInstrToType, ""), - - METHOD_ARGS(sameOpcode, "description"), - METHOD_ARGS(sameOpcodeButDifferentArguments, "description"), - - METHOD_NO_ARGS(isValid, ""), - - METHOD_NO_ARGS(isUnknownType, ""), - METHOD_NO_ARGS(isJType, ""), - METHOD_NO_ARGS(isIType, ""), - METHOD_NO_ARGS(isRType, ""), - METHOD_NO_ARGS(isRegimmType, ""), - METHOD_NO_ARGS(isBranch, ""), - METHOD_NO_ARGS(isBranchLikely, ""), - METHOD_NO_ARGS(isJump, ""), - METHOD_NO_ARGS(isTrap, ""), - METHOD_NO_ARGS(isFloat, ""), - METHOD_NO_ARGS(isDouble, ""), - METHOD_NO_ARGS(isUnsigned, ""), - METHOD_NO_ARGS(modifiesRt, ""), - METHOD_NO_ARGS(modifiesRd, ""), - METHOD_NO_ARGS(notEmitedByCompilers, ""), - METHOD_NO_ARGS(canBeHi, ""), - METHOD_NO_ARGS(canBeLo, ""), - METHOD_NO_ARGS(doesLink, ""), - METHOD_NO_ARGS(doesDereference, ""), - METHOD_NO_ARGS(doesLoad, ""), - METHOD_NO_ARGS(doesStore, ""), - METHOD_NO_ARGS(maybeIsMove, ""), - METHOD_NO_ARGS(isPseudo, ""), - // METHOD_NO_ARGS(getArchitectureVersion, ""), - - METHOD_ARGS(disassemble, "description"), - - METHOD_ARGS(__reduce__, ""), - - { 0 }, -}; - - -static PyObject *rabbitizer_type_Instruction_repr(PyRabbitizerInstruction *self) { - PyObject *ret; - size_t disasmBufferSize; - char *bufferStart; - char *buffer; - size_t typeNameLength; - size_t extraSize = 3 + 8 + 4; // "(0x" + 32bits hex + ") # " - int len; - - typeNameLength = strlen("rabbitizer.Instruction"); - - disasmBufferSize = RabbitizerInstruction_getSizeForBuffer(&self->instr, 0, 0); - - buffer = bufferStart = malloc(disasmBufferSize+1 + typeNameLength + extraSize); - if (buffer == NULL) { - // TODO: signal an exception? - return NULL; - } - - memcpy(buffer, "rabbitizer.Instruction", typeNameLength); - buffer += typeNameLength; - - len = sprintf(buffer, "(0x%08X) # ", RabbitizerInstruction_getRaw(&self->instr)); - if (len != 15) { - // bad stuff - // TODO: exception? - } - assert(len == 15); - buffer += len; - - RabbitizerInstruction_disassemble(&self->instr, buffer, NULL, 0, 0); - - ret = PyUnicode_FromString(bufferStart); - free(bufferStart); - return ret; -} - -static PyObject *rabbitizer_type_Instruction_str(PyRabbitizerInstruction *self) { - return rabbitizer_type_Instruction_disassemble(self, Py_BuildValue("()"), Py_BuildValue("{}")); -} - - -PyTypeObject rabbitizer_type_Instruction_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.Instruction", - .tp_doc = PyDoc_STR("Instruction"), - .tp_basicsize = sizeof(PyRabbitizerInstruction), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_Instruction_init, - .tp_dealloc = (destructor) rabbitizer_type_Instruction_dealloc, - .tp_repr = (reprfunc) rabbitizer_type_Instruction_repr, - .tp_str = (reprfunc) rabbitizer_type_Instruction_str, - .tp_members = rabbitizer_type_Instruction_members, - .tp_methods = rabbitizer_type_Instruction_methods, - .tp_getset = rabbitizer_type_Instruction_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c deleted file mode 100644 index 5a9c62cf..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_LoPairingInfo.c +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - - -static void rabbitizer_type_LoPairingInfo_dealloc(PyRabbitizerLoPairingInfo *self) { - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_LoPairingInfo_init(PyRabbitizerLoPairingInfo *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { NULL }; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "", kwlist)) { - return -1; - } - - RabbitizerLoPairingInfo_Init(&self->pairingInfo); - - return 0; -} - - -static PyMemberDef rabbitizer_type_LoPairingInfo_members[] = { - { "instrOffset", T_INT, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.instrOffset), 0, "" }, - { "value", T_LONG, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.value), 0, "" }, - { "shouldProcess", T_BOOL, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.shouldProcess), 0, "" }, - { "isGpRel", T_BOOL, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.isGpRel), 0, "" }, - { "isGpGot", T_BOOL, offsetof(PyRabbitizerLoPairingInfo, pairingInfo.isGpGot), 0, "" }, - - { 0 } -}; - - -PyTypeObject rabbitizer_type_LoPairingInfo_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.LoPairingInfo", - .tp_doc = PyDoc_STR("LoPairingInfo"), - .tp_basicsize = sizeof(PyRabbitizerLoPairingInfo), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_LoPairingInfo_init, - .tp_dealloc = (destructor) rabbitizer_type_LoPairingInfo_dealloc, - // .tp_repr = (reprfunc) rabbitizer_type_LoPairingInfo_repr, - // .tp_str = (reprfunc) rabbitizer_type_LoPairingInfo_str, - .tp_members = rabbitizer_type_LoPairingInfo_members, - // .tp_methods = rabbitizer_type_Instr_methods, - // .tp_getset = Instr_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c deleted file mode 100644 index ec8f3642..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_RegistersTracker.c +++ /dev/null @@ -1,320 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - -#include "analysis/RabbitizerRegistersTracker.h" - - -typedef struct PyRabbitizerRegistersTracker { - PyObject_HEAD - RabbitizerRegistersTracker tracker; -} PyRabbitizerRegistersTracker; - - -static void rabbitizer_type_RegistersTracker_dealloc(PyRabbitizerRegistersTracker *self) { - RabbitizerRegistersTracker_destroy(&self->tracker); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_RegistersTracker_init(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "other", NULL }; - PyRabbitizerRegistersTracker *pyOther = NULL; - RabbitizerRegistersTracker *other = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O!", kwlist, &rabbitizer_type_RegistersTracker_TypeObject, &pyOther)) { - return -1; - } - - if (pyOther != NULL) { - other = &pyOther->tracker; - } - - RabbitizerRegistersTracker_init(&self->tracker, other); - - return 0; -} - - -static PyObject *rabbitizer_type_RegistersTracker_moveRegisters(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_moveRegisters(&self->tracker, &instr->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - -static PyObject *rabbitizer_type_RegistersTracker_overwriteRegisters(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_overwriteRegisters(&self->tracker, &instr->instr, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_unsetRegistersAfterFuncCall(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "prevInstr", NULL }; - PyRabbitizerInstruction *instr; - PyRabbitizerInstruction *prevInstr; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &rabbitizer_type_Instruction_TypeObject, &prevInstr)) { - return NULL; - } - - RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(&self->tracker, &instr->instr, &prevInstr->instr); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getAddressIfCanSetType(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - uint32_t dstAddress = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - if (RabbitizerRegistersTracker_getAddressIfCanSetType(&self->tracker, &instr->instr, instrOffset, &dstAddress)) { - return PyLong_FromLong(dstAddress); - } - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getJrInfo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - int dstOffset = 0; - uint32_t dstAddress = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_getJrInfo(&self->tracker, &instr->instr, &dstOffset, &dstAddress)) { - return PyTuple_Pack(2, PyLong_FromLong(dstOffset), PyLong_FromLong(dstAddress)); - } - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_processLui(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", "prevInstr", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - PyRabbitizerInstruction *pyPrevInstr = NULL; - RabbitizerInstruction *prevInstr = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i|O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset, &rabbitizer_type_Instruction_TypeObject, &pyPrevInstr)) { - return NULL; - } - - if (pyPrevInstr != NULL) { - prevInstr = &pyPrevInstr->instr; - } - - RabbitizerRegistersTracker_processLui(&self->tracker, &instr->instr, instrOffset, prevInstr); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_processGpLoad(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_processGpLoad(&self->tracker, &instr->instr, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getLuiOffsetForConstant(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - int dstOffset = 0; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_getLuiOffsetForConstant(&self->tracker, &instr->instr, &dstOffset)) { - return PyLong_FromLong(dstOffset); - } - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_processConstant(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "value", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - uint32_t value; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!Ii", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &value, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_processConstant(&self->tracker, &instr->instr, value, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_getLuiOffsetForLo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - int dstOffset = 0; - bool dstIsGp = false; - bool validResults = false; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - validResults = RabbitizerRegistersTracker_getLuiOffsetForLo(&self->tracker, &instr->instr, instrOffset, &dstOffset, &dstIsGp); - - return PyTuple_Pack(3, PyLong_FromLong(dstOffset), PyBool_FromLong(dstIsGp), PyBool_FromLong(validResults)); -} - -static PyObject *rabbitizer_type_RegistersTracker_preprocessLoAndGetInfo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - int instrOffset; - PyRabbitizerLoPairingInfo *ret; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &instrOffset)) { - return NULL; - } - - ret = PyObject_CallObject((PyObject*)&rabbitizer_type_LoPairingInfo_TypeObject, NULL); - if (ret == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: not able to instance LoPairingInfo object"); - return NULL; - } - - ret->pairingInfo = RabbitizerRegistersTracker_preprocessLoAndGetInfo(&self->tracker, &instr->instr, instrOffset); - - return ret; -} - -static PyObject *rabbitizer_type_RegistersTracker_processLo(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", "value", "instrOffset", NULL }; - PyRabbitizerInstruction *instr; - uint32_t value; - int instrOffset; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!Ii", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr, &value, &instrOffset)) { - return NULL; - } - - RabbitizerRegistersTracker_processLo(&self->tracker, &instr->instr, value, instrOffset); - - Py_RETURN_NONE; -} - -static PyObject *rabbitizer_type_RegistersTracker_hasLoButNoHi(PyRabbitizerRegistersTracker *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "instr", NULL }; - PyRabbitizerInstruction *instr; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!", kwlist, &rabbitizer_type_Instruction_TypeObject, &instr)) { - return NULL; - } - - if (RabbitizerRegistersTracker_hasLoButNoHi(&self->tracker, &instr->instr)) { - Py_RETURN_TRUE; - } - Py_RETURN_FALSE; -} - - -#define METHOD_NO_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_NOARGS, PyDoc_STR(docs) } -#define METHOD_ARGS(name, docs) { #name, (PyCFunction)rabbitizer_type_RegistersTracker_##name, METH_VARARGS | METH_KEYWORDS, PyDoc_STR(docs) } - -static PyMethodDef rabbitizer_type_RegistersTracker_methods[] = { - METHOD_ARGS(moveRegisters, ""), - METHOD_ARGS(overwriteRegisters, ""), - METHOD_ARGS(unsetRegistersAfterFuncCall, ""), - METHOD_ARGS(getAddressIfCanSetType, ""), - METHOD_ARGS(getJrInfo, ""), - METHOD_ARGS(processLui, ""), - METHOD_ARGS(processGpLoad, ""), - METHOD_ARGS(getLuiOffsetForConstant, ""), - METHOD_ARGS(processConstant, ""), - METHOD_ARGS(getLuiOffsetForLo, ""), - METHOD_ARGS(preprocessLoAndGetInfo, ""), - METHOD_ARGS(processLo, ""), - METHOD_ARGS(hasLoButNoHi, ""), - - { 0 }, -}; - - -PyObject *rabbitizer_type_RegistersTracker___getitem__(PyRabbitizerRegistersTracker* self, Py_ssize_t index) { - RabbitizerTrackedRegisterState *state; - PyObject *args; - PyRabbitizerTrackedRegisterState *pyState; - - if (index < 0 || index >= ARRAY_COUNT(self->tracker.registers)) { - PyErr_SetString(PyExc_IndexError, "Index must be a value between 0 and 31"); - return NULL; - } - - state = &self->tracker.registers[index]; - - args = Py_BuildValue("(i)", state->registerNum); - if (args == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: not able to instance TrackedRegisterState parameters"); - return NULL; - } - - pyState = PyObject_CallObject((PyObject*)&rabbitizer_type_TrackedRegisterState_TypeObject, args); - Py_DECREF(args); - if (pyState == NULL) { - PyErr_SetString(PyExc_RuntimeError, "Internal error: not able to instance TrackedRegisterState object"); - return NULL; - } - - RabbitizerTrackedRegisterState_copyState(&pyState->registerState, state); - return pyState; -} - - -static PySequenceMethods example_classSeqMethods = { - .sq_item = (ssizeargfunc)rabbitizer_type_RegistersTracker___getitem__, // sq_item -}; - - -PyTypeObject rabbitizer_type_RegistersTracker_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.RegistersTracker", - .tp_doc = PyDoc_STR("RegistersTracker"), - .tp_basicsize = sizeof(PyRabbitizerRegistersTracker), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_RegistersTracker_init, - .tp_dealloc = (destructor) rabbitizer_type_RegistersTracker_dealloc, - // .tp_repr = (reprfunc) rabbitizer_type_RegistersTracker_repr, - .tp_as_sequence = &example_classSeqMethods, - // .tp_str = (reprfunc) rabbitizer_type_RegistersTracker_str, - .tp_methods = rabbitizer_type_RegistersTracker_methods, - // .tp_getset = rabbitizer_type_RegistersTracker_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c b/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c deleted file mode 100644 index 1f52e4d0..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rabbitizer/rabbitizer_type_TrackedRegisterState.c +++ /dev/null @@ -1,102 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "rabbitizer_module.h" - - -static void rabbitizer_type_TrackedRegisterState_dealloc(PyRabbitizerTrackedRegisterState *self) { - RabbitizerTrackedRegisterState_destroy(&self->registerState); - Py_TYPE(self)->tp_free((PyObject *) self); -} - -static int rabbitizer_type_TrackedRegisterState_init(PyRabbitizerTrackedRegisterState *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = { "registerNum", NULL }; - int registerNum; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, ®isterNum)) { - return -1; - } - - RabbitizerTrackedRegisterState_init(&self->registerState, registerNum); - - return 0; -} - - -#define DEF_MEMBER_GET_BOOL(name) \ - static PyObject *rabbitizer_type_TrackedRegisterState_member_get_##name(PyRabbitizerTrackedRegisterState *self, UNUSED PyObject *closure) { \ - if (self->registerState.name) { \ - Py_RETURN_TRUE; \ - } \ - Py_RETURN_FALSE; \ - } - -#define DEF_MEMBER_GET_INT(name) \ - static PyObject *rabbitizer_type_TrackedRegisterState_member_get_##name(PyRabbitizerTrackedRegisterState *self, UNUSED PyObject *closure) { \ - return PyLong_FromLong(self->registerState.name); \ - } - -#define DEF_MEMBER_GET_UINT(name) \ - static PyObject *rabbitizer_type_TrackedRegisterState_member_get_##name(PyRabbitizerTrackedRegisterState *self, UNUSED PyObject *closure) { \ - return PyLong_FromUnsignedLong(self->registerState.name); \ - } - - -DEF_MEMBER_GET_INT(registerNum) - -DEF_MEMBER_GET_BOOL(hasLuiValue) -DEF_MEMBER_GET_INT(luiOffset) -DEF_MEMBER_GET_BOOL(luiSetOnBranchLikely) - -DEF_MEMBER_GET_BOOL(hasGpGot) -DEF_MEMBER_GET_INT(gpGotOffset) - -DEF_MEMBER_GET_BOOL(hasLoValue) -DEF_MEMBER_GET_INT(loOffset) -DEF_MEMBER_GET_BOOL(dereferenced) -DEF_MEMBER_GET_INT(dereferenceOffset) - -DEF_MEMBER_GET_UINT(value) - - -#define MEMBER_GET(name, docs, closure) { #name, (getter) rabbitizer_type_TrackedRegisterState_member_get_##name, (setter) NULL, PyDoc_STR(docs), closure } -#define MEMBER_SET(name, docs, closure) { #name, (getter) NULL, (setter) rabbitizer_type_TrackedRegisterState_member_set_##name, PyDoc_STR(docs), closure } -#define MEMBER_GET_SET(name, docs, closure) { #name, (getter) rabbitizer_type_TrackedRegisterState_member_get_##name, (setter) rabbitizer_type_TrackedRegisterState_member_set_##name, PyDoc_STR(docs), closure } - - -static PyGetSetDef rabbitizer_type_TrackedRegisterState_getsetters[] = { - MEMBER_GET(registerNum, "", NULL), - - MEMBER_GET(hasLuiValue, "", NULL), - MEMBER_GET(luiOffset, "", NULL), - MEMBER_GET(luiSetOnBranchLikely, "", NULL), - - MEMBER_GET(hasGpGot, "", NULL), - MEMBER_GET(gpGotOffset, "", NULL), - - MEMBER_GET(hasLoValue, "", NULL), - MEMBER_GET(loOffset, "", NULL), - MEMBER_GET(dereferenced, "", NULL), - MEMBER_GET(dereferenceOffset, "", NULL), - - MEMBER_GET(value, "", NULL), - - { 0 } -}; - - -PyTypeObject rabbitizer_type_TrackedRegisterState_TypeObject = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "rabbitizer.TrackedRegisterState", - .tp_doc = PyDoc_STR("TrackedRegisterState"), - .tp_basicsize = sizeof(PyRabbitizerTrackedRegisterState), - .tp_itemsize = 0, - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_new = PyType_GenericNew, - .tp_init = (initproc) rabbitizer_type_TrackedRegisterState_init, - .tp_dealloc = (destructor) rabbitizer_type_TrackedRegisterState_dealloc, - // .tp_repr = (reprfunc) rabbitizer_type_TrackedRegisterState_repr, - // .tp_str = (reprfunc) rabbitizer_type_TrackedRegisterState_str, - // .tp_methods = rabbitizer_type_TrackedRegisterState_methods, - .tp_getset = rabbitizer_type_TrackedRegisterState_getsetters, -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c b/tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c deleted file mode 100644 index 5aef0f83..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/registersTrackerTest.c +++ /dev/null @@ -1,41 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" -#include "analysis/RabbitizerRegistersTracker.h" - - -int main() { - RabbitizerRegistersTracker regsTracker; - RabbitizerInstruction instr; - uint32_t word = 0x002D0821; // addu $at, $at, $t5 - uint32_t vram = 0x0042F170; - int instrOffset = 220; - - RabbitizerRegistersTracker_init(®sTracker, NULL); - - RabbitizerInstruction_init(&instr, word, vram); - RabbitizerInstruction_processUniqueId(&instr); - - regsTracker.registers[1] = (RabbitizerTrackedRegisterState){ - .dereferenceOffset = 212, - .dereferenced = true, - .gpGotOffset = 212, - .hasGpGot = true, - .hasLoValue = true, - .hasLuiValue = false, - .loOffset = 212, - .luiOffset = 0, - .luiSetOnBranchLikely = false, - .value = 0x10010000, - .registerNum = regsTracker.registers[1].registerNum, - }; - - RabbitizerRegistersTracker_overwriteRegisters(®sTracker, &instr, instrOffset); - - RabbitizerInstruction_destroy(&instr); - - RabbitizerRegistersTracker_destroy(®sTracker); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/rsptest.c b/tools/ido-static-recomp/tools/rabbitizer/rsptest.c deleted file mode 100644 index 7aa04eef..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/rsptest.c +++ /dev/null @@ -1,44 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionRsp.h" - -#include -#include -#include -#include - - -int main() { - uint32_t word; - RabbitizerInstruction instr; - char *buffer; - int extraLJust = 5; - uint32_t validbits; - - //word = 0x4B01C8E8; // vand $v3, $v25, $v1[0] - word = 0x48952000; // mtc2 $21, $v4[0] - - RabbitizerInstructionRsp_init(&instr, word, 0x80000000); - - RabbitizerInstructionRsp_processUniqueId(&instr); - - buffer = malloc(RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust) + 1); - assert(buffer != NULL); - - RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust); - - printf("%08X: %s\n", word, buffer); - - validbits = RabbitizerInstruction_getValidBits(&instr); - - printf("word: %08X\n", instr.word); - printf("mandatory bits: %08X\n", instr._mandatorybits); - printf("valid bits: %08X\n", validbits); - printf("invalid bits: %08X\n", (~validbits) & instr.word); - - free(buffer); - RabbitizerInstructionRsp_destroy(&instr); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/setup.cfg b/tools/ido-static-recomp/tools/rabbitizer/setup.cfg deleted file mode 100644 index e2bd449e..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/setup.cfg +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -[metadata] -name = rabbitizer -# Version should be synced with include/common/RabbitizerVersion.h -version = 1.2.3 -author = Decompollaborate -license = MIT -description = MIPS instruction decoder -url = https://github.com/Decompollaborate/rabbitizer -project_urls = - Source = https://github.com/Decompollaborate/rabbitizer - Bug Tracker = https://github.com/Decompollaborate/rabbitizer/issues -long_description = file: README.md -long_description_content_type = text/markdown - -[options] -packages = rabbitizer - -[options.package_data] -rabbitizer = - **/*.pyi - **/py.typed diff --git a/tools/ido-static-recomp/tools/rabbitizer/setup.py b/tools/ido-static-recomp/tools/rabbitizer/setup.py deleted file mode 100644 index 2e048e69..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-FileCopyrightText: © 2022 Decompollaborate -# SPDX-License-Identifier: MIT - -from setuptools import setup, Extension - - -setup( - ext_modules=[ - Extension( - name="rabbitizer", - sources=["rabbitizer/rabbitizer_module.c", "rabbitizer/rabbitizer_submodule_Utils.c", "rabbitizer/rabbitizer_type_Instruction.c", "rabbitizer/rabbitizer_global_config.c", "rabbitizer/rabbitizer_type_TrackedRegisterState.c", "rabbitizer/rabbitizer_type_RegistersTracker.c", "rabbitizer/rabbitizer_type_LoPairingInfo.c", - "rabbitizer/enums/rabbitizer_type_Enum.c", "rabbitizer/enums/enums_utils.c", "rabbitizer/enums/rabbitizer_enum_InstrCategory.c", "rabbitizer/enums/rabbitizer_enum_InstrId.c", "rabbitizer/enums/rabbitizer_enum_Abi.c", - "rabbitizer/enums/registers/rabbitizer_enum_GprO32.c", "rabbitizer/enums/registers/rabbitizer_enum_GprN32.c", - "src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction.c", "src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c", - "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c", "src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c", - "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c", "src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c", - "src/instructions/RabbitizerInstrDescriptor.c", "src/instructions/RabbitizerInstrId.c", "src/instructions/RabbitizerRegister.c", "src/instructions/RabbitizerInstrSuffix.c", - "src/analysis/RabbitizerTrackedRegisterState.c", "src/analysis/RabbitizerRegistersTracker.c", "src/analysis/RabbitizerLoPairingInfo.c", - "src/common/Utils.c", "src/common/RabbitizerVersion.c", "src/common/RabbitizerConfig.c"], - include_dirs=["include", "rabbitizer"], - extra_compile_args = [ - "-std=c11", - "-Wall", - "-g", - ], - ), - ], -) diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c b/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c deleted file mode 100644 index 0b4dc795..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerLoPairingInfo.c +++ /dev/null @@ -1,14 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RabbitizerLoPairingInfo.h" - -void RabbitizerLoPairingInfo_Init(RabbitizerLoPairingInfo *self) { - *self = (RabbitizerLoPairingInfo){ - .instrOffset = 0, - .value = 0, - .shouldProcess = false, - .isGpRel = false, - .isGpGot = false, - }; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c b/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c deleted file mode 100644 index 82913688..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerRegistersTracker.c +++ /dev/null @@ -1,425 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RabbitizerRegistersTracker.h" - -#include - -#include "common/Utils.h" -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" - -// TODO: abi checks - -void RabbitizerRegistersTracker_init(RabbitizerRegistersTracker *self, const RabbitizerRegistersTracker *other) { - size_t i; - - for (i = 0; i < ARRAY_COUNT(self->registers); i++) { - RabbitizerTrackedRegisterState_init(&self->registers[i], i); - if (other != NULL) { - RabbitizerTrackedRegisterState_copyState(&self->registers[i], &other->registers[i]); - } - } -} - -void RabbitizerRegistersTracker_destroy(RabbitizerRegistersTracker *self) { - for (size_t i = 0; i < ARRAY_COUNT(self->registers); i++) { - RabbitizerTrackedRegisterState_destroy(&self->registers[i]); - } -} - -// TODO: simplify logic -bool RabbitizerRegistersTracker_moveRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr) { - RabbitizerTrackedRegisterState *dstState; - RabbitizerTrackedRegisterState *srcState; - uint8_t reg; - uint8_t rd = RAB_INSTR_GET_rd(instr); - uint8_t rs = RAB_INSTR_GET_rs(instr); - uint8_t rt = RAB_INSTR_GET_rt(instr); - - if (!RabbitizerInstrDescriptor_maybeIsMove(instr->descriptor)) { - return false; - } - if (rt == 0 && rs == 0) { - // ? - // RabbitizerTrackedRegisterState_clear(dstState); - return false; - } - - if (rt == 0) { - reg = rs; - } else if (rs == 0) { - reg = rt; - } else { - if (RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rs]) && !RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rt])) { - reg = rs; - } else if (RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rt]) && !RabbitizerTrackedRegisterState_hasAnyValue(&self->registers[rs])) { - reg = rt; - } else if (rd == rs) { // Check stuff like `addu $3, $3, $2` - reg = rt; - if (self->registers[rs].hasLuiValue || self->registers[rs].hasGpGot) { - reg = rs; - } - } else if (rd == rt) { - reg = rs; - if (self->registers[rt].hasLuiValue || self->registers[rt].hasGpGot) { - reg = rt; - } - } else { - // ? - // RabbitizerTrackedRegisterState_clear(dstState); - return false; - } - - srcState = &self->registers[reg]; - RabbitizerTrackedRegisterState_copyState(&self->registers[rd], srcState); - return true; - } - - srcState = &self->registers[reg]; - dstState = &self->registers[rd]; - - if (RabbitizerTrackedRegisterState_hasAnyValue(srcState)) { - RabbitizerTrackedRegisterState_copyState(dstState, srcState); - return true; - } - - RabbitizerTrackedRegisterState_clear(dstState); - return false; -} - -void RabbitizerRegistersTracker_overwriteRegisters(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset) { - bool shouldRemove = false; - uint8_t reg = 0; - RabbitizerTrackedRegisterState *state = NULL; - - if (RabbitizerRegistersTracker_moveRegisters(self, instr)) { - return; - } - - if (RabbitizerInstrDescriptor_isFloat(instr->descriptor)) { - switch (instr->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_mtc1: - case RABBITIZER_INSTR_ID_cpu_dmtc1: - case RABBITIZER_INSTR_ID_cpu_ctc1: - // IDO usually use a reg as a temp when loading a constant value - // into the float coprocessor, after that IDO never re-uses the value - // in that reg for anything else - shouldRemove = true; - reg = RAB_INSTR_GET_rt(instr); - break; - - default: - break; - } - } else if (RabbitizerInstrDescriptor_isRType(instr->descriptor) || - (RabbitizerInstrDescriptor_isBranch(instr->descriptor) && RabbitizerInstrDescriptor_isIType(instr->descriptor))) { - // $at usually is a one-use reg - uint8_t at = 0; - - if (RAB_INSTR_GET_rs(instr) == 1) { - at = RAB_INSTR_GET_rs(instr); - } else if (RAB_INSTR_GET_rt(instr) == 1) { - at = RAB_INSTR_GET_rt(instr); - } - - state = &self->registers[at]; - if (state->hasLoValue || state->hasLuiValue || state->hasGpGot) { - shouldRemove = true; - reg = at; - } - } - - if (RabbitizerInstrDescriptor_modifiesRt(instr->descriptor)) { - shouldRemove = true; - reg = RAB_INSTR_GET_rt(instr); - if (RabbitizerInstrDescriptor_canBeHi(instr->descriptor)) { - RabbitizerTrackedRegisterState_clearLo(&self->registers[RAB_INSTR_GET_rt(instr)]); - shouldRemove = false; - } - } - if (RabbitizerInstrDescriptor_modifiesRd(instr->descriptor)) { - shouldRemove = true; - reg = RAB_INSTR_GET_rd(instr); - } - - if (shouldRemove) { - state = &self->registers[reg]; -#if 0 - if (state->hasLuiValue) { - self->_printDebugInfo_clearRegister(instr, reg) - } -#endif - - RabbitizerTrackedRegisterState_clearHi(state); - if (!RabbitizerTrackedRegisterState_wasSetInCurrentOffset(state, instrOffset)) { - RabbitizerTrackedRegisterState_clearGp(state); - RabbitizerTrackedRegisterState_clearLo(state); - } - } -} - -void RabbitizerRegistersTracker_unsetRegistersAfterFuncCall(RabbitizerRegistersTracker *self, UNUSED const RabbitizerInstruction *instr, - const RabbitizerInstruction *prevInstr) { - RabbitizerTrackedRegisterState *state = NULL; - - if (!RabbitizerInstrDescriptor_doesLink(prevInstr->descriptor)) { - return; - } - - if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_O32 || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_NUMERIC) { - for (size_t reg = 0; reg < ARRAY_COUNT(self->registers); reg++) { - switch (reg) { - case RABBITIZER_REG_GPR_O32_at: - case RABBITIZER_REG_GPR_O32_v0: - case RABBITIZER_REG_GPR_O32_v1: - case RABBITIZER_REG_GPR_O32_a0: - case RABBITIZER_REG_GPR_O32_a1: - case RABBITIZER_REG_GPR_O32_a2: - case RABBITIZER_REG_GPR_O32_a3: - case RABBITIZER_REG_GPR_O32_t0: - case RABBITIZER_REG_GPR_O32_t1: - case RABBITIZER_REG_GPR_O32_t2: - case RABBITIZER_REG_GPR_O32_t3: - case RABBITIZER_REG_GPR_O32_t4: - case RABBITIZER_REG_GPR_O32_t5: - case RABBITIZER_REG_GPR_O32_t6: - case RABBITIZER_REG_GPR_O32_t7: - case RABBITIZER_REG_GPR_O32_t8: - case RABBITIZER_REG_GPR_O32_t9: - case RABBITIZER_REG_GPR_O32_ra: - state = &self->registers[reg]; -#if 0 - if (state.hasLuiValue) { - self->_printDebugInfo_clearRegister(instr, reg) - } -#endif - RabbitizerTrackedRegisterState_clear(state); - break; - - default: - break; - } - } - } else if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_N32 || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_N64) { - for (size_t reg = 0; reg < ARRAY_COUNT(self->registers); reg++) { - switch (reg) { - case RABBITIZER_REG_GPR_N32_at: - case RABBITIZER_REG_GPR_N32_v0: - case RABBITIZER_REG_GPR_N32_v1: - case RABBITIZER_REG_GPR_N32_a0: - case RABBITIZER_REG_GPR_N32_a1: - case RABBITIZER_REG_GPR_N32_a2: - case RABBITIZER_REG_GPR_N32_a3: - case RABBITIZER_REG_GPR_N32_a4: - case RABBITIZER_REG_GPR_N32_a5: - case RABBITIZER_REG_GPR_N32_a6: - case RABBITIZER_REG_GPR_N32_a7: - case RABBITIZER_REG_GPR_N32_t0: - case RABBITIZER_REG_GPR_N32_t1: - case RABBITIZER_REG_GPR_N32_t2: - case RABBITIZER_REG_GPR_N32_t3: - case RABBITIZER_REG_GPR_N32_t8: - case RABBITIZER_REG_GPR_N32_t9: - case RABBITIZER_REG_GPR_N32_ra: - state = &self->registers[reg]; -#if 0 - if (state.hasLuiValue) { - self->_printDebugInfo_clearRegister(instr, reg) - } -#endif - RabbitizerTrackedRegisterState_clear(state); - break; - - default: - break; - } - } - } -} - -bool RabbitizerRegistersTracker_getAddressIfCanSetType(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, - uint32_t *dstAddress) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (!state->hasLoValue) { - return false; - } - - if (!state->dereferenced || instrOffset == state->dereferenceOffset) { - *dstAddress = state->value; - return true; - } - - return false; -} - -bool RabbitizerRegistersTracker_getJrInfo(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset, uint32_t *dstAddress) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (!state->hasLoValue || !state->dereferenced) { - return false; - } - - *dstOffset = state->loOffset; - *dstAddress = state->value; - return true; -} - -// prevInstr can be NULL -void RabbitizerRegistersTracker_processLui(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, - const RabbitizerInstruction *prevInstr) { - RabbitizerTrackedRegisterState *state = NULL; - - assert(RabbitizerInstrDescriptor_canBeHi(instr->descriptor)); - - state = &self->registers[RAB_INSTR_GET_rt(instr)]; - RabbitizerTrackedRegisterState_clear(state); - RabbitizerTrackedRegisterState_setHi(state, RabbitizerInstruction_getImmediate(instr), instrOffset); - - if (prevInstr != NULL) { - // If the previous instructions is a branch likely, then nulify - // the effects of this instruction for future analysis - state->luiSetOnBranchLikely = RabbitizerInstrDescriptor_isBranchLikely(prevInstr->descriptor) || RabbitizerInstruction_isUnconditionalBranch(prevInstr); - } -} - -void RabbitizerRegistersTracker_processGpLoad(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset) { - RabbitizerTrackedRegisterState *state = NULL; - - assert(RabbitizerInstrDescriptor_canBeLo(instr->descriptor)); - - state = &self->registers[RAB_INSTR_GET_rt(instr)]; - - RabbitizerTrackedRegisterState_clear(state); - RabbitizerTrackedRegisterState_setGpLoad(state, RabbitizerInstruction_getImmediate(instr), instrOffset); -} - -bool RabbitizerRegistersTracker_getLuiOffsetForConstant(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int *dstOffset) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (!state->hasLuiValue) { - return false; - } - - *dstOffset = state->luiOffset; - return true; -} - -void RabbitizerRegistersTracker_processConstant(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset) { - RabbitizerTrackedRegisterState *stateDst = &self->registers[RAB_INSTR_GET_rt(instr)]; - - RabbitizerTrackedRegisterState_setLo(stateDst, value, offset); -} - -// TODO: this function should not be changing the state of the tracker -bool RabbitizerRegistersTracker_getLuiOffsetForLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, int instrOffset, int *dstOffset, - bool *dstIsGp) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - - if (state->hasLuiValue && !state->luiSetOnBranchLikely) { - *dstOffset = state->luiOffset; - *dstIsGp = false; - return true; - } - - // TODO: abi - if (RAB_INSTR_GET_rs(instr) == 28) { // $gp - *dstOffset = 0; - *dstIsGp = true; - return true; - } - - if (RabbitizerInstrDescriptor_modifiesRt(instr->descriptor) && RabbitizerInstrDescriptor_doesDereference(instr->descriptor)) { - if (state->hasLoValue && !state->dereferenced) { - // Simulate a dereference - RabbitizerTrackedRegisterState_dereferenceState(&self->registers[RAB_INSTR_GET_rt(instr)], state, instrOffset); - } - } - - return false; -} - -RabbitizerLoPairingInfo RabbitizerRegistersTracker_preprocessLoAndGetInfo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, - int instrOffset) { - const RabbitizerTrackedRegisterState *state = &self->registers[RAB_INSTR_GET_rs(instr)]; - RabbitizerLoPairingInfo pairingInfo; - - RabbitizerLoPairingInfo_Init(&pairingInfo); - - if (state->hasLuiValue && !state->luiSetOnBranchLikely) { - pairingInfo.instrOffset = state->luiOffset; - pairingInfo.value = state->value; - pairingInfo.shouldProcess = true; - return pairingInfo; - } - - if ((RAB_INSTR_GET_rs(instr) == RABBITIZER_REG_GPR_O32_gp) || (RAB_INSTR_GET_rs(instr) == RABBITIZER_REG_GPR_N32_gp)) { - pairingInfo.value = state->value; - pairingInfo.isGpRel = true; - pairingInfo.shouldProcess = true; - return pairingInfo; - } - - if (state->hasGpGot) { - pairingInfo.instrOffset = state->gpGotOffset; - pairingInfo.value = state->value; - pairingInfo.shouldProcess = true; - pairingInfo.isGpGot = true; - return pairingInfo; - } - - if (RabbitizerInstrDescriptor_modifiesRt(instr->descriptor) && RabbitizerInstrDescriptor_doesDereference(instr->descriptor)) { - if (state->hasLoValue && !state->dereferenced) { - // Simulate a dereference - RabbitizerTrackedRegisterState_dereferenceState(&self->registers[RAB_INSTR_GET_rt(instr)], state, instrOffset); - } - } - - return pairingInfo; -} - -void RabbitizerRegistersTracker_processLo(RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr, uint32_t value, int offset) { - RabbitizerTrackedRegisterState *stateDst; - - if (!RabbitizerInstrDescriptor_modifiesRt(instr->descriptor)) { - return; - } - - stateDst = &self->registers[RAB_INSTR_GET_rt(instr)]; - RabbitizerTrackedRegisterState_setLo(stateDst, value, offset); - if (RabbitizerInstrDescriptor_doesDereference(instr->descriptor)) { - RabbitizerTrackedRegisterState_deref(stateDst, offset); - } - if (RAB_INSTR_GET_rt(instr) == RAB_INSTR_GET_rs(instr)) { - RabbitizerTrackedRegisterState_clearHi(stateDst); - RabbitizerTrackedRegisterState_clearGp(stateDst); - } -} - -bool RabbitizerRegistersTracker_hasLoButNoHi(const RabbitizerRegistersTracker *self, const RabbitizerInstruction *instr) { - const RabbitizerTrackedRegisterState *state; - - assert(instr != NULL); - - state = &self->registers[RAB_INSTR_GET_rs(instr)]; - return state->hasLoValue && !state->hasLuiValue; -} - -#if 0 -def _printDebugInfo_clearRegister(self, instr: rabbitizer.Instruction, reg: int, currentVram: int|None=None) -> None: - if not common.GlobalConfig.PRINT_SYMBOL_FINDER_DEBUG_INFO: - return - - if currentVram is None: - return - - print("Clearing reg:") - // print() - print(f"vram: {currentVram:X}") - print(instr) - print(self->registers) - // TODO - // print(f"deleting {reg} / {instr->getRegisterName(reg)}") - print() -#endif diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c b/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c deleted file mode 100644 index 91298945..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/analysis/RabbitizerTrackedRegisterState.c +++ /dev/null @@ -1,142 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "analysis/RabbitizerTrackedRegisterState.h" - -#include - -#include "common/Utils.h" -#include "instructions/RabbitizerRegister.h" - -void RabbitizerTrackedRegisterState_init(RabbitizerTrackedRegisterState *self, int registerNum) { - self->registerNum = registerNum; - - self->hasLuiValue = false; - self->luiOffset = 0; - self->luiSetOnBranchLikely = false; - - self->hasGpGot = false; - self->gpGotOffset = 0; - - self->hasLoValue = false; - self->loOffset = 0; - self->dereferenced = false; - self->dereferenceOffset = 0; - - self->value = 0; -} - -void RabbitizerTrackedRegisterState_destroy(UNUSED RabbitizerTrackedRegisterState *self) { -} - -void RabbitizerTrackedRegisterState_clear(RabbitizerTrackedRegisterState *self) { - self->hasLuiValue = false; - self->luiOffset = 0; - self->luiSetOnBranchLikely = false; - - self->hasGpGot = false; - self->gpGotOffset = 0; - - self->hasLoValue = false; - self->loOffset = 0; - self->dereferenced = false; - self->dereferenceOffset = 0; - self->value = 0; -} - -void RabbitizerTrackedRegisterState_clearHi(RabbitizerTrackedRegisterState *self) { - self->hasLuiValue = false; - self->luiOffset = 0; - self->luiSetOnBranchLikely = false; -} - -void RabbitizerTrackedRegisterState_clearGp(RabbitizerTrackedRegisterState *self) { - self->hasGpGot = false; - self->gpGotOffset = 0; -} - -void RabbitizerTrackedRegisterState_clearLo(RabbitizerTrackedRegisterState *self) { - self->hasLoValue = false; - self->loOffset = 0; - self->dereferenced = false; - self->dereferenceOffset = 0; -} - -void RabbitizerTrackedRegisterState_copyState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other) { - self->hasLuiValue = other->hasLuiValue; - self->luiOffset = other->luiOffset; - self->luiSetOnBranchLikely = other->luiSetOnBranchLikely; - - self->hasGpGot = other->hasGpGot; - self->gpGotOffset = other->gpGotOffset; - - self->hasLoValue = other->hasLoValue; - self->loOffset = other->loOffset; - self->dereferenced = other->dereferenced; - self->dereferenceOffset = other->dereferenceOffset; - - self->value = other->value; -} - -void RabbitizerTrackedRegisterState_setHi(RabbitizerTrackedRegisterState *self, uint32_t value, int offset) { - assert(!self->hasGpGot); - - self->hasLuiValue = true; - self->luiOffset = offset; - self->value = value << 16; -} - -void RabbitizerTrackedRegisterState_setGpLoad(RabbitizerTrackedRegisterState *self, uint32_t value, int offset) { - assert(!self->hasLuiValue); - - self->hasGpGot = true; - self->gpGotOffset = offset; - self->value = value; -} - -void RabbitizerTrackedRegisterState_setLo(RabbitizerTrackedRegisterState *self, uint32_t value, int offset) { - self->value = value; - self->loOffset = offset; - self->hasLoValue = true; - self->dereferenced = false; - self->dereferenceOffset = 0; -} - -void RabbitizerTrackedRegisterState_deref(RabbitizerTrackedRegisterState *self, int offset) { - self->dereferenced = true; - self->dereferenceOffset = offset; -} - -void RabbitizerTrackedRegisterState_dereferenceState(RabbitizerTrackedRegisterState *self, const RabbitizerTrackedRegisterState *other, int offset) { - assert(other->hasLoValue); - assert(!other->dereferenced); - - RabbitizerTrackedRegisterState_copyState(self, other); - RabbitizerTrackedRegisterState_deref(self, offset); -} - -bool RabbitizerTrackedRegisterState_hasAnyValue(const RabbitizerTrackedRegisterState *self) { - return self->hasLuiValue || self->hasLoValue || self->hasGpGot; -} - -bool RabbitizerTrackedRegisterState_wasSetInCurrentOffset(const RabbitizerTrackedRegisterState *self, int offset) { - return self->loOffset == offset || self->dereferenceOffset == offset; -} - -void RabbitizerTrackedRegisterState_fprint(const RabbitizerTrackedRegisterState *self, FILE *outFile) { - fprintf(outFile, "TrackedRegisterState(%i / %s)\n", self->registerNum, RabbitizerRegister_getNameGpr(self->registerNum)); - - fprintf(outFile, " hasLuiValue: %s\n", self->hasLuiValue ? "true" : "false"); - fprintf(outFile, " luiOffset: 0x%X\n", self->luiOffset); - fprintf(outFile, " luiSetOnBranchLikely: %s\n", self->luiSetOnBranchLikely ? "true" : "false"); - - fprintf(outFile, " hasGpGot: %s\n", self->hasGpGot ? "true" : "false"); - fprintf(outFile, " gpGotOffset: 0x%X\n", self->gpGotOffset); - - fprintf(outFile, " hasLoValue: %s\n", self->hasLoValue ? "true" : "false"); - fprintf(outFile, " loOffset: %X\n", self->loOffset); - fprintf(outFile, " dereferenced: %s\n", self->dereferenced ? "true" : "false"); - fprintf(outFile, " dereferenceOffset: %X\n", self->dereferenceOffset); - - fprintf(outFile, " value: %X\n", self->value); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c b/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c deleted file mode 100644 index 88b554db..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerConfig.c +++ /dev/null @@ -1,50 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "common/RabbitizerConfig.h" - -#include - -RabbitizerAbi RabbitizerAbi_fromStr(const char *name) { - if (name == NULL || strcmp(name, "32") == 0 || strcmp(name, "o32") == 0 || strcmp(name, "O32") == 0) { - return RABBITIZER_ABI_O32; - } - if (strcmp(name, "n32") == 0 || strcmp(name, "N32") == 0) { - return RABBITIZER_ABI_N32; - } - if (strcmp(name, "64") == 0 || strcmp(name, "n64") == 0 || strcmp(name, "N64") == 0) { - return RABBITIZER_ABI_N64; - } - return RABBITIZER_ABI_NUMERIC; -} - -RabbitizerConfig RabbitizerConfig_Cfg = { - .regNames = { - .namedRegisters = true, - .gprAbiNames = RABBITIZER_ABI_O32, - .fprAbiNames = RABBITIZER_ABI_NUMERIC, - .userFpcCsr = true, - .vr4300Cop0NamedRegisters = true, - .vr4300RspCop0NamedRegisters = true, - }, - .pseudos = { - .enablePseudos = true, - .pseudoBeqz = true, - .pseudoBnez = true, - .pseudoB = true, - .pseudoMove = true, - .pseudoNot = true, - .pseudoNegu = true, - .pseudoBal = true, - }, - .toolchainTweaks = { - .treatJAsUnconditionalBranch = false, - .sn64DivFix = false, - }, - .misc = { - .opcodeLJust = 7+4, - .unknownInstrComment = true, - .omit0XOnSmallImm = false, - .upperCaseImm = true, - } -}; diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c b/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c deleted file mode 100644 index f700fbfe..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/common/RabbitizerVersion.c +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "common/RabbitizerVersion.h" - -const int RabVersion_Major = RAB_VERSION_MAJOR; -const int RabVersion_Minor = RAB_VERSION_MINOR; -const int RabVersion_Patch = RAB_VERSION_PATCH; - -const char RabVersion_Str[] = RAB_VERSION_STR; diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c b/tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c deleted file mode 100644 index 7dd02622..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/common/Utils.c +++ /dev/null @@ -1,78 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "common/Utils.h" - -#include -#include - -int32_t RabbitizerUtils_From2Complement(uint32_t number, int bits) { - bool isNegative = number & (1ULL << (bits - 1)); - - if (isNegative) { - return -((~number + 1) & ((1ULL << bits) - 1)); - } - - return number; -} - -size_t RabbitizerUtils_CharFill(char *dst, int count, char fillchar) { - if (count <= 0) { - return 0; - } - - memset(dst, fillchar, count); - - return count; -} - -size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, size_t srcSize) { - size_t srcPos = 0; - size_t dstpos = 0; - - for (; srcPos < srcSize && dstpos < dstSize; srcPos++, src++) { - // The cases of this switch are sorted by ASCII order - switch (*src) { - case '\a': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'a'); - break; - - case '\t': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 't'); - break; - - case '\n': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'n'); - break; - - case '\f': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'f'); - break; - - case '\r': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'r'); - break; - - case '"': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '"'); - break; - - case '\\': - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\'); - break; - - default: - RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, *src); - break; - } - } - - return dstpos; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c deleted file mode 100644 index a6e143f9..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrDescriptor.c +++ /dev/null @@ -1,104 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstrDescriptor.h" - -#include "instructions/RabbitizerInstruction.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = { __VA_ARGS__ }, - -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -const RabbitizerInstrDescriptor RabbitizerInstrDescriptor_Descriptors[] = { -#include "instructions/instr_id/RabbitizerInstrId_cpu.inc" -#include "instructions/instr_id/RabbitizerInstrId_rsp.inc" -#include "instructions/instr_id/RabbitizerInstrId_r5900.inc" -}; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -bool RabbitizerInstrDescriptor_isUnknownType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_UNKNOWN; -} -bool RabbitizerInstrDescriptor_isJType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_J; -} -bool RabbitizerInstrDescriptor_isIType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_I; -} -bool RabbitizerInstrDescriptor_isRType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_R; -} -bool RabbitizerInstrDescriptor_isRegimmType(const RabbitizerInstrDescriptor *self) { - return self->instrType == RABBITIZER_INSTR_TYPE_REGIMM; -} - -RabbitizerInstrSuffix RabbitizerInstrDescriptor_instrSuffix(const RabbitizerInstrDescriptor *self) { - return self->instrSuffix; -} - -bool RabbitizerInstrDescriptor_isBranch(const RabbitizerInstrDescriptor *self) { - return self->isBranch; -} -bool RabbitizerInstrDescriptor_isBranchLikely(const RabbitizerInstrDescriptor *self) { - return self->isBranchLikely; -} -bool RabbitizerInstrDescriptor_isJump(const RabbitizerInstrDescriptor *self) { - return self->isJump; -} -bool RabbitizerInstrDescriptor_isTrap(const RabbitizerInstrDescriptor *self) { - return self->isTrap; -} - -bool RabbitizerInstrDescriptor_isFloat(const RabbitizerInstrDescriptor *self) { - return self->isFloat; -} -bool RabbitizerInstrDescriptor_isDouble(const RabbitizerInstrDescriptor *self) { - return self->isDouble; -} - -bool RabbitizerInstrDescriptor_isUnsigned(const RabbitizerInstrDescriptor *self) { - return self->isUnsigned; -} - -bool RabbitizerInstrDescriptor_modifiesRt(const RabbitizerInstrDescriptor *self) { - return self->modifiesRt; -} -bool RabbitizerInstrDescriptor_modifiesRd(const RabbitizerInstrDescriptor *self) { - return self->modifiesRd; -} - -bool RabbitizerInstrDescriptor_notEmitedByCompilers(const RabbitizerInstrDescriptor *self) { - return self->notEmitedByCompilers; -} - -bool RabbitizerInstrDescriptor_canBeHi(const RabbitizerInstrDescriptor *self) { - return self->canBeHi; -} -bool RabbitizerInstrDescriptor_canBeLo(const RabbitizerInstrDescriptor *self) { - return self->canBeLo; -} -bool RabbitizerInstrDescriptor_doesLink(const RabbitizerInstrDescriptor *self) { - return self->doesLink; -} -bool RabbitizerInstrDescriptor_doesDereference(const RabbitizerInstrDescriptor *self) { - return self->doesDereference; -} -bool RabbitizerInstrDescriptor_doesLoad(const RabbitizerInstrDescriptor *self) { - return self->doesLoad; -} -bool RabbitizerInstrDescriptor_doesStore(const RabbitizerInstrDescriptor *self) { - return self->doesStore; -} -bool RabbitizerInstrDescriptor_maybeIsMove(const RabbitizerInstrDescriptor *self) { - return self->maybeIsMove; -} - -bool RabbitizerInstrDescriptor_isPseudo(const RabbitizerInstrDescriptor *self) { - return self->isPseudo; -} - -RabbitizerArchitectureVersion RabbitizerInstrDescriptor_getArchitectureVersion(const RabbitizerInstrDescriptor *self) { - return self->architectureVersion; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c deleted file mode 100644 index b8643314..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrId.c +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstrId.h" - -#include - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #name, - -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) [RABBITIZER_INSTR_ID_##prefix##_##name] = #altname, - -const char *RabbitizerInstrId_Names[] = { -#include "instructions/instr_id/RabbitizerInstrId_cpu.inc" -#include "instructions/instr_id/RabbitizerInstrId_rsp.inc" -#include "instructions/instr_id/RabbitizerInstrId_r5900.inc" -}; - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -const char *RabbitizerInstrId_getOpcodeName(RabbitizerInstrId uniqueId) { - assert(uniqueId >= RABBITIZER_INSTR_ID_cpu_INVALID && uniqueId < RABBITIZER_INSTR_ID_ALL_MAX); - assert(uniqueId != RABBITIZER_INSTR_ID_cpu_MAX); - assert(uniqueId != RABBITIZER_INSTR_ID_rsp_MAX); - assert(uniqueId != RABBITIZER_INSTR_ID_r5900_MAX); - - return RabbitizerInstrId_Names[uniqueId]; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c deleted file mode 100644 index cef16b30..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstrSuffix.c +++ /dev/null @@ -1,62 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstrSuffix.h" - -#include - -#include "common/Utils.h" -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -typedef size_t (*InstrSuffixCallback)(const RabbitizerInstruction *self, char *dst); - -size_t RabbitizerInstrSuffix_None(UNUSED const RabbitizerInstruction *self, UNUSED char *dst) { - return 0; -} - -size_t RabbitizerInstrSuffixR5900_xyzw(const RabbitizerInstruction *self, char *dst) { - size_t totalSize = 0; - - if (RAB_INSTR_R5900_GET_xyzw_x(self) || RAB_INSTR_R5900_GET_xyzw_y(self) || RAB_INSTR_R5900_GET_xyzw_z(self) || RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '.'); - } - - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } - - return totalSize; -} -const InstrSuffixCallback instrSuffixCallbacks[] = { - [RABINSTRSUFFIX_NONE] = RabbitizerInstrSuffix_None, - - [RABINSTRSUFFIX_R5900_xyzw] = RabbitizerInstrSuffixR5900_xyzw, -}; - -size_t RabbitizerInstrSuffix_getSizeForBuffer(UNUSED const RabbitizerInstruction *self, UNUSED RabbitizerInstrSuffix instrSuffix) { - // Just hardcode the size of the bigger possible suffix, faster than actually computing it. - return 5; -} - -size_t RabbitizerInstrSuffix_processSuffix(const RabbitizerInstruction *self, char *dst, RabbitizerInstrSuffix instrSuffix) { - InstrSuffixCallback callback; - - assert(instrSuffix >= RABINSTRSUFFIX_NONE); - assert(instrSuffix < RABINSTRSUFFIX_MAX); - - callback = instrSuffixCallbacks[instrSuffix]; - assert(callback != NULL); - - return callback(self, dst); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c deleted file mode 100644 index 5e0bf056..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction.c +++ /dev/null @@ -1,368 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include - -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -void RabbitizerInstruction_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) { - self->word = word; - self->_mandatorybits = 0; - - self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID; - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - self->vram = vram; - self->_handwrittenCategory = false; - self->inHandwrittenFunction = false; - self->category = RABBITIZER_INSTRCAT_CPU; -} - -void RabbitizerInstruction_destroy(UNUSED RabbitizerInstruction *self) { -} - -/* General getters */ - -uint32_t RabbitizerInstruction_getRaw(const RabbitizerInstruction *self) { - return self->word; -} - -uint32_t RabbitizerInstruction_getImmediate(const RabbitizerInstruction *self) { - return RAB_INSTR_GET_immediate(self); -} -int32_t RabbitizerInstruction_getProcessedImmediate(const RabbitizerInstruction *self) { - if (RabbitizerInstrDescriptor_isUnsigned(self->descriptor)) { - return RAB_INSTR_GET_immediate(self); - } - return RabbitizerUtils_From2Complement(RAB_INSTR_GET_immediate(self), 16); -} - -uint32_t RabbitizerInstruction_getInstrIndex(const RabbitizerInstruction *self) { - return RAB_INSTR_GET_instr_index(self); -} - -uint32_t RabbitizerInstruction_getInstrIndexAsVram(const RabbitizerInstruction *self) { - uint32_t vram = RabbitizerInstruction_getInstrIndex(self) << 2; - - if (self->vram == 0) { - vram |= 0x80000000; - } else { - // Jumps are PC-region branches. The upper bits are filled with the address in the delay slot - vram |= (self->vram + 4) & 0xFF000000; - } - return vram; -} - -int32_t RabbitizerInstruction_getBranchOffset(const RabbitizerInstruction *self) { - int32_t diff = RabbitizerUtils_From2Complement(RabbitizerInstruction_getImmediate(self), 16); - - return diff * 4 + 4; -} - -int32_t RabbitizerInstruction_getGenericBranchOffset(const RabbitizerInstruction *self, uint32_t currentVram) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_j) { - return RabbitizerInstruction_getInstrIndexAsVram(self) - currentVram; - } - return RabbitizerInstruction_getBranchOffset(self); -} - -/* General getters */ - -void RabbitizerInstruction_blankOut(RabbitizerInstruction *self) { - size_t i; - - for (i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - switch (self->descriptor->operands[i]) { - case RAB_OPERAND_cpu_rs: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - break; - - case RAB_OPERAND_cpu_rt: - self->word = RAB_INSTR_PACK_rt(self->word, 0); - break; - - case RAB_OPERAND_cpu_rd: - self->word = RAB_INSTR_PACK_rd(self->word, 0); - break; - - case RAB_OPERAND_cpu_sa: - self->word = RAB_INSTR_PACK_sa(self->word, 0); - break; - - case RAB_OPERAND_cpu_zero: - break; - - case RAB_OPERAND_cpu_cop0d: - self->word = RAB_INSTR_PACK_cop0d(self->word, 0); - break; - - case RAB_OPERAND_cpu_fs: - self->word = RAB_INSTR_PACK_fs(self->word, 0); - break; - - case RAB_OPERAND_cpu_ft: - self->word = RAB_INSTR_PACK_ft(self->word, 0); - break; - - case RAB_OPERAND_cpu_fd: - self->word = RAB_INSTR_PACK_fd(self->word, 0); - break; - - case RAB_OPERAND_cpu_cop1cs: - self->word = RAB_INSTR_PACK_cop1cs(self->word, 0); - break; - - case RAB_OPERAND_cpu_cop2t: - self->word = RAB_INSTR_PACK_cop2t(self->word, 0); - break; - - case RAB_OPERAND_cpu_op: - self->word = RAB_INSTR_PACK_op(self->word, 0); - break; - - case RAB_OPERAND_cpu_code: - self->word = RAB_INSTR_PACK_code(self->word, 0); - break; - - case RAB_OPERAND_cpu_code_lower: - self->word = RAB_INSTR_PACK_code_lower(self->word, 0); - break; - - case RAB_OPERAND_cpu_copraw: - self->word = RAB_INSTR_PACK_copraw(self->word, 0); - break; - - case RAB_OPERAND_cpu_label: - self->word = RAB_INSTR_PACK_instr_index(self->word, 0); - break; - - case RAB_OPERAND_cpu_immediate: - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - - case RAB_OPERAND_cpu_branch_target_label: - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - - case RAB_OPERAND_cpu_immediate_base: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - - /* rsp */ - case RAB_OPERAND_rsp_rs: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - break; - - case RAB_OPERAND_rsp_rt: - self->word = RAB_INSTR_PACK_rt(self->word, 0); - break; - - case RAB_OPERAND_rsp_rd: - self->word = RAB_INSTR_PACK_rd(self->word, 0); - break; - - case RAB_OPERAND_rsp_cop0d: - self->word = RAB_INSTR_PACK_cop0d(self->word, 0); - break; - - case RAB_OPERAND_rsp_cop2t: - self->word = RAB_INSTR_RSP_PACK_cop2t(self->word, 0); - break; - - case RAB_OPERAND_rsp_cop2cd: - self->word = RAB_INSTR_RSP_PACK_cop2cd(self->word, 0); - break; - - case RAB_OPERAND_rsp_vs: - self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0); - break; - - case RAB_OPERAND_rsp_vt: - self->word = RAB_INSTR_RSP_PACK_vt(self->word, 0); - break; - - case RAB_OPERAND_rsp_vd: - self->word = RAB_INSTR_RSP_PACK_vd(self->word, 0); - break; - - case RAB_OPERAND_rsp_vt_elementhigh: - self->word = RAB_INSTR_RSP_PACK_vt(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_elementhigh(self->word, 0); - break; - - case RAB_OPERAND_rsp_vt_elementlow: - self->word = RAB_INSTR_RSP_PACK_vt(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_elementlow(self->word, 0); - break; - - case RAB_OPERAND_rsp_vd_de: - self->word = RAB_INSTR_RSP_PACK_vd(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_de(self->word, 0); - break; - - case RAB_OPERAND_rsp_vs_index: - self->word = RAB_INSTR_RSP_PACK_vs(self->word, 0); - self->word = RAB_INSTR_RSP_PACK_index(self->word, 0); - break; - - case RAB_OPERAND_rsp_offset_rs: - self->word = RAB_INSTR_RSP_PACK_offset(self->word, 0); - self->word = RAB_INSTR_PACK_rs(self->word, 0); - break; - - case RAB_OPERAND_rsp_immediate_base: - self->word = RAB_INSTR_PACK_rs(self->word, 0); - self->word = RAB_INSTR_PACK_immediate(self->word, 0); - break; - /* rsp */ - - /* r5900 */ - case RAB_OPERAND_r5900_I: - case RAB_OPERAND_r5900_Q: - case RAB_OPERAND_r5900_R: - case RAB_OPERAND_r5900_ACC: - // Not real registers encoded on the instruction itself - break; - - case RAB_OPERAND_r5900_ACCxyzw: - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfs: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - break; - - case RAB_OPERAND_r5900_vft: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfd: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsxyzw: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftxyzw: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdxyzw: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_x(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_y(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_z(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_xyzw_w(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsn: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_n(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftn: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_n(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdn: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_n(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsl: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_l(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftl: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_l(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdl: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_l(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfsm: - self->word = RAB_INSTR_R5900_PACK_vfs(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_m(self->word, 0); - break; - - case RAB_OPERAND_r5900_vftm: - self->word = RAB_INSTR_R5900_PACK_vft(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_m(self->word, 0); - break; - - case RAB_OPERAND_r5900_vfdm: - self->word = RAB_INSTR_R5900_PACK_vfd(self->word, 0); - self->word = RAB_INSTR_R5900_PACK_m(self->word, 0); - break; - - case RAB_OPERAND_r5900_vis: - self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0); - break; - - case RAB_OPERAND_r5900_vit: - self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0); - break; - - case RAB_OPERAND_r5900_vid: - self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0); - break; - - case RAB_OPERAND_r5900_vis_predecr: - self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0); - break; - - case RAB_OPERAND_r5900_vit_predecr: - self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0); - break; - - case RAB_OPERAND_r5900_vid_predecr: - self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0); - break; - - case RAB_OPERAND_r5900_vis_postincr: - self->word = RAB_INSTR_R5900_PACK_vis(self->word, 0); - break; - - case RAB_OPERAND_r5900_vit_postincr: - self->word = RAB_INSTR_R5900_PACK_vit(self->word, 0); - break; - - case RAB_OPERAND_r5900_vid_postincr: - self->word = RAB_INSTR_R5900_PACK_vid(self->word, 0); - break; - - case RAB_OPERAND_r5900_immediate5: - self->word = RAB_INSTR_R5900_PACK_imm5(self->word, 0); - break; - /* r5900 */ - - case RAB_OPERAND_ALL_INVALID: - case RAB_OPERAND_ALL_MAX: - assert(self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID && self->descriptor->operands[i] != RAB_OPERAND_ALL_MAX); - break; - } - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c deleted file mode 100644 index 3f94401c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Disassemble.c +++ /dev/null @@ -1,986 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" - -#include -#include -#include - -#include "common/Utils.h" -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" -#include "instructions/RabbitizerInstrSuffix.h" - -typedef size_t (*OperandCallback)(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength); - -size_t RabbitizerOperandType_process_cpu_rs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(RAB_INSTR_GET_rs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_rt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(RAB_INSTR_GET_rt(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_rd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(RAB_INSTR_GET_rd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_zero(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameGpr(0); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_cop0d(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop0(RAB_INSTR_GET_cop0d(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_fs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1(RAB_INSTR_GET_fs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_ft(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1(RAB_INSTR_GET_ft(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_fd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1(RAB_INSTR_GET_fd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_cop1cs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop1Control(RAB_INSTR_GET_cop1cs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_cop2t(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameCop2(RAB_INSTR_GET_cop2t(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_sa(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if (RAB_INSTR_GET_sa(self) < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", RAB_INSTR_GET_sa(self)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", RAB_INSTR_GET_sa(self)); - } -#endif - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", RAB_INSTR_GET_sa(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_op(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if (RAB_INSTR_GET_op(self) < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", RAB_INSTR_GET_op(self)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", RAB_INSTR_GET_op(self)); - } -#endif - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%02X", RAB_INSTR_GET_op(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_code(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - int code = RAB_INSTR_GET_code_upper(self); - int lower = RAB_INSTR_GET_code_lower(self); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", code); - if (lower) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, ", %i", lower); - } - - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_code_lower(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - int code_lower = RAB_INSTR_GET_code_lower(self); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", code_lower); - - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_copraw(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", RAB_INSTR_GET_copraw(self)); - - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_label(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "func_%06X", RabbitizerInstruction_getInstrIndexAsVram(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_immediate(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - int32_t number; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - number = RabbitizerInstruction_getProcessedImmediate(self); - if (RabbitizerConfig_Cfg.misc.omit0XOnSmallImm) { - if (number > -10 && number < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", number); - return totalSize; - } - } - if (number < 0) { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%X", -number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%x", -number); - } - } else { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", number); - } - } - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_branch_target_label(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - RABUTILS_BUFFER_CPY(dst, totalSize, ". + 4 + ("); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, NULL, 0)); - RABUTILS_BUFFER_CPY(dst, totalSize, " << 2)"); - return totalSize; -} - -size_t RabbitizerOperandType_process_cpu_immediate_base(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if ((immOverride != NULL) && (immOverrideLength > 0) || RAB_INSTR_GET_immediate(self) != 0) { - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - } -#endif - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_rs(self, dst, immOverride, immOverrideLength)); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_rs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_rt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rt(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_rd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspGpr(RAB_INSTR_GET_rd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_cop0d(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspCop0(RAB_INSTR_GET_cop0d(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_cop2t(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspCop2(RAB_INSTR_RSP_GET_cop2t(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_cop2cd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspCop2Control(RAB_INSTR_RSP_GET_cop2cd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vt(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vt(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameRspVector(RAB_INSTR_RSP_GET_vd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vt_elementhigh(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t element; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vt(self, dst, immOverride, immOverrideLength)); - - element = RAB_INSTR_RSP_GET_elementhigh(self); - if (element != 0) { - if ((element & 0x8) == 0x8) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element & 7); - } else if ((element & 0xC) == 0x4) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%ih]", element & (~0xC)); - } else if ((element & 0xE) == 0x2) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%iq]", element & (~0xE)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", element); - } - } - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vt_elementlow(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vt(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_elementlow(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vd_de(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t de; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vd(self, dst, immOverride, immOverrideLength)); - - de = RAB_INSTR_RSP_GET_de(self); - if ((de & 0x8) == 0x8) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", de & (~0x8)); - } else if ((de & 0xC) == 0x4) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%ih]", de & (~0xC)); - } else if ((de & 0xE) == 0x2) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%iq]", de & (~0xE)); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", de); - } - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_vs_index(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_vs(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "[%i]", RAB_INSTR_RSP_GET_index(self)); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_offset_rs(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", RabbitizerInstructionRsp_GetOffsetVector(self)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_rs(self, dst, immOverride, immOverrideLength)); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - return totalSize; -} - -size_t RabbitizerOperandType_process_rsp_immediate_base(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - -// TODO: consider making this a proper configuration -#if 0 - if ((immOverride != NULL) && (immOverrideLength > 0) || RAB_INSTR_GET_immediate(self) != 0) { - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - } -#endif - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_cpu_immediate(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_rsp_rs(self, dst, immOverride, immOverrideLength)); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_I(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$I"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_Q(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$Q"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_R(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$R"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_ACC(UNUSED const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, - UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, "$ACC"); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_ACCxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_ACC(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfs(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vfs(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vft(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vft(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfd(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VF(RAB_INSTR_R5900_GET_vfd(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdxyzw(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - -#if 0 - if (RAB_INSTR_R5900_GET_xyzw_x(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'x'); - } - if (RAB_INSTR_R5900_GET_xyzw_y(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'y'); - } - if (RAB_INSTR_R5900_GET_xyzw_z(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'z'); - } - if (RAB_INSTR_R5900_GET_xyzw_w(self)) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, 'w'); - } -#endif - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_n(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_n(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdn(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_n(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_l(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_l(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdl(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_l(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfsm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfs(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_m(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vftm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vft(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_m(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vfdm(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - uint8_t n; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vfd(self, dst, immOverride, immOverrideLength)); - - n = RAB_INSTR_R5900_GET_m(self); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, "xyzw"[n]); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vis(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vis(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vit(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vit(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vid(const RabbitizerInstruction *self, char *dst, UNUSED const char *immOverride, UNUSED size_t immOverrideLength) { - size_t totalSize = 0; - const char *reg = RabbitizerRegister_getNameR5900VI(RAB_INSTR_R5900_GET_vid(self)); - - RABUTILS_BUFFER_CPY(dst, totalSize, reg); - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vis_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vis(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vit_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vit(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vid_predecr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '-'); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vid(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vis_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vis(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vit_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vit(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_vid_postincr(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '('); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerOperandType_process_r5900_vid(self, dst, immOverride, immOverrideLength)); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '+'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ')'); - - return totalSize; -} - -size_t RabbitizerOperandType_process_r5900_immediate5(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - int32_t number; - - if ((immOverride != NULL) && (immOverrideLength > 0)) { - memcpy(dst, immOverride, immOverrideLength); - return immOverrideLength; - } - - number = RAB_INSTR_R5900_GET_imm5(self); - if (RabbitizerConfig_Cfg.misc.omit0XOnSmallImm) { - if (number > -10 && number < 10) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "%i", number); - return totalSize; - } - } - if (number < 0) { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%X", -number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "-0x%x", -number); - } - } else { - if (RabbitizerConfig_Cfg.misc.upperCaseImm) { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%X", number); - } else { - RABUTILS_BUFFER_SPRINTF(dst, totalSize, "0x%x", number); - } - } - return totalSize; -} - -#define RAB_DEF_OPERAND(prefix, operand) [RAB_OPERAND_##prefix##_##operand] = RabbitizerOperandType_process_##prefix##_##operand, - -const OperandCallback instrOpercandCallbacks[] = { -#include "instructions/operands/RabbitizerOperandType_cpu.inc" -#include "instructions/operands/RabbitizerOperandType_rsp.inc" -#include "instructions/operands/RabbitizerOperandType_r5900.inc" -}; - -#undef RAB_DEF_OPERAND - -size_t RabbitizerInstruction_getSizeForBufferOperandsDisasm(const RabbitizerInstruction *self, size_t immOverrideLength) { - size_t totalSize = 0; - char auxBuffer[0x100] = { 0 }; - char immOverride[0x100] = { 0 }; - - for (size_t i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - RabbitizerOperandType operand; - OperandCallback callback; - - if (i != 0) { - totalSize += 2; - } - - operand = self->descriptor->operands[i]; - assert(operand > RAB_OPERAND_ALL_INVALID); - assert(operand < RAB_OPERAND_ALL_MAX); - - callback = instrOpercandCallbacks[operand]; - assert(callback != NULL); - totalSize += callback(self, auxBuffer, immOverride, immOverrideLength); - } - - return totalSize; -} - -size_t RabbitizerInstruction_disassembleOperands(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength) { - size_t totalSize = 0; - - for (size_t i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - RabbitizerOperandType operand; - OperandCallback callback; - - if (i != 0) { - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ','); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - } - - operand = self->descriptor->operands[i]; - assert(operand > RAB_OPERAND_ALL_INVALID); - assert(operand < RAB_OPERAND_ALL_MAX); - - callback = instrOpercandCallbacks[operand]; - assert(callback != NULL); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, callback(self, dst, immOverride, immOverrideLength)); - } - - *dst = '\0'; - return totalSize; -} - -size_t RabbitizerInstruction_getSizeForBufferInstrDisasm(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust) { - size_t totalSize = 0; - size_t opcodeNameLength; - - opcodeNameLength = strlen(RabbitizerInstrId_getOpcodeName(self->uniqueId)); - - totalSize += opcodeNameLength; - - totalSize += RabbitizerInstrSuffix_getSizeForBuffer(self, self->descriptor->instrSuffix); - - if (self->descriptor->operands[0] == RAB_OPERAND_ALL_INVALID) { - // There are no operands - return totalSize; - } - - if (RabbitizerConfig_Cfg.misc.opcodeLJust > 0) { - totalSize += RabbitizerConfig_Cfg.misc.opcodeLJust; - } - if (extraLJust > 0) { - totalSize += extraLJust; - } - totalSize++; - - totalSize += RabbitizerInstruction_getSizeForBufferOperandsDisasm(self, immOverrideLength); - - return totalSize; -} - -size_t RabbitizerInstruction_disassembleInstruction(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, - int extraLJust) { - size_t totalSize = 0; - const char *opcodeName = RabbitizerInstrId_getOpcodeName(self->uniqueId); - - RABUTILS_BUFFER_CPY(dst, totalSize, opcodeName); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstrSuffix_processSuffix(self, dst, self->descriptor->instrSuffix)); - - if (self->descriptor->operands[0] == RAB_OPERAND_ALL_INVALID) { - // There are no operands - *dst = '\0'; - return totalSize; - } - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, RabbitizerConfig_Cfg.misc.opcodeLJust + extraLJust - totalSize, ' ')); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleOperands(self, dst, immOverride, immOverrideLength)); - - *dst = '\0'; - return totalSize; -} - -size_t RabbitizerInstruction_getSizeForBufferDataDisasm(UNUSED const RabbitizerInstruction *self, int extraLJust) { - size_t totalSize = 0; - - totalSize += strlen(".word"); - totalSize += RabbitizerConfig_Cfg.misc.opcodeLJust + extraLJust; - totalSize += 11; - return totalSize; -} - -size_t RabbitizerInstruction_disassembleAsData(const RabbitizerInstruction *self, char *dst, int extraLJust) { - size_t totalSize = 0; - - RABUTILS_BUFFER_CPY(dst, totalSize, ".word"); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, RabbitizerConfig_Cfg.misc.opcodeLJust + extraLJust - totalSize, ' ')); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, " 0x%08X", RabbitizerInstruction_getRaw(self)); - return totalSize; -} - -bool RabbitizerInstruction_mustDisasmAsData(const RabbitizerInstruction *self) { - if (RabbitizerConfig_Cfg.toolchainTweaks.sn64DivFix) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_break) { - return true; - } - } - - if (!RabbitizerInstruction_isValid(self)) { - return true; - } - return false; -} - -size_t RabbitizerInstruction_getSizeForBuffer(const RabbitizerInstruction *self, size_t immOverrideLength, int extraLJust) { - if (!RabbitizerInstruction_isImplemented(self) || RabbitizerInstruction_mustDisasmAsData(self)) { - size_t totalSize = RabbitizerInstruction_getSizeForBufferDataDisasm(self, extraLJust); - - if (RabbitizerConfig_Cfg.misc.unknownInstrComment) { - totalSize += 40; - totalSize += 3; - totalSize += RabbitizerInstruction_getSizeForBufferInstrDisasm(self, immOverrideLength, extraLJust); - totalSize += 11; - } - return totalSize; - } - - return RabbitizerInstruction_getSizeForBufferInstrDisasm(self, immOverrideLength, extraLJust); -} - -size_t RabbitizerInstruction_disassemble(const RabbitizerInstruction *self, char *dst, const char *immOverride, size_t immOverrideLength, int extraLJust) { - assert(dst != NULL); - - if (!RabbitizerInstruction_isImplemented(self) || RabbitizerInstruction_mustDisasmAsData(self)) { - size_t totalSize = 0; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleAsData(self, dst, extraLJust)); - - if (RabbitizerConfig_Cfg.misc.unknownInstrComment) { - uint32_t validBits; - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerUtils_CharFill(dst, 40 - totalSize, ' ')); - - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, '#'); - RABUTILS_BUFFER_WRITE_CHAR(dst, totalSize, ' '); - - RABUTILS_BUFFER_ADVANCE(dst, totalSize, RabbitizerInstruction_disassembleInstruction(self, dst, immOverride, immOverrideLength, extraLJust)); - - validBits = RabbitizerInstruction_getValidBits(self); - - RABUTILS_BUFFER_SPRINTF(dst, totalSize, " # %08X", ((~validBits) & self->word)); - } - - return totalSize; - } - - return RabbitizerInstruction_disassembleInstruction(self, dst, immOverride, immOverrideLength, extraLJust); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c deleted file mode 100644 index 136e4aa6..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_Examination.c +++ /dev/null @@ -1,840 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include - -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerInstructionRsp.h" -#include "instructions/RabbitizerInstructionR5900.h" -#include "instructions/RabbitizerRegister.h" - -bool RabbitizerInstruction_isImplemented(const RabbitizerInstruction *self) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_INVALID: - case RABBITIZER_INSTR_ID_rsp_INVALID: - case RABBITIZER_INSTR_ID_r5900_INVALID: - return false; - - default: - return true; - } -} - -bool RabbitizerInstruction_isLikelyHandwritten(const RabbitizerInstruction *self) { - if (self->_handwrittenCategory) { - return true; - } - - if (RabbitizerInstrDescriptor_isIType(self->descriptor) && !RabbitizerInstrDescriptor_isFloat(self->descriptor)) { - if (RAB_INSTR_GET_rs(self) == RABBITIZER_REG_GPR_O32_k0 || RAB_INSTR_GET_rs(self) == RABBITIZER_REG_GPR_O32_k1) { - return true; - } - if (RAB_INSTR_GET_rt(self) == RABBITIZER_REG_GPR_O32_k0 || RAB_INSTR_GET_rt(self) == RABBITIZER_REG_GPR_O32_k1) { - return true; - } - } - - if (RabbitizerInstrDescriptor_notEmitedByCompilers(self->descriptor)) { - return true; - } - - return false; -} - -bool RabbitizerInstruction_isNop(const RabbitizerInstruction *self) { - return self->word == 0; -} - -bool RabbitizerInstruction_isUnconditionalBranch(const RabbitizerInstruction *self) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_b) { - return true; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_beq && RAB_INSTR_GET_rt(self) == 0 && RAB_INSTR_GET_rs(self) == 0) { - return true; - } - if (RabbitizerConfig_Cfg.toolchainTweaks.treatJAsUnconditionalBranch && self->uniqueId == RABBITIZER_INSTR_ID_cpu_j) { - return true; - } - return false; -} - -bool RabbitizerInstruction_isJrRa(const RabbitizerInstruction *self) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_jr) { - // TODO: abi stuffs - return RAB_INSTR_GET_rs(self) == RABBITIZER_REG_GPR_O32_ra; - } - return false; -} - -bool RabbitizerInstruction_isJrNotRa(const RabbitizerInstruction *self) { - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_jr) { - // TODO: abi stuffs - return RAB_INSTR_GET_rs(self) != RABBITIZER_REG_GPR_O32_ra; - } - return false; -} - -bool RabbitizerInstruction_hasDelaySlot(const RabbitizerInstruction *self) { - return RabbitizerInstrDescriptor_isBranch(self->descriptor) || RabbitizerInstrDescriptor_isJump(self->descriptor); -} - -const char *RabbitizerInstruction_mapInstrToType(const RabbitizerInstruction *self) { - if (RabbitizerInstrDescriptor_isDouble(self->descriptor)) { - return "f64"; - } - if (RabbitizerInstrDescriptor_isFloat(self->descriptor)) { - return "f32"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lwu) { - return "u32"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lh || self->uniqueId == RABBITIZER_INSTR_ID_cpu_sh) { - return "s16"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lhu) { - return "u16"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lb || self->uniqueId == RABBITIZER_INSTR_ID_cpu_sb) { - return "s8"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_lbu) { - return "u8"; - } - if (self->uniqueId == RABBITIZER_INSTR_ID_cpu_ld || self->uniqueId == RABBITIZER_INSTR_ID_cpu_sd) { - return "s64"; - } - return NULL; -} - -bool RabbitizerInstruction_sameOpcode(const RabbitizerInstruction *self, const RabbitizerInstruction *other) { - if (!RabbitizerInstruction_isImplemented(self) || !RabbitizerInstruction_isImplemented(other)) { - return false; - } - return self->uniqueId == other->uniqueId; -} - -bool RabbitizerInstruction_sameOpcodeButDifferentArguments(const RabbitizerInstruction *self, const RabbitizerInstruction *other) { - if (!RabbitizerInstruction_sameOpcode(self, other)) { - return false; - } - return RabbitizerInstruction_getRaw(self) != RabbitizerInstruction_getRaw(other); -} - -bool RabbitizerInstruction_hasOperand(const RabbitizerInstruction *self, RabbitizerOperandType operand) { - size_t i; - - for (i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - if (self->descriptor->operands[i] == operand) { - return true; - } - } - - return false; -} - -bool RabbitizerInstruction_hasOperandAlias(const RabbitizerInstruction *self, RabbitizerOperandType operand) { - switch (operand) { - case RAB_OPERAND_cpu_rs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_immediate_base)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_offset_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_immediate_base)) { - return true; - } - break; - - case RAB_OPERAND_cpu_immediate: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_immediate_base)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_branch_target_label)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_immediate_base)) { - return true; - } - break; - - case RAB_OPERAND_cpu_rt: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_rt)) { - return true; - } - break; - - case RAB_OPERAND_cpu_rd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_rd)) { - return true; - } - break; - - case RAB_OPERAND_cpu_sa: - case RAB_OPERAND_cpu_zero: - // case RAB_OPERAND_cpu_function: - case RAB_OPERAND_cpu_cop0d: - case RAB_OPERAND_cpu_fs: - case RAB_OPERAND_cpu_ft: - case RAB_OPERAND_cpu_fd: - case RAB_OPERAND_cpu_cop1cs: - case RAB_OPERAND_cpu_cop2t: - case RAB_OPERAND_cpu_op: - case RAB_OPERAND_cpu_code: - case RAB_OPERAND_cpu_code_lower: - case RAB_OPERAND_cpu_copraw: - case RAB_OPERAND_cpu_label: - break; - - case RAB_OPERAND_cpu_branch_target_label: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_immediate)) { - return true; - } - break; - - case RAB_OPERAND_cpu_immediate_base: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_immediate)) { - return true; - } - break; - - /* rsp */ - case RAB_OPERAND_rsp_rs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_offset_rs)) { - return true; - } - break; - - case RAB_OPERAND_rsp_rt: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_rt)) { - return true; - } - break; - - case RAB_OPERAND_rsp_rd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_cpu_rd)) { - return true; - } - break; - - case RAB_OPERAND_rsp_cop0d: - case RAB_OPERAND_rsp_cop2t: - case RAB_OPERAND_rsp_cop2cd: - break; - - // case RAB_OPERAND_rsp_elementhigh: - // case RAB_OPERAND_rsp_elementlow: - // case RAB_OPERAND_rsp_index: - // case RAB_OPERAND_rsp_offset: - - case RAB_OPERAND_rsp_vs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vs_index)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vt: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vt_elementhigh)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vt_elementlow)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_rsp_vd_de)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vt_elementhigh: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vt)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vt_elementlow: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vt)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vd_de: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vd)) { - return true; - } - break; - - case RAB_OPERAND_rsp_vs_index: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_vs)) { - return true; - } - break; - - case RAB_OPERAND_rsp_offset_rs: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_rs)) { - return true; - } - break; - - case RAB_OPERAND_rsp_immediate_base: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_rsp_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_rs)) { - return true; - } - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_cpu_immediate)) { - return true; - } - break; - /* rsp */ - - /* r5900 */ - case RAB_OPERAND_r5900_I: - case RAB_OPERAND_r5900_Q: - case RAB_OPERAND_r5900_R: - break; - - case RAB_OPERAND_r5900_ACC: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_ACCxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_ACCxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_ACC)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfs: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsxyzw)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsn)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsl)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsm)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vft: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftxyzw)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftn)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftl)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftm)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfd: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdxyzw)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdn)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdl)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdm)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsn)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vft)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftn)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdxyzw: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdn)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsn: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfsxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftn: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vft)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vftxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdn: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vfdxyzw)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsl: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftl: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vft)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdl: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfsm: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfs)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vftm: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vft)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vfdm: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vfd)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vis: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vis_predecr)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vis_postincr)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vit: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vit_predecr)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vit_postincr)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vid: - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vid_predecr)) { - return true; - } - if (RabbitizerInstruction_hasOperand(self, RAB_OPERAND_r5900_vid_postincr)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vis_predecr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vis)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vit_predecr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vit)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vid_predecr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vid)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vis_postincr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vis)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vit_postincr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vit)) { - return true; - } - break; - - case RAB_OPERAND_r5900_vid_postincr: - if (RabbitizerInstruction_hasOperandAlias(self, RAB_OPERAND_r5900_vid)) { - return true; - } - break; - - case RAB_OPERAND_r5900_immediate5: - break; - /* r5900 */ - - case RAB_OPERAND_ALL_INVALID: - case RAB_OPERAND_ALL_MAX: - assert(operand != RAB_OPERAND_ALL_INVALID && operand != RAB_OPERAND_ALL_MAX); - break; - } - - return RabbitizerInstruction_hasOperand(self, operand); -} - -uint32_t RabbitizerInstruction_getValidBits(const RabbitizerInstruction *self) { - size_t i; - uint32_t validbits; - - validbits = self->_mandatorybits; - - for (i = 0; i < ARRAY_COUNT(self->descriptor->operands) && self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID; i++) { - - switch (self->descriptor->operands[i]) { - case RAB_OPERAND_cpu_rs: - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - case RAB_OPERAND_cpu_rt: - validbits = RAB_INSTR_PACK_rt(validbits, ~0); - break; - - case RAB_OPERAND_cpu_rd: - validbits = RAB_INSTR_PACK_rd(validbits, ~0); - break; - - case RAB_OPERAND_cpu_sa: - validbits = RAB_INSTR_PACK_sa(validbits, ~0); - break; - - case RAB_OPERAND_cpu_zero: - break; - - case RAB_OPERAND_cpu_cop0d: - validbits = RAB_INSTR_PACK_cop0d(validbits, ~0); - break; - - case RAB_OPERAND_cpu_fs: - validbits = RAB_INSTR_PACK_fs(validbits, ~0); - break; - - case RAB_OPERAND_cpu_ft: - validbits = RAB_INSTR_PACK_ft(validbits, ~0); - break; - - case RAB_OPERAND_cpu_fd: - validbits = RAB_INSTR_PACK_fd(validbits, ~0); - break; - - case RAB_OPERAND_cpu_cop1cs: - validbits = RAB_INSTR_PACK_cop1cs(validbits, ~0); - break; - - case RAB_OPERAND_cpu_cop2t: - validbits = RAB_INSTR_PACK_cop2t(validbits, ~0); - break; - - case RAB_OPERAND_cpu_op: - validbits = RAB_INSTR_PACK_op(validbits, ~0); - break; - - case RAB_OPERAND_cpu_code: - validbits = RAB_INSTR_PACK_code(validbits, ~0); - break; - - case RAB_OPERAND_cpu_code_lower: - validbits = RAB_INSTR_PACK_code_lower(validbits, ~0); - break; - - case RAB_OPERAND_cpu_copraw: - validbits = RAB_INSTR_PACK_copraw(validbits, ~0); - break; - - case RAB_OPERAND_cpu_label: - validbits = RAB_INSTR_PACK_instr_index(validbits, ~0); - break; - - case RAB_OPERAND_cpu_immediate: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - break; - - case RAB_OPERAND_cpu_branch_target_label: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - break; - - case RAB_OPERAND_cpu_immediate_base: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - /* rsp */ - case RAB_OPERAND_rsp_rs: - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - case RAB_OPERAND_rsp_rt: - validbits = RAB_INSTR_PACK_rt(validbits, ~0); - break; - - case RAB_OPERAND_rsp_rd: - validbits = RAB_INSTR_PACK_rd(validbits, ~0); - break; - - case RAB_OPERAND_rsp_cop0d: - validbits = RAB_INSTR_PACK_cop0d(validbits, ~0); - break; - - case RAB_OPERAND_rsp_cop2t: - validbits = RAB_INSTR_RSP_PACK_cop2t(validbits, ~0); - break; - - case RAB_OPERAND_rsp_cop2cd: - validbits = RAB_INSTR_RSP_PACK_cop2cd(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vs: - validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vt: - validbits = RAB_INSTR_RSP_PACK_vt(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vd: - validbits = RAB_INSTR_RSP_PACK_vd(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vt_elementhigh: - validbits = RAB_INSTR_RSP_PACK_vt(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_elementhigh(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vt_elementlow: - validbits = RAB_INSTR_RSP_PACK_vt(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_elementlow(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vd_de: - validbits = RAB_INSTR_RSP_PACK_vd(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_de(validbits, ~0); - break; - - case RAB_OPERAND_rsp_vs_index: - validbits = RAB_INSTR_RSP_PACK_vs(validbits, ~0); - validbits = RAB_INSTR_RSP_PACK_index(validbits, ~0); - break; - - case RAB_OPERAND_rsp_offset_rs: - validbits = RAB_INSTR_RSP_PACK_offset(validbits, ~0); - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - - case RAB_OPERAND_rsp_immediate_base: - validbits = RAB_INSTR_PACK_immediate(validbits, ~0); - validbits = RAB_INSTR_PACK_rs(validbits, ~0); - break; - /* rsp */ - - /* r5900 */ - case RAB_OPERAND_r5900_I: - case RAB_OPERAND_r5900_Q: - case RAB_OPERAND_r5900_R: - case RAB_OPERAND_r5900_ACC: - // Not real registers encoded on the instruction itself - break; - - case RAB_OPERAND_r5900_ACCxyzw: - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfs: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vft: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfd: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsxyzw: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftxyzw: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdxyzw: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_x(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_y(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_z(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_xyzw_w(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsn: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftn: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdn: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_n(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsl: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftl: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdl: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_l(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfsm: - validbits = RAB_INSTR_R5900_PACK_vfs(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vftm: - validbits = RAB_INSTR_R5900_PACK_vft(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vfdm: - validbits = RAB_INSTR_R5900_PACK_vfd(validbits, ~0); - validbits = RAB_INSTR_R5900_PACK_m(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vis: - validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vit: - validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vid: - validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vis_predecr: - validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vit_predecr: - validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vid_predecr: - validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vis_postincr: - validbits = RAB_INSTR_R5900_PACK_vis(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vit_postincr: - validbits = RAB_INSTR_R5900_PACK_vit(validbits, ~0); - break; - - case RAB_OPERAND_r5900_vid_postincr: - validbits = RAB_INSTR_R5900_PACK_vid(validbits, ~0); - break; - - case RAB_OPERAND_r5900_immediate5: - validbits = RAB_INSTR_R5900_PACK_imm5(validbits, ~0); - break; - /* r5900 */ - - case RAB_OPERAND_ALL_INVALID: - case RAB_OPERAND_ALL_MAX: - assert(self->descriptor->operands[i] != RAB_OPERAND_ALL_INVALID && self->descriptor->operands[i] != RAB_OPERAND_ALL_MAX); - break; - } - } - - return validbits; -} - -bool RabbitizerInstruction_isValid(const RabbitizerInstruction *self) { - uint32_t validbits; - - validbits = RabbitizerInstruction_getValidBits(self); - - return ((~validbits) & self->word) == 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c deleted file mode 100644 index 0d71c6dd..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstruction/RabbitizerInstruction_ProcessUniqueId.c +++ /dev/null @@ -1,319 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include "common/RabbitizerConfig.h" -#include "instructions/RabbitizerRegister.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - case (caseBits): \ - self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \ - break; -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -void RabbitizerInstruction_processUniqueId_Normal(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { -#include "instructions/instr_id/cpu/cpu_normal.inc" - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_beq: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoB) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_b; - } - } else { - if (RabbitizerConfig_Cfg.pseudos.pseudoBeqz) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_beqz; - } - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_bne: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBnez) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_bnez; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Special(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_special.inc" - } - - if (RabbitizerInstruction_isNop(self)) { - // NOP is special enough - self->uniqueId = RABBITIZER_INSTR_ID_cpu_nop; - } else if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_or: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoMove) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_move; - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_nor: - if (RAB_INSTR_GET_rt(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNot) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_not; - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_subu: - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNegu) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_negu; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_jalr: - self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, RAB_INSTR_GET_rd(self)); - - if (RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_NUMERIC || RabbitizerConfig_Cfg.regNames.gprAbiNames == RABBITIZER_ABI_O32) { - if (RAB_INSTR_GET_rd(self) != RABBITIZER_REG_GPR_O32_ra) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_jalr_rd]; - } - } else { - if (RAB_INSTR_GET_rd(self) != RABBITIZER_REG_GPR_N32_ra) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_jalr_rd]; - } - } - break; - - case RABBITIZER_INSTR_ID_cpu_div: - if (RabbitizerConfig_Cfg.toolchainTweaks.sn64DivFix && !self->inHandwrittenFunction) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_sn64_div]; - } - break; - - case RABBITIZER_INSTR_ID_cpu_divu: - if (RabbitizerConfig_Cfg.toolchainTweaks.sn64DivFix && !self->inHandwrittenFunction) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_cpu_sn64_divu]; - } - break; - - default: - break; - } -} - -void RabbitizerInstruction_processUniqueId_Regimm(RabbitizerInstruction *self) { - uint32_t rt = RAB_INSTR_GET_rt(self); - - self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt); - - switch (rt) { -#include "instructions/instr_id/cpu/cpu_regimm.inc" - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_bgezal: - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBal) { - self->uniqueId = RABBITIZER_INSTR_ID_cpu_bal; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_bc_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0_bc0.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop0_tlb.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - self->_handwrittenCategory = true; - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - - case 0x08: - RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(self); - break; - - case 0x10: - RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_bc_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop1_bc1.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_s.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_d.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_w.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/cpu/cpu_cop1_fpu_l.inc" - } -} - -void RabbitizerInstruction_processUniqueId_Coprocessor1(RabbitizerInstruction *self) { - uint8_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop1.inc" - - case 0x08: // fmt = BC - RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(self); - break; - - case 0x10: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(self); - break; - - case 0x11: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuD(self); - break; - - case 0x14: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(self); - break; - - case 0x15: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuL(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor2(RabbitizerInstruction *self) { - self->_handwrittenCategory = true; - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -void RabbitizerInstruction_processUniqueId(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - self->uniqueId = RABBITIZER_INSTR_ID_cpu_INVALID; - - switch (opcode) { - default: - RabbitizerInstruction_processUniqueId_Normal(self); - break; - case 0x00: - RabbitizerInstruction_processUniqueId_Special(self); - break; - case 0x01: - RabbitizerInstruction_processUniqueId_Regimm(self); - break; - case 0x10: - RabbitizerInstruction_processUniqueId_Coprocessor0(self); - break; - case 0x11: - RabbitizerInstruction_processUniqueId_Coprocessor1(self); - break; - case 0x12: - RabbitizerInstruction_processUniqueId_Coprocessor2(self); - break; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c deleted file mode 100644 index 3b9bd2ce..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900.c +++ /dev/null @@ -1,17 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionR5900.h" - -void RabbitizerInstructionR5900_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) { - RabbitizerInstruction_init(self, word, vram); - - self->uniqueId = RABBITIZER_INSTR_ID_r5900_INVALID; - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - self->category = RABBITIZER_INSTRCAT_R5900; -} - -void RabbitizerInstructionR5900_destroy(RabbitizerInstruction *self) { - RabbitizerInstruction_destroy(self); -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c deleted file mode 100644 index 1972f3fa..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionR5900/RabbitizerInstructionR5900_ProcessUniqueId.c +++ /dev/null @@ -1,328 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionR5900.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - case (caseBits): \ - self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \ - break; -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -void RabbitizerInstructionR5900_processUniqueId_Normal(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - bool fetchDescriptor = true; - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { -#include "instructions/instr_id/r5900/r5900_normal.inc" - - default: - RabbitizerInstruction_processUniqueId_Normal(self); - fetchDescriptor = false; - break; - } - - if (fetchDescriptor) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Special(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - bool fetchDescriptor = true; - uint32_t stype; - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_special.inc" - - default: - RabbitizerInstruction_processUniqueId_Special(self); - fetchDescriptor = false; - break; - } - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_cpu_sync: - stype = RAB_INSTR_GET_stype(self); - self->_mandatorybits = RAB_INSTR_PACK_stype(self->_mandatorybits, stype); - if ((stype & 0x10) == 0x10) { - self->uniqueId = RABBITIZER_INSTR_ID_r5900_sync_p; - fetchDescriptor = true; - } - break; - - default: - break; - } - - if (fetchDescriptor) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Regimm(RabbitizerInstruction *self) { - uint32_t rt = RAB_INSTR_GET_rt(self); - bool fetchDescriptor = true; - - self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt); - - switch (rt) { -#include "instructions/instr_id/r5900/r5900_regimm.inc" - - default: - RabbitizerInstruction_processUniqueId_Regimm(self); - fetchDescriptor = false; - break; - } - - if (fetchDescriptor) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor0_Tlb(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_cop0_tlb.inc" - - default: - RabbitizerInstruction_processUniqueId_Coprocessor0_Tlb(self); - break; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - self->_handwrittenCategory = true; - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - - case 0x08: - RabbitizerInstruction_processUniqueId_Coprocessor0_BC0(self); - break; - - case 0x10: - RabbitizerInstructionR5900_processUniqueId_Coprocessor0_Tlb(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor1_FpuS(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_cop1_fpu_s.inc" - - default: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuS(self); - break; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor1(RabbitizerInstruction *self) { - uint8_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop1.inc" - - case 0x08: // fmt = BC - RabbitizerInstruction_processUniqueId_Coprocessor1_BC1(self); - break; - - case 0x10: - RabbitizerInstructionR5900_processUniqueId_Coprocessor1_FpuS(self); - break; - - case 0x14: - RabbitizerInstruction_processUniqueId_Coprocessor1_FpuW(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstruction_processUniqueId_Coprocessor2_BC2(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_bc_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_bc_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/r5900/r5900_cop2_bc2.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special2(UNUSED RabbitizerInstruction *self) { - uint32_t fhiflo = RAB_INSTR_R5900_GET_fhi_flo(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_fhi_flo(self->_mandatorybits, fhiflo); - - switch (fhiflo) { -#include "instructions/instr_id/r5900/r5900_cop2_special2.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special1(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_cop2_special1.inc" - - case 0x3C: - case 0x3D: - case 0x3E: - case 0x3F: - RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special2(self); - break; - } -} - -void RabbitizerInstructionR5900_processUniqueId_Coprocessor2(RabbitizerInstruction *self) { - uint8_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/r5900/r5900_cop2.inc" - - case 0x08: - RabbitizerInstruction_processUniqueId_Coprocessor2_BC2(self); - break; - - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - RabbitizerInstructionR5900_processUniqueId_Coprocessor2_Special1(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_0(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_0.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_1(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_1.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_2(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_2.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI_3(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_R5900_GET_mmi_function(self); - - self->_mandatorybits = RAB_INSTR_R5900_PACK_mmi_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi_3.inc" - } -} - -void RabbitizerInstructionR5900_processUniqueId_MMI(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/r5900/r5900_mmi.inc" - - case 0x08: - RabbitizerInstructionR5900_processUniqueId_MMI_0(self); - break; - case 0x09: - RabbitizerInstructionR5900_processUniqueId_MMI_2(self); - break; - case 0x28: - RabbitizerInstructionR5900_processUniqueId_MMI_1(self); - break; - case 0x29: - RabbitizerInstructionR5900_processUniqueId_MMI_3(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -void RabbitizerInstructionR5900_processUniqueId(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { - default: - RabbitizerInstructionR5900_processUniqueId_Normal(self); - break; - case 0x00: - RabbitizerInstructionR5900_processUniqueId_Special(self); - break; - case 0x01: - RabbitizerInstructionR5900_processUniqueId_Regimm(self); - break; - case 0x10: - RabbitizerInstructionR5900_processUniqueId_Coprocessor0(self); - break; - case 0x11: - RabbitizerInstructionR5900_processUniqueId_Coprocessor1(self); - break; - case 0x12: - RabbitizerInstructionR5900_processUniqueId_Coprocessor2(self); - break; - case 0x1C: - RabbitizerInstructionR5900_processUniqueId_MMI(self); - break; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c deleted file mode 100644 index 1e63453c..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp.c +++ /dev/null @@ -1,56 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionRsp.h" - -void RabbitizerInstructionRsp_init(RabbitizerInstruction *self, uint32_t word, uint32_t vram) { - RabbitizerInstruction_init(self, word, vram); - - self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID; - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - self->_handwrittenCategory = true; - self->category = RABBITIZER_INSTRCAT_RSP; -} - -void RabbitizerInstructionRsp_destroy(RabbitizerInstruction *self) { - RabbitizerInstruction_destroy(self); -} - -uint16_t RabbitizerInstructionRsp_GetOffsetVector(const RabbitizerInstruction *self) { - uint16_t offset = RAB_INSTR_RSP_GET_OFFSET_VECTOR_RAW(self); - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_rsp_lsv: - case RABBITIZER_INSTR_ID_rsp_ssv: - return offset << 1; - - case RABBITIZER_INSTR_ID_rsp_llv: - case RABBITIZER_INSTR_ID_rsp_slv: - return offset << 2; - - case RABBITIZER_INSTR_ID_rsp_ldv: - case RABBITIZER_INSTR_ID_rsp_sdv: - case RABBITIZER_INSTR_ID_rsp_lpv: - case RABBITIZER_INSTR_ID_rsp_spv: - case RABBITIZER_INSTR_ID_rsp_luv: - case RABBITIZER_INSTR_ID_rsp_suv: - return offset << 3; - - case RABBITIZER_INSTR_ID_rsp_lqv: - case RABBITIZER_INSTR_ID_rsp_sqv: - case RABBITIZER_INSTR_ID_rsp_lrv: - case RABBITIZER_INSTR_ID_rsp_srv: - case RABBITIZER_INSTR_ID_rsp_lhv: - case RABBITIZER_INSTR_ID_rsp_shv: - case RABBITIZER_INSTR_ID_rsp_lfv: - case RABBITIZER_INSTR_ID_rsp_sfv: - case RABBITIZER_INSTR_ID_rsp_ltv: - case RABBITIZER_INSTR_ID_rsp_stv: - case RABBITIZER_INSTR_ID_rsp_swv: - return offset << 4; - - default: - return offset; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c deleted file mode 100644 index e491f1be..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerInstructionRsp/RabbitizerInstructionRsp_ProcessUniqueId.c +++ /dev/null @@ -1,233 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstructionRsp.h" - -#include "common/RabbitizerConfig.h" - -#define RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, ...) \ - case (caseBits): \ - self->uniqueId = RABBITIZER_INSTR_ID_##prefix##_##name; \ - break; -#define RABBITIZER_DEF_INSTR_ID_ALTNAME(prefix, caseBits, name, altname, ...) RABBITIZER_DEF_INSTR_ID(prefix, caseBits, name, __VA_ARGS__) - -void RabbitizerInstructionRsp_processUniqueId_Normal_Lwc2(RabbitizerInstruction *self) { - uint32_t rd = RAB_INSTR_GET_rd(self); - - self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd); - - switch (rd) { -#include "instructions/instr_id/rsp/rsp_normal_lwc2.inc" - } -} - -void RabbitizerInstructionRsp_processUniqueId_Normal_Swc2(RabbitizerInstruction *self) { - uint32_t rd = RAB_INSTR_GET_rd(self); - uint32_t elementlow; - - self->_mandatorybits = RAB_INSTR_PACK_rd(self->_mandatorybits, rd); - - switch (rd) { -#include "instructions/instr_id/rsp/rsp_normal_swc2.inc" - } - - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_rsp_suv: - elementlow = RAB_INSTR_RSP_GET_elementlow(self); - self->_mandatorybits = RAB_INSTR_RSP_PACK_elementlow(self->_mandatorybits, elementlow); - if (elementlow != 0) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_swv; - } - break; - - default: - break; - } -} - -void RabbitizerInstructionRsp_processUniqueId_Normal(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - switch (opcode) { -#include "instructions/instr_id/rsp/rsp_normal.inc" - - // new rsp stuff - case 0x32: - RabbitizerInstructionRsp_processUniqueId_Normal_Lwc2(self); - break; - - case 0x3A: - RabbitizerInstructionRsp_processUniqueId_Normal_Swc2(self); - break; - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - if (RAB_INSTR_GET_rt(self) == 0) { - if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_beq) { - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoB) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_b; - } - } else { - if (RabbitizerConfig_Cfg.pseudos.pseudoBeqz) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_beqz; - } - } - } else if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_bne) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBnez) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_bnez; - } - } - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionRsp_processUniqueId_Special(RabbitizerInstruction *self) { - uint32_t function = RAB_INSTR_GET_function(self); - - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/rsp/rsp_special.inc" - } - - if (RabbitizerInstruction_isNop(self)) { - // NOP is special enough - self->uniqueId = RABBITIZER_INSTR_ID_rsp_nop; - } else if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - if (RAB_INSTR_GET_rt(self) == 0) { - if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_or) { - if (RabbitizerConfig_Cfg.pseudos.pseudoMove) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_move; - } - } else if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_nor) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNot) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_not; - } - } - } else if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_subu) { - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoNegu) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_negu; - } - } - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; - - if (self->uniqueId == RABBITIZER_INSTR_ID_rsp_jalr) { - // $ra - if (RAB_INSTR_GET_rd(self) != 31) { - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[RABBITIZER_INSTR_ID_rsp_jalr_rd]; - } - } -} - -void RabbitizerInstructionRsp_processUniqueId_Regimm(RabbitizerInstruction *self) { - uint32_t rt = RAB_INSTR_GET_rt(self); - - self->_mandatorybits = RAB_INSTR_PACK_rt(self->_mandatorybits, rt); - - switch (rt) { -#include "instructions/instr_id/rsp/rsp_regimm.inc" - } - - if (RabbitizerConfig_Cfg.pseudos.enablePseudos) { - switch (self->uniqueId) { - case RABBITIZER_INSTR_ID_rsp_bgezal: - if (RAB_INSTR_GET_rs(self) == 0) { - if (RabbitizerConfig_Cfg.pseudos.pseudoBal) { - self->uniqueId = RABBITIZER_INSTR_ID_rsp_bal; - } - } - break; - - default: - break; - } - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionRsp_processUniqueId_Coprocessor0(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -void RabbitizerInstructionRsp_processUniqueId_Coprocessor2_Vu(RabbitizerInstruction *self) { - uint32_t aux = SHIFTR(self->word, 25, 1); - uint32_t function = RAB_INSTR_GET_function(self); - - if (aux != 1) { - return; - } - - // TODO: name this bit range - self->_mandatorybits = BITREPACK(self->_mandatorybits, aux, 25, 1); - self->_mandatorybits = RAB_INSTR_PACK_function(self->_mandatorybits, function); - - switch (function) { -#include "instructions/instr_id/rsp/rsp_cop2_vu.inc" - } -} - -void RabbitizerInstructionRsp_processUniqueId_Coprocessor2(RabbitizerInstruction *self) { - uint32_t fmt = RAB_INSTR_GET_fmt(self); - - self->_mandatorybits = RAB_INSTR_PACK_fmt(self->_mandatorybits, fmt); - - switch (fmt) { -#include "instructions/instr_id/cpu/cpu_cop0.inc" - - default: - RabbitizerInstructionRsp_processUniqueId_Coprocessor2_Vu(self); - break; - } - - self->descriptor = &RabbitizerInstrDescriptor_Descriptors[self->uniqueId]; -} - -#undef RABBITIZER_DEF_INSTR_ID -#undef RABBITIZER_DEF_INSTR_ID_ALTNAME - -void RabbitizerInstructionRsp_processUniqueId(RabbitizerInstruction *self) { - uint32_t opcode = RAB_INSTR_GET_opcode(self); - - self->_mandatorybits = RAB_INSTR_PACK_opcode(self->_mandatorybits, opcode); - - self->uniqueId = RABBITIZER_INSTR_ID_rsp_INVALID; - - switch (opcode) { - default: - RabbitizerInstructionRsp_processUniqueId_Normal(self); - break; - case 0x00: - RabbitizerInstructionRsp_processUniqueId_Special(self); - break; - case 0x01: - RabbitizerInstructionRsp_processUniqueId_Regimm(self); - break; - case 0x10: - RabbitizerInstructionRsp_processUniqueId_Coprocessor0(self); - break; - // case 0x11: - // RabbitizerInstructionRsp_processUniqueId_Coprocessor1(self); - // break; - case 0x12: - RabbitizerInstructionRsp_processUniqueId_Coprocessor2(self); - break; - } -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c b/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c deleted file mode 100644 index 4d16024f..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/src/instructions/RabbitizerRegister.c +++ /dev/null @@ -1,181 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerRegister.h" - -#include - -#include "common/Utils.h" -#include "common/RabbitizerConfig.h" - -#define RABBITIZER_DEF_REG(prefix, name, numeric) [RABBITIZER_REG_##prefix##_##name] = { "$" #numeric, "$" #name } - -#define RABBITIZER_DEF_REG_NODOLLAR(prefix, name, numeric) [RABBITIZER_REG_##prefix##_##name] = { "$" #numeric, #name } - -// numeric, named - -const char *RabbitizerRegister_GprO32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_GprO32.inc" -}; - -const char *RabbitizerRegister_GprN32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_GprN32.inc" -}; - -const char *RabbitizerRegister_Cop0_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop0.inc" -}; - -const char *RabbitizerRegister_Cop1O32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1O32.inc" -}; - -const char *RabbitizerRegister_Cop1N32_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1N32.inc" -}; - -const char *RabbitizerRegister_Cop1N64_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1N64.inc" -}; - -const char *RabbitizerRegister_Cop1Control_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop1Control.inc" -}; - -const char *RabbitizerRegister_Cop2_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_Cop2.inc" -}; - -/* RSP */ - -const char *RabbitizerRegister_RspGpr_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspGpr.inc" -}; - -const char *RabbitizerRegister_RspCop0_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspCop0.inc" -}; - -const char *RabbitizerRegister_RspCop2_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspCop2.inc" -}; - -const char *RabbitizerRegister_RspCop2Control_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspCop2Control.inc" -}; - -const char *RabbitizerRegister_RspVector_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_RspVector.inc" -}; - -/* RSP */ - -/* R5900 */ - -const char *RabbitizerRegister_R5900VF_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_R5900VF.inc" -}; - -const char *RabbitizerRegister_R5900VI_Names[][2] = { -#include "instructions/registers/RabbitizerRegister_R5900VI.inc" -}; - -/* R5900 */ - -const char *RabbitizerRegister_getNameGpr(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_GprO32_Names)); - - switch (RabbitizerConfig_Cfg.regNames.gprAbiNames) { - case RABBITIZER_ABI_NUMERIC: - return RabbitizerRegister_GprO32_Names[regValue][0]; - - default: - case RABBITIZER_ABI_O32: - return RabbitizerRegister_GprO32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - - case RABBITIZER_ABI_N32: - case RABBITIZER_ABI_N64: - return RabbitizerRegister_GprN32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - } -} - -const char *RabbitizerRegister_getNameCop0(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop0_Names)); - - return RabbitizerRegister_Cop0_Names[regValue] - [RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.vr4300Cop0NamedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameCop1(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop1O32_Names)); - - switch (RabbitizerConfig_Cfg.regNames.fprAbiNames) { - default: - case RABBITIZER_ABI_NUMERIC: - return RabbitizerRegister_Cop1O32_Names[regValue][0]; - - case RABBITIZER_ABI_O32: - return RabbitizerRegister_Cop1O32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - - case RABBITIZER_ABI_N32: - return RabbitizerRegister_Cop1N32_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - - case RABBITIZER_ABI_N64: - return RabbitizerRegister_Cop1N64_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; - } -} - -const char *RabbitizerRegister_getNameCop1Control(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop1Control_Names)); - - return RabbitizerRegister_Cop1Control_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.userFpcCsr ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameCop2(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_Cop2_Names)); - - return RabbitizerRegister_Cop2_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspGpr(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspGpr_Names)); - - return RabbitizerRegister_RspGpr_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspCop0(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop0_Names)); - - return RabbitizerRegister_RspCop0_Names[regValue] - [RabbitizerConfig_Cfg.regNames.namedRegisters && RabbitizerConfig_Cfg.regNames.vr4300RspCop0NamedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspCop2(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop2_Names)); - - return RabbitizerRegister_RspCop2_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspCop2Control(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspCop2Control_Names)); - - return RabbitizerRegister_RspCop2Control_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameRspVector(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_RspVector_Names)); - - return RabbitizerRegister_RspVector_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameR5900VF(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VF_Names)); - - return RabbitizerRegister_R5900VF_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} - -const char *RabbitizerRegister_getNameR5900VI(uint8_t regValue) { - assert(regValue < ARRAY_COUNT(RabbitizerRegister_R5900VI_Names)); - - return RabbitizerRegister_R5900VI_Names[regValue][RabbitizerConfig_Cfg.regNames.namedRegisters ? 1 : 0]; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/test.c b/tools/ido-static-recomp/tools/rabbitizer/test.c deleted file mode 100644 index e968dfaf..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/test.c +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/RabbitizerInstruction.h" - -#include -#include -#include -#include - - -int main() { - uint32_t word; - RabbitizerInstruction instr; - char *buffer; - int extraLJust = 5; - size_t bufferSize; - size_t disassembledSize; - - word = 0x8D4A7E18; // lw - //word = 0x00004010; // mfhi - - RabbitizerInstruction_init(&instr, word, 0x80000000); - - RabbitizerInstruction_processUniqueId(&instr); - - bufferSize = RabbitizerInstruction_getSizeForBuffer(&instr, 0, extraLJust); - buffer = malloc(bufferSize + 1); - assert(buffer != NULL); - - disassembledSize = RabbitizerInstruction_disassemble(&instr, buffer, NULL, 0, extraLJust); - assert(disassembledSize <= bufferSize); - - printf("%08X: %s\n", word, buffer); - - free(buffer); - RabbitizerInstruction_destroy(&instr); - - return 0; -} diff --git a/tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp b/tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp deleted file mode 100644 index 689e12b3..00000000 --- a/tools/ido-static-recomp/tools/rabbitizer/tests/cplusplus/test.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-FileCopyrightText: © 2022 Decompollaborate */ -/* SPDX-License-Identifier: MIT */ - -#include "instructions/InstructionCpu.hpp" - - -int main() { - uint32_t word = 0x8D4A7E18; // lw - uint32_t vram = 0x80000000; - int extraLJust = 5; - rabbitizer::InstructionCpu instr(word, vram); - - printf("%08X: %s\n", word, instr.disassemble(extraLJust).c_str()); - - return 0; -} diff --git a/tools/ido5.3_compiler/LICENSE.md b/tools/ido5.3_compiler/LICENSE.md deleted file mode 100644 index 015107d4..00000000 --- a/tools/ido5.3_compiler/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -# Silicon Graphics Freeware Legal Notice -## Copyright 1995, Silicon Graphics, Inc. -- ALL RIGHTS RESERVED - -You may copy, modify, use and distribute this software, (i) provided that you include the entirety of this reservation of rights notice in all such copies, and (ii) you comply with any additional or different obligations and/or use restrictions specified by any third party owner or supplier of the software in other notices that may be included with the software. - -**SGI DISCLAIMS ALL WARRANTIES WITH RESPECT TO THIS SOFTWARE, EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. SGI SHALL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING, WITHOUT LIMITATION, LOST REVENUES, LOST PROFITS, OR LOSS OF PROSPECTIVE ECONOMIC ADVANTAGE, RESULTING FROM THE USE OR MISUSE OF THIS SOFTWARE.** - -**U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:** - -Use, duplication or disclosure by the Government is subject to restrictions as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or in similar or successor clauses in the FAR, or the DOD or NASA FAR Supplement. Unpublished - rights reserved under the Copyright Laws of United States. Contractor/manufacturer is Silicon Graphics, Inc., 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311. - -## Product Support - -Freeware products are not supported by Silicon Graphics or any of its support providers. The software contained in this package is made available through the generous efforts of their authors. Although they are interested in your feedback, they are under no obligation to address bugs, enhancements, or answer questions. - ----- - -**NOTE:** This license was copied verbatim from https://web.archive.org/web/19991008090202/http://toolbox.sgi.com/TasteOfDT/public/freeware1.0/legal_notice.html . diff --git a/tools/ido5.3_compiler/lib/libmalloc.so b/tools/ido5.3_compiler/lib/libmalloc.so deleted file mode 100644 index a58e1034503f5194557a7e8a96d2904acd7560a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28216 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 diff --git a/tools/ido5.3_compiler/lib/libmalloc_old.so b/tools/ido5.3_compiler/lib/libmalloc_old.so deleted file mode 100644 index 2a14987d1d4f22c62ae7259033b8c380e69c6103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28216 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 diff --git a/tools/ido5.3_compiler/lib/rld b/tools/ido5.3_compiler/lib/rld deleted file mode 100755 index 727b42699729e82eef4c893255c39f1ad83ce59d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585876 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

    ;LB>=M|8eiIDMNkeUmU3=I0g*Z+g=R)NP0D7{RD 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 diff --git a/tools/egcs/cpp b/tools/egcs/cpp deleted file mode 100755 index 18d304c6466f148b5dae170a7595d9d7b9ed70de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1015916 zcmb<-^>JflWMpQ50wxA#21W)328H=793~754122i!7?Tc3JjbK8Vqs_vS4|zU;_&W zLjwzk4-*3e2(y3$1sEXm0t^fc6IeJv_(TL30|>Js%NKAlFnr+S0AZeK%nTrmtbYL; zAH#xaLL49*q0hkZWitZ<8&p3?T?iusLr5bF2M8xHFff2HNF0RO85kIl^@E&Zz`(!& zk^|x3rzI&Bj0_AFjVv4>EW^OS0Kyf?0;Lt8v<#G%fYKsRS^!G(KxwG+Myb&d7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=CK^Ov``Q?5GH^1R{k<8D)(0KT>JRigH10Z*{9w=e@f1&vZNAzJ37luLV|Eq#} zd};jhE({D1KBy;%%m?)lk@=vWBQhVnGfn&BlAH$Ze%{FCyvYq_0S>w<~Kb5OH>qIm>4oM zG#?Ro0qXM`zJ1wQ%*gNp6sDl?3wNq_n1IV=mZ<_zqO#7fuVVCMK=QjL#fH}RuBVZ)D8s(1_qDLN6kO}mvA0u zX#zR&_4{TX6@|{%fmsYeS&T1c9AX3+)IAlXr}-Bnf9pO51_p=`Am!a#L1z1Pf~iuw z5@A$yLz|cDvB)+qefq^0QzbI%Br1=d`=j$xC z7s?-5L6$-ThmvqOc^4xbUb8m;Vk(X5oubmh01D=vN^lQ>240T0s5F4w&%nUYdHwV1 z9g3hJ>YV}>1P9Xp|NsBLetWz{g#{FZAZ4!uKw-u9LgpYitRMl+Tq+3(CC~^D%wt|3 zz#fCBU@7H>r~r)%eSwIvmWn~dK;uskUG*1u~ok2;60UqFj&DxBhq*(f(JNC(oa8)jb&JXR(%`X`1UV_6N9OB@l0}b}q z7r(PXjgG@_v;fTLC!N1v{8d4i{0fK3m&h`CF*Qx*hq$>r_DT2)FC>Fs<8bn2Vx0^( z_(AxKkIIO!px9uPP@axtGR2_`ck+(#7j{SnQ|x58!B4_pJXNA%SO`I5Z*I!}|Np~Z zbRwDk0!IX1AT|O~!dV~5Wa@?UlkgYU6sZ^-$l+W|jKQEfC-_AXJE+2ElHg+iRsSVF z|Nrlfo$?|FM8~M`yh#4}|3As4%aiWd2QPjqAUsFi(q%r9$<&LFE8#EPkPOC|?mK_K z@cZ%qf47Xv3%4Kt|9Ad=VGp8SzpwyNzh4-FsMjyFK-BLS%0K@9e<24VB!B$>Pi*po z$K{>y7aQdf;fT*sJHP+`|6tzt9J%j8PGJ zp$1{dypRQ{m4L_!e*gb}0x0dhcy7YTz}ha#$I#oLFp+`brMfyNL)ruo1j~npzqn|^ z$k2E^Rg{k*EV%iN&GDlO_QD+9t{Kfg82MW^GB7YS|6t;8`OC<_(A^5EvRe=ExAcI7 z&;9RoQQ_&1QQ>L5U8mA{qjUZSZU%;nKRVmDa5FG;-Y_`Od8o5}2T1H!=kz_?AOkuW z7#La)lt#9Gt5fOx(7Am9NcKl(`x20j4-g$IKw`f-r>_C)09n;~pp-wm9VE`Y6I7qi z{Qk4EJzypSL-P@v=(zaU!`-bAgG3{M_&QBh~?EK$+vEo9sQaxnj*74rNoQcMgC zod*xTWNm)P-u#n^zvT%d14Hvq=2D|>9~FUb2boGV55C~L_^SEgU)BH23=EwEV@wA>S;pqHecg+@Be>DXs&2P4$WC0-Z4m6_JP^Q9sa)a3=9n2F)A9(H7YU;V2k+YA2htw z{F|A7$|1#5%{3|#4E0=w2bzB~@lQFRc!KdjXNigeD9kx8bRK&x(D;*qiGhK?WgW;I z9~FVtZza{ej*K8nL8+I4e^KK@hW`u<5cihEx1KDCZu|+Fdo4Zk{TRrxB`5gz`l!e> zpZMQ=kg@qSWAn3rmmhq;pm?}5Mn&fJ>h2g7fp3Qy`CHun{r`XP1z+>ye~<`{0Y|XR zOXYw6|AYMU(jUT5=yp+&Y5u|3d;^rnWV&5cBw7#Dc{JCkXfTyTHy>c^Jor-M-~a#L zkAdQxzXcTOAZtPL{4Jn<2FN`U5chyxas!l*nxFlBDg7TDb{b42!p$c^p$JOOZ~p%O z|ML3Z|NpyVRAjnC3%XrPI&Ze#E-?WGS=+w9|Nl4tV&iY!3Szu4Z~mdi-@X#0dP@6} z)qnmo{<8c3XeY=eFDL)~{~w&V_*=Gs%-sC<|9_BEpg{w7ipp1QFzon&>SZh(0WVgCGBSMWmQgtj zG6YVgZLJlwlQ z4O9xGO@OhW0ucSWAeEhm4!)2-_=}10!o?pY3cEncTQ8M}gUu2MfEaeE`3T6c5;X>x zIUxTv*fJaw;$SE>2CL2&?j?fRkl4NJiP zQl9^%951dOW&t^_)AdVp?H7hh;TI-}j11ij%|BR5nO=)`yMB4C2$Cof>303X=*rXW z`bE?AO>^xVhWd@K87FkR3TV5&>5lz#@-VX10br{i@bNLc_61vxW+}rF6ia1a>`y>g zD&5`8(#F8h{DvpsMTQO|1Cqr8&9wpy^=l_gz_9V&Uyx_>_&|d&Yqkk-bc5Pv0U!@v zaR7H(!F@Q67irZno54QeX|CmAC{aFs0HG&~;e}upL`yCYW4G&<<^zn3t{fnRrHe6a zW_ghUw)qP$A47Muf*8o%909$}R~-NR4|wt7Jfsi%hNrjrJ6L3z3&d!U2#XU)O$(Ap z2w0>DNn{3CBmqg}30TArNyNk%WR4AzNCQ|z3rXYxSVRIzM8O55iw#L62Q2c%8R5bm zV39{iB0R1jT^Eo<9Ka&`kVJaGB5ROD&VWT`A&IcKfz0VZ67c|wlp%>s0E?s`iQE8- z1R;s2xP#1bKoThdi|8SV8~}^RAc=5zfOK&oiFklTemEig-T)SPh9q(TEOG@&g?~ajpN5A82R6RxU}Ru;arFnNAWY@tW9U5B z?Z(pCTJrDzf9P1K>l4ER-E0RRFoDa~26b@Z)Y&TW|Nno4a3)Mx21PgsCai!WYz-4u zK@nDg32UGT^TLF6K+W3LDgXY1nv4v`TW7#obKtB6aMltyYXzLO2FmJf77hCIzq572 zzyJS_w{C%o9&g z5KJ~4LlzWIFj-3sSx|JrWThdp$6F`-`~M%*EPh!h4(jxQxNwJpQWxWeZU+8s3^uwY z*^sKc^+1WpiyJ@w{|AksH;V^>l6|i-BSZ6EaHy3ib%V{sFr*V4mM;ZxThj>+_m}U) za5|*<03-i42L62qntzn@w^xcWFdTfq)ZHR6BmB>Q#v6A3AK8SzHYF}PB8y9Uw3l=$Y)bQN;?H$a$qq$uD$_r_2MVc zu;p+40qW9%L#g#Z312su)!Dk|-~a!wv%m?`!2y)lazOEZL;xZKYWQviDS44q04@M~ z1AcUa^)Ma+CHm&4py&yDVFRT) zBEgk#sX#Ya2vQNY94L_j`M-HG$h`ksLCRh%Gz2&GUvnHkumRjx?rcs0)u><+G&K&+ z31FqqWk7A335P!Jy^&=-3u`R6mDP^)LgI~M7j4Q#N0S^b0H?+HWy?YzHqn# zF_#V9T#!CUJcC&n?gfeBGxs6H+;w+h;lOpg*#Mfk@acOE(N_l3$KSe#2b5qepn6}f z1#>}30OSOO6JLTBgdA@!fT^3rgFj(?gjmE2v#6B+cykR*vo`_Fe<7ML+=2NHsu>g; zFZl>)<_Q58_LGq{m%wbk2%cWSUH*wdG>4&U2HQM^fM#WgW=V9-ppbkSPC&CBMDv~7 zNPY%68*H-_0nIiL&GV5pSHS#ymkWPXc|kNMp=$=)ynuk_XozN2WX%mQo0AD>PKIcH zaSO@MAkAQ#)d*9+M@8@!e<~(%GV4K$v(A*5sY>2G61?J~`0-C!a zn!nsc@-s*?*k&UFnx{cDZ-;5-Z)M;FWnWm%I^GOQGT`*~oCALd%z+q{12YPgK|Nre z*g`<_0*GdPWX&#O44@e$hL>wVjY>St(8UnVpKicHfaiEKNHfUUuZ!@NUdtgmccAM8 z&BDC4z^8LHL}wjbCl|s_eEOg^y2137=;2chwM7D^x-=7_8q#7>hj6e}m;t@b8$v)W z!d_v*Eg8_5PA|Bn0vXSF$;QsW0B@s!2X~IQf(C;?0s8VK8}4*)fT^?f2&l22z`w7x z88pB6!>`1!`G;SCo&qXDsAD?>!V zksuCXgC;Crb02R`fF`I3-C%oq0~kA}f-L0U#?S$_uwgIAS_b~s>i_@$zqG~cR#3am zn7>t!4V2y%oonA_+p8F8$-*15;KUy(bJCrR2VjJ0vh&WJkflJsZ-$P z8y1+ckR%A{e29dClA4krfuuGSTut&!1(i(QQ^Cfb>SpLO*uHUicRN^>VbX%5Q}hy~bTodN_L#?aXcG6CFR2laUZ{%-~GUo5x+jpNdkpDTDutRMrNh6AFhB7_M)N^_dg(+!b1y{mL1fLK2>`HWRsx!5 zLNvF)H1oG!2CY4A1_dM7fFlH|>m?8aoDl|qN`&LhJ+Rc!1~Lzx-(FWk$FEEIpd%09 z!RXg1kbw$NzZohH9>#v{gCqPwC1-E*YH->u=V4@+@LFlYYxxPUWhT6qobXy~!fW9P zuLUN&=AH1GYr<>x39nfuyk?w$5~bE`{5>V0(Rt7;@_w*Ec5}ed)!AwQ9%%!S3?)*{ zd%+VcrGnrNJxK6HkQ8`KxA_fE7T1efUWl${8PK2`nCxs;$N*&ti3|n?E>HkA7l77D z9boJPGrGZK_63vP<^`Z&y3pBb0=5x6vR}#r4FPb-bc3b3r-GzFqn;pz-2xEN&Hxs$ zn?Q0eE=Gfg+q$QMRCGFVK$IMJ04?BW=mvM&TMv}*^fn&_6*A3lKn{At(c8=bO2_}V zf^@x@^Bv-^z2HeD{?_xLqP!WjmI6H4l?Sn+`2b^Y0M8Ea^7t2wj2HHUSl|^O-@j)c z5a>MA_=w@d|NouOHLrL6vb<6v(D;TyfPta8N97ObG>6x3Kq~(8Gcaggfw4d@hmvAyp&=Ajn#pK7`wqL zK@9I$JG3E9%*s!HN*Zg2sUmCMlHg zA~>9-m*AY110_Nb4!A`Fa@sM_fFP(*(t4mo5;Rtc8t$A&A>ob`A0QXJ2>uNge~sZ1 z8*~r86b9EBAiF^R*X3_L1ug(V0#IK%^0#h75@YIYwE+)$fymBQ&;m=4Js_H~8_b1N zH0p4UjY5eOg2M^&K1emlK8@0&5Sh-_8=%^oy%|h1c7rL1K~ivzjRGh}Kng*6IZG}< zWWb>X6V)iOhqa|ZgYuI<6#w}jl;Ok9z|cGSJgCg+oqPjC1-w|X7L@-KK$%hTMKvf3 zgDoY^?#|XbP~2ND1v1rT@hB4ji{0RWQeY<&PV2t+e>gSilcq~IJ# z0Du%g47vo70S5p~RI|haO8`V*34rBmkOH7;HmD+p8q#v0BnVtMO4- zjQ2n`UK-hW{(T2JTOGiO2xK8>R^tuF|E-_|1!>C!yfF9&PQl$^Wu1p0_IC(CXh_Zm zr8-bDMdUM#)cqP;P^4mU>zvg{L6JWT6ciw%!Qs!}dgnK2dK**?gR3@O%(@ZWwz<#^ zS~BL_-HbcKMjV8C3uG9)fdSJEYNt#Fm8(GkFC_k8QweS^6JgJX1Nd|!+oJ&~y3wjj zNE;UHA8YJV==}q5Q}hIQ#xyA4MIprX7!~JH&_aRcDWJ*=T)jVmHln-1!>PR@&DySR(T}9h9}3*~35`j)PM`Q76#Z3Nq`p zFIYwlEVCR%#uzN436|+ak&y(;Sc7GXk!2<{?*$pkz~3?jv_`r01#~XH8*Eo+>l;vx zmF@=9pp0Tw%H9l7)C?A5giEy?D811QmTEr0cJKkH`VDwd!wPYE^8;`t0ouopyHm2g5B45in)!77_yFoLQNuuH7LA|=A$ zY9Hk67e^tMzh>)g4h;MAzk4#+5xpQU9(>5ccnZ|l09n%;@SlHME69cprf!H!r-Btd zVqv^++yS&An*m+?5Tw}vYD{420PP55fCdxP#U+9e7ejpfQuzP>{}V9GY<|O%mC)M^ z+R+ve^dj0D(rTFup2r2x^ftfY0HwVDkdzM=>TI^j0BsipH^lf`(?Hc2*hQVKUqImu zox^njHKIVxImis|Di%n*w0eLS%KU()QE=FSgkH=G0$bh-n#%iQN7bMHT-|`NWGLT&S@+?RI;&=zp zLRV=>P=huStOjcYwcr`}Tjzn)LG1v0l>xM}A&l(<86IPkO{;Gc4Uf7^v_uspa?$?<`mDggUd9O2t$gl|i$plV=- zIe^AjK7N#$}LB5y_ znxciwvqRG5O-PB@4fZ=YEWnfQP*e7TMsOJTTjD|G40JtgK$dbAV{dZ^xLo2E2M_gh zH=ATIFm$&50c|DV1l2>}o~tETpi~A{@k6y%fVEx_gJ=b-;os(v(Q=?v5uuV9WXT+` z%4HChFBgFl4_J9`KnAF?XkGx44|*~6Ff?hGD0HL9FM`OI!sJWU;qow>Kihz8#5#+iTCqyCP&jSabrcJn|o? z?F|}11|`i1(Do8g5%C2q>C*>xLhFH2DRAY%5e}+~%wVGYEgCTO5E&VWOlK;`ke?G#YE8YBj)i4;ojBg^DN zIH1iA;I(-Wt~SIq2N=OY{_Y<%n{a^AFW6Y90?>N(tsuMqZw1M{xbF&%9Ara4Ei{lE zxF~xqhFAgE4Ys4R6(rdWCOcapBh8}lm4mQ&;BP5s2K9ag+87v4fRbP{hy`|BAk=Zq zJZ+#@0g=Z*N<~1U1fZ5gvjmjYycfLqutcKy4M&#M|E(b2i@%T};H5aYvjgh(f_X_kzS2>yo;`N_qqS zbwlMrsYkEW3nu;_NgTAU?+s{uy$m?DXFzOiJy0S8Qw=u-V#~`SP%Z#l#Z;F9Q}h?f zNE^LUADB2?Gsp?ar6w?OWGC1pm%=TBn*+5BG-L(w7js<=O!FU9%dk5l8HXb(a5$m@ z;Rv|-P)C58Coo5p<8VYgOdRe5h>zW2;wT|eP^u3TM+u37QgN6#nj^ZwQJi+1K`;Lp zXyq~_BY>j+#TQ6xAC&ABpy~S|M5r4)^8zX%z>MzZ383v1pphpK18E)VDp1Zu9Uuj- zT?F?^_*+2R8qs)Ey3|_ti zP0oOp5%YkI>xFii{%-}D^J01oNTmWs*8|k@fqL=_FX9$oSnc2Lpy~*Ey;T9~c;HK_?>c zxBLP{99+nOfuU3sG~x^{<$9Y{z-)EE4Z-1&K8ufGl1= z`~wuk0xOHD5>1z8QT0yNEY2;#wR2N_7iDi_T$FZ00N2k7u8$PJwV60hsJU3YZ0 z#(;{$&>h`ihUKAB&gQ)!p}%FUFV1`iMF5Bg^W|M=#()lt%5+Z!$s*a#5)=US7Zb!^ z5WjaiNx&3Iv>xE^Fa!;TLYxyI1Ci+rQ0Sh_0jkQt;++8+5bi`Kx$)3b)m8qPNIeg$Q$EC$r!PN@x$bceHS+5k%8sAUs) z!8f#Q>cTDEJGJHC|Nqe9sW2F9PiHIWq=x3bAQH29f*A~U@69h@9gyP5AJolk1(^pL zTV%*$K$K7*qh5Rs2PwuZp`1Xe6XG{`k@SWG9tbbu*g^UPn)iYtjG;sn8o3T4y#fCr z?9KoY$jV6Y$c;2iCHOdXwi;}# z(zH0=;qF@s$N3C$8NQ2J1O@xPT3wBa&~;l`kB!AC$lkRD&*W$1S0 z=yZM4?fM2>k3n`aL-wG)25lYv02)XN{Qw$8a(&%U``W66t)cccL+KOH4pqp=k?R|4 z*AFGE-L7vCqeSSlm!7Y|$*I%zOSkKXUeH*P>+25CgzNv(FaJxwym<5$EZ^<=q0{vZ z$bu5qmt~*=8nKxQ=JXkdK~C3zI~|lFK-*;By!f{TQf;_?Xs-Rh0CLfX*G8a3QTpbE zkR!M*1Uul1wW~lWJ1D_2ycTM9{Q}xR$_NUBFPg3buh%2*TMY*t(4g}|1#IV*%i!SZ zE|BT`-ubiB_d>TTN4J9nWT(rNNa#+NW3JbgUz;9ty&nBq|CsCbnAe)eT(8HzRzBu>J?^#aG1u$Wuf>nK zUaxsAc+B;B?Q8C1uGi~cvo^nDd~MhHp*!?~=7r`LOr5SzEU%Y{H`hL4s1xjVeFCma z!(YT%fc@O<`h@X#=a1eBM*eNS*E=|xk1=+ZUg&l`qY2()oMj*O0yG-bd_mwbS4PF`+m03n=}< z6Yq=8j|>c~nwNMPx??$BGdCY*;@`$>6I067>kQgcWW!bR1|*@diei7LP!VSM-O1XQ38Tq#fHT>c#dBwj?n19=);|D=Y5cs!=2)0}* z@p>)Xd9yc?u{)Hbw}`Q`l!Jd8X9pLi!qS^WxF-(oAaDwmdC_zLlq-Zlt}5l|uI1@= z6@e@*dCd$-mHgWd@Na8jW@uz!XgN^&+VWo!7dQvJRA*#h==`Diq0{wAbL|t(I$h8R zDpzl_K-8cA0bwsXH-a-&>w!{{ZdZxp;Q3~V+W9A-1s9)qotv-rH;d(ehyf%wfr3hk?$; zZ$8G}ocn|wlo3k!__wiv^PWNT56&_Uh`!f0psnr(-L3-N2H=pf{8x;s@HI$|q4SgG zp>9`^P64PkR&ZFMCC2cu;KnySpi@m)_Jcxy%6V}4(CONOw3qWZczX zx&T5g0a1|NM(cqRi|)ywd3?yMefA|2(4M{410{+W^ZB5FV8~(&c;Pq^oJ+c0Te>S0 zFqCz=&gpiY(_NqdB0>3Y4ya+r!_?{90NNf>p#ak7Aps%-z-$K@a27wMd8pgBq4R|1 z2g^hC!XO&79O8dz%Zq1c!S)?@T>*AD*xJt072U24;MxOi&hH0!PPKvyb51p60%#Zu zI;W~$&&bgEp|^mMe;Y?fFKD+LxUlNr;NNzz`9~Fhdw>9JgJ4TEwAcg{vs|SrAdfky zfQQ$PF@iZFy#XLbXMjlad&ZZR;-Fd>w7CJ)(&2A;&JP;q2klp4;P2nc&%j_^+Q8rZ zNQ?pEfX-jNRiIL&gX!ftP`7q3L}lw{&_)Q?Io%+u_*<9qqZrycm7f7rj~rt{a{$PV zpn}N_WTXvO$z70u6@M#ezhigvmj=*sB>omqTeKNwkt#m}L$CY)V+_jR#0g2k$l3Na zKRBci4h1W@09otAzl}wpSTgROX301}3I)*8gAUBSTL5(746MW^c;$W9cHar~{I^Mblv*FZW8 zh(IV|Yj$13`1&bC$|j~%xZ8CNbPWPmDM*qDl*>W-Z1hV_5RzJ@>dmfem|nAh^h0%P zm3~4f&@X)oR?yY37nBNBOP!&rRQX#kh%hjKbuuB;$CUDdIiN*{He4l-z#K-)WBjcv zL>L%AwlsrMCCG6g!Af2RhUWL+)CtOxEu9q#;I>N(C=z~1fI|p0hHMEQuLmt~1x?rN z26aZj3wnAdgI4ooAApt%{4JnD1S8YK%Ldh6u!$H7s9!2vI0?21y;OL)TNqTc^j0w9 zPS5b<>nzLxNxu9oAv_q_k*H+<{fw70iFE`R;<$sT1NyD)&X}!3T}h@F_84q4C+~eDkBINc`X^$E0u}IF~i~I z8}JMlyyR|u2pS@O!}GuN#Eb2qg&;=+Iw3n_3qS=-(2FAIN`~ecV$gCG6av7SM9Z<{#?( z{gc5WTqS(XKa}`eKq3CJ0W?_*3Q~;Ikzm3776;#fa@V#c7@Y3b)|Nj$ScJMPWOnBLZ zQs26BFff2z7*i_N3$05_d79twguQtF8QcT}Notiyc7t~=g33$@s1AMpR$dNJ&H-g6 z2L9Ib>=2Xm`CIqG@&qW)bT@+*7q=cLWdm2f3Z11_UV;t+02$0xS_g5gO-zXfOkqiN z=Lc=qE1)jR|I#brFTQAjD@(8-j_ZwG=p}~fqZTQ$tJz7Qv!NjX9V=RP6+s4 z+7R~QJUFBjI$h5+*PdbEZxI3I4p&eW1hNgY4XAmrJ9J97>kP&V%?J1_57tW|abbl8?Eoe6(&R1+Lr z-L6wW&59YV2TGKoo>%C0odN1KP5=%51%$tt4O2M-q!Q#_&`|#WQgEGVGzS`>E#26B z(0K~liful?WO=Aw4BU_f4NY?dfZDQB$j*mauMdw6NkmJegthrS<7)x14;5a+qDiZ> z^a40p!%7RS5|QQ~TJ^6%(Ev(3%|EzG{9fPbb^8YzWYsT~K}!^x;6&lS3+x9_O2bUw z>>uIjTfa2%bv8KHA(bt#WD9c>7bq^E`LqR;PfaXK8;bRyr9wSqQ5m#cu?1Nl^ulU4 z*#4K1%%Fq?I-YF8OI7G0W#E(r$r=1Dx4A*JvbO65NGx6mfAL=(9E+ete}VD%%U#^y zX0Z#XB6m<}Il$jCg#{!6+Q1Deo%mbypoz0N2xRw*?7a}H#X-WbMjs z%gx7_AVI|iD+)^PLSq5ici`W45v4WE*YH!XgtPe_kA|dg& z&fx-u2xvPqBt(S%{|7Cb0+oU`1^g|wTnr300sJkcTnr2^zy16FAF`?(RC+OXgAb-S z_=t&r8@SX2P0@lH1TRBDI~Ac#aC@*bN-dgemoSuyVC#A|A7ccclE%^ep7Es=7rcR{ z`;r%G4!D!k0$SSvYn&yxg5ng^w4W{-8xAVaJD7UiL9`7Qf9p2T zZbH`=9b1*Qx%wcC>z_I({9b@x*MrfcA-m3wzoWHN> z{r~@v(R|QMYj<-7wEegeGx@84fZ5oNK$C1iE`cDb?~If2$rF14HMDPH-mf z_7dsr&H4ZT|Mwe=KOhGfHPKa{~s`VMruK4`9ez)%tmDhc>oNKAIgR$9gmGYx$L9_Q| zB#UA?ZVDt=A%m;uhY}R%kxP^l};l#7?c!V5nhO?W;wxPrpf@`c6&=LaI8@)D6pwgoRbdXVZ=p9hA zRT+|$v|aCXx*mYHxVgGr5A+87?+iWAdZ7L_QiM8ymCINjFEN8OKfuHOip@Ww%T*!M zZ3VH=abvJe@a8f!u0Z4CooGXHTR}z33*pJ&(hp=lx#R03W%{;lVEa%qJ!t14;{?cg zWS~{7Acr+WPd96w^Yj1z*NhV|hJ%iy%rLy1`vMd<)4}9KFxd?zTft;Kn5+bo#b7cQ zOs2m8RgIwP7reBDwfP5Yxf>)vAH+cew6{6Z@z4KG*CVe}dYfaQ%*fv6Bq-Cbw>clm zbna~~fih9|+dvw8k9Zj{_Fm~!AT{{@r!g`>S_7ae=nYT6i?v(8!PWeR<$vjs-pMJ^ z;6=mf>%gMmOsCNaZaz%tc72j+%nF?tFPj9K7)O~`1ka-7ys%jcn#Vb_6*`YIrQ4OK z(-m}pa;Iw#(wt7WYmYYQgvtew_FAXw63BRdr|XJtSBXyW*gmM%twi-FLkVb)88aWI zKV8a^{3#Cdr|SarZIC+!7#J8p^Jfg-KO%2~e5iS`^Ar`fLAtK#E}hU_yXG~2=O@qv zC8VPy)FEJ9+Eel(=9Ey!&~j0ZYhPjtJU0FNEsyaW#NPS-Qtu4g)3FC2FT zjX5$LcLm)Cz;N6ZeCO72SI}Gs!*SOupnWhE9R*&@G(-EZv}zhoc)* z?C^Al9_S1Z=ng#sDvLr-bOuOtho0#Skm(M+09t4jdZjZ!r91QnXq6SH7}Dtueb5#&K6rCCJe2dZg1$1Ux$+((Ae*;6)eYI6FuX zff|Qk2SK=&u1nA+-XICh97{sGU4oR*)+IACbccdh0)S`sPjtJkfFxdO2O>)L``*XG z(Cs<}I+=Qi1$@gIk?2Jb6wJW zKm4TPV^E`?Fm}v*jYQL+jkEC zHb(w!2aX?d01vvbFtr>g;b=a{*y%gx^~3JcIiPA7b5O|`;$-~V7lHb$oyRo)b=F?! zbluYWtyH$#bqi=9iwiX0wgjBJ6n237pDsKM46WZvq`O@~%LyS4f=uUt+MunV;hk>R z3!SbzKLU<6ZaKDsZ>~`H@?Rufa6T7q#QiMX5uGxa4 zPQ$P5aPjxlfVM=u;A;M1#NQ4IcSvJlMLe{z z0Gdf@jbLJ6u>8*7902aKu-ky!$4ih?_;J@2poG~_UrPxEm`kdyX;s-A5i zC+&E-5mfAh^DB75bV;{|NN@OmP=({VCZN}KMZo{kIe}q8FAg_?!bqX>c(>~sP(W3p zOk9ClwM#lH6kZlUjO(m`W*UCb*b~eH{C%KVC5R{Z`^^{`7+&j=?08U80%@}2Z}|%D z)PVf4^W{q@8&nWL3NkM6>`C~Gm5>v}KzdMSPqssK=<~ONl2xz!|4!E%z2S`5%dpHk zkpBfhK?`akLwX{mI-Ru#K$+|SW4G%8P?lE!Wil{}v*ZO-jH{HjyY|NGi00ZW45cpJ zt}8$ltm}%`mPi>}xAO%5wgXrSYTe~vdtdW3gQnC$Vf>nZg5`JqrbN&!DXt&^keeJ7 zK;s(FNn!rhC7@`4_uHm{c<>y;2V3mQ%s=J8Yn|@W8QpF?pvBXoV49_#w;Oza%? zzUX#c&<$FG1JYr6sLT+=cTi}40j_wsN)*9-NauV3sP*EypxZ$Kv_v~}L8q6(F$ONM z0%Q?ou$7$$ArjqTpt2+|DBy*c0C>F_gGPCLr*xj{{GoZG`2Z`*9x9qQi05>= zP5~c21Rlx&txoaiqrgU=i3Haw8)H!%Guzi3hvtgr|411i05w1X>w{b}|KD zHd15mVI(6%H=;m!3rdZkfjk!ee$d?cYdxqZ7&=@h*u<0ySpF;K0W}b~N?DtaF}~*S zcAWznWdt=Ud?$2pSpMU0UJ06+-va7!fIM~qbcZQu#TlwGFG2M;xX=*k4FeVRpt;5@ zhJf&(7k9zOzbkaQPIxVh#R1l(6G~sat^tLoR*4|I4VVoQ&@WBt4TBb*p!${Jf9W1j zjQsOKWnb-#Zg*(e2cij; zeXGHS;VAoRXLPfJP6RttF9K%3%D$OP!2tj&a!?90Tt!zuH@swVQ0V;FEeI=GIzNJ| zPDcJ#P(Kq^iZk)Ig07hB29;}PKy}d>#%|X$kl9+KX5MpfkM#kX0^~Mz>CyDk#?aUJVzjVR>(mDT2r+}~F z0;`e$k)VNlP)!7?yE-px9tI^akVBS$YqcftTCMYf<>7iw+_JEU-T+x(2x)*yHoMLc z0M(tKt^EBQU;o3$uexKOq#DaY$7n7!V2sg#FU*=X8Pq$}TEYvvJKFV&;eqaE1@OL; zQdQ7S35FN08sM<(1YM%V)9d;n-~}^O1gsFEygT$us<9~4y5t5H2IO`B!Od@6Ug&}C z+P4_m6Fma%i5`IUM86mwKpo0}&mvjEW|2ztyIqff+utfBDln#Ei6oc_>fQ(RHZMs4 zbvw0ZK=J~(Ti@w==CyWr=o$2dz{1_GXR?t_^>V%PnyWeY3?pbsN9B1?K~gFXnn7)T z1UBV#7|? z2i>j@x*b>`i^CcCTV{dAn?XVxovtssU0;AMsyV<+-+K8(Gibo?#sAVLpygo772u$I z>B9!@P$hy!BTu}v1D(_93M%NK<4T}FmBA9IEX}SL7~!FK4|eQW^8pc>w=Yg~yIyF1 z!3bJV(c8?N_~(BB$Uhy)pjutvWewar@W*|KLqr;7tBQwA7~C^$n!ljB+EetBhkty z{%+SRpsosNQT`S12pEWqQ3>CKCz- z0XOpRKmrc3Gy3=su$pdHs3=O?=QzZBpsGBJ>qXB$uu{CSfuj97UZqIQu$#@bHyHR^ z+Q8KdERr-!#UY-9NBipx*jbyPLsmk-etbUx93ij$z;#~ZX815NfY)6?RvX{s0GGPpJ2?-4JNE~`&7cFw%^=qg(DvAe z|D^|B9GC@mPWQQIQm zZAPHuuwKmV0yTbgXG0n!;ImgiZ4&U=DWH8#;Ino>+m^tGG{G7wpbO=|0^pViODPBB zr~=qfU@Pd9BFM2$U85hzzz}u9X)rv6?EJiXaeJSD`;2qU+}S4pq=v& zG0@R&5EkeVQwR%mdOr}+8FUOkD5rofjP3^C8PR%xzcm>o2c1v?HEp01N)Vg* zTU|iX%_`t#B!4St2<|wT2Ofw7r8Nz(jSEoIRX~;}IIn@_`p<$=5&Zb>fGj(Z+zhZ> zF}j>BNbUw$E*xD>3M40%4Dz8hRyjkkoIJXm5=fs9SdJN8P6Z@a0G4}x2F;zuAh{V} zxzp%!U_YDz%dJP3(*^0{NddWYGDHrvWf+_+J6l0V5Q2_g1ksG$U@oN4LCW+GU$Zx_ z1)Uhg2s!`98mz2D8p6Xeq)>VRBBc#hNY_>;__{yHrGL-^BA{+y?3@bnBgAvfKa@)N zK*K*RbC?(yUcLtnQ-jr6gEJ|A%Mws~1}p*^MuO=Cor?rI{seS#C5Q&qP)a47&0tFz zU+fm#38EqTf*UP0^7ph>IP~MfSttn(jTW`g<$C`Wa)#DH=WRF0$hKn{Il3UqoxH{?(T&^cio z|F?n;4GDN5R|cL%L6YJLc(EO{wdRNbs-O`>5OM%XH`s6BGZMijPX!f*odV5!K{P{& za(63;(HoF~WCll2z>9u}b*%?VY#}n8V1*DiSUJd9nio1-K?l-wH=BqtFj#`wbv)f* zx)Ur0(Qw=WJexe>WiKeY)`Fq{dcLzIIH38P^FfEb<-=naDSdH3(k)m7l)O4mff5=h z)j|>l=qMWy50oJ6N)JHN3xuN&;ebXrz$v&??l}1PYEZe@4L(#3;;Wb6Knq<#hhXmo z*8}{mpvjbO@PQDWt}VT=V|W<u%U_;k*yRHB&x}^8&2ym$eIm!%j_}WX*-rer04xqceofx6c0|ybPh1Clx z)u3C=8NgFy>LrTJKh*0BLE8e@LB)j7>r`mr*9<l#b21^lhPpp!$uZUm)fS4cotECmPj z@m5g0fui-Lz_gYUWtX9zZMTjL6r< z-C!C#c&PwoI|#HMDA9s*Knt5dx#+cc^IDJ|c+v)OiuZ%-6;R3rZT)(~^M5Poh@BUI zK#Pb$7XyNp$TsftPg=$-+G|L9yBik7W}^zv?lk(mO^kz(+fVKC;)Om zB)g5UTy^?eQ+ML1Pk!DP5?EJAvedp zVac)$fChv(WSJWDpy1wShc*TV(Eb4MSyo`PLE#HJar3nYy%vW`F`%6DS-QR(>^AU;jG)8Q!Cu@_0QNt6u>6GxqXf(Ut)NyV zG~DEQz=^99+`eqy3ksnB{4L-U0QQ1B!@%FN9ux$~fzkp#YU2%07SD?y$jUFs(&uil z(?Mt1gH}a@&b9|x1a>D+zze3o;G<2ur-IzecnG>?I)DYj=$;Bv+Zn(CHDoHph}Whs zc0FWZ=w@jC!BoQYVjYw%QmOz61W+i0G&b)AkqrE;cA%4gS-`ysuxA+fI}d{9e!!f6 z{4HwW`qcxv=_t@9WntqMbg7(bwwo3uV$-?agfq`__j4T?9sn4X80I7%B{Jcf&9DS)ok zEQU-kzGPtrFVD$RfTq-FsQ4RDH3try)&q5>*aNLb7M}ikn`^+uz{3`B`g*wzREL5i z;ctl;B9v}H*5kbF2T6mD8V40KFufh1l|n}ZUKW8Rd7vqF*Dr8bHy@CrZyN`+3iLSm zR4`EHJPy850L1DBU#$UZyMc}t?FNg3>wVCH{{aw3_ckv8g~or#8dnK_aCZRtoH~%< zFBUj}JFAexAt7fK{^xH2E$9O;g6IkOzZKNGdr@HrRtMTW0S-y9=8#pOaud`y1kY>F zusl?1)eSBUL0xDE5y%17om0VQ4!ibrhfe731sx-8c(C(acP~iP@M7or&L5l~KwG(c z!Dqa|T<;3ES{ihZDySp{9X1BG9PFYnC$NiNLyoZq3pqoD#GoE2;ceav(!{{u0=f|Z z$|*?z8v^#h!ynLyh13h*Aqfw%*&3X#K&t+41?}p1aWos8q9KRR{oe{YVHOh70nm#t zBtho^91(a8Iid4a&kmK*b)`H560Eq6O|64(2--}P+cBlfV`U95>+TgYq zq#^>>z}?6PKFv$Vm@@$#UnKA%wF)$D@U@GVp}Uj=azCKI-L7B2`I0B##i#FJ z?{>qxMk3Kpp?7Y^$V!VIKcQ?7{p}gbp6s?`-P!&FW42msXw9- zC(?lDX&$X)U|?+m*%->v8TtX#n$iDX`l0jiix*koz=E1k!U=W+BY1q}1M(Eii}@fU z>_JAja)276`lalUDI~}mCgc-v8sC8K8+lP%3Gyc|L<^(>LmmVHm&)DX`UbS^7SS7zM5u}cJL8XX~lKBg0e;^rf&5@_J16YSP*Fxh&bk^?+>eT+fB zb1SGW0eM)jvl;hgFQtYTQ@_BB1Jzw`UZ^9P z_@(pE!B_H(7cTzjJk;&_hVcR<4TDPC&<|j(k(BpLiuhi z&{fP}KWuq%=`*-|051_b(tLm$rM9DaBjN<8#4X(dnjVWx1N*1j^~6qa`aT3MfjX~$ zTGx5v`vuSuhps0;*Q#ZtCZ-&BU`Z{~OHVuQz>%DM%z=vmlpULwf-Aq$6EEy`fI}I! zDZbSY)D(xT-F}%3VuSZmb-P}GCYKV{m!KvZ*ez%NmtJ^L@)zuuPS-0Fz`=Cp1@|+k zkr$e4FZ?eN>YWTaa0_8X>2-u|GnnohV9i%v===s72j<;)AqU}gxw``=j@KL@UzRex22DHvFFo^u=P8o+xk?{` zHJ^F$^$C*jfBsg`rZK2g*G8~ZcQYvAcCvMX6L7a12T~!y`r>E;w!E+MqPG~76J%R> z8M?t2g0&t1U0ngoM8=?o+7W@*%%DT)T;Cjb1>KzSA8hZN7fc_)=^3;j$2Q=9>6;gq zTft33cpoYu1Kfvl{m||Dp&L}+b-RA)bbaw!vD@`UH)u`_QXs5K0S8^{ff50b1Vg9m zi{{!F45c?g1!3(Ah7wDVFz6Bl&|-iW-3~n9p>F<`GEnCZWE2m`4d9t2Q%LI+)OdrO zBhLcr|AQPS0y$m}ItyRP(e3)=r9Y@gQ2T;`zjY_5zIwxxmGdHSA=ne0;HmlU&@Z5f zdeI&F2Go;reE}Up>IShun@JeDU0;CLql3Ki!hha5`?jSsMLfz|`1M%Y{N zwIBnJI|zVACP1wS1yFc|%mw?iyV(cabt=(;%qbvE_xvw?)7uT2g$@kroxD5+JY9Ux z8I;x(nrj6ZK+TR9-Jt@Vpovitum`(cpLC-awmL7g3PDM1S0l8ry#ktValL?4LIisVuy(477O$n6BKkbDW+UjoW;7mhoCW^ovhRMfl!r^4>gE4?-XATtU$ zUdurW@9=;Zeo4@@1u42gjTLaweGeRvS6=jd1Iu?Fx30ZX$^~)=f9p9=i{=ODY!b9v z)M!2p{Q$Iv6m}%a|I!C9?mq>44lE3+As>Ku4}snO;DzQ-h})07mWKN`E)gu&dZ3iG z+l}KjC)l$OK{J4e76a>x9WfY%0k~q6c~Lf>fuZpjUjsO#+iV2RgJAaT%? z-HUDq1cEu@IacdA|QRBWi^n}Vga}kYd#`_eAXq{S2{0N*PJ_-8jz7HtEX|MpXkK7E*!=L%!Iw;(*E>IaUfu0_2UO<>fM^f_ zz8i%HR58tc4Nd`|MTnpbaHl(z2b|&V9CwfancD4o=ePstC>jRnG1snlK)bJ8ML@~r zPDg+N$jDF$(5@|4o^A&f#4+Wi<=r3=hfdcgAVz>gx9bzjL#1rZwNF5&bgRt)6O1S z1R8VzSqpOr=x}rmaD{%Ow|N7oS@9yN2pq8BRL=3@j4`-KeQ5?-)a!Zyd{{bU`y03r zfE<%PXEs<1*h-mh*9+RNSGq&*fR08Fy#hNIy_Dm{(OhuufNr_x@7N5kKprrHwsKst zcD+!lb}{t=#8`0f!B0LfMmGQTya^y*!2BU~3=FJV z)u6(F16<>j@Pf)BXtM%Tt#Lqd*#vn17~D-t$^w-lpQ=FJB+#;G2FSV&&|zQTvgf51 zI63ijI|v}yTWEQ3!L2A}QB z@q!03Is$DORoa4&N=B-xdnem~S7w|OVZhh`tZf6SvfuDzDZcop#mE3^T-B*|yS@Oo z^uK^x<~CdSaRuC0yaMV}E0=)MNpJHFa48~_2Tp!qt6m-h zYiG$~>unBl1TPZ2@LXMrezx*boz zYey7IBjKX_tsg-{^{!7qHL>dp$XX)@$cP=t-Iu|#FF?aeKbT4(&1z8N*oF&q(lDr{ z3|)q$z~8c*0ea-&OGsOnC5yGUc@``%*seeWqcpSG^$IH}95! zO##Y+rKjDlSHR~EJOF$9f9V5IxiTBF#w<3A1qUB+fVTgj$Z(#ZK!x5Nj7` z$1`X`meCdDj84}z&8|yiKwHIJH-N%<325g7I2=G33hJ2N&;y{+2Zk($fd8c%f?kv# z0Obi8P_5^>2DEki2556MX!+rq;|}1x)S#Ks&>m1jU^3|H<8JUZ$eM@1%0N4*;r9@O zHsf@Mf(!v23MH8SpB3G%D{zGm*>cUbEB-@wn7M-74XW^7E&~^e0Y`}7zt_L8qaG-G* z@WQQ5*AtMdi$Htt!Iw03x?X@>TmstU30}GYDr>;YAwX*cAqxv!A9RDK5kc)I@Hs=E zE+gdJAlEmLvnIfW{+&+O2cWGc55Q>}v=|(c#E_PkJnD9R01-TX2y_cO|2FVOWPZ?S zLg<}t-y4jlEH9Mubi>2sbxyY{BzJ+9Q#zD_b5E!1p61#;44@;Ox4^E81gYZ5`v1Rl zOO`4~sZa?>slscWZr45F;zkv;K5!4Xd;xFvcijWtmn`v`3t?L~c>E;b#l$vnA<^x+ z1MHP0-L5OZhlzmpnYBiN&!JfW7FYl(oJ2u8X~2~~Qll8s(C7$wvC|vm5CPO>dkO)l z`MLRx#EUzV7#LV}=q?H#KR@ok0ZJYqHmDZ>8BBi)u9-MqTm}16U;^sE zpU#VUNuZKJuNYK^-w6O0pP;d!fEQ5{!R`SK4S_QTD8idVKqpbTUU>;RN(ZzzfWJit zlor7Xx2?71`2$|uxDQUO%?CIRK49u} zeezo3Vk)R}0G>ZCeegmAVY%xQYu7vV55NY4hBX3uoB2|~HP(X{8%;o!ivU;-VsJgg z;Lc+pu?mnFsMnYY5$z6rz<8ng4NF*fzzatYu=mnHhtGq9=)ntTh^o$GD0gY>g{*o5 zY5QOLAm9aWGAQqW?W|w{*Y4t8zV8=bCCP)xOeoBAKLLE%Qgi#C|aPZ(WqK=fI<-r#Ra1D~mM zg@L~{2E+obH+}HpWivRPPC#q;g$2Kup8$$}{X$S`66t0Dg_{64?F)bxqzWJ{NCh>5 zc(h$P!1KM9hsve8UEy3vya~LJDgcLSx2piCf9$~s8Vv#MB~^xqbcc#`2Z45th6M$@ z5V;0U0}z>B5zzVhpx%=!kF_gD3Fu-6P!mQ0wA~!dFa?OkAoqY|KntD!mvRKWID8du zAgEgncHAM*64n5P2^h0UDKD19gS>810P;Eq=(rWoxhxAn>OrRwi*&lqK&}&^t2|MA z!k}UiT>><&cLmmQULgiOWdtO81AbTuxV{H%l674Js?XLiLe2z7-NX1CR1tv+8jjv( zQAmnk^P&>6J_M92T^}&Iu7PN@0Uf~(Iv5k>Y!uL8;dqRHd5wv_dkUU_nsK3Pzyl#q zK*y&DfDd0{>{{nIzUTnZNQ3SAc|iXgTey532sgE59YEIP&i*)M+hfirdM zfl^Q8ed4fa#8}%4J*XiAY{_@fJ-6d@Mc zXqJFR&U>5ZfE}ln1P-p3pTO-bh|*GDP;lTi9i$NAbog!u=sqxrvF8&Z#?FQqYwbFx z2x99Qu&o=Q(x9^&Ku%=<9p;n_Vg+!3HYqr8SRN|%2Js!h4ay_kpoSSJP@3PcfVPyU z`@$kb6{HF(3o1H5TTFg{E%An0A`W)L5l|KbZ=Wcg4hsqXRvFNI2bga<{@bWbckOmKs25^J>4C9Go3_4iE z6hNjifKF$wJ;6{q5u^fQ&4ptO3@<@LYTd4DtX=2uH-ndSVY%f%kwCn^js~B+7y=1D z&=SKJip@V_%QYcqZUm%3H}-+|%H8>2`k=R2B@MJx`z|CZUQ1)h+)4!p*lWfKSqz|N z*PQ>QYhFwTT}*gHpwo3rx9gVP$)F*1&^bwiF5qHqU1WR}5ht2?w*V4ybA>$IDP0KGpoq#u> z(g!SwvOQvl8|e6;CEc-qP9n|@0{6k|B0;qTUlz2MfR5FJYl$=9p3@2BS^~PotV9Yt z_#^Va^u+&C(5xP)livOVoTPhQU%2O4*{^41i1MD7I6^ioqZ?$&;MXh ziBO&b(+4|R6Eqa_1a!fo174@_L!ILL0=#+V4WzXfn56`2gMf=}X#blFd_pW{r+T&v zY9kyx_LUY6N*CYKq3PlSs5Je+*zNiO-fe-G`JlbtAGASNqJf*_B`VFeUl>bGyCEx3 zd_ZU9gLK)bmvBM!+bDs`TF{hZZ!=E@D9{qX7mEtK4uEJvE163an`^(Yml}g=HTK?S z8IYF$r5rDmJiw9AdZ1L|e<=redIAj)3V=rPKo{C^fdlQOEogolu_;F#Bn>K|IJzBFAVW15+@UTifokCb zrFd5k@O?r&-4zNi`#@cgFp+L|5z9lRlHG3L4Uzv#FMx7T5L~xXcen^xjw6d92y~j! z|I#b}OP{(H$ny?Ji+?s8p^yjHTP1#qv<82xz9+9aQyjb%*hEyYpBc zg1G~9W5ID(P`{p`+f4*C{_QTp=z5{stlPfzTM0+&fBx3A|NsA6{wsm57YYG;js-+I z@N~ys=)4Kq*$%4DIl4VqK%wKn(_MR|^PeW@lCy)Ipw$Lhj6uNx;UITP!`ulo4zm0R zvwi-)g@J*!Kb4oE+gG4Fl&9B3u-jLnJ5;1sMzFb-gQ3I)l%Wd#KZG&Ui@kF?$lJWrPMqNbUFq4Bst3aEDsJ!lX#p2l$8 z72JeJKZ_8wkc*)k+=D5$K^~2so&p{q?GHlcH%n6@>sDreDe}yu@7WWr1W05>m1Dw%?Gr>x%5i&8;*c1 z#uq%0m8GCwyXy^5H%y@0^+s=iMz`w?@O0S?aJF932|7H7%|^MD7kUmW=n&@DCZID$ zR7+K%VpgTn(9?2NO9gw~m_Z#gE7WCL%?}ts=M~w5D)u)#z3n#OLS`lSwow6)Y09PS zJHWTfv+e+m?lB&FDGc6C4>~~&a#0reES$xlVaEu@&e$a#97w0EwEBV%_Bz=7Bc>!7 zbmCXP2xt-S5A_l)@VzN)V4iA8QS%Q~{{A1J^#qVjQ_B1;plQvQPeDSpM;J;Z`M0?) zwsbwh-?|e#e+G`SmutbsyDsi@J@RrP6X=-rIsDC_wk>EoE`Q5J(CK85vt5?-MuA)h zJ|gBN_;8-uBMkhlpar}jZ(8xUrh_&xyZr~94Zs3A1EAZL!`k&sF>kl)8At@$*pxg6 zU2t%w`2iznYy>os2MuXe&}qcr^8l?tN9ZuU)&MOm;O_t(P1byj@#T6@xdFD21?*xr z8)g31eg+1H3C+1n7(s~zJT}@LJH_%wnJC0MNUxF|v}Oo&kr(*pKHtUs+YWZR?t!0% z1C=gO2HlT#fDzRHI>v~4hz?Xq>FdtYE!L%T_*+{*%?40pCx9b+PbdRJ^AUlUxgg_s20J}^H>N3#mKxgTWm#4vpk-07gr6yl+YB~lA z*B|;NCCxwd`TIe68?>8-6O^_f*Uq9QonFutIj)eT(+D*T)WfL&C6|&?>(V*J(1V67 zU5}KogIpO?8V6pG*d4kAe8>=JSiOVkB_Al^)*fLfbp|QYDzyj4qd0^EJBnJrl&$#~ z(}dSb;1itZ6g_+`G2yis_7m&*w}mc7zN>=2Wi>eI3o!8afl_uaC}rLO+X4z~>(V(T zBJl8qG+99Ry*&XXP|!dv|29xs0bPFq4}AU>DX@_b7)zxae)^P(fn2N3-vUdLO8hN9 z!PPow4CN*0peXPeQY@fT2?K8^FmSq>=M>T;OWRG-Jpx4IC>{nWP(?zIf1Wg5&-p?L$7qZz5q=T5n~dl zrq_VZBDa9ua?Ky?7D$6X1e|F=C!jHaECkgX1Wj#z!_w<|BjA7OfnL`u0Wb1FcT9kW z0v>d`-T<#00Hv&#p!ovOSVSpg273kA?kHrtLAH`&X_o5$Qqb`}FYF*apH9#uG*1@C zi$cgeEcjq2mj9)1pvr#2MuP5uySrY^wJ+F9!S~oAx>!$M?6-oJQ_vB?Ghl~q^aBSH zcrXNJ-X~Dg2;|W_pv9k{W1v|;D>Fbx*na>msk{Rovk(E*Jq##wx-w=M-OrF0&pkj% zusjl)1h;g92Cp}Oli(U~5?q0j1VL>ehU1W~@7( zPRJeL6n6qNE8OdPB;dtgP~`=Rh%?=;ClDzv58P}y!vIZjB3Ym^>4gtCA|a{W2b|h3 zfYK)^c7qZgc*6f^B-k*}S_jZsQ%|7l04Bh40A$%7v}1f9)FP?9z)%_lUezbk>3Ze0 z9%vqk0X&C#1zf4|1ibKI0UHV))VT73Aqzaw1HSV73TUdS^bA<$#fv70E#Ry9;3h)P zOMjgOHTVsP2JhnhUwS6sg%>DDK;uFswxE+#K*JL^Kns5bUUP#Kf)*!tg3>SCF}p#n znIn){w<|A-Gr^8|%?2)#Zh$Xdl zY9qj22JO8-3^oufN=?8K>J6!6z&Y~+bYlcRBnY9KhhUeudxKiuuuhI0Xq*HzgZJjO z2518XG>k+7UZ{cM2^>byuB0$Xo&i+4)V^UTy#&e6NJA{a&2Lyh5f0S}IIfMXmyIPPTz&O@ySV2U+BiWxdxIY7e^44tk# z;IRQV(8Uy`3&8yk9?0MwXn+&8>_XnP-sblQklWZkSCyH=^*Exxq`>p zuN-&10m%n@AZ?(RRp874E@!~eeFsuG*=UsVHoIP71RcNhayDpe2V7^_XqJjJ=iXoh zB`f|Ga5{6n!uYxts!0iy)IfEcje03)@FcrtkzA z57CEO6BMpe#+$v?AD8CD61Yn5ACA(d~N0+Vw!`cF-aT5!hl&Pyq#AwbKkb zd66gJg%@NICU~m@Xx1Jpw2#umt@ty%X@laVK?ph0RDTpj?eEV6bzP^1K27nA@_zu}N+>u%RQ$3dq7{0Aqm*Sg?v z?5}~ezd#c#p;tNuKr;di-LV&5b97sG8h767{M~xH^h@Ullx-0E^f6XGgU2`9oIuG! zESQ%8RP1noCRe_IQW?m%JOMAJr-Jh~xNzZk(Fx&!m%M@YBQcbonJ@t(t?|6jECMa2 zJ{SZ_Ydp;dBs-6H{s2#_yoJmgcOLGp73dWK-J{9S+m_G(-YwzG(cQ8S#O`G7oC9VY zcLoh1Fm!{K46$}IcSeAQ;X0jpjyr?)YBBUWOLRI5bQcSN_Gld34{CkA7U?|I>%`c3 z5Zng?ZwhNZ&S+iBQ}et#7&MFtj;2oZ)?Qffi#kV8IPig;EYQ8B8RU@H8r^O@maaUd za^0ak-EIQ#8R(5h(2QBi()r;vH+Zf26>t<`%s;cd5GiC}VBHeP%g`Ol(H+FndZ~mL z!s_|FO~3t86ZJVmQF7g5HE;zVEof9A*KT2`WCQoU)j@0BUNCltZs`zsEd>(lc3pCe zfdM=T(e1iK8+2y%j@KM7LDw~b2W>#%hvpB^m>WB&=os)lpweu?Yj@DOvc@mJkydmJlQ$0|E25lk|2g!h@%T|CV z4|jlWGzs8%%?A=@=yYAsT)TjwbTf$LZ-rEGJDLy3LdRiSAPYIcOCL3h<=d3b4!ys0?Uxb82$n%B*3?(8+2ETc69deZcxaG$K%J`CCCiIA1foxF!;3*`4!6omP z7lppyfCNp${r_M30n}FA2Jt$qZP|y^`LgbI{lMr78sT@v;c!UH4SH~$0@%WCH?S4p z7)7pNgPY%|ytrfq3b!P0Xt;rPv4EQ~0^n|#NT=%!Sc499zOm~AZO}p+&|XCJ13YNH zuM0XW8~|R;_T~lW25=IF%+G?WVo-F#*3F|f>p;;7+KAWe2o4Z8d!ztCUJCtG4WmP$ z@?wJ}D1;omhFl0eUq?a+Atf?`-69`wD4IZOG4QsdH@(fdU_p6^ASA6J2W^)sYS1>n z5qRO2!N9=!%!8MqdjjY-tIp6rudTX$|MX5+16l%i(uDC;H>feAgf7 za@%GDcq_BcB#_f&KwEr3D^?z8yKVtrC$R=xDy{*SifiDdVz=v_<^$}Ohw4QkEJ!K1 z=EXlq)&;FPcThOapq!bKns(fQC9mX|1DgUwv^RhqwCFEDp*wUBLaFY)+uI?$L#ud16ztRj8ke2Se44{05qx1n4V=TSR zvq514D$2er0$TyzRSRA8h-+Qk0+5~;Cv3r4^TjpL8mu=gS$w_CyFn5l!eBMcFTdmhT~(Xl#^9xWK-AIS;H4w4DZ2y1wDaQu<%|<%OR*D6Ryc{qGXC zZr3-*7#N`IfLl6@VvbC=RsmnkV4JWCQjU*bT2`K?ZHYNZU$Hyxqxnd!|_5Xm4Siv zkSj04@k8MDEGR>On`;f6IiT8Podd$?ldx_&Xvz1>6b1&?PFGmw%D!aM+W-oC(BRnz z$ZA+fD&u&;4{DQvMz_FgO(4B~aP=gR#gN4w@W1rKi)G-ENXViWxHaH(G0_B+E)+o) zVYdB0zy_<~i&{aqNDDx&nX^0u3MZc4W(}}UHdrEj0y%9Dd}Si2+46&(zXi1O5uy() z!o}YLnvw&zsy)H_3n2QTY65r=bLlKWy_4f}z=PV!Y@h*qr~|q|Lnt4*!3ztup!z&G zK+zMx0_B3buHf+#E>&<;w;m|5h8YY!;J6TMyA=3_NF;-yjt8B85ft#E))cHAp_K`A zW@#l@>wWO0i%_k{9VECwi4>|Gv@J{&Jn|#}YI}WnaUC)y2O0tbEmnp_p$}w836!cq z$Kjx8SpwCf2=!BdK=UES&Hzy4GJ@MgA6^tlBf=gz1%ivv^+uo=ws(eBfberZz8Hc# zbpNv$vQ$8Kb%ECqz4+<`GD@M-b;oh=G1Q>$1E|aEx`pu&w3uWBFTmLn@PfS;6e=-N`T#oK`T)GL6SSqJ!}T=(HrLZAD>xDx zYESEzRzUW=*dSl{mjV^jFO7mPHU(`L2Q`XaL56m_zUT}9U6ho?2pS~&U;5&OjxaQk z9)Mf{S`Mi&0dk#THv@RiH5YWoGGzSjHQ$8S+~6K3s3JJRh;1DIIcQk{_|7eB*CU{_ z#}6Q{D}Z(5?m%a!P)D;cw!vAu9w`lg1r{r$cmgddgI_Pl-+CE5CA&JK3EibK)Vu%gY|&+>5SmA>~%gk7@t5k(n1R*$f@hC#Sj(nQ`et> z=Rlu8hbi801O>bZoDEjf?Ftn|34YX5*Toism4aLjj)e>0aN=qH!3O3YFuVYo@~*wX zP~rwU1ftXd8WzyeP@7nA@Pj)RSF}M>JfI2oBcOeaHcOx_6_7Znw|WPZ>p|B|fLB`I z$zlgD=X>!&4qVPb>LHYFp_Vj8?iG3QRTq?dTkSw|0UTK}S&T0=L@*U%mKRO!SxGh=6W*t(qUKd`6XYvLq)(-7hfQE`9e!m(Agalpiy(sxgsq8 zOC><%G{*~lutNo2t3s6_7rMR83>gfdEr%R0zKepx1i8!wkFm$RumrpPq%FAQ0k3uB z0AIDp0lI3@h6!S9r|W^v(k-2(N5I3ZBAu=$psUQfn?u0mC4b8b4h9C$v;=?4JPyz; z35>a*i%B3;JZD}suL1`=c!XI1+)4y(-+^5H2Hq%xboCpE55DV70Cv}#0O)Rq07lRh zB4|zr*DfGS*9*{N=`Z{*6?mZuX$^sIdh)XVj+N%QK{XHla zWiezy>Mf2JJ0R!Ty*$j$09z0SIpx*{dJ*I*(2OkfBFK5{u-j&0a{v5iykYnM0casl ziy`Q`vqpBv{p&HMV$hXAT;S^o!(MPf&WQsJaG_jJ=nvJQ&)@0-vgH_PBmsPVHwXAI z8y4`cQjQlFpvSBpdnpT2R=b0NzeSjxf#J0p$jF#d8Mu8ykXQs?GQiOpAkut{vH2Jy z=%TR4Y!KJk@weQ7GPz0*ygUPHmDTQGDDil01TqYC;p8#K*QOvgaRzt6P22ynjt#Vp zo}<@81nLg>-D82EtH+Y~K}l7i^VrK!xF&I^N>Cbry7;9zXpJ7CY;I9!V_*RJK_2AT zV~j7wA=bc>4oF*P=@w|ZefbmASgGB@z~Ay7eD92dEA-0E*88js4839hK?C#w3ZU^r zCWtp->$kW{-hc$GN~B+Iff`cE`f??TF2)JnrCX4S{uuNz=MwNGbT2^$#emk;ftSUA zucl)HU4_YJqYuA*UaJ&z`#i`Yj3DJ&rQe_tsbBi0`54pdCE&18usl}62VwOVFus&x z1&1+cr&|Fiy>vS$fM%&xOXXf;#y-S@CC{;p7`DM#}$rk4`XJM#4TTZI@I z7@(4%YlGdu>v*`p9s|#z=%s@iV6Zh~T99+-nva1k<|-8gyBl)dBPg0)M?pLq-0Suq zgVZr3Pr$3xTa~(Fa?P=6KK`@%{-fH~;(pe?n*J5=g`&S9TCLJO_CZvk+*5 zxEGhMjT1mqWJ@$b+uA#QuXL8)XgyHM-|cz>6ii&DtS^;7a}>1;7(llZgXR#?R^#)x z%7I%jS2|tyfNm$=1JVb+ofyor1l>-&hp`*9_!3mUAv+s%JMkWC*DED<*rnAGBRl*p z;N_{Ht!}p9dvyzqz#;Xr1-u&yWJ+lYs8I*A3UVbe$O)+Z>bnrDY`98IkxjP+83Vm= zn7>sY)T;#91-Y7-6>66RiXtx1f?D{f3xCTm@Q6H5Z!_ek;tPfl2Z9c#?rjF$EZgb2 z;pKF2SZx3`O&9RDw!(OzcEbj6qYQk8&XN~l;^5Q`+DDxLGPjn8fxi`WrEjR0EK(CL;_NSTe==7;cb4y5gztpGpK+(A^_{);OH_-gB=fT zobu#?@>`h}IFw%3z>VZ@0WCBItK@0^!CztskpcIdIiSmqbijJ8AbO$lp&Pn`ctG1@ zpc+7ahx9}lAif57(C)lA;|}gZz2-XZ3SQ^(nsLHw!DiPD0w60v7wUC_b`nE5l^XE7 zs^t*L1zKW2;u+LjYCa+Wx;xVJ$A54cU!d@s1$1CFq9p@577@~t0YzGGvoE+M^8oCm z2QPLm1UDYQi!34S2dcMZx?Q(uyB>jz(t%iz&bPpe2xD;gL!?2e5YehR67V8nCfH%H zRt-oaa>EAHaN_885Ycu8UyCRJZerqYNj-tKq@I9UQuiTw3cNZLVdsN@7jI^u*!cw6 zLeSAe&?X!D=5FwS&H*J*qdCABbeJJ%SQhEvflk*iND*iXDk^Xc1a^ZKu=7CUI3o{~ zN?G(Ep#&WV#F4zA6Ng|O^VGpQz~f>s13}pwoEG6{Y=9f*prfGh4-f4G8x{yL44Tk! z3=g?{0ow>u!~veY0d4+49v=DvTBreb31WH8YawV+gJXE;cPhB+gfJMPAJhqpQwD3t zIy`g$S?h5J3D7wtP;5x!_mQCQTfFhvX5z=5q7>O5jPh>afB5v>~2WS@cMYn?lXh8H0WDgm5 zc%(D*0sl6J4%gfK+gxv>jJf1C)ZW&IUhWD$Ys5yYLz(K8#hu1-oIlR2mc-pt1#gfDyQ-@3;k=$RNckxYT^|g4qdNkV8yG%IT0k)|r48 zVW2(>^uh|14);!O)DAaju)5NZfuZq`s6IILyk>4bz{J0eqv2;vDR-|2BmXwehM!y| zulTod@NYZGzpaN0yuIXP2`lJyt7~AD`uwe+DQB=&m=>^ZCaCV`Fj1{ihvoxJ)~-Ay z1z??8rP@U3(l2FgJ^)&saDegk;qERCQ23oJ5r!G6U&`@X=_TlbhY6qt7#FBZ&(qr^ zk`F4sTr|OH_BA77h6&tN*Ll(A3tFNir^n0CUCYt!F4G+jPE=RA;}yEwAQ#b>@PUR1 zN;!JlKwbaWunhtaK%yn=;3ar)!6%?a%q8le1z^zoh#!DE-1;Dq0EJ#JM$q3~8D3w}Q@feO&=s-_KPV0u_!a%>z}Sr83=ZB_OXKfMm)x zNW0lb1?)kvlX$^S0{29DIt9QE0w1IUtvnupdZ)Dy7(hn}Jm^Mo6LSYs^I=Bo*egZN zuNfzF#w&E*cqtD`-Z+(a-sp`0^|L^G$A55@a5ewXD)D%^4Kxbwdd2c^DPQwzM(~=R zD=!y3@pLmFyN|!61+3!%tYZms@d48R4}QTF1AEB(6dvj)Nt@n{*f^!k1 zP6E}A;1GS8^6&qD{%yYBEl!m1y$lESG+(nr?}-Gh6U11w5-JI*ZJ%m_*7Nany9$7+ zBGAAjc;uhs7=zNw4zRa*zyhE{={j6L^KWzg3|d+e0$OI~|Dv!KbP){yw$RUvml!Yb zZ)f1&en6GM0dy}w38(`P*2)2r?+|!x1J?Y8C7`$24^*gurd1cbhJ=$V2McKH69+`Y zF@~6KS122zc>;Ko>KA_Sd0lY1V+=~&t{mWNoH&qM6QBgF@FK?plz>@49*pHcYB_W} z%X9~W3&}U#&I+KDiy((CKr74%FE@ex{RHe5=)g2+1l{#R^9!ZsAH4kSpzBA${WgP; z{6GI0KY#}FTwgH0u4&E%&!;k!7J;@zIV*HKE4;3OjBeX#ftHLt>2wB9elYa9-U$eP zVF)=K8PuA9y5s>UXLP$h=?wtQ8}zz9fUhHd6Z9hH52!Q%Il0^Q0pz4}kbxju#3pou z4xW0$-|7T8ucgyj0aObkPck*Lps!wn)*)Wvprmk19b9$78(y#=16`fj8~`q|L8tg$ z0Zk$yDtk~oUjYwVU+4@Fc?n*m2--{u?F2%lx*bF;5AnBvuABj_#0RwvE zr#^#9cXp5@SZPlyI1(;^S1eoruUNRy?H~i$v)*~3`3G0MG3bO-F3=J5A!^`M1ezeZ z04o|VfU7Mon8}RYt|0e;%tu&WfBvN`XhZ;X>KA0B337R?7<#cK{Eiag}Tab2yq0NFIE^MAZEN&or-fezLq$BGCATL4bjw zxku#>KWJ0mo6bXxkN)#BFlb(Zu|P|1RY5|{FIX5KG;=U?K4?C`fA9s%!3Qj$-ZI!9 zppAvS%{`DDcISoN3vk$goK*o@Io@3WIWhmv3zo@{ep)E#eEc^opyR*pz>eF$0WPI9 z!CSByJ40_AV^CU2lMvqq{x;MGt5VA9@Uf4#zvd28R)!m z&=s?=`2r!Zi~@MR0G19y!FIv!p}iCE!nF(Heb)=%sfP!Qhrmfh0Tfc;B+?lm0=jd? z^$FruT1Q4u4*G(2Ky~ArH4F?4FIYrCxoCF+X(`CTX{&G4W=nf+Am5rdOJ|)n4ROnrh|F?pK zU+_183KfBuxgeFjV23wCZdNYQ>23sFrrdgZdIRsL3;W*@QZ&XDRolYXiijFzRGJu!$FX8Wr z{{R0!*ty4BOaA`{t;S~Ph9o2K%9h^A;57#)Oc+l!A5!QRYCgo++YJ^vV8VE!`G5lG zE>5sU{??fc3=Gz_OKP}4QBmsI`oGi_vUc0@c&TW&>m2@V4l*qVO1L04fz~Y`I|{U* zXe-F1fEUHEo9ICC_*xWH-ZEq{yof;-Zr%%$WGDe``uJbE;Dww5IN^a!0m%fsxFZP` zd9B-goDr0vT0x-?S#{S7UKIpgNukiq0P6T?^0zXB+OPi^L36k(xW*|pc|ZIQM$_aEkBpCLc8zm#UP3i%|-rJ$Og|P%`X@& zkC#dz!kPbgE65d~aDE9oj05ffP(!lyf2j)OZc{WzYydk#0^*3*_09hoaVWe1R`?z= z8TmR4$uO31xR<_w6`g`AGPJH;Ql|rTN2xM)EfNKwj^}iU7E+U9?GlDkS#X)b1HD5V zRDQ5PZj^i(!wH&*nghx;;1gZJ3ZarqrGLXV^pm2U9yu-y(Q#&9$rV1b$h8ky>b z+K8ftrS(8*J*xE#-C+_)Wk3)|FOLAK3V~kN4WM0G3|WkzBcY~%uOX5_R&%J^^-QM| z3!2ag(BXneUWKTV!0LD&xZ|<7n}3^wtPN+qII{T{__qbfHXmZ_2#|#u$N&j$$hB|` z{H>j!lVHIi3)@Wg7qY$t5|^NU5<}-!&{dkdL3s-$%CbQ-teAn^2|1{@bPYIPzSe@A z;M?5`8t-6)>~iX!3cB2!@euzu#tx?D6u5G9_?gj@-w?O9)@FDJ?E9YH%ps5ym@lp?1rsY8CY0$c+21bxR zLzup9*M{a7j9?Xb^&W$oiI^I1tp#XpSg#(Y zUeFDo;3@+-ib`0Uk2Aei1nDU;!ftGdRP%90gmFk=^mtVgUIX)V=8e-61RujlkDJ&9yyBC2Y;LJ?f=w-L5^It{q?z9hnEu#^fuFj? zN{My1D`@NyYlxR#e=XDPJE7N+vD0+|#6xo-9%2S(Sf~-Q7)CfC4r$pBk+k6|weNPF z06p1Wx74WFbpq3C9cVPdlW3_F#2Rq8fzFuZ0`oyE1(-j0S`U;|zs~Mx573z*puEZW;~0a&OK_zG%>%GCDX`FiT8pBgdoDQkoq0g}MvukX;5d8Ed$M(-r?VcUc?8I#vE{?lLV0>ST|(%QAL{ z^MH-#2nu+S0KTzPpwpe_HRA+p@NLj_ZV)>=Z^Gu8n&0qr-t3)N0X}FyXYL%;0tf zxH(zM1!;eQYAR^;Q6k)WyM!NFMX*CMl1%3hytNUyl4G$vUbCq411wiEbb|c`Dbur& z8`0gM5rYy%G$GKk7f3L?VAllCeV{6k01f$}2_fmZtO3>o=`qwy0Ik)4w4p#L58^&Z z0}Ik7?rsE4LV?b^05c$5&@@XUsNc{l!*rY(6eiHk$;X{Rb9)TOoq0flplyH7BHdd- zCU+Lgbb}iMoz4=SA3y_GwM!W4KpTdkGYQT*kQQX8vr0Gk0`TrO(ClcZv&J!J0|rEr zFXe@(JMO>(I<}}Axo7?SBQpcqFf@2@%I3vd7Erg^Rup`1D{>DS+%E$8ry1lQQ1NyG z>-l!@g~%tmL5Dk@==P8S9Zc&W(QCs9W`IWI{+IIf`W^}F^*s>S>$@i~C_Lar7iihc z5e4w_M99IneBG`GS`UsV$k}nL=GhEpwP(%p}Rvb zfHod>x^Z;79_VlbTOE3#GeF^GEvQ5X9l@&rQv+eT3!h)XHI}_S_6$zod6HY9RLk$oB)l?fetOeGSZ*`8qO=_ z>uq)@0I$t_X$h)6K+aNuom&dx=s<3}IMMB(14@xE+||Ho5i&vnnjitk284?qCkH?& z>Nw>1F;Jk86bqn3x|*S}a0R?O5ae%Yh=I<%bUgq%P#zQ@un+^?ZXDXK54!ETeIGFX1l1t{fiJ*& z%Z~_vZvg-q#MT|g0bZKi4Z0fgN_QyuR*5>)n{8Ua<>?wl28?Tjo?J#MOSd0lU;sH5 z)Q;}9>vrQ{{Ly(3eBo^83CrUpvi#fF`L`WF=~h2}&E9ze6x9d8N^qR+cn6W+VW)kt zf)7&cJp5X$^G9z5BmXvr=EICON+m2dF{R9)xvLYF$4j4d#tC%0oUNcYPFYEG3cP#^o|F_|;BUPNS|th50iOPYu9D>Gb!H5B!EFZ` zn`42_YiU7_PK3`TH6LbzO|tT%82>sRH2MZ+E@}bKt-_@ETLnQS2Yg1D8N`E4dx4y4 z3vv`!sWFOEp)QOm)xbI}YzlE9#J>ID<0L1%TnW0~5ixHIx{f0aWOhucQ}ba)5R0pn z7sVFvWT^dX&{QFcI7n?wsT$M^TqXBkgGQBXxIpt9NYT|?`$WA&y!kLAIF`%wAtO(g zu1`ukUMo#_Ee}l~rIO9H3Jj&foi|>~PI%2b;WgI;_!J!22mDQufB*jn&Bmb*A%ix} zZP8_5U=88pW$1Lh19EVkI(X|6N3RT1x2r&}3FHdb2d}w7vx@IP{_J40jD1l0p*s|G zatKISC=X~N4|Lrls5*SmUCQxtAE=uL53C>H_GRa<4uR(XF(sbO|6}<3L5D0f|JN@G zZ2qs$-`@vHng7-KTX><2{u(fYtAwxlzY^ro?w6S$LqYA+V+>p`W57#(nL#tCpmkEs z?--j8Grk0!PY4NKVOa2%at6P!v<9Uo&~nA@2FTih5)+Uz{ZidtxBsANhQpv^JVBHA z5BQrwV{af?uF|)#gi`YOmdrL<{H>rO)LuRI|6@vRtYaS(3xTZUD&=lI%m{Lc29}xXHz0NVowq=zw1NT@e3FNC z?1Q3d@T6lM`+&d6^56gepd&6hur-ndUQ}o^FtAGSfamHVsfO`F=Rr{XgO2;e=IG}C z>LnV@|JCc0oBwl_us8o#Dv^904smb*#KGXSa*RRYwFAiOde}^{uKfU-b_XwWh$$6D z1Oj*G3CqJpXCS?#2_O!CQ|W)GADWK{AWxxySNES8ZRof7#LV3xuNryPhhRYFNOztLFdeU0H5g&Y8E_sAr9*F zA3?jeDDycp1M1FFbFg!cbAb+0{sL;hyx73b0KIG!v=djmJM=>@xZw#Ny$00}p!@ee zptOCyyyj}o{lEy?vs8J$x%LYKsE7RpvfBr|d=J!Fy8rv%|K=kCpw)f>B8birXx}J% zA$UoJ_8CycEr28kIS4G^#mCcVG8_R}Trc43{TSL97(ng+W)K7AbRBSz2mb^G`D0FA zh8HiQK@<6)C6=xqz`i{M8pZ>+=|G#DwYx*#VDar66yJUT`SuNCbL|@jkZ(VLeft6I z+YfNxe*6XX?T2n0zO{w;3B0!A%ZrnBp`rQ(SExQeiIP$RvN%C|fJH$8`Qo-Uczr0A^feJx7iiKi zi|fVgWUzYBTn^GXaiF07sK&s+I*}a|)I6Q8sQFL;x`qOLvh5Sl;t#A@@!n(f&|dQm z6xufI@X&st%0h*#Xb#SC93T?3(HfK$LwIMoE~hdW0Tk6<fN}%`y|6xx63{4VRo@aE zs3=hciG-)eP;^1l>iYz+dMs(xRfU0p^(hNz`4dNH=#$iLUeIA|oxWcTPxglLbcTND zZpeXTV-ck4;|BQt69LeMsShA4K$jyt{0(Z;pj9bi50T;o6wjdbZ>*(Y`*<+y6F|04 z9BdzGe=0bed;qWd5da-t482hnEX)hKE)BgRTkrtMR`3}+d7nWk;U6<7eQ|&m8o7#e zx;{XvA-kI)-Yn%qq>;6tO0xC|Ly10U9=DVSNzaW-r%(~CafZRj? z*LJC&KmqZU36v$?fa>Q17y`Ae0?qY>*ZyC*VogXz%SRSf{Iw!Z=S%UEZXsq-CBlsZlgRkTn zFI@c5d9XWJq1#yoG#bcw0(3#NvxKGVmpV4kDU{9<-Odu7hq|3*AO}YrkpsC$pz~Pk zw^G&@F>(wHNSZ-ou${#+pjiP1)N>laL#8}0%H%<}fN(MJGJw`oSE_WEa=^BV@`DC- zpi?qTEeA?pf;$!96Idk}DkYoWuz;^|f;2E+90qm$KwASOx?Op|XT!aogeU zQi)y>(Arpr-u8qn1_s6pouIQXw}aTAvoFC6=YJBM`|t?0Qa6y zS{q@(F9JXoe)!A7&|S*W?aKq6zJD#+D>4^UAVPy1w8^tqhN<&JugCw^1Er5TZ>awN z|G$3b_gaC@3rJVaK(YnjTTl+32Qm_LEs_Ly84GBQZwRO;_+QHNB4zp+9;nEG z)F)XQFTx_h#Syfudu;)({dxYEehGW=8FIdHx9b16==>{al463UN!BU^Lw!z~0$yhvpdk>Q5*R5t?0B!X|j!V#?nxKY#*ozF%5b_ZLBJFM^XW#P?}>VBf#41BrvZ-U9N^3qPoM8rY9; zud9RIEb!VNEZhN73JMVcs4(gr03_ZQVDb8c-AG>Fyb5&C*avVU$n^zi@h130cmCEF zfBygPc4N_YebadeIcI>@+BAcXO9$sIt{0O+!G1uytQJx(ypsTp(6{~MVSr_EV^FVP zP8+CpcrD-U3_7B+R1|S*Fh@Y}i$#!@bhmWt?b5rT+}&9FrHYk-q3*~8G)urux=AlU zWslNNQ2EKz?aBcf^n3#Ysh3(q*E@m^@&=!d`R2v#GoY5f0;uwK{i5yq24T>2h(Vyb-1W_CHR#!I zT%hI9Amc#Wi$EokNWcrQjD`;;9NC|`Gp_)6dB_JmRfODuoz>6o45*BiRL(2ikwLUtfx6niK zg|#>X1MBVYJPf-N85kH|8}Q3!80BPn$s0R%q{8eah}fB2jBnyPhAM^GrA(3MkWF} zjcgkzf4)fn22L%Y1%RM)%0xjj`@u54s4`+8nG;|cV^kS&kjzD}j3laz1W4vSSmys% z6ni8=G9SS*Pf=xLKr(;9GN(~xWI-}KMW7X*8&PHCKr%{Tndzu9@*o*AuuLtgi~>l; z8!VFykwIj_Qaf;X^frfpDt>vaez$$P9?;fESOpfl5=*S#}Knw}R5c|E-|p@nRmhm;hZX0aH065i*}V6=VV9 zg)oTnfd5-T{1>v#AQuZ9KX7N05JxxY?udZi=5@$6Rp7A61j8mhyf$ra0^8Kx3~CKQ zd~^`m9swNooH-5F2kJ$ELn`3Ku>^cR@`l>e3JyO9k=~9R(C|5g8^F^IVK@kMw=_F| zs@OL?fuI{#uOhppWh*Fj6~M(Wa_Bl>xWx*uTlP1C-43;r14;+5KpEiUG{LsNMYf#{ zhwX<>flWgSi9PZ7Lc$SZJ5mNn1Xtml#ee<>z>>$zEg-LACZtdd%lz?Lb_KGR1D;19 zR*528rH8|+S0~Z^^&}3TzcL|KO+dMpSn(Wa!XA06VR&%!8-o`wAArix%8!sT6tv6* zw6h`h@WiD0jNvfNr}C0*!n=Jp>94 z1@IY`H$V$D`xzM+UW<2!J^@|P0ZOnhz(*Ut01s6__FsQxO*S#0)dWwVt6jND z*_vISFuk^iN^+ITb-TU*Z=-v0jDZW84e}2@TllvzfRdjac)#Zh&@Nc;xIJi~1k8Yp zrJ+vIb-RA(oorS7=RfE$p%0+r{Xc+@4T4P2@dUhh9|aAG51mfn(`Z2#e<^^EfdrAA z0iZKdK#_0^q7W3+AHdfEd^qkP0_jS8IPRbV8c*nU{czkt2h4(=Vf3LBbfN2qV-5xk zuoIQ;fDUrGBLF&X6|_N(vGgN2P9D5Sg;)Sy{q(=|4){R32QLI6RVBo4pv6dFuc8kC z&pZh!hvMPQIdFd==?I*oizQBX(3p}X4pasn;262^ z;&KGo!^D;V4>d1#o}xx6_Xb?bUHD)6=0(D3Xx4uNx*E{+1!(P$2{bEV&1ZOWDLDU> z9_n@l=N;EK;K>nC`2eX!5LJ&Xcx(!Eqjzs}Fu3+^C}|^AP5j$h zV5iSMhq$@r0O+U z2XKo0086oNUc3wgD+HxjiZVC&F7F2dptD0jDOL!YV&A;zfLPES`UaF@AAmFWn-?D7 zBbm_?EJ_Pw|54Pb9q@>^&Wny4pd>8u5;WW^!cfW&YMwRcfa7W}XwKbL1QOfOqu2|; z6&q+219XzrR>=7covxq*7QiFlA}6qZ5Vo>9t`2b|BQy}2Q>J!jJ`vfK^67b?1svu9m3!^x2qUv;g06y|02z+4A ze{e!^5y-I7FL7wD1zll_Cawp%80P_~lzlA-mSXG-eb62Hm#5F+yFJ3|1(t4m&ySv#U19W@?=r$dWPA~@?08d_o{sNC%fSVOB z^+5?Abf}69iVb=Y2XwnWIp!je!2q^N0PGu%ZdZ`+L36%=VX!lig&?PswH_#OdXZ)c zT7lC1gQ-OBMHG}R0y^vjqzxRrj(5S~19i@^pGeMG0G_XWzyP{?>It}^(|iE#;WW?) z322@6lWx#%@zO9bUj%efjq8O@(8A#-prz6d0^PnB3=ejm>-N23c(L<*=MT;gtp`dq zaEFL9k`rEoPFn!&5Cu0kp!uxrI#07V^D@P}o^P0Q6*&%}gG+)pufW>7Xg|6V`PN3w+6YxSl7@BOqbT^xbF))B; zoH#+FRA64W>j%&&MqHpO1#~OG>!YB9HelZ1=>*#as$5alc?i7VWMyDrUHKGLVeo(# z4gCP6KgfW6XXqF35mul1_kqp|Q7I{J{-MI(-v;v94}}uG<{t|6HLV9qSet)vmKJxr zegW0uu76%jg4YIccZdD}kK`R=h-r5H!3ers1AO+!pJLu_*FVkRT|PE3C6^j%KQn+X zJpS?87punC5@2CIsCkD#hmUkHfsF*^0xaSaURwYE{~vW3n8B5Q{~Het7fzH2-j|bM0;h@tc1z)>(Bo^MIr#i?o4e$Br{7 z#BeEeH-mW12Ut46jN@R{poUX(Esp|d?-_Ih#+P0Z28de53!r;8ng!YzK;wK?pkPKw zH6JiyJkSZ2>;{vahak2>CK9VbCEXE$POwA3HfVNtgB=C79n|oIxb6h#xCXFWz^x*X z7a-9GIkh}irMPXgf`${QM#Hr27y|=Z zx&yCfSa1mx9|n&>DG#)o0l5n~SwW0}0Wk#tT0l3q7`%Y))e>;`8oCw`eRaW;fEOzv z3J{vXs|z;Ufr}W>IFsUww#f_(pZVo}hju;%oi@hK#K6G1{1FcWsHSOH1g>d<|Ns9F zRRW&f`+O1P*ycw(3@?MT_0vPBqYr^>dNJ=G+|eL^ zfeLok^Drg%z)GqSO2Bqw8>O9(|96I{RZyjXDo6qFVZ!ST+&-j%2Gc=H>c@D~f-LbOBX$xT4o zKXm>Ats2Q<2zbGC2wd@Ye!y1thJuZJ`T!gnppg6G3oR-k z<;Cp-U}Hhk8K82pn?>btw}{H&ZWEQm-8L$)0pxJd2(k`n1R2y{Z9H84fQJE=TtWAf zw!ZidIp(3aRpbX~s1Y<2*xS0~Cx{IiHaiX;X#-sye7yAvRPAx__%o=mJ$@j=O_&2x zR3AT30%rdMbp^p=n9VPkI$JM*#xA#ljA{n6nYw#HLY-iee>>RFv`)ruusy7xIbKka z1J=)Y!SWz~(_c{O1|F*GZ2bc=3@q2#%JAd=f9+n7dpl2D1Z@QFY-RcJ|9|6N&>$+m zIs-!;qyZ*V4H{5pmS$kMxD+G>Q6KfxQ3Vkl9cZiffxji&t4NIh|fS$^~lkFyod{Ys_x6PJg~bR!3l+bdy8{I`Jey% z`+qe4XK48UpT7lk);A>Sbu%>o_*csN;vGK&!|_9)#MsFMlW9FrFL4~6*dd~jWcykl z!s}+RMosK^>(7C4c_&?>q3Cb%!=+y9d~SZZOICqw{#{fBp{8u`Z4OL3gk6 z_fG(A3E19Jy`b{X{~4BGWu^7}+gqv?D!@)|{a+~nbM`ha28QqVUst#O=Wkid#lX<~ z-?tRnFSyAKszE^R2QTR6fjHui3|&cN_e zixcDv_#txO8=IO@AfWLDOs8lNwXJB}_39PO40RNN&pz{a7CLRZ?1PwyITmY6vx2p>*`uzf$ zT`!A3;$bY^Y@i|kpnw;PTELElC_^&Ui-UpTc=MbN2GBeW!%J(>)e>$$x;c8?K-U<9 zNQS^H#-M-~i6{nub%62`l2QNJL1)zezzFA;&%hGk2ykOjyZ{Xiu+Lf#l!W!VfdTX`p0q&VW;xil^pFhrlgXlOLr~wHwJAkDdi+hbh zQViXEAm@PN2&-dWvoSEdm@Ue{@bV!WC|EvpgB{a(u=4_B5c?yxD ztp_RS0REr~9pF~kJ6>HXC$^tq73{-}IN&-+IK|`|jK#3HH3$b7xLi5WasIlNw zXL*Q!8j@TXamLL>(xQxJ++-vro&3!Xt*1-jWdaVq)++O+ES161XKBm4rS zr~!5CKt;~WTcAAwlR?a0H^>!Y;L;wPPr!u|RJeo}w8pQ59bAjOh8_+8PIO2mZZDE$ zpp=7dSuTcUAXNu2EGuOr!ZHOU%Rp{Mw~PTS{{ZZBkTn;;l?SXk(>#P05Enu1VQ4^H zfNMf=8(6r69ULOBnY!6vvG)R0#UM)Nmu=unuo2A(a4>a(>v-^~SIA8bWI5111l`R` zz%@aMGQ@r01Ft}Z3aH-`(A%63t{Q$p=8lhpb)!{#93b1_5-)#(#%A8|WC^?w{RFO0 zpso)4&<$49Ez~IhVf9XKt^V^LG-U*qIPL&4i2)+l+4|%A|NpP~y1_K)fDRD9c`t}$ zDB*z#w;m|H3+hq}yjbxOY+3hIkcv(wn1XIGkZmBbZie2;?J)Zw0#F-YdqRvzg%|;I z?+=Jex`jFeSbD=?ydW0Pbr@g=gUo)7x-+*M*4+AjgYg)I!+7BP4MuR6sTIsM(w2}V;d@l${6w=6r^e;i@g1mM^Y+eQpYIK9c!y4Rg zg6UobN;mH~n%9E58cYxskZvdcb_S?t5I#idJ(MhLKF-+szhW+=1z$fE6q2BjNdp}( z-wxt|LWF<+kJkT{!my@${{R2~zu$kk_sjqPpw@dbsB`|`w-mbaUJgqW9oi)S{o((A zl%oa8*MepUF}GpcyfFRn|9|7Lvlmc$>)rcSbbuC1o&jeh*DK&_GJQEZeJ?=IwK(ny z>Zmh7&k%;>-s27|pt_HL8@r7`sortdE1(lrntw9YDfPO8PC>A#DB*&#B1-w1k24*2 zy#iV>(42dLsoVF;4v=P8!^`!+%a@={*U$qL`1jpt{;glf+x*+Io}>A-!OL0T0r@Ke zr9#cW6F}l=Ao1{*O-SMnAaOU4xH-6tY5tv4!rJ`Xr&JelnF6>1IAG~|2hxRav#9}f z;T=E+`ncXkm7ptaACDVMf5uyR3gHwsj^K?lNL-U6kR-+Cn? z&A(Gi_?v&bmT)!yE&v%50M%Io)_I+afuXw%6xN+TL1%L`AJ9PQc;i}aK()EX2N2u4 zr-9r6TBgzbiZLLlw`~i^dH+ivbbfyEW&(IL5j+p^;Dsuv2bp^Te7>;jh1LTl0_FoNzd&ERXTGg2oEFUAI6MO@I#dVuv#K9k4va-wN7v(hWAY`2bTVn9=RdV#^9T ziJ%oU7O(@Hk6th~A27j{WTJS->}AwhB6bq}aJc--{>s04ZK0+$9USK@Eo%?#S_1~Lt9EUK25Y@qh6>mEp9 zcK~!4E!+%<6|hJw$%9I~VC;0g0bzsZ6hNkfqw_=aznD^S@Z`aPUa-3ZUTgy`+Bzce z`h4?0^%ADnCniABTDR|(P7a6}+O9V`4?#pb16X#jfNn`l2esKcK+&iy#QJY#Q+Lda8_?#0!ouFF75+o^w;67{~<*{^AWK4PN=xO zb?u2d@$T9apxKP(yI{GwP&wu1|BNMaNb46N;}3tpil!a_8{AyGhXHbbU*`}0^{z)c z!RxiM{$~mHHp|z6YLGZcYqa%1saUt`mF5?W-K8M^{OkMxK3lI;We4aqMs3$CyFh8S z^Wf!Iofo=8wciTHr=&bIxQefXg$0GbRx}5MNt0&UIc9h zl{?^63C{|hA6|mSy+OGLED0KCYCTX=1&K`1aZ;%2A>tU3jFIRMf@)$&qF2I|=`cJHxSbiYTc!D*K7U_7s8aoB37K1k<;c>S{h%Ds`GXl+;2!97eE?a4 z51tr@tb?#?u6>|aV$odtKo@kBLGd>my!*Zxsx_ z(EQ7Tzx_HR1H-{bOx;tMzBK&#&v?l0|Dzr33=9k}4=^$?>;M&VFSmhuY=^*OxQDO5yS#DRl!%<@8AW==7PjHL9ApD ziyOp>1hGJ4+%Nq>JzQ4~P?rLH5uN~~BC-G-QdN8b9H+0Xx;kw%9G9y zFF}(P;Dd(2mL7L~0x}h199lT**KvWG!K}@%4PKjoTEAS)ztiejn_q{&R&D<60FreB zam`86VQ|HZI6RzW~Pe9q|buXwyY*^6% zD#NTm|J#v7LG?8cm*`T=-tnoN_R0ZT=&=w@d-e!gl28MtalT+ZcxnNV8AOHW) zs(gfpp?d;oaHjQAslstY5&@V06J(koDTEo~B$UN}FPuOIJUR?oeZnJO2JJoqmI9k50NU((@ba(D z3$MX^&;TFU^jDo1;HHCDXdc)E3YdVyJPe(&pv!2WtqoV6PVkrqD3qarVU`RDjOHT( ztp`e=Zm)b%|LFh!)&nKZ-LYRVjv8G63X2SL7RXVf9v~j*sL=orBjCl+7Eq%Nx+QW( zF=&m=m+mG|F#&2eaY35dP4%F7>b(4-emgj(Ky$ziph=f*&`dC>pB&ox6zr348$mv4 zI|SPQ2HtZD-3HfO`+=cU8+1iGLvQmwkZGW~XD3kE0NQ2z1>CLp@ZhtIiw03Q*+2UT_O3V8Y(w0sB2e(;>R&WnPF|Nl20XE_9(Gw*c0f;9OIUJ3D_ zJN61VhrI@Er3vo*{o<1zct)}F6XS)>W8kG+ETFYy5}@69y>8$M@y_2bbk2b-?K}=K zrSo5R?3LGwXh&G_Z)0vbQ2GkhkXOgp7(i9RlT>5Sm^4EP>x=huF$&kP;1@eLfCA6+ zAjs)FurtWFoQ2qX473*=e2NT5*o%5Ku#-XC!9N@W-@~1Xy!`;YzBLRa< z;)~&dZdcHSxE-#~k3;SNYN&ngP{P+x`&^|2bf?Kn&^gf1t;3+joZu~cpiRlHSHR~< zw;TYiP0LV7b-BvGN)I#K8nnBAH->`u0 zvA^=a^u-HJh~rRh|Jywqbqy%EFl<`~N-|>mL2J7~?gy=?d7%g~yL&Q3ge3s9P5;Gh zDe&I-)&r$Apz{$*%DP=a*IU`Bfc8Ovt>)=%J_5>`FIGX$Ug>n@fn-3isi(EU-UTnW z24~~|&{o`fm{JaCxN*EFhd92|m809015}DQlstv9R6v_eP%fF#|Pj>T=lXM8S;}!;}1rI^6_1<3u|BBs#-nn(K0S z>LkF8j-8;Y6eMfV8E4YzXVDpE(;dh09kh3vgTLi50|SHMNq)u)orjtqu{Hl<<8S#5 zDh}&%c=-E{F)%QI%>Wq>YDIy%{>_K$n;#$OjH~IK2ilVS&CP&`zXh}$pw~r(rPD-Z zKNDzVVT}st;Qiw+DmOhR^{K>zl(`7G1^M9ri>28<3f0$kN{b_#4 zRKnJLz`psxfliiv&Hv>~)SHhp?f`9w=U@Dz=-6==&{!^L#Q;;uGnl4MmVK|UbepJj zx2S;TqnTS&KyE4#Xg*Ni=$F92;J^Sf&aI~L2q<2n? zfCd%7mYrg0KFI?*U{iqK^6*%mcZxJ51)=Ar1(aiGiWv5!6wj)4ReXz8!-)pM!y6B?E&3#1zmKSl7bZ^xj9H83zVJagc00UZtp4gf}mmuLU}{|{y>FuW874X$ia12v#}%fPGl zUWDKJ|DW~yE*=JOCgu|VUF$|l^LM)<+6dLlj-=OjSK;v0vrmA42{1XOG`5NTU}W}k(cb~>%!k^31a_B%`3^|Z*~6n|9`KK zib`*YiUg>W)X?jq0&eujsAvSgcm_GBtn&x|qR!*C3=9knWx=32pn-o8C}F`OOrbMQ zrPEKNGfb!PKO0Dq9;h&H02S5_opCOmejc4+K8>JdG7TldpspxbDxfniq|+~=Gb{$2 zU?Hi*DPaX;3Ewv-EyfZKUIqphhEAu1<{A|dQT~>-EDQ|bL!e(S`}_ZYZ`&GBD1Q#< zZTsBx=YIxhNH3tbO#|%nd!QMB7!{ruQ&~Z)n2vY~b96JLE(VPbbvHNs{r|t4!QepZ zVo=I&-VMs94E!yI(2#E4@dR{rRtYC4NxooV|MeZ@yzU0DHV2l}#h`rByhmjUC}osL zgoD-@{okSj+C9)6qayQyDGS`r0mnWh%l$X_zeNQ!pbVv6{NE2s1p>``z@iK#5@Aq7 zK-CY}kiD5;LqIkkKd@k}5GdpGx0Znh_V%cN(l$ehYEZX}iU4*S{!dW>8P$A5ATSVQ z^b6a`%nZ@JE-F4CXUV*<3q$Jnlm?_O1eLp;E-Epp3u{0N~gJyuP*zRF50p?u8VsofpnF zy#CegqT&Eb?Lwfa0hbG)DC=Ze!OY+C@6Z4LkaD8iNkSFmpl?oc0{pEpObiU*HbLtF z=u~3!38v12kW9p6z`y{?K&1lUAUp&%?!@;CicDbs0T932f#u)}=H>_N%|Dp=Tc-c{ z{~w~4*#Oj(INR{D<B9exbXCWk;`olLg>8JQXQ`=^5%bg-N%2u`nYGK`=+uYf%l zCP2oC?fyTvJjCDj z{onupFQ0+h@30_f0S7^}G$XjSXgsw6G(-<}N@rk7^AGzH=W>(gA2$4uTTVb_A=u8w z1d;#W|NnmpzN*wkg{S$H!*Q@gXF$qJUC^ZN3)ki!jAdtEDu6gODl*Lc?V|tx|9`z3 z>~OFR-yFFGN@jy1jX|Nj$0!#l5sbsh_T!Mq66c%Qrp)Oat+Vhnh}R01h1e*7=t zXg-n?4Ql%xKk(rH|Np7Y7M!JT8vlb@Po&5v3@8>3jV7{UWyJTC@owLDg8 z(fo!5)UFK(%VK`9Ar&m#dZ1Jhl(khEJ}@xYGAJ-GlnNT>s3>sfsHl`oh33yMumA34 z2Mydc-)Q;s|MgO+@C48(Me`e;U5pG&42B0@*#7_je;3FdJ3zVng&v#>YD705;dv?Z z|NnnPcOwm~KQ#P>;6>2z!qSaA44?ylY>ppD*dxTzt#SMSsIk)x%2_Q;OrYh!pw>*c z(7{KnjE5{Q6p6fi19DS|8bk8|1yD;F)A|OKX)GEU;nwc zMeYD-i05~}i$f*MpaMTdNKF(;zz`&q*t20DJ1QdkeG7Z#%xZHYx z-}MH6%U)1%0Fq=;>2(qKZ+PkZXa4nvI}de!(7e!jnHki>2vLz~e#6q~qaxEe*8}9T z-<^&E#~nd+62t!z6`ubkDk1?dLPVJvx_wkMm`hYddSg@!I?Z|=IXcTYI^9@~A8^X9ABUj*bU06EJs0$ zH2PkEGJiLZ%JEhoCQwtJfuTD@MW%E8fer?S&Q=phy~xqo3+e%N`>2R?wpxJVN^Q+d(3r`Lj+ANXU2ls0j4BFoF6-tl+Q($H(yl z4Ionljvr_N(HzGQtO4l;o78;72AtY^OVk*;w}WC2bluPI=41BF&kppqF|dNhGnI>( z86Z((c-!z2q~8UJo=#9p=7>P&hvP0P0w9+hX94dh2X*E^)zWbn70{?SD2%{?{xTKR z7J^hu6S_lGL=ZYbk@nKn{Q7tuD8I^d*Ql6u=cripHg9#O@-Zm?zi>bM|3B;VwLA>a@`#xg z6s~aj(D1O}7shiz;d6K`D13B4^?Y}Yic5EiNzaU3*A&j1P_=-8r*ij3ib z*0&{m;I<3ni^jh{zc(Kd=6i|AyI?Y1Nd;a}Dekj9Qn4|MUI}Tc##B7#^CsCKmGqd ztNI#H{DE|&LgNpVV8HU}AbEDM{0mThgD&q5l7GG$q#x8~#?Y@0l0Uwhhavd*p$q^2 z|37{hY)!XNw@|m2O5;ILE>G>`?)K6+ei&py<3Z3`%G6Ho;|D?JbvqfbLIfD2!HEi# z@E{nRo}1r@{4Y@fpY4+cDl&Ecm#FBxxWo%;I_scm2n~O+^c1MBv0Tl=5Y~AuxbtxH z8<}oq&|cxtdP7j-b0KKF=m#Tz>r_zT?aa~n>BX`Cposv;a;DCs%|~Q9UqplI-?RzM zKbT9CyTOVUA}Q*QY32bNTDlq{*#g>4<;~K0wD~80NmlbuzLL^zXP(Yaojxi&FVaDh zJ}Nw&hnrtAH~-|~Z|Cg!_n&!Bzd`Gt|91bM_m(j%ag1!My1p-g6jl5{P&6-~a!bM_*q0_y0fR z(U+%Ta+5)Fdttn3Al`b=T@)`s6=Ubsmx~abqc5la`~RPR{fn2NTMfbXOa-a02kCzM zvI0~_m#BfqW5UCNyGv9=UR;;~$^{84c|Z+Ff$lJY)=MSvyj=8)7oF%&*5?(a@{r}(EEu~niyF^8y^JwP}#($uAeaqPV z_kW2zXl{-n;Kkbxu+y3kFj{^ndJGz-_yJC6oyT8)0vQiZ?=P+&|No!0d<73fXy;S# z5L8ZgDNm>Cfo@lh&eAE}r2?I<3pz`8beBqWmQG0R76nynouN+*FLej7v|i%x69-l0 zt_!*gI6%cH=>C;%H<9i-gHG2ipp}rI;fL; zU8iGs3Dm|p{QZ09jn0d`;r}`>gW|8-&7{+HPq&*vr|X8!AI*mtH7|6!uIRj=`J>Zy z$?GIYebVhF(Ok#F&@1z!o0-3*47A4Tgr)16a^r5cPS+#d&Mf>Vn%{6RyB_I|JFQ!7mrQ3H-cjydI8ZHIpP1hy8GJ=dJEPYq-yC3d6*zLNZJ9baEO-JkP z&L8|I_+5X1eA5NW&hHs5Yqyj)b-Sr_{??A&(#vwAJ9dqwMA;rtY!|R}#~uJ#6gsEV z_s9!Pm|aJ@L+7*}D4o&mrqTIJJ9JAg%LUNFYlhCyBb}}rx_w1jPx7})gB>!VyL3aR z!E24wg`l}|P?upXXrY$tf#ww-x)>N3p(!M70(6BZ;<`HiRyVN9Bd~3y&~WnIVtA>y zjKT6^*_m#(UK_#gIG&5|K|$mu(e3hsrS*0R6G~9+fdtit7g_D#B-9>fL0z<9K>mesl|f)@t77Z!u(MVBkN&?0SU%RHy5aUMI#**9|Z4 zLGx#~>l9FQodu;h2aZnH9UvZPNWDAu0Ay64^*{-DgQuHAz>9fb!Bu>>pG{}&n$GjD zwI_7DSv0?A1iNZSuS|U}%M4Il8FaetdC}Mg_9)1}V@wPTt^Z3eb-Nzuu3ZB$x6^eE z=$bjuEU%kGckF?H7YwR@W1^SpT93U?9cI>gp*py|66-JvtOOP6%l&S^ft(|U=& zBjDeD=wd|D_8+S}%YHU=_fv5i3^Eb}#;xyP(|ghNE|K zb}M){d(3r+@rOXc2pXknKEwfPIyINHg04mB3|;X;6XL6051GzKou?ZgGJN>|U-MM+ z;}4w|yF*u4o+%M(d;=P3Z|+g~!_UCLV0otWUE|~b{0t15cUo_kur~Y1`~i(>@Hf8! zWwhpp9|D2`JAGHYn83-*(CxdT`3O&M=#66x4F5}a1O|a@boXar=yu)H9SV}mVr)LZ z(iyrWAn2Iu1I8EKYnd6kLzjSJLqz38Y!FE03P?k$RS`59;JW9y1Gqik>}JE*?YpM+ zWC?hY88i`Ce}*J6*FDV@EdTji96*CQ4jdrwPXQfo0BX9`gHkICIH`gfrM(3#-3*3AC!MUDQ&`&E(V6yOC>4Y4G+2)7&={dbc185RRJ`7<$B=w0Z?NnwVR=v zq1z#*({;y7c2I5t&l@p=*0sSh3uvSqnyx_R!cs7(7y*rHyz~cE*s%vdNx3-&6fZAa z{lVF@^*{+{g9QVBs}{(`t_P4Da^QFa$a$b{_{-G)|Np0Ui-L=$OZ=^%YdJbEbeA3g zcUSp0P6HKDpjCmT2MkYk)~@J054xtZ?M)X0L-)29U7%}!SUO#=^t#^YbluYHdZp8K z&Fg5Gdt(oPZr6Upk@@`tKLbPeo zZ6IH~=-CW5q`UOMad3cvIzGqSKz4vwi0a@F$aU*L0nK>a^#~}(zWf2YWHxq9>uqrQ zY(54mq{3dz{s2y&Fh!StqD0**(6apt-M+A>n+P%ylvM&aKm`bB;XcC7PvEKvRt14n zIdHs`hI%9RK&R`PfEPZz%nYFAh9WAU5@X&Puy4S{bcslJ=$>xhHK2V!fdMZrvw#9y z0F*vMcXUnwCHR-q;ARE9NQP=X^wJ14#8tZjtnx}P4|tZdy8#@%zDK%!_jF#?Jlq+& zquZ0CH~3GdKqt%2?%D(0(?MaTd8_ks^P@k_kC~ZccXWbk-LH=fZ znFPwb&~*F(nvnTh3?bPMlwBG?>H=P{K`w52DGqY*0Y?57Ur=<^u3vQ*RwFblmbbW9xy!6-UjkR^9xWS1tnnqz97&cw(~%u2%i~#L-CtF=rjjV zu?wz=URHtfU+4jZa!A0SXvqZSEBtCet}Z>&?ZDB^V(_x^7o^w)w|^n6-WLyh{{3$} zTsW79q45o9Dg?AltQOSt1uYP(ozUsJ0)7q86T_3x+k8Rgd;@5rvQ~zNzx^DjDz24b z<8L_v8uSH^rXB~a5@6_bZAk?kV&2jEtpv1;tGD?M&I$JA19M>ZOFT~QpnX%Kg2iDe^ z0&D9)jS7Jn)$Q8TdZ0x3_@ONxpsBBJE=vy{{uc0t)dL&ALY=M~KyG&ixxIEl=dstK zpz3V`e}@)G#0=CyumFY98;)K#o`CQd+_lg)PU)R)HuJeQ{xQ%lJeEgIT%OB7LG=K9Oj?U06%@00= z1$4U3d68TF@Bc1+P@C%rPgH;9I``mo5l+F@XWpl-Y8eK`%F-p;JWV#eQ~} zGnx;`P~?gSA3#-gb2}(FTxUS04m({N(kAe4W3sX0Z)s&>0H5~>+Cbawx@EsJ0|P@^ zr$x8xmIe#wQm%#yMh5;C2T=V{x~02z#!fa+y&byd^D_SF2V_7xTa+0=F}vY^>74(i zTmF|Wd0_-fC7=t2*R&q!JYF&lRQ#462m>9Bzv6%ChJY82A3>`e6}m&$fKmqN^nB<@ z*$q(mfYxvAd11STk)hkS2h^TB$=@;^oG5zWsaL2ofCp3nR|s?#h=32jZ0YvxNbTh4 zb`=3Nmb^gfeW$dZlug^f--`)HKG`HZo;APbB|No(? zLE{&-BHaZdpoS9YBGhhB;GwvW2gQB=o};?&Wj3fpDp6yYaNKnRsJ`fJo&ZjAOI})o z8p>r1P=V47ovuq>s)NKJgVBcHUh4n<|9?XBA;y;(pjI(NctW@D7ErK(#5)+94>Iy^ zV`@22!eV1p`nKD(;TR)Bw*ja~3I#bqgrLxh)14be-T{7I=x|875zraB=0(dNCa5;hppWa8=7WrZphBY4 zcf*T_-%JeMz8jc*w?shg3Iqu+Ec^GrJ9G_bXWJ2hZr=@^Ox>BQ6RdZ5!uqV;5n1SoTYYYK2-ss8Ne_wLXw;OTpo|64(I&i}2T z$|eX@SY|>`2?y;N0(a+2q!HSEHw3(R@$~2SZr=?M6IxG}a99fRwGtJlJy{|PT5ANoE{?zT zC#Xa?;sYNa?sf&4bq6%l+#4(KTDY6J8`Rk>J=N{Z(tMbu^+3r1@St4%v*tG(VF54B zfb|Q!z7EZzpmBy06_L;vo1qe2ko*kZEYmN?0Gcq-02M0-N{k>GV<2d2wO^I0ib8gNiIaaDRxU+ebwKG$)}D@Z#qW@CsH?uOAc~;Q0|WBK(Dk zI@l_k<|B~t1a{CcK4`oEbmu&BP~Covh=KPE@EBnHU!o%LzeL62e~F3*5_SR2eFcCf zUL0O5kcY+tXet%no`FPc3&hygwgu{nIa;Qm{|I zxv0o6^0y>IRu}v)QE_?k1S0d&A3iPxikCyZr2?g1jh?x3f2%*r5q7>eFdZ*9xtF>GR;Q>UgmQbn7(P7#P5fY5t9q zUAh?9QsH+yt5Fm(H~^tv&2HiOup(Mb_dBaZ#JJGfK#wakD2XY6lNf)i8pymB$RejHDxghBpxIT>A{QP|_5VYk zzl|Bhc*Bv!5SGQ1#R!@gyAcL9LjyE(0!cmBKqD=nJenKC%+Os5Y7;m9yC=jlm4E7i z&O?p=rm_g#E8zegNY2B?0GgN;0F7gGgs6ZDuB?m~-{ykjnSWb|ibU&y&ZGP-ETG-3 zJ}Ls8?i}4NDjdgMLA@@9PG3+$7wL3m=yqV~^yT2+cB<1yMWWM}2WnjlXpbcS3EThw z85#K7?|??vLR2{Tw;$;C;^05o=_}Ih#lwG+@nWa1M7Ng!geBAMCBlCal(Ra0b(()N z@wZKa>g)EB04eDXQIY8MQ8DTCHRudA0cE;tAO)a#P6rkK6P+$9pn1oZgCIfB(ga5t zu%Jx0qXPd4W)~IE09>bwib56(XvXeEgJ}L!piu|V;>d;?f&UErt)?st4E);!8h!{?Y$Beg%=^S!I35bjWp1z zZ&3XLTCM|LQc$BJ)A_yg9Y|y6)#f)Wp<&@K1Oh?DC8%N9x0Hc_f$^B;(b6ZNao&I3 zH7XimFC6^A3tK^Eb{jwwFe1P3x7_*j|9{H?{+26{suxshy?C>LkpWUPfNJ-5jK|$U z#SKFzxU^{fRw{kG8C1T2S`4rfrZl>FHK<%+?1q#<@Vf0AHv>cC5m2cGX>x+veV~Re zAE*pYZMI^!YKP*#5eq^FwSPiLqEh~Mce!W<;f87c$fbbE;)<;eC>P*dGUMdG+C=preGPG6JO z10}(Rpn;Qs7dPfJg4WW2%e0gHt(>5m^$mEP&5OPB!39h68=lY?8$rsz;RG!>AtCs3 zC#VX6G*?0MIiSU)497ti0E5o-&;W%bWI_0GR|_!5)dobhUMdj;Rk5xPph9=+9at^d z>!MPFG{0XQX3Mndez^-HI4NVE^4NV9Nc%h}ufD)!JHIdx|jq7)eFNMJK zIfjst!Vl28g1_Y)Xelpf4=^ay175uG0ekr6_Meae7D&A&15P^vke>WY&@3^uIWnOe zRA2>4FrMlLm7^glCY_-M;Lzo7`3M@Df)sMFA`UbQ1S*cZJ!HBa6hLd7Udn*FA7!92 z9khOy;bj|y-wi6KYE&E``A6r4$vm*T3=h2YM0gK0U;2gvw2}hszJfs1)b&#S@Bjah zHXNuJAvn96_=OqL5TolAE>bn4L5M-6PdpmlmMare!2PY z|No#U1V!LWE0BzohQnJ($0>2h8FK;cspF0kS=S6I^@cf)3n7uD#efp|uyt5e*ewM*OXTV6EH? z{H^X_tx$(&f$BL(?G*rWUOs<|CEVel`{zKl7bi$2g1>bZ56I#0+Up-^oVSdj;g=hK z>v9HA`+(JvAAI&{Lj_wff9t*PARn-Y@I#KC+7`e8cI_7~aQh6Lm%(*y7Z=pE(jZ0! zrxAbaVz5>&2L9HW-$5RQy7n!|Ul7+`=7a?E9!^*=F9wNJ@VE4U=m`GSkK8D(4FI_o zlpY#>`SQ1lgZ4gDfZS^Vwu&u+zf}*+VrSrQ1s$2lzYS_>3#bJEu{4VfVreiN%u*|m zNCkh3GKh}gZ_Nc;3Xj{{-#|gY%D~?$1}Y(7Mm_=YaN&cYLJwCLkc8gR(M*J1R0gj-{K8w-ho;@twtb` z3jUUTAUcA-bsZN|+F( zn$O?z3bX(gY~KcuNCkh(Ob{Kx-|B&C-|nyf|HB%5FV}%?*n7j%>7wFt@Bs@mXv@J1 z`$^zNkwfP}XtO9AbQY~EXi=TTaTgUINP)`SnWK^cDnJ+ycGjrmbbe<%(dnZS)9nK; zVkH<4g7SQ)k4g%t9O!gWk?CdW=yXv@F#HB8tXjYEySS*xbPF{8hm^YUptu5;=FL^$ zA{JD@rhsbIe~kRCfsnG;r`t!x;JAwlXn82846^~9n0t`fMJ1-wMweDTIT~tCkT~q=^#x! zqvF!(!O~o#;=st?Vg*`1>!Jc0Xk~y{P&yxGfeXk29~BL7{ba~^jF}A-mN286>o`ES zs+KJ82HBINlG1#PrL#uGqw{-b2Fq)+=70bBTR@YAps<3JxZOM(0zti!7m*)91usuP zw~vZW=dr+0#;-5Fy#NUbG}fqifC8_bLDWcjlR|5`boBt(0SYF&zVqh@5)OoDiMa87MLZ|b?_wT*= z|2jW(UNpS){VOPq^|Ev{9}(!*=q+MweOsc|`JwZ#<`2!UoyXHA^okhvvRGQ4<##{S z2}-CEy(}Hw09qbTxSC2%1lHQSo5}HJn}^0)-+df4t}hrGXrk z6m3VAPR5s0L2Vr$6&Z{)1WM8YFSmoFL74^AsKZRd5Jl#oiN&dL;I4-YsK4^^^2h)G zdz+_i`~&It907B0Y=d&Qg1L{5K)K64A{7cV!E(!9KzmGG$a1wG|ATt85GxA63gLz% zg1Kv9m2420yA#HB26N$xO^^*z2g|`7CjsWd9l#0Z!exJb0C^0~eGTTq&Asyh$${s= zatC2fH~{8ugmE{5xm#h}MPM%6`IEt1xbs`UTzGJnqH@!~T)2zF!CbgS9$+rqB1^NfeiOVHXPKCgZACuGeD|#&~4zLdbl*#rlKSYWN0I3^aRmo=Kvc8YMOxBYVcOV zR8Rv5h35EJ7rj%WpvKKu!k! z)?Uy}0g!fJNjW&}l_uKcm-vBj4JeS|!Ptt*Edz7mp_&fn z!b3Fz%!P-l=NqI@wRwY-B=o@w;l?O{xo~3y!Cbg8OvuK3eGPIRJi$BzbKwc*I+zPj zFekuVc!Jpp=E4)qs@MPjzjTfL_y45>h_D6`W+1{4MCgDBbr7KhB4j~?1c(p@5quzm zGxi_KZZXJsdhm;9S)jr6vTD#|5l?Tk!~g&PLAz6B{u_Xr5C08bn8twS10|vlhxU4D zf)+`4o`Wo03~qk*;l*;WcJpe`$`Q~8vea(yX_TF{PYnNeKG!_o`4ju9#?Ft855aT( zXFy}?WuPO$OH@G18k?Ve2nq;$vHt-RL-*tdpkiO3d-4+y9l+8(`30E4!M}a-o7O-7 z(>eoqB6^#TxBmGb6%h7iA-n%yh zq-3uR=zNFcpdA#QdoBL`|Gz?jzcmr;7Bz+m-CIG@pgRV)f(*=$7yhHkK* zz)k-W+1}=cme2nKvN-;4j_77!_`kVk76ZczTQ#slk>|NVBlHlR@D4DHB6?cS1KfAV7x!frUG#s(|)VoapRT0L4^y!z|FAJQG|E(Zbga^Gi3R1HdWFaK}L21a11!@I2ni)Yp+70qX zCpZW|b42$L<4fIpLCF)6T3;(bhsz-2ds$pzFP=t#@-Jv8ymcjbww)y$nv{3n2M0{+ zfzm54`;g27N9{{x_&5mM%kJss7^BWGv3jzPZUhQlZ z`1k++3*H{^NLXhpC@?_XJS&g^;4tk5hoa>P=x7{RMQ1Z89=gGLJDWkV0N%9%NeeGQ zH@&nTDD~W-z|6p~D+M%t_=cl%Dk$^=py_>XH`qRqO&36m62Ow3&7k<|oD51UFR%ao z|Nj^x19&{ESA^l<1D4l2n|*lxFuZK|{r~@Qa9D%72ro~7^!I|&8EE|rcn=WIscx_{ zwOc{4**TR1lt5Z}K;(t)sbCu7HE^P06kr6e#? zGJ+KHZxiS|)_eezfmuPy-&>w5x98s`wgc2PZMjssz2!g&TPMVV{|M)SPPS=Y4RRPG zXqOjc^9{(n&U3F1LX>Ns>pao<>BZuo;H^_F;h>Hi%-JoTARajS3@>$F2Q6KI)J~v@ z-Pan%}Tod}mMJX>z_A}17@ z5h{;%etmtaxA`=vG64tLOVIAD?n;)IpiS3EvwLVMW* zTHy2zGz$X~2d`Zf{{R0!bS4HQhA|WK@)LL_Aq{*?6lgynIDV6pLGk;!7!<#tN&T1? zj1R$s2%Sf}T~s`JD?leK_%uIY0ePJtJkJUlZccb{;{jMR0Rvea@en+B4VrfK0S$HpytsQEJlGKds})k=AegtyLhlkBS7S z$>GP$z;KK~AJoWce#6pyfDyE#H7DqW8OWKSfglFZ`~=9%1N<#tm>C#4j~adhId?+0 zD`=sHWb+%2@PHTY!O%p--!g%jfuVx4^Idl?PwU&#o1G;pJfOiA(C~jT$YK{2pY9M9 zACSjE1MwGsG(HLqWnfSZz54$@=#VW{V`Bz}gTI&>9~poC|DW+t=Y@kmSQsy;@`IMr zA3FGp19XDh0Z`-`9sn)evIjY;Mn$Caedke-!$4zGM;XIk9JvQc6E*CN-!Cv8D}CNw zqXIgAhVd=`HXjw4%TIe*)`GUN1-$rG3yH9!ph8m?WSj+fE3u1;M`wlqc%ZvP z#i#i{XrP9Nf64*PW1wjn&@dou|2eadipTfst=}r7K)Js2W#`}4cl<4vLDj`O#^!(j zOFwj;?JiMC*$FycwRiWs)<6H@>o7|}Td93o4^)7LzkGT({{k%wh*9zBEKw2YeE0o& z>+cd*=-%xwouIKRp5rd90-*Y$`G^j5krK%H6AZt-%m>{x*6pI=)BJ!LbQB8cj*|nB zja+4*1C@9{$J2q<@#OSofT{l_DmlnFI7=G3!YAj&70`-uAJ8F82AwW_0-ZT3JTE~P zG8%$L?L<1yw*D_kwXRVSC1Bf!gf*53gICTIm$vx|xVV-{9h zK`saj0PUgAc@c+fYcEgh|I*prAu1lNmrB?{Y2@|F37s#yb5umY8%@FfZhpgYjKSf5 ziAqM$iv#}PY|$IQ_!4vq3_@NHR3-(zSb&hv2CZZS%|C$kgX9x}UNj)&?UCer0~n7n z#Q!f*i3xfU3sLe?045KbItLvH=%V7#squ2k-~ay&--7*a+z3hLFPe|&fT!C*$>`+) zaASxkOXS7pDv111&=p9XwG7}i{Svh35tgoAg3haHe#2w=uD~?))04t zGB0R;5mY;L*Qjt9Uh3WtT52EH6 zj4Y)OnqL|;|Ku!x*dYNrrSbq+P5GT;43LBhJNTdsbfaqXK^BPB2P(nS4>I8Lu|yPf z+Qo5(%;J28<^#+xK?AV8;CX4#HYrqNK5)4lT(=+>KGYHxSG#%yk_k!V=(;R&D46JguC-s^P}IOBs$`bJT3~_*?TpGsbaXm;CIEWdM1h`6N@Pj|$6*{roM{LCekWfihs{$L3><-`Mt- zegmE2V)?nmuk!?% zbl0e`blwBsoX~mB@c+xXAid}RzkC30B!S~Q?1fzy=zNW9S&;KJKxVeyE|CWx2vB0& z{DZkfq4@`6iFxxIp5V^UFFYVM8stz7Xww1IRw@<%-+l{PcJhYje=*OC`JhHP_&VPI z#T+jtLU^xtLbZT`YXT?-zc?NVYMX^;f!by=tp`f#dkg+|9_>8e`QbG`RB`hQ#^xXY zOANYs+FMVSeuRpqO#sJexqz2x(EVVPRk}JkZ;sQUYoUfVS2j2Q7l_JlxwV&;_1@ zkm+qz>G<>i7(@wtVh1vK>uc0uQ@=AVq6m%SX63wA zb67#%=WhX>xy-+B3-5Q3EI9N#oEX8Yv7;D43-Nkg#Qs|z=5GR>U9I`KGe$+Dx0 z7wFz${(dFUO#6jhpnHWoUo#%C1u^*jK>LV#T_!PihNvh6yvQyFX9G}u_8HQ92tW87 zv?fR-40N=O&5K#5nLy`8sdR%|Lp}4Uetr6d{jV(u7L_JOVI4FP6=os z8)!Lmzzh9Ka5)5$>y81>P>S@{*!^KV-Rr^#a&>b*Xlfpm=6zInnrl=zIQd)ML4{$B z3XkEp*PwGmJI{kBW36jcR7yYxeRsYNe{rJ%?Bs4p=7BHo+sy)6-UrHSustOuYM|T# zZY~;Lda3sJ|NjZy?A`u9y2Jl;`lxvH`lxtxx~TYo4`Y1M^!xw+m%gy^7tmQt;7b4s zKuwJ@2L63pSiwmV90xB!)4rhS1+6DD>E`V8QPJSv#@XScqSJD+B)K~T#05=HyQm1f z<_0O`-^SH)vc$3TTJs^shMx*0?;Cz{mb~KMce1lY#iqMNMF6B1)PC;u{03SP+wil9 zza4ZZ5dXH5-95b#phWi4?*BuO97s9Hif$k90a;-GbqX3@dg%fhLSYAaYZs^z?sQS{ z0H@a%%RooD6@nUPCk-zd9(XYg#7_i;G<$dWk8XcZmE^MvWDrug1b|OIeUSxHYYI~f zGQ2ZH#bXy}r#vF?TtSKiFck5D>Opu2D}WTe2D#Dw&&$Vu{{J^T3GMd3VEqLdjW`RE z74Hn-czGDa0=46OR5U=50Xk!+lMB3V{ADDxnG7m9__uj7Hor3H3{kP@ExgbHT0;G? z;U{OgDL8~mR4n-Sfy8Q51UirRvTSQU#MoQnc!7T(SFhs*8_u#fpaAXs(G8L>QL%t( z0-ZZ10J=uDQ*0Ng*YfiDumAs>4>5rhcS9Z3$@Ow4Xs2k63J*AmzKj5QKSad_)Zx>y z@?tDGhin?y{bCUJ&jjg%7-IwW8z`8#3@^QGhDd01LytZKokImu03Hh!+XcR(1PeN0iC}FQUhwkfYg9Z<${>X22xX^ zV$)E^Xv^Q~3|a>J3FZn=gR=P$6G#i_`m0W{U7+oBFE9TDADsx%(gHfn3fUo`&L~I+ zvO^YvbcCqDy$337L2AGbfqJhNO%2EgAT^+6znx;cK*qj|gs6dg2;>~N8ZL+$Q;-^{ zhf3;@Tqd9h4((mwt3dccsz5Oa$}cac{r>+STHw5#07_#eDkcz*TYypl$O^D`#312% z3AFkL9!endAc_T$6|F^41iEzust7qKJAVBC|Kg)9GeftI3d(^`koE*(Bpy&=*!y7#X4>L1Rz7%_a~b z^(l-Dpw%Rxj>OxNn$`m)6}=gp{M#HjTMm@u9zO({n@R2Fdd&-J|GF|Z9|g6|L;1H| z_~sJGs8IU4`GtWEXSoZgKh4$aq9PFx`r-)W-dxKZ6@e1%PBu`l0@Q0dzz*67(CY%K zX&yq3{{$U#3hp(szZOWF(Ax|;yRDP`I2$MiKm$Y2^1PG-)^U7s!v?V{1=Qc`_EBNs z-v*w>I8dU;zfG{^Qi<}x2Q1A889_rjko!wYo*#TAp$eJ_F}wg)QhN6=sGo2EGkgsX zbcd+0bV_v=v2<2(^!liEk}y2^nP2W?rkF!$B?c)=Q-#t>3`qGrtSy&f~D~7j+B_ z3<16FGFc3uL(>#M_3;sb*EgZ99Z)?2@;}V{1%4p&4N%Mn9hZySd{8R^Vg3QoCK{0W zkiH&>1gE!d7Zn!6OP~4WPH6{dlt_KQb?_Ba^C8CFpl-C~Eqce=5wxBgbV17w&;bejo-N>0 zle_1DtxYwS1v#RWv+)SXP0?|OUp%yAW&p=WFenILZ1MpGm{Tkd=u}IdUXTCHKkdsU znt%N-5$^SP(EO9Jj63?JET~%w8rL}vJ_{iAID;7I&H#{wkfY~zfc6ZZZI}?Tqa1vk zCMY~Z4Nrnfm_V=v4`V>#0$Q~XEo552?lU~lJw?R@)X-j|0$Tswda1;wo2j>mWhZD| zcBhL9=vY>P&g0!pEufp{4!!Xd=J>p{TL{!<1~rR8cZI?Rc0d8#3-NvHTkvp8_Z;vV zLVni^`#=T!j&%$S4A7G&Y(X2@`P)IqVz<66VQD>3snWd%>?G(NjQp*O7(fj_kdwh( zJWw{7&^-kly1lg=y}m5X&;Rsp0iPt@8OqQNIa6Bmr{=llmkphvEYOP_4!&gSoC-RY z`Sa55Dd0%!oC@+w_Z096_nlKghpNABhUUf2Lye~x7#LVqu=F-FEdC7IyTs8unPc(i z|NJh8K!ZXr#lYv)y{JxQW&oe<`$EtH8lNvfcPBL-ERW^^4VbX>2K;aSWnV7Z`~uXg zF5`Wf0cwOo1}G+A#^d2`9z-1hP9NchC&PjpK{s(Sz~c;bpoHOp?k(UwZrxKC`LnUZ5!XpYi8e!9|0b0um?jx6|NOYdN z_>zD9OU-kjrWt7X1vGNZc(wT_V+rev{h;|N9~FV-pN#x%p!ycHhOzTi=Z_alK{Ddq z?kwH$0^q}M!#O~m{O)ibP=~Pj2NQn_=#<#<3{bxal-|2bR5U<^`fEK%dC=|3&>hOs z{GPG-C`TtVs6=W$%+VSA2c#Z!jREN7Ht0PophIv&!$4Kr{|lfR_dxxjZno|)mgZv| z%{eM8jIZ~D#`}LT^S9cA@)yh^bx1mPWdK_O+6Tze$qd?Zdy>DU4}4x2e@hvtNO=RA z@8S7h%JAO|*^;B(Y+&P?kFmTy1WmPRp#2pp-2&Ya5MKvCd>z08+Flr}UJ^<>E%Py-1xxcbr@R1AT~ zXQ5kR55lD2;iv%*M~MGmfye?1!F7zF^U(NPrh%3@L;Qytf+vtX2b!+~&9t|G4?BVd zp9REx&@|I~(73xqC}^-vmz_5>UsxV4;{s`)u+;K*`ESq|UhDr7 zJy1um^;_v`Q1WX%P$CDS`PYMv3kKZ?RidH+aqW%WplJvJkonr6-0+5lf4z^2L?CD% z(EkF^u4WTZ_x!~MusR<|Aqt7%37sFniHPw9$OA76;qlrD=`bn0Zia+2i2r&nynYAO zCyZ{OOg=FTl*xU-hucVWx^C%q73p+60xhRppBNr!t`$(=ZwH-%-(AYXzrIwU@!x-D z28Qy`=3~;Gk2*gzJ_FSNnxC2?W;sX9K{<1t){)O51 zLFcLFS{}yZt`|UNA9uY1>M`-Rxr53HU!Gpq3oq_~`faXTj=O^In(K7k^I965PMTeJ zFm{&;bi3|gEZt-2%ERAw4wN2Uk93#r=(gElUAw2`4(RNrH!S~41;YN9Zg{b2Clf>G zN6@xCCjAlm@{m#%qnG7T~uMFWMLvAB6{H+;73lWm=`}g=axQ3-oh#_P9){N|Cv>~=fVPY%m zC^do9$-Ur%sOxM7CA!XoFMB{k1ffS>f_4Q!&sch?1loB2RiBvw9B-idvH6VzxJK0Z zU!nrXFBXAz#U4RF4;Z8#JZ3)G36$HEgF(3sw4>Aja-&AK1*j$h#Xa~W68;v@JyQ); zj11l8{4MREV&)A`P-lpW!waSZOrVyf1E^pGT|@AKiGRBmxMAl6THF9StiY@D2WZ~= zwFop)K>4YZrTHjJ>$eiUG;6!kkD#NU+?f8CsDO4k3Ix2Ug`SXfp!6E3OW0t;W(zu3 zh7G(r1$y!eIDQ(=*tUKv6@L93YIJuwOY?D%x!2OH*-Akp@y*AWqB}pp&JPBS=zoLq zAx#Ac2@Q`IHHDxygGdm#%>bHY_JC|^1?{&1H4#Ab#I2Vgd-SV7v*Io)0*2p?A9Vm- zd{d&v09jH49X+*Oa=zyi9RzK7&s4si*KIp3KmdAf#>sMRCs#b|93ir_L2y6 z&j2azZU8Cnj8PE*tq_4Y4&*LSYrZ*`f$`vT7Umiio^JOapxGI#<{vElt(l9JH(i zSpjHADks8(37sE4fV|7!!VR{aC-jAvAUJ!z`~{w1>ip2|$^c%r16pc?SgQkGz|;8} z+Wvg012PiSj{z+-=seub(8&n8O&&Di)E%Ru@ZxF`*ib}3fR1AV1;k6xML?iN$FYW% zZUzQMgbL8bHXs!ZH7YU;C7^}20>_ViIV!|){J@W+LL8RIie;K#Flv4{_=2gori}%f z4*!caA7ion4!*|<^X#A z5#9tHK-l^DMf&`o-(OaNhG#)5n_L;1K^j9~%bKuh1UIli;R8zVVR0`&^O3Bo{-Dgy z)7$WZiGd-DF$=u9M&`xKKN#ozzevmjogx0!4{~1xPs4stU@`Ewg0FyfQBi=LQnV2? zQuf*KEht?$v%D7VEo0~n_}_W);6s*fA8wA;lcfrs7g`ULzUpQ^4myC1fuZwm>w%Kg z&cm~GIw);3G#}vsw>&yu zx4s2k$H>w7JA(u4kr(C};E?S++?M|cb`MR#5R zmk#Ycpn0?30ln=RU4Q;(6$JFQmx9KVbNM4%IVHXNvt*7@T&8>niA=BR@QI6K`y*;b^} z4Rnr&M5h~1YPT(D0JZghsd2M5V<%`y9_$cq@OTv1jt~4Bg-d3FlJ^TKKCowBcZ0Is z1j7UE%!dC#rwtrMPeuQrndS9rSRyY~Yu082b$b54p5EI$2juDAW^f>A2J|-9gZMAH z7ySR<`JtV;`TT!yG6S7}g=R9;+?N5+^Z8$>=luWAdfW#ob%EAxfi~HL@r&i)V39eT zHUZop4SvC90}9z`U>zdI58MEq-}>JGxjF-}Uz`WkKSwm8k-`HMKfy1KS%dV4q3K7h z6kmXDj&26&hLrpe5~9BitX~XGKgdpG{Ng_7uo#dD(8LP8A20ZY8(9A}Z;+1>?nkqK zAxt;KW(Wzg|Hb#L|NmL1d-E`a8omt&UkC%LcDh|uVqlZDptAcVsPk5%62ZvdG7r@6 zs8NYf;co|3DcvqA381Sbx;;QsYXSWG1Uex@uO$Nf`@%r$5up6i4=o4yTV63UFxcqw zwEjK2kx%er$^LR#OJuyxm{gmi)yR0)9cJ!k+5 z`iy%7&LfHOTc>T@~*#`kiB%mMzrHs~RfB*mg?xGU$9yD6sato9xA-*X9^)qU~+b<(_f({~q zc?s$TkOx3MLh)fcD0P56C-L$&Xz~=?J_0A{0G4hiP^#eI-^S1ZZeudq)bh83*Ggw; zG}JOM@VCAKogoXo(Z=xY%iDiI#Z|YDN=WNT{uc1|rbF5xDgn*E80#cJA-Z+KPVod2^h4_LV|yv8)LIgdqjy7$RnWq z0J@a~lmS2kk%s?KybT(_{Qv*IJSdZ}zXV_C26ZWTts4I}KPHeAfAcXWL(qB*(4upG zkXfLN0SmjA%l?42U;Q)SZv|EHpv2hxg0Yj`@W9JepzeW-3P8GCKj`|3mt~+J2B#m;oO@_@jEc?+^DW@+R_9^Js$kH;KA?2NV|bwR)N9B- z5YXzj8~iN`L3dPa6JfIoVPzT(C2O~=f7wBHh zW}6O&x{aWoLTFIfi>s`ly(oO3LIre3D6}{NhXE-3K!wrEJkb4Opz^i(jRa@~0$Oq0 z1e&77+CO@cp8EekE4v$Nc?>!)3Z*<=i71bkAY7#7tGI~J0?L(+hSBCx~DWVbpQF!zpaJ&0H}QvqQV0zP(Ver z4if_dq=;666wwmUhy!hnc2SXl6wxZ3pFssBs3QO>l2MCk!vn8X!R-x1`FyPN7UKy} zboWMqqC3nw2EBX+tu_L!K|z$yGAQM#|59)C*~Cdv3`O6L7M1WlWg6@)e{b&NBJkB~n+yO164Bvu}Pw)H;D^Ed3^mX3Qc2NlcwJ<^MlHlJL{2!8h znr$XT@V9^#YN3>;b3txEE>B^p4OE`Wz{^uV&LVMw44N1wnm_oskcC7YBi`#1vOeh?rna}*ePLn;N?3+ znQ9Gk2H5)U9SRU@PoP?R0I7Thoe*hw;N?1u@>S!-^>rxa>l$z&3N8jw%GbmEEfc{~ z80D)(H=WDZQt(D!SosPrR$yh!%Xy%c4lXJZ@N5KX0PO%x8NS>ITILOnYY2tA{GEie z`~{Csebxsx>6;xuO={41j1TC9C(tnJBT#z-bY5BGT5za#m#8>^>H*6V6&L2!REtEAPp9RrDyoJ2{*rFY(C7` za;fw^$f|P3?idx&5i2hI`-C+Qf?8%5ODub31o-_ALk~4^0jc9}0&QCZ9e`r#0^Vfd z!tVrH7!T#Z7BqCms0eg^>@HDZ0ag5<1-hWYbkNCTpwqWpRAl(KxifaSsPKat_n>=h zLF1Cg85?R;`0GI9?4b4LWwn+yDh}lf$Fr*&l-^Seh3haji zCDK+*CGVTxgLWpcK=!q^oGd*DQ3o=Gzda5#+~WQpG{FU$utnHk+722^0a*xXvhjl* zQQi#dJb-=N4!U!z6V`!Co6vHy#HUxpxVIMM7Jg8BmL24d5jIEcnZuy@&ERg1&cnTdjQraeJB2|Bv-yPqXg9(y&hp^qgG}K5{J#JH|JT1(Nt@8C z)6n^W@vY_s##fdvIxq119Pi}j-zEs!y70=N`4?xoLhFHwH@0WaoZ+dv43+}tWVn3U z1MnaVynhrL9@cp-_(iA=D0e=!0R@3fca4exXl)^=dC$L1zt{D@O>G$;Xz~07h~^SC z2Jkc~=p-~o(4jmoFOIAPj~+{aPJe#Mzwc#djS5HScTLb1LY8oFXuf#35WE)+v>KH0 zyyZ{+<|Cj?`J(eIDE;zp^Z(!cp0PLVe}^AvV4^h5@^5iZ=Y?(_70n-(C+f;T7IvP{ zJO^?ZC_lVlty&y!NsZbe=azb>}tyeGdO$LdH))qd5YaKLWx* zqvQfFWEMgSDG?RWl5fa}Q|G6b_dy93)E+_Hf2$1&(aF}J)f5$=Wv)IdGSFGC7L^Rh zqVMLOZqWVaH$<2jAS<*2vh-d=fvzh%8UecTP$Wy|g*W8lR8Xk(hNvijcF`q(Mx8;2 z>wtRtEDQ{q-<#inwkd-0j!G6|c+d;C6z~`lsQduU3xN)!YJS5K9v1rI&H}Ledn^81 z{^f56jXU(VsCa|cT$iW_^!ok>4OBqx{Q)=lCBe(%FY&j6u0ZZ^`wv}p3gud9c9BdP4ZdmgeXny2>$q`U_;3CS{e?R6^Rm1Cnn&xc z9%_E{x8au#e=DdAv(f8aqhbZx9qpQ<0y@GIbYx@b3v~>q@V9{a%HZ}Ks(T;=R|4 zcItq+J>a+lH*#KV6lI327YYr3(HH?5-xalljPJ^Hm#7$YhlzB%33Oi8JY16A-8Tcg zN(VIj4Z6XxyAu?@oo7LNRE{5fa8QUt^OWXU%U5Ly&2LzOL1i4cZTLSxrt@g8!++4W ziXVT=v%B2{n%}T!z7FpE-7BII6!7BTTqcI@Fp=gX0-CQn!$d&m(U@3Gfjl^b_fj0_7a=NNtH4!;9<%3=G|F0z?Zo2beC#$_Ue59|G%>}2P`7fIaLG1@RjIn z4FEA*RXVqZfE7f12i;9%3R-v7S^C8ATkqB#-$7f_*L?r~AGFWDb87-f-PRS~|NrmZ zdIGdKbZZP)WCwWb`kvnqb;nz$fOLS`F+cwEw=nWBFf>>)@VD#)T`1KGGQ;rO@zxfo zn&YiC-~ay?29yTdrLHf%>~^d!g#E~lA$ENdoD@r3XO+*IPlRb^h+`1sU-oIv!j!bc1=I z0%8`Zf7J@H7o=i`|C=Lz-Pj0EOqlUY4z(erZ6j z31hdb4rn)ZtIGHPpz}oew;lL?BOvUBi}=6)-C(~$mPoYl@i8!DA25OVqw_T5iB531 zzSe}KqwZjhZfBM5UaM6FcYCWq_i%K3b9DBmfRYi|WX6k(p8~tV0zm=Y?LD&?7=oJ*oBS66 zov#M5r*ua5Tu=nG-sW%l59*$~>U3@eg{k3f(3bF4uwfuSb9A=)fTA6m@4>$5W|`6a zgPp%W3^X+H<3E2-0hqzg-(JPZz|cLV{Xoy3|BSytn@@T{mUM%S(EJE$R|_gIFdPS` zBv8Q1{4GhKkq}n_ z#^$x4?8MkT*9K(F?UMTDy&#thl$L#K<@x^qKVwNQs-e!R=!P1=4F%6~qB!9xniKf9 z%>^BW*&)$b3))&#&);$rl)YR9m>>>ef&^;!RFJEBS>!Yib%L3#C;9uYf;{L8+S}A| zSq*e*3)rtSz$M%b?N*lW|NmRIGJuj-n}q@csC*9lzZH~D{%-}T{2vUeYb}qJW`U;n z>pL%Ky9#tp1%3zwpTfms^&{O0{85Z@((U zz|ajgK|55y@)LjaEq>62%%FuPsmB?-LA~`>15mIYC;{K;@jKwfS66T@O`8C2$8@)X zGLLmDsPKX8g83cr;u1tjH#qBBgNqrs+%~8j(vpamstgRh=+~{JO|WGL9X8Xll#PLb zzptN_fuVN-=-7|ON1!dX{4F0r$I^pKoz9yFAF_0Q>g@FZ#rCOhM>zOfet{Apq?{G# zoC=a?KE%=~(A^4Rb~ALc@HHQ1v;-%A{&vtnMA`&M9=3E9;cuP`)(tL`w}J{DNX5hY z0<;gVmE-&W|Jkl0CY`-+zWx8tcf z{s57!5}x{OXdTwSeqX*c7Ow-^WcG(EMOiedv#vq-xkK( z{E)G;7nGGjl5Ai}2ast854>dW=(Pkh!J?oH)Oqm2OE3qNuR1Rtc*T6-W%DCOkkC|l zknLd#9lh3IJqKPgfrNXlK*D^TkPPo9(AjGO67b{b1Q$siy`YTK{Odn|%K|nAhHh}= z9el*nZ6ekQOSm0vpetL!B}``lOE=hq-EQFGPo^7OFduxt(#^sMsfa*#jJJZ0;brTF z#5K6QxBS5G`=RmQ3DD)KePV2&jKI@;Ori64*b9k|;5^WJpp>WaALwRH{(g2)Mk94S z7k}##V@%cW9W61?mP^+ zLhD%b;}4x5EU{jpg?US;iwb}9gAc8jO0*%N%6PE5Oa)R+c78heh=qA7sM_l-V*uTy z#nOC8!17?}mu_&m)9of=?IywB>?{w8HBd}V8GuJED0)lK^5IM2VM?z{iYZ;dcyUCuH`+z-x>@m#=$YuZ1JDJ<)sMB zMwqV!F?_Ap_!ClVtpTly1MBULeUQb_e2_7VEBLwmW+x7(1gx__u)zu?`8C1>T^+u7ix$;2g!@;v>Sqz`u>H`50pd zxW?^v60vrYC_2Qy4a@~MY9ZMZQj-J(y;yt_oJk<{0;HV+x{F}m%MYNF>>-VS-ZBPT z(7rML)>=>x4QyHG&E~_5pamFgy#XAZV%-5OkSyNK&>6zV(#gUHD{psw|NsAGFDM|u z`XKqbo2@s1rJJEstn(Jgm`5y~EP^l%ogfY1-DSO?yw=Uw8^F>j*e%d`qxmo+MEk)9 zES)0o5*^fjeyNSH0c3Wk7}PlsZD0*-FdNiCHv9r@xq>)}?Jfhz6Cm?p`VKx|xhn(L z@a^0G|1VD>0t8flfZYaea&o({P;OKVXfz)3R-*kf8L}2fM+-btty%kh(b%roJ^P$mjpy>v<>iwod@nWS~_n^Sb~1&zQyz+8NY-0z6=FybgW^ z8pNZwHF^VhI&XmXKpkd;1?6oUcsPO%vwqq5)T&F|I=$GNJ`!GRwFoJ89m!&^J%akBRNVkIy#A49h)e+L2_ZlCA76CUu z`_Q=+)Y|NPrg^XPbN5z|+br*3EDF9;`mPf!*F6`c8c|I1xAOCViV={$-WV1B=Eome zzm-@(%IeNrj5olgHAwd0GZtoW)d?*JI*pnSu{0kOu)I+Er5jwsbc=L=I>-OPwI`(Y z_aAhxeDjZg{4J9qr)za6fBXL*-VRijVPF8aDM8J^L;OuYzyANv=qk`X7u@)}&EE>% z%n50^ev<(epP-_s8{TpSwMi^nL2VNLHqa&^h_gYrQiHno5|G+j^Flxn)HT5}-C+{i z;O@BP1^(8JU;qDyTYrJSAGAvmWId!;~OjKKY2NRI|I7ywBr z$3fHe|6eA7oC|JZgR1%&pZ@=UX$RSV!##n40latu+!Y3ebm#9E)2zVF>zDnYwff+l zQs8zrv^D;+=L;xPf|~rGOxX=?TO&H~o#1Z!OV*G7|2KoK&3qa49kQ+r+y!0$a%$+6 zygH0*rXgR>&dKuKy0NvQe-!WMVGXa5`zm~0_<}ZI+ zktnFi#?lEkJq(d#nvV!re&BD-`V37h;Qo*02mU5+kXsW>x#rXV|IMxfj4v1bfke%5aFGRCMgWP8?p{#Y z-tC~$2`=B9gnzd>^`G!M7lhU8y8a5?}rn!D$M zItt(f3Tp6x`eQuIsKK-l-dcq;Qad;h=^u2wIk*oB$_1cAJsosa3?#Giw{(FwPp}}5 zTTF=nH%Bdx@weu`N6M59q6`dh4}RcpmjD0%|4WDW5Z`sfnn5z%b3tRSpfRrRpg~U< zuR{(Tx?m51`;}l1fr<=}hgcXP*%0KunV>XPD$r?g@Sl8V0n5whKVVjXHG`{Sux3!F z8LXKNloWk=L5)99eTlzgHz*6XM1wAN0q1(qLIJ}|$H9#oP|b3z71TqnI1Wzj zpxoPex%n|;$6Qd)9Gv~Sw}LD&ywtE4q%eYi%AugJ|64(Q%YYYWm>|7|sh}oX^FJ>B zZCgRzbjUy^|C9rY$67Cy7&q(%8OBhe1-gz3Jlfpd3)0^W9)b>n6xlBtz}I96K=gKk zmU6Zxf-)o6Ds6D)e<=qoz@WtzsK5gG7G7X=w$Azf|Nl2v9Y+4vCjy{e2-xx8Ty;1= zGd~RAt>rA8AE0f82aNpN;&?%=-CG^tE=}{J_na3x+<1Gz<^+I-T$sW2TL7dH@nW|z z*u$VffUviSgwbXUs^`Fs)PM|7QPJBDYNvLB8mt06pjj=Y5>WjPF1Nw$3V5{#iM>v6 z+(3dFbg*J4Xb9mUBY*36&?P{7K{aDAf6FUSAp}mg|M^>F!NYAF|G|ZA=kNbupT5Xq z03VQb9NZ2CN9Qq3aBk!85CM%|fh$h_so?StmfbEvvYRugF$gIJQa~jbS}_0`d9rK; zjV|%GS@OY(0Z`h2gbj40@B@FV%^UREQWkV1Iij{K;f2CE)*G|NjTK zOhCqV{(kYt5YjSv{uL$t!>TJ#R(S!sQW6|`p!y7+61oFeIxLN!9_BSGR#95}sr`e`6$C zP=Yxvo()te&qMO2hLCC8!w-Y813;gIsipzi$dZIBRtNhP3j6V2!>P z4nd&88B~3NntO-%TSZ?Y3Xt~wzmclW3;a#5U;O{i7%E_R>E$F)V;<~9P*m&zO`3pP z1F+Uc1t$ehpSkbKpFS5YJ3n@Qdhzl;Xf_g*Vl{5e>bF$S-=Ns`GMO~@TL!FOx>~-G?vca2D%=r`3*}LEC@j=;bmUSv+w`^zjS^M z=^jo17YvXj9t3xxJ;;UNMi7atNYJPml2eJ*^ zdjO^6{ZIb?M{UBzaf6}|6t1w8tnjiCqzY1Ff^OO_(T8?>!bGgYB>01`1=?z;O~N0YQQ=fUy%a!mjX==Ow5=2g*#KCgMxb(9BLS z>(C2Gx%&|`(XlO7phM!NH|Xvfc^B?4Y%ds?gA)ngUSz3N(LQb z{IUg9#$H$u2Xfc@`w(~KfByeJiy=z@)?5Ka){Dq5 z%nZ;zD`;;%xWGnqULj3SNZ|u2Ye0nwq8NI){v)XL1BcQZP#}V9W5jZWxgOwD2kQ1$ z+(!z&PEf52Rtp-7`^4Ym3vywpz)L4^GZ`FI-@xrHNXzME^jlCk@ciEjT5JVs3WD77 zVqHBGLsTUAoPV&yi??r>pi3dZUI7gnygUcGnho6jgcKrK3;|gTko5M#w-cO;p~In9 z?}3`kpaci86*PP$3tF=f2D%`j8(eyJ{toJ#3QC`l!tzD;C9n^>!D8Sk>0jU}>2_9- zMlb2k$DJo2S1W0r1{H=kv0t5ptyTjm2ipm8cMzoXgOoroCU<~c{t|Q(;ET3O28Ne= zKmPv@9r6Vay1po=1htPri48J-`ZDJgC=fXy?dUAs;LhJKY9QAuL2@go8PdA=&Hw)| zPv3=>qu_QIB0kT$fqe^#&lPu(;&Uf6B0GQvbL;Lx#;N*2_lfOic)1RA9pf7g$hrlH z%}h|6A;U;N{`0p!zy1IJ%RrFLWeoh=eFf4wIbPa7hdB9nmTK6G^J~DigPmFM>i_?j zDj>z+e%FiU3I>Lkpm`|ptwCR9zHVFGL-r9sv78_2K{jFJnNe!TtcL2Zuq9 zl*3+JUXAd3J;(-)JD~9okb3Z#c9!-_(49Q|+rXnwAYt$vW&kLXr$h8Y7LtK&Wd#NG zv)hoc1uM)l0IAHyP`Uip|Nk%d+=lgUK?Xxd-?Q|>Uf9CagFFZ}`6kG1J#h6%?t%8- z0s>#KLv?{24%W2+6q{jC_ke{V?zy`P>}#at83aJS zS&a>99(V>mOFOLd_lsVL8l>O96ZUFerQ= z?pFwWIR|v43dn&6K-CKw(fP;!|1Uq^{Qn;^^&5~O$icwyaw+Jh zJLoW*BuD^!`yNyPZQRWPJnptC;s5^^OJ6cE7+!kW@d9QXcwi1RLYDzDC7`!`6L==M zHUX5xcsi$ooE`KcP7<0eK?Nu%TPEKGwYxw?6sTV51}l5X3mQte#NW^U;s1ZbOD`XT zivXUm7YgXQRZ(=myaZ}~L7fhA#Y@n=cg=5jdfQVVbKNiGN*EYm-nRq!Rt~i86spAp zBrp|pLmzZ?1ZX`fXgmkJCb(Z4v?f@Y2eKyk4X91*%F|uS(b)<<$< z_@INQAp4y8|cWl*0-SL(QX-_agc7YZ-+SeTe*}$on??&pm15F z&Hy^V;sH}zv>J|GyA$W@PA|3X%X< zel5TM|8IQ6&;Ys!ZN_g<-O%y-|9}40PLSOPKy5UTP10b4S$bO!{Qmzx?Em&Vpt}NJ zm_~z-$NbI)(tf-Zq!AQBrBU5s9;w~3ps_8>D2@`Oi>sPt7#P4k8vc!3-C-V`Q5?-q zER3%;p-o#*+HDd14~lJ&13?~t3BKJKY&OU-kmY%hb$H$LrZ6xtXo6Ppf*jsj10oM~ z-q1W@d5FKQ1Js)D1$n%?734|K8u1eWfnlAkV51@HE5U63R&Yd31$n>0ih;jnE@+1& zczV6FRR@&J4)C{f$}li=_g8=xb)DpI%`dE3bKoTn-gOPIOaMJLl%RzTeCAT@b5d^JN-e=pZ~q{AAtLV z22g|ex48&B=$vZ;UiO^=73^kd?u~tNyj26rKi(PwXL-O`32>GLoaF;&#lTsh{vSA) zTOHtHB~aF})_~vt|0^7CEr5FG{{v{WO~B^a<~JO@t$#pDOGUbSLFu!5DkwJoZv_SE z|E=Ia*$PVS0lnaq`F|@Yn*MJEh1>tFphybn{P2G(D8Ibuz5p8SGJwQg+5||7D;4RE z^XPVF0ZmdCvw(W#A)r?BTu?e}z0KdM2I3(tKAoTr$~+*0;iqyz@-TS+6(rz5O;||w z>7EJ-wAM@fEoGp&Jn0*(?y;DL04g0UMMR-jo6D=EaRCeeZm>JJTR~>>Pd&iD?LcQMD4AGJ1;rJA{~JM&ksuL}k!nJq85(d5 zH$Px(-V3(3RJ!FriFo%^kmh1+4AJ7!z7mzJ;L1Mi;!rgO0DOB@x=gn@g5JU^aGJ#T#-pGF~2l!o2cY}kJyA>36 z+^wK+<8P@0Eed$a*svFz-uPQSfY(oh!0188BkNu4j0|Tg&76+Q^?FMIN&^2!L z{4L)>3$+h0LJ~|jI55EXc7i=CP@2*W_I~Suk|@}C%m)>OSq6=JLCFNVj1ROl8fsxD zToM1axu7)NApy1a-~a#h{4Jo9TbmCsL9Au&1%(=DG58+v1SH5vP+I5#ElLNMU7a_y zTPuEpR)T}dF8($xdB`C4RFKg@|F?p|KkR?7OgC5n)WbYfssNb?1$)-=0)KAY1h`U#%s(6l>jo7{;LWuYzEL!O0e3DFZ)3%%E0SaL3Lm^xLgCxm-j*nI0sk(cMw{@ zr7(f^1AtN-C^7TzJ9r!%>0l11cVJw{8U649ZZD z=E#KZUQjA&23J{(psd^to`?j+A-KhurP}Mk7}yDp)J||&{^Fz+QZoWlzC&uY)=T^y z-AW7$klMNPmiAO|3ZDu|;X=aT6b`DiL1{c75bPar)eAM`GHBn{Y0De@t>A&0xgghr zrh@7po>qs z!SypFR=Qh3-USsV;gIpV&fftqI7Go2XE89m%mYnUgZppYu>1--E8?X$ zC=-FjL9Qm8hZMjKBv4fZ&NllFcK3pcc5w5co2Bvp18}~_ej z;Pkd9{r&vE;b#|)SjO;85`RL+3x=>?Y|o!}DhMeD`ZhrWo^9J^52E^UfC9L2ZWT7iKnZeZoB+&V{G1#c^ zw{(IIZNL%&VO$s?knr;Vf9Sbi5F>g$7-8A%0;oN{&4CfLA^Qg>f15n0GU){;%@fTB zLF=d?9B_EF9;lT3egoP(fCSfZNHG99o_sH;i~`GyiTec+;ai7E>Z`THMIeSpqw0=FnYHF@VD&8eUi&)=yEo_PXQ zC7=cvs22*Yp3oX#lO;jsvp`CpAZXKl>@3w`#>uRdO;3>G!L3zg6i1$;9%n42Bun}Yk{~xc^lj?0c{9i=@#gA z6X^u=twFnT#3W&D)D8h?yA#qzH#d;P=y5D_Nj=V+ddT@ zbo|?=g37dmkGMH6q^bVrNbAHGmM=jo0>CMin6Uia*}4E6njjJpnkHPZ(Cpmw@Bjao zhR}^Dp!5alpM&}#kpB70=nwEINrXITDjq6tjVj*_E*3zIzCLbHlLeH#z^Z#e3834N zrSs6iSMr_Uq&u^7ssN}dH&x{K|Nq8<-Mt{X6Vh=9%NU-}1oJw2E}hLX#55g`Psankxo#1xpOK=;&>}4!Gk;s z>4}0^$G~NB1)?s7q&@K15V!*e>f<~B)pf0)EABu=$tKX2c<|r?2Y;(Acu5l|--H~>KO1JJXrSPfg-q{0&x<^wVelF?u1r6{~tj5 z_mJ`fGBVS7So1Pu@C8&CEdmWmgX<#AgRo%{{+6&e}M}po@~uqd}AD2N;{zf~rK= z5DmBs(|WR`1U5vJ4IiROgk_yjA%u}ALo}SA2{@>|^TDHA;MO=OG5U$14bj|v_y2$M z0Vas;(2*L*5LGugTzXlgKtWRg%KzYsvh@Ie|7=jOfs1ZX`{6XGcZ{{K9?T1EKY+BO z4B&tSKy~aP{?_Ps|Nnz~w4EoQ9rg?SJ(ll4wFjssW&}4TI>BB1*4zAj@t}OiI)=5OT%X#_jX7E)pRfm{dHt$EP$CV$iYw{VleUFMg3pn?&cKcJ05 z&?0k?iQq-%|F?olkl=t9=~tK;x_d#5YVbq>s66OA)OxZ+s~enUS`U;cfLAAihI1h! zy@8!KUl?u!jnoQ2hAAO&$yJ))4Q?KTPUY?f7XY2NI&Z!R+y4K5=PgJ=29?ARJ(`DJ zx`L)x!0B%)sNeyO!E%AtTWw>2jJvWR24W%OoRF?7C^Ni_{`3F;1kk7h$h|LrgO=Qa z#sxs-2S^^0qQRp!{p<`3&7hTZZR`vTz5Sql`i7SvZIkY~poT^30sg7rk^t67gYJ(w z2P%WWAr49mW}w{?SQEoEl*AAi)(LJAf`{{vQiJaslqO|2Sdrx+{&w{@ph;$sLm(-l z^#EuH2NX{X{HK5cHP#I|hO4Dz6I)4YgaAW}&4=*)Ac^FncLq=IaIX4R_hkgSU zOdgONs{Jw&GztOHFab97+Ir~K|No%td27J!ZgATXlxab2$4+ny;>API;4C=ffYRd$ z{?^*p|NldVPeI8M(&FWB2knnV9=JTg-{k)K|9{Bfl;O#jGN6cp*bX}99bDdYg45Z{ zxuAvuL<*W-p{r{_K>=M|3r@2Cw}QsM|8E72ufOQLgh;&#kd#G4>Mh=kCG`e&_ktQi zttU&|ky7uBEuhp3F)%{lTE=Jji$~(qJoSMHZ-E2~VHSAYEk)&~D7r zaL|Y#s2YWIW?o(b&AUSGP5-|YG-lQL`$Ym1B!Xi>au5r_>t4YX6L@8A*b5)f2s3!t z9TX`y_*-9qmLGy!?TtS{(Zb)Z!4GZLLxvC5mH6%ng_`G}YB;*JFja>XKC6B?g&p|KL z)`Q16UM7Q<2ZGB-$Xpkw;q&qaXsQ6YDp`)hr}A~v(fL0Z`TO{v z{{N5T-25+3;LV8%-&{pF_*>*bYuLeE?uK4acSoT40O*{EZh_ti0Z5mpb1JB_1KPte zbq%Pe1lg=U6|^#~vvmvTYT~z_KJ>4W7R21~um)M`git%dZm!@LP-5^94ros55&knsH_JqWCTyDfTE-G_lqr%g*uJk;R(=! zF337p9Z=y6DZ;?RiqJL8hnpYa9#(wxpPzw2^GfR_(6FM&9|lBgwAV+4zxm+@NSE{f zR!}B{jDG~chCkLOfoCHig+}v_|DA{UTbbVf|NrtMG$HbDCnAd|g1i3U=tT5}d2VY! zlE&@5prrBgEoikixc!aP%|llt@(G&$A>*;&A|mjGdIS>#)QLv~5Z>!NglKPquk`Kh z2OXdD(h*UCP3U!G>I8RxAiZGzZH`Q^(NIOu;!|*<1~sYvcQdpe;P*TM=>md=n7|Do zNXGz@w|1OhW?*Ri2_pG@4_bnwiN7xzv|0c*Ezl~%$-n@KRLEed&M#0^42pD!kEVjk z;^qSiutDZE(A7F%ar8mvlVBHuqK*7PW@x7^26XTY$Zk;5Y<~O!GU&{|jp5}aMCk}x z9}FIzfQ(|jkY58ELkBl|E<6Tr!D-nEDy+fk8Z1=!TUWjO|NrH6P@z+z#?ajgTBwi; zJ~zSxa&82u9SAx%q8C)&fzDG40G%&h&)?#~%m6xQ4zkbB6Tw3}rPJVM8F*ro=>e!%XMtoG(3;q=PVitLq+$I+6EtoO?j?XK zufzPUM?nUHo8FC}OM>e8+p{=el@~Y>X(yFrSj#r(}>~@Jaw^I2{3vYCy6wWQM14B~t2yri#{} zKmY%~R7Wg1hq~pcA84s6$n2NXKY^Aifil&L^Wk~(6`V-nRLce(tAi9#kic33QU%rqb$;g;%*d$+?ZkS+^M5O79-#C03;STia$}It zi@F2g;<*z%1KE0jzf%{~0e%BraTf4moi76eq~8u{Lx3{(ODphtHgK~GY`$Z{e z-WHq|LB2T1-zo@N&JA9w0BO{L@)=qy`ypt_G`QvWaxtjV1Lt^1rhqJQ2AkIj9(#Y0 z5(9DRA#h2t`93HufojNZup-c;HmJwJ-&z7%wd@31?hIOF2AVJkfK{R($G(`e6x@>P zo(htJl!qX3Pz}l79syd_4K8-cFAt%0BE%n%+7Qxj4eSKl32jhMiH21<5T}4P^t^ly zS``UOsL)iE?*keG2MIu$!Y@6*X$zF(p=E_HNCi0WLjvMu?t}mT`L}~JK^k)2-2xKd zkCgG9K|}xGQVMzrGE!$C5xVdcJmQ$83tD(8(f|!NP%wkyp!M*(|NmcV-GkSs9Gzh0 zo!}l9MAQ9xh$gTQWYrQ_>zh0O|G#{H7u3Fjv>l-J0sk_j9LL{s;4Y*-*!}|)+n|;Z zxIS0`S_pdl0mS0oc2L<2DW@S-Ftp_a?jB=nExo)7KAHmL4^VP8y!7$|c=HUBfcQ&L z0S#Us9ri*B;t8K=!`j=Bc!0WpzZWRJ3P9~sa1rv-`x)3E{%w~)i()|% zL18aW)rTwx6wtl)39I{ykVJ~{2dcgu-dbtzagy3(PeFs$afr=jHxuE(QQh$Rg>X)D-0-5vyFRg&s z8W8qE0>e^QkfnNe{{IK9&w;3e#=G`QX3*?ChA|N7fUp;*Yaz};PZR#272UUy*F}Re zFgPR(!XUa|^yAR`0<^|^{%uft0=I!d{sQR+`SQi7&!D0i#02Fr(57yX@4x|=rSMV# zd^;U#+EsXI|M&m@7mc7xY(b@G0cde*@>{UGI}d_-0mipMJtL6gz&)SeUyy?Tg(XBK zY+fH0@JhE)1ODY&P%YBF1hgo*7koHC#&$OFAy$xe%1kDpwaH-VjOlEkb-$qH$>4R$ z5Csp7aVmhEFmS*a*;$L;fIWcjtnOQA&boXbVeAYx28P#dy%0xcfO#`PtH!$D{r_)x z@+IR zDxhoDJGZFp0i7=FqGHkMqGAFPRbT)eXl>K&W^=p+d@Vhwo!051lF-}!K#+l$r8%4*_i(AC5)DmkH^IR1MT+sHGAZ%jLl5!D%ys z?kfOY9tg@Bzq1%1Zv3DNaU&!|;irs01g+ONat9PJpgi#6^69_-8xJSn;bv%l1G#~qM8%>vpE0d5 zjfeeFXO4=&aW@rEm>qW$0G*Mbx89?ieNITc5z(+Ih9XkB6~0lo9022_UuI&7c!a z`L~5K9CtGSSKOOHarWe3Q)-99QNjK@3uR9>$Koin_Gk-z0A z$n$O*pwmBJUjU6OxTqMs@CWTz`tiSnsgtc66ucm}H2Cqb_PR2G1NJ=VL^eMjmWEo! zoYGg#N10x31c}r#X7IOc16>;7%GBV;15vvebi!4YNwkFEcSMSrba;JAvk^c zgLj0K@IvE{zhysYfq0%m>s$VgU!Y~TIVuK*|6k^UG(po>cQfcv_HLF5psMOTNFvN2 zs5eX_D2p-d|Ap=_j!rk7<|Cl<>^eY~9W~df{O4~4UEl>$F9%u)5f4g05Yu`=_b-Mr zbc;*?O^g|VV&e@*Sg(tUO~4ChcJKlUP`rR=N{M2(pG@mX{?5C9|Nnmpx{T8Bz&AHuCeUGV zZW=FJp!SLMX8iBWlj+V;v9WYz;CFUq=yU}glH2K{V(@w|=vo~Z2H&?3)_JV+LhuX2 zW1tfH;5ASQtA7A%_K+_`4psXVd*?(55-R

    qxjL|NbA~V-|an(ir?WL(nX7HOLL%H5{;Vp%Z)#-idAo zq@2Vu!7fmjf9oYA`WO3m@tj94f3L|$k=1f@6WAka>4Q2oY$NJspwQs9;?^ae_c zQX$ZBR}LJYQUY`Y7E346*{f#!t?xncizAKog0}c`fc83abQd5}6nwXK>j9(`1rz1p z{{cL-(1o0$U}s^0QdAwtM${AqK7I;4MLmENzZURx2Qvg;ih2N^8{+)cDG>JJANXEY zmY2NXb}}?M8Gw@0Z%}fA^t&UwU7_cBQFrsq>u|gVQ;?`WfDW!T40|CD@g8^wbLXM% zJ>WHFpk)w%i#L^kc zfjFU!zttWTd!ZcNQ7q7n%|hS{06;sN(^@Z8h+v5F@4waj+q+I39*xjCgaMQmKo{Nz zzX<&S${Q>%LFMN0Ly(9Pk!rcb-+BoYQNa(If613cfn2dIh>3sOspE&hT^F9NjFz8kK7cbd#zl-QFT(GF^0d1jXd;b_>;}3#2Oh+*oB|5sJWzxYk=>wc z?1;;5ofkR}eZK@N#=#44PbmKC6nF_*kPR=o!FlZ+C<=#gUilYOYU zh_#Wx@}lfED1y^`z>NgN(D`6L42tnXr|XB;8u-EhwV3%(a~XR(N##ZHEl?07dxPq& z7ocw2an}!^HUXsi;@=KB-`Np#>ed9vZE*tNwhc?CE6;IP)OrqldJE*t?FX+x_cwq# z9L+y0_*-|gLeAKRT@r1^-?{=W1m27XKDge2gAsI_IJBAs8wWZmveWem$T+C51%GQk zST9HlVuKlfYYbcnY}^w_1*_@$0@mj04uzd^pVoSyLJU)QMyKlogy<8b78;UbnDC5F z*C)-jPrUj2vq0^_+6UhJeF@+p3h>%K2E;k@pzQ7juKizVg7q-)cbI|ofOPACSsxfm z@*#UzV5LR3FQn2$JD9jT^a-R7W3!>#^+_|@3DMxCXHXLax?Q1lH3QOW8&H=9e5&w< z?#ZAD0jOdI@~lHLfuMD+PdZ)Sye{qrFYX{{?HhzI-(dI>v}6Nn0wHUgUEeT*0_ueV z=!~vtytO~5vN}NSKpXxR3$!l6Gv)(Tfl*t5M%JD%Ua)k1!{2iNG~WtJY5fJ@RP)4} zzb_3X%{_s1rogqh4;?f*B)}f|3{MNZXz?$Z8SW7~h!)q-h%{_pQ0!D+1QCeIoaOia;UZbHY zip(_k04dEu+NaG&RFFpyzy~2)Tme-b8m^$K1AMsE>uki14cHDEa2J{*;KkE#KcIUs zoNz1Z{|Z)wLjg~~i{B6h&8}aN7I=TD>6m~yxTN!9#$}NEI$S{4-hc+*n%}Sl^fn)c z9a_~n1H7edKd90JHyr`*@Tp@@dYkXVta&ya?8Ii*Cx|g<*C#a-q3hYOyYvTRi4k4} z;9z(Rv!e-W$8ko;GE~ds{5_vQWz8Fo|D_yRTrVDafiCkBfP@oh4K>6c@X-WF(7c41 zX9O`1vJ?k&uXA@dXfUVK_X=z&;_=Rdoga{Pz=GG6GrL~t7Qj0)Tk3^j(y`8iojX{#EN`8En=kz@M`2+AR9u#T|syf}Ftl%01vNHc)arBoJUZ!_+8RQ8zNE~7idia1gY#O{+bq*9fv+O~oG5CU@ZdaL3 z*DJ?eZ-6ebKJE%Snu_7L>jO~gI_~-eBKQHc-mbY;fw@GexmJO-gr~Vyfu)44xmJO# zl%v~Kq0{xnYtiOf4u%r;9n7F(Dp_~1f-VXKwbNCOGk^>MRYTzMQj1b&5F4eoz+vi9uwb7xaL29q4qG0T}@{&aBi1q5^anq~Y-c3I|O%x}m)fXfvbrK#2ra ziB4A@u%pF5lj1!8OJ)9-O1ua?4L(h;)Aa&Ku2c*_S~M3TF}PzpUsdpmfuF$Y5l zUw5d?@dFDEm~eEnOnA)$<}pBcovt?;Yr#QW64)Jj{>cGvkTo100}}i5P5bOI2_yXgN={Gpq_i~a0+zl*m2Nuo5>BJ6Ucfe_kgH? z7at~oG6D3|vB#C%4B+tj0*b@!F`!{7(4>_-*un#mIN|ZWuyI!$&l_|yM-{)BT z%Yf|P&lTJZko{x#m>C$Lee9P>;D-K#ttK4Zp&zf@FTE4+q68+*-@*az3UDx#2p&JMU=Pe3OVTb=iW-f)YiDzV(pdUAR85B!BA+a4NoY{6NE6a87Fe!B`@S7!3rU zf63nhI)Pz|b19HDH2>h@Z+#1zRt1%N{D`3OebC7>0p!6_eng;v z1<}Ge;D70z7d(*7F0BVj_z}{+cRG0{pgEe~&sCuFAY2fn;Lrh(uUtQXvvYT-h~lB+ z2Vp`dIs}d%fTo1wETH487?52L3KnI!VW7p1t^y@WpkOJH0R=;eSaaS{+`~ypmmN2fmT0oq%we1gnl^A0=oH$;rIb4zZ>MOgx%n{ z0Qmr(@W4I>1zHK{c00&%_YB7mfs>o>hfbC*kX$K>95}s!<&Ga%umx-+)Vgk0k?{GePBtgQmHvk&WodU;Q-+*f4ms7ww z8KV3RGHnn{0$xmmN%OZ@VdQR*LQB^xpoGuC zz~3qfwgMd5p-?IQRu&{(kN|*4eSqnD3{D1+uz*VOx1NKQ34*XP0V4GTrfV%&7bJwB zQn2#i0?Fk8$N-e`03-lP`0(-oB7jjIfP^v21CVI*53J<@L<(zp@CI~Q5qfz56@+DY zuy*i{>I*OaghGpDM0xP0+xG%Er9lcYkZMa;0o3x~4M+hr#lOKU58i<8Q-YNTZ_vsE zh=DIaDFwv_eB}Yi3`lwK2AWPm*9pGi?}oX&@St94 zQgiJUey|$|nWX}9A;>-nuzeC>`y{~jNidd5fqfzJzf|FWsQ|c9$@5}1D7zdHfR%%w z&;w;@I3KB81ji(_T!h9vsO$rki&xOf#WzUhB0>(FQ++{luyPS*9ZI?QhVcTTTztcL z0jXSssfU$|U|D#%2$zMHi*LG7%EdR`;Bpb>X4tI>#}9#v39!3Ba-gytAqOre;Bp|p zK6%Z$16*Dn0+*j~Igmbt9Jr(a%V8#NjB*rYEq^O9sZau(3NOG@;RSdqyZ}#y7vQPz z0z4H;fKv|ERKW&H6{Ms>f@Y~S<4g5Ypj2N9PlZ=NmzRlxGR+ZzZdXt<9CS0=8`NWH zKs`i(7aa#cJ;Vw_(3CQ4ii>4JugFnIiUrTxGN>|uGffHm4hKkoPXTrRrcOfajT6CUlqbK*m0WY|+z)R4;D=t2O z51#-XbHVfCtsVGe3FvA%&>_H?Z-pA3$BFQg`r{Mv>-P z5ynz>aDVtU&kj(T`I;5nN$zwN>303l8^F>HzK#HNhSYyhgb4%%fcu;;EH{E|RY3Ro zp>FUE8lZpy=}$$Ok$$1U_x3;QE`4c+-U%R2Le4t{1vlut(+Tmhhd=Yn{SNJX3W{rm z7jyQ3;<`s4G#UV&raSHmT0qV464bCg?g}2RJr22<;pHsQQajfdpw*qnjvr)L3~D1m zH{3IR=w@l`4t>%5NPZt^RrV$JDvr!%)Ib3wo^1*`QK$)R%xb+nT?%8C00P z;Rp`z{QQFb8#w2+9w;g3c84Bf6H~$iXGfRHb-S~42e3dx2C|{&^NZ6Wkh55h!&OEh z>542>>W-b!?F`ZA3<^7##z|0(5GQ7_Ffc&eWx?MX3p$v=oddMdEC|emy2pmUMID)M z%iki7%s1q3VMpd0@wa>joy!9Aj|qRvb7X!gf6H}bel>p!Xg3MmCocRg+rdpQ6$bv+ zwa6+#Q|9iVv-F#Pc-ITSHCXev&II?oWuO~Zc_x75z(a1Z6;_}jIsX25kZGWyE^r|W z+7E|bDL~fpfY+^CUf}Op4T?i|Qtu$IDF=_Bfi1z|mbwsRCqky-JqFGBrD-^ z%=|6$amlgrw={#~;C{nlZEZ2aWh@hjyR-Z-vP;2!B2uU2Vg8o4pooE`1T+5DB@jNS ziu&Qr-#-=HubRP7!rcu?c`YD$xG#u^A{?1 z!2xnUWYRqn!wdp;6T2HC9IwHUo&dgWGf)-Ct_K~1{?qbCX-v1T45U=)cIW7oVS-jr z2YnbXFx~)HP$iaGjN#xO0O-2lKU=^9%dH1WY`eo*;O;t*#TXO-xmEoZOhu`5x9gHl z*8{zvW4xAhyDsUrfRuPF_{Ue#0di>Sy3uw3w zWIcHN+=##BI3{?;~7;qMHt->Sh( zME&N4%(vxlu|nn>^0#Oq^Nsjhq>%Y0{4HF_{8IjwU!a8S3^l)+zvUIE7hMag&mJJl zfa)`6SbZkk?K%T~_L((*>tRsU6RLoy(!e!3dSb9V$lu=sG80*)Gg^fOs{Crpy5UNQ zEWbMsL!E?@aEa6mD*Qi#60q-#ZbxWHnDMtR0tq=n{mkDFx|9XsF2Z@D#|ESy5>P0v zBCNHS5rC^WCAWAw%m`x7UsxiLko5?R=!x?C{5}1Re(1QyPa{A z{&t{l+zjwI5V-tb2P^;GK#mIl#U3Ob9>`*VRRPywib@r`T^DqM4(*)Le1N6XbwRi5 z0?_%oGoV^JT|q8rz0Kbu0Imz5xsw@`h+$dAjK39}c3_!VbjHpB)7@Sy-9exN9CYmBEkSc5Lz1{IZ{3L^Z))SIBe2GEo#`*BzBff=p;OFSV;ElM3g6)(8G zU{-1ZYV@U=U_YpZKlBbNvqgk9V}1}uEYz{L9{4!?1rb& zQd3Y53u2xY*gO@GKmbd(GuS+oepeLKJV?Lm7N`qYE5To4h#1QS&klmeW?4a3E=s%v zjUMk{0_{BqjUIQqO1uP}{{e9)Xw@=o_?f9h6jP9`)Er?nBWQT3L>?gkv5OsS`fFdv z5Rcmq&~d}B?J><_Ea3nNwj3zMWds+*2N zwEi#QMsQ`CYe9Vogn+_vSI|*m3@=l_ne+m*iF?3@@j|!n9Oy6%e~S}HHdLb1cTVSt z&cg>^vqFZ4AbTVkZ-Cbv%)xS^QVZx_;cnkKy^gTcXkh(J0!0q7wLn03C^i$xFZ(-P z??4w%y|(QRmFRZ8!t6Q+G_rLViZs{}tJ3ow-0Am7zCEeAYcHI0RVp?4Z&z-k&~ z)kNp#7d!G1Lsp%iU#yJaW`ITWP8QJQD0nu}cMjxS8)(-g)f!Z;2(%t3RfW!4!4&*2 zl?dqk{K5sMfWIXlYzlZv7ObfCKuJD0Nl$@HNOXclK}S7yetxm(H2BbMP#7MB9EH{$ zJEijm;{nDSj3>HTnmS#fy1J2d)j)KitTVo#>^cRs;Nb%^0|Tg!1nQ<7KLDO=j-3NK z4CXk03uqt$D#kJcq__z@;Rsg5G6Pannw6SBiaoPZDY#nDxvuUkmWN8&!DSai6oW|P`AB; z$dk_4J;~qthmnEdbr{qlaDal>+spv@r2P@pCm?@<4TCBG`;!ZwKOsXIzB5`+^0$C? zJRnf!323+tZI#BbuN<^Do=O9f(&*ASe`;ELTWe$Jq7w|GENNsin#D+|x8Pg? zj%G+1a0lE=01x@|x5|N2KU5Zy(qc-ips5B{L`0Wppov74h@pu@LN7p8$i)pt&} zNC)_u0gfP0x%~bP)So4wkxFQdTm2p?h|TjYTR@IP%j%em@A|;a4g=1TLTJtg2NY7|8`KVVh+-<1)@RWf2jmSLtqxei$yREXFv^(1&p9!GH4b956QTLdP)5K z?V$7kYQMuLAsG2v7l8sAlt{p5sDa8<@S+3I(id0oa6V}1i#3GB%->=NVX^SHs6$wc z{4KH|b5V?7Eph2a5nw7YMipQ#Q9>19DG@{!U@YYVtsUTR0j)$wbaudvX8sn?u`38c z@NfWsEBJJoS{Z)+R!{+pY8-W(1X;wRk9XmXGOERFr9$91*7;v56aGT-J}7Plpvi%w z({~OeZ*|&qK${G)Gdg8JXKaF3E=qKQ&f5epKMa)tv%$-1LKVPlP@#XEr2{l0+wH2+ zdFc27(6Y-85su>rK2|WR3gBQz$p6L{s(H*)0vXBnU-U3-$2v!4HC3u`= z2FQg_FEb#mC3M#%p38OT#JCFr- zjN*jmAFTW>VW5PFBFMzw;)o&0%-^DeA;`kt0=~>75ZO#d{uWTNhBvw;AfsqVE@9(u zIRh@cVbhV&G|L073}J%MGz*#)X|7e^=Whi~uHm&w1k}Rz8F99tFg48pe zHXYzZ1QG(bJYwf`^2|W%8bbSynz~?TBQJ55==Plh&Pkwr)9pKle;W%&cc_LUN=^cm z`z#%x7NY_*V}N)%pk;{$44`Go2JE0^$_9vK%D!`svvh!#*g(~Tt9?sX9ezJo9Z)U> zH9I>+I$Hmih=H@9$i77(a%mb=SK+Dvi(=VSvORMhlx4Z_YZBW?*=?jC}dDlS|@f)7t7cCMDpxfMz zAAjfs9~KfU68Ih=-}bQ{H=`) z@S3c|9#Y}jl$b#nwk5g{hGB^cgke-74Pls+2tgR7utCP^Qp@f>o!tx!-LW&egIQo> z87$zMcTQkX7DGVz3)hn%*C@0e03{}Ho$fmaToi*{2TqnCud;wEZ~m4)pjjgD=oa(> zoQEI*SNH`uCm~$;B#;?@>o&L$c;7#0v$HpU{{pxutl^ly2ii2^ZvkJU1FjTCM zp!g2>U;5z1)_tHr761k03Q*||S`x(H@)(q~j`O$N1~o>8zHgh~umppBdsr0iThP%} z*0nSETS0sNAj#7LvVa0K8jJrpDt5@)M$ncv(7DhkH3*hdW5A0VAoDZWh8@8bPYL@D zBvX5N1c*r@mWTOUK?m+2k_l+X9O!N&RNFwq!TkN88^F315gUS{QuK6i25k^co#e&^cqEL26D=;oD{cDp_3Tpj=hCQy=q~#1}$O z-~4A?!Y0koJpo+6Un()~o&YM*d%YMtJ3x$sk63ye-~~GmxM1h#WIpZ;nrmX{b`|J! z=9v%;Uq0FVM&QNXCvX0<`m=%7PW}Nkv|j6U`~K;jps|^O;ow6S##7xwmZ3bQ!YG0l zyF)oT1)E*}FhcCN4E9g@uw|LSAcIpt27hA(84O*430h{u@H(X1_Y0c&93@uW zp+7*r@cq%-0doJrMd-8O8@qqT&x_*JX z<4es#(BUrv2tR^XF50}Pm;zcOngMps4al;?ClCs}1^KlKwEY}skb-LwsDt=hm_TCC%@J4NHoaj3*$--%ce^4)uYp9N z8_GZ)0=I7uVhFPFx2(Yso~f3TINBeFQ8yw-uW$3PZ<+9i;t+Jxo< z?7ac(&>NqbI}g5u91R6-)`3mKskWDg;dLxlQ$fu;v~mm2oHw+H!dUJEYEMEu1&R}p zr&7>8r3KsU22z33p)WyaBNL^P@xbe7tP08U(LTt`@jg&)1})(FXL*pn^%Z!c0@P3I z1_v*wa=Zo>1GhZjVu!$Dkd`pmckpd^SGq+ebb{}@I|17I4PUR$-vSykMR7h{&kY=U zN^*%)KLxxd9;(*&MmI|b=mJkr)3)39N;gjjfTp1AAlO2r5NJLL4c-!EWIMoR6$fk_ z4vXof`3U78bHN@)3a~#r;pH4?s~$oz!l%0UUA7Bh!VhrxLE;ux_&|5rwjLNN7RWV9!9#V|cC89r~cR8Qj2l#KL$1wB_zbsW6J*p>EeJolMQH4?yR% zY-M1ubbU~B@?`|*{!!Fwn7`-hkN^L>n?cJ2x*bHCfBfff(FGNBkV}kTM?s|mM2;Us z+8_@)tl$bG=&%CNZhc#5cMM_*UZvXnEf+yk7NE&*xbg!DE;=0Gy%|?(`k@v&$aK2i zc?p_b0o_l#&4CGYt7#FquLion6PlCxTS2SPkrO`Tu1-iPb9@^-(^$ZDf|i|u7O1L$ z3mK&3aSWohJAmc*!Gz-`9NEWw7*D|32`%5jqeqa)04ITiP~{FRpw{m($gDNw7;w-5 z3r%q8<_FO2Fb6L`>-+%P4#VHF65RO$c?9Gf$SSyal*D%kx>gZX7{H2XXuV8M&3z2i zFhKGwHsc}95^~l-cf!KXfu$MZnHY%oQ9CBo@yqKdLS~ci5zAxz{gC5kA!Q3Vrol(? z{fA9LLy`b!D^VvUNuU)pS`I7Dz@|a0De;1p6JS9KtSEJdgj2Tz3#7}%zm0{d3XNzRRFZA_CdF+!0|&0vrIU8CowQFFmwulPQva7 zHR55ll0bLp9mY@pOGN^L!d|4WhSo2owZ|bH&)3%7p$edmE((U?$@dId~_mP0G7Xd4w$%4Q2 zB`A-B!?4>ypgZ&l<0sJRaY11(G(ht^N5BKIpdHoCwHgd1Dv-#4sr+9m07_&`2-85D zAdkD=0FN?3650($oC)m)u7q}jvD@{Awd<1_NJ0ZKOI@04RTwHHz-JQifR4n0w98eX z?Q+mzsL*x49N>Z+o(v^koV^9^@qm-z1+-cKG>kR(;+y}h`k$p3j=Ms}$7GHlIsiIo z#rIFQNS9?O2dp3Ocj8J5-=MisdzPcQgzCcHy+Bw; z0G+ZF20o)aoPS#|4Gt&|#bYce*^zfTIpYV*o%j;plA^IsD^)KyR}Iha`ba^Kf?<3+$Zb<{yl8Mqm}*^?YEOoxe{7 zv@%f!t7>-sJ~o8e5FG;iEugXV*VuIk@V9`5HNj@X>=5K{IRKgoz^+4(zXiOO1LSU) z4o3bK&=Q%~5?EcuSW*HtpR?PIrS(8b>T7W<3R@49_(0V`LPfSj>a`;lh0Q-?OEtSg zL8}iy7lVP;l7Loqpa{S-8!I@Xn;$T~)`1$%4W{M!ryY1LiD~+b<{uy_(AexWR?xH{ zTUzrEn-T{|jM|o%Ll}l7dJslwi7JF)Qkrr6zy(&&=JD18C7^pk!d_f{!U>wCY&}rw zbNs-BV^BF^@H7BN*o&M)Flk+kG$O;wzyP^?h$HO9>t=8Y0}a@*z#Ub_-wHYo0AVnH z3wXav9Si6pmxGYGA2a^e^WgCcSc3#S`o-S@PJ-a|I`v$j6;wY^lVCVn5`?Ja1FOVL zg2<|2Nf22FW)ei!0ZW3&Ixv$UvJO}hMAm_s1d(-sk|0DiXE$g`8cGsGCM`G^OyjvVnIef>Namf9pw5+oX=A zyNrW>J3IgO6a3rR__rSbox}dqjK6g?xGO&z^N>IvN-@vh@*cF(q4tSksam%ii!DRL z|Nk{I-F_^{#UA4cTZRS(2L3+Kt(<5DNQnrzI@(tQFE~KOJhCDMP-)T$Uikn@OvDv& zF&IVMhx^c!S?Yi&iAqfnHaUP7m2`x|>U0I2s)3R+ODqw3AXTkU^BbPt zW)E;3+aLh;2)HnREsEYJ2e%EdRpvS`j$Ziozw!9Ym*C1A(!Ar}e#5eqqm&D*>*adT zDBW+f5}D@T7SNrh;OmDVtqf@Y4^qUNmB>OE7W}Q1ka`xbDihSs{cTYy-woE??ZMLg z)0@A414tQ2goE*5r|*^5oDk_w*DFwyO2xX}SYWDKL8{$27!ST??RH}UjpM?Dh>@Z7 zKuHP61K>^uz6p28+z<3Lidu)}+AH4mRv0>o*l^hVf|1en3R1Ly9Z`h)1}ZG$c9s`v z9Xn5ej^40B)rZag{Sc?`2Tfbe{QkfB1!L!F#>1UAJ5O82UI8ERdH{UaSo81b64vJ5 zF{Kia-~{y)170vgntLzrf)}QO5_KeKVGf89RcZjL^}!3@IbPiQ3mbywf{awGW@KOh zC#{zY85tO$13i$k)bel%7euNJ9K$xHVjw#MSi0RR1ic-+cO#w_G z|63e_83*3}02%1+ymkD*1ITqEovs%^JcenIqd;FUcDi193F=OO_g-D#-^Red??Cg9 z@)GstALac0pcRkJKQc=!n}1~T_k(V-YW`us51u1x{*hYZ^t!4$mZRJCN_R*zOSelK z$i*#-8DO3T5778ROh*?SU|?OG_yd4n`eQRB^(g|RWr3u7)sf} zs$XX|*FIq?^*iqR0MzGy?TWlZYkCEEhn4^b14Hk0$PTUP&>dR8Ux-;D?a=!Df?b)L z0WsXxoO^{4d}4R!FYt}151J1!qUCf@=S$(poBynvo+3J5(%r5+plj$tc_3kC>B<3# zEJoKqpuq<4iAuM-UH`zlUBS(7TwYX_fZG09Pod*@N5Eqd2Vln)eK9-$9mGQ%84c>B zLeGo>jXr^UkJkLHpfj(aU0B#S+8xjUKUhApL%As+5@eF7Tk1CN`8KIsf#=?;C- z8NksU`ld60r#tjRXMn&sBQr6OQ1N2lu*FoUJj^~URJFcW(5 z4a{;V7iKw>3$q-`g;@^e!Yqe!VU|O=)u0RMKn{ml4qKK}D%$OO2Xuz`0q_7?19$+< z^+vbr4Tu*_N;$#HctDPY3%c;Pf>$EBf>$wt1IiFIKz*Y-0F?hggGl__4g~!#y%Lb+ z@MF!eY*iTIn1;&dTa-dVlAffc8+ZS7&U_1fN6<5GH=}0%;oB-Nq1j<%m z$D2XUPlOg};B)T|ym&tmytfIQ{ob@5s1%3g?>F79Z<-Gea|oQi2$H=9lt@h_o0;y$OeN3UGU%E166@xFgVP>RVm2j;Lxz(Zw0Ss z2akn9;>@f>8svLWB0K`A8`l2<)vY`)4}*H0kg5P0ZrdlIh8w!hQmD>OP>neZ!fqir z!$OCqZAwDm;b>dp0cV3tD5x5v5(Bun38;pEikE_F2q?Q6R6{`7=B1p_^9x_29;yz> zISaAmoYh81IcJ_UDCgkM58bX`QjJ+f7#J8zSYP3d6^k#A8Y1~}hZM+{S72s9TmAA(3=F-l55WEFD*-Ql zg3kfs0Wb1=0ZGVDE6RiTTtZ&WgCKG56U(I#U7Mx0*XB- zyA%|APJyVwdm<#@o& zn4{N0!tzjw0uo=r@(^fjTH^Qth`fO1A((4GXHw9>ujbvMFJQJoT?6MsT?6NXTmxN! zr4DJXDs+dw>2_7HJXFio9V*l9`oZ#04O9hW%&^<{OR6z1H0cMi@G*49A{vX$Z!BJ{ z+4<%_tKDs!X&#ooE(E-o`4wC$g6qEz|4ZNeFMaX9^vVCy2mebi{4c%oVgtBEtG(0T0@l6g31H+4u$oKyn51zOs#n5@WbMA`Y|Nny~Dq6RI84{hX z8-D-)56gH@3=bS{wfXb^Ke&Q@q?YhBE>}&+@lK{H}k_qHW_#sw8xbmf3$H6WJw?DUnJlZ=AbP6mu`gVd+ zIOvSmZm<{lw=?i>KhXR_rTGUZfBO_R28M$Vn7UgGQjYxi&-lUa{{x6J3QPv%%I;P)cQEm{=%Bk5J$(!ow=(j#fCsanp$-bSZuAtv zT9O0vFGwCGT!V1PFqc^1kYOp2!yyCPC=7KAIBdaX9FmPl;RcdNl0k}NG#R8gMw3B` zV>B7YQYl!x!bjm4K=XG~4!ll9c7Hc|Dr75Fgvq0s$p)JPhEy@2X(=giQ|GlXgyMlv ztY8W>2_@tUI@XBi|5i{*-3<DAqF+SVF?TfdhuofFUX_aV8cNNcV+3kV1Eay zN(De2t=0peV=r3Q{QmzRu@+HqCE9YsNt9W5C_}fGmbAozCAcqQ$_y*6yjG+OpFLy1g1w(Y?&~W?*Or z+s+7agf-ZA{5_ff|Nno<3>qSYRkV;`dcnp53KD@%a3r-Js05#^4ylO+UxM8MQFt7( zZnPH^m!S3UU~^Gp9klBiw6wIN6YRt0y`Z3B;BUF+1x-F67r)rm$O;P2<6u{U!u)kS zG^-y1t$FPR+W=oM+`ShZvOhq_61D6FMNT(_>TKByitXcvz*j`U_X9u`g3?3tamG%t zZsd@tnGD*415KVS_FfDO$6IeelPAJSFF_Mru#5*vK;2V8&gf>D(AhF|#=rmnJ1=za z0mp9Vh2t%)4SykRnwMKar)B;FjlqI_2bBUZM4JVc(k>N)xCSZ(PBQgiDOLVf(EN2b zIAEJ!Fj|6*D9wQce|Iye;nRAcL=LiU1+)TS@|?pz{s#rTxcnI$PcO|ur9C)zA`g2` zhUBM{oD2-TXk!?Psz`ZBgpZp6;40)sHb8nVzn_7Vd*>ne((GQ}7mOz$${A1Su47#ZP832!&pyUhm}EsvGvKm-vbB>G{LtB20&0v-h19U%1Th!vZ=M;) z4}rN51uRX?Z#V)2Ui^Iu@%_Q>sUVH;1?#<`FF+?1LwwHxNmSNT(VcOqv;Yzj)?k;R zI))jXEIL~&Kn{Xd=U^911&e?NUcg*fL=?fCf{2LF7mSCx!3Hp1fI6k~M{fn_E;#;u zA6mchw_1QEC%_h=6(cYH{QrL(ECI^7FVCqst zf-;+bFu{BVzoP+UC?r%mTc#TP{r?}T7DF58szcPP9lF60(%CXM0<3K=sBnO8zbpU^ zEVsZ!Yzp{W!3$J+=7Md2HZwrAMK|aO2uSG7fRx7nO9cXhgFr=6Bf&k-U1ew<{jM;ES*qU zuthvOP!a&k4(K>AJp6*f!-4|?Ufc(@A&!7{oO2&<*$YY*pt6r-H!lJ0s`zKY-wK-U zg4P@0Djw>7mL1&=ES=zG)6IK9JxGQU*=}%GvKQ3#0Xvyx2k20_ogn*Pv+e|^IY>PL z^*p!;1vN_`NnuCx8=k=br2;|W0WbPpAZehr0F?c}BqR>4q35uGZH5S$@wbAew!0xh zka1U#so>SpJQKPhy3xcz+lgyJLCPM0?tl=0=3=RIVx6C0aScuF0yc)FQQeTVHf1X~-Yf!(Cw%UoyaZ(Rj9`gfFl?o0lyLF2NU>49B?{*@%#UOaOMXwUbvNm zhelctfEMNO{ND-|yc7l&>}&<`AeMrvNi@?tTbF>^={F$(4$my01+w6j#L5FsCP*ns z8L~IL^LQ4+|E(a+;NiG^Jh0p z2Sl`6q^nb)^M2>=;|Ew~fmWu$gQ@d3L`CPhZjnv=+Z>n=ykKg6z}WnN5!zDc-{!>J z{NOj|i4G^`&X3(wdO@iV;-=1z-7FnQWmZRb1PiQ4?tlaYL}52e2h`b!(y9}jy#9mJ zbXYLN=K(JiJ;6y9Y6@6MH%kX1)4-cQ@Yu&}E3nJ}*A^d||CyEQ!W;lT4fuz59V|Fm zzyfc00y;0h2;KS*)DM6jS_Db6oh?%zfQHNdnUz{WA{%DX1jwLJoid8R8=im{P7rfi z55VeMNXHM7Z#!H}=QST=>;!ul*6aZF-uQcze*FIrEkyZSK%0mm{U*k`YFJSMPVoYe zJOF8@zyK9|NqYcttx9h0v$^{-g*JfIss+9oFoNm z+rNQwkGFn+v%bJtPv9(2bqT5oUal5pV1NX5_nfJqMnvb_Ip7{1C<}m89B=&r?du(H z{R7pH5*{`aj<+(v$2(czEDkt}2hI|JvcN0nKu04(S`h*^hWxFdnF#)E%q<7_TR=U8 z?s}G&ptDFpXFh|?@2+Qotgp1;ZwUb(D+M|S&6dB#9nLX?+%*YNX2jnD+GPOYnDDnK zz?GHqw+O>I)%-1NaE=Rq%TMr17Ld`_{4JnMk01t^m4fd20q;fuU1k9lQaLj zyYcsfwz5K!RCh}&sHp8c1gr4Dl_03G3LDnIx@?EP#|>orHg_ieZ5Lq4ok*>{+(=rX zjXbbc&}LRNTT!;EpP2dmANW`i=(K4P^w1JgoDM#T23DyMvg~yN%m!pt;?o(jr7{M(pX4wP{7 zZ)392;cvap1In793*YQkP=CS$RKUGZZ2l3%-_FSc8Ab;er`;_AJ)pt# z3*ftoA!(xZK&eb`=n9A!)Bw<23aAhU#W|`R|Goo|YWbx+XnP2nz7qE4 zR!}j{h@|NlES(_ikyjj4}n@P5JS5~nmVWUfLc?hAnk!ph>n|}gCH(<-hwn-5NdBgt3Zk8F~_8iDP zS^xiU1v%pXR*=16|F?n+4Gao+p?VC|t25|q^#SFCy&#gIguQt!I1~`s1!@H(#36N7 zXUkMjmTcY&%3KU3yv=(-`ImveC54lLVIL@uy;kj>vK5qy;pG8{1DYp=7z_%(=3|W3 z;Pybx<(Jx=prD2fe837a@cR7{=pp=&%j+SHiO!a-AnT8V8=D}LUcTXAV1PQJg!Sb; z4$y7}a9sl0y8vRCmFj~RqI=h=!_t=oXzM@dk~Gly9-zKd>w!uxgqe_%h}^@`gdy5X zOSmBZ1%=7+R#1%$cCQV>h5W7h93a1gGFW#@E2zr~nuwPI3Bs;+iYx)S6XeF`AJP1+ z|3IhSAUyw`9qwKJ)<@v65;Vikf&^iPMIjj$!{53Q)v!hE$RRle+30qVRILC*iDdH| zo^VJ#`9e(&Jh0n(0CbdyIFdvhk_4!6;fd@9vr^sWS^)=_g#mdK-VbE} zg@gdA0~tZCfTXt))|a2z;C?T)0U22$gXD%zS(xKm?Lb?Jq>$wHA>@=mRXF(4MC;N( zc!Gt*Lb0GFu0)Z1}&*p!W0FcVUjEZ z4W&{USl)m;2BDj3Sp#}YNogsRVGSy=L5*G1JaW7h)RG0~7Cu%`MGk7jg1E<9LG5V} z>*ZJY^^8XRtuH`FTp)7AO=P(H~>132CT7?9ZG@c0HHn5<_C-~K|_VjU^{$E zox0sw(snR_Qm`(RY0JRy|9^=*+%(W`t=0pT5UK)YX$xrHF#%$fU#SqtGa!H1{`=3s z0NNJk3X$@MNHI7tFxdXDhe&BbqykDM!Hz5eX@Vel4kbn+^U1VfZDvMN3Kl1=@hiL_^?F5A^B9**`9$;!+ss}M4s8kh;T{1OL zyI@;mS;5O{pwR|eu!X4fUxIcFK>axf+{l2Ih=&qB8*@NgLM%<42jRj?O*lGl9DKk6 zxzYp@HXujX$dxj^j)3&tLC%Imv014rEPlX)8n7WA$oSBO?v`Fq!zSqeR#4AAAp8ZR zI<#mm;YBzSbd~^8cSoi3LT>?M=T=Z(1F`|26WjuYgozG+tKetQ3MX)r0IaQZ3V2Sj zc`tZep+pqgR0XX?L^M{qTS4V5q`BAOBDx3G))R&{vr4&+xrnY{eEAMsj)*`97`nlQ zHY5N$Tue7Xo7ByF!R0%sF$8Ox!@@%i(xHI*99%L$x<8QC7^-rz3sGfw4PVONA_f{e zfXt0R+p$0ROJbohdH|*MSt`;EQ34wA-3YpB3Mqj=BD?tqYl#pvQ=pH1fzw!N&Fex? ziU5r*K&Ld2js@|8N+F%d%~oQHDacr&01|9DP$B_up@7l~b}KoX_k!2LmFU8Q7c?-^ zdZ0w+cq=HfKuHoF=J2i$BvNenTRh?6Wy{|Jx&sFyW60m450^3GZ$UJiO!!+w;WDNC zEgW!8HGd2EB6s8f2ZiP{P}>I*xXr|cKj@aPm+L{=Abp&cxu5`mhCi5%Jur%2*Mfo$ z6#meW4_b$R2@j%|__`VrcIG86@Q8!XQ5rYz1+P;q(Q1Cf5}w5c86Jid5HI}Oz~kDj z2TG9*(?c<%`3F;p3@oaJoA-iZmI2h9Ld`a2r5uo=zFrCD7D=e$63*tmpk4_>DSI<` zAcF~R0chG1w7naq1*(7%S`zTLf@*f?5P!>FP*i}T^)x7cTK0lcTjwFzlm>V}40)sp z$1ogtWdeB4sPkucOD}XV7uxuNo@NI+C?K=DWiLpwdkWZIP|XtbV$KEdICkrSQm<}^ zdpZw6)j<{uRKpaM2tdULGbWqSG)XzB>+ zYW{65yn8?`zjdIqW`2UWD?nWE#nfPrfF|9*WxvRd-qspW&-)EWP{50%Q=rZ`Pj|~+ zNa85XgRfUWUW@SnvS7je5@aog2gqu;u~^nOsq@}ecnK;>VC6A5tXMWcI=|MSsM`t(q2?b<{4K9Qi47d`mjC!$?tpkLTS2RL zAR|mIrywHWp@-w8x)9$$$4L+~)jJ@`V-9TEi@$XeNFVYPBc#AV%-e5he#7#AYtNtm z|Nn380Fy0XvH?tjVl^n>#j*3CC{<`ZQ0m$}1zbKMU$azd4|NF4Z)S-3d8ltKN~NI{ z=rI@56%63<63}oYf6x7Y|NmQW1+hy!ph_S~7(7A>8G%vnZUK+LKv(#P@^5o7T>(12 z2Vz(&c$f!nX3a&cNnHiBL}M>VDFfs}An4kb3Kz(jVs}p~coq^lu)r%#IzdyJ91E^aHYFB}M;0EylrsG$1 zxR@Rz&lhXDQCtpoDA*0Cz5{iLAwFsb`0m z(dFNF1Hx-Qzz8m&dwu6Y5)|X94kox%=dF$q)_IU+ZP2;fUhu?PZ!4%kfUL6Y{QaV( z9K6o*rR5V)qZpJxDNDkQdtnoW{H>tjoaVitrHc#|_?MC$0hNbXmXdw@3+n7BfR-^R zzIgeJ3v|sVq}1xX+1qGxlGOoCLk7Ay_SL$9>-f+3;sdoQ$Vo+&YTb#$okHj8%TQeA;}$-u8*}G zD3$DnWXskA6?{-;=N7PWSjv@}!_9labE*6-ppzLPk=Q*4TsS~DkfZ`GTEJE9jI#4vS1!qXm4fEO>mnn`MI~ z*cGKBNM?iNJ4H6UHbl_?>(N1yX!9XP%L}Fa(352$_KS4DLj*GN2a1?(21qeo(})P- zm!Qi!pc4b&WyX*Y?`GN1Jq5h9s#D;2%T@(wjDaHJR?C4BkM5SOpr#w>$}Ss7N!txt zrNVjnKXy*yZ3L>t@*i?e`;f{+LSQ5q^QJ+Cq|LD{;gl z%LqE48f-qqiX4Hz9Cx0u@^f|4RkJ!UJBMk%cT}0k2yHFUtWnd_mJ&;DtGz_n`Av;H5d| zx*^Rr@Uk9Ig&puh6|5h$ladwOCcv5+8^Ns;P)*KI5{<|>uN@(?n*7^bWI_L^{j3e=Xlur_&XGkgj# z0v7C`k`i2of=ZH7JLrkvEE}4Cu!71)(4phUSvG*~VtK6y9an_h(*RP!R>}*}aGV7+ zQV(hcL!$${HLsh&@>tEZm%O0)LrB@%(hCo2(2<X5^79gfap@Kwu<7r=L4^Y8ocnibrPhL4|sJP5kzs=K8Zls_Od$*-ZaBA^B!r0|3; zB?k4(`JpTSI$J?Qb0DQ48bv86YeJ`p;VYK~Vcr8}mTs8|uUSDi^D&?}1Y|s_I-ZW# z&_$-O0t)J2xH5185Sj3rbr;wP;Kb4SqZ_iX0L4JCN|qh4kycPw2OM}{E#X-VVUYD| z|G`6!kjdp>(1h}nB1jtg+1b(yPD7whJj5CNE!m)%KICo!{7OvzR)5eGA7sKGe0^wV zJ1D2Uv;b*=MJm*sRxVJEfy6Pw?fk8vtF*e|!iX5^-UE)V?v`FiSc9UVdkQ#-KpIw% z$@OlN2@po-scxPLosck`G8L4Pp!q;#0%Qv+lndz*f~MJ7vN(f5nF$go;gC=X1BJ(x zLP&T(a#VNAT##{)3cY(G=!TolDXpMz>Yf6Yftn1fq0IPO%|Rsznj~n!W+OOwBtfze zcOd0IVQ~0>4TOddXc854^J({7A21$vJkFyi7GPJjK6g^ zc<(C69LR!C{=StU5lF^>w0=PLP61C9g2$TqTiZb@;N_SsyeMSkZ_NR#1CMq>&i9A5 zWg%@<`~aTefEUilsUK1}gOfOx!Wp?30Tp)q@Nyhf zBA^t`Fhe0Z08-7QE-2BvZgWTh6kf`f@c zbVHLWxJ-i77~P;E5}Zn=fDMF-Vk;uSp$1)604b#=Kvs2i&jD)%7n0#wjIg!v$OR*$ zo&^<;wb{^^1h>b!p|uM*E}sARX9Gy3d%~5k`8h$8fZuweEAUATiqh`;q1c(_ynI#c}GwtFgw4QYg-UVU?{R1zYIEDW}{)1tW*q>B*}^4(3K z6FDrwLN)85afgUcmJ&Xw7$|nxN~K}V6L36&)g5Q)03XCCi6RBgOUGGefbMgIOYAn` zIL@*G)OKz@#t0LIj@=yN?*UDK!8?zTIsz&QPI~-3m48uECHQ~`XwUD#Ruc|r`<|tv z^+1Uk)Y+i@u8;`p=x%8Rbz>|Kl}f@wxubhZD`Yzg$UmJT9nd}vBw0ghB+!Y`NQrU+ zXtordtS6u($_d~^ITaM&P-lUy28Vk$JY}^Ws34Hqf{{!BISg6`v&;ZxFnEN_X#T-c zS_*UV0nh>Q;0OU{um2^{#}9zTSUNgeQ@|w**r=&sHp>K1oHg$SaTw|hpi04V-5?MD zFOfkJ1C>Z1?Z+V+VU~h~pkp2^J3s*gciaxpJ$R*%mOAu47esJ^9S6QjhGjx$YX*|z zz-)*e&3i!{2Ken(Q$bvWV(5;87QFc!1ce(XqN_cF3%S$>l`XK?>23k%`_=;$CHoKmY%OMlO%HYCuZ_r12XKNSZm`GFRX~L|He4+1WDp1?cG0!;H{+6P&jo zgOfF1``0K$W}<61bY@1EX_aIOJtgVu=BTr<_ZUIxR2S69Z zf%6#4hR!WuF@$-qgS%mME-3V2F7BSv3JQ{DuwfupcMDjc^+2gAJZ3xRfW?pu<3u`T z6s_uf3<}S^;7EY1)Ih|;%S)g{fE;kJ!l3yFM~Ou94-Woz(D){(7*T5e!B*n^5_C#y zH#lfITXjHLqt)Qg|No%$`#QQCY7*GXu>1rK3}n^dfgoKJ)$p){_!e0;Xw+*0q)lSI z6=Y?dME6vXr7#0PF%BB1XPkhycn0l&M)Eqi*9DCMaGeZu0;n1`0{6DS_i3~K)k3|WZ`m0_6y@&jlX5-tE~RhyN% z!9<`l&}OBuD-T&_bc1#_LrsM2!b4wZ*>a#X~ ztyxfsQcUytTjqh1B-nV+U^MvRE=Zyj*#Q>-`M9(K#0A{}%fF4qqUAto1`^+(v*U#XfX+P5UBox4QOLo76d*V6lN}(I?T&#TN6MFYW9LiM*h|U zCRjcT05$rdISUeAkR~|j=y`PCra-SyW7z-?Ly#N6Vb8Jwyr~rIy$;Jmb-YMwU&H(S zFr|lJ?go1lRKs%c&p+@|6DgZRVvG7Vp@lr?HqZG7po`}q6(QAZ24_YRu5*F~3Zck^ zxEa)c0q<~wrkMjfO+W`=fO2p(B-?d^3dK?>q!JR;i~%>PK{6#Fpd-^E?L64>V;%|c z-uKo6CFYO9WEFHR8E9rPVT%dJF%}EP&Y#d5pJA0wXR8HhL-SAQJ%TJ7I$J}a0_gDw z%I_e>&=^6@?;9WnHSY!K2IY5X!2*j5cz#DQ0c(B-senZ#EPbP;I#7NGD}%-zSQ#iU z!K|Y^zej)%$bh71P&`2+KS*=HEIXHOi%zKrLPdjGN=_#6XAO>a{};1U-Uu z3Mc4tIM5N5KRSOQ9reGb`M()|D`*)u=u};-M{1PFH`huqfV#J+Ctxsix*mD?5Hxsz z?T`!54lCS;TnHZk%|e5&&gyhM1KJT;dgevC3ABAt0zQPS^vsKI!eEh3SI|9?kXcsH zZiWA)X98X{qKSI4`0*^a%DNBf4FW^m?#>ybL}!8frG^h!T;q# zldqbfJ#9x6x?PXFG-6|5X#Q_qYS-<0q|@~T5eD>zo(Kwf@eHI7WW({d$ILENoMmu@46J|o-&5cPq53mS`SqE9Y25; zEv*MY_n4px3V>oCylMdyfI$H-bV|Wyce>tauD!uf!qM$|u9BorV1FTD})!lMM)kEN&w zRBr(vGpH|!c`O>&4Wv1xzX!M&Kw)DHnyLbM4z$i5TSV}8f)>X@U5hx@1=OMk-JO9U z0cqJA^0$JAyj_n#{0$3ro(Z6|>A-?23aT^sd)IaryI$yYz0h2HLB5Xtxa$RZaDGQkTnwNCTwO189=!ak^8%QO<|EA6d8b7e;qK=mW^@|)g>|F2CuZ!o*=0oB*3 zpgUrZK(2S>`ClplKaDNmMH%RTw$RhGC$7M39W=iY zdC|!Sswt_Bg`GR~b zIrs)koflhpL7rMt2WpA%fbTC60AE`w0%GbHpv+3#b=?SB+6g z0$zEO5(m8UrJ(UJJnjTtd;sb=zP!r~I#`E&D-DG|uLK z0{ktYo3?P8D#+ggx@ik!svv(0=-fh(QtWOl$$ib*{Ex9D4WtBq-73Nxtp`fHU$eA+ zD{%!Wz-oqU3Hxik=6__}p{fotRSF|$pf^^&=IHzYyFRr<5xy-dAnZkqAGiQ*Jx~h0 zOwAOu{?iqj9WOw$BSZ5Wl)MN!{1coP|Ce5PF~=K}fuOnZ8z<;kV-E1`2^=qMJ3vz4 zytM$_K7$r$E~PHrt{0GQOfm&?VGaLMSXm_i5k@{?1Ln?NP6meK%?9Abh9E0>Ku(zm zvi*oacj%c;rf#q#!ecQYxi>JEErtw*f_4#u`;0GbK}#}Sq3*NhZ%qfcGA?wwJ^+;= zpss*IZ^3`)GD`v_--X^PmhR9C;F9kGqT~w$m3!fVy{-=ef?hoN2?`p8Zr2Bvt`|z| zK{u(DSb{Eu1D*IC@IsIcTrG8nUg=~4i-H?XpleZr0$#k(07n{Fy!ikNsIyqBz)+Ig z?fL*-(Abvp9zXD4FKGCQq2)kHAhMiwi4!u{tfUy3>r$!$;lj-_1KqdJArzu9fLG1?}QS-TKVm z@&^)O-~teQgEJ!WfQk@>*GbUafe?qCK?2&O2}zJF5G(3M;0X_0wse4wV^PARpPj!i z1>JsRGX(fsTnL#Vz~7>P&kRBS76w9Q2txN2fb&s6 z526&Qm4)2QX*giQ(G3cm-Utqez2Gud0n+3N3oRL0xMS2E3M*m50)nz!UKDQvM-Yxs2L~1; z)L9@lV1&B995~dwT`%;4ZU6+;QvXX&fCj-pZPB1C#sE;ex)xNM98rJ-EhD6af(IJu zLCb-BT@pNK;i4!(3l~KRTDT~dpuK+xGiX7#g+M}}+kpeJFGgYkEJVA5SWqgjfIv{t zN^B%DXrXb25wuri5J3wKek?(&1UelJ7PQMC>95oE0Vwl;Z@Y6Tg^Yw=c)p>L`XiJVCqMZPi=LvX`0q)d-bwZm7C1PMXh~8GXULjBq#`R36 z0Hl>54si}7rfo`m;Eu8dRfy2mgJFpYT->Nc1I{)nk%6;IOF*d*Voo)GE2wn@?(<&& zB`!9Y_57{vpr&l?6^0UPxK`UzeGq$_19S5OmX-r0NTt*5zh6Ov1&CGytaO4jw@EEO zRHVW21y1Cz^B7SfFvo6b*V(1R#;NLF9 zzx`Hk@cHInF6Gq+A2D@LVY+ej$A88{cK;uByK=k)9d*+k%F!Lga{Lf@WKF2^=D~+d zjHkMVS}&Ez9&Z4({Xo-O@P6$r=;*-fs%}?~*QFrMUM$BCfy<#F3CoM6;vk_Qkkx6; zzYI$`K+60kyk?xxdGq+82cUa?O}aocY)IoA8l5-5tGI1aOQk^93%kq!jY9{#PzNpH z1hq6dI^jbbS3pw}sXwCQVhsxHt^>U&`|$at=8AzI+BA(&K@oEklqh9#BgF zG+kKA@xmCY>Ht_3)GYATc~Ca^nmZ^Pe9aw{4Zh|M$_8I^2W5k=xr4I7SF>_}$60tf zT{*g4zjV6tbh|=jU7)vDfp6W0I1hYFEC;+<3BDy3!3E#Jh~R>6iA8Y1x5Og2rJyTn z5!`CfEvz6eI9u@qyvPI(H3)!{0H_KH2zn6)5qh}=oU5TB26rV7+*x2(BDi2zBDi2z zBDi2zBDi2zBDi2zBDi2z@^pim0LYQF7c@0{M4xv-plonTfU?0U0m=ra z1Sq?@)E^%2;CpvDKnvwTNdl?>EC}**rz;QW>V{H||D_+YTwZKm1+HYEXRw>RXj}*8 zzZOPT)CW<7JiylcM&rd6&o}>B-LgSE#~j3*gSft0mg zsx*L=P~E;C5Ji*}tYGR6{QxbQI$fW<1g~BXeF4%6vLU!T^aYX)F4%3*#cG2%HXB~N zPU?1j0?A%3rHbIj=#v-MAW0pZHNRN9J^^)TzjV4jd2I^6jS{B##fz1wieEq#zjzHQ zF<*kll#n!ubi2OjcHjWtx(mAAy3_T=YZW9HNOZft082grt9sGx`UIR5o;26KVJHy+ zXHU?zi!V-qubCC-bbZlW`vN8dx{dM0I+)CpZr3NTnY&#%kgs2CeiQSeBH-Kq#^XMj zpfVPe!1%Y{=yg8T{6meu{k<^cu;dntH^+YbXZ!&=CfSvz+k>UkcTKk|Pj>-FXXyt1 z?Tq}}4|KY&fZQ$L>AIxzbZ6`q{_V`*i%RUeqgfzah^povW~Ex)&fspQQg<**w<8DR zq2mX1=7Emu2REiVf4?vb0H@qe*Dd_pL08>dl-hKcvA`_=nW5e71~x;vJB+29Ffx9f`LAMPch%|Fsh1VC5Ib2tCUC}C@^U1DA8-R;WL ze1PSDsmlLSXeS^bi}8Qy8c_Xw2^^aWU?m)=N*Ml^ZU8A+4^i^+GI*|Y33hu{;IM}Q zYEKr#5N!4^LhW&fD0!I;wr55255p4v<{u^{T+KghOIVwK*pzBu(++bc2UNQbSo;#3 z+R*|6=D?HSf>hzq^HJ}JX2oV{v}#ff666 zI!LIge9l@E93rsWC%f1eVd!}>?!p1bvFp)(!TsPXomsh&}=S7D3Qx4niNAT>|_qA3*VkW}hH`%S}+EBlMx! zC&=Fd>Z_o;lM%9<0Lh(b_Ax?c3lRD^yB$G^An!GNSQ#W22=`j+fs&x^(kg$_c7USB>11uve0b0$O` zz7nYnqU7Z)a5rs*S*ZtDHCh1#D~UZIs=-Ro+y*P+R3S=U`!v@sF)MY$rWEFlU(nfA zEIxphc-J9HK3}`w5bIC#L zff5^}6VrO9p8&5H@epBPfS#5HJ1ed8_lp}_5ep7Ff4?|6kBb4z#Xq1?Ymfs#%h>{6 z{C)`Tw1Y=)E`Zk}U4V@IK>JO|)fZ?&FyO_UM<5-b+6|)Q0;op?TG4d?Jp6D0T#4E& zfmEWdJg~HhJTX%tf+5Pk{{v`wL_c_=DCp?#)@E$eR!*Q{gn!<3@bU>^EU2(B1WyUo zX@LS0o??-eu-Egwd<#lCpjj(WlNF~*fl|JghrucZ_**~=hH$DBEaiI%I+(ZlpCEq= z=+G~aO6(3SWq(}+nzPCUDS_1qD2tOy*lT$u`LcpX0k z9_A2ge#F#zse~PQn6%sF0tVBfxiW`8=$fF2KYjk z7SPbk@q-6;8F6%n-hkc?aqs~%ML-Q!2NrOrng^2JPk_=pcn#YH@PYDN#}9yqmKk1iAWhz7aYE5NLir5Hckw0vadfdC>_swcGU!C%L=I54(pRyQGJhep+WQYNHnIjL# zR#Z=CrcN2aj_+b?G6>`76KQNpn+{rB!X5Df+A1^ zv^3+WF323{gq;w0nvMs2XBc=ej-eAa+SYoYBov+oaasoJzaD(d#CQv8EwrZ+7yx$n zcE~Uyc(C#1A~w*X4(Li0B%5MDLn5HTu1mK;t`q2Vxm za0}LgZ9RZgH^4;s_upv#?akj0su4h8%ijvRr5iSCr^*0b(qIoNRemGa4KM@14M|Yl z@SCwttNAzho-^>U0z)T~5_sM4o1MQ8TsPoS39lP|!|DcHD&cj*Z&=-c(}Cc+;WuMR zF35q1x&iLM)&tF z2P?wvZ`o2Uu)oPkkgpBF21~=r2!!pR$v(Z)$0Nqw?a?W6*5Rp%BnWBuA&~6L5Fx0c=(07sCVap;7Pa%GS`6rrB7Z|ib1cH;BNtSdl4}K zuB}Rx5IR5&0k9VSmvAkhxwz(90e;Y8KyVwI0b0$Ks5I9Ku$J(G3M1GK9aeDIKra(` z3EIO1k}WBG3A#uGZV%{QM;l`f@F4?CB_3GC*+AI1FhVECLB-}2nu+?xF4DXK6Lwj04rgErXl`q2SB|SmlqZjprZs&x?KsR z54B6+^nuoT26w9jKnV(5Ha&UKs031GFrnM^3t~Imf=XTn_Xb$nyama|SE980v&{TvQOE&}mwg4v3wM5$-m@E#Jf`;(A!&y27UgvhR zff?N(Mcp18-QgTyCgZ8j0FKxG-E5r}uRXinIFJwDLEDJ(06a3ZUlemE(SgN?aiJHR zd$<^yU7s*^H-pc{aeczy!}KtYt|4=!85_XZyT%`An!ffn_kEfyb| zYu{L)x#a`cEmyF(#RSOEWx-5|rD^Z%eDIb5H-1YfEi3Q7~;6TWRy`CCIktu9wk z{4l(<1m)7u7ro6Yn;95Dm-k-i1~sI5c|gbLf>t^(o@zeCVtJvo7UDlBJVOi-0L`9*8Wp`Ft*CX>m(Bnduwo6kjbOzA9AHr$G*OxU970ZXeS*a`Aj^+Cuz(#2vV}-zHM_omNBax@o*kgco!lpkpk^F@XZJr)B0$b2 z&2I!=T-JW`pEcDNltn6Tl(=kOj0f#4?nlR1`(*gXLhX_ldXYPu&(fX_b$gSM*NyA4X0=X|6XAko?B z`r;+{gg4h0;QeUe3=2w}Z@_b&KA;&>21{3tQYR400hDPCx?SHu3q6P!I6u3-0k`>I zbUQ$^^CM$Oc6NQ!?fT{=XvrzaL`WkVtdGUgm4m;v8&q<*zJXLqW~F-FP=h$S8NhRl zpp`5P5bL1DV<*Jmm!LTbuu}q<;EF5`ftJd=dHEG$YB#8Gg_zXK!-Qls)Id;SYVqRD zRIp25g2t4aU0(=5QWi>@w{(5M-*n^O|Nju1Ad9;|Yos{386Zw~E#X6wb1y9f^O_Gp z*5FivQVeJ($_J=02Y9Pk5={6DSQvEphwBH>N*joqEnUBqXo6)R?!5qEgNKa&mwx$Q z`XMObg>Dzv^{-jMlE}#rTw3eAczqKT<+r`07(k61*rN0cEDQ`2x?KgpWz&b|e-`{L zdq7S0e-`}hM?q&w{xd64X#Qu$-@YBp)8=nE3myQ~aZ;hv|^wtF!~$Nt{US9OIMCsF38vuH#2N;I%HiZXg@Y2Ihyge zGJzX}Afavt(5xYU{|8X{?+O+HH7Nx^84R**;DI-P|6XvO;eg(nJygS|JM;mliUM_J ztX&_}33a=2Si3%f1=uY{Sb$xCghlfK7E4zV{+3l>&x3*n5`Gq?0o~w`f+zs(LI6o3 z?K3cd$b*&;gM+tD9xm{|R0Nj93qi-GfQHvg9U;;XB zbo>Cc&Cpx$|0O8SJ3lbHUV&_n^y(Ga3a%Sn1wi)>f`X>Rto2(dAJ|wHkg+F0x4yUv zbh~U|L2_jmc;KA~prbh7F}8l=@3j8^|3A1RhuIJldGYoNsPwz*3Tud^ zHUF?ILWLN-*v`G)*0E#Nc)?M@k$RKVp-N^;=r(vk!? zySgLxY-75FW(0 zX8f(7?P9QCfN1Cw0<{$nK+15$O0d=gCBopPSv)W9f@+8(0xvyx3QGiu``fL?0`nlW__ritV?0mra`TRj2%Fw%|ShDDBH9Iv2@d}R1Dmk<^k0( z7r%nLQs8^Zk!OP^Lmc!3i-XQgM{>~q1}=u?+7Iy3@dKiCgszW;jZ#ss_P}E>v~D23 z_UI1%04g27fI5CWkS4^7bKk+G4|2<)`HjR2A;mZUS(iA$RzRmU|FSNH7D1rnB;ZRF z%}Oo6s}fn7e|gs_Lu-2hNXkOGl#pL*<8!PP|DryD%0sY;iVOFwlo8koSG{1;!{=r-h zHG)S3bR&`L0??G@%ely90JubgW+3qTStuL4eiq6Gub+jo!Ru$CZ1DP7D7(6p=eR5A z^lFBew#eqY@VA0iaDlvu*kdDLd8o7+B;)|q4PLMeDx)9;6L`Tgf(u@-jNpP7EF-w! z1D)TU{!2+;t7e-`%cjI$f8%oR3_7yYRPy`l=wOAY3P5d8o7qBt#F_aY94w zH8iG@gh0{P173RC(|VwU6A~hdu;_IH$@}*3Z)Z#cO;}w49qLme+FUEaSi;{O$a4I^ zlY^k81(t_ucY=%Sp3cuNLVkhEzfRXFtp`dLHP=pHsIc#JodVuR!xPZ?`9<3MAE0d* zmaY>(XCq7jS06LL+Glire&GR;?R1^fTswz>zq19@6#yI3?K=gu#OV##5JiYGh#?>e zj!svEA2?O~==opD0dh<+JGd(YTDk+40;`!gMQs&|+6sBF3Xt`nLG#YfFN9uz%>o_V zF&otw6#p1wGX~^Ts4=IX!;J|68?%I=Bn~{Mp2hsX6cj6G1;PI8bUo2rdjjm#6QCwK zXnz?v9I_!hYFiJKsDa&x;)^YB!N$XV3~JOj*Dhh;ZvkEWiegVHiaq=-;Bp%rERdvS z#@`AWF7I{)Sq~91;%|jy6R;4he}pJ&Ag6tG$8tc{8yl9EKy-sfXtNkVk;vr;_1u}} z+A|E`L*l@D{5U#4znH`dmTNswVhiyYLfd5ruoNh6YiBT&fG(>3UkXZtN8X_N7qqby z;@|V2w)Gp9ECyJ(mI^@40Ea7o%R0~*W~lz14Hg1>4%{p=;%^0AGYRnow3m%El*`25 znhDYY_b-2IB!~|VF|gwqL4Fp4IUek1{uWcP%Q)cvp2Y%o80e@6DX?}>Mnh=7ZV#4* z`klY!8>r3uh6n2Z*C_t)xcU44|JMH%9G10n_@^9r?bYo%r}>9>xm97s5?F88prDjmxQwBG{5Zn9$USxd% zw=qDL!pmgn#{C19t_raFE*@;!0tWt;kDvj1P!ND@?Sr)9z{4XK_*<`n%keqTrdUXK zDCpd6(8-b1X@hkhdL4w_O!Avwork(z=P+IXHM>CD_U62ZdDG)69Q zfnr30p+p&6$I5oQ&gm6l=ysK01aF>fJx~EvxDtF0#Sn_7PS+ct65)jcXdr9|B&$x> zJD|o6e~Uk;U+D_kbItJ52*id=FokaDW|;skT)|@CqmjwUwy`bS|P=Q?sZu5frB5BP(Y)aCRxwa({$Xvq`Ph@Usi4`)}q*Uej zfeWmlc4+H?5_yOeXpF1#^9wF5=9O*wy(A870@XDg_i-~rF=b* zmWh0+U$^gs){_;&%|E^C`Hml8SPDAEfQ6&wK&cj}d0HXSTsz0RUg-ECkPNuI1>aU( z$^)vDO4*ug*D$~;ns1;RzG{2;x3lwaKXCle13P2T*|$tKnf$G#|NsB*b{FV$odR`t z9WPp)w-cl}b_%2gq+P-bVd(O=f(|POwQDL^UNd*svp^>>OTIuDB_*#RjN+0<5Qb&R zO$ft`zcm0<*2l9zu9N5Q2d&5Kbq0@AM?hyzi5{l*KpIVkCQ8@>W6*eW=ZVgXGr#|Q z9fsRn>`4*XT&M~x=61SndCh*@6|_+mbns%g?*zsZmWOMFyIr?1-mp9fOOPd?jZv^f zdl=N)21&cZ6Kn`8sPtU{ZV7VyFXae-q4ox?$}|Ki`7O)eDg^FPtYP49;eZc_i-06S zXtH=(VPJqMR_~6T09w;04;#>cT&Q!Qn*q`G z*$Cc}1+sP`69WU9>B}3Trt`NHGrp`pbYNtRfQQ>cm0u2ecvvf0nhd4T3+JgAt z25Wb1M|aE)7D&=UPGe#qCDkK4f$ab#FmPM8+w}%g0^5O{z=T2bQz!`xB#lU5pTT`I z0`!AypgXKEnFo3EkiVE)BHOuXX+}P^qQ> zswAgCn4PYBUfux}I<9-VE1+eSE`RF*kWf7t>B|75ad;G92SDiy6cA_y*a7791zsYC zlDSF_maRiUaFXMYJL$r52Wc*dgkj z!HEG~nJr9N2~?R(x9cA8DAFDX12mu^_V54ym$QES|Bp6D0v`C3d7;Yv=0EFp9oS$m z|MpMK|Ex>BKm)r`Ed1Mr)0%%pmPkVw(Ir93M3U%s?Z(GVj0R)3ff5nUF{F8 zu2?3#oXx<%(D@NM#>>;y>H7qE7AoTZ>k`ljolhWBPzs3bes~=SSL<48302$8&|C2TwK|OFvH>(21J*4D83FD*-ul0UrSr#Y;bzd3QRP+0 z(#Q^Qu%d+sXz_*^*PH*WE3`p#Mm*gPpgHoi<{!GHkmaeMc|b^$#H>^tyuK790`8o0 z@J~6wzwN;55{NKFl}c#>gbSJ~gp~9@Ub`cNLVtk9usdDp;^V0>>d2r-gn1x2!=YFM{u00Q14OH-L^HVF8T}1oSqm z!Zc67)C?Msk^r0RdIdZd`M;DSiz$n-x7i$|>&4vfQ2W4_zJSedJpi%~eEdF`k71t` zNGE7|M*(IZLNmg?tCz9arwg+Wd^Z8u{O*?K1@@qW`B(yan|)zsAE|{p418fp=m+ri zdkLT$VSGPyvvhQ~G$+_IFa!nkHV479OoVCy-x1gC`T;yu(Q=?f4CH4nke`!4N?)w} z1~K{&=#YFQbuzF>3djPh&IPNkhN?aQ-hu>naqEE+rQ=9^&=C~9%@rW!pkU#IxdU`d z3zGR@ckqMU(E?KXLJ?*%_)Z6y$zW9?AXQVqs(yckxb^@8=q@psDr1nJ1VO4+f>m9` zRE3BNuS?*lfc1l*i3)6l5Xgw#U?V2Mi~uh}0$YSIf*oQ6B-wPjeu3UY22u6ne~C7- zK*0afFTKs@K&FDi<7YM42ffWNPyYB1*6Xm<1Uyp&x;o@PI4t1;5WR0;diTQgf|4s( zFT);~UR%)ayArG82Vg>=0VstaV-9dyflPk}ft)g#6SS-^;6(w^EJP`uO^J}B(IQg8eJ(ueK-*q|UfA-1)pZ^_*8BvtB>1%z z|28nI`2b@Fn1SC-VF53GL7dci479B`i|Ivd8LZabf~FVN*@5_nrMEfd^pF1mL0Psh zUZ#PaLD0E>Hlr2OJKWa0I+yTn@g=8N%&!-O=s3qtkWIaoDcz zJ>3BU;HC?Y=Aq6DmaYft1i`8N!2i-cFXns)Cv%W|08h8;0meh!u6sH`%pIMsM?gn* zgHCt>-S5!tz+>rp0<@g&2>-SKjpkEK9RV6(1w5ef*dyHz5+KbW`uhdN3t%y@K}Whl z#vSQ)5U@N{#sks;a?cTDxlYgu))U7MJlSu;(J26nEJPH5)?&V9-37Ws4YIctqzJUz z6|~_9G^q=T7N`dPmX%Bl4865y@EQae&_DQq>G&bg_#}6IYWWv$yx&d0*ffkBx zIQW9KJEZkYx9^7Lhw}SCQ?Qqxb$~I8K?8Th`Muz<$6|ec5-|&RL$P5DSzid9vc>KT? z@Yzb1$7`M*Kj6X*9Sb#uI7$;fZV9?NPvZCiQ0{?Vq{nsq0LWRO8?nHy^{%@F(PVo3 z01v30z|i>%x`wv(K#44dAh-r+3r09Z1gy#Oc+GxL_4_}I;f1>oxD2 ze|`oA%_}fg>!lK2Rgh5g3l_!)%^VD!51J3~AAG?AUQZ2KGzKaQA%O&4q7M=71|1Cx zzP4w^yw{*r2?OX%&>}c2&IAb~ocVF?Ksyt3!UPs)f`k#y^cq-aHplD+Rd^^7-VGLP ze!~Ke?v-=M3dd)f*E&B@Csl&B?_&u^kT4<~naFeIbIt3Wzo_8M<_K)z2oi*aW8!RR zIHEKzK-V6q95mtRJa!z^a%JdsV}Ue6dfhl6jBaol+}Ub#^Z);slAuxTH$2^2LAn~E6d;BVau8pwpM=>WUn#e#QG2PoVET}2Nf8TebwL8H5^AP!u&O-W8Ss)%h# z6q<-(i3gg9QHdFvh)IbGnn-Dh5SmDJsV34qmn>WsTm&ofLnpfUTPJ`$33X;?YYC{T zgZa6;f~EPtKYw2iSPe)DGWug(>e>xa30@tT*8IbzR2;M$mNj%Jxr zsWQYNkl9pFKQZ7x#PM@)ae(@$tp`f{&>LSWD0)DPV_=#L*FwXyL=sj}Kq^AGe_xw) z!$K8m=kY_}qFSi)=fQ_ey(V0s{sY(v0WTJ{LIRL&0@OzELLh69qd`d%yf%&l;@*H4 z4<3LOgT~E|fR>$r%PolQ7rOU?vPh@JOVH*4c)AAPqYHNp#B9i}Qz4aY4F*8v*o3<`K*33FzNQuky~d5dWx)Ulv>fnJci`N8K%BF}x63UxaQ zfKxDY5x5ZnQVT8=x*d2Rr9(5=6wob-zyJR~eqai0WvayS0}r?$EuB&x1iOTN7pSfF znibrpIDTNoA#iW0xdgO8gn@yfck=^#1_sFOsbMVWDS~|mq$9fn)RDEkP!bP5zfHEZ z2x3q-sGE|8u1OFf0G|6S#n>P$@j}Au!+)?p%d@~K%l3ag14F$u)Oa2wal124}W3n3{Fa@4dchiHO^}vNL>S|Tx3DB3!pPd}3fVKY( zNec?#9nPg<-E3Km|F?p=HsA?~s7$aUkR$IJBE6LuB2q7`ONx{SP)rhlnpDffz~8c+ z0qPy_X(h)GoB?-1P}=tU5N-Q!$ZdNnwxU4Ytxl00FzdnH=Y1v|-7Gs`EtLI}z%3MT zK=bqW1^@s5|9G>*ZU)ezPKM*HAva;2yNH{xu3rq4_42|T>ECa3x^cV&pKAuz z%yZlgbgKu$OHktx-2&%sw$=lswnUgOdHevwQP9OAFnd5_eVuL`uZzJ(@Is{-Ktc&1 zXM2}MLd60!5Y~bV`4V>I#f>mYv@uW6+851(Fv){I1ezZ(@~=P0c%jpcquY(6(@mn= zO`_9Hq}xrT(@h2`hw?Wq`3Fj;1<+axT6`Yw-V81gJO6+E&-kJ97c7n6?gyvw;|B`B znXt39=H~zZuT8tbbhiWOpi)UV2Nbc4po`*yUBCqcOo9WVt$8m`bum1yDL+V0Z~W9SULvtYK@z z-_iR zMIpWcP1=I@ck=gvvjD1Q7yef8R&$sryfb3P-+BksUPO`rE%67Pk_B!@BE+GsL7S2~ zBnzQ}wk4UEf`%m_n1V(n_LzbuC0dw*r6tHdgIZKwYKR(X(6|IGmSjSWWoUH1c7V1{ zVaW{=%aD#ew1Er}0*^g~zc8@|CpAb(4QdslGzs{7RQ`feAgBgtJy62>Qc#P5p?NQO zw6D$@mT93m8hIk78$34HIi(d;j6yiwQ$gA~r?i4fUgVa>%Un^=qB0(a5}R&tA=?|k z2&=3t57nw4KX3q?WxJ<>O5o;0jL^|GOK|g}l)V|Oi4oH7hpgIAEKz|lD`XdMGo4fg58dw z^$eZhn)c->P$C95`n%nsN>oZUyWK%b;E7$kR2(h>N-+?v{h;Y5FcVZSzXYAdkM4~8 z=Dpzhyd(`0rf@s7ONBuuf{G&WohYE0m=Z^bqv3AVDbWXaSU3XyZv`3iB55DEDcyRY zgr^&9aVIzo5se1uLEJKvZm58OC0L+X87eRpBn_H#g2)GOK*T!(cwUQxyS5{yp0j~PMZJU>Yte{~(@G=XQ9i6Q_w?NHl z@YFub4$zV$U5NZn@G4%5mIM5)(qIwrS`LtsQaR`<6fj5d_yO=T1rUe7%e&? zbWerIfVrSsyzBUnAAl)q1<5t<1v!JQG!T)-!E)aH!0TWX1)xO% zur3L-=>wY@2DNX{&XRztKyDm$UYPm)XJ@MbI5xn`Sy*;7|KQ?pw_$`{J|S`8%#Z(! zH|+jDfW&ZTYY%8#P==9#0V2Q(Iw%Dy3R+zc6>R_=e+*FzT3-Yebzov(fT{)6pHNW- zX1FM*Iy`;=yvRmmM{h4EO~EGE*jOD{85kH(K=p%;U&N{M01rat>tdYB97K?m`QTJ` zKpIJzD%8;j;EsMR1Qlvvf%#)X^IlMxGV=F%fm;)x)X+T@6mq>D3f&@IyGqgf| zE#D2*1JMsw&;qV&A;vWC1xYaQwcr zbr5_|5-4*Z6ddRV+YAr*gAZ63KY#)aThJ#RM>6^XEFM}-ZvOud4g6kETpoPH(s_Xy z5*s3o$a)TR_ktCJqXyYdh-#3%;K-W(+7h~6$<#GNV(3)OIQLE0vzyLbEkm02nsJY)d1KKD! z-Z}@$+6k_MLAPvlo?tw{c!Kc*C^&wwg0~$^0hi>c5(c0F_7<=N;{{8wiTu7`suMz@ z7$X2$%@0v+3AU5p7ff|RNEEdnK-(v9s%<{Vc>DmvP7}~H{Xza7zyJULcS79?zH$`m zR;UoDpy`I1b%@{h5H^QGm4eQfhbaZS3e|}aRm}$sx*;}ngMHb{!vwV*Ap;d)MY5am z5KIus7RC#f2l;&ug3di+Vf@v6$e^=jD!6omS(N~{3KUClGnx-1bVA$!H5BS4n~Q&|WiGAY!JPUiSca9D)Lk@eoJ^5-TVc zFdjrPit&WyA%33=z3u_f@b7I0HILzDfqcVw2qFkm;jYlV1svVI?GHeWa+o*38lhIY z2f*A4ifeGJ_lmIfx+_2pfebP6_gw((@&$Kl;0?XUpozD=(1zYMa4E6?T6RDpe?NF{ z9i%z80W@^|e=A7!3nBS`paCh+49QFsB|q5sTd#u)ZCHZ^(jbb4wVXD<8(5%%8`1{b z(0LHHaJ<9vP#rIl+SlB$h8jX6%Y^119Q^$vj0_AfLA`h+|ZvcDi0e+7| z2Y)a#9%%l-$lt$`fq~)WG_bcI?LUNL$hHck5f(@ouZ6)G0$O<-&EGN!v_A{nX9Ra+S->6# zk=SV9)2ea@G|;l*4ya|L z0cNiOvvt7i4Pdqbn7sweHUYDDfY}yc_8u_X2FyMHW;=k{N5E_sF#80U?Ez+=0keI; z>kYbF?||7cVDSfFb^@5Kau?+06fj!@%+3I_b-?T#Fxvpk zE&#Jl!0Zw*+XBq40JCkt>>4oJ0nBayvt7XK7BJfb%P z>2ACZKX3qh$6Ts{RcmDr}G}XX&Dz@weMMCR=iV)C98Qbv#pdJ7ytE~VH6&rQ8 zg6M9B?jA^FO#v&1iFO|AJfV4^vt=vDjApP>7ML8UJ8-bOWiKd;2y5gu%HiM{R$(2BG-fDuuB zqS>+mWQ#_3D~JZ$0%CMC^adz&PXV{|nh!C8dV4UtAkrYaPQ$|R9jFur2N`4cR8UZM zw}P@NsKpHm3jUro|6mCRROfV0*$bN8f_mTbP^~nS+1Ub-0N3fAEqg(8SKU+gf~LF> zez81MD~I5LLJnLifEELQIJf`*@1C+3G#l3IE&%mDL<@}9*#ee^3=x4ipqouVE4=yn z`x5^{_8fv;fVp0v?bZMPFBWKh_-_fGvnt_28VBABnjK}}ZvkCH0!b)3po9YPQtN>_ zKTynoTvx!--Lt#Fk%6HbA_tnv;^=Mue)`A%*KEDbKTiJu`2Z9`ptbyg0YSaZe?T3| z|KR!87oR-A9jb1KFQ5j4X6?F>4F&}Oc7wq(Z#crh2J4&wZJ2@>JQHp(D8O3})a8Jp z1>|A}7Rb7Z?k#Y4-~Rs}-0lHwpyHVTQV3et^n0B;M%hUx?q|IykPn@bd>~nKptWSTWK9a3#4{3hY4UA%ZE1E zSSFy3k-Y>hsUck(85-aCWvNts8V%rfg~W@dKbmHQ=={-sl!#tcB4;S0Vp`M;*ErCfl78lnB6UVd~hA zyYYZV3{Yl4jX-@UaDoEgkFftgr~&|;;|{qLzS~Uzlt*01mq2;I#+P2m>`p!3#G^%s~xL#!>^qGub831w)Y8F0k%W zTX0~Mm>qWmtw3NvTLcp74j%tPBp1k970@97;8`3Lm*&D<3X0?sm*%~o1rH3R@JTVO z$qHqu$Wu2o`@p5_YZYiQ+IpZ~4q6Vi9;g?Fmyh)vkfNpTdh>sQQt{@!;MEAFeBIz; z0~FUae4s@}p!GB$-dY9*hJD_kF@o=})%dr!R6jV#z>wDb<9~@LsKx)EfBO`OQ0Ek9 zkQC$~*J}{R#Dg?AfHZVMG{X2Z(vCwK6QJd%E!7|;GY-CBJ$?wZ5T{$DiGOo@)m1<<(j2hg6HDb1i&N1Y#^&%YKxTD9n_rO1obdoN*guRXx<#6>m=9iH)D1SY^WedktdOP~7QGNP z=_aolyKaHBm004;~|K8=yVNeVjJXQh*v?O50OSUu2csi4p9e+LkJ&T z9e;})Xn6Ub7k@wKq=Q~JMx5aSI{UnnjBsfIwN%Is7ycF(uzpbejuAE&7(al|ui z1tng~L-nHFjGc$NTc*PGgIS#?nh&sa9_%~;XOhKY%v%4_rVDo8fV zVnoSi$6NQ@gsiy&&3J&=pj-ngr1&6I4H=x{y#fVZvxC&5FgiQs1uNx!(wiag4=BkzhC4AsY#GAjb_aC^2 z&kGfvRW$*9pC0jF|mqMA*-Qg}ry32Hff; zpzhlno`4t6g~9a`WJ?`rwD9E?&~ag)X*p2W?0+dw76W8mWdLNNF8qa%2uO=U_f*h= z9nK4#;3mP#`Ao27sPW*VZcwT*PbLNicxeMFJQzPT|M21OHw1~d^n#`-5fuY0Me?@@ zfybhcKvTub9&q^v;xc{!B@K9HLY9CeVNe3?ZiOgC&kCgpFd0x0gFDt?s?hb9C^SP% zhKDA|N0wkQ{+?)1%NSgt!Y5@x&fsr#1@)-Fioh)gP!@pM0CER-zOj2sGq{YL3Yz4F z$#x!Uek2dB@j=ITLP|>LjAKhTNcr*B6VM=ft<()>gF*+Cab|Q+1zFDc$?^iI5CbV= zY~Bl^yz8!lPSM95&;PfAl)X?D!V=jq|AQAXb+_~)`(FbzYj>`@Wh<;wIM)ebAAH6J zI{O7Q+y$QS?q=)8UaJU$Wx(2BF?LP?H>;YDv49%o0;MMr<^7Dm|Nl4t$C|1I1wpPB zKuXp3Kyyp5XaSksdVs&*>D&MRFEf}K7$&?-0?kr^8*=cLF@Jv^sPcsk8SwYTGs2R% zJGA72wMgMDD)3x(=Lg0EonRK@2k_t)sPzj{%D?{-W=`dA0o4!iCNC)cwt!OseqF7g z4knr|PR~IM`!Qu@xs?mC&t`gapPEef-F$mh?Mo$0WY8NC6&&?n+K)siiUJwhZ z?Es2o2~gvo1w8r&l5Ktkicb&=5}6N?8t42yt3h|{phiJGKfFi6-}e+A{Gg-cL2d>m z@wC=N*8Ss=!SF4M?>fsN?Kz*$Nt$d(8_kGeCn+;H?+M*36*Jck6-5WKfyF z@Hzx$CCFkH^Y?dxjzos%u>Pt)kahw%qcTEv9P#t_ zIfGPzs~OO`kLKZX(!(8|P8p8s1xJN#d4ass>TIC#(n6ey*Ekfd&hJ}AY$6SC)JCurZ-@dFpY zYjQzj?@XX6$L2R2fdMb}Pxua+bq2cJn`5^lFJXhG1taNNw|85Xr#bf;%bB04GvtDuOJ<2Q5660FU~E$*CYSKv(p& zg1G$K0+^d0eeVch?rsISzWD)T_f(KX^8-fc)GYrtC+6k{zd28II5BsFg8^9)Xp8?r zh?4hEB_Qp`9l-lVy1|yD9cQp+c&(2S2(1UOg$&Gr;CM!)MomyHfwXD)bt@3!>7w(&2IZ2}PW7=^>CD0*tj^HeD+!34yCO`{nwB3)Tla3!q zU^U?YMJIm?Xm!MkV}c+4!}jhqK4Jh(;$JFZ-=zTB3C9ZFg#?=2yKxgbne#dTvN0O8 zlC9-Hi9O0O5QfNGs7sU)xdUYCffCdS;8u{C(4u`crqUn$3=FSXcYsc7um&rw6#|X> zH_ri0BfNP1|1BsJK{nNb1_M9~c0qecAnfM7-~%{H1VJ0xC|v_fQHhf=g2C=r3N!39$)vOL86;|BybLqZXx7QzOrwS=h!iNVyq0G+gha|=79 zD6s-nl%PfysG>Z62&4t~2qEW1hzhjv!9CsJlSR5~pQIYwiZC!Rl(4>-!GdwbNmwxG zpuo2~U;k&Vzb(md+!b`~IKy$s(R!~HyF)*~uhrxMt!-$%R0le7tTXh>Yc9|cUCp&0 z`0H*q*M4Du-KvuW>gYi9zjS9}VCWA0U>(ZA-(n15Hy>iO1aVa$+|FwU-?1J)3_9qi z+xJW7DaK2Trx-tVi%jnJ{m}eSemAHaclmMWO~q5Km-t&gff}))A3!so`1BoQ#MHVS zqLqL9lmJLy>r!QUH`pj-p%Bo0QLk9Lr%V9%x-i{PY6Q`A5JeHDg|N^7-CNon`T@xf z{!Y-20)qDBLhM1(SP=ygf>;geEP=uZi`6Jj1UGPfKQv=e2fYSqBdFd+4+;LxcDOLa zLRf%cF(@9@hZX*C-@#mo7L%pAa1}83p{w8q_Yz-=gYJHVCNwYpzV&~hcce8R5r~e9 zJq$XAD75n_C>0yLP~ZOgKkLpLlAtSKJ43I4ZXpf5&>bq!8G0tQTNacDI%B^W-tG<+ zfv4#!kTlKT0$R!48~froGpN$-4Q7GdLfRY50bv|>1ua%%cnKPY=?;AWiWN}){`T6R^x=RAp#=rCXrX3|fPQstOd+b0&ZT4aE{n-KF{1bbZPO9$vrX!*~&_l7E{}%O(C6Lr`1D^$Dn8c&*#* z`=C4Y3F9f4-LVh4eV;JiM0Y@m4EV-l^oX|%eNwX*bUFYQ3I0}4S&ZzcGmNLYxtd=x zc5-!xigaE)_>k@RA@B%*jNohAZef%(1ya&$0-8f)=nlQY_^DgS@?yOxk|Km*&4*dK zg`0l~l`kiz(qoITs%DA2RFZAd2uNjbPm^{E0PSLlXD#)M?bvOf%ZfzKpTsC zoBx1X3ZO$YkA4O>7G8^jTlE~h%`#_y{114s?#Tk^%Ap)S|0>MI{TCurShM`0iA_4L$NZAa?sjO!}2LCUWc~Ptm z@`*sVD-Ud4BxbUdA4u5^a{h4wC~-f% zD9He7y_RykxbOzt-0yV#0J;E>zoiLOO}l=8AMdPPTHFohg1Td_U%FktKsxAVrO~kL z0lK>9%Zu7(utBW{K$pUP0qyF2!xE6i2+AW-kh6I}*B-;nf?V`$wHB(Uln?Bj4=(~h z9qJ>XdlDgCb5{;%#~YNemyh7yo0W{GWubDbO96tm$NvQMV!G}zs%B9nZ1w$ohnO|o- z*yI!7&U&}Y2A*yQ&~lJI53n%C-Ol{2`d|rAZ=;(5v_}Hmxd#pHh=C=*)*>WOm)wFb zD1XuoJ`fA8)zb9|zpv|)PS-2PU2lM@gXUVE|FA0vpMdTZVFz!5dCj^LG`@imb`Tp5 zG{0d9{9k${-~}HG_@IT(y>&vP#Fc0gt!N`$e3kn?L8aaQ(kuT<@4UFo1P!{*+6U;N7up?q2foe=5{%8YHyBE6 zK{ua(Zos<{@WSfPXHdTse4Oi*gAbTNU3SJS#()<>f598Wz%|g3fEV`Lz`3f^^#RCr zp$|HzfP)6ixzahM8RS}Y`voCxujTA^y`t^+HjI1$J@p>6F(T;2vaJw@9S5aB(AIj))QmTsz{i##@!Dzeng!IHM?0xL zEcivY_q+d%2mhauWPoML?obYBuIAr=qxCj_2WXoT^d^}Mmg!s+^HXj6x!6I{SUSM`I+cPfO#Zb&%nhK0lL&O@&wA-B3R z@o&Qx#88jn+3NvSfyHR>O}L$|Ke}VTyyk_BCLLpuU~E3jXdU~b=G}w|ppG8Ay$5NL zJ&Xj^i5E|SLxF!g1Nh=uP)*nTLKbvONV_HrY!C2*v(P=j5DzdnKi~lE(B=khkZ^_E zXv@((xdL>^6o@MTUBOdYcHH$1sPKL5-&`xeP$JYF`lh$}g*^j9_9Y$03*7>*g~1|E zU?R;21iA&fyFuqhL2B8~W1yXB%%Cl1OpFJ+UEg$yG&Z}wVeEE&)BJ;@Y$d9t#~2u2 zHiBmDK)1Z}@VA0y(ZCff&x^1pkUZ%6qPg}31AohHaDD#*QWGlhx1I)#jy4xS&vb!0 z`{iw*sIoNsP-~(pH6QE<+4t2Y}0WDMaebYPn4af&4br?@I9}?(f0(%N91o9@x zQw-f8RbYSOPz4%3EHMM?1S^B-6aeXjgxN_Q(CI6dhf4Un!7c^2c|cA^gb06|FKFd; zEz|?A)4TDyUZe>cFTSvNf!Og{7;G!pAs`X37c4K7h=AP(_Zeg`4q%#y@dUgG zhADmlzPbb)X{G01g6r91Qu=V~Jn$4@drfP`UwKil)%~!-l{A zEa<4*ANu?);6)}sO!-?u-MN=PLCFSWBq(bjIj0tM5$F+tmv@omIXYcmfC6GWXl7t{+~@ftsxWA|TR%!}3rGSGVg2*qU0`53mKbt{;l7zvi9rnrp&q_6blUP+H*O zp!1(W3o>5hg@THlxMScVr?a&Lv@im6)^ovsl(U|@!7{KSX~l6@(CzdL&9y6v_}kZl z?mc#0aqt0CcZ)>AIas*_*70%^=+0{}6Ox+#Zv~kQI#8()(!lO?ZRvJxf#iB?&@J69 z-3}}-tKr&S7QmU{hX0=C+CAR<{UFCf7azMeye{l^ZRmDTu>@OG8V~02v>qr41#L?! zHEiAsvXr4juDcb)fLO*YK%&((A1ceXrPIdmWZK= zRP(nAfmY-~Gg!mRSKxx6p*sL{+$ktCIIvhA;%_|<6$Y(}=WhY+5hF8YfwYyFqPfBl zbhatfH{Ag&;B+VR{f6ZsP=09WcF=g4EeN`MyrDZl2Cfy7F4unmr_1iphVCGZ;|IYD zD><7VGPRyWoVf-%RX89hFw5n|LPl`py_5khy+KaJ{7vj2&w^v;V0mOaY6f>x@z%7>@&V|7;6rnN_#z3`j1Z+y~*7UEQ|+W7rR#4L#D*QHMB954OInd2S8?KrLanLy3To> z2e;3qGzsnwv(m6`*BMZ|y%BbUgplkuL>LQ_LD(mORRVNrG^pD&=YQ#p7Y0G#quDxL zTR`ambUzlfjdy>Ac3j{sSZgx&t^sc01rp%|QWyS?(_`{{sgIXfIj7i)C-Y8R4ZP zXn_T4(l&%AZBQV*VS&^^;Pm_ka&dj9>j9|c4jioqN)+H6)Wp3Hq8hf5%Jm3L9gC&w z0nok+Xs}wk9s!+E4dOxL^MC1)|D^{4{+F(JAq#Q!%Nd|u3E&`j*$ZbvjvtJIn~Q3{ z9mIZ6l?m1eI+)6}r9>O59CYdwlAVxr!}Ma!UvMx%D|e_ykT+AH`W(>m@b&MoR0>xB zs#IX5mIn(&7~-`HP!71a^1rktFeu=K6~xAuTX|pw$;(wd3=HrD_Bsp{!vXN(8MHyj zzB`l$KJL)zx~92yMPvzEbM1=gQem)ak#5&DjEA~i8#)6-UJHVR97MET*MNq3K|;;Q zab7eZ;wp^z{__ppYb+qIK?{3`k3d6ApezT9EI$TFf%%#n?vn>_CURc$gy%JgA+YWw z59knUQ2KLVL6raYx0uLI22i*kVUO+x{n!n{fs9ywG6oX9(YKq~3 z`xj~pHZ7K}Ev15R+d5raUV<;5fi{}rk=qPRB>~7><`PG^KG66QxEUb@DW{N{5f%?2 zDexGg86o}~BIG6m?hdxR$o7N?xVF4jL^cyCv)X^f7J2+Fpfju?TF`^I({%%=aS0xD zgT)AFY;p@o6x_bI=5GxIMV;#gYu7EcVco79P=+?3OFA%j>>ulP-9nT~%VVWH-C)!C zTc3jpP)G(0;6My~K`lWZX5e3csMB=;vZoGoy6!+|fsAzKfV_d?IRXPjmKQoN^820W z4&4FGY6R8u`ybLg*m;7{bwRi54p3fe=?Gxzb_F%kK@nWKAmD}03vkKX9oo|A#M15B z@)9%<1aUg3EC>4+5-|rLMUuq}DHce!n!*9kR-GKk1%x6ff1^}CpgWBk;9VW$2KW`I zT@Gk%6@ky#k_%eF49YI0E#QJV337Dz%m1KrYrw94`GpDzzB3R5POphwJyT|jq-PZ2b!!A zt_bY_jRtgwb|9vddrbsEQ2_35fNSKakB|UjYj*8mL}+EObnU3wdfXLare?Qm2YlY` z3gd-t4undGC6)(E#ju!g95g8o3#4w4p`fl8CYG0iOyEgiesqTDnvT>W`L@K-Cz^I`nn5v zpt7*a8(d}a1peO&()oWYNJDs7P(T(#mf8ykaMQs6UjOrN1Fd>w1}*UmZ2`?_@PJ3l zAS?X7Lss~?w!G9sxD9rMuNi;q3(!6rc)zC$R5ZCZbfZ?v#W2UQ96taWiRpDvusl=} z3l)Xl<8}hligYQp?sh!^>b^jH2I@G0=6+AWyJ&``lHhDD0#XNV_G!ZEb6oj|zbPHG zsTt->&g&wWG1Lz2JOH@HW;I{22Q~oj3^;MBM|T3L6Vy58JIkxAq0{?50i(s zaS-)=XVh_aL0)|G790dGx#8L%B{jmw@Z1>`@M0fCH9Y-6+MoO_3qXknY(GRd=tdDx3+jd4 z9Iyl78i+}-Fms?2Fx}9U4V|k)Ufv4IZ4eVd3x6RBF_*Zyw!GA3f>$$2ObiSYxXjg1#b}mJEj{_q`*T0TuyC*+;$K58dMReHR;z} zJB6Xt1KhA#@uJKg8U_!*)-p^39k@TC`2ZvMS_c-;B`TolxzYzOiW)!*Qv|wQA3)mb z$6Z0ABe1S`Xh*kiOQ+8SmY3EDce?Vof)3I??z#k2)*g2S4T~|n1hpceQ4Vo>cW4i& z#@WnjRIV{@V2y@3)6 z1$I#3JNQH4&WoISXeivl6$&>%p>W(4H1v!VIN;&t9%vXfyY|2;4`>K5Si1J`_dEj) zoVj)|HoHz>M0SX!YX^T119;UkC{>{>F15bJ!+bbV1O44uP2?h4wt&G51soFt(m z;4Y=+kTG*e(Ps#%1zv!ff*@CEfX|o!52=I4b8oXeqj(FTzew)H`m@_;BRRL&3%A2+!TU?Nu)dU2B?As>4OXw zHr)ZY)WMUhPnr*KfTni7fbaf(^neMpzX_~Q1GKpA5K9(gKoDrn%yEd+izg46Ko|Om zf)YjO7tmSPpoFKc)kxi;9Gy;}ML^KSKQMoM z0c|Qr_D50MYsLx3!L34AhA(05cIAMM6+t@3|4SddsCottkWSY#-L7Y>T_5nbyoN?w zsWLc$K6t^#3SHt?30~P>dgg_n6*xh5x}Jd)6)WHY1PL>_%9HK@PvrX6J|F<<)1Lt+qPh3LiKz7es7=Pv9eSoSK;SheXfh1UgofR5@JuNvkl@kw611Ka z90@WY(m}-XP>BebrOKia;|oSGvKf*`bDmG=XCHN+(nj zGz%mT7wra5nxRkDB1ubt&;9Inz0w&V(Tp6w{7o_c|No!RTzi3`L>uHK2hhC%iXaxq zCXQ|g8QA?IGoFBB7@Txuz$HKH3kl12|GQl;pf19E;otfCKkLI);C0>n+lA7ae_51r zc879w2eEX9azG|OdxI3f+Y0tDFhEwOz61@!_D%p#`JUDRE%^d1x$XtE<|lwB@l zhZMSnEJHa;E4o8@AVzDK>UW3obO&)jxGtp%5N>x63rL|5j0crBEU`th1hQBhNuXP( zw*z#BQ1)jX#*fVh1v&-0CzKpzU;r(agfI>>cHV0K#lhbOT1khx90|(-bL01uVx;}vxuAM)S&ynf;iLyWv>F}6Z5rz_^n+*4Xu6=zu1+-fO zeaReXAzVi}HklcqO?0u?Wcc@=fX)Rlbix+o&48{<$$>4T>4Yo2pal7egJtXp#tb2LGVepp--SHK|@O@N?=P+V!Bz!@}(7|gApc|=hX|5M&cD=&_Rtq|(?-Zyz57OBDLx8^pblL-IRHYqf`2YX7>kUxd z1j>me!r(R-=wzaRuoqqakj$N6^@)-ePz0IC5by84uj1$0Tyh69h9pmqb`TPGrXnPvNOL1_@gI*#G zOG}`j{tX@wMw0;byN>hs+{Y^C!2;XY1y7Wq#^Vcx<{$E9IT&(~9vf_M6cp~Th9M+5 zqHbqHUHAo2fg=%t5-gg#aoYt+j`-|?sK8+tB*B6vX~Ao*TS2FMLz5vm!D6ON(9X4P z2FR+}6Wt83v>An&HXpp!>vnyBmNv0#2c^yjEMV23)OiA&Iv;>f*eNl=2>G<*4CV}I zqLB4F&=d>W2@X0X8+uLjG5(&L;I`5YwB87~IF)(9*!=oG>*OVp4BfFD{M&{3w}0vl zyVCqih`;?D0|UdsM@-#Qm{KnM_|JIA?*AjC&5)p@0x$8msDRqv!7Rf)?a-2eUw`88iM? zknQ~2f|>ZYojQI9d_jjv7f60v5R#Bcm*qA7zQv%!V8BW*b#DOOoZIcq((TCtTH5>( zI%3T-p_B1--Gt7M#}9#f@HSnYwNF52RzN$}y#@bY2X}s8c6|cw$CnCqyKH6w?^-+u z>iZoLcx?oibuCo`$#ygJR{Vc04raRSfGA!FQ4Bc(?P>En#@26@E0I>yd_mr=0orNU z-1z!GtLS2IXAs=L<^e7KbNvDu5Oe*}?ZBdWsPjUn>!0S@KMbIj;h)!h-L7A{1-e~- zbTfeDP9BEt`2sJ_nZv}u@Z$c7*Z&)j9b6>Ikh&1O%ggnN;eq3=DSu(xrAwf!-g%%+ zY|uSk&amr)ouStUgH}K>yawH)7zf!g0o``;4k96Xyyb2O)S%8ecUwR!v>^LZp6v!# zr3b*}40QGRE$Hgi8J(>aAeDPTBm;j(Gbs5$gdjytCcM771ziDyJNrWl5`5VosseK& z=FsbO5-ft0BKRzVs=#7VH`sTeeZruHbKv`unrk^2N_>tVkOA+L?Sy%>^+2ULM0NL+ zqoANgRF*TqYw!**b{;(VQl9a|#UG#})<8kn2~i2r)*HasITa+@-2>5o2wam2b%)I2 z=?)TLJcXj#x)tOg{+>MWNrYgP4BakZn;2U`Nu>EOBkZbn%ftLV2LJy52S@$Ob>O)~ z=oR-8Eub9}khIV}6|Czz69FlJN`#ixOh1FA_@(Z*;8FDBA_%d2(uy;dze}J)< zhXKvT687B?^}9ib81%AmK^@i&_63IG9SjUippDuL3=9sO7dqQOApi+NP}S1g25t&p z2CblFz_8nf0V;nQyjqm;7c}yqq7Yr64N}LuTlRqr?rcr?`~N?Rbn^pw&@3lI=fTU5 zIxld86?8&WHy>u~ywUuFgTJlxKQvxJcfTcggId!wI$LW%bq0iN0Vk%`1EAA6L4`1_oS3jv*%;q;fFBa&4dK42NIy+srAQzji2S9z!59>qE_pou{aAm%IzM zyW~NFuwJI9Echxfm;+I+lBK!pJa#iM^lrYe7x&?upg}c;mp?&wo_bw){~ufdulxYM zTpT@f#X-gavaf@)59nxTpWbHhLT9ju0J?hg<9X#^7nFjoI)*N0Kd-}hqEq0dC46lk zlIdblH6YU=?X8!B;2I9KKuJb%R_lS%Ad+0A0=)}W0OmT)Lr{C6ZUgmJ(5(=MYGUY} z4DQOG*I_)>$@IDuMP2g`@6u$bLh9bMit0kBb3wt>&Coj;93vnHffv*xg#~yiI&{H3 zT)z1@W9JWWsq_bQWet4HryIN_u=xjLod<;3d8oHpBMDT@Fa`BCgZ5D&6EwZDx89WjLiqz%< z0-XX-J}A^c0V4nnC~WfGpxtT)Pz6XDU{Qafn*rO_0(i)Rrbb_awuJC+XXD>~0QstT z{#HR228QFVpmX^dK$oI}Hp8K&?`Vjp~uZx5|lpSGAgCY z5E=M@Ea)Oiuv*As-cHvOuk)aV>+4kXEF02XdxD|F4{jXj`bal{ZqVo=WLjCk@=%FB zTw13DWE*I!*8kEIFLZpsgP*MjO4zzxPjtGTfm(y4oCnU<1t0AUccpcy9>m?ywkL!G zabpotd?mX1p3@R*PrFOhHxYX|5?E@;`*}+wjJFLC#4sEaV zZ)<*Xh=Bp~7EH#l7Z-Pf#w-*dwt*55f8SA1%iE0uw5Jf110EcAy#g}#CFm3eXeT)I zN;k^{&~O6iC@X}R$b@cJ(4yLHpu^)U!KodzHw!E?w*?l zfVdzROa|!=3V6{0)$4i$?Cm4nt{W^}kCg6)q+Z2R1^kuwYfp$m`BDd{!UF-DOgK7^ zce8bif4`)7p_8rGjisBT*PW%C;roT&Fc!rVolL!M9NhxF?i?VY&V#*f9Eztp1-eT& zw0`4nP5AZyKWfwO=^l)xA9x%?;KgkvP$Ta2WJvQ5yu9rIXm^q&WUCv}UOk=(-Jvhw z;{uik>v-WxKsrE!^A0SXt{fmy@M=GclHDLS*i6`v7hyvn;cmv?S`W%;t{mM3EY1JC z>v)d4z5xv^z64!+-Rt%MG`<#ua1c2|X(-pEgZ66vd>w$@L})ja;0Q0KiJh)*V5cA@ zBZ`p{jc(Tuj2|EeTY?Iw?$8g6pPC=ZgRT{0=)8FOdFLuWGE< z-~j_jS=#OTrZ?b!XXu;O1NERIO+ecwkq*iL9o@lE@cKXNtckE`6#o6cAd?>a`#&8& z1SzpZtoZkxf^&@c_g&Jw*m=73b_sjujhCR4296&BmwF+ES}IL^TE@((!kVl$K(G# za}hjyf@Vv*U7^|2f|%?HE#|=)G>o(i3T{DQ%c6WZ%>m`TZuBID%^Z-zm&f2413g_~ z&7|1O0V#Z0htnKT{v*ykpzIF1rwN|?KpCf-SFM4HHm?&BbmAC?^sZARt3DAckPivQSrpGc87b^u?ARA*UxS zmH=hP$(`Wr2&z_EAk|7J2bRO8xWMClFLO8<7@ENqlosg57g!ERLF51qh)JL@?8atN zsYkafR1GNpu&Ysls{#26tC|w1i*9j%`t9JuDqn)H!v&iTs?okcu3cw50k8P5c#OaG zFE~+voP@3klsB;2&EE)T-rus7*JeptIWA`G?FoBt|o{fQ_8P$t5Te@9&K&Mc+etBJh!&q=@2TRD6;tFb9 z8er~F$KsA=NHFt&?h*$FGbmm05R-zDoq?2&>qEA0`? zUdB*2!S8~1{Zg|95?T^q(_y(BB?<{S>@Ik{Ger)Y#SDo-EDoy&9b5)E2N;*X3FbL# zY{o+}8s36L53UALkbuts?!0*Uapx^?*BW|k?F}aAEY!<$pjAN>I=Bne#=|TmK+)6P z0_h8YOFlHmfRAxG@X`m|B7-U>Sa-=0b}zw%bqloW4BfrZ)0=S?X}HoAa#@00eL|XV zSjs?H4gsBR3@Tb7S+1@FlCteU(?rntz*V|}8&g=)Pyrm zKm#?sVAF;jOU;5Pm=N)SwFr56l8CaD>P|*4*5R>E$hFeoUOA}T!6-^_ zIT98(4?t7O(74HkSO_u$xjF)kPh#yY;4Bt!S_(Z`IuB8K)pSEF?QVgL=Yi8d);K{c z)*&f%GnSO5i|{i>sQ)+v&xv z33sO#XDfxj6?dl>cPv6HR`h7cnZs~JJHcX74YMZ(>GZ;r0HQ5`y9mTxOd^Uv(6}EY z$)Y7C*!>W*Sz)c%iQsA&U!$I&zx<%xGL%OB0Q7W^L2FxNcQivAr-Qqlz=P>>v*xFSQ^O%n++Ygz!#FZ3O@QZMGj$BdytSE z66t^im+K+zYtZ$5L&6_6nB7E3ED%xBk&r?`7tew_M=wuFL< zr2dPw>j$v;j4<a{)VU*g_zHVUp?r0cZm9@pl*Hb8-@}da44{WLIDl;DE`4R(3(;=R-_k0*4$UIOJHtYS~KpAt6@-?c-N~HM}kanq+BaN~A)wdx*izaGa7t^&lG1dKAf+^gwVVv7dtO2FroaBZ`rml?RX(I; zSnds}7$ft+EBHhL zUbvWpSFk~@ngcHngevE6c?^mqBTFG0tfzzQ0Wb76_% z!%NV?MHn(novt5V7h?!BgM?#_yME9BrJG=6`Q`%}AW3^p%gEGd&9PkWg zcT2OwF$U1N9d*2*U8$weEXoQBCWcPeJJ4mYFaLs?cC{i5rEH*MAWFHrn{OOsVCZx` z@|yj)>k&|e1ziXHay@9c2eSSslmna{9(21NX+FT%-3_|`YUcN!ouNlyk&(4{`0#f&ZB%X(%s zKahtsArD@D*7-s40?0HbutOn9hNIhN0>Wey5F1<@;ddX$|5A?dFpwh~!6(v!HYm41 zj#EK#Q0KAZ2SK+xb%#EHPELL37HI@8w#4ne7Vt&Xt{mMh%?pk)FmxV6QqRBt0`$VC zW1xGWE`aZW;%_kk4Pe!tU??p?QVY5Tv3p80XyFO6D3%au`2Z@QkU|X-mL{M9EhJGa zI$O7)>4cVMpi32C?mtA`1!bU174R8NesR|6dIglm`CCB8yhB&gfm3qx54O?-#8P31 z4H}>YpwK9Sd68v8^8xnW0QS}c{2qr6{$K`g<0C>H;{otp5%|0X-J*zRNhVaqPVn}A z)}64;{XfCpy24n>5AmENBLlUhbSdLl_0o5=*!W~ z(g9lN9`L{P$&18$(6XV#2x47#3*@4!&?lJ7F-rNGbHQuC8TtF&Kr5kZuP~NKG`pUG z-X&$}dWOHp>G%Ktki+aDJ4Y;C&(sJsyPjZdu06rX-}mzu_{M3tT&W0nFL=vAc$3i& zk`qA7C-#8~$P3`pJS0FX!6DT;A{|&B0^R5a4}Ea(!LmE#ES<%E;7S0zg!@Q$=mpT- zHv1SLmswqSv0fb9g6IT=HB8^}L*Q%w4)`!0>UMnsUG~b~0^WNBxe*Cb%z;+xmxv+r zAsZMDfX@6mkgyxp{%$=`q5`@f2XxWg4ICDLk^*#jJ~*#{u3AIpLruo2yQHk!^++eU zLIDNN7I1loh8-Ai(u5i3{&(Ht=L53c0J@6B{ zxBCFYArp?BpoR)~t7WG|XAH-m-T;>7M}IUgFdl4v_~+nDrq1h~H$JaEe!u~A_wHeE zaP0zV>Ac^05hT7~p9x1NhIsEh(C8hm-QvCTK=l!BSI}7> zfF`hRa4G~H!Pfc#lrF&}v~7?Ck%SZsuzeDsavo+pv?9Z(>bhGY&O%d%QQ^H#L$Lwo z8}Q)}$o4?$am?-d==MO>Vc65z`UUQ{&ek(O|NnmpULFT#cJBo_mVbMTJG55g@3;x- zmb9*b1`(tZ1*?MWeCqB6N%3!E0pGRM4N?s0T(Weu9w@DY7BFBAd_xpS2EHMxqxC>Z zc=uG0z0lUnT#$*~EHgR}c7q)STF!I$_#se}wDSbx0nkmN-7HPrQ$cQTegwHT8nI-g zgzGpsLP2FmGuYjXu%Ll%uL2A5_n3hyRj>t&-BTg)4GI~?3zlF({+^eh^Dg#+6Gti6 zad6rI_h-O)4AHOx@3rS|NeA^IVd*Lg)VT!f0H>xO;1CCq!!I@cf%~nq^}^5p|6hA| zgXwN?AHGvqyvGkX>@(p=>l7(CegIUB9%tDA?(ZE~um^O?=mtoy zUIBDE199OhCk{(IU>&fe`C1ev4AunB1KlhgkW3575}hsG zppFnUO|x`>n&WARR0GMLs@)J(aCcy|#bFCD4fb_+OFPI|oEjJpyv~3+1F9a} zK7p%8E=njZvLI0m^KKugYu?=gra+sS?V)T-a8=Il3#K~3Bs@?$4|Y!lRqw|SJXmYO zaquAv<0()d99-qYq7&Q#0Y`B+3n=ysyXR~N1p&0l#j^q0BNy2KZB(&r=yqTU2K93f zo(4CzV8sBqg6O;tAAJA^5P#2}zyJRuL_tnhM{qk2b>8o756^?_#)c%WfEU_RK_hws zkN`M-2;{`xR?w-9otGhvjpLp7Ixl`+3RM7ZxO5A2hVJPOVCf7!&>g_h8G58UfTuI` zM0Wt_&hqX6k2!SnX)ql>1Zvatw%!4`7ppyo zK#iN;)|!9+|D!tuQfM6l<%r%^ng19Hdbg_l`v1QhtgLq?ICnBbwloH_bPDu_adbO# zbTajB1?^hwoe63Vbz_w``1SvP?@UmG2)n!uSRT|Q!Y=OtmIpP8u*-*l>jr0i{_QLU{QGZo&Rz2J z|9@yNg=I$Tfl@hG3j@Rvg!V{4GW;#S_!t-sV^&ZV z2#b{MCLG;cA!cttGKv8t4lWlv!R|SJ04joN6zDu1ln_HT%9_7*2B?+uhUfoQP{-}X zvO;k9bha}5`v1RqFNkE|Zvl_2gM}b2kmYYp1hcfKv6j(N(O0Y}--Tcwn$^*6yL^AMqw16AEQ1#sfEQm@TawQ4q zkn8_jL5lxx1=;n2uLXSO@N2eiu-)LxnjpdcLPZ|zpVk8~;VhJ^^+uQW}7z zWQgmaDWSU;q@wjCe}_M4c?r1v)!hc#K-_r>yn7gYHbRRLND@`JyMm>=WnaQ>28K?s z8I}k6TS2Sz!KaOO&uIf~T<-kQd8ql3Jh+eFdGYcC#T%gU?5Cjd>}eo7y1@wxdi58? zU5Mc9o(f8;uy)l1%Y*zqt3f)!*}1!A9=JY-j|E*|`~e*zZUYZ`gLVf)az40M0CrU; zdXGS+sq+Wu_^m@|E_6n=2h>D?v`0!TAT1A=Vc-#O=y3OqZka}`hP8eJt;qm4BcQDh zNCp8lJ;39AEE~Xsec><4PJvqP9gywGW z)Rf2uSkn`3BS#phwG;kg)nkx>;9-5x^#{G~;QjYmkovB>6UlsCGfV_C!IX$LLyUqbu?E{zvjCaL-})Z3P_y+8v`_rn z0g`!-A2_hhgrj>ZNW7b8Lic2hY|;FNBQW5FAP*>-1X>T2$~S`zL3B_-#WaH@Sg>Xl z=%`F^d+hju1xOO5#r)e_DxsaKN>gZM2+2vHimyZooTj_yG~U?@8XCglM?+{ZL6bxq zN|NB2fRS74bRmuL?sl-3rh>{DNQokF`~axU*$pm`Iz@K81f8=22@YsI)Uz36I%Xya z3O~k6rDG_8!=4oya}n6J3%=IH1cbX0QZVMyxj-U4oaz+_O1GR_Z>@aSxr2Wq4=L$pKGLKDE6W>}?O3);Q~ zZJ&V4{9bTs2aRy>w{fOWETKq^QZ{uaoogD9f5 z{4Jo)AG8#JsWs$p0iVqPZ7)DgFe)iPQ)f~FnvVcCW}s?HL8mgJ*ic;pKd=U>#-&69 z%^WlMkUPu;*8HuNpeh7h3_>HhWiwLAstoJiZ2-*F(JLNg|+f9^ATuxN=AH8jdXQVEiVCQfM52bWP`XM*GcUOX@b*T0>| zUb{gQcHTRVSgPK6uXoxW@G_4DVhjvm9%xeshymT*;j{?UF@)~!Fzx1K0J-xSxH$r{ z0FsT6#@8yUp*aJRe??|MJF_e^z!k~=tsq@59-IaF8dPHVK(jl~3`jh6-s+ZtPXBg7 z+LWLUKDcIpge|y@8Xg!N6aY1=^)ARP&>`}^5Z6Fs3!r<16||_ax!0vr53hL27 zM`#y73fbc|n_It?B!LqJsFe!|H%M4@{(jM^05cJ^Fak8~4v9LJ8O=Yq%2hyv@GTZc zK#Mhg*!_P1DSe=YBshpWO(sCBW&us$fRcwcr~wak1FVh(4=R?R9P4Kd4nh7F@Sz=G zHgqtN!U{eBR|StTbo@F45(=;=LLG?$B|Mn(p%pj5!EmTL44XPzMLY`K=fOK!vngN3EZ%U)QymO7u=;S6@d)M^KWCZ zXgL5smKiqo1x;V5L*P?BfLc+Y(Nj>MyacVBgJeQ1U2kZ?18QNEN*S2UP%SY;=e2 z=@jS=JaIs;_7L+^A3D1cVX1gOC5 z0XI<&L&oc{+5;+&IuAp}>#!;Sw`~qX#_O;s=-mz)r|X>y9=XFd8n+!(^7hUJjoD!v z&FS3^8mH@>3mUV-E)N=~>zxZ4v%@YA8mH@>3mUV-E)N=~>zxZ4v%@A2F1o=-g<*`% zfu|)+1klIfWSFp-1J@0m_yp-g9sMJy4?H#p(uX>JM^GPlY!0Lkb^MN?KJdgRNFVC> z9YKBIu{n@F)bTs)`jF~2)X}=;wV=$#2y4@JM!o^(AEZ$@6;MYPTz_LJ3Lt%PNI}fM zjYXp60DlW;aVoS-0_A%Cmg|sF5l{tb18dco%z!9?7|;!BvvG&u=x#3 zcv!%TPe-76pTBhy0|P_nO=!^r=@;8<00}@^h#MfISzrN>MIswIr_KQn5P}Nj&X3)o z>H<^}b%JXT@LC+6fETJT>p1>{%?$s)71X2ozZIl6EZ{{FxMQx+dZ1Jk;>m8X_G2s@ z3@?L0LsQUz0hbftN}YcjivTDTOhFw($Qn-2auxno&YP~PuQ0{D%0d=0i9f;#B-~|%hU?JqWI<4-Wec%Qd#515FPp~Ukc7W?S zkO?oCwt?db((-~>1~m^h^R@#t^4a``C;SDAE$EC+0i+ZOt%;69E}(-~8=#v`U|t3J z40OpJwD|<O>dCO z7paH9o@_l($_ud+>P5Wu(V;)c_3CRQNV5r|A2MCm4eBq#{UOo;sZcvbI`EiVvjZuE z{sK2!KqKprkcSMDgJ;P2TRN{Ewl-5If%1}FDT0uuycYc0x_9HZ;CBPvKB1uS7AmuOCZ3YK7 zyxF`3G@cD|;Bgkvnk@!A!NcG41~d@?uJysq8H_Rv>|FlsEEW9wZ$Of0H>hX=54u4L ztykcoc&GrRb8g1pdIc;B$z3x*iSjU50ICc$;@kQLIuh0V&zryhE$HGY$l;d>-7Pag z`G^_=Zo43BBzJ+=NS^4tIP?3@*C~+3Dn47FZEUo*IL^T~EVgulz4uxY5-Z&kK&SV1 zgT)v>fER)_uLb+Rc`t}!sJ!0#pT9#Nbj~Gs3%2F3Vggb<%xM0> zSrP*+oj|=y#u7gy9#e?}^2o&R&ilR7A!8G7#2FaCJn-1W{od)&v5939k;W!wR&nCb zOrSCh^>|vhG>qeEgPY%|ys$e1TB5IKE6H%&^$9rV9R{B&1Kw|P-1P&f5;*Sqg$q$> zg+76vy*w495K_f}#hQO`^0zdA1;M!sEC?Di$^nakvmi{YB?3(h)MGE@2zYVm%NI~< z0;J6pqy(~Y=4B430(O03?fQbhB^q2$LyUU?b&ETa*pqHhZx$@?`vTl-;0OwMQT7jJ za0_TA3K|)qAOo6zFqbMo$8Nv^maZRa`H=-WT|Yoe&CnM}rayt3uE`1>dTKpT;t4H+ z!3MP+D7A#t4&6|Gi6(*%awfPG_eB`=fCXw$X$7(qTMv}h!uX)@2RT^==E5gPI~zd$ zu{>BOh^m;Y)E;`cFH8?uo$Hr6A!Gs20ZNP$nq6No!k1aNzTod^1{KW*pmo0M3;xzQ z;Mn+J?fQkke*!4vp|P|LRIfo}33N;~BFw-Isuoa-5FrNgJ|vb9-happ^?pevcw?6m z%pV~4f|^`#k3j^uN*!S;o*ZYHz=@PhU%-~Vf>#oOP90{M07}i^l=cF&r2C37q+NsV zUrX?HEZ~d`POqSZ-3q#*61t7+CFs(2L^Oi@R#F0YMmNg@Q07mDDS#wLNIWBwwij9_{uk*TlLG0r#y*>XRc6LLU zoh`j7pu3DARA)=C4TJ}xI$L^0AUqJ&+0y$4WIcrHZ0S7$;en{mmfks_8=ej_c0%kq z0PR?TT~O16aLG$SWd?@htq#yjq>i_`z*!IeKvyq_Xqsn3X1&j&d)FS zzJgM@LT4+;LCt$XBtvN`l4+6r+u75ae^{4jKp1AF?%nPz%|E>B>|vJ>c89ZoE^Pue z=vog{YM@z`#gDLU!52*1_*;0mA-fp1f^6^n{Nl+oXhYWnlr&mFByvMH37U~1!2$9m zr0)b9(+8=45wZr{(glrhL6zfB_;@Q+A!rdQ$N`{C(2Z_sW%=>e56~!k4O`tZ6(j<# z-bx(1!AaB-tO&F>5tLTCVG2M68rXB71XK7P6b7I%bDrbiPzPD~TD%#o6;UXFxiwRv zQNrKyoD-BN!8evp1^EzM$$_I65)LdgED!Ow6oA&mK<+h#r~(yrOr=rKSqM-&hn2tO zCU}wztQjQ2#NTopRfL(pWh<%(3xCUER1rr0mWdD%&@HM6+ZaLHqQGXu9M=4UmA@q% zq82oE2({A{RfL(p#TZqDg}+4+RfLhhg&!h4bVe6?=+e$^a2W_{!2Dq3Z}|;btAXlH>f2on^*6$9 z))EV-7-*F(Q;8N5kGVt!iN^x!2!mrDq>`~zA8Dx$17quf68__@d;a|Y59(ooZ;^p; znHU%tUP@u}9vhZuVB>Fj1Zs8;L^QDRLtDjYNeH|X5bSY8a$)6fk%PDsDarGoiZJuH z`~vrN!Foa2f`z~31*!-mf6Fz92x`=`V@ci|SdupvmgLP@3X4R9dztuK5+L@#+{?({ z;s+6-rp@$7V4$A-OK`InoZi?#39J#+3Wn@NMx<@_5G zkIrcR!2;?A!+DILZZMjc*+5+}unL6ve5E`PXMuwLwFHC>a`9`ZI4IA*=7aG-jz{oN ziqmdL;$?Rf*Gvb5}dI3d)*-!1e9f9+Oin`gX?;TMo^9Ku?u_)9jM0) zx^=mGD#*m+2Oijf?n|7|{DYCd6?EnRMnoct6`0xJn)EUvC4f!XBFy|P zpi@hbL|FJ+=A!CiZfPSnv{*dg&%A;%6v9|3up`)EqVTynV`-;STEEl{?<0Q5M&W> zeFa>9cS{>+KEL%qNeZmxAKmTN*`dhtUOe3@4FTu{e|f15L?J7fv&_LS&#JF|fAWP|0w1%lwt7NisP z8riR)mOI2Mh~F$qMWI~qM(YC*6HCt`1X~V(7t{Rt{~xlP7OJE~A&UVy17}%uetvPM z7-}!b8fbq4QTTE3w}Y-b0k2Il(7F8MKjR0x{||b>z46Z0H-G;Be<=e_@8Et4Bms$Z z^tOWfy5MzwP(|OtsT-^aVz|hR-d0e*7+KLJgd&7VpdK}{qO}M`2$Mj4ab!i1F%qzK z2$Mj)cqB!y(|TJ$LkSQUzK-Z^1q~-ad0xHXp$90>25G#sciIK;I<62&28P~gkP~{R zLB>ftKfkD{L5!4ketwag%E{0T4kqw{rJxe?SR^>SkGI}|_PLT10LsO0SU{VzxR*owwfrp$L4$$N(I1Y^)-Qkl{|DtA5Z&zn z6=>cI;xd%*cZ202nMkSRCRCiiB?fE=ND)L%mcP{#E(G6ppv~WEj4ayiz+!ovzZG<7 z6~y3f$bS0H&o3s`L3h;icY<;c=+e8bAmckfziAM z;edo~z>7Ot;GzRG$g&q)kby=uz&3D%2fTQ!4VDGhuk*mtAmhO+{y9LU3TXJ_@O5Yz zR$32tAEYGej9`J^p&icB?J|J}bPL}PMo{Aldf_!pmw6=Yop1Zk8F{psOaq zH<)vDyR(4y)uwd{fJRQ-??fK|P_?AJBvk9m|1aP|&O< ze@7HZ0c1porK7Xe2RujuN^+g8e?Z%+_Ayj>H*0Tpw#ihyUyzP0fmDm9NhwN zQE>Qz_Aivk;gW+G4o$M9W+0#Z@UGK?Dre{pX8{)*U_&G@MLSzTu7ZZqRIr;_CUke`EwXo0zB>_Wl76VUgK&BfNzyc^O zRZ!y$6iA51+3F48##v`;2x#PSFNg#Uz=2%`8kuwyv@+_K=X1GStW`Q`tG<|CkCr!ZVPnh&smqt70%0whzxAqg=R zGkj7`@ zUQp5ld7;Fudn$;1`~bsdBhcwm&2L!#Zv`p+zZL9jaOn;XQRwXaMsKjGhz$J_bpH`F zZ6gwV1UP;{B-om8X#R#MfX}ypvPKLj7f%JLM0Es69OekHgFq1gb%YMY5wG>2Z4}7h zH`3Y*@G8nb|Nle$^1?v^Ttq^`2{r}{E{96J!SM_#Rv@XT^Ye>mFQM75lnC>|wci7A zu=$;zUwpCn`o9xAO5geU#W{1NphDeJ8HTOkL7ffo0HhyD3GAd6g}0-y!0Q@~rU;Ijc( zmQANX?Gf35+_Vh}c+scI0J@YFRN_OATw?_ zq?8qa7~Khq6-0XgR0U%5Gi2cx)a|VY_&cBrzYvR)j)9vu;L;El2xk1PpmGE13b6f< zraXMl189PZX9sj<5#$o64WK;%K>;t$%>&m?tp`f7A+7~4bK-!`8+3ktvE?;1DU^6Y z6<~x^iV8TSEWrU&s*LU!P(J|Lmw5427OWIHFAFKtZNO78%HUCN@L)R249nyEEkeiw zpi-X^S)dc#EkE8W0-X(lR#zpQ5QcfF6KD}!78j)J(fRpB=qIp0I$IOKr9X&dD3OI$ zQ;_Hbc?=}p8Nl*#3J0v!W>K2n?al&8b7rN{pz81qO8}C|zdvFz*%)dvq^=X`fX@Da zx5IXRev!osECWTby`bS`{%wwsJ|sxGM7G-zTKt2!ou6OC zKvjc{I)1=ms|iOpED%5$Y#kE=L+4(JzyJS35{(%-jUAA7v;hN9w-O}$e=Eo#pk9u_ z3UJc{l!`4uJ%G6&*LQ;Z!BBTW!XLDL4Uz>WKoj_Z1K3{EC2q%Ie9+<_F(j2+@V7RC8}DEtaAzKA<11JpXcsby z1j_`=gLQu0sFDZ3$qy7Fps@cBYXlU46EBElD3OM1>4fNQ1&Kp^fRbI1<`O|QDyXjO z2FG6Ti?;&cvaEY5$it{LH^^&PVx!y{98ieZfLGs;r~pMjxRb}y0kiD?R**klG(zlZ z-U}}8_**xFtAaDEpbXP`prj6#fJ?!hD^Sks{QM&L3bbG<0s9<8GL!^&w}KeZoCRuY z|9l8m)_S1S93}_vHT9l?%9Tii3qB4=c?t^GlW(B2o28&-G@xn*lDE)84CMUq7YF&l zVb%Hh#U2At^ML2?|Nr0{e7jpgOw8NT`CD5+83ioc?I6(ES^@II8;;&K&^6=%|F?qp zou6O)dJJ|Tw6ukkR+) zcK`>}T$UY{hxl8k!4-EqaDd0%YQXshT%%3}u{%Lk2#5h`dw|xab@zh!7-#cv!{Hwi2St#V=B2NiCvhiahz1rI%|AFx&7l=4s4dnCS~~-+O646Oc^`7Xxy_Ew z&o4IWe*NFsvKOT2wJcN{#3-=zB#1PqItJw%_pkp!%Zb3N50DlQfCeG>dv4$P|GyhN zMh7nYKudiK8h~n;+y`V8l6sZYt zDbN@vic~2?s`)r$C)ii;6Xn2OsF~0W9$`e$;snvs4IYU^kzvCt7Mpo!KZ{Uv34Gso|UgrnRKjh2ep?QX72c(Y- zs|-PvC~Q6jJatlnegHtgf3(S!5_XJ5xUXZ0Fdn*s7j4Nivhh$A7{+(Dnt<|0s{*ur ze!NxXFLbq5s|-}^wJ)@)1?6~fy$32jL9)!?CL6Si!ZZWcMd3LPHV@Q}0nPq_Oaz5@ zGuTANZZKsHwzy_#^Iottf6GJAG7_*9NbPGMh%!h6lJNw1fTz1<9%$bqWU>Jw&v*iL zyZ`qK%HUzwPKZ)$RxX3~YQQy1%XRRO6u2Bi>Z~0^76n%!pcX~*4{!c{Q11@95taOy z_rQ$#-QbB@*4?0a&(0GwzyE%nLUzm}8xM_nOygO1fFh`~)dEz)gWHeYExn*cc%3bM zpw4MG$md;sH=Pk?x0Sl=HK4@{h*rmI5^HgM!l}+21lwj*htU{I7l0L2WUe& zSXD0%6Wj>6AmgFq2M#O-kG6r&i|G9P!V5By)p_VO>n>1g=Bvt=GgDP$PB`L}nyB#KA5 zA-a1-m|wGXPX#3uhycvG&MDy2IUs_)B8-p@S!c^M(8&%EQS<~3vK1zSn!vfi?!}$F z`FjNZ|NsBe0z4!QP1c}!ZgsE#bWj4+#u5Xa69dk_NK5(nJN|kO1mlrCEm9_bN@A4%(~K#39M>f?4tF|4!Ej-L5>4 zn6oHN2C-4bX+S5l^I#vnF$15y&H{-p@X!rt?~&&ZNU7oaq`CG9Lx~_nQKu_Ux9gKm zR}S#)STO4nyInaT+F?y(kaeIQI;tqBH(F-`I&0nm#X6pV7q_4d1E_WU5JjD?9AN8s zK>h)*NO0kAEd|v=u3*oAh0IEnAdZ7Nr$iW;Yt7&40@J_&QDMg40y^FqtO_b*QBs4< zwJFI(=GvCTA#)8&{E@jvB@W13lM+K@ZYk7tP>ZUeu7h%|`CFHPhFM&Bnh&smI;t;#YMbh_RE-+TnRwJ6}lc9`HDWTVYWRYAcNzyc8jEdV$Ky2I*5r|XMu*E?V%UUa%b z^srdE-YDgUsI+vw1G-ay2NF96{+HhQUwR`T%jHEJWVEu=mFIsc&;L@6EQT!Y7oHG7 zuzkKZtdMO8r4L>xYl2PecD)0M9GjAIINP=)8_qT?iHEa|N`m2RlM;70yR^g_ z&aN)ehqJ9ql;LcP5^*@&tW>t!^$utx?uU1sP`4|3!2K^3`ClsVzx2lcQjQn(pj{(J zK+CQm;q}7l95{!x9w=c0-2mWv2h?K)1trG|lcV5s5y3&mtPl1eBFHY9g2Mt9WNy$P zyT2JV$o^%5m4Oc4>vnz9?I08IzmzA7Ig9DV4#+5Gcj%i=CmB$1N`o#5dc*U-^udcO z>R{VoF24hE`BCsCIS`kFy)yL(!g(orU=5wFZ_sQBLbm1Q5=b6`#E}_)s|kb;2|NCN z(9tBILI9E>`CCQ7(x4Im+@xcJa3SgK0_u894o1-RRXpHD9N^`KEE7N{OjkgXHgx$O zNQ{-gMG%}Y)93+R4g4D%WJTQ-8#qq&8(Bmk6cK#NS^ z?qe#k!4P9E(ZCR6DG|XCV=R@xu$zs)1#;p7Y+M0chw-wRFW}490+^txEDn_@Kr97|JAkIIz;l8x*1rH}XK&Fg9lD~W_h^Ch>1#Q#Es&CVJ!DJ{T+GaY$T!zMU;ve| z54s(AUbDV9FY)#N1mvxbVZqIB6kde(gBlO643eO!NznXuDCC02C$BlXU7vu4ML>7k zJb~nPi;~yft^(Z!JTF0$9*|?|6!}{k!OQAEhttXNx0Jv+vL(C_CGz~O;MCy;DtN%R z1|8f84&l}VC0WqTqpy{_-9V?pg4T$EHle;h0ad|2^#K321B|XOy32SV#>ti{bh`;a zT%=Pf()f0vzh(t0ex|I2QEGPp0mkMMtybyT;4ZRo5pw_c2I8Q$Sl?3t!5PABA z8aPkCa1sSI;NO7k1~=Ld{4ag+zw`m9MRvv-tR&!n=>u?MY!8GF&hjfE+Ck|DRQZ2+ zQLYPaGC0l><@znh~RT z6nJ6Q1xh|@za!u2|$+x5ju&>s5c+7}F^T;P+7UV@KEg`OSI z4zBLrfX2oT9X|lNFQ)kre>cm7?$9@w_p6meA9sBL9;OXCejwqqF-Ldk2hjQf*Du|n zU%Fkvra&)3gf5}{&<(l@4vSIzEn1*r5@Os-x&QzFPk1Tu|Nno~EC#;NQs+h9jaUC! z8GcDHbh=*Yj^(h9<$+yc3%cH}^)}37AHk=XGV^ag(CK=n`GsQh5BYLy&-QEfkrQm2)qOhwSZ2W><&HC?Rw?- zfd`J@jXj;N7oaD0Ku)C0?smNZju_Aljr{u#H2-idk!}8wTI%2JvKh2S1#GA;#85`p zC$G&x;;jct^uR}4y_N-WyIpp`l`_GVf)0Li+04?-V0pae=7i>Bj4-D#OaqT}TOO-v z>UMpCc6k`6+7)JH_A?&_Y=>B`Yu%fZ0kAq2YJsg{SK zl&{;BqZxEZ?wgl8L4o7S0iC1>=?>+A9z;%^8L7@guY<6g32u$zo#le6z?_CU1ioVp z)cdIwU?@@OF6DSF*4^xIih-f?6Veb;^D##2(l<3v!SM&KBvBM~Gk`8|&4$#Ftp`9A zA*im*VhH$O`UaG>jkkhxdh3A_Td*RI)&r%QXhvANekc`15rY)yuO+)(KOA=e&Cf7E zG($2nLur5WF-FiqNPYSL|NjR&?R6Q70U&pM0bL&XrQ3m}^+1VRce4xV+Ro4~{M&+< zIs%v={LTUv2m|5ZrY$fB3xV1)j9Cm}FV2IO0vr)|4Z7VKTpfe!-qMBOz~QKAea$!l zH7A0v_U>o}rK*Z=;K~lNkOSg=yYiCe+7C9xs?D_@tV=XOWO-6^?FXZBP(fr^%=Xb0N zJOOH7fXdX+4@jBwOE-uM%^=`gDqp(kf&tXJ2ldIpeH`crlqINj4`mmZ+y})yxD#Jeav9FHC^-&i zo0Tep*x+``1#q*L1)P3^0$vC}#u;8qffRrZu`cBUSDhR$K+})SM+7FEJPbO(G_><6 zq(nT^1WLPmK7(pn(8f##@P&}wt{*_FZd#f>zurQwR81}l`UP`Vtn z?8Ef~V{`2XZ~ne`P_2j-$`H@|Zv=Vf{U=aHgcZ^_3RG}U9&dpPRe@2Uz7C*z5$*cr zwPv>~2Pnv=K!V(tqxm7^n%K+FIzMur>V$|lyK*pgyME~n_}>}&rS(AlsR1ESM)N$Nro(D9e9PYe&d=sfxD{|->6q4@}-}zkgdgm|8DAI!cbxWt~j^nO-Abp=5-2npKt~ z9sBEgq|@~T*mDZAOgMTQKwIGgvgBTr-2m4_pvKu7(6|D_izSe)TAh%(%ymhp>x!3K zz(aT|Ae|${Qgv`J;;PD<|9RIveOUq5f;!%j$=@2o%)rpQ8I-+2$DuGV^t!P?in(4l z4hW;$6>67!sVBrP#p4GUmYRTuOh89J3V=%;P^~%h8>DLpuBz*9fi!M&U~YcE(sBS= z{G54V3cBV76bmarYZ*af>o*`i(dKUjZ}W700E$a+w5|AGdgDbJXoMPEZRmHqu7GxT zR~&bMc5+uhJHFt8WW@^&NXhrIjfs%A5H?7#gI8oSx;_An+0;qCNKj&8XgyE@x&-%s z>53OuAWnV_I)Wd>f5-(^-+G_~Ql_qWu?eCAY~&4)qpiijN?vXNj|f72sKVb0-hS>1 zI>CUU+w}%$Q658Y!T;B8P>#z6=<0fH(0Djl-em)*4*p-dBH%>~XmA-65~afE>UB#w zo8K|EeyiN}nsGwww@PAy>hDi*Y`p{>Tt_GcfSm$%su8-?+MrC3E3)$6W}4+&It}Sq>zn(sDN4uc7Y3&bmbwzXS z3eZ|f&`DU}LJfSU^$Ady&GiC!wCPHjQa6YxVCj0LSRBLzod(VUVg!K5&H$d*kn-%x z|I!ODtPX<9vlq%$Z~vptRDKY_Hd86`;zbpxHn{N`)a&7acXvUh52RG?4&?xM1i+1_ zmp8#_7t);OZ#e|#fm1n8z>71mb~As=Qt+T$1@yYM5^Zps3YwIyLFwZQ=7a+ie@h_RO+%fUxVo)O*p9Rov85vXI%|96H-4ULHG)MF?e8V!~ z-~;C79}0CM-SF^&i$Po565xp8fDTLXx61ze{~x1;4Ia1KTLDTcYhQvJ4&aLM38aY$ zp3!^(iOvI{&Ln8S>&c6Rqu`v?dY}Y4h_Vl~Y#Jo@;sxg{=wQtUa3THV#gCa#fiIxJ zmpU z0UfOYYEJTZ`~t-er1=s01)jw3yab(Y1DSVhJph__z614_rRy8e3@vCvveWg!YwPaN zH_-k)XgVFL3ONPVIzfzq^e^7LmCLq_7)ta&VOaq_r>^uv78j_`xOopuC8Sh&0}972U%<5jsEm#MgVIM( zc(I}klqhCAhb9WhG`aQ+Xk>zyCsabCe;c^P0U64E0d<)T++{*gk@wTVdRq@vK(*C_ z7p{RP_rM2Ff+s`a0T6^Z&xWN0DeFGa&;cmOz`dda;Fih%(l-GwyibBV z9E=}8xe02S5ZH}S(``yTK>EN1zb$A^5h`w2VgMI6Dp7&6O+eFQP&K8X;b$nj8a!>3 zrTxG3#fzv_VDBMWIUhQ03SV{6>G}cOrg~Y<#K2%(`h>qF8@w(S90V*Intw2r8a3Cx zVdZbx1xoR?ZQ!}7oM!~fD3VJ~7K z&4$(kC1o$7ir)SQUEB!DhO1A5^JaG_NAn?$EXIH!P=;MB2A(be72g;=qn>t;8A?(Ga58xaQahM=%Tn)5I1zZ)Nj%$SlH@-Q*z`*cg zO%W*X&v^{a`<<|Dp&J|opsNwG z7y@3bN_>Tg444Yn2AFg=MEZEE&wt1%yf4kb%c}<>>JD{-UC|lRdggd*0MtFNl^~+s zF0E&}r-DSmEsf(0pxM}FurkJOFl7yn^qLEhlU^Xn9(vvj&nAaK7 zx&*@Nc4=MG*%|?w7&>?$5|%eGb+R;ex-LLC4AM9S>jO>2Oa&Rhzm1`z)%*Yd{|$RV zq)sU()P=7rAtLsr#t_HCVgejjj2A!$sDS*|%Yzh!j3=58F?R~QwuR_bEHxoTZ{r~y zMh1pXfo`x9!AD#0gTwdu0SC}ocHjU3onQTiC*Z}NesG=I*%|^a4L~FVf2T62UIps` zg%STY1{+)c7CsC?ZO8(p<6zC8VTPBtLA7OT3^WQcEM)m#x**{HR*)?(Hhlt@o1lgL zvp~HPa2eM<6(k3`(aCiI=$boFxz`cEga~}}n1gr{H6FbF|NqawuN6c!|0pgu08PoY zNZbI;$K9~||KRw6gr%TMKtZlN_=t`1Lh}I;(8(bn{!2zi1_u6pQ$c#6bB-(%IuD|1 zVPQN4E>*!AKnoAxjzUhT-3-k?{`0qjPDt+thsgiZ1)y1ytsptuqZSjGtrdqMtZDB*ZH_uv2jptf`~SPf(IUQqOS^Y=;o17Anf3{E4A5dT|) zs~P^D9lt?WtAG+UC`mxv(g{}hIu4=|BM%%uAOK343~0Hao5Au>y)wiEa1?_Kg=uze zVT6?%Ola-^m0>kgAo@DNg#%JCR|-ySpm6AHO#oLJAU2Yz7rGf>JXj`W=xj|PpcEX+ z44thRaCM-$O>p@H=@)^SFoRuN7_nO8Is@Wr?CPL)xX$TzonZ}jQH>a!S*qFXI>#Dp zf2|zE6sQMXXF#3rItSuDXiP&CK}t{lo@lVcK_P-_d8g|X)K~+%eJWTX&s1;}hqf@D z>SpLuF`FqMhC%U_~fbt$VV(|`}zUa<)`yVM9LAMYb zCs=GxfH(;?#a{qt&60dva-anx69QiRdU9_z&RZ>)dJ20Xt~7#RQ()K@PSo7pn~}YBP74PJP2y+A5s9B4ABdn_V0A< z!0z|Z4#o@Jp!%w(+qDC$uQRbqfV|uj@PZBMWo&vur)8A(yhuC%^=}5qRapG%%MJJM zT2N>(Htz*d4E&u&pehEVrLB|#ZfU=;;$dRwF8z{fYzmrFDPet4$p{*D`++nI6WsiU zU90k?fRh8^$ck8@eFur;hApN zGmxSiytEL?E&)wGLfOTj$ww&L5;XaE20BCn8Rhz3YBeR#og4D281;8KYNs?)j|x+jAs z&%1qJ9DK;sYr+K@E&pHoA&cq7RT1zau}(I~5()~;9h`*r{S|Njzv_9AQrqjhN% zICVdGVSXR%bCEB3;$Sg}Apfpqc{@Cl?^ z$_xy>lOZRNPKKO7`r?l|;xMEa?*%v+(EIt#Zya76PXZNH+b>HnG{51=Vt8Sh2`=h7 zU2hzB1sz1j@DjA@|eL*8Sr`$(4Yn=0Utk{+FJ45xoaI8rOLcboc26#siEOx2F7mJGY4O=9zT?@)`X*5q^aBY49bN0MTkr%PgAoiIIA-9_kjiuUdwie zp6TrdSqHHTv=Q_~^8x7OXS3@W#^%~H-u!+1pz03d`PYGnQF!o}Pzn1k(2?7(S$DC5 z2AIJv>BP3c?+oU;iBcYz9d#=~Rc-AVpHkGgw7LG{e^3VKa-!bJe?altJDCS06!5}8 z4Jj^_`9a58LB^_@A278ZKrChejfsLsea-~Dh=Q#mzH{952&k?BuiyjA9?4>O@fI>p zbo>z5Afe_*Os$tn*kKp9feZo_2|-ydFOCR6lAh}cXqtHKiz6t(=PK&plmy#-BH+cT z```@%ppkockgSCUNeTbO+9S=iM;Q2913^U%;{*_=lnuP8>corFj9>plUGY)}G;Rt_ zZJ;H4s7VW+iuhYTg4)xeSdtjbLGK}90a~hzQ`wn-7aTBUPyUxafvpN&#t#i0(6ZtG zrBA?1g(t!UA$zr6yr}#IEsY^FB5z(~zy!X43xy9a%oxGdDwZ6w;3B9A!2=rn7sRQ^ z;VJ_IMgV|y{`g;_h#><~-u&Z#33Qr>6+95w>3XHP_6kEu2GmI>>cE3)7@EPxz5xwV zzPMrnakc9eu%0h3rr^*6wh*Fc0Yr}?#J18fRP&ERazCi%q*CsG0-7j-XYW&g|NnoH z4LY?8G*@-wg=#9e#6w$E)ci)^g}U$C|BVM{p93wB0`0P8cx`ap6?Abr1E?(d0Vzeg zL;o;dINs98a1P{R28L$WKa9<_e;DiTHoN{{Y_9#`U3Y2%>e8!#7lE;$QrGbuWN6iO z3(~mian}=|;gx5x{5UobpBBhSPHhGVh`k4 zUzyee{CyE%8FWoEAk*s5YBvjdz9Yy~aNXR^fZE(Zt~w!;llZDms0xg#v-8mF3{q@@ zR>5S71A&XCp@&8`O+yIl`hyFRJe+U&ZA@%Vu);Dh`uUH9SMyB=XYgiBWm=W$oiXb{6|o@Uo0jNPtBtX&V(oCLLJ zA#?LElgyzeUFZa_*8v5COY4j7&>NW58b5fukfQ4uBohxd*PdbEZ;^%g0pj}ZP=p6N z4?!DYJQJ`60J!ZK81SO`|2xnCF{n)3gJeo)PctY~ppJbx8&nmCA}i=_0W0YCV1fGM zQ152civI)n6kzbtC@(&4f|ku!5Vbut(IO`{{`Ia$x_$R_haTxQ0ZpF<{4c%of=Lfj z{=tI$1LFb453q>p6hMRte@`T6^ul$^ad58>(zb5SJ;2ypdw_wz|1G$T+QZmfyT_Zq z?=tB4AZWq?kG(+>&g(*q&;o@+>w%IGtPJibWkq05oIvRX7k}bLYg>ZXBIdlviU1XJQ70uBU$H#=-qtb1_J}`QgIH**w=R8 zI(^Rn(k(BJR>4+Ct9HB20j1$7%^)MXednNMWQcgP>m0`B+Bx2JdwMtD!DChL<`;Nm zj~~c6WCCAEw*}PSTL4|Ic-$3q#WurnSJ3_whSwb3t_#4@&9w^{K;TIx*##nt8fDibpzusK8tTDlktVwn?0T zRxmRlEYwo`NHQr!aQA&cLi@PC#QHk`Q6NT3S>y zgl(d%nwi0P!P0dKAC=v07@TX=7dhyo^ID3*hT};5>}+WteO0+J3vihZ~_EX5}*YOJ>ZK1SpJuC z{4ebZc(I%fyiBg!wWr%b2DHjet=n}2DA;WnONGEo*&u5?K=-hLm(FegXFkZ{wkyrG z2jux%nL#TpYi~gEV>eqTd#^i7cNj~jKyNrlw;M+%6GR4AP6gWy+OF3-d4uiq|3LvS zj3$B$;NIFZ5S>`f+zraQy`?v>Ngj6v?cic~xdqh!g!WZu!27D;UMaM%3Kwk!m8;#Z zGeD`f1yU@8&cLkQN)n)IKvR6!6qMRS6|^*i%8YKTYNWxPYj7OQ0IiYldGQ*&0#$+0 zbw;!6494c#8Q%PTPN3ah;6kpq_Dr`}H#_HrPBzeSB^;mt7U*?@oLS-qIa{gtN0$ggO0sT--T+1j6I7o;99y>^v~dTLwm9JN znAH!CM{oqACN3_N#5E5zW(HajjFPyHAJ~Id?pwO{l<P|PqwV}>E%MKCyjAjeDHBD8FH z2(sS1ld0Kt0^{)mXTXlObe+K8qxN}C z0A)bX^{B2NpqpyoyErUB0S8%B^#(i!%!0gu#0+{n33!wkeA%0NpdD*>Z8YsVa-T)ocb`ZRBLe+2cZ2u3NPgSKut;h{jewi?`Q=rwbbQrnF1Df(Ens{aoLG=9fU* z2;YF3ieI{2Uv#?Ocnw;t52;i^c?)Zou|%dBH1_fV9NITPlLtI6Zh?l2k0>y@-e`8c z!PxD3!`k&r&6by-&3-RI6RF*y50G{>J^^!)cQxL42|hnP^hUSq6L8IMlUgbVDltQE zfM$Y_qGbuFt93*GG#7wS>{{xGPz;?-y7O8cNi6gZnmI8LbDDGSFoKrvR$gw-y}<~c zB=E@#4=vI2f91c^LRxet^deAnU0?0}RJqpMbgt-Jt@oPT>v43(!s> zsFMIXljpeW9gwRaD+EFXx?S&}4VDyj!$m>!0gxe-(io^HcnAgB!15L74!y&83QH?X z4^=g&MCit?njN~~yxH{*W4G%aYu6k6J&B;qR{Mm3zXh}d9;=U_wJf-UC=l?%3Nqmb z8eG8Q{lEb5K<lq9qL8GAH&F|ptORr18UUkY(PEzKaOfMezjws-_BKnJb;&@OXe?X0s?-vz8+bltTLj?1G2(we5+4Tb>cr(I_nhoGG z?#gQ+NEk!6E%&bh?JWkaPv8JebuGRNb}YD^CIae7bAa}uhk`cjb_R%ayIyI2!H8Kb zIJ~fN2NerCJHS;OxUbIB>3RS*a`MIS!0`ijxFB~P@V6#_@95@9Gv?@K=xk=W$-wYp z+43*{JDa!MWMJq9lUWS^OAiG6FFo>Nx9Bg>FdD3_3R;~GnrhEtcwwvsmU$_}3eweZ z6EqK6%Kt(dWO_4*3o0I(-|+M{E8JvY2zcRW1s*K#c0JJ9%y1KQ&^M&{i@uT;*Rs-w znio4yQDG%*a|<5JX}yfMxdV^oH1~NA9?NO&^9d-Hvvf9J0VTK1AmQ$AkjuI!g94`; z96w>83mW(5gHsr2l(R$zSr)X)H{gHiffs8_z$ze#7JRr)FSv6I*^GJQ#Uju`?;`@R z+7WDJr|X^L&<#Uxc(NE@)Pfe691-YreQ+EyB>qw#T!w)MyPjlH z=nkIJ121lHfa*z5r3UfJi^L_cOw3XA<6T<9tz45{pw3D*-07Ho!xTZRg z#r0z2Zm=`KPCD>HxC+dJ_Nq6WA@D}7J z-Jm^%PY`255}Ew|Oc|y(U<_0?g-cj=O@(dGG;OES9bxKwf_X_WB2q*WYx9egJ#@ z4cO~%5MKZAzx2(E*X>}hznI9%!0@88^cTp^EQS~Is^Ihp-pKhS)tD8!)~ok6s4I`Q z)=T6?nyF53iIK*9Lphda20>~#GCIx&V}hXSZw``}OKA;=7C4|Bpz28QMXES49F zKE3$+=*xeoA6}b4k7fiPAk_SWrBtAIGDvN=>j%aQ#~2u1^P}(?CxGgu=GqVPb;n-J z0Udb-O0QpDgn5ANM_E+{UX*4%;njcEvl}HCx+j1#ZRf@AP!7gZonQ_)usJ#pzqof3 zvONN6BN$lozy4SMSto1+c@lK^$p2E1;)Gk+6sx?r2vVH9QG%g&0;tyL41Lla`lK`T zMRzDiXXqQyDI#71ATo#tTpNVGse|m}ee=KcMd#rcTUx-;((U@98??9n4dWqDtqWp4 z0d+V)2epCrGlEZx;Q<}l!Q1Wn0eRQ{2he>bhrsgSUHc!9cI|%v@67)IHu(c6rGR(s ze*m8%fFcJ@H(!v?ApsxwGTj~&-R&DB7+yR+3Ca;GKm}kkh-^NjUKv@hyFV-4BHb1y>bi#*yz=y&>Mt70NbwM4OH=xzUp>Mjo zL1utXnF<2mM0%=|>9rWdV6cZ-Kyy!rx?SINGJ*L#kmG0=N|%Aen%96_0wytBdjZm& z>1^HrQUh`=hyio$e|;>jH3tR!b_TQ)21>=dA!a}pHGv`mG*TSfmRgf}YnzUKE0DO@HW{J^KRb{yVBFr(mGFk ze|7K|Q|F0;KjcB@T!13^0^%e@``N!%8Vf78A&&yFqGS{DV|7n0}jT0}9dBwcuuI z^MRDk<|Cj;1Cwa!|2KHnv9tLANC7BCff%q9wN@9Lq9BdSTcF0}6Md{jm&gkxu$4j} zE5T-g1D`h&9ErWn3bz;-z*z{~^8lxM7E9MJpt=B@!(G3C>Vgm5pfi=QB_yD|=_sMbB z7oa;$KxbZpP8xXvKl$VZ^yCw8tzJ+M_6}GTPq*s}P#FrU`N3vDP8$XlJK&0w2ejIh z7j$4G(#a=pKsgmuj&wVK%g{GSWhkf~1?dD8$>7=+T!y{@m!T+fknjeTh~Rck^8pS> zD+`n|LwUekXud$^CAuNu0Y8nP^#JI!Fi>)Vo=|Y8+x1H)(`$2dg^=|Lovv42^L4vk z0rReaG7xwnQ|TMf;?>YEodPJ)3ObibxAWD1*8Qs_7`j6___qtCHUF|GlLRsyRJwn8?F8Dp zk6BPEfjrd=G4l&}o{pn;vQa2_PE4*0+=~PSl>-lG|7YzNhSD9V=`%bm_(e*`tN*Ou zR)VVa5Rl`1ISxK#Vm#H&)jb1L-gSrabVF*2TirsI7y0|aizPZffQr#WH$YPtQYcD5 zi4nWz-YEIjOZ*;}5B_59yxd(flc&1_)q+#qLY)^6{**uXQW`uqpm}OPsQ1`;@$&QT z31ABkfGy;JEYSv)VJEs7K-7h92F`z-pE^Tk@Jv7+`UNe*YH5GSQs zKi#f>nqTNO|KQ@EeyHVAsRGg@x2hy7s1wUS^*{?~T_kAe>NVR0@USI(Z#($BgR|zK zNZPvsbTkGBXjdu7u`fMAJID|=fwD^T3(e*q#{BKRj0_;xcDG0zxc=im;|;t251K*e z>VuCkKGy z6N{`~8 zCtwly!IB?dt_F`9Jps3YL3{jCOKrhJvQI!`vEW?sgaLGJ!xxY}CZP7#8|WB5Xtg9S zNC13%P7>HBuk*S?5oWoT`aq8oeQks=6x1*UpMnQ9C*Z|#NDHI&Kq>SpWQ}Im7mP?c z7%W|1)a-4}eZmMjn3ca1w7nASOXSugsLGl=rcKrg`+x)Tf z0^Byx?25sQgC?N7uyHA9MEV9O%Ye?oEam8Sz46i;yx#(z^`3OQK52fT*8IbazkLck zL!7t)%@CkaiD2ox)$MwN@d7J@G^l320WyXKVhnf>${SFL;|gxqgH$z0z*XIY=03=* z8F(b05wrjee8WY{ffD26t{1@Tuf;(Y!S;B(09A0Hd4mg##}9y$Qv>KA7)#d+H8)-h zgH$^3fXCsw9RwIJfDOFyvKV3&=s+e10gx=nDGYLOrv!smQb2~j!6tytF@7!6?Rw|n z1NP2?-L4P7?ePcv+ZaHHWuIUKUG)IswHzqD1ztS}GOqz)9%#`7WZsUs`2k1E0nl9( z0+6*};I#Sj5h!=M-mr$*#__Toy!i}8(OyW#;s+nHh0PSusSp#oL!Uqcf@K0^Ukt=% zCjM;~;DHKKgOt<4Kqi9*DL=qwPrN}cfrarG(BJ?(r`-i5MQ~07CF3tI)`R#*1i(Qn z0GeUrZ()KLJDg}HyOu^n$8uiVAgt&Py#mV9kmL($2SuZs2|H&7)UO5&S0L$Suynmr zv-xEoxU{$cFD;5oArm+kx=SXow0 z?5{m&0IZgSp@a=I(*yQ_wJQ(*6wp!bFO?vf58Sc*069XNfBON;W3Uiqg36;DybmqP zLBl+~Zs(hS=<>Joz%%@kn}`gLum`j^0u*%6TTxgn4?!KU5SrOABsy?ODrO7E^b-60!TK*0__$c32=J7OAiJp|}rW~kAivzhn5T!6!6 zE9AkQo7Mv*RghqWoVLvY@d6LXah8Wl62Wq>^FW>g`wb@H4Uq^%*#T7o&W@k4WXE5h zkh0_3+Z+rNUUN-&%{~FT_!e}09)D*fsC5Er`=K2h9o+oJ<;4nJP@gM z*ZiP5+gJuc6&)$d0^{bKoiGR>&zcJXsPi3g1Aw z-L7{aW6I43B%s|cG;1N9EF`BK0$I)k+AR8@JM<2?_jac{^hl>bck_;$44`#jos&Tf zkfak!x9gqb4xqj$1DM4FYBzvcpd&>XnrlTE_*+2hUAsYtT=8_eJ^^*no`BDHdIIXA zJpr|rN(_%fdIbWYzN!NY?707K0jM|!=uAxq@URxRv0SU}L&nUqBp=K1%)k2sZ1)RgCvSC(uGu|WRu~{u9_V26&@0`0@r&s(_??j(`^*VVMcE@P`4E@*gnpw@wF@mv2BR zzx*XMP~oWop7K$xg`|8Wu|uG%&cG@E1t^6CfUf=mHK6r0AieO=C!I{)&3j;(0K@>P z17(6I@J#UJxC1m3Jb@lj3Ua-J0BDSl4>bG=+K&AOl$hQ$*S#GDnLpab;m^YBbgfdD3PB|+y zKq+U&OmO)JE|DNR(ODqVPLSlH2RdL0GA;1n1v_k72zrB!8Gmasr~wGRPz1axOMrpD z6?CK*cu7D$*fG8{UCm zzy{v`4?Rg0y#F7{2JioevcdcRp=`5KQE*8PYBzyG>_z!ouv<_P&5Nt0ul}>9PnTer z0AKL>;vh&Y7)1;`Oy;cyN?g{{p@~ZX96KK%X-d0P9_$B6aEAcYQ3jonmI!Hlyet5x zD5z2u{#Ni|pwRm}SRrzt3!1JDtvpj^!f%0r+K28|Oz91adv=;c7*V1=^5!3t%A zgB8j)D-DJi0<&HLQhkH^Mo>rVLeIJ70F7x(hBQfE%R+_})0%(4vL9Hw10oF>p#WXe z&@G!Fp-*t z;37l`1t|Y+;_(~Sn3+CC-IVPy9Bx)wY<(|(1%T4HZMVeYS+Jo9?0gY?- z6u$b;DmNK4t_>dV^yPt!YYR31`d_LH8+!(g*Ml0-r@A}9s$zK#K4xOP*)7y5h(!r_ zm=;9|Xmam3d>kBR+O2LOh@o8Fp*)!5-l06W$GO12HtGYX*WyJsRe z`$7w^Qcj4Y!Hd_R1*BOi^jg5~=7d`e3_$@eLct{h2WS@wRE>41K75D?w2u&c+|AsF zjG*K9TMv{9L9~MB?KmLCD|&IF^1=q}9-WC24A8k>f$nBda6&rqL1Ex2VyF~D=b`Rq zkZ)nLX7PgHTn3p_KKOtMY}Ma;;2Ns48Jsr2i{fBXk6==uGyz>s`VzD}`?xE38u7JO zcQZ(;8`@NboaxsM8I$+@0!fPupn2^tj1WsLUBA?vJ`Nrx2hFA)2M?lyS@8XgPe7>( z+~0fgayhsn0UaTWHhs?D3OYFhe(J1zX%Mt?`C1)z496Sr5M9fG5=bKev~J?XK}aJ2 zwD7XI_KkPlWsnKrVM4@N{4ZW~Ln=_vf(meCf;toqp!wt8$tHQ=d8cL3;LHr}SG)jC z0)iLPGnB|d8!-&sp)hZBJMdV#zTj^)1s#}y&6Ch>#_Ix*TQH};0wDWS*+B>AZcYYU z+j;=BMfn4$JN{Z0BFzSpo&uLfL^><_8lD2VBhe78<{Wgx)^l6U9;;G zq}@AD_bZ`CncScR0cJIyU_@4fI;pM+IZCIq8Pt10x0K~Y zXwIwutj~KvB?(AD^BbO^&ciPrdV>9esay@Dd`GVY!|?`Cp9buy2_Wb7LeEW`05OFn zFpB|X&<|d4HUk}v1llz9!UmG+&(D8c?r4^T6SCZIJT4 zJs_`x#xx*a2U!jGI>Z#1*Z=asy$)K{@xl=@41?|tl@}$_Ag`x@90HpCeS+K+nhdf4 z(P0Sc4Sf+509uBp0XfzT+ys6BKG6l_px5@@V9$0V4HdlsHRj)dtA9v0QUcU|1XafW zOP>V1I1A|mw;m|D2@?1Hl4{HgUBPyG3u-kBZiF9`0=afuH)weSDB{5-cP!Wt@G2{C zI)jyhpvKAvP(!%H1mubjU{`=|pDwY4H3`6d19z|i0w7nsmIui=fR-CH*M49qfwUb! z&2tA9OIME4hahRBWjik>Wxo2)sseHlXquFx)0GEoBY4b`0Yx7VypI8{(0)sTyz;sW zgTfRu!VZJ=ZSF#y2`&NmBS7^Vc+MF#$poGW7A>!WoYuME7IX|8 zJlFRUy#EVq3+Q||@Id8D(49B%3ib8E?#Uo$K?Hg|Z^2zKInFZ)DkwSpi`6{ zK<=^wPrq@z1YPX~vM}@kWXc89cMo{+5?rebfM->|FqEc%z3{pK*(}#mKWJU~8hn*J z!~oEwDtO8iV$MRCIpBnWG->(-GHD976x1zwQnR}`_W>j53KsrO&;S4bg98$I^y)=h z`m6t}5}gtZutpDTH3Mj|!30pF2hpej&yWbb2nK0++5ukK0bb4V;WZ~@yZZZipl%wBZC2{t-2slh&=1`~ELa+aAYokX!p>ja4Is^&;581f zRpC}!m%`h57(N5VkOL_Ff%|wu5H2`(-2;a(#{{$yYiIxjrM>#k`lOwN0I)2%4|fq& zJ&N0NkjtwOyJA5zVKY--{b$t%IUF>6DA4Kpquccdq+zOEDh%GE`{M;a#P2Ub$G5L=ZG$G%T>rq#5CEI;=f!DoD~RK@SvO2h7j)G;$N$nlFE&8T z2VJBF)u&g=2i2Db(bw$yg%N5C1E|&43o;1mP?$kKUZf)og37@R`td>*Vi4k3AaMC* zEea~XwA(=I13*~`GyvJ-2`;`mo8N#|>>L2^wh-tB^C0bFD{rs@a0d%CO!6WMrUSC% z2BrhVgXrKu*P#K^@dd>W5D%i`nirZK-#owqoy|W`bbxpe9ZMiO(92qu7vUlxKf1Sq z%4m?6zzr)WM{ph8-3)OgPrwTUmI?;!r~IuB;7jnpm%kzM z4`>~S!i%3mpwNBU3`#*P|4Vs#n}0w$?i?@PT?Y*S2tbSPmzJQpMbHfXliub(Fg2$j zYCu=0!bT_rK!*TBj+EqhvBw1*?a);-piTt%ig(b}+MuZuXv-XYn=XbKpsOK6Ch&B- zegNGQ!_ax~^0UqliWgcBl%#a~ej#C%tHO)LUEnbU*eYY#zFzQj0}JwE*I(Dbeg@@N z@M3va(1xuK^89^qpgt&Q39RcA_}B{Ar`@17$s7J2Ly&^nFASg?!8jmmYjq*EVssm} zf%5qqs3H!CBDBNAAdwRz2#Oq^CeSPlWJ_fgc#p~hP^$!dCl@3GbcfynB|OkVEY}Cf z&4dzAGvNVh8{u8&hvo;MHbM(%wip&94`|Zrk&KJltIS1l*&94iBo7R)QLB@MBkByiSDjAtSEfg$4&84GC?~ zii9t^rPe4ax*ec*MVXZ3E*1G-%Hg&Nce&nFfk5*E>j^zdQUrrJz&9(V`7pn8>_X!VikKDGl&= zdu@mjQQ(5G+xHHrbT|Q?stpQwaT$_bK)Y07!xomVcWMqnL;twz15iKr%m)<$}jEV6>H$&k6(mO!`FXVl|nGsSKz|)KYR5dIO zao})j?VW?qnHYa`Gk`Z~b-IGh;&gq0=2-q7(1A~oBmkOg1D&nj4c__JdZ0uG!UFfi zpY%>OqKCc>-QoSwZVTh*x+5UTDBX zAWr28cp(N8fjEUH-~|gz1Y|eZ)=!pTb5LvrCuWfs*Lgtp9xeYqR2%^Ac7HBRLso3f~)?KrS2W%1xQrU%A zvK#uKn+Ss$xMTfMfVGE*2!RWVH(v6Cx|@?hLz>;LJh1US=&Ga7prIj9n;3NX%S%um z1ozEe-iGuD-=KB@K@+`5eZ&voV_!jiG|)ye$Rb)RkPAbxE~5PgDjlI&?aPZxARc&i z6yg$S#DAzYVLil~l+}bS zkeaai4Azz7xOSUU z>&7bAJ1}cOOQi3>W?Mdfe+fEJ0J6=yJ5&Ht?tz+{FPDSLF;`F>0BUoFegK^p0=g2S zu1kKd& zHDnB+olVd(6m+Hqs2}Be2Rs+{@;kUp09C#4!BsMB7C<%-+z+=kbEF})AEJM7~2ej&275 z(5MVtC1~F+bcL}6I8{JZyacU~g-&=u`;!n8L1&j72DOwSldIsRa7fDqK?5NsRN<#itV^FDG`-TA&OptRtKwBXv&j7Ero6L>5 z)=uXHs5pTxE|=fP!2pU!q=9o#xgzl58xtsoo)t?lbWaBL8=zSO+hjDheM9Kk4!mU< zv>q59bJ%M~*aB%uP?r`SMX(uYlm(JVYo9C+@wYw#1ucd(aJRvX07n{sFL-ntG%p|k z>Gr9>?vRD8ICg+a=$7(dx?!FMg$5`qzg!0{T?H6Gr&FS+&@EAe z1VlGzjXYGU+X1@X{k0X;^{`R<%w|v~a09QGVu4$u3zPQ3W7d3hvt&UT8MGM_WEulx zbbx`sRRVmX@CS^>p3e(y22j{Y7ecGZE#0m>ovs^Tl_U5lVes);;9lF7|D_vV1cE#K z0-dfGz}r=z1q^5l6ZEX;u3!OM!_nKk{5Isgk2SY{{O=Au&|SpR9lE94i=}%q=xm|p zHyq&sVS&BPTWxE7j%pays!dY$qwnnf*Sdt%P(H&-1`Y`=eQn#WJA!n)QkHE!PC&) z&39n_1TkR#EQtaISOE)&bl?HUHV5e3ZO}FE;O!;g(UaykJYj)By_3H{T8e>(z+M9_ zbq`>Hm;`ES^-i|A10GW`1j`F_yF%j$$#9nL&pUkpQ~q z4a|U;-Fl$J9ApHFD_Ov<+|rG30K|z25GSlV2zBC_?%F4*#dSTrQ|!djcwxV8dOYE8t(aKKlP3ajYt$ulC}lIyiPg>tfQHf5`H;z658R z7x1!2o4*x2Vgag*L1jBM2lKZ=CWJr=Aq@@Caj1RZ{i9%|;QALbZ4SADT){THVQUFwXVd*%6ic%a^qb4}jy#Os>ZG8wfy!Akd z2w3n7sNKN^DYZC3C;5Opjmhd-3Ap6R>7*dji`k7pMyvVC!{hVLIbO6t6@t@#>wyxz?#-Yz7v0_9ysBX zZ~p&(k^l7n{})H^{{IiLu=PNRAA|*(vh51;?Cw2 z(B5k3pbN)~88G1t6yZjga1M%a7EHL{7PbRWp8WvXdo2^x*N0fc6Y%1qDtLgfyBT5w zPr!@)FcFC1JOMA(!bCvkf}?vjLm3{=N^rO936zN|P&W)oH*CO(2T4DC zv!EWhi*JD=1X=fVzZ`M%_!$Iq$HcSaL!&k`jk^Uif|i zG)8g)cESrJY!$)7co<N`Z?`OI}BJi#C4_<;csC9>)>2`ep4l$e5Qpn<|GmsT3Pe5&F&_2Z{phGM=e*gau z9=`#dAq`p?7!PS3fQ~Ch7~xv#2-`ys+2Rg13%Z9Mu07y|5=1k6yF5f0c)R?G=3MZN zcMSZU@kqxNqcr89CE}t_pb~LXGIIG2sX0I+!#gxU#kl~YIENJdAgQ@fDagUb;Q5Mf z=z>B-ck0H=t>88u=vqtA5a?u((V&BS7_u0H{+B)oco75Mm?Z!b1IlOYUG4Om7S~~z7nldj!K7vBiB?(j`gK9I-2s=-}i@$1U!3e3nK*6{` z9U|q5(vSwVZJ{$C(0SvR;AU*?9flGu*aR}jknU!%HR!|UnL1!oA=NK@Slj@r8df54 zz=8x?`U`Y7gUv)8Hur$I5ZkahY^^nTnIHH9dPsWxbqSs?9$n%WEJNH^V(x#ofFB)UNu$!QY|)(gfy$jx3zg+yFX=2h0a|q(JIkg0{=U zOM=&vAWTSS#JUu+SPycO3V5vv=$uT@fdrr&o(xJG;G0e1WyBXS7kYL8_{5GEFFQe* z0(83i7g(vG1G;e*G;#$R69btf2_8D(fKRyb1ibhFYV#ivcKRb7h30f@ zhena!6)S~o8wHKpzUYNp1=?g;IuSh8_64n4yp#kr0bCz+gVr^JHa~;+sDNgy zd!K^RAV>z>Pvi)A;RSIosJ9BbISwKW>OQW3#2swF9GCzL{7ubj3t4hHA!l3`9FM20u+yfT^_Fz|lV;C_Y!4lLvc|JrQ zH2w`bmKUrO+I8zr0e9VAZUnmxx_Q!!zjYym4;sSx;mzL%x?dI2i3bIA3%JY#^}WFR zC!bsdC&1PNC3&EEC#mBalQs6&7aYr zqzN89KJE&-NPyvW{foyJkVjZx*9(J2!tEjPh(5|75ALgfdBF(rCZ{W8nB>cgs4L(g z0r?4j5?zTDVmlDbZ1Awdm(qoxLIm0v02LtoJq4g*3LH_OaSuo+L8I(O5;)30OFEGJ z2CXQyUx9ol4fY+R<^!i7P@Xyt4tWp@X*i<(4A`Mye{j4IJqzYRtb>d>fVQ}FcY}60 zbWaBDYk|nY#vE=yB1Y;cNS^{^w}0z_I^FKcAbl_&L54S!K7bSnyh!-@|No1ue~|Ho z)(@cZg)=Ba3%kJyV>2iV5E@3f1F_$A9XMgY+{O_AI{!Hl8cbM+7MNdx!s&A)sN@B$ zxd8RCLuA2~duQ_!P^AV+-aH^-TbS?)6k#=(@ER0hewgqE6yYB-P_wt72tR}g??4eg z1ry$bBD@(Ud;mpw4ovt6if}7T_yme@9!&TQ*0GOQ&p`omD+1Kgf`kK4z>BLQ(6J9l z5by-NI1Cek_?{==#YUJ2#N#{xFXqEUAb#cvc+m?Jfp{0RegY-}@hMNhi%ggZ#FIP$ zFT!CW5dZN6yl{nyK)l8i@WL1-0`e7jj6{yToO$!G<1;E=D^hMMpp|BHzc)FU~2o()j~rQN$n1p+GKRK z(6B~Qdk3c099=Cm7Le4kJb;D+H@aGA{2-~-fvLSOfff$Xm_t$<15>*hT`e?Dk<|9U z)V8Cmg~m3L+6^$Z(GayL@eeK}bzZPN1*P$Cp_nNE)N@Fa200$7Zw85QkQ5`j6eNB@ zQqRE2L;!kM?8_EVMGf7Db^$V4#n9<`6cD>Tgki`%Lo+w!g zImrMd2C6u2ysn2f<{&*e#92QK;BFhpe&lZ39W3289>3V^`Cl}Q7LGK}fQ-sWmFONVe;z=;5 z)C1*1X#a99I1M2s1xUUF#kT`EJHYk^z$R*l>R*Bk>23yFgWkX7lmn+ds4T2MY0wR> zlHmPK4p<=Hfut;f?q;x=sQt?fNMfa|e+gZd^<){Sg2m`xLPKxcLr~}~3j(d50F@xH zdY|?G|Nr*z=|P@=7rx?P??L53M`S^&rl5cqAD~jG{dLeN2duvi*~r5HYU;V(c?p^t zhMEHsvUI%z>cE39(wGb?@w%HqF2Ps5xL1pm-FeGyz0vK#2Y5=oCvOFk&q4!zw zcV>deH9)7Df|h=RMmZpj5-dIU2jE6~*HU~T8}k4ZvOa;JbO|bNq3M!U3@scXMJL_kiQQKJpKUWVjfbtfC8!>a=}k`Ge`&;u4_fm!WB}#fRqP7lpl8mEt+9? zozxA!(WX0e0VE4DfLqIGVxR>Nr6%Yq!F{TKr83>kAkz^hfLkrv5EnGNEb`?&U>L-x+d2@^RM%U?I>6#@)@}L<@If^8wIW5NHgeif-v{ zh9r2Hcfe|Qz{(vI(LERr2bp^S>Oxd=k3cW(eR&-`=Wqsewgc$KT=29!L+3TcW1x#c z1we~Kz=zf`D4yWFp!fmYtq1SsfE(B8dg66zx9bUT0Dv}e|1a@{IRw_5>II#yz64z0 zfEH3h3Pt!00VuLxK;0*BSDAtHf}-mg@JPl9P>pv2w9=w2sFEH zU}<*U!qV)zgQeMZ4@c?#-JPyij=SCfM**hHYX@)* z3Ocg4x%R=o5)D{Si0UQ;fJP9kU;2-PRO0k zt`}Hf!37%Qdkwmg1uevGfotwHpnIMf_*+#$y?9tZ7D855Xm<#{yUxfOgRg z%M01tpb~)BM}pzSudo0AzhM9I|NjdIQ2%r4umAsFocoQ`?-YR))X+|LaWJ^|h|+ol zl`0A^PTm5UxziiE!s-clh1G*@SCOHx2s!68&PB-bpwtOlgxp;F;Xi*13rGlcIr2wv zx`LGQ-!ON5lD-V=Yed3T7Hay@pTofFe2O9QeLE0zpu5BIN%L@u*JW8 zpaclszX4r2jJEjqI(+dj@<9=cia?8c&{Ckvi`h3osioT!R0qMXYKCrk0k_~mrX&_Tmou;q-JCH%-- zEzmiGJfJzTzmVf#I$fWDhe4nGFa7dDCl6}m3-Cx4Xhq}y(iZ_QWTDrG!4If`IoZ2{QAN<$;tQmeS{(mNKY)f8d3q;@Knjxovq1%k0!p3-AKG^9 z8YmKvxr16^;5r*J^!x?Z*%Jrl6KKH>>+FFm&^yqEc_@nL16a|DBKicDzEMP9K(B0r z-c<=Y0}?c^2AZMkX83-g^P=KGP;`Trb~7km_8gdtf)fJuvi14TTqFS3%*M<_0cO zyB$P8U0d+kZlHDmD2ISnf;WSfn(@3?&j?L9U^k&H1iu3wp)VE09HCd91&&+LB6P(U zV$GobEodtq=o}ev<`QWI8w>V5PrwWATrjuO^$Vh;f~~>60Lq`B)x}?4IBZ2EMDVh- z?=!$j9alnh2Ce-Ctswl;?ZJZ0WW-9T|D`X&{+GT1EqI&)NuCKa!CpYya0{uFOs;@J zP{kEAs0|+Wed!HOli*ci@WZD-`vFuz;;t{i(a+xkI_es>Htx+!$ey`3{M#HjS`P5H zfVRqkB|)c5zB~vjk3koSv49VU{J_7>ffKYr1-yb}@&(XzA9ULQXjvbq5q6@R0ckj* z8?++@x@H}w;zBnA(rO!|?J1>Rh|mG;i$T;7SquUHOTooT8subKP$~vT8#n@>7ZrEA zemLg9$q1h*0JZi&b32gzkD$Z1zzr9~!Lt0V%%F)n#tC2#b3o6-;%~hOstjD8z{e4u z@b@eOr()DeFK|cL=Ed4eplF!u42lNuqG{+7>X*ErIVr{13o}l z(9)U*-6fy{1g>BYX8smXG6CnT8!tltf$JMk1yTD1eT&5xaL#&#C1;(S22PfcoVBMO zl(Wu&Q&*`xsAO_LS#I2?2hLaBp=UasM8N(P=?;AYUyFO=#j_Id#AoY)lB#ak3&$Kd z7`su@7Ay!*(-w4C37WcKYEV-beCVsY8I)Kd3%H<*&T*~yHGn!1RCnA!t~)@x=>C^p z3F@7E1ClupPX&hpsId!Lj|5tC#ouZPUN?FMeBu*iwRbD{C>GZv@bq+qzvl_4iR*d- zZQ%oW8a4I;C_VW)N-)4y@P9Ep04aqJK42nhR~xl%k9BDFhFj)Jn-=U)gK830(Gra}&plqYxgXQvn_vAa42Y`IR735X*OU zu`Sv)f~*vNA@KSCfAGmXoUTt^m_7Ud|AqV}kdHxI0WenSE^veRo`hAp3ZPsc@Z#Ad zXyV2)l_v5+O!n1())jW(vy=F@3-NEi1UYuarqmR4C)lY z2@J~O&0^|2{9<-3v_#Q~p*(m;}f-kcs!S<{ysyt=w=4 zaE18=5h|d==Q$ug-NC^QIYE`b1-!Ke94wIS4T!*jEGYjH@IsdrocuroE}Ox1F=*We zST%~}hWxG5!P20X3+PIU9xxB07^D)(DLkN)9zpvYU+hOX1#+7_L_O$gIwbYr7zL~E zN2oUfEe1ItGQ)(Un?aRsH2;v`Zv}1Cg((CL zXn=0+mEnN<6m(q`R2qJ!41X(V$3I*YJf_50Cx|M*UZ;dAAW(v)La?;1`3(m|Q9u^! zi`S}PTOk)%W~sbzf@OD(PAAZr562xuK&vkx*#w;N-UPgOc>5cu=L=3dJTGIo7#JqJ z)|l{Gb;4_<39scRyq1~pT5`f`u?eq*C%hJz@R}Fpijr>70g|Az#lhRNK#SLqlb1Gs zs~nz;1zykM(+ba6U*RbZk#<0LVuCXkSg|}p@oBJPl#I0-A_R#nvNKi%vMCDuEg29# zE)V*ErLklzGnfP@#Uf`c1-JzEj0N^-JS#k7eMU>#NlKuSF94CT(hyF8961S5k27PLA=JBrvkO|r0^Qbk9G=@0 z7#Kj#rYN_qV*#gokU4bBZM8~ZTj9CwN+p;NT9FCMZJ_g-QFB}I4dmSRj*YsxjSWw3 z16O1B8sWL^E<70`5)?eQffa8=DBcWKjFQ_HLxd>IZ3)PxDDbxgK=`;bJf!Ijg+~2QDb2V9mu%7m>2sYXcJ6ir|AL zko$4quD{QV#C31}Hy*sIFTv31yP><3qq~-ee>)p^H^hqO7qZPi6#3g%vO>=^^$^324;FGHq)6v?HxjHKi;1#5Rm zJ4@%s=7;jTK`Rn2KkmHAd8#v{ou&C0V`u4>Zr3f=u6JrKy<}ho9p$)%fq{YHwJ9ig ze77*3IQW9K^KiGze3nkvHQjD3oglI12lAbVz{g#8UcCH(+jUK+%Y4wJJR>NmA)yHO zC-p<|brdWNW2qj7)~;Ll`x*cL|NrtcGXn$vHaF(x2P`cIO4yFMGcvwrKE}=n5o~7pWYE3@ZtvEnIjpM7X<*g?~F+TJw+M5>5!C1T-@V@jUU;J9Nuqw;NBVD`@{8XqEl3k}S~X1kmvk z2vKnDbEMn#2&l);0N#ds1d@YAORT#=5siGx(6b-^gEByu1@}&7c>Du&g)Ik&3V3m> z9y~q<83Ny#!NG8how3`Ug_nVWL7~%~r5ltQSAfQEAghGjS(;BUfyBdE5V;rJ#V-M! zf5gN9Ir_$d^FpUP3v`YVv^-)h8=GqJ1b-O_OCQFREUC%(gsZ^>48RBmK@v~IAH=gAJQu7cm+Ioe5JYe3Il&@3TTb0 zn*ezCi9mS33r&csm!NCtCUl3c02h|vaYdF1ovv$O*&wsqbxm&sV`uCd*qyVkC34L_ zQcHb6M~Aqyfo%O>3Nr8po{wm{T0A7+HfGFTq2xjLcQbqgcR z4bVMnpsdvlxmFcz>>peU*}T}x{^~!gzorC3r|S{aN@z#(3(@8u@%-&aSRj>dNRV%_! z%G2!z+V}{%KA?ns7dT61p~^$_+dn1})x&Kmsl^Koexl%?|`x4wQ;PMgEtHfQ^0wDc(V;$&IBO zl#+J8EJm^B6hy_#SePgz8E%FMBOJL1Ccp!A^+brkOBL|300Impvf#wv#(dxf6S$he zsB@qiBcK{z!^>ZAx7`ii^pWUxV}Wd^4i9*t1y#Kh)H+9Q`+zQ0L~r}V9wDjia|BU( zf}6V~>{wbSh_(+_)1l28EG;V})1iv6m<~Rv5j61{d*`(RID3He#?9u3^57%eFF))2 z2yOKoX0(odP;>j`dhiJWpn40mcoUK|jJn-e7*R79SOic00yP5A8$DDHK18DjR4`yP zOQGRHUf@~Y;O_@55Pu2UYB-@gbVs-A5u_t{_dr4>t=n}^uLonN?;b?yEDb81y}DiI zA(Gi)NLl~dI%UYlY1pZHo52euK&1%(_5Yhm0t+&<94OTRi#aeNR5F6gG*=GLiDNC`d!<48nOY9OuAQ|!?)nE*y1oYc zH1tom&jc3G8kx{Ppouue6NnQy`I}w;FgDlzVXC_d_9%P{J7fXOM21)YS(PEK?Jng> z?FL`q)am=h@Z>Sq=M4PYLZ5epKI7jO`m7`LDgU<6ryZeBdPAS|MzI`c205TNm<80J zWMJqG=72CD?TFscCqV%(?m@1QZGOWM*6aEt;Kfx);oglri@eYaeE}fEW#9k5{Lk8{ z2o6W;xa@zaKo$eUVW%ONxWOG}gT-MS7!Cu^Rx)k?CEkw;phay4x4~UN?(Sv~>*ZEP z28I{0mS6sZrtUexQ}>`1F_0VS(wcuLmAr*SE*21 z29^TljI`z-a;51IE_`-Tzcdsk0y>!d#RUB?|2x4hg1GCrg9Iq5K(}Z?4kZK4^1!Tp z4N(Id6Oix(4;;L_3eJq66T;G(e<*?u0(b#2@+GKzd7+El3Yb|u0WT_izy`hGTgeWd z6#yOU@*>)R1-zOFv?T4rixu8rC7rGxUUY+0Lqy9~vNAM-mXX$l^fo`Z#lQfWhU#|U z=?!23kH8989x4Nm@34TTb3cB9OwYT1;os(<0qy{nN`cjZ?lJ-0WBvuMw=;kT;>7L% ziRMF$odFV1F8YRGn-@~+K+()4FTnt=kf1%JZdZZk1B~E;#BUY2{S7+*5p=i7g)D|F z(HFB5pZ*)8G zbce#l?m)#jz+#{a!K__Rfcljj|4VQDFTL|Z1iIeHmBZTg4pidA|I!;Te(Qq$1MOOb zJ^){A|A2p60CV%B?;QcmpvEZ3;s+q>Yk9z@gmk;JKvpIqD+Bd~K-ZdwYyho&>~>)3 z4g2360xHFxfV6`4%z=f#hrB-ld+bTKgG{IEnb)AM7pP>kVFVq1apw3Tg;^#Xy^|Q2 z7#P6LL0ULedZoLbqxl$P>wo^%Qcyn!Y;Jd`0H~Pk4!zMG!~-@O)KqRgP~rh{KI|SW z*-}dg7oO2XLDztQl!A|1WC82v=nfL-4r1vRYJSBCH56tdC@#&wMnL0I7OEd~R3jw+ ziGnVK21kwq=zu{`cN!c^pkq8sAZPL2c%knK4RcW1vpj}&y224~Rdt3Lv#LrjK&q;u zB0($6ZlG1iprTgbh2CmVT9=an)yF&xr8V7~O>To%T6BA`>}srUsP8=S{nf!=?42hL z{*c!^)On%v(7{I>jE6c;XkGxVtNQ@j|MBIu1Sr>mCZ|C++Z-wp1aTces~*9JUOWPA zS^!;h!`1Ej<+y_gXg>w$bWc!sfcb?i^eRv}P%Q>NA{Kl(An5EW(9sK_Je^LUV>wV) z4}#Zv6|Mp~K2aL9+z5QV4R|6Ob`3cXc!2E=DET{ZfHu3m1T6ywjb=bgW^jiaR3L)F zo}u{%Q=K>T#D&+U;E8k==v4!jt{f%uC?eo8^FaXg8ZUuP*9YKrSm3@8uybLzw11QrSvVz7l^cHlvQhjhCapy(EIW8J1=;g!CFD*-jpao9m&xAf(bMr3_hFt&I?({@l2hrcV6>?E@lU3+27zS%K^!l z?>hpRi7ImI-r^~8?_dYAb3T>&&h7XD&7sONG-pwsn9>$egM zNC#TBRKME|TG@-1D1%K{;0bG*3jZ&C5|+gf{=!-rI`0Bo0_6-E#RnP86YydS#C}WH z2PFZZnCEX%0?E2QfRrtA{H;PDez*d708asQ05&7YDWK%{;04PXaEP}aC=~|FLmi{f z-wL|y0_K2SN>B%sXuI1>|h55*F}<{ygnNzFgxN<^D~D3ox%4g>d#UZ;YC`gI&AB4G>l z^h=@f-~kQP^DCgi3|gW1p*MgLv}E%KXFWGqmjdX>8_-ZR1H)@E(6#fOt{ly^91Q%e z?$~Y|1y^627K1#wNCcefx*Zfi%g8|)^vR2lkUj})F9#2})p-Xd_~!V5kZNNN&{o-! zbnsk47U;^!7uQ}u+mqmZ9wk1YfCYudm&V#J>dFiZbzES7z632gY^?p#E({g|4cNT| zE!b$R{qmd{EX2UT!0^(RiGg7UsHT2t%mir>z=B4*v;^#Dfo@oP$+0vEE&>;{0gX>W zVg+<28K@Tw8L|U)dcn;o(2OJ`25m|qOH(zzY;5P%rBVcr^6^LhEKETxcgQeU8GBObXADIA$5@=rtI61v!W`vGSy!;6or2u8)m!PTQ37~=jR+>Z3 z-3PS}L5cH)Ve=0|*pNpK++c9rfTo@x2Co7c2NnbEs0J4>9LEoUo4^gACa~q9QZ0x| z(6uL6<#{24Cdm^Zqv+r;^#a8mQc-0E3S%U`7Od!kl~YJX7icdcmZA%kf-okDbzU4; z07~&21feM&+-?G;c#apVm%(xuD9T{@_yIin^h;&Ip~rjt0K+WM3eT6}pil=srfCQiS2Zz@^O-h>?z^ zzF@l{y9A*{kba3QSR<5cQ>qE!f*QcCJfH>Epu`4q1o+&|ZU+|d$Q^tyq9cE652$>u zL}TQHDWGzM%{BmhiG`3o8;03}rLY}tzjnDwCOdIRnrg9;;vWHL+=cF}|& zxb5%-v;$Ld5jcF16EV1E`a2gC4sZED;UEC+L3{vf;sJSf1!Qaqv>pX=LfT7+A3&pd z&>0LTNU01x6%k%2mS~}fcZa@de#Hnn4=xB~uD&F+DaJqLz-tYBDns``hfw&Z9B4UE zDh}F=2vrX`B`yE||Nr2LLeN4XP*>#*)|+lu z9T4|Lw=1|04m}p7#uUm2&7XprN<1$|M(l=e*7Sl|)aC*XUfKfJJk>=XtqVtfuR-@r}-%^yN@GslbP zU%*ZR-%9X;p)?ecH+f2Qp{`K?InoF28bfg8Kn|Wf4rzh39w?OtUs?p&AI|Y&|4vwZ zPCf8i;kfGyP$h<LHE;>o9clpDVx`d? z`T*3K)qxyk0h;Dy?RI_g+Nj(03FtT{Mex`TXi5A3QjvfcE8js~Ap#bMo!MJ@v)fe! zBV+BJ2}+x*xj<=?174DHyvY6xHRJ<4e!(Sm*gSAa)Ow&)7A}G429<#0ItjFB4O-;b zU?#gS(5RF6U;5?6_vc`HK*>M@)BymkivcISFE7eoz@lWzoGu?2744tk!5WLU@prOT1*CoeY zK|8$|Ku5vAYTpen%ptQZovwQzQ#P*8J6xafZ*zUt;rf(+o9ojK*C)NMPkIYjjm9Dw__w)U>u|lwzs>b(hwGJI*DH9mHP>!oC=~&v z4@S`J&i~RSFWz1U2X?pXgihBP&=Y58fGfxY-L5k_U5|hxWyXuAir|da={l#|bq1ul zBU`G_?Ro&h*5Plt22Q|GzAk^uF))7#|8@bW4$yE$2Q=w2_PSmP_+L8Xg#u)QA1GPp zpv%oe$ORzeo`Cf=A>>S;at!}VXZ$Zc@M4=X)TuL?YiBU+7NZ_^3XAo{a^J2$sbT^-QAqR2uaaYh@8-|yl;t+C_Qg`SYNRGS!^&=?xU3jtZ z5!eh+@&hflN0F0%43`5P2>_J?CBF+Vm=SVI!Ikm_v}CgHEIgTjCeo0S$pvsSN!|oa zCM6l*7}A3!kqa-FAr(G2C0uxM2vUM$O9>aU*s_>kOo5CfqoxEcY$?HY4I?x#7%W}a z@b^3dm6D)?0Kk#g3R?XGatq{qrPnFlt}8&@5F0j7Cus#}Q8Z{oYC^z^Bo1gAh6wTm zypV-B^0j)mD@2Urf9ZsP7nT?b-4{aB^$KveXGL@E3Wm~Y;PMqTAq5)Uh93C^Y6`## zVMyE|azZoMCoox%XKF5iMsHG$SwTl6max9~tBpQK4IUJZdGTc;sOW#f1TFfPfQ$YG z;CAsGSOxIJ@Ibfg0?>k7aK7(!-2sYwhAb{nfvJ8S8nLh*YCJ1woMi#nKO0_#f>Z7W zNFrB+^@*&(YCxiB2P^Zpf{#>j-2g6fL3hVNbn5W8fJT11UH3rvy8JER1BqaKQT|rQ zV8R|~-T{v=%ERnC4Zf8IEC*^FgH|gigN`0^0Ni@9*KWuV4^O3#y5VKz#`>hBGZkZrErz`)d7+c7 z*Nvr{qt~6KTcFpCh4WOWK(8AINPq(*zyT5fEn%DkE&*7w7<)sH1O>ccM7K8_Jl;45 z99wfh)obZ#q!5Vdb_IDE5+I_bzQP~X&6L zMA{eVX+M^(9H7SZm)Dlfu3wPO_WV+F8S0jqaDzbBAX%(fvK%~dfZ-jxE|7Qhev31} zhpa#YCjQ|5ENDG~&I>6!u|0lZ~X-i$LXjhiDESg;s{Wfoq~)4V0b7OY;G*V+*T2=dplj0{D^1SO8&`?+H2Zqvaa7?{<@m?6_s&3ae)~-DKt>F7< zP$vDsnQv|fD4cqK!oz7RT<7Z=(D*KBA<&1{QD8Tsdd40s2KNkjEfuKC1sdsucqU{c z*xjJ}ArPLaz62J0tp#fM!Q8z7>TYwm?J##&fQmKr*nQp(a`p8e;A902?`W`dke$c{ zS_2Al4J5Ogl|shOKw|@-)f%8?AZC zy#cKu1dXdhj$nbVLyra-yv+f$4UdF%=tM0-kHl*Z2-w2*{}lC4n87)v@Yev)hjRmv!;K8)KDdbkf4GNziWXb7c{pDno*H~ z#v4zkD|A*I(mMu~de6WrK{DXt6QmK6V!-W8(9|u23vOqExS)m-Xhs=i66zwEnio%6 zKw03*S8x{SbZr6mhZ;crq1KxJ|NkR(iH^I1YC(o>*OpG#DK87zLA{RX>#YTO8OK7@B`5@%O8Nwom*}EKvY$CheC1^JMv35N`Au-8?iw}Pdcty}#2B}HiCQ~=aC1swu;u-A=65!yf%=ym4+pA31h*Np=t z*zMZTTfox08)OPO`g_6l;~H`Uc{4!Z_<B?v}8bQ)ZJ zw*w2Phx5O*A>c*GDR6J(Wd&RoVwx_0O9q;dXsJEy%y4B;U^#$?>fr;SpaBeUwv{Up zgA7?g9RnJ}T~KrOHRFT{2sQkz4&W}V2zbSYNb?U){(eQ!G8oXj^O6@o+rYyJkkv(? zu{nsV^g#2#gbycd+78TebCfrXZI2PkxdlX$1V%gdmx zK@gMw!cB%O%USZ`cstZC{+3RV3tUB5nrlTk`TMItyf>f@k*h|)|I#Th79Iiz7R2)q z7m4z>3V=)LC6N5f0y=K;A84<+EBN?w&}KqdI6#65qE4XmAjB9@-i1iCoaCQ!sQD3N z=f#5$S)gMfoTot3Dy|C{5sDcsT^H1>>UNdrbluYJDgz#sR_Juy)9tF#>3RSZvAwQa zz|O5W0d_8QB%4+)f!HVkwvi2D<7;hX!H>tm&cNm3Zr6rxfzHq)-2p6}p(nZnI66b2 zhev`l*OuN0mTqQ9&I^X-JZDhOiv{Pr0+w#(ZZU94!rbc&>ES{P4QEJ6;tc8K!UVx3 z38<4C!O~m0f*j3I2VVg@_y*X)pw+CMt`EQtmY|J;uk=#jU{IF%UuyEd)Zl-q&i_)4 z|D^}OBicLumu>;?(1UdO4}rIQ8lb9F`CqC4o`;fvsDzH|PlKoh4KzfsfWotYrCYe0 zjq^e$I374aV-5nn&XC~-XV7qi8z>^2!NU!pk{qN9G?xL=rHHNzRNVI>>jDY9dXrayoX!jG6JDK-`(;0HoD+Ax=CD2>DqSsZTw}7Rat&<&8)r5f(QaA@_>*xR$ z;jg(SARX&EqtkUtbL|uc{?^tX&@uNp-L+3rjcuVro?PM>{o?Sj;Kny+7#J8{{H+01 z^Kaims`*wEP;1zgr?b@nt&VT?0IiDp|NsASSI`;=hUUE>r3|Hd-C(8NlND|=FmwuZ zPgViZ0W95}(9HlTkvUpGYq`N@fevm42UPQ3aB!81gSs7CK_T^`9CG(tCsZD6X-Og6 zNK3Fd=j{y zI)w>;(+eI@Te%n*jvu%%57Ywd2D=+N=FsWd(z_Yd_Q%zFI}YA74<54c0`(!cg7(n= zFKv0TZ_Zax5VamC(e4JT0iEXo=`D2kf)pWlCE&e*X0TGm=Di>l-gRrcU0b>tI$JZq z83#1S$#A?Cbj1q~s6=W7U2zDuny(wI1g5lkFGvGJ2}~HY-=U-YHdL6u1$0v=R0mj! zzr_i(P6cc-$h_lllV56r245kDPX$@m?J|L!D^LV=YWm?>Ib)2=6t`P2o{Aqp;v^V8*C-xg@X@RI}bq&V!Y7V>I3rl z0g26!hyn2!FEL)=-_9_j({({}?E(h=4nwe^3p!gPKzY`v8%!eyHb@*tV1uL>!Bc49 zBV=-qA7BBmChVRHvI?38Kyy|6+b&SMLz_*aWzY^R##UkCy0{A%FIa*@hQH?)Xru`e zc_m`a;5cJ!-U~`q^89TUka-YDDg&j3W=O;|?*+v^BYzv{x>ZE_fJPxSi9!=t=_N?U zVkl*Q;lS|a|7*m32Pk=~6?Dcdr1a=)O#sy#U=c_I7qmkP%!Q9$f_6y3L_n=qPzek% z0i+kEOScecD9E6|NsA`FX(h3FtZcffbRygA*Hkc z=%98HxB{4ME)X?vH|mrc!9}q4hf0Nz1+j!{Jks#l|Eo5sF<)}f+B!{zqJ;$eh(Tgpv}O& zlNYhS_#YJTB5*x;loS$+pix+GfWEANhdMaQxcFN^YsX=x!^VsGTR~^U!9_uHl%Ocn zfoq1uW2b9Rw`!;R*KmY%SwzMl)AXZ`P7ebn@kX9(D^$eL&LaI37O=F4Iics@F z3;IC)EAWCo2m^ZR)G^oXpal%uJ6yN%Z*$$&;kuQ7o9osN*DbxSTktMmAZy*j|I!Qp zOV9i-J@LQv2y$OPi=nsG<^TWx0spsxI)?utU7FJ`K^8)Ks{4xv3*u)l?6R&RpI}zNu1o`7d$xldd zgBv{1RO`Bgzf}R;C<8?qXcP#%1eEw;6G%etE#QDAQtabt-L6j%tE=X-VIOJ$ZHsyF zVfV}btW9^t86f?S)NWDG07Yl$6T?g06W)Ms&uMsZi-7^Ovj5-@rcT!dh(_$o8(g5V z15k&h8?2~%DyY2+Y2aJ5{^xI5!v$L0;?CUs0CaIr>s%0bJ9`>vjg3IJJ9I~^D1S=} zTtcpt3p7o_-&%+eDuD>K#36)AMd7<;XF^7WI$b+JQ{^0>UA=8^A<#bJ?ztcrzNkwB zFX8KSUD8~;gn_?B7}Pt344WKx1ugmm^}@qn?Eemlv}3K`_*+1W3?ci8<@j4KfRiOp z*bA)!_z?3RP+9BR@V~SpEFk=aZ5P-IP^WA$STRRf_=~OmU;{ydeGt{n2N*%Q6SO?9 zCG5qe{orH+n#^eig)}4(n-4L9!?Dw~=QT^SYY$7eYfm?W<*^dMZb&b$0Tefuu05rX zpfaVL-L5^5^~T_%)K-AT!(7)i*REkG;p}!@(;d2^Gk^!Qf)B)9(H*)5d=5l|rRx&@ zzCVl%40v;V1nfK-&QEJ`m#=zQtU)wSi9U0JSe+;0(?(i4v ztDz!1;n2wQ`w9-k&SNh@3-3W&nxPV=Pzi8-zp^A8>V7A{86S!y7TE`Q5k zaBP6b{*MHNy@=WYHXpQ%bRVkBEriSxgv^$JuonjqGF>p4uwbYwK7E5a59G2J3%@{k z5I4b7hkOS#b(Hutzu^cEdok-i*ctyzTf)GLgexVX)Aucq4csdsYqr21^FD8EDwr0RwK0kDCc zt}P%lKuHY6rTi^>SV0j2%KUPr{va*Tu(N_2ECLdJ!3Hy!zoip&K;RpABG{AzwUWOz zA2gfgt^jg=3izDX3818S+;s|wqHjWm1eScM4lE+VUz~+hR`7@je_^@;96HBcLC2gk zyf#9pU5KHU6QUMku3RZwx4S~8E2uF9%M2W!AnEJa%Tmzv>>HjiXi&cY2$29MJV?2v z$lnqTT44x2<5Ypa#Sb*{!B>|q{)8TJX28p_Y7QCi4|Ip=c5k}^Vf=(ye0Be}f zc+K2dIs>{#p!tU!e=E4C124h<0BXjAmWV4@x=!G40p%0WihR&c3Z4L{8{;94hc`DE zz|9o_{%xUKU`rsk@NWwRHK?wFmOyR=HL1X}3(W^ux`iR5cHIo{nF+{P2}q8iH<*R< zL?;t?rU53*(G5B|3nUEQCD004mJ9W%D1XaCSY8H|MPV--AayvXWB?VV&=>?|t^){} zwFo_+l3^J_W->^ob_zp@1gI5Ix&i8E(aqp^X+2O{3Nn!)>_1#;2P8N;kF|a)iRgxx z6`z}7WrZ_1`-^@6o6rf4SsVN73wvR_ z2CN0-3TP2Adns7tnCo#yc%;gM7I{H81IU%~!cr{@cmW`|6lwj&-`Wh@OaLm0_*?EU zGBAMZ%q!r67j&eq9DnO^NaGWhKtE)Foe0XdYe6!#6BtT(y4}FZrFAwa^|&d38l}*1 zGlu&5U}rC==xRO5-vSyL;NQ*&Z9+IAnh>!d-E%?8I&VT0$nm#$fGmNvB!gchLGHc+ z#jYNz%p-&hWd8}cuGkU~{Ne;c2DD!pG^bM{+wBZ01Yt?q47T8jzZGGf?0{9n2xEQ=A8R)YetPx| zdt?{_Uc7gEw^@Ez~3YJ_5c3~C@pH=-(2YXw?T7vpf&z491}rvcZQds zb9Z1TgXZo)NfW$K2jpwE-8cd*anj_%jC9m*=@b(>jm?0-$cO#M=l2^`k-cGPoZNVL&&=y%q)41E2-R zTS0RxFFr%|_dvoPyy_aXk#{S|{(u*~Zy`wsJhl!|(&^ej-z|ACYdc;xfm$H09gr~( z#ZsQ*t_mQpy^Ms2gO{pL=ysg|QJ}-$Vgr_d@^$%Jbij=pa5)3o+|=>n$XalSgG#55 z;1w=Na!!y|0!Z#ELJqXKspEwjLT)ES?*CTM*a##d|Ce^WSaAkyGHh}OveWGi2TZ|& z7Y`u&us~_4Bnp%x!9fnvs(J;iwcEAB8XWGW;6=`0=@(O8Ax8+P1=&%`2@9bHP$^W} z@qz`?ynE>gUVg*zzqI3j>4F!kka7X4#v5voYr{(^7WBkbq6e+5K)W?MURWSPsTo>8 zmQHxFc{SK6tp`dAyIng#eLTp9+m8RG6JCV821|Cjc0kJoHn5roh*Paymw>uX9i3qR zb-Q*zqYjcQ8UB~f`Cr-r%N5Zz@Z#B*iGkr|JID#OG7S7JcHkxxy45#fJ|o3yP-fUxZOvlr;vZJ>gQ7rY-WfVmmImmHEPOIN&j0O_YdiaStw z4{CdX%$d3v;$En)K|6=ROwi;vXzCWU_DqGp^(!L-!)pt$PeDZ$C_TwvhUjz!73l#W zk;6zLJOM9WJO?|m)3u@7wE@)r02u-bGXB=rpq2wjBPhRthrq6^0-FZPZRb!VL1(UR zM@Vi&kpvB%F(4#CEqzd1><;9sVL;}LXu9|I&nAVosUBCuL$ z27qMuSCBi!kGWoF?1q&;viz-}hAh0e(dKUj4Wf0sPJka2WX9hL>g$4q5To&{LFpGX zIN0%G(^F^&frkwETR=UkZr3%C@=KP#6|}$vG>ib70@MMmh@Ai$!3PawtODRajG*I6 zp>;FFsq8SPc7U_Wlmq#Gk;BPqvF2un3V?Trm@v|&{>v{+u zKGUbl-!ca-1ZuOtC{YB*RO$>t+a2Aob1=8OSlb1YY=vxu2T6jLVM6zk8G_d1?f^|~LDJg)(meq$?!|rt ztw!k%-NC;th>3sODG+Nr=%(3#|D{_3gIBv!(0BrEP2>S>!B0p97xUn4UN1qNcu>Juf?AizK-v&k z8v@;rz@dk~F8Q4Twgg_6gh4f-)g>JvV6&ig$pKJmFX4r4q=VHZpwnFryqEzgY#|u~ zvK*+J0jbh}Ch!vRZr7I910@2GW-fRw?kN`V!JG}2;7Xsrqr)?RIT|q(`~ZNO0-T6Y%0!B-rPzpcQGZ4e%VKUuq8O)PP#u z&?*Af%D4sTp|u_;5rwJX33y=;12zU$g_Ux>IJyMX-AR5+3@>;G>fHQ5+6e*PjP3IxJp|OV2|p^%0PCZG zwq8#L4McZ0gSuGoNrE%`!EIqsF>oAm@I6F9=P&S}cDDg&pdbn~E(N|*2s}C94dQ}_ zspR-uL9Hq9z=sSx>_DS~VJ}|5`1~!Pi`BqtmiU2-3eZW>wHFxpTUbELu3W*X8GNP3 z6;Pfjy%P4~3ZyUJ=?cEH19A^9IHO#7apFEW*@4cvgtQ#5{4c%o!W**K8FYgW^h7jE z*Bhnc(8H>ayMl)Q8IHT20G&Sf+8peddYD0by4`p{RRLobL%<6rm_bLtZn+WmB4RzL zC>H2+J<(iyf`PxU1Dpa+FhR~*0;@XE8@eM1Jo)z^i!lIPI^6kRdL!&bCwPj^pwsn0 zbL{~J{#MZ8b)XZC`CCAT*TMYE1M$)QVY~&Hp0Q~>bJ78mPguO6@ zoB28eWL61eCmL=IEN~4VN0b_aecuSN4%7Kr3;|%vZiKx!4PJ8zbA5>hsF0+yEU4;co>s z071hcFG|C}nXL5yXg?WG_zTByD4)Nj7gX6mhN?l^n88(LY6Mss%=UvA3uYHWg0Itc zOY4DBju%fCfb#bia1!0}LKULW(se_rBG}S9a7#gZM8jVw#DYzI`3$t#$6cY@cZ=o0 z65i%F9D(64t{np>x9-vnogYC1P@o%kIzPe&%35E5QXgm#(JvHiM(cr6q0W!pu<PFT0lqVbzZ-OBxCE%&cD>RWAOTK0SHfQ$N`kti1mruAJv-yTBAvAxP&NMV z25W?x{DQI5QKH*X0@QlH1UfV64Nu^UI*8Vn2if405d5u>Ss|YA7m*=ggF$l}@L5TH z{#MZJA2^`ZARdI58%JPaapOe|Tq|S)%8eIpun^>L0j+HZP4$4z&{|gv4-C-SG4K&q z&=bLKys(CJ;UR6<8!v1i^Ixq8>S7`4K!JjMZ-JS3kcaMN09#!N2ZdZ^-NII6~Z(R!-n?TIRw$26d%LO`1SAZ`50d3^~-F63V zFR^4X1cA=U2bYA@vloqbWl{-SyA|NouGtV_3)s5QS~2@m^Uy5>bOq-1VAP$C4H zhXV=CI1Kh~XDKW%&V-l?GOMHn>7eNhP>IhF9`?d?H&{pOfs#;g!I%Nn;Ccj9xR!Ff z-~`zWIzCkdgLNpe_sikZXSM zi7=qc@f=vXK?kk#x2}XJ=ms6Y2JQ37@wb8|DWJ-r$LmD~f~{&jP$~+SKx(F>!UW-$ z=Y>NC2U`!6c*5jZU=dQv@j`bFwA^9||6jVLyL3(13pq#%Z#_^V4$k0P!d^H-yxdv4 z;iU*Vs3u$zQc*R+4Te?REojU^+e5$?sCv_)$kX2QD7fK;&;W1Esw!T18m`%7n>lx z?w9jGy_nJst=~!tA(Lscr5Rus%!V8)15Q=@pssV>QtAyZEO-LIMzY8TMvLsxbPP@A#IzNpe>l7o;Ua)3D6d_)+$gPQo5n@ zQ|l%EmRv>#hR#p?+nFG_C=QbR!(L4Ghgw`J)cL8~2|6{R&)*82G6&_3hmaFsz_|ld zq+W#ZK}EM1*c@ol&5#du8lfXk}~-42lQ>H)00Is?jA_aIH$)&nJpuT_5aT3(%>T zpvA&d4t2Xe!M>~R0wYu>gQe?*nw{Xd-0-3mQqzL#j0X(-Ehj-)0(5$@1o)a#kaNH% z9D}P1@Y-L{5W|BPz7TycLH993Q;-AnfKh=KP^ssRXxypph2?d~(WV>1U)Vs_G`x1k z)C;a=Z!-cTlDefAJkMP6kd@8W4$2*9|E9jA}Q4 zZr+If{{R1k377}Un!MQJ0cy%D*(uHdxrn9H^#b_%hBL3t;dd>{l`4VnT7)H-QpnuW znHLpq-~`p_df_!cSOw^UN^r~{?smNZi_r_60TQrV4eoR|^V|lVr~Uw3MX^}AJ}6TH zGX*SN9~6s&n4mjNI6w^0aRzrf19(6^LJsI93Mzfjn-4fTUC+GS2Fif2D{*0d3C#jopHM1iCZ;a%wO5z_J&hRwTp!(ibn5!Q!;k z2z+YA8E~Wd#fvaV`x2DCxk1Awps}wDAPuDu4KG3Cirua+;73lrc=2NaIC*rsz5%Dn z7cagzLi;Pw1B1Ikhdx=le&Fu`tv5gJ3YtM>03WLfx}ykI3Y0iO9U6KCbnp&8SR9lV zwNS*nL$81jwS5y11ael?A+TMo2lyd}+JcUf?uM9vrm`Uwp|a&bsY0{s6-KDZ43@4} z_`N9(i;IUWMJK`GvL5I^CAf%06ux80G2Ml zfUioyalw&57c|WwU2tRu(a;@w26S*G$^}QSrN9*!IMN#+wLH?kKged+GoW0;-|F!9 z|9@Cc0Wm=LA%Qba>jCJ^A{SmffwXKuceFCTh=WYEf;bE>0wElf<0rs9l$;lLT|n9T z>{iGeBl?M$Pe3z=pt(qf;|I=wcVB^$s~~8-8~FMJQ2cd+c3IDO?F3q%fjEV{jt9hd zVCe*_gRcirDis8ai!}fETFM4KXmSBq0CbK3=m5de9gvF|nh!7@e8AKjz_UXD)I@&4 z$arBthy^;Uj^X?F>;nRwhZ-L-eE9#r^SS2r&R>>SN(36;FbFU(H20|d;Rg+cy#cBC z&(FZ1c?HI5y;Q=h3KD95!NT~UnS-J8LGuCrgD+SPK49r=2Hoy(+!eH1ivj8>W!O>b zGrAqXw?G`~c3slR)a<$hw8Q~?DiHXr$TR_LsA`5Bpx7>#W9q6b@DO+e6g1B1@be|^delXC@ zI+lpL#qPYA+6E1(J1BRHfi_@wht2?HJrJ`OblNzmrT{q-yktqPG!N{j887}o>L^fu z6)JMf9b9X*9w_kwJ5-_dK#2o{1#Yn2gB<+=W-~%g2L)Y}30=1IphN_my&r(Qvm4UE z2JJxwwF+juSOn1vI$aZVR%z?bfB*j??X_h*)~pEP^=?+V&A@ zuv?dHx|=~NK^HHB8IY~Im^+IY7?7`D1}l9n2+<3<&KWFp{6GX3Xj5P7ff8958`L9V z>;>-x4hnd&rV(5jK{L#2Yv}eM*CnvML8{%ZOCb9aKF4|YUnGkB$cGkB|UvjkWiyxX{0<~Hc!4)6pQSQmJrZb3WPMc~+5@IvP_ zG>wAyA(mb~4z9C7xeivOunMp+FziH>Dj#W5s(>%(Y6g)zSy&htKvQQ7od%sH9DjNP zSehUG(Y(NTu=(MigD;snuXld@Bec-GBD64le=zb>f;3+teJFkCUeY_cT z)e}hXYa3AA#Q0+CMOdU|F}zp-;k-BpTFM8?C{tdnegl^825STj_JA2s?hnSgozS8> z0-P~w51)*h*PN^P*3)%ODb`T2a>OAmK!E=4UxgKl~`1IS_84RV1AdOz| zC`B{q21(Ghgs;HY5;{nLiVTQ6xG0E$81Q1BIp{t`(3xW(4Xp>Dx5Q0(vGfbrORy?o z52Wq@9}oySe$UeN0H~?E2UI4z9so6U_jHFI0GGmhz_Xfr5KUdsaSbmlo55ut%skL- z@13qEj=O?(CNh8yegzfjC%PS=Rm>S^6$9D_@*=hotQV|`r`z=msFpYZF8z;yTlg2i zRm>G|+k?l_^$Mtpxqw{7TmaRAhrsgSDhAY=hgC5bzy@6aS1}hr-Z@mp15ycc4~iVv zb5~HR7}JJ#pu`4RK*rx<3YydgM?5I$yaXSe3g&{Zcw`CaZ8mxKa(g`nQ7(vr1 z0^n@+@){^0!Sl16@CnF*%gc-aqw|*XF6a0XN_Ae&d?poVI9iD z-vYWVsymbibh~3H=!`ywlEm)NFZ|nrn42F7v|K6)2JyBFr8WOjEOCF$*&X@?q7=et zy;PzAVIg$zLj@q3O3#9A`oiDR3F@zhe(4P5=?>-S4wC2${qWkTJM=?$5Q}9f59rYP z50FXO3*D{)mWS%%K}+lob-RA(2w-|01Xjoax_yvbKIFP{C1`2>$ zRUp-%gXBVaKu05hZupcyJ#bF~(ZokTl`hco<^RURj;q8Opr6t^W%R|#vw-VeC6{W|ATrbbAYIT7rXzmGc+FoEw0T{e6j8s zI|HO!5!(6m#k=;G|5+PWiZi^H1l?u?x}^tvBqYyk5ip;l)0GE&HP1tEtq^-SwDW0L z@Qd{GFaI|l^IR#;&^_%5sFDYrV#mUG0DO=D|Na}Tx53N&|Ce%fetw~P3p_Io4ik~q z1C{K%LHp@mOM+{Ckb*rL;Fe?O;nv#~%%F>}(ah|;mDVZHdb^Ib*ZKczrp_C^so)7p zuv0*{LZ3DV#lr3t;tbuBUw~Z$y2l54Bnae&+k-E_am~?ufYI_$N!am23{l3QGuE;X z=rCSrKA_SK+5q&wl;{72<|CkcSGrw6N)JBZ1*edMF9bL*9DKmhc?=YV+b?u?qgr!< z^HZk)Xdv>-!516{9|)*2F#Kl#>HNaK?EvQma9aBSb@gX{x!<6WFKK)EpOtNeIK%OV zhwG!oYeqlwZK^&a8?hTH37<+0FLVB zHxe&Sx4!((8oOK^d{%3PBq%FRnE*1b*Nd?`l%ul;%z14H%>my-IbO?yg6{z%yaN65 zVgqRR$q@n2F{2l2IY7I-N^eg%2}(`iLWa`}6oWsPf%>#O-7U=^|3M;7+f~HURf4~F zJE&g3j5Sc_7Bs(v9-$iGyW5&f2jaC%8wreCx}pv>`OX~rh3V@D??D-2WclozpfU0)o041Lj%?A{^!F%KwT|r|F5Es{ScDsJj zb`|M#mFRYr03RwE+W8a|p4BZc|FiNggNCO$Civanklm~Q!Ob;x~KQO|={3;~OLC*Nn z{PI6*+ft}AjKCv|n!Q2f+myTMm@Ebe4XB2!NG9 z3kUF>mm<)r4J-{>B+Aqgz-(Rm1=LXGfmD!;pcOi$UpmnWP0#_X3NP*$f`aPIB4~iPt9#5w$wPtee+2RKW- zcx?n8bOhgMJoydSq!-YkCGahMs6r>e#}mVcZb4^&9spN-5}mFuUV=tX!KSf*tArPj zaa;$`K`4+-A<*-!mB0-Hh%86Tff6xrn*IRFj&+a=&=4cUpd-frf`ZHS1vu;;{R1^F zKs~V!FOGuqt^jDphXs6-&V1y;=Cv|M#ME#^2>POHax{%Nk=Q@1Blff$MKrA^Imr}N9*m<@7)s| z?lCZQhH*fYb%MFa8$b#{wQTnU6S!s&3#Vp~Buq1i4bf}>*9>BzYj%Oz43g}e0OB5R z0I?yOE#R6#ES#D_k}%C6Hb^t_oylRrFP$Ezm^(ke5YvIQcn^b`$IdLE%!#>4s?M0cp3n$G`yUl%JmDlzxk!J8O&`4g(+AuhyhB2V3F?0AeV#EF{nxXrL!5# z1)BqECx8|)gW9tEEufX-AlHE66~#5oFxP-&z!rcQU<<$u?5+Vt5?C>a0agrVV0R73 zoYn)SO~;!-AqI-u?q&~A!Z=VO4q<@??I3|u@(JAH02M@FHIQ~YG)sV|17u#D(*cF= zzPX^L6GwLe3utxSWflg8*OriZ>yi>q2&1@ErP~d%E}JLd#ZJ(cj3WZzb!wo?2LoO# zhl-T3K-627?1L~YO1456B_(ShjN+2T5QZ6l>mATsTOCXDe{cSN&^f8S?hl%O$d`rj zZ*!yiq1CTLaGOfOxjM&Qg17E9pSaDy&?{mNS*FMUx`j>wyaa~@79%__9)Z`d34nz; zplgCkZ*`++g)U2LK7(Rh>wyx*ZZt8Fx%>g3OFp|G=Jtx1cQ;=EU7-F3v`9e17kuK~ z@dKcO}S=R0!PsQh@jo zE(CH9#EZ+JhQj<89`M4$2kJkG!;q2d(tzU!0>HCYoxfm%(zeGBgg}L$F#}m-Yh9|0 zAp_3LkmP&=w4~vP!0`hoz?!>VcJOpN$bhDMCV?6S&7i;nl?tH!Gu>bw$f=N^`vbjP zF9W`v)tbLG8mtYJX`6p2)PXjyfmR~(yx@nlGGA(f1)&rp7P0$=DXemm-3!hwYXn>ZjSz(tTcEbJA|%IwlR8@7Yk(NmoO^+> z8MLCiQyWxr@v|^6Kz$ba0M%2z577Lhhvpx+21F6u4HrZBf*oS<@dNO}C>UB8f$qD8 zl}7fkG6!Js~$%(9O!AS*R#% z)!ihbbh#9 zTUenBm3UrEfp`?;og~l=mkh6Ez@8T9c9{W*e4c<8=RtemjtGFpRY9Y)0^JOjhih)U z1bGsy7_M*`R3T_t6L|b&@>g)=yaX*81s(s;`Rn+B2ad)Z-7FJ2U5|ix4AV?NyxxNU zuTwfdFoP~IW3Wku6yPo!;3oS(Onz+(SL0f02yw71$PF$VSdd*T3sDYrF-Q{R^J1SOs5V$P3EUnAUvlx|MMx7UUT-x2*Dhgg{;vyKg|U zkRW_r)%;(jGzH`s&Wvp(ji8XYbKDiYnB^sC=oFI1yF)j?6ZwwU3ZQ)%$SuNGkULz# z!W^Jm7HfAfz}meqt;neyCI)U3LfgFvF;F&!=6{H}&8{05yInU}yWZjN0d4rllGay% zx10!o`mnBBKv%9nmeOniEr4<0XgyH+78G^?GT@~!93Xb6KxcpqqBt+H0ttdHH`?=B z6LfDJE@-mL^#EuYv&#h7V#|`W*U{as zM|Ob*r(g#_Kk0ToqwM;m^+1VDx9gMd7ZhF3KuiXm`RsZEcHpz?5zvt4258j{iQPk> zD`S{I>(fejnq7}DHrF1JFPs0GaRSsWpe57IwI>+)+lu~!&XouI4P-dXXQdAzApsuP z;j{zSD&636sr5jK5j0i37RP2OEQW8?JcPt9DBKW9AGCv$2U3&D@wd(Z2L=zgKH>rO zs9i6-4(oQk0v_Q4Zv+HQN;^n&x~>7m#fU`DtCj{ zinIJLy%QGjLIP5IL5*s5y}5=kc~A^B~PI1humad9%f)* z0DJ8vsG#c(y>k2jv=433a-dWQ-iNjTUGf4stLjQOo&b3D08+4m#~3LJ0KR~*7jvMd z#a@ABCywxd7go05`~+S?;LYFX4q7VUdZoJo)GX`|B*2*rDIHyaR1nZ~1ln@}zbPHGyddm_Bcu)4xgFF$2B$Mn zFhUZi5`XI^Q0j3LY5wu2#HJfW|1L2B)1OLo!1Tuw6)^q2L}YC!oCNFXbiIS{ zM0e<&<_CkR)4OG zf{yB9=!OmQS@5@j`d1K7S@O4lhKV4YV*VDv|Ns9(I3@foEO3q)bmcvG(61gfFSX`^ z7RJ{KFz~mSfd*h|?=bMUMu5aX^0W`;YU8#_RQbN?*B z*|pmhBJl@4YFA_lmT1m>zzE8al}BDifQn?8*6@HAhoM@Vp_;-2Uf4o3z0?JT8Yrwl z#r9APt0$nadV&^K@lX%DLL{Kx4hnd&(;OOBPZ*nPpDQH@10o4xC zfvXn~-26u6#V%1$K3>%Z$;S+xt}j5%at6@FiqKgolqo#O{NNkttlkO8WIpts$`X!l z*AI}(>6=5qBdz=`;LQzSUbh42wyYN~HiB>51>HmmT9{KJ+YOclElm4g`USKVLj-cT zRr3$VQqJS9512u#-KD!-LAwr^S`L84K(*g%_T#P(KpV;-27qq1eZvs|x)9VKY=c0j z>ldsxym_$+TB$;8c!I?S@DwM=h9_VfTpwt=K7sj?wcGW>Ypw3d;5G?p2Mf4a0-oT6 z2%&`zVnKt(i&e=l|Fhb(f&v>fBndko;EUmbZdV@G|NsBn!`7y{K4H87YDB;3cI9b) z!30_#rP=NJ0Yy6WL-QfVUY@Donk)1PWwGxSe)=%4PM2?}>Wf*hS*JRrU=Xw3^)Xo3o8#O4rVCzt_QTLGT*vJ?g- zK+P6$23Y?C6!To5K?a7GJ3$qPE3_`uE{y}FO?Vr#)E~kHPY{D6d^P z+fBh)2C~c>I=CJB1u~e#16oEn1#~3N>oBlouR+E^n$;?$cF-jouQeccbcenH?Ir>@ z=AA&3w?{ym(b&N&2VRSTmTW-PF<833sW}Zc5Ek)ZZw3j0yy?`8@Fr+{9W)RQU7iBg zFVpGz=Cwq(>l;v2X~S5`0=aqf4Y*woo`^4f)Li?4xx^nt)=PsTn!g2fnk$G^!3~Pf z7mUq67|S9tr;7!;yCK;Zv|IwzbUktK7jvfotL{#K&vDIUhqMt*TFrp<|&}LU)L{~1~FK=eyNj27e54=reu1}3>sHKnbrfXaS(X% zLjV-AFB(CaN&vQdjN?TeWLpq;g^9@jQjUNZ%ON*)gIxt$*38lED)6!zREg9IFw~i% zTZy0#qWsfv+z3@+fc25S&z!hKUW&p3m`cNy0T?$n6fmSPgd7%p_J3tPom+5wW z1HQ=e4ZHy1VT48&WS`H6|D|7E9ESAAz>7IROG6+lAYOq_Q+|Un3vTj4gC7*15)Gi` zJ+KrA3x05sc;>k46L68|%G2rk0@{Im2|ho<^$e)ua=ieWW_P{v+5i?kSD-E3ZdVS_ z)no8bW&n3E&se*@DdmIgpu1x2%2RU!ykg@*r|S)9v-TzEfXQyx8*q}2fo8b`{+E6TcyZ_^xDy15@!Bs8B|gorcNo$1L%M?C!IUqcwI;KnLwU6#3?-m@ zth*gpK!sRuv&0MV>Ti)3a+g7iQw5q`Z-C6Q25mM39S7O%dPfsfZC}xLycb0L=wXMDb6!3K zyeNhHsoV97wd;dAeo)4AebDWC12m1sI050XnuV|Vx?L}T?$+)}hg|9eYP0aSfO_1` zwIU3VLJM@aA}eS$xi!d(FY3I(3&5c<3fdHW0X4u|4}fl)M-zl}@&bCB9YKctFBN(5 z?IJXsE-*qIQM0uh)SLo$c0fts0ysZ|+8n*j9xz=8AiBCiHT{Lxk=?ErP%C6uly|$L zIw15y;~{X(4XcPbAQdsHI?!5cP~{Ans;OVt?fSynm8Uimx=$2zG>7X2&^|*{!$D&M znkXjq@-TI~UIFL3D@dVpsGAYAbr0_2ZJ_)HS~dq=0s(I9o#h5)t-Up%ZO$BbKofIl zhoNSG7e>$HU|{H-%m7*u4PO|&=mIEAp$ns@?qmmDSq}>NAKv`^2OzaHi2DM3l^M-u z1VIe|P}Rtf^+q)EX9Qoff@^Y6;n55V7|4El$X03aWl50z@K2y35MRcCr6yh&;b`v^^nE%;s7g@4_fnl%z=p!v}-!_ z185J$WKe1Y6{FB)SRih5?h8h6@$ja887NpoIY261dAdO(_D{g8yLh@opL7PuptOd- zlR7#tUb2Jo_{|E~6#rb%DM#QYH2?Mwy>9oLe+2WlGqN)~f#t)!TVbB7#7tY|=;&eUJoO^?@x%LJ_<$cgZQYmC@GI+i?4Kld=(ijno zF|>-s7mTl?@S072T>@Sfedl#nx9c6WtYo7G&PuHZN?;rx_v=caRS`U;OLN&SG z>E&TNe&E1j(ENA@Xs1cQi%HR7Rp7=kPrwTc$V_8%?j1(Z0bP|7nn5`Lbiwe@O*OEA zQnqf`h+R;?i>u1uPy-K?vcX69f&yN6s(>Ys21>yvF2l5j1-zIA)e0Ls4GVZ70@3tx zF}Mc`>e_>+mB348jzcEYUxKdn1r_}z+29^4X{{N{3$?n~wDC;9NN+3?EDx5lgJ)-7 zvx3jLfM^75zXm(V4C)}ziF|2EM23@MPo;3XoUBlbay@OmL8 zzqW%ZaxFCmtq@@V@8tq5&gcfO=YXk?g{W^n#t1bEbU#(imFCxst+y+uy+*nY9c`us zGQ3gl|MEX8XCY{Gg9CizI;ar=Uaaw<`JZ;FF{mv8I#&*C9Y?^6caXdS76wmBGJ*#` zu0w=hf^OVy{-?s<3f?ga9s=lQ=#BXQx(uQN2r)rOb`8G*Adm4R?UElNlalq2AU5JcN+ z36R0U(8SCE8f5tK4cy-bB|GT)5I0b0gVu+90G%le8Xkn0tP4Il^a6O3C=0}N(Bi9r z7h7RQd;qs-KY&KmN{^zg(+3TKKJ|V1pS3(6yv?^eh@&&~$IHv09uR2bEl+3YpXS;h z3?-c1p+CBP|8#osG}rzCbN_Vv{^<1LIDSZ_+L)tTsP$5b5@>^9kVxyLI*IO%51=V- zkP$4P#U&R(d))+IS3p!W|N2>y3uFE%NrEwdmxRNZ?@N4O%y%V@Fy^NcGZ^z@iFS9# z4~Qk5UL4&MK}%hl`*-Jt@V z7Z?wK)@Lwv9_n`G=#^mtt;b+K?#u!j`8n>)0iv2+1sGww!=SDKH-ZITyqo;;f8(Jm zxuDI)Z$L_4r+53l={&)Bfbqn^2TYv@!DcdcGk3av=x#a!3KicEph2<|-3Hy>EKs4^ z4+oz!G5%ou*vZk|bO22eOeprl!N*LDH$aLY!@zGqBS;e`OlUqL5FHmEixf^GFMR%h z!pSBVnww=hUBA414oW+a=?%~gzULua_)-c({#MY=G(>Lr@e_1pGH9R=oO(IH+1qFu zxWWVl7HFb`88TIkeTo-ct9}8k=;Cz)>jIk%nvnsmq(U~BC*VcuWUvy@-eyp96s+x< zD_9J!4a{Ka1|2`c(-{Cca|*0*Et*2md<=gpKX|sD2RuBEh_=Qzpon^*^&1pIQaPXy z;^}M^`TzevY?cIcUK98l08oS;Z?*Xk+Mx()bRPhxxb9F6P|g7j5w?1O*5n-6gCP#S z@OLlBP=*rs;}{CM16Yn9fSTsZ0Z9*_p~vPoJfLMV9KFp)UV_Hrwt`G}(Z3&@Y+oow zfBxUu3c9Bfa@QoWXPZ2y*3nL&^(7FiVFN0y_?NYEAP22^yb-1)jnwmIpVdI>8$(U<*rl0$wCafW;weY(UBEMa9AY z|6j*-gHsfw0s)=!1?GZ|hyXKQ+d=LeMv@05G*C4HzDN4C9I}4JQh5j$t{=j+2CFTd z0vdY;8w(XsgGfUS=Wnr90^KGGO5qS8MgA5oxDd!r*EJC5fXsK@a2z~F0rJan@S0x; z3$z&w!UAoFfUrQD4;tstkp z;JO8_kUL$sfR2zY<$4i!{Qv)#O^OT*-L6}j>3{xNs|Kjl0S9p>_-5JTtt!w0St)#U&G|FDD&wuA9dH`pln zhD|UJI^%F?$G`vo>$Sm!1xNvSiU(Q21<0(x>)>v%^I)^u5NDJ@&Q5GSP-+5d`|$k- z3;*8=a@C7s$QgUkO{pkmb_+nZ+JXf;!3MvE+)o7don#}pIEMra!qb}}C+R|b1KD5; z+NE$DA^=KgVDlhcYu7a;$q*(a4CVP-R)WUKz-k~ua{MjR(1c`5#UPsCXI1L(w-ll& zQsQrk16|n7&&a?q;Uy<>WMS-L1}z^%c;N%&=v=H}!q9r4G^H6DqZ-7;=xbxlaQ_Xt zT@afcpuOdwyb20scmS5zAcy^2$h9u$VQ&s~I3)C7M_85~p8yLj4u}p2*V=Urf9s2X z|Np~g&_M%59^f0IE}&L{0?2*JYr^2d4%YwV33!nN5dob!!QaXbHUL^1BGs)R-@Lp5 z+GzoC-F60ySXd30g~zLQi4erGa1mWlIS4Wgc7Yjqlj}6dB-2Y_cr?Q`s6dV)hZ_Ux zRWN`?Aix(#zs^CCm1ONqgEQ^7y26OVzPUgW?;s{F>v%U+8@DT9Cnv&3i!< zLuEILHYC^hqDY{*Mu)I(A|f}TO*(a+3T|7hd@g=yTKx`Z8%ZT zv+IxrOI?p20*yeTs4O*rr;h(yL1qTLxCBWMuq46(6W4`^H$%*9-V0LgUDpV4UAKcw zXRFTt|Nmc314kl=2^v4NVFaZCIFF0J6?C0bH&`jWxogJX8VJ_~is1ql@L&(<*k$No zPdq{k&dp)uFa3KRON8;{kC=6~#{B>P|FuOom2+5HMImGfWcOkG` z^IDL8#^${silK7HYc+VJg$2Br3N-*}T!J1?k3ZN^J;7w;FaZvt#9SSiKl4_Mor6FAK zVHtIN5Dw&Wn%6SjlfnI9h&y1XlD2|O?_`3gM0cj^hSCL)780aLe3=2-(+D;IY9Vx8 zH&_UAi6p48Qn~?BeZEkF?Dd4`hFp&WZF!;gU#Eckujjcj`>$=A!5sn6u~~{QD(A2> zz)S(PgwSSKA*Ni!Vu}N@DaK$^K%r;tx&f;Zm$4Y}cN3CBKFnr^FR21m2%wt_s-{mQzq08c}3} zL@%;Vy31>G$Hkw-4bL3bC!ML|=FVAH^Q7)u?R z_k!*!WGLZ-f zRS^V@r=*Gi?O_B}5g;0^irCBzjz-8GU0^vx6`{fdmTO)M(#P1m7es-o2ovNgq6lgL zQWfzAB7_>G-L4Nh!QtJ!7vxt4{?_-PW4ghmC}tVV-`e>LR8PP*1oO96FflODxmQ1z zAMF25@Qm*91CW8p&O`8_M3e)!_aTnP{YHzUaa#pIV^FOD(6(9kWKcB^pHvSDcoEJ4 zb}b}sx*0lKD?l0`_i-I>t%2%0?g~1Kh2b?{H&`B~u6Zv=H8}Ht7~P;9bUVs#LxuTU zK7vLOAv(ZPkmIK@jC~1Sr~y$I+5lP@3%y91zoiMZ?z*HK?2uic1=p}mb$hy9Ta;b* zv>qt&?{?h-+Emv9b(;eRcwb!uXxx^y^AJQYXlva8&??NWprH6)df@+7P{_R43)z+2 z2@auV(B0KS&0xzIoA-h|FJIOS+HD6G0u@iqt__UMwGE8?ZJ<#GXs|#nh6Wzg_oX+Q z_kz0ROr?^bihe7I{eLT{|No*CQbfO2hpMQPgLeETyH&pUAC$!s09DvL0aTL;G(*M; z`CDWd85sV9hyAi-KnvDBgT?`0oK=A=SOfRxL5_TFg*wy)84*BUZYJ;wF@Wf|8e$1p zJ0nD=HF$)xW(U+V@L8)OAU!V@;OYU~v02zt^?KuqKfj1uEpLpQD)x&t`iL$*k& zO4*xxK`NLaQQ6sQ@&Et-mxA1&UF0CAfKJhUP~Qo5Rx{X1jNM>PcS|$KSrGrcu7}2T zi4k<@C4dFyWft&=0?0FumRZ#9uERDpyx|NVjnRc)C^t&|AMg-%z&8= z4bbMjpa5myZv~aw5Ci& zZiEH|)+TX34`$o^)pD>GAZ_!zpj-{h($hg_rGRc726?@=c^#6!w}LeZ90zAiQ1HKw zhh-elFh6WDF(iIZfESa3*3*MlZG*L7QveFvqeylHLhNV;Yk+5dP%PI>?gpn}ZE#Tl z+6@6I$3Sw>;%V(!a8vWOKAK8Uc?MF}i(Z~>?gj;e03=I8V*CGAkV>e5)sTV_l6hcZ ztPM*v!r*cgH0hDW^+F;FTIhkwRZ!r(Tnbt=26l2M*vZ}CfB{uipd<}R=bg=6xzz`1eY36TliZ*MFYfzSxBpbGvuN6fr1`nAK^k4vJx0vT)zOhuK9=nS~!E; zUIV%e5o#aT3&%*XHL!RFyByL1z0l3jdY}?pXK+831XsBf6w=UzvN?UIeK63$VUX}3 zp_c`^(~{#wE#zjxmwljY4=wMZ`>$0>Yv6{0hD^Z2P_7-X6Hr7$I}p7Y?GhQBa=N7| zSmZ$69Ed}{90jMn=G+cO&=t{@vmmM=oo#vkR?q=qNI3^SCIyNo{3las5Nr9UiNDk8J7K608AWMxVL$tLXDB%R1 z`F4P@(~SdW#xWjPr3`Aj)POH?1dqADh`a|51c*VPeOf(`rX7em0lI+wxGQL54#RO* z&=!3L(76XaAn6|PN$T9)u07yZ+Xc|M2cQeM)j`8vFhTwn3Gi8)$R@l5EuIHm8P3q@ zIstTaJm??*$W`EAqYf240*i`*)PUBLLPSB^c_+MPJAS}oo(br*nwLvKDaf^_J9I|3 z&jcRODKw!oKuy2z7Zgu)y3T2?ox@O4`8u!Lb;>T}cHfkP)` z+8K=eZGqrsF*poC_Azw2ff$%vA z{?_#0|No;F+s)uYoTYg!sHkLY22Zy$LXDXUnsEYMe*m6K>YfTJEJ6Kq$R;v~4bZX^ zJO@$_t8qYPL24Z6;F}TTdSytxgRSg6&H&!D0yY!j-j={P$WD;w7*TK|`Cc z<}a8HcMGWcfGC8UReB8KDX2MN5NWtMP>;hrfT%M6Zv`3sqVOa%IfGn%_fc#P|pE!BDe&+3j!IxJ_NO&2|`1{8ypWX zcYr%4%@3Gb50ps2dnRzrpq373&>BQ{hi(8nd_(tC5VsT5lR*rr3xY4=2A$^3faV4~ zi&;QP$8`h5ZJn-5K#LETKJZKlp^PZr3B7u1jFqgrn2-1axk|^$09$f!bvy&KSaw zDRhvTp(jA4lIw}?&?BJW2m2Gu<^ajU^3!XdX4e&rAQ1=95gPwXPXxSpQ~;S12kikk z0=~uUOeg4Kmm{Fubl?SB^8?22&@;^s7(s`kAA}sBu^)VZ2F%6KZXJYc?Ye=#bqZ(? zETs2QqS#!!f}unjR7IAq=xx4$)G@G_4N9c2p@$MLw3G!JOu)NL3EWNUZT^5{N9 z=yrXA*ef2LkNs+tjVdqyvpTzh)=ct1mJ*tk3WM$!0Nqc*0ot<2^YSbxt%QQ4`L~}s zeh7SgnoL(WROAwTg)V5y*Y(ZIevoq4H;gyc4>nS0^oR24cVv-+k_e0 z?fT_)b~j9mYpD-H3;1qH&?b8$B(cyBpcXS^SwF`MT~yOpL8i&VcH38;XwH4Z2s$a9 zzcc;+|Nr2zj_%k$$jc;EUie-CEpD@Q1ubp^Z>g|hL@RrjfG3&6`7p~~#hKtZgmh#@ zn%JQm@ZdYu5QlL-0gbTpW8EP~!L(?2w<{ilDH!brZQ%tq&KO>1fyxutC*XyIcR=HY zZ@@>GJ?M6QfNjc30j&H1c=-S*!r#2;g6vKPZC9@SzyP_E7ZhMjFKjP-0jUt{sxRQ8;sNO52+%$&(1KxTkj8*+GNHjVLNjDz2JB)UEXU%IAF9nS7#Usf zfHtN)uy*AEoss_lT**Fox&Gh({}UkFk?&Z$zTofa0tuk(BnxhSWAb9*MNnFu=mbuy z;9Fm>fa+?{k(i*yvg;K{Wm8h}8g$qgxbmzF``z(nBj zcICyiZ{XMgwXr9FB?UTNZ@jbz$L|enQ7;XVLNY>_1zcc*W~f2?LO>&Sr8izU{skM{ z=?Xb_zvVHw%mAHe(&>5!!h@D7(1iIA}bi^veIzJ1^F7 zLG3Lq1RV?p8bW0W$l?OsGH)pcmEvy&4W=VWGlHb0VA7@OkTg2;EYz`}J2)U|^i6l@ z74YW28{jkwy7~y*UwhLTAoJP)w8a;+^dFS?ue=ashFVuD1yTc=v%AsldIPivyLBsQ z4>k+v00o!`EM_H6BlTyFVsnp{fLlk z!vo1Skah5`(5o4=K^G>2^AY%9mMbsvnV>E#$v^J;0Mxg9od(KV;KZX+8U@|g4_bu` z($*dN1XTV)B15}W3%X<Sy zqhCOqh+W@6Tx|);9Z)tnIYHSapxgmvgL4OzZN}ef3QpP(gFt%_y!rcof>Z4WXmJz` zJsyO@5`H&m3H@u<-Jk{aofl?)|J`{AwCNpu@(6aLi7t(>7!5k4;sU7jjs5Ui4Suk% z%M70G0v;4@C=cVO&H$d~!;IFkUuv$t)`ZJ~Yh#}72!wj5NGK2Et!&rKOX#tzf&;I9a)sQ1y8)73K_?Ht2fF}NP?dtC8YBe@ z8Hi<|EdYPP@%;sogv|I`-$M8xBYt@E_k(szg7TpQ3p7Q*HP* z;WeG;M1gUgZK_*+4z@^-s!0F|jP+rfI*SiAC+79NKmU|pgFGoG;&e10s3 z^{*pfD!58~P)d>u;F3g=AG6Jt+mBR|BvgRfY-_+tYt73OfB*lV@UoH(w4}9|4Vvhn zN7yRyw*(`Ez^gwwKzohtKzogAx1ev=huE)&#s0T_NcKM{2iecl>54tQmU@Bf%r!4~ zA(b(#)ePBS205R2OTddguv(@>3e*?I2&R`d;6%Lz5;11{t#`rUy#AB_C-540R8_3L(BW9=${HX#Lx6AvtL64{FsCq8AMI9UVk z%ddHv0&0o9Ol4tU0IiwlZwZ95u$mo##q7U5NM?U11(_{CFurBKfD0rX@qLC7nu~D7 zcNaLmLHUWlH51H6#Qj4=WP=JW@QkG^I4KN^xaV(egLn{<*sV)VNKMO@7izGTCFNM+ zRuMdd2c1_EDFMYTtSpfMryE@+P+6i5Za+iXW{~2O2VQ)F+q!E&GdT=dY@jRH4Y|RQ z+v&QYxpo5sf6HTV{B7t4-|zYIDwv1GsF$FdGeH~g5V>Cft0n9pOU^)A$Z$&d07nRAyR2t^AEXFX{<%dgqL1m#h|o?HA}3-5^S$Jk+Q_yBBWq@-G?at`CCB) zRai>(%~*__j%;KX*ho;R3OXlY4Q6Mh)E4X+0eIyU6!1d*IXKIKkF^Ii5I}WXw*yO1 zKo)Nn(+dyCVZNXNM<*GOW(Sb*pzwC!v2{{~xr&(sj*C@L{d4YruPrK|K*j;?^$V0ku29O?BN;c)h&_bl~Dq$a&+h z3*jnMN>h)!g0?L(fKJr|HDD+w}m%i{P#- zlnrjIL)qZIACwJltV7vm{H<%i2@+&b^AGQO3DEi94lI!M_Wavem_U_wCs+yOWbQk# z_TmokZfa1!?ZAu3udu|B0rn2)F#6X)(8{>s9as|Ti4r65sq&!8IN*Qjffx6mfMr_` zlt_XlK+^$W30An7!f-Re^%PI(GSC1ZD0)Hmyu1%Cz_27+{#MYX17OXd4V_?93t-mq zx6A{L<$}U_&5OHl!H$4Bk-r6e8H6h&oR5IQ88lwo=?c2I8!4QRK-l1LhO)uo3}u7E z`G~daff92_Pqbzq)RqmYP^?^aH9nfL&1D5O@G8t@(!vXlNaDtTg=YJ@7r^4?10Ubi3|= zcuBi75F8oM#+(^wCp#!Kz{6Ug%Fpr;=n&HrppGi&j5ClNM5hI)=?UV3Z$aJyQgsHb zN)~p-ON9{lf+3df&TUBkc+UWokKuDSLE_6BW{0A_<)rUj`$C<|R0wn=)BpdaPhQwUmifPqZLWQxQVJT)L@brK^4bw}(2@g7 zcjy&RxMDL&8bt-z*nk%=AQyGPP6(>piJEZmx{49xD(FpLSY34k;i?-1T?JMFaus91 ziy)Y*pr_C5#7rSkpws!$2mMlBtl10dFVE2f4{LO~E`e>m{$hCG#dG)1{~;SULC5wV zI0N2U2I|H>lRI3 z6aj;fU+CL6nVFF=+{0CuyYy+`g>|px(|M&sK zEe5olLL!!P4;Sc#bu@ zZefJEz|wU~%{7H%lTOE!29-uIX%C1rblO+|=1cHlrl1u{;OTkL%s{sTPwRma z<8D{b6iZt352cboI9svA70#9`;H>|f#53tI3xyNvVw|7 z@ahjxgkp=%J>YwUctAHpf)jdhk|4CLN}=0&)?d|$iVP&4(RksP#bj5 zi^#{|Rte;SLWYt|P%8;^90_RB3$nh7jBW<9qeEbWHVblL9IY|9mU@Qx?Z5$ zbx+!H1|^1W*FDD_KRoZ%(pVCOyH0lg=Px}Zb=QM>WCo(4CtA&Opry$Cwv z8_W;@^~4$fm+lF8aT9W69C!}qgSG1({uaoPz?$KUhnFY=zD62TY!cAx))OL&o=Z$TwIazSSZiXT@{ zqm|)Bx*h07o+HOyksIwVvLK=_Z-T=d+LKT!t%oe_XgyF@3T|vlHM^bxE%!L?01dVy z(71i=(_DLip~L~yjRP%DInwO_TApG6<_myL5wJW|ssPb{0IvT4R6lsh%7NEx5E|;Z z*RI{JaHnvC4H0Sn@xMe5E-YIr2Ns5|=G7??M&|04uz>EG0t<0;Lf6%_%7Xg2ptUq| zpk{uF1b89Incn7(*P!hsrAuCXssOc=1rW)SzttI(2O-xjy;K8rhQSq0cjyIZkqT?S z0(^eXh2G{hF!u$4-KX%n0x`dX+m6~GbX5)#tp_S>NU`}2%;p>Appa3(Fi{44$t<`U zMh=q_DR9_c=xyeB0}b10U=svhM;=EDAJC<_CC;$bpNMcR)yGh&(EQ^cG}C^@kTvtokSdWU;6*k}1X2s~1iXlZi9jkpo`4tbFcCV`IIcmiI0z6*81zJq895$jC`nz>8E*XjARTJ#gOvtOevIlztib zM6;Y1LSVz06rnw{DX^Xy=uoT!EbO3DXIl@H3LHP+1MOJxx9ouS%Q#-tc|mM)-E#Z@ zU3T4TJZRRHQyJ14zt}8lS z4>Y?TVDEN4&>O(sdVt^K(7_+f2OltZx*mApru6Cm@dF}Yhl4ZNmfp!vKoe;JFU(6o z8B_ov%ag^>JNW}hvUl=V2=yIA1-#$^D^-A2q&touP?%-H(c1tD_<$E-k>DyHG=9X` z+YHhl(Ax~sAJE&(@b<_5fL_-N0WTyWMxc3p7i4yP7aKUXSU@U+vTR?xg`DgRwQo$3=Komj+_MirzI7AZ3+B8s5GUN89D=fIZ!c2-+uE(Ky+%QIR*9&PZld~Cngk<5ZWf_PPBx$0TiQbxb65;K!P0?V$p)(YA7Ta ztgy%EHi$HK$(ayI%;<(>%pIU*D`1@gsHrv)t`AzY@MJOKC_K*RgFW}6;szT7s9^=_ zN=$iS`JR)Z`G`O#c(YIGkr$c}J|pO&B+w#c*AvYLScuw5{!H^)=O-!*@3@`;x1^8! zFFo_3dp5K?dS)kRUqt62@Iuqh>z~$jp7?&DH{gG_>lwxiX~!A#8NiyRfHb*5G=T+9 zfCLV?f$IZAf&*QvLC8eClw%G|46jwYUGb_s&Y+i)2w84(=Ea-0;J^fJ!3D1YJM&_r zEjUepmOq!KA&PjG|D}iuz$_0GF(?%P6OK6K1}jwn8OPrOTFnNYH(BvwqYc;^@S0*! z8pl&OOF)c3a!c=I&bL4Q2lY-C08s%imgSnlR;qB^bqT0>^g0t9$xC{hHNdqv zW}WT|Rgc=(!BMA6Mxqs4a)Dq^HM=fhgw(T^u1jiqkbMO@X#^3`Ib;Gk=v(Oc0WceMmN0my$!k_{y^XwBmF0y# z*ah-n7rX(N=b#NbAQmVMy%0DLsaKjoA|QLan_s|HfmmQwug*bLfkYsx9>7(BSYTC0 zV5&eOAXUc?>;O3yblsE!j15*f3#t+<58YYS`~+?yhy_+x1XTx?1DS{tDv(9fehWd- zWhVqWmHPuoO?NZMe(>^z$siW^$aWUc!QcGb8D_jp08edzZhz$8exUh>5`VutXvp`6 zLal7`5BU{U%@`*^C7{FosQVAphYSVGNI9JIGZqvDbfE*v{ zigJ>ETJsN0{+9RPK||=GTP?_WIpBJR<3&G0JNUdD4DC9g#W7H=x~0&&D;FUfs9GWf zHtfrb(o6=BTUrlPs6jUdHJm?gba#MKIAjYMXaMt6w@_#3hvTjYe~jfw6BGZ!_NF-!87ESsD=39S4-*pT z?uH0~5)?SPx*04F)!IVxZg=Ph#!HMBKno`JUpRh%2RsJUYr=H=fWl|cR*S6v0sleQ z`o4J~3rU}v$2vc}Rz{J21G>QBA7ty+@k3x&2{B$kO_*W9jc-8B`xjhbAO7M6`>+$d z%^5Zn_QmkPame{TpqvMm0{I_&z{=}N$o_bcL${+GeOMX*k?C{=tt|1Y?I z{r~@BjvDC1c+jbqFaG}d^uM$D%RL5$7rK8zOi)tlo(vM`ZU(VIxdgK80$k1-m_o80 zxE8>o4nCa<%5AVILDODHudx+m<-rF`V3VGiKurQg?{V<)EugG(9DE)ti1mU|7356N zAp^%-K|A+B`R}D9XyyRS1)p~W5{IS`@Zk#GLE!r7ESoBviyh02*EgJ3&`GFka}M z3fhvN)+szvL0i%p_*)i&^nish!?3jXC3s62*cA|al}d}CA>km> z{Nqn)3WNvQDgW9PvQZqORIyYY-HEmOSi<_X6hs%;ZJ&3i#4L+K{?mEsUfzzRUI z4NvR0KobSv!RrL5EI)*Q_xFy^uvV4QgXI*c4dK`P~V&50d^t(}kde z_&{m?xJxT|Z366k4Dg9_43&>wJXHi`8qnnwFF^_*M=pSi-vtmhEDls)=@O*28zcFG zDn)2B5ws5;?5gh21)v({P`B%rPA1TXe$YV*;F=CDv83CjbxS8xx9bwnHfeA^eJu_- z8LfLN$fnMa)-7m`egJV8Xd)YYKt%IikU|FjR(sIVE8uzp+VTSzs*qysB^&s}SWv8k zeAk)*I&lQtp6i|pVuPxMG>|q(5`p@fzZJay25-g%`MlG$19Z4hNldqE2g)flJF5i;P_^Zkb6g-+KA-L4Zl4?(3FIxlJ-gjP{-=X9P*>lA=02%P|8f*S!05C?-p z7AngCN`@e>L7c6`-*O9F>>-2{_*;&n2`TcoY(WSiw(Tr}3xd{EgO@#agGq?tn*1%z zU=^SfSs_AN{4E8biP$$h|F?ofUpU0W8jX&irW{0YGiW;ytlbDcV&}!vJa7Y#fBlEf zPf*|Yf+OQ3-RTA7ceIQafFzAP)9>8H%D3 ze2@ibSz@Q_jBeK%pfun*2jVY~L2zksjS8A8jDvYW7pxp|FZg>_uqbr2b;b)7mwmhnR8 zsSW}DZ4503N(3QM4wE>>zz8)Go>o9*?*0?d-lfXD?dT0H?)f@cCzqh)`p&1dH(ZfX<3|T>z1QqzRppL}adR z33!P(B--EQfIZs{=|sU|{8U;esHTUUkM$x2qNej8s@Fkbf+)?=90?AD3(!DdV1#C_ zP60@k#w_*U{{H{}?{HY)w$UgLf>q55xr1gzW5*lyapi&K-JYne`oEb`W(Orxy+F#xWmjIx6f}}}V z{?<6S5d1_tQT|pBWYJD=>2e%=O9MDbfXAOete5Oyb)X^+TxNjA8^J{iA(U# z8W%hS(aq336?Eb)S`b16QT-(Y^A|`xsH6Z_Ea0>CAwA-)prbZlJk0=S9>~G`*tA%J zwUj8M%XLo$oxu;PQoyMl)H+62f-58;r~fm8g9Lhs0wi;Tf`P#j96eH%hW|@BIuE~4i2_v{3Lr@t&t50%?rS65ZT#02h@F&Df#lh^*{;hi{s0`{D~(?SIfjJ?IKqg-kY3{Raar={Wkw#E#*0W0J6da6lli} zECE+ey#b66Ca4U657+7+KTyF6S{`!zPy-8SJQB1?fGOzz1<;|GZ#Y1WYB^{n+|1#` zz<@Gt*ZhX##kV^z{^S|S2g`#cb&7Jc=_4$x@TYgU{S$r9$^f#~B0z@Y}3 z&FHfr2hDU1Ycv0Zif=^b_g)Lf&(_{4O^bT(L34U?T`Pj*?K2Czy0wa zs;8g?%J3+`)X?k((a`Mk_Q(JKrB}j(!U6+&n*%|f`(MiOLITx0u)C%~10w7Utkmxk9C?`Y|>Y#ucCv(;a-?gIre)I5++!C@3Y$ji-dIKse(P(J|K z0kT{TY`Fr+;d~&=h2H)6AMhdoVmU|@JUXuk7PW$if})7O!h zAbb$D#}E7fs{rR85EGPt9w3B3Opp-R`6$ti#VeDw-$A0=@Ew-u#*#jo%^(_@E#DzW zw++ZQAkS<1gTh$hIGQ(*0>b?SNQJ-zwCiKRMcnO9P)0ocON^l#ybcYt<@A3kPZl`D zAoCd<5bcn;5m2p+RO*xpb%TpLQ2u&xJqJ=y9n(V;RJ*Iu3#wAq7woxT{=eYO2N!az zFJzZ|`F|W-w18GDpcF5`&2L0rSb&|V@k10;*92UTp4%h9GF<7aD@DZ@NQ2fDXZHzH^U(0W@?s z8N}!gebed00Wvt00~EN;0^mS=0}8}9oe&;qPc8@YYDdUeb3;2Q914EG!{N9qcv9zh z^A2bY3JFwD74>3z$2<70mF6Ez{H?v9tm*m%6z1Kf9IvbSx3ht^Ae82JyMZ=wWbkiu zV{U%n02*sOexL1-uBW01wKv9w=1+-6&e3)g2}Rs^7t@wPm}*KnbAR z0kl+G;J6!PLA)Di?1tgBU}x!fI=)1r8=T}@50pSEbDkIJf55Bs zUp$@i?mybK$KYx`=f!N9m;W1&)qWEL9X{9TIt9GjaRO}o{fXg$?zTPm7#KjA2h8Yp zodP;95i(}Z-R(N1+kxlhe?gEprhuBp;90#A1@P3~JkV&y4+Z{~MS=_r;Qgt$Sr`~z zwu6LgMHu+|dm;L|!NZ&UEsaRr-~275NZe1QiN_CUSb^prS`U%)Kkz50gh?hJt36bU>A9352ip#Dr z47*zP2!I0xI#|;A`Nj8Yh+T_e5+cn%zLg4t%Z>>zVj(Bxyj&{)S~(197lM}WS0JhW zT&jvxlJmF5gXG#k1u3XN?EL&m`mgk4q+}4L~vO6Tfx`8 zPXo2SyW2p^qb(1Wnn75M2Rgwb5FTuFwhgpc8oZ^a^Ye>KGLT#d7VPc=Np-h@%mS5f zU_(J$+e8>4tz~fk7aRbcZJ>5L!W~Sd3Q#2i-CzZvJRI=96qGO~C4)l=p_s8$52_ec z#s~DaW#NkFJa0xy4oI=;}*`^(?@3{)Dz1B|JJ*w9-C8WsWj7&O`o zW*|G%84?<;2P!PPAz=gwlt)aA7r@7$1@yM%;d1>3H>m3&$qQU+gAexsThn@gze5k? z2@G=uy1}7~6ofgDAbbfrm=BiPzLY8qPX<{f8PpT28QFV z3t)*Zf(N{toqs!X8ff1dCxoF`S`T3;l}dCwgVJS59+>`Hk_M(fm&CyoxOY2)>KO-! z6`&H!b;)b7?rD(ndK&K(c#)KzAExs?YLJy-)Wv z@NAar6wq8i8+hsuHkAb)xPTne0y;bwRE)MBfNo6L(Ax&>6@gOgZx>Lc2{eOC%rYJZ zhU0CZh7HKAh=joeIw5ch_<-ONP}%msbV}#v7nP7$>IUcT)&tn`|6Z`+X!)N9RPd|^ zB}7nqhHes+<8Pe<7wQHbqOb*YHV$|lgC=OT1oZR;tkaG!XSPj+S0@Y9< zz`vb6t@(!ze~UCX0|SJk%iqEW=V+GjLPWLrTYrF-pn#*|BNqb$o{(+X19BHq$qF-K z$^rgu2fAI_S-KfIT|17u_JDH0OVHjdhziZpkZyODZr`46mkt)t;8B18dT)%Qx2*)y z#b~R3_X8BpLA}#J6<|<6Z(AcMq#y;|0Vj|f6kdWa9)PZ#gmo@mL6$hMfDS@-=RmT} z0o)=(7zZ*optr3DVQLoC)I;DB4l)*?%HY5NT4|I7HPu6)+nu93wx`==2G|b~So|;z z>W66%Kd=NsEAe0`9n{;l0AcGFN3dUB`-2Q75ICElfwLQ5;4Fq1*zDTF*zMb4>D$BK zQw_dw7cn}}`T51B&mTc8wU=U?plTUD1S8Q6&V=x$)`S;-K7pHBkT_H=je+FX^Ps~A zq1mq#T>XNUu(g4guyuZZ5x)!MDQF@A<>>Bk7T9VxP-)vc?eM!F|APWLKfn0m09N|4 zmjiq>LwM)s7k^#A#Sp06<^UzjH#{KG=Md3OSI~xFP-Pjwvjfyr2Av;!VJC>S3zXu% zf275^1+I4>{=NmeKL)qI(|3YB11WYu{s#4Opo4*TK%NkD19?pWd{E1c&bBS!Ci#@k zHqb~OxEX!tf9Zo4*SSHe1dfA+L7sY<&kj0iO@yId2T#^~xdX{|kTyu9iSoC82L&TI zcgwJY;v2NYuhRmOra?|*{9h^pYKl(?c(L^hD83ay`v=@Xw>Mb2o+uH4EDD76&rZC2 z#>T(^UgPxI5@d+W43^NVlWAzp?LIe?6SjG};z z05L&EfN0Pe><}YBBNA=kp_$IlFE+!BxB_+scxVO01ocliKo)X!etvQ8Bh(&H$U(vZ z(Lv#FISIPR6%<@7ouFgb&w#6u3*D|~Ad?T^W5PfykJ6fdXoI$>U+8uKtrbjb{$W$< zk5IYvQSEDbD!0M)SR|p^+TapWj zOmJuADA8 zFY|P|u6eBt?z~9Aj`f-VIvHpV_+T#u&=O_nDQ9b}U3ZjTh3f*zgzf>K1G)!vB3b|s zV<7OY?f`?A}&r<3t@0Fp|GZWmCw1J=Sa17@OosRoid3=`i&ybU%H z>|6yOWambMwxYk`0Iiuj(E0hrHgB-~pv|b@_y(nyl0UCN=>^%Np!OXkWC9?ubJG|+ zlGyD!rL%1Ycth*~XCr8+KyM|2v?-4tXz+$ffJ^r&kidjYX+V{hmclK!VgRq=>z)Q0 zma@E1VuO5m-n2EJe*6#0PzGJ5Jnbr|`s|(d07QXm(RG%f@(FU}V&~@<^Oe}4&1q0I z05|{EfAFNhOUV6AbNIJ0*eLV2c7XH1oaO_Jkd8z(Xrltd|I#U-3hNc*P)*38Xx6S% zN)^G|`vokIL#|ONozmOJ|Nh5+kR!Z)LBkGlb~V(|=2#v5(*niOuN2uCKt%+9KWJ-E z^BWF$pwD@66dJLxQJRL910~X(pI-z;f`@JqIp^7?9^*n@@OcGU2u1gx7i# zUTaTytuf)X>V(%y6JE643@`AK-YC-F^0W}eFdss z1v;BSL&Ke$L9(E092`U-Q*+&uLEZgs@HCy}A%5RO(Am4mkoi2&kO)*5BmnCtwH_!5 zhq0S~FqNuzgGZr{AIR_ojVxInsuP7637NFxc;RONPQeI0jHO}_XMhrW7-%T3=`}bl zVjEqPd7)nf^0NG6F^29^j_x`ZNI7m%3L2jae{lhn&5j6k9zTA-;WWqrtp`dJd)+{H zQwF?XoAw8k!JsY7uoqbc;56BJ3}S{^sc719HZz9qaF%X24#o?eZY(eP8DZTQYyMUy zP)|M#V|D^%e>ixj_Y+v}LY0Am5!8my<=^H;{Mo&h7dkKU`<>w5=1z(pe*Z(72Rlz_ zx;{xe&SuTPzs;TbzzgQ)2aL@R7<)yIf)XTTxcEEgg$_4nh&&5K9&|p|A&BgIuxz(G zN2eP{w>#(%#s8&G0$%Lo2RGU~-B>z5piQBGra!;$fAOES^C2i5f+}$EP6YQ7>E<8q z^+nA;TuKC+f4J0VH2<(D32y#jU1IV&20Zr*iI**qNb3&e=yYNMi-Y$Ay_ka}&hc6s zECbQege1fAS`b{yaJ;w-SsneFWkRJi`+Xa^K4bVhr6AK<(YuOC<^r7I;@Z zM{kG9`yc-UgE|kt`0yWGl7QAeaQrXj=$&Bk{>Oii#484Hmm6iOBP{sE{CrS)?0*27 z`IUh+30lAfTQjJHZaq*^*9~TM7l<4`pb%ut(ao~~DgwHq2ELIhFsOHOF37Up$ps)P z;6<pu@n`j~@^KRdtYoGMHwTpx((<5KVGmO#;Wkc7kFZdp>%e z2XgoI`;aIDt@q+@$p9@@tOX@-=(b>vfGo}zystp65O^sCDhU5^m2frxQ!P<>`Hh)@ z;l&ql_YUR?j)1Ti_g_L(zhP!z;NQk>qgpE4e4G){0|Tkq4OMdjs>ZfdtNA!%_hitp zI6@`JPjwJKc^N|toetHIP{$53yQ)qML^<&HEo6e&7RBE`jfsJw^G9z5s7m4Acc9bt zN%I??@E6+!z(#Z)1L@F*=(nr`?fK|!ZUNOIFU~-c&r5UA@;~qbht>ln>aE`@ctFbp zLH#AmLq!k`tH2s&Lp890Rw33t$thLr`~Vw)b>)E#9=?!7%9KC$6%nSfK$wxk^09S~iHC2`m#N=sa^OPG{~9Y1gZG_M3I z#T3vLftymUm%*zbTMv|Kp~-^=C}0UGDB#5}XgFNQ;&RY(i{yY8FF+xAL;$?vySesB z9)D{$7R6BCl$xU12iiFH{RU`V8Z1E~B_Vc0aQwecL?kedfGph?`p?1QXhxwq-5%of z*D7erAlt{E1ia9PIQ%tp^KnN0ZS4H}J~aQ+=kGfM>JR+0tb6$qG_nIpc@-eavc3?U zDi!%4wjb+;B{&td1P5B$+1m_Ba9Y2?HTY{eEY1KeQCSH}I!6RhT~X)T{LixP?Q1u% zyAB*b#Bjuf19I+ei8NA10aegh3@=ilW`I^y^)?>^C-hCfAofa6cr7vEwJ353hP`B4~q=&zV8DN)vp;bCgL04fG$sa;hzO6m+WtY%caiN zC;$HchfSS*F+9)>7JwuGn^H3f7u-b!wZj5>n<0amsGFTzL8Vl{i%@-#Lls_!Ky*P2 zQ7kovaG{e*cuf$7ngCfvat$0d(|&@(1}RK>r-JMY3V3mY2i(3uUE>wcjO9?As7#Qj zy>5vyfTqbyWZ_$oEJ|UO+c(H$R;McmScyMeiCL*Lv}XL_U59!{;T~|ay$gKDAEenn z8PaTj@lzKZ7NFr0#TReHKz9_vqKV~yDbN2>j(``t1;8yelnM`AnXbtIxpvM?@LB{= zgYENo^e_M$peTpM0BAI4fX#@wi4@JCdD7Mg=TZ#+ z_yE0O1gVgc0QGjZf|5;^-ix5eAa4r1yb4-vi+r!m8F0v~#S$|2bwFAm-I*7cL_xP7 zf}8-lnE`Y-1K8vj|G2<0`?40iBo``AObWUPGo7Osk}Cg03|tE}PzT9C!YR5LhiUOp z)9!(4GH{TBozD``+YG8u1E7|E(FS={;N^ByWgIYhPsnDpm($_$pgSU34)C{51NGaW z1`D(vDADVNZ~}Os3ydc=_R zK$Ic-LkFttJ*enk`%-~8ur6$yeQV`uQGmz~=lK%x+IRMkj(e1#3Zu+CUD5fL3 zZ4X5EOD>2f|8E7Qx)<^e;Dp!-@gA6jlxwaftS|Tf0bN%MQU{KHc)S)uj6!4--4~f? z7DEg%EDc6=ZKX3plg0}ZG)+i;Rc~?X30ZA6P+Ed_j_GmfhR$qyq4>BeFBzw!oMx_euqFe zs=|ia`}%ck4Yl_z>#jA_-q$O+05*-32K&rUe{OPOTLt#`oLE}gkI=%V(fIi0CK4Z zW2f&E{%t}ahvL!yNF8D?D3O7*1u%Ao!aPWZag(9OfyU|3jdO)NgQGL_!Ci*l6qO%$ zWmI53iGXSajmO~DiWve55Ph$`K?$|=N|wrtzFS~Fy+*y*>;bp}SPH(_47F;!rv_3F ztpG0agRX-R21ni-j{l`s0$$ib%)^Xu2L9Fqp!lv`*%OJ2I^s+*u5?^#<aPq2e^>y4!r={vUjE1 zfd^F5WHG#OhDn_1WO~^Ls*_xiWL06ZFl{jNcwiD|I+THF)guC+{p4@Jr>C9Rj_js4PzP;-iGoaKKrNio zeqy8qkr#>app+1J0W^95TQ^=RftWG@tzn0qRagQ&G6B59yZgnb|DCR1UPpGjLXT9C zhaIT^nvQ^r%9iSZ7yUtxO%(+l0sW=hK>*xlhE8_Cbwchw_yV3v`vO`tSi11|ffO#t z+Vd~37y{4eDIjqwyJfM+_uBT*vYR<#K7lFsHg8ZUT3=FA6~@;S&?6yU z>vg-nfRAB(fQ(^)w?8}wEjTYfrI~3GpfG}!B7)sc|VfC8z1uMvFNT+}VH@{JN5fBXuB!@Gg^}wcQ;=AQHE-$0A1({?b5vX15;b#hIDwW6@ty*0$SP#&H*1@ ztg3?KBG(U~WvFjBvKRwi95sNN%iqch_Rt6LL^UW0K-!ur{H>5%??5MLbccTF4r1vR zYJSBC+UW*Sq08U81{7otPn_iTxc=4Z=?UWcp zcLOL5!%M&BHv%srKyt56f`-3Aa?P(8J464x4(bm5(>-MZIGy|c>F((OrSMKJh$tvG zv|cLFLhvAa&a6ws5klQyZJ;#Y=_S&f`-ibR^pABYN9{6Dj+y|n3T@Mq&x`yBPy&w! zxy6;E+kk&N8~^qLovwSVOLoI4wdqDhp~X? zi&!iVl^F1E2TdM3X5pjRiJA&lB)M8ZsNv>&Ag3$OaLF zMd$_omaU*9>ISVoZAv`4VQkwH8#vpr!~o7VDp7&6O-dx-?9vh*IJ>$uvD*!NHESIQ zWRmFvn$w|+7x%odj{FLm{(8;a?YifG>6Y-YfEUc{;AEf02-*S$3KJj5NFS)`Lqtt; z?Vb|;_GzFw`Px0j{LRIn(a_pG8T{={5V3UrW>9);uHEBWk_ICA+cO|C7W^$~pbl&8 z9vA-B5YU{#F6d^_^}UmaYQ)tt=q6s{km+foAJK$0oXc{Qz<=!g1>% zLv1f_fXs1)wrC9bTmOTmEkNe*@V9;jv0XvU8_-B_H_WVGU(n1-hMLt2HEWv#_#U$D zAnk4}maaS{UhptB<8Pf05{IWr{?>jF-;ITTTL2!oq&2Lzc8`43bfofC8^-!Iz2SADV z0C*pa$cx!OAcGvBS!(e92_F8|ub@FBB*#7l^P%Bo&EEXcSBVo zj%8R0o^f$Qnuz3?(CsP!YS1Gt(q)-od62)q4y2iw>Cq!lUv`4FHo_J=LMBRcK!FbH zAwZ7OntcWT8gQY}>G}lXUFc+Lcjyz)d@2ugKGli2`N4P26CF;>a8*pr4;W#p!1t2yZv(0N zjj9SX@d{A|ntMG6QS%Q|&}_7cp8mZygNtv5k@a25eqh3_EkRZtUQKSTz;8->4hEoj36ZWovt@PWkV_d@dF1UbvU{kViXt{I$cjR*X}7s2%5kIPcZPe#DJ^_Jpqj@o(bKd zSDlx5eIJhM&6M7-h z)$Mv?=J%hSp*LWOpW}b&nSdAfJ|IQ>i5GuXK_eb?42Dj0f~5!DvXE+r^Fjs3@@@*f}PMC#*@Vu5Ckfhw?Kxwdfiw+spC!nNNfQ_>@^SC z+7XnRjK5_ysMGI z<^O-=&IZd1jsQ?I1mD&p0Pmz~m!M9ZD1dtspwU3|p2PtW zq|u?xf7uwoX-S~@00)w@xFF7gNOi*oovlGPn1JjAjmCn)0<`rE?2TKHT>j$o=l}na z+jO8UgbFWq+P(hYcu*JY6>z@^v|$l4CDQ5o;kfG^P#Y1{1bw01{6mPp9aQ0h=SMhH zKL7a7c*5@g15oYE@RAo)K!f%vLfasA{4H#t?1&^}%HQ%CoL=6*ooxm=G8(k|5#|#M z{#F*aMkIyc`(YspL81i9adyZycV-3#@UbbdssLJS?}ilfyFrJTcV3wJ{deavh}o!> zj|i3uf<%KYkCmE(w=F`3q)RzofR?Q{9}$3dzTPw+fQ(0%a=b`{PKq30WMBX_;=4mX zAmySjU@kNlfp#0YK6weg+cfk^x9b=1ei@ro===$2v*{C1_Xf0A)ePRJG%Ga%c{3C& z1xdMPpfMDVZVwiO1gLd!u#^KlnEl|j3TTKFdNG&l8*o;G)MFekHbVL$;7gzGFn|t> zc+ly3=Ot(pD)^|x7SOILNcwmSig_f5y7IR|PV#)y4RH^`c^aact zE=b;Rz)%76jT(jwxXA>X5wSc3_mnz{D$r3Tpdtk3ubYrADa>CS-L4>iz2*gZssuVj zA>W+)g0Z>w1p|MlAE-H=`-Bm^<-Ic()YWpmgL--*c%StJZ&0~$U=L`lNdmmiru6`5 zKn}K=tds}g!xHG&4roy}xa-UFV%Ifr$=&Jt<|Vj@b$tWLs7RfQ%+fq?LC*oYrYffs ztiJU?NhHX(4icclIz+(zad0D45X|I&_WDbof%htwo>yHy&TN z8&r~l+V0@)+Lhz3;L(ZZS{{Z{UQm#LGy8!~S8(`%ThpaRAlVX~?ogiN2N0vZCDNz@ z%&=hW0(SvGR)7|#m-v881&?mnmN>xKh9xF&wo!=&oNZDf180|lJO?$Wn!gpi{m+#H zRBE&wC=muJgE-dGl?QT8A=30QXt@RG^pxK(ayP)%wWNWxfL&q)&WIqB__u*ZSU}yT z&fhO?)`L`Vabwr@4 zEF0XTx?)ip0_vT?iel?h18{JH+sdG(IVclB9C!h#VO0k;L=9p(=m05K4v^EfGeF|A zx%LXU-~nj|-O>ySrf$&kv;*eRC~pmzqJL_@p0wojsR`7f#({K z`LLb@ERvV9fEHAOHYD1YLWlS!K{P`g4N5_s_mD#oG{39~njUK}_zb#^ro940b^d;F z_&zw)o8Rz+b^d;loD9xM&=Caw*4d!K%#Ee_hc|!!PiD~06Ik`az`)pgpri=YH~hg^ z#{s6<>pa1IiN&}7`m~ad0)6DrWCZO)e8a>58UkhnZGG?j{o=6? zG&S^K zF=&SQ=?;(er{EnFi2R`d>I{Nb-a!J3xKtX4C6#KfhK7Bq10o@nnjiubvc*xTx%Prd zDJXwHY9v?C_IHGHK-tv;p@)G1R3v~3>fZJh(6V6rZLmenwO8z68PE=#0YPiY9I>vw|Ow}Z#!w}%TvM&t`DJYlO+D_9BIuzElPEc9|SivI9pGa%65CO z@Nef#YyN2sTKL8BzmzB7MJ}|HWdLeZgEfKLgB~o+KfUV(x;Qpi~kDRkY26 zspVv;KG-9g-LX8!4}x1vJTserGL}em`|=z=1QrnKYW~FxYu{QxqRps;6T&boRRkL# zf{5c1a7&`)04!HPu2ewGt%B!9EkVvby-|#zI~LRf`d`Wu{Ng)g^;GMD5;sU$Z&P9m zVc3?KKp2K4+7O0Oi4ufiQX&aql$HoU7}coZgxtOi3x1L007^|kAe&1$AW>seLS~u( zU7`buE7B7r=zK+p&JrFF4QY3k79tgBkaQHa44O?$}WKy}><56BgV(11W~8s4L7(~tw+X^AR?VN#lbkw&*I27A2qK&cO+$}It} zVJzhcd*R;*lh#EJMR2q5D!f_95%%Jo6EuPHx9&x56rKmS6<{q+{+9iqrb!*FQ3yKq z!HmCk6-dw>U!xEt32HroXi)13M1vZIAR5#t1ks>Ip*y5e2;zbpg~$O)R0x-Hy_N^< zWBMUqE)H%KasXZxPQ0KZ0Msw)Z3Z_7U#z+awgys~ilT3>#NN7- zc=6x@s6IZn3S4O)KLjpdg<3C_YC-B&>ryFj^5F@1apxU)&J9s^CPS=>0aw1lNR=m=}& zMNl+Z@VB;tQZ#Iy*_yw#6vQWDj_x>kQW;|(V?Ly6f{iR-8+wHd+JX-Zh0V>mK7sV@ ziPi?4qSHJM4p1?OrO0C;pd}=&|4WTvsQ}AOZ{4m>KyBGKpqXUtx6lYH&4LI+x*0B@ zWtAXR@bd!=04r|S>sp^UFH z;o3n1+MTX{x?TT3ysiy1;Vh`!b^U{I9ZUjzj|Er)bN~?eZXl2o!GU0T2&M`&mH<6- z+1m9-O+VB^2he#Zpnw(VcKyM4;dK^h>Gg`;q;qQq8O%K%aFqD7~)CR4i;{mxx03y%}5)c3hh=2udfRED<0SQPjln6nB z6=VbdwhP^^5}?)AH$VMhXHJysY+e`7SNm%xI_c(jsuzJGJ^%ly&$hc z;$8skb8ul1GJ~b_MlTOMv7LYho(Kad5rLI}Pt)Q+G6)<#9H1bCBqD?=7F%Zv1Rn##zx_t@Z^IJ)=HIp@T+P32N?4nJn}8-P zIbOCva{%=G85h`uM-EIJyxohxg&Bzt$tX4@pwhk@w0jvMU<;ZI{)o`4rMkoon_!>zYV zSUPXK2G{5y16vQ2z*ItxhX_Jb326}_k1&A-V`FPy{AYbX4;+UOkAfFVb3kUCL1_d$ zmB$hkkj3~S4YIfv(Xxk_39lkS2J(OmoJW*_3@=0p7zl36>%5541vTcqK!%nIz_t`T zF+2dCllakDdIh}am*e<>4mk;q*KEDb8v|bc?{vKZX;l)}9aF>Tj&)B4_mf%=z-Ho3 zfn58BC+x*75CgQ>AC`(YfCT=#l!C6c?RC8p@Zu_L`u$FG?HvZtWbGYL)9ecJGz9pf z^*f*)YM@4V`RNa!<(!}mM@*p8>$8};U2lLdSO8TEp;x+H!P}G`ymoK?A6dfR{6DIM ztNDL)32XEJ7}%Zz$Xqgbu9IZ~cr7>RI0?&hV3Ru!H^1QsMi`57e$I=doDArVWvA*F z|5>lh5rbTXiq!U%c%crG+BruIvcVs;ANs|!2hgTH%rT%=7c@n|TKjyUqzozyzksSf z#Qq0pG#6`wqB(gEI5Bp*UO|d!(9S5(T;K~Ff)9d;m;KdTi%Hq!Bt^Z4;yV)Vm z33yR^2JD}l ztRqm?%X1u{d2-OXZQZ>f!ETcdXy3cD^~1ma|2t1~_kg#pclI6td8zdZROj*58!%Q2 z_+}SfuSjr3^kG3dPh7VkW4%>4BH5@?;4>-HsI6A=wcbBnrgYDtp2D&eU zn|~XljShe7RnRe#VEaJ3yj~t-XJF`czu){Lh`&989k#Fb2x#To4ZHsjnp;6GW$fMy zqWHJ5w;bSanamD3EJmmF;mdY*&@Eda&mM09Un2=Nv=CjCiGhLPWi+xV=#D9{T37J- zm^=)XJjYw_{QLhOB=}kna)1~#7T;Rp@8A`YyK@2h+BE-bsdK!G{I}ZbY-$BsQ8E}k3jqy1;rF$wU zhCy3^!4e=NU9Qe}ISs0*&fxe#@S@#NMB-v@1qDPmOCzX!4tQa+4D3YEih%?+P~rha zGROrl1EGdg*g$F^vr=QE1GgYcD!l9E|8E7Qn*Uot$s~(4?8Q9LL93u@g};R#)j$TA zfkB`qeyJeLSeQ}PU|~*(uz86Ngki?tdYqMk0o@vNgf%NzQQSQfmD|M%8_~2b$phI? zX%8{jrX(K1uq_FLFbqq4Aq=Au7YM_o#2UgVEir;Hs!KExp}^mw12^4_zf~Tz@CG~q z!`~;2>IxRPI&1#c?<@=q@Qe{zA^>Mc^S6SI`bQ*#muJ9BX+Q&g*8Hvek@ZC(>5JiS zUCe?K2vgwtjQCsIQROO-<+4%bVvyzhSr{0a|GV?Ix`9Nuxj{AvG|T`mAGSQk->QeI zSstVeys*TOzeNbnF)9VmxPfxzU!iiH4wgNl-``@wZL|iEeWP zZ};d#)ldbJf;zG_7qrXezh|jvw;Ky9LjwbYEvV$=pLXCScm>9PuTtJ_(9$6ODF{O7+}540Wt8`XNCk{ztC5@n9P`2pig(2}L*|GuS8-EJ&t zJHUrO>q42f3=IGOm&n6S;)56gp(@Z#dL7dI->*~%aXs4WrpqB0uV z>foPx;B`v#|3J_fIw z5?u(xs6++AFe#CSFiJ~=AdG6z>^sPJ)}^Y);inGrx9GwhU_9G} z1HxWR1*IEMMSxtdA=S|(Qk_3Qr)x}w)Y=UE`+hY4*Wqs!{sB7C1YAjhTLztw=1B8i zP|d_p$^~iPfU2lwa8<_G4W_KYEinEb1<<miEur#wl_zY0HUm(@7i1(O#0{|U1@CzTJA@H(s1{6O zEx5T04){|0*J|D17D+d#kpf|b9GwAm2~P)v(aAHRc`c{`!`QqRL@`uC_L#qRfi!Bn z8NjDygN{N39kLCgL3f#g8q)mzqM)@apv)r#I#=#LXoa*ZbVUTD$mp(pl4@)VJzDkb zc5JQt<~J-a4$Fd?_M7{_{k84_mgaxn{Qb6|u9ck>YzR1)P;UZi$Rnu-1>>bsAtVvdYMo1^NG7;&f+oX>a#e*1 z)KwDLwD2E41XEBV3045(nn;1UaF6406-QVwY&JVwgFgWa$F+i%ASv3b#4Pie2KsijmEUftiy4mcnli zOtDK6STV9WB`|-bfTi%815@k*8fZlX9muIZ&{SlSL4-Ll#V%Q>iXmx0@A#n|pcU~# z&A%Ayux5!h&`7Px!KPmZSwH{rLon4Pxu~k)MMVQFEDKN-fb($)iVGMRTfwCZOp8k) zsuqY3P_)3xJeZc6B5Ydtj~{|5C@Dr&0C(pVSX`B$D!}7Tm=>2(u$C<_6Ux9`cx=P1 zfGKb(M^%8wUob5-RoJxfA3p?BP*M$6AYcm3k)Xo=_#qhAr4}sP19M?L3fBd+zVi5? z1JHWI1T@r$;JS2y6+eN=f@bNDAA)gRz&8vaY5+)Z2^>Fkpwxupc#{bS1H%%qeh6QM zje%hqm=6ygG#x4&3=Av5Dj+&USQr>UN1MP*6k%gv0NoXZR4t*IAi}}GunBAeE;|f3 z7#Kj;QQ$U1frEizJJ<|}D-_rm785oXGZVDd*186@ulFbmeV6|Dn6y`(Ff@TaoM7keh3dsGS(O(Qx1dbnq zs4(DTU;xeIVyGa^9zF(!li0!us}CVzYr@aK0Ge+i*Jg+*F8mA(r?J@#PYEV`3=E)= z7z*v-V_*QS{5gIoh96S;xLifG7Lu5Fj~`laz=Y$tlLBal1j$agGy_B$G^LI(%mj3% z8@g)DW@!oU@k0>(65viIqDTUlzaVLd?GoTSo#C}0bDav3;gG~91h>8E4+8_kE3j{1 z)h2VDJcb6i*J@r9qZZ=M8qi@%aGRV|zJj&F!cYWs!Z|{=1T-^&;MRbq%8{G__G2mU z@k0$fpb(Y-9a4Gx5DTm}5CQej5g`H&aLgbCH8o&bT)?9-hgQI9Z)KuQfN607U1xIq z&<$9bVk8q}-H>XV_xJ&@ZU>u3pz{ylbLQX)ZkZR8ct8UtO|{?+BhY~y*C*Xx9G$)o zK_t36l`jti z!%NV0eGnyepo1N<_`_e=Ae87L46=Z#f*2J3LJXmb3#N*r6RIloL3a^EVc3he$KmdJ z0=^aVN%H}oPJ`nIz_G^A{DYal?=&}Px)q!R8C1ce9S8VZx1k7vLj3@L>q2e@h8;ej zIY>@~tpYcHFKC$L=6s}Jg~kYY z^T$h&taNoZN-RbEHjumJy)j`52{KZLxsxvTESOaqbLg6x)LiE7w1x;_m zx4J?Dqyj|{8kosk3=BK`K!Lf33zQTgJ_jw303{U@gk82UyEs4*hZau?*o@`|84Viz zd6~!s3u|}^yLA*ED9<=S%O{^SAAoxo9w=K7st&_c@pM|CB%D>?n={cIG!;b<>emKN z28JC$AirMVggFSDr=aodhOjLHW*bsGLscmtRGGq!0mUh1z?5nrQYF|8rQ*jATmT;l z(ENj~glmT($T7|YOyO_60A7j!^CH+J{#MY5Fi58Hx31z~VAx>Z=e+gVEem6A9M;pa#1}jf2>3(yZ}>(nP8d` zs@B3(p(mIrpfwZdnWG*>5E{f;>J&)%=5_B={w0ECrP0*uq{MM8x}i@ET}v z?S>gO;2|eeD@zM^fV%ZBoj}Vc-f(1bguOWI2F*PDEgbkf@EWvM0d5+oCvbqj?Y85nke`u#6&GlOnZ-v}bX%_(rKKyr`^f9o93atH9zjRT;vnZNl52Y<_S29TDy za4nG3&KCYcdOtiC)4-b=z`jPQ)7ipbeBB3E%`2@7P z@ueV|gE+!p+;)No+->l71WX5UgumE|P_+Z53f)2TL8}_zK?`+I7m6U%L8VL#3_Cz) zXT5A-LP;>7q`?sOLct#DCeZeiC(Q>0U?m|u7_aPw22iQ{YZlM}Vo;sW?4UaNTZCcm z|Ne6Oh{s4NI4HgEr5W&Vyt~P$3R0R|8o}n9=5Lh*sROy4zm*Tv%K#@`*xuuBPP5Ko$xwn!fXEtuYD%G_MGtAZNh8k z39lU{ytbY2+G+ymcoMR%2nBE5LR-)b?S%3EfBwJm@ZWr#oiINBRvU1eAF~st^9|k! zn}Mabz{lUp3f2i}GlM%}d|@vbcEjW2C9KU1j}J&Ej4$lPtzB?c$G8|6UM>ZdG~l>} zWDdUY7uyj^;0=8iL<#|A6~6En6A`MKVb;OhMWE;hr*por7a0hJu`q?GiI>061*IJi zPQd)F`k;2aFR1RF4$}v2Q@|=dsIvc{)-`B?`DFpTxev-`kRB@^f9oqwSo71p1l+aa z3wv>SCp;L=VQF%MY91Rt{ua;{`j;YbW8pzG1)+TsLOVS3LxU&}p(-Dy3TqI#A{2VU z6ru-_0ZPvT>UU|7-~B;BRD$G5Td@6MFW&8dd-5x+jg2h?Z-AQ9pvmx;dhjj*+^Z`Q zhHOR{g6`F3gsKTJRp{;Ca+Ib#)CWl*yMsYK*aUB>gJTcs2Q7rbRxpDxQ#A`hl{nlO zP$LA>yXajZ6Oi3z1T^ut9tOA5;e9Cn)=i)`x+zHWPk0+0T&zOVPAjOn53S`(U@;Q2 z9UdbUNR4hpDF+P|&?4s@pozAZbKr(UJ2-s&tq$PUKeU5m3|9c@;P62^I3KsctrCV? zh0(#`3x9C}q3|uDjf)<^ix8?#!Bn9~@J4LS>^Y#udmt#BF2Wn{;0T6=Qym*DdqVp% zd|@vZ>Ot#a&`wlvivm8F1kqOF`LY(YTKNq}7GKy4R)ph>VUB|*5>TYT%Az}4;eo;n z>dSy;6CiO^SP}T}EjnLnCb;SP;>7SO;p6hl6~69o}e$ zXR9EDEu9EkP`fP!U<1*LyJ)Z=!WM6kE%_i@3K8aDHiP9r%0LS%UV6bD0}2^%XM`{8 z#i1?mkokkJ0em0af`>uoS6uNm*F$G6J!o(&io~)lQ02X zCBYrYANE2KVNN1Gb3ljFAo3Hq>BHZu4>EifD3E+m9SKTJ$XyJ(m*DN9Z#c5p!d}E7 zk`-ub8r@re^G-_ zRSQ#vZg&bcyZu3SgSODVjDp(@PfiSBFa8)ot%tV0G5ZJ`HbMgjt&eaBrjx(rEvStQ zs%9|z2t_d6{4J+It<~j-J}NwXp>1tkeFVO+7dkLgpsqygBk+a2;DW2LCD=zm>Jors zsFZ8RZIIhQvtQ8eg#^AX0r6G|2TLC<_UNPhK;}Vk2I*-gEaotn}7J1 zYeHsVIKD$0|J}Y%x*a)M50r{^JF;{$fY&KM=3`)Z%{Jj>s4QrFz#l|H3V|oE;Z`>O z))iorL7fA$QpnaF*%Euuh9^*&c559xirS<>o3;@3$bqaAmVp&ZAfJJ&Lbk9M+tE$ z$3f#S3_C1A4o;GWIv9MQfj4^i2!JjK7etQ$WC0eC3gK>7n5pIA`7y!7PN}IQUY`j87Q9f zB|ym$ZZs%_`CFnSpm7IU>b%1fWZE*gX&|RU0*8aY)l32$IQ-iWfNmvi0bRe{{3E!Y zulYv+e+%g5kLDjiB~>W5OMv{x5%xk=2DX7mvDaM$HhKiQhv)%lN4*UPf9rj528NfQ zNn)rLU43}IJ|zwcK9p7ov;nd~oPl8nXdBea&l0e>0-u1C#R2VGJcBjQ`CHP!iG>9z zuEIDV#|0Ylw}SF8*k))PpO=SQZwS`M0oI3z2dE1~K$~gd!$FX2-}?XG|NlGYfkH9{ zhqL?<&bs;!RC=&<`#$L8fRtT+9Q@lEAy*#l25p1@wbVL&!AZ{o;j9HtY7|v=2 zZMQ{tRvyS%pb_YoN5!#+)(%~`ucO7lfe!XH#95$&k3l)ZkiXSM3{s$QguPfM2iKwp z)&edtU}+2%N@5HQI~ITf#9N$!p*!>eB;4KkTR|rtfQ<*;P3r{CW}s^lK{pLiyCe&8gtpH&7Uonb^W!JYNcTjx|o>6orus zY|zr|mtTdk1;I>&X`h9lL9hd~5c}m(tm-on>QBPegBDG{oQhTbG)ZXIFHr$Erx3vd z&TedBFG}DlDqn}gS|i0m;A$kT`G+@{H+%S zVZjVH#uQ=9POvfH1OzMopb22UAOph=&_vlwAF$uBsAvjyZ5n0qxP z2n9AfTt(t*cq4l1VtBa9gWZQUv*jaH{TEFI5F#sVKvf@FJ~+t7z_0@}YV{Jd4jYo&;Kte@jGd3u*j8-D z7J!Uh1d7?Wd{B?0$83pO^ADC%H&A%6guO6>)h(drHcO|$4$%6(mmByXIuT|#I=qG8ksmUy(nmK z{4Kd4M~Q(HUVFRspoIuK_a8wYb-iQ{W`SalkLXk%4!;|%Oj zgzv++85my2K%DV<7br2}@F3_+&zG&Rxn69FO1O5IfI>V0vJezBLIUY}fm0D`k${6XFPH1YMm2^*?{hHZDw$K#FL?Qpgb*CBfh^4akuA4*__j)q{1SSgbo=7NiG{?-7Hn-V~7nhTpxMU-z~HKklTKo?WKti>VE-%|Gf|NkAaATuIiYEb<3 zcQ)K#PdIV=O9_0+2FeNvXjPmFGW#!V5)>L*EC@eO1e=P@&*do7vta-5w4s^WXOE;JmP-lOb1rLk|9H79!)XLv- z3^e_k3vwYlOgoATS0fAoof`zMVlm4X1AeFr`CF>7Sp`lNi73;*&=B$g*Bx z{j{0zkevZO_zG*Z6~I)L7-F~ubn+w8XgoMDO1XB_gY2vW&+bCU1gxP8Hrc{nOhR~4 z73M4qgF)#5besrituJIK^j|##Lp|4yYLL;&`1J9&fF@{Ry=l;atF|D${QaO6ojX8# zEnYr`&)^~lM?0coo&-A84b*hOOd}02=a=wk!lHs3pTa zaaUN&O^4fdCYxW5!%K@*8 z!My}p;|U%`2Kx(qF#iLP$K?ZFv`>Wx_hx1WhL?4qGi`owl$g9O0I6UDEjLewsVRx> zbw?g8bpws5LJqMpENy)44AQ{?($NI#<@2{>fyYX5>Edto{r~?z_}In?FYUpD@}MJx zK|@n||NsAoxEGXPVGYr5Tu@(uT0bb`=in84Y+*01z*T61CKW;H{pCyW$S8Oi9X9*V zT*tNJDk$DgL#Adyjgmv)OFdx@*!&Nh14`k>tAHaK;Y64Ng5fF<4#>dnfNLNJcp)6% z2v#Nl9>Ikej5HuE22$t50ty>$#I!JIRtpsFY+)~MaYDleGP#RZ-@u%=1)&NwxeN9L z%H9yru||lz4V}E4&&a^A<2uN>vq1|gUxK!yO?cS_W`hdD3E-47;U#Ee+=Q1!U~y2* zKH(+kGT{j?L5-&gFQdTXAz;!EOoBE7PI&1AW`hpHobVFV^qcU~04$;fCP6Le2`}Zq zY|w_w2``1fY#uNPx`24XOVH-02`@prK_|TY0$LXM5;T84;U#F7>x7q&z#^b)jwigl z24;g!rl0Td3EEIU;U#Dz{)CsHq3Q`QL8~w( zyqp3y0n|62@DeosG2tb6k;3cx34?Y;r}b6PoUXPT>YQ#6M`!30{%uZ7py`%J@}Ln0 zCeU2Y3&-XkhOk|A9zURSx)WaJDnk2TkRl4)IpN@MT?f_)s`Sz4Y&pVSs7-_yFg^01 z>I<`y;Rt)NniZaObL8>O*>Z%vaASk2rEJbt3)ClGpa2`W!ZT-kOAgeph78){owMDD ztPnA0J4=p%VTU%zIzt7F0ECv{GR;5O`1`@9CjVf9tf2>80G03(v8sZ+ zkZvxh?%CQ04**?=!;ogIkj*ehn878>!0H6ShB)BTXY6pKyy9_9ip|;>!iok+Iq&!b#g@}}AB*Vb4Lm%Xf?P#IR0u60jL>q9| zU&yp0XdfBE$Kd$qZ<+h||Nk9ZKqlqFO#;=+@TuUl(vZZ&5%!`5-si(Q3&0WfLa-Ma zMw`cn#pHZg^O^ z!B#hbedC7BH>C!!_9>Q`N$C0l&{FjsP9Ud(mezoqC?Es*Ti$?|J>W>&=OsaD8XJAZ3D zT#YA7r|%u`3MNkeRzHXuP;K`ky@bE{M+Scjq-D?n3#o3`JCIwMKuZU}lgg`M-9Y{p z5wL%eCzV|vbO&&ND^pJX*5BZT5ul3))A?K9!KeHoQ^~Md=NN=>7a{9GuumoL0chJSAJ!c!4wSpulIMNE5x?i=BN z1(!3}KcFDZfUNoeM?GkM8@v<&GUwidFisM~KS&K(CXgeYSek!0@V9;gU7ZV_^n4=@ zN+c*bmcQjXXmJ4CKcMs4UcQBgCMZL|%b(5Spymsx5#r9@x(vr^hSHyK4|jr>knkYY z4PKCbd8hB4|D|_cvBg`^LCI*EFN7#!LL}yzayg&qN zlQ0dDn%KdrP=)}Zj(Q7TPk~s^a95OpVMjd3>SLIzCOE=gyoB}5_*-^>S8rgo`ZZ$6 zV+L3iHmmE`iM2&+B8hGMn40AaNzSQR#_`O&QY4_f(<4zl_J=K2bb zuos^ZUA|l3l@nO4{)&i}U0_w%tX?1jN-u~2p8&Et8)S7TR;w!zR%e3^#cYo9w*-O> zg=Kwk8;ify24phmY`d4gv8|C%7J;`nL=blH;mASmbuatS zECZEqVJ|jvzzdEIn9DGriE$b>D;hydJt{!~WP;V?aD>S*Fq3zH4x)R>f~p?Y+p-ac z6?FcPGfX(bUI-x!QHB`;DWO4SB&^Z!h8^w+Q0Mg}xIYYPGj+qKTu&mDJOD3DKuswy zH=IH&*x+y73tyc8H>L?;%u=v1C`kz#!QDa(3_E6kLPiR-m;~B|;Rt&XhVV@;rfz6p z2Mb||Pdkv2Z6G6$3o$T&yoT1$0b5R>2ga6k~H? z{ZRgvGdLDfaD=@mN2po@Tl#>_zEZ9o-5^Kt!R*4Oh`%Kpv?!zpr0^-sG!#d1Agpu7 z?WjkvK31s=Y<`R*?8QBVUM@ifhS$;HB!tZ!rCd8eoy(VrFgKtn0>@G5azsT14)>C2 zJ0^o%t}Tc)ZoryK&}SA(xORZXTV8&Ht)IYV6@N>N0G8z74qD(b4P@mGm~Kd5fzmNb z#~U=m&h-I^Om#Ge9GupnhrC3yCgxTOfiFS6|l-G(ra2k^0hG08%uuguS@Y z1l0)|r^YP$Fnn9ewFA6ulLO{nP?gCN_F`Hm)Exd6P_D(+N9S(=A7}{gxPyb7zhx~0 z1H+EhpfK3N4{;V#*b7I}odr5&{AD3*?FYzNOkpqnBic6iV5=e!kq(Yf{+1(HR%o=W z2d&TmZJ&543o`R1Xo1Ismoq`@9$rock)X^Ai7b#^9APi?5Z(1sm|frm3RVR!b~)5YK7hh>dMizUeEpuyIcQ(?MM zoW6q*?sP%iPJiK~+{fNaJzLwG$j+FJAqJ$5RlNMIf*sF@~%$KsuHI z>}PDQ1dZ;$jDlGPO355yFQy_w{vGB*3$R)IEmzPMT7biEKbjyTXtrY&X!S)V$X6dR zS59z*y%0h8stIfzX7=I;dr=Bg1uBX$BNUtG@<4Xh!t8{4ZrMM07>a{!!!(P(1+)wU z5y#M?_yuT1MLx((O_-S|3DyT;@&OzxDnO^b!2H4AG8e20oBhpbD>}e|n};R{4%|qP zql!U}nu58Af+Ot3_P=oN8iK9E8n}80NAbao!IqV=g)(T$=%qM5UHmP3u&lpmSq@r% zQ3-PTP1u?Ul<@rX2kvyxQCr|j6RpPJ2zzl2rmDmVtBa9x0Rsb$wGWLTM}&Zn?gEWK z81lCYf^Lw4^c|+Xg*)Rnjx`M6EK#C|mSRe=PBzzq?0SLEApVwV;0^z%ot>6Oupp!Z zkF-Jpd|p=_$WYL&W{B{CRbJbE!=3MhW5EbV*b8xZC@NqLMXnufAS(=D?uKTjNQB`p zz)K*oCFXOWUHI)F?H^$)E>PlG1YyWBupwBJXgAD-{4LF3RoJY`L^%Zj9N+vcA!vf& zd}9xCR5!>`F<2c{{|g>$;$Z8rI_ew3>0e;WA+UxYdb7BcYX@iw_9bZH2RP2K>Edqz zt?NKbRs1czpd}a+K~7%?vlAsekNku?Jr&0i434lD^I)nd$Tu@Vj*x-hUS@esB)0-G<1%r{d(c5T3C5PwSz_<#Vke3K3q#K<=Rpp_fbK!!%c3`K+@L)eS( zuTbZcymCVprjx(r9W$uAfjJQ(AMoOAF}zD~8rRB=l`u6#uiQBC9qMYt$_=y`IOuv0 z(pGM8guVC*Ga38J4UVuEm*FZ93ny@_+_(V>_s5_G5ugDMmX`!qZg7OXD1jS~b>#*} z*oz>z3WNi2tlYQ>azGNo0eDw#=z-KhR&FSRW^3Vn8*s0MBkaY^Z}3oOWdg-GN?`$B zxxo?kVlzS&Xj>#SFTfYH@b{eooyQCB076%8YzOsAZ-Jb<8N6O%1(;j}Cg*@jP$Hf% zx}xJHXi#j3tmx2rk+~VPq9am8i~%xh*9p2Ymjk+!9z3?eUt-k!gP*_O8+29L4?g}D z&=nKSKlu3jEx{se{4Jo<#=&RytpcSFC6F-WfX#w@XyH;~(CvB!x;?k~4a@&hf&Zo8 z%Zyzi``kKRpETD#Vc_oo9aH%dw2Tovoy#Bg;%*_-2>upOx_FxVdtr-k zAE@_?&3$}fFN_fG`^m|`@G_SRGKj(!_QD75Bt>-1pz$Tpvi&}828NdnpxzOrYX!T< zPnN$$6V$T<)pTrOFPLB^@wb5X3gIxVWfAD$=}9~g2XKVFIGqdjaqEE+><-}IZ%yH6 zV0ak@8eze3fBw-i?zOW6zdAUsNYL>U-f)`R95phiqd1uMWA0&M)P zIUqgYZKqH@-em;!*oZMOyyOPW;z0EX!m0VNSypB5Jq5D&Qe&2anBU? zf(v1(9>|16au7@9!d~2hHNyB?KTPV-p;sw%U1zEcXPNUZREh#Dt46lVJ zycU>%R%k+UvMGPd4^?Q;FoeDEf?2}f;;0Xr{6$R!5IySrt?K#=3@>-;fmA$s*#lMy zs;ORH`uYDqY}k!I?8UJ}sGIp)PlMAGSW(>n|NkKkrYqos`4Qb2Xai>*=tdBDs|Rue zA<~H-;J!6~3uvJxLM!-Ws?u^u)!7X`3WY!5MO6mW0j0rE83%ALm_Oh}JY32GE(L7~ zm%?}PgKi*iJy0SBRT02)`~dhqV+R|{L#13hKt~Y0?A3!W0mR{-wu85K%)6 z&q_hHp?H?RRReUg1S_ajF-I4_hfz*vVFH~>fF4(%QB;h$I+unst~SG^$d4<~s^XUq zb#OWzJfv4*5A{4Ope^AxOG9Pg0WAlUD&g9}4hokR9Z-G%C-Le(u$AU@ERb`xT=-i( zzW@IZIu#yVy|RIpC~@$&fL7p5cxm+=rXF%^B3q~Hh5w}&UhINZhx{$P-$6(1f>Kzw z?*-Vh6@PGlgRRpSthxuG`q8)l|GR6ifEPf*Rl}<`zOWYwFtsIGo#sfZ#p{s9CBWIS zlxxRF&}7pxZMg4xzM;C71M1q?m+itP(;izxV=P%!f;nlP4^| z0!Gd6~gEI?XzzZI@lfqFl3tzyCkFc7p)CMj^ zd;w$uI!MJ2Q~)u8GMcm|Y{7&}2{*XXW_g+W1(qfuXZo>)znF6anjAsL)q#>C>Z!qO z;V;;(!&Ibzc9wv%uF4lsa=8LJ71{z(K7&(1sU1w9`GG*|0r1`4kgaVnuV6h(j2V<5 z(>34;^3Z3PQ^6S$Tzj*XazZLsgpW4Dl|j#1Wh)hglqH}=`R**uKV;#)Z$+quota%~ z1Zp_2g}-=l4dzJ&P{RS;QzcwGKxa(7Jf;qJp!sJ|5P(DD?dSjhVT;vWN<_hn)onl{ z9?)Pvi?A4S;{_YsO`E`4LFd9E-0KEzgRzCbc$fgoavIPq2S0}p>g=qmP-pYE9AIQ% zcpV9~F&beb+^eQgJ%3?(N|a%y!eR`1P*@4q4pvZf+)!g+=&oaV30e{YRti4G5jBao zfVQ%rrB*ZkR?wmjxF~2n=@0MvDpUc+Izdzc_PPjE0f7>CQ~|*fGh~6*10`z6{N^8w zC8DSTviz-}z9mc$x{tw(zZG=A1zZ&Bz%o<;BnN^f4w`?k*M*>}5GZj*6%Z^jLKbK} zP@;s)2RRV#X^5G!rCdAMK!KgD3Qt;dKf=;JJez*K0*z>#*);w#OhqU>n}&P@rBUqJ zl*rZm(jd2;SAn~Y@gq2`r#1gTWWwnmP~FQB{^H*wm}^wPDF^eI&`*zHDoWw*_4|O$ zz2IhFi9cE*C9|9n0Qu*?GTcA6-^1LFC}%h@%b8PfWzcel19v$y51|&G`5>DF!(TL9 zg8AAIYdM3|uz+}*Ylk4n#l8p^+rI||61d=*`T-mn;BHJhe+%f6h2|gWpo8dO#n4sI z39`^aAss22Kus(g4tO!-12za-F~kx6A}R)NF~kx6;_(HjulQS@fr_ClsEuE-gar8P z5svT|Wf!4(N=#rW1TBVj&smt!r!uofq~(*KcsT(F1--;;$S2!Vd_DX5cJ4#WCPq0 z27oT%eF-{R3Yt8_-hy%xDE)wY3uvi@S|yGcD8PE<85p|VSvp-Wyab)q33e_AnyujG z6ShPz4l=*pIJajs@|d=ZV1zSXX!nbng{R89W)`Y{+dwsD&4>kfUwG zU&x<@dD9hZ0ZU}HCj;`u4Ow_KVgCvgQcqqUMF{1;0vEn%%|CMCzUW7|4BXNK_hR`< z(m*p3t)K&+KzkebTRy7T$v3((%L*NhXO+2hbl zm