From 109c65d77998d07bf774a9c48d064d5ef1fbe848 Mon Sep 17 00:00:00 2001 From: Kelebek1 Date: Fri, 9 Aug 2024 21:42:52 +0100 Subject: [PATCH 1/8] test --- .gitignore | 36 +- Makefile | 638 +-- include/{common.h => global.h} | 0 lib/ultralib/.github/workflows/ci_egcs.txt | 42 + lib/ultralib/.github/workflows/ci_gcc.yml | 41 + lib/ultralib/.github/workflows/ci_ido.yml | 41 + lib/ultralib/.gitignore | 29 + lib/ultralib/.gitrepo | 12 + lib/ultralib/Makefile | 234 + lib/ultralib/Makefile.gcc | 67 + lib/ultralib/Makefile.ido | 60 + lib/ultralib/README.md | 72 + lib/ultralib/base/I/libgultra.txt | 404 ++ lib/ultralib/base/I/libgultra_d.txt | 404 ++ lib/ultralib/base/I/libgultra_rom.txt | 404 ++ lib/ultralib/base/I/libultra.txt | 400 ++ lib/ultralib/base/I/libultra_d.txt | 404 ++ lib/ultralib/base/I/libultra_rom.txt | 370 ++ lib/ultralib/base/J/libgultra.txt | 446 ++ lib/ultralib/base/J/libgultra_d.txt | 451 ++ lib/ultralib/base/J/libgultra_rom.txt | 416 ++ lib/ultralib/base/J/libultra.txt | 446 ++ lib/ultralib/base/J/libultra_d.txt | 451 ++ lib/ultralib/base/J/libultra_rom.txt | 418 ++ lib/ultralib/base/K/libgultra.txt | 468 ++ lib/ultralib/base/K/libgultra_d.txt | 471 ++ lib/ultralib/base/K/libgultra_rom.txt | 425 ++ lib/ultralib/base/K/libultra.txt | 468 ++ lib/ultralib/base/K/libultra_d.txt | 471 ++ lib/ultralib/base/K/libultra_rom.txt | 427 ++ lib/ultralib/base/L/libgultra.txt | 483 ++ lib/ultralib/base/L/libgultra_d.txt | 486 ++ lib/ultralib/base/L/libgultra_rom.txt | 440 ++ lib/ultralib/base/L/libultra.txt | 483 ++ lib/ultralib/base/L/libultra_d.txt | 486 ++ lib/ultralib/base/L/libultra_rom.txt | 442 ++ lib/ultralib/include/PR/R4300.h | 453 ++ lib/ultralib/include/PR/abi.h | 410 ++ lib/ultralib/include/PR/gbi.h | 4585 +++++++++++++++++ lib/ultralib/include/PR/gs2dex.h | 392 ++ lib/ultralib/include/PR/gt.h | 365 ++ lib/ultralib/include/PR/gu.h | 270 + {include => lib/ultralib/include}/PR/leo.h | 0 .../ultralib/include}/PR/leoappli.h | 0 lib/ultralib/include/PR/libaudio.h | 947 ++++ lib/ultralib/include/PR/mbi.h | 100 + lib/ultralib/include/PR/os.h | 108 + lib/ultralib/include/PR/os_ai.h | 92 + lib/ultralib/include/PR/os_cache.h | 96 + lib/ultralib/include/PR/os_cont.h | 208 + lib/ultralib/include/PR/os_convert.h | 111 + lib/ultralib/include/PR/os_debug.h | 117 + lib/ultralib/include/PR/os_eeprom.h | 107 + lib/ultralib/include/PR/os_error.h | 86 + lib/ultralib/include/PR/os_exception.h | 86 + lib/ultralib/include/PR/os_flash.h | 77 + lib/ultralib/include/PR/os_gbpak.h | 107 + lib/ultralib/include/PR/os_gio.h | 86 + lib/ultralib/include/PR/os_host.h | 166 + lib/ultralib/include/PR/os_internal.h | 49 + lib/ultralib/include/PR/os_internal_debug.h | 43 + lib/ultralib/include/PR/os_internal_error.h | 45 + .../include/PR/os_internal_exception.h | 57 + lib/ultralib/include/PR/os_internal_flash.h | 40 + lib/ultralib/include/PR/os_internal_gio.h | 45 + lib/ultralib/include/PR/os_internal_host.h | 42 + lib/ultralib/include/PR/os_internal_reg.h | 57 + lib/ultralib/include/PR/os_internal_rsp.h | 48 + lib/ultralib/include/PR/os_internal_si.h | 46 + lib/ultralib/include/PR/os_internal_thread.h | 43 + lib/ultralib/include/PR/os_internal_tlb.h | 47 + lib/ultralib/include/PR/os_libc.h | 100 + lib/ultralib/include/PR/os_message.h | 162 + lib/ultralib/include/PR/os_motor.h | 84 + lib/ultralib/include/PR/os_pfs.h | 200 + lib/ultralib/include/PR/os_pi.h | 221 + lib/ultralib/include/PR/os_rdp.h | 92 + lib/ultralib/include/PR/os_reg.h | 90 + lib/ultralib/include/PR/os_rsp.h | 86 + lib/ultralib/include/PR/os_si.h | 86 + lib/ultralib/include/PR/os_system.h | 118 + lib/ultralib/include/PR/os_thread.h | 161 + lib/ultralib/include/PR/os_time.h | 114 + lib/ultralib/include/PR/os_tlb.h | 107 + lib/ultralib/include/PR/os_version.h | 26 + lib/ultralib/include/PR/os_vi.h | 298 ++ lib/ultralib/include/PR/os_voice.h | 108 + lib/ultralib/include/PR/ramrom.h | 113 + lib/ultralib/include/PR/rcp.h | 848 +++ lib/ultralib/include/PR/rdb.h | 93 + lib/ultralib/include/PR/region.h | 123 + lib/ultralib/include/PR/rmon.h | 39 + lib/ultralib/include/PR/sched.h | 115 + lib/ultralib/include/PR/sp.h | 196 + lib/ultralib/include/PR/sptask.h | 201 + lib/ultralib/include/PR/ucode.h | 192 + lib/ultralib/include/PR/ultraerror.h | 165 + lib/ultralib/include/PR/ultralog.h | 74 + lib/ultralib/include/PR/ultratypes.h | 85 + lib/ultralib/include/asm.h | 1 + lib/ultralib/include/assert.h | 12 + lib/ultralib/include/dbgdefs.h | 8 + lib/ultralib/include/dbgproto.h | 402 ++ lib/ultralib/include/fpregdef.h | 0 lib/ultralib/include/gcc/math.h | 1 + lib/ultralib/include/gcc/memory.h | 23 + lib/ultralib/include/gcc/sgidefs.h | 44 + lib/ultralib/include/gcc/stdarg.h | 121 + lib/ultralib/include/gcc/stdio.h | 1 + lib/ultralib/include/gcc/stdlib.h | 81 + lib/ultralib/include/gcc/string.h | 42 + lib/ultralib/include/ido/math.h | 1 + lib/ultralib/include/ido/memory.h | 23 + lib/ultralib/include/ido/stdarg.h | 33 + lib/ultralib/include/ido/stdio.h | 1 + lib/ultralib/include/ido/stdlib.h | 81 + lib/ultralib/include/ido/string.h | 42 + lib/ultralib/include/macros.h | 16 + lib/ultralib/include/regdef.h | 3 + lib/ultralib/include/sgidefs.h | 3 + lib/ultralib/include/sys/asm.h | 116 + lib/ultralib/include/sys/fpregdef.h | 0 lib/ultralib/include/sys/regdef.h | 187 + lib/ultralib/include/ultra64.h | 40 + lib/ultralib/include/ultrahost.h | 59 + lib/ultralib/src/audio/Makefile | 120 + .../al => lib/ultralib/src/audio}/auxbus.c | 0 .../al => lib/ultralib/src/audio}/bnkf.c | 0 lib/ultralib/src/audio/cents2ratio.c | 33 + .../al => lib/ultralib/src/audio}/copy.c | 1 + lib/ultralib/src/audio/cseq.c | 409 ++ lib/ultralib/src/audio/cseq.h | 11 + lib/ultralib/src/audio/cseqp.h | 10 + lib/ultralib/src/audio/cspdelete.c | 29 + lib/ultralib/src/audio/cspgetchlvol.c | 27 + lib/ultralib/src/audio/cspgetfxmix.c | 27 + lib/ultralib/src/audio/cspgetpan.c | 27 + lib/ultralib/src/audio/cspgetpriority.c | 26 + lib/ultralib/src/audio/cspgetprogram.c | 42 + lib/ultralib/src/audio/cspgetseq.c | 29 + lib/ultralib/src/audio/cspgetstate.c | 29 + lib/ultralib/src/audio/cspgettempo.c | 31 + lib/ultralib/src/audio/cspgetvol.c | 27 + lib/ultralib/src/audio/csplayer.c | 882 ++++ lib/ultralib/src/audio/cspplay.c | 34 + lib/ultralib/src/audio/cspsendmidi.c | 40 + lib/ultralib/src/audio/cspsetbank.c | 32 + lib/ultralib/src/audio/cspsetchlvol.c | 35 + lib/ultralib/src/audio/cspsetfxmix.c | 35 + lib/ultralib/src/audio/cspsetpan.c | 35 + lib/ultralib/src/audio/cspsetpriority.c | 32 + lib/ultralib/src/audio/cspsetprogram.c | 35 + lib/ultralib/src/audio/cspsetseq.c | 34 + lib/ultralib/src/audio/cspsettempo.c | 36 + lib/ultralib/src/audio/cspsetvol.c | 32 + lib/ultralib/src/audio/cspstop.c | 32 + .../ultralib/src/audio/drvrnew.c | 4 +- .../al => lib/ultralib/src/audio}/env.c | 31 +- lib/ultralib/src/audio/event.c | 272 + .../al => lib/ultralib/src/audio}/filter.c | 0 .../al => lib/ultralib/src/audio}/heapalloc.c | 0 lib/ultralib/src/audio/heapcheck.c | 71 + .../al => lib/ultralib/src/audio}/heapinit.c | 0 lib/ultralib/src/audio/initfx.h | 59 + .../al => lib/ultralib/src/audio}/load.c | 0 .../al => lib/ultralib/src/audio}/mainbus.c | 0 lib/ultralib/src/audio/parse_abi.c | 47 + .../al => lib/ultralib/src/audio}/resample.c | 1 + .../al => lib/ultralib/src/audio}/reverb.c | 13 +- .../al => lib/ultralib/src/audio}/save.c | 11 +- lib/ultralib/src/audio/seq.c | 343 ++ lib/ultralib/src/audio/seq.h | 9 + lib/ultralib/src/audio/seqp.h | 37 + lib/ultralib/src/audio/seqpdelete.c | 39 + lib/ultralib/src/audio/seqpgetchlvol.c | 27 + lib/ultralib/src/audio/seqpgetfxmix.c | 27 + lib/ultralib/src/audio/seqpgetpan.c | 27 + lib/ultralib/src/audio/seqpgetpriority.c | 26 + lib/ultralib/src/audio/seqpgetprogram.c | 42 + lib/ultralib/src/audio/seqpgetseq.c | 29 + lib/ultralib/src/audio/seqpgetstate.c | 29 + lib/ultralib/src/audio/seqpgettempo.c | 31 + lib/ultralib/src/audio/seqpgetvol.c | 27 + lib/ultralib/src/audio/seqplayer.c | 1228 +++++ lib/ultralib/src/audio/seqploop.c | 35 + lib/ultralib/src/audio/seqpplay.c | 48 + lib/ultralib/src/audio/seqpsendmidi.c | 40 + lib/ultralib/src/audio/seqpsetbank.c | 32 + lib/ultralib/src/audio/seqpsetchlvol.c | 35 + lib/ultralib/src/audio/seqpsetfxmix.c | 35 + lib/ultralib/src/audio/seqpsetpan.c | 35 + lib/ultralib/src/audio/seqpsetpriority.c | 32 + lib/ultralib/src/audio/seqpsetprogram.c | 36 + lib/ultralib/src/audio/seqpsetseq.c | 34 + lib/ultralib/src/audio/seqpsettempo.c | 36 + lib/ultralib/src/audio/seqpsetvol.c | 32 + lib/ultralib/src/audio/seqpstop.c | 33 + lib/ultralib/src/audio/sl.c | 65 + lib/ultralib/src/audio/sndp.h | 102 + lib/ultralib/src/audio/sndpallocate.c | 43 + lib/ultralib/src/audio/sndpdeallocate.c | 35 + lib/ultralib/src/audio/sndpdelete.c | 44 + lib/ultralib/src/audio/sndpgetsound.c | 27 + lib/ultralib/src/audio/sndpgetstate.c | 29 + lib/ultralib/src/audio/sndplayer.c | 297 ++ lib/ultralib/src/audio/sndpplay.c | 36 + lib/ultralib/src/audio/sndpplayat.c | 32 + lib/ultralib/src/audio/sndpsetfxmix.c | 42 + lib/ultralib/src/audio/sndpsetpan.c | 42 + lib/ultralib/src/audio/sndpsetpitch.c | 48 + lib/ultralib/src/audio/sndpsetpriority.c | 38 + lib/ultralib/src/audio/sndpsetsound.c | 36 + lib/ultralib/src/audio/sndpsetvol.c | 42 + lib/ultralib/src/audio/sndpstop.c | 35 + lib/ultralib/src/audio/synaddplayer.c | 34 + .../ultralib/src/audio}/synallocfx.c | 1 + lib/ultralib/src/audio/synallocvoice.c | 132 + .../al => lib/ultralib/src/audio}/syndelete.c | 1 + lib/ultralib/src/audio/synfreefx.c | 26 + lib/ultralib/src/audio/synfreevoice.c | 54 + lib/ultralib/src/audio/syngetfxref.c | 33 + lib/ultralib/src/audio/syngetpriority.c | 27 + lib/ultralib/src/audio/synremoveplayer.c | 49 + lib/ultralib/src/audio/synsetfxmix.c | 60 + lib/ultralib/src/audio/synsetfxparam.c | 29 + lib/ultralib/src/audio/synsetpan.c | 50 + lib/ultralib/src/audio/synsetpitch.c | 50 + lib/ultralib/src/audio/synsetpriority.c | 27 + lib/ultralib/src/audio/synsetvol.c | 50 + lib/ultralib/src/audio/synstartvoice.c | 48 + lib/ultralib/src/audio/synstartvoiceparam.c | 75 + lib/ultralib/src/audio/synstopvoice.c | 44 + lib/ultralib/src/audio/synthInternals.h | 344 ++ .../ultralib/src/audio}/synthesizer.c | 12 +- lib/ultralib/src/debug/assert.c | 12 + lib/ultralib/src/debug/assertbreak.s | 14 + lib/ultralib/src/debug/atomic.c | 16 + lib/ultralib/src/debug/kdebugserver.c | 96 + lib/ultralib/src/debug/osint_debug.h | 11 + lib/ultralib/src/debug/profile.c | 176 + lib/ultralib/src/debug/threadprofile.c | 22 + lib/ultralib/src/debug/threadprofileclear.c | 11 + lib/ultralib/src/debug/threadprofileinit.c | 16 + .../src/debug/threadprofilereadcount.c | 39 + .../src/debug/threadprofilereadtime.c | 51 + lib/ultralib/src/debug/threadprofilestart.c | 22 + lib/ultralib/src/debug/threadprofilestop.c | 47 + lib/ultralib/src/error/commonerror.c | 193 + lib/ultralib/src/error/error.c | 30 + lib/ultralib/src/error/errorasm.s | 33 + lib/ultralib/src/flash/flashallerase.c | 33 + lib/ultralib/src/flash/flashallerasethrough.c | 8 + lib/ultralib/src/flash/flashchange.c | 8 + lib/ultralib/src/flash/flashcheckeraseend.c | 23 + lib/ultralib/src/flash/flashclearstatus.c | 10 + lib/ultralib/src/flash/flashgetaddr.c | 15 + lib/ultralib/src/flash/flashinit.c | 44 + lib/ultralib/src/flash/flashreadarray.c | 51 + lib/ultralib/src/flash/flashreadid.c | 27 + lib/ultralib/src/flash/flashreadstatus.c | 17 + lib/ultralib/src/flash/flashreinit.c | 14 + lib/ultralib/src/flash/flashsectorerase.c | 32 + .../src/flash/flashsectorerasethrough.c | 8 + lib/ultralib/src/flash/flashwritearray.c | 34 + lib/ultralib/src/flash/flashwritebuffer.c | 20 + lib/ultralib/src/gio/giointerrupt.c | 8 + lib/ultralib/src/gio/giorawinterrupt.c | 13 + lib/ultralib/src/gt/Makefile | 19 + lib/ultralib/src/gt/dumpturbo.c | 260 + lib/ultralib/src/gt/gt.c | 155 + lib/ultralib/src/gt/gtint.h | 36 + lib/ultralib/src/gu/Makefile | 52 + lib/ultralib/src/gu/align.c | 75 + {src/libultra => lib/ultralib/src}/gu/cosf.c | 0 lib/ultralib/src/gu/coss.c | 45 + lib/ultralib/src/gu/dump_gbi.c | 274 + lib/ultralib/src/gu/frustum.c | 42 + {src/libultra => lib/ultralib/src}/gu/guint.h | 0 lib/ultralib/src/gu/guloadtile_bug.c | 235 + lib/ultralib/src/gu/libm_vals.s | 5 + lib/ultralib/src/gu/loadtextureblockmipmap.c | 717 +++ lib/ultralib/src/gu/lookat.c | 83 + lib/ultralib/src/gu/lookathil.c | 185 + .../ultralib/src}/gu/lookatref.c | 15 +- lib/ultralib/src/gu/lookatstereo.c | 111 + .../ultralib/src}/gu/mtxcatf.c | 126 +- .../ultralib/src}/gu/mtxcatl.c | 3 + .../ultralib/src}/gu/mtxutil.c | 0 .../ultralib/src}/gu/normalize.c | 46 +- {src/libultra => lib/ultralib/src}/gu/ortho.c | 0 lib/ultralib/src/gu/parse_gbi.c | 139 + lib/ultralib/src/gu/parse_rdp.c | 36 + lib/ultralib/src/gu/parse_string.c | 35 + lib/ultralib/src/gu/perspective.c | 58 + lib/ultralib/src/gu/position.c | 73 + lib/ultralib/src/gu/poslight.c | 69 + lib/ultralib/src/gu/poslighthil.c | 168 + .../libultra => lib/ultralib/src}/gu/random.c | 0 lib/ultralib/src/gu/readme.txt | 17 + .../libultra => lib/ultralib/src}/gu/rotate.c | 68 +- .../ultralib/src/gu/rotaterpy.c | 24 +- lib/ultralib/src/gu/scale.c | 32 + lib/ultralib/src/gu/sinf.c | 157 + lib/ultralib/src/gu/sins.c | 61 + lib/ultralib/src/gu/sintable.h | 1031 ++++ lib/ultralib/src/gu/sqrtf.s | 25 + .../ultralib/src}/gu/translate.c | 62 +- lib/ultralib/src/gu/us2dex.c | 73 + lib/ultralib/src/gu/us2dex2_emu.c | 12 + lib/ultralib/src/gu/us2dex_emu.c | 521 ++ lib/ultralib/src/gu/usprite.c | 39 + lib/ultralib/src/host/host_ptn64.c | 209 + lib/ultralib/src/host/readhost.c | 36 + lib/ultralib/src/host/writehost.c | 57 + {src/libultra => lib/ultralib/src}/io/ai.c | 6 +- .../ultralib/src}/io/aigetlen.c | 0 .../ultralib/src}/io/aigetstat.c | 0 lib/ultralib/src/io/aisetfreq.c | 53 + lib/ultralib/src/io/aisetnextbuf.c | 52 + lib/ultralib/src/io/cartrominit.c | 95 + lib/ultralib/src/io/contchannelreset.c | 28 + lib/ultralib/src/io/conteeplongread.c | 15 + lib/ultralib/src/io/conteeplongwrite.c | 17 + lib/ultralib/src/io/conteepprobe.c | 34 + lib/ultralib/src/io/conteepread.c | 139 + lib/ultralib/src/io/conteepwrite.c | 203 + lib/ultralib/src/io/contpfs.c | 393 ++ lib/ultralib/src/io/contquery.c | 25 + lib/ultralib/src/io/contramread.c | 163 + lib/ultralib/src/io/contramwrite.c | 165 + lib/ultralib/src/io/contreaddata.c | 68 + lib/ultralib/src/io/contreset.c | 51 + lib/ultralib/src/io/controller.c | 101 + lib/ultralib/src/io/controller.h | 289 ++ lib/ultralib/src/io/controller_gbpak.h | 8 + lib/ultralib/src/io/controller_voice.h | 59 + lib/ultralib/src/io/contsetch.c | 19 + lib/ultralib/src/io/crc.c | 114 + lib/ultralib/src/io/devmgr.c | 108 + lib/ultralib/src/io/dp.c | 15 + {src/libultra => lib/ultralib/src}/io/dpctr.c | 2 +- .../ultralib/src}/io/dpgetstat.c | 0 lib/ultralib/src/io/dpsetnextbuf.c | 39 + .../ultralib/src}/io/dpsetstat.c | 0 lib/ultralib/src/io/driverominit.c | 31 + lib/ultralib/src/io/epidma.c | 61 + lib/ultralib/src/io/epigettype.c | 7 + .../ultralib/src/io}/epilinkhandle.c | 7 +- lib/ultralib/src/io/epirawdma.c | 53 + lib/ultralib/src/io/epirawread.c | 48 + lib/ultralib/src/io/epirawwrite.c | 22 + lib/ultralib/src/io/epiread.c | 19 + lib/ultralib/src/io/epiwrite.c | 19 + lib/ultralib/src/io/gbpakcheckconnector.c | 131 + lib/ultralib/src/io/gbpakgetbank.c | 28 + lib/ultralib/src/io/gbpakgetstatus.c | 39 + lib/ultralib/src/io/gbpakinit.c | 90 + lib/ultralib/src/io/gbpakpower.c | 34 + lib/ultralib/src/io/gbpakreadid.c | 97 + lib/ultralib/src/io/gbpakreadwrite.c | 74 + lib/ultralib/src/io/gbpaksetbank.c | 35 + lib/ultralib/src/io/leodiskinit.c | 36 + lib/ultralib/src/io/leointerrupt.c | 194 + lib/ultralib/src/io/motor.c | 332 ++ lib/ultralib/src/io/pfsallocatefile.c | 371 ++ lib/ultralib/src/io/pfschecker.c | 258 + lib/ultralib/src/io/pfsdeletefile.c | 180 + lib/ultralib/src/io/pfsfilestate.c | 112 + lib/ultralib/src/io/pfsfreeblocks.c | 31 + lib/ultralib/src/io/pfsgetlabel.c | 25 + lib/ultralib/src/io/pfsgetstatus.c | 100 + lib/ultralib/src/io/pfsinit.c | 25 + lib/ultralib/src/io/pfsinitpak.c | 129 + lib/ultralib/src/io/pfsisplug.c | 97 + lib/ultralib/src/io/pfsnumfiles.c | 34 + lib/ultralib/src/io/pfsreadwritefile.c | 124 + lib/ultralib/src/io/pfsreformat.c | 71 + lib/ultralib/src/io/pfsrepairid.c | 73 + lib/ultralib/src/io/pfssearchfile.c | 56 + lib/ultralib/src/io/pfsselectbank.c | 22 + lib/ultralib/src/io/pfssetlabel.c | 41 + lib/ultralib/src/io/pi.c | 15 + lib/ultralib/src/io/piacs.c | 25 + lib/ultralib/src/io/pidma.c | 66 + lib/ultralib/src/io/pigetcmdq.c | 10 + lib/ultralib/src/io/pigetstat.c | 9 + lib/ultralib/src/io/pigettype.c | 8 + {src/libultra => lib/ultralib/src}/io/piint.h | 51 +- lib/ultralib/src/io/pimgr.c | 114 + lib/ultralib/src/io/pirawdma.c | 53 + lib/ultralib/src/io/pirawread.c | 66 + lib/ultralib/src/io/pirawwrite.c | 21 + lib/ultralib/src/io/piread.c | 19 + lib/ultralib/src/io/piwrite.c | 19 + lib/ultralib/src/io/si.c | 15 + lib/ultralib/src/io/siacs.c | 25 + lib/ultralib/src/io/sigetstat.c | 9 + {src/libultra => lib/ultralib/src}/io/siint.h | 9 +- lib/ultralib/src/io/sirawdma.c | 85 + lib/ultralib/src/io/sirawread.c | 62 + .../ultralib/src}/io/sirawwrite.c | 49 +- lib/ultralib/src/io/sp.c | 17 + .../ultralib/src}/io/spgetstat.c | 0 lib/ultralib/src/io/sprawdma.c | 77 + lib/ultralib/src/io/sprawread.c | 61 + lib/ultralib/src/io/sprawwrite.c | 61 + .../ultralib/src}/io/spsetpc.c | 0 .../ultralib/src}/io/spsetstat.c | 0 lib/ultralib/src/io/sptask.c | 82 + lib/ultralib/src/io/sptaskyield.c | 6 + lib/ultralib/src/io/sptaskyielded.c | 18 + lib/ultralib/src/io/vi.c | 39 + .../ultralib/src}/io/viblack.c | 16 +- lib/ultralib/src/io/viextendvstart.c | 19 + lib/ultralib/src/io/vifade.c | 18 + .../ultralib/src}/io/vigetcurrcontext.c | 4 +- lib/ultralib/src/io/vigetcurrframebuf.c | 20 + lib/ultralib/src/io/vigetfield.c | 6 + lib/ultralib/src/io/vigetline.c | 6 + lib/ultralib/src/io/vigetmode.c | 21 + lib/ultralib/src/io/vigetnextcontext.c | 6 + lib/ultralib/src/io/vigetnextframebuf.c | 20 + lib/ultralib/src/io/vigetstat.c | 6 + {src/libultra => lib/ultralib/src}/io/viint.h | 17 +- lib/ultralib/src/io/vimgr.c | 126 + lib/ultralib/src/io/virepeatline.c | 17 + lib/ultralib/src/io/visetevent.c | 70 + lib/ultralib/src/io/visetmode.c | 67 + .../ultralib/src}/io/visetspecial.c | 44 +- lib/ultralib/src/io/visetxscale.c | 37 + lib/ultralib/src/io/visetyscale.c | 34 + lib/ultralib/src/io/viswapbuf.c | 75 + .../ultralib/src}/io/viswapcontext.c | 22 +- lib/ultralib/src/io/vitbl.c | 1740 +++++++ lib/ultralib/src/libc/bcmp.s | 96 + lib/ultralib/src/libc/bcopy.s | 220 + lib/ultralib/src/libc/bzero.s | 64 + lib/ultralib/src/libc/ldiv.c | 34 + lib/ultralib/src/libc/ll.c | 48 + lib/ultralib/src/libc/llbit.c | 52 + .../ultralib/src}/libc/llcvt.c | 16 +- lib/ultralib/src/libc/sprintf.c | 22 + .../ultralib/src}/libc/string.c | 26 +- lib/ultralib/src/libc/syncprintf.c | 154 + .../ultralib/src}/libc/xldtob.c | 84 +- .../ultralib/src}/libc/xlitob.c | 10 +- lib/ultralib/src/libc/xprintf.c | 257 + lib/ultralib/src/libc/xstdio.h | 37 + lib/ultralib/src/log/delay.s | 24 + lib/ultralib/src/log/log.c | 124 + lib/ultralib/src/log/logfloat.c | 11 + lib/ultralib/src/mgu/Makefile | 36 + lib/ultralib/src/mgu/asm.h | 49 + lib/ultralib/src/mgu/mtxcatf.s | 103 + lib/ultralib/src/mgu/mtxcatl.c | 44 + lib/ultralib/src/mgu/mtxf2l.s | 80 + lib/ultralib/src/mgu/mtxident.s | 60 + lib/ultralib/src/mgu/mtxidentf.s | 60 + lib/ultralib/src/mgu/mtxl2f.s | 80 + lib/ultralib/src/mgu/mtxxfmf.c | 40 + lib/ultralib/src/mgu/mtxxfml.c | 41 + lib/ultralib/src/mgu/normalize.s | 56 + lib/ultralib/src/mgu/regdef.h | 187 + lib/ultralib/src/mgu/rotate.c | 73 + lib/ultralib/src/mgu/scale.s | 85 + lib/ultralib/src/mgu/scalef.s | 57 + lib/ultralib/src/mgu/translate.s | 101 + lib/ultralib/src/mgu/translatef.s | 58 + lib/ultralib/src/monutil.s | 188 + lib/ultralib/src/os/ackramromread.c | 16 + lib/ultralib/src/os/ackramromwrite.c | 15 + lib/ultralib/src/os/afterprenmi.c | 5 + lib/ultralib/src/os/atomic.c | 16 + lib/ultralib/src/os/createmesgqueue.c | 20 + lib/ultralib/src/os/createthread.c | 54 + lib/ultralib/src/os/destroythread.c | 49 + lib/ultralib/src/os/exceptasm.h | 29 + lib/ultralib/src/os/exceptasm.s | 1069 ++++ lib/ultralib/src/os/exit.c | 9 + .../ultralib/src}/os/getactivequeue.c | 2 +- lib/ultralib/src/os/getcause.s | 9 + lib/ultralib/src/os/getcompare.s | 9 + lib/ultralib/src/os/getconfig.s | 9 + lib/ultralib/src/os/getcount.s | 9 + lib/ultralib/src/os/getcurrfaultthread.c | 6 + lib/ultralib/src/os/getfpccsr.s | 9 + lib/ultralib/src/os/gethwinterrupt.c | 21 + lib/ultralib/src/os/getintmask.s | 33 + lib/ultralib/src/os/getmemsize.c | 53 + lib/ultralib/src/os/getnextfaultthread.c | 23 + lib/ultralib/src/os/getsr.s | 9 + lib/ultralib/src/os/getthreadid.c | 10 + lib/ultralib/src/os/getthreadpri.c | 10 + lib/ultralib/src/os/gettime.c | 25 + lib/ultralib/src/os/gettlbasid.s | 11 + lib/ultralib/src/os/gettlbhi.s | 17 + lib/ultralib/src/os/gettlblo0.s | 17 + lib/ultralib/src/os/gettlblo1.s | 17 + lib/ultralib/src/os/gettlbpagemask.s | 17 + lib/ultralib/src/os/getwatchlo.s | 9 + lib/ultralib/src/os/initialize.c | 224 + lib/ultralib/src/os/initialize_emu.c | 27 + lib/ultralib/src/os/initialize_isv.c | 175 + lib/ultralib/src/os/initialize_kmc.c | 152 + lib/ultralib/src/os/initialize_msp.c | 152 + lib/ultralib/src/os/initrdb.c | 31 + lib/ultralib/src/os/interrupt.s | 52 + lib/ultralib/src/os/invaldcache.s | 58 + lib/ultralib/src/os/invalicache.s | 41 + lib/ultralib/src/os/jammesg.c | 37 + lib/ultralib/src/os/maptlb.s | 111 + lib/ultralib/src/os/maptlbrdb.s | 30 + {src/libultra => lib/ultralib/src}/os/osint.h | 9 +- lib/ultralib/src/os/parameters.s | 17 + lib/ultralib/src/os/physicaltovirtual.c | 6 + lib/ultralib/src/os/probetlb.s | 54 + lib/ultralib/src/os/rdbsend.c | 76 + lib/ultralib/src/os/recvmesg.c | 40 + .../ultralib/src}/os/resetglobalintmask.c | 5 +- lib/ultralib/src/os/sendmesg.c | 38 + lib/ultralib/src/os/setcause.s | 9 + lib/ultralib/src/os/setcompare.s | 9 + lib/ultralib/src/os/setconfig.s | 9 + lib/ultralib/src/os/setcount.s | 9 + lib/ultralib/src/os/seterrorhandler.c | 10 + lib/ultralib/src/os/seteventmesg.c | 39 + lib/ultralib/src/os/setfpccsr.s | 10 + .../ultralib/src}/os/setglobalintmask.c | 6 +- lib/ultralib/src/os/sethwinterrupt.c | 32 + lib/ultralib/src/os/setintmask.s | 124 + lib/ultralib/src/os/setpiinterrupt.c | 16 + lib/ultralib/src/os/setsr.s | 10 + .../ultralib/src}/os/setthreadpri.c | 36 +- lib/ultralib/src/os/settime.c | 16 + lib/ultralib/src/os/settimer.c | 56 + lib/ultralib/src/os/settlbasid.s | 32 + lib/ultralib/src/os/setwatchlo.s | 10 + lib/ultralib/src/os/startthread.c | 39 + lib/ultralib/src/os/stopthread.c | 23 + lib/ultralib/src/os/stoptimer.c | 39 + lib/ultralib/src/os/syncputchars.c | 35 + lib/ultralib/src/os/testhost.c | 12 + lib/ultralib/src/os/thread.c | 28 + lib/ultralib/src/os/threadasm.h | 68 + lib/ultralib/src/os/timerintr.c | 141 + lib/ultralib/src/os/unmaptlb.s | 45 + lib/ultralib/src/os/unmaptlball.s | 26 + lib/ultralib/src/os/virtualtophysical.c | 13 + lib/ultralib/src/os/writebackdcache.s | 35 + lib/ultralib/src/os/writebackdcacheall.s | 18 + .../ultralib/src}/os/yieldthread.c | 2 +- lib/ultralib/src/rg/free.c | 73 + lib/ultralib/src/rg/getbufcount.c | 57 + lib/ultralib/src/rg/getsize.c | 57 + lib/ultralib/src/rg/malloc.c | 70 + lib/ultralib/src/rg/printregion.c | 27 + lib/ultralib/src/rg/region.c | 232 + lib/ultralib/src/rmon/rmonbrk.c | 432 ++ lib/ultralib/src/rmon/rmoncmds.c | 54 + lib/ultralib/src/rmon/rmonint.h | 169 + lib/ultralib/src/rmon/rmonmain.c | 138 + lib/ultralib/src/rmon/rmonmem.c | 283 + lib/ultralib/src/rmon/rmonmisc.c | 76 + lib/ultralib/src/rmon/rmonprint.c | 1 + lib/ultralib/src/rmon/rmonrcp.s | 60 + lib/ultralib/src/rmon/rmonregs.c | 417 ++ lib/ultralib/src/rmon/rmonsio.c | 89 + lib/ultralib/src/rmon/rmontask.c | 343 ++ lib/ultralib/src/sched/Makefile | 19 + lib/ultralib/src/sched/sched.c | 620 +++ lib/ultralib/src/sched/sched_log.fmt | 19 + lib/ultralib/src/sp/Makefile | 30 + lib/ultralib/src/sp/clearattribute.c | 35 + lib/ultralib/src/sp/color.c | 39 + lib/ultralib/src/sp/hide.c | 35 + lib/ultralib/src/sp/setattribute.c | 35 + lib/ultralib/src/sp/show.c | 35 + lib/ultralib/src/sp/sprite.c | 761 +++ lib/ultralib/src/sp/spriteex.c | 2 + lib/ultralib/src/sp/spriteex2.c | 2 + lib/ultralib/src/sp/spscale.c | 42 + lib/ultralib/src/vimodes/vimodefpalhaf1.c | 37 + lib/ultralib/src/vimodes/vimodefpalhan1.c | 37 + lib/ultralib/src/vimodes/vimodefpalhpf1.c | 37 + lib/ultralib/src/vimodes/vimodefpalhpf2.c | 37 + lib/ultralib/src/vimodes/vimodefpalhpn1.c | 37 + lib/ultralib/src/vimodes/vimodefpalhpn2.c | 37 + lib/ultralib/src/vimodes/vimodefpallaf1.c | 37 + lib/ultralib/src/vimodes/vimodefpallaf2.c | 37 + lib/ultralib/src/vimodes/vimodefpallan1.c | 37 + lib/ultralib/src/vimodes/vimodefpallan2.c | 36 + lib/ultralib/src/vimodes/vimodefpallpf1.c | 37 + lib/ultralib/src/vimodes/vimodefpallpf2.c | 37 + lib/ultralib/src/vimodes/vimodefpallpn1.c | 37 + lib/ultralib/src/vimodes/vimodefpallpn2.c | 37 + lib/ultralib/src/vimodes/vimodempalhaf1.c | 37 + lib/ultralib/src/vimodes/vimodempalhan1.c | 37 + lib/ultralib/src/vimodes/vimodempalhpf1.c | 37 + lib/ultralib/src/vimodes/vimodempalhpf2.c | 37 + lib/ultralib/src/vimodes/vimodempalhpn1.c | 37 + lib/ultralib/src/vimodes/vimodempalhpn2.c | 37 + lib/ultralib/src/vimodes/vimodempallaf1.c | 37 + lib/ultralib/src/vimodes/vimodempallaf2.c | 37 + lib/ultralib/src/vimodes/vimodempallan1.c | 37 + lib/ultralib/src/vimodes/vimodempallan2.c | 36 + lib/ultralib/src/vimodes/vimodempallpf1.c | 37 + lib/ultralib/src/vimodes/vimodempallpf2.c | 37 + lib/ultralib/src/vimodes/vimodempallpn1.c | 37 + lib/ultralib/src/vimodes/vimodempallpn2.c | 37 + lib/ultralib/src/vimodes/vimodentschaf1.c | 37 + lib/ultralib/src/vimodes/vimodentschan1.c | 37 + lib/ultralib/src/vimodes/vimodentschpf1.c | 37 + lib/ultralib/src/vimodes/vimodentschpf2.c | 37 + lib/ultralib/src/vimodes/vimodentschpn1.c | 37 + lib/ultralib/src/vimodes/vimodentschpn2.c | 37 + lib/ultralib/src/vimodes/vimodentsclaf1.c | 37 + lib/ultralib/src/vimodes/vimodentsclaf2.c | 37 + lib/ultralib/src/vimodes/vimodentsclan1.c | 37 + lib/ultralib/src/vimodes/vimodentsclan2.c | 36 + lib/ultralib/src/vimodes/vimodentsclpf1.c | 37 + lib/ultralib/src/vimodes/vimodentsclpf2.c | 37 + lib/ultralib/src/vimodes/vimodentsclpn1.c | 37 + lib/ultralib/src/vimodes/vimodentsclpn2.c | 37 + lib/ultralib/src/vimodes/vimodepalhaf1.c | 37 + lib/ultralib/src/vimodes/vimodepalhan1.c | 37 + lib/ultralib/src/vimodes/vimodepalhpf1.c | 37 + lib/ultralib/src/vimodes/vimodepalhpf2.c | 37 + lib/ultralib/src/vimodes/vimodepalhpn1.c | 37 + lib/ultralib/src/vimodes/vimodepalhpn2.c | 37 + lib/ultralib/src/vimodes/vimodepallaf1.c | 37 + lib/ultralib/src/vimodes/vimodepallaf2.c | 37 + lib/ultralib/src/vimodes/vimodepallan1.c | 37 + lib/ultralib/src/vimodes/vimodepallan2.c | 36 + lib/ultralib/src/vimodes/vimodepallpf1.c | 37 + lib/ultralib/src/vimodes/vimodepallpf2.c | 37 + lib/ultralib/src/vimodes/vimodepallpn1.c | 37 + lib/ultralib/src/vimodes/vimodepallpn2.c | 37 + lib/ultralib/src/voice/voicecheckresult.c | 28 + lib/ultralib/src/voice/voicecheckword.c | 80 + lib/ultralib/src/voice/voicecleardictionary.c | 29 + lib/ultralib/src/voice/voicecontread2.c | 73 + lib/ultralib/src/voice/voicecontread36.c | 73 + lib/ultralib/src/voice/voicecontrolgain.c | 28 + lib/ultralib/src/voice/voicecontwrite20.c | 74 + lib/ultralib/src/voice/voicecontwrite4.c | 74 + lib/ultralib/src/voice/voicecountsyllables.c | 55 + lib/ultralib/src/voice/voicecrc.c | 40 + lib/ultralib/src/voice/voicegetreaddata.c | 94 + lib/ultralib/src/voice/voicegetstatus.c | 62 + lib/ultralib/src/voice/voiceinit.c | 42 + lib/ultralib/src/voice/voiceinternal.h | 18 + lib/ultralib/src/voice/voicemaskdictionary.c | 48 + lib/ultralib/src/voice/voicesetadconverter.c | 69 + lib/ultralib/src/voice/voicesetword.c | 54 + lib/ultralib/src/voice/voicestartreaddata.c | 36 + lib/ultralib/src/voice/voicestopreaddata.c | 59 + lib/ultralib/tools/Makefile | 46 + lib/ultralib/tools/ar.py | 476 ++ lib/ultralib/tools/asm_differ/.gitignore | 2 + lib/ultralib/tools/asm_differ/.gitrepo | 12 + .../tools/asm_differ/.pre-commit-config.yaml | 6 + lib/ultralib/tools/asm_differ/LICENSE | 24 + lib/ultralib/tools/asm_differ/README.md | 56 + .../tools/asm_differ/diff-stylesheet.css | 67 + lib/ultralib/tools/asm_differ/diff.py | 2923 +++++++++++ .../tools/asm_differ/diff_settings.py | 11 + lib/ultralib/tools/asm_differ/mypy.ini | 17 + lib/ultralib/tools/asm_differ/screenshot.png | Bin 0 -> 99842 bytes lib/ultralib/tools/compile_sjis.py | 28 + lib/ultralib/tools/disassemble_elf.py | 312 ++ lib/ultralib/tools/fix_objfile.py | 68 + lib/ultralib/tools/libdiff.py | 150 + lib/ultralib/tools/libelf.py | 1181 +++++ lib/ultralib/tools/m2ctx.py | 76 + lib/ultralib/tools/mdebug.py | 938 ++++ lib/ultralib/tools/mips_isa.py | 1309 +++++ lib/ultralib/tools/patch_ar_meta.py | 90 + lib/ultralib/tools/print_mdebug.py | 589 +++ lib/ultralib/tools/set_o32abi_bit.py | 25 + lib/ultralib/tools/shiftjis_conv.py | 58 + lib/ultralib/tools/strip_debug.sh | 10 + lib/ultralib/tools/util.py | 44 + {tools => linker_scripts/us}/symbol_addrs.txt | 0 .../us/undefined_syms.ld | 0 requirements.txt | 6 +- src/11BA0.c | 78 +- src/12D80.c | 146 +- src/12D80.h | 2 +- src/17300.c | 42 +- src/17300.h | 2 +- src/18140.c | 26 +- src/18480.c | 85 +- src/18480.h | 2 +- src/19840.c | 64 +- src/19840.h | 2 +- src/1AB70.c | 64 +- src/1C720.c | 38 +- src/1C720.h | 2 +- src/1CF30.c | 94 +- src/1CF30.h | 2 +- src/20330.c | 9 +- src/20330.h | 2 +- src/20470.c | 36 +- src/20470.h | 2 +- src/225A0.c | 6 +- src/22630.c | 231 +- src/26820.c | 128 +- src/29BA0.c | 75 +- src/2C1C0.c | 40 +- src/2D340.c | 50 +- src/2E110.c | 16 +- src/2E110.h | 2 +- src/2E460.c | 60 +- src/2FEA0.c | 4 +- src/30640.c | 80 +- src/32D10.c | 22 +- src/32D10.h | 2 +- src/334D0.c | 24 +- src/33E30.c | 8 +- src/33FE0.c | 89 +- src/37370.c | 6 +- src/373A0.c | 12 +- src/38BB0.c | 210 +- src/3D140.c | 88 +- src/3FB0.c | 62 +- src/3FB0.h | 2 +- src/43520.c | 2 +- src/435B0.c | 2 +- src/435D0.c | 90 +- src/45720.c | 26 +- src/46680.c | 12 +- src/47B60.c | 12 +- src/485C0.c | 6 +- src/48C60.c | 6 +- src/490A0.c | 12 +- src/49790.c | 4 +- src/49790.h | 2 +- src/49BA0.c | 6 +- src/49DC0.c | 18 +- src/4A360.c | 4 +- src/4A3E0.c | 26 +- src/4B940.c | 6 +- src/4BA90.c | 12 +- src/4BDC0.c | 14 +- src/4BDC0.h | 2 +- src/4CBC0.c | 58 +- src/4F410.c | 6 +- src/4F7F0.c | 2 +- src/4F870.c | 6 +- src/4FDB0.c | 4 +- src/4FE60.c | 6 +- src/4FF50.c | 6 +- src/50120.c | 8 +- src/50860.c | 10 +- src/50990.c | 6 +- src/50A00.c | 8 +- src/50C20.c | 4 +- src/50CC0.c | 16 +- src/517A0.c | 4 +- src/51850.c | 4 +- src/518A0.c | 4 +- src/51B20.c | 4 +- src/5580.c | 51 +- src/6A40.c | 2 +- src/6A40.h | 2 +- src/6BC0.c | 28 +- src/6BC0.h | 2 +- src/8EB0.c | 4 +- src/C970.c | 18 +- src/CE80.c | 10 +- src/D470.c | 22 +- src/E570.c | 8 +- src/E890.c | 132 +- src/E890.h | 2 +- src/dma.c | 2 +- src/dp_intro.c | 2 +- src/fragments/1/fragment1.c | 157 +- src/fragments/10/fragment10.c | 44 +- src/fragments/11/fragment11.c | 46 +- src/fragments/12/fragment12.c | 22 +- src/fragments/13/fragment13.c | 22 +- src/fragments/14/fragment14.c | 144 +- src/fragments/15/fragment15.c | 146 +- src/fragments/16/fragment16.c | 54 +- src/fragments/17/fragment17.c | 350 +- src/fragments/18/fragment18.c | 129 +- src/fragments/19/fragment19.c | 18 +- src/fragments/2/fragment2.c | 88 +- src/fragments/2/fragment2.h | 2 +- src/fragments/20/fragment20.c | 119 +- src/fragments/21/fragment21.c | 84 +- src/fragments/22/fragment22.c | 50 +- src/fragments/23/fragment23.c | 541 +- src/fragments/24/fragment24.c | 565 +- src/fragments/25/fragment25.c | 8 +- src/fragments/26/fragment26.c | 298 +- src/fragments/27/fragment27.c | 125 +- src/fragments/28/fragment28.c | 130 +- src/fragments/29/fragment29.c | 24 +- src/fragments/3/fragment3.c | 158 +- src/fragments/30/fragment30.c | 4 +- src/fragments/31/fragment31.c | 104 +- src/fragments/32/fragment32.c | 14 +- src/fragments/34/fragment34.c | 1038 ++-- src/fragments/35/fragment35.c | 12 +- src/fragments/36/fragment36.c | 41 +- src/fragments/37/fragment37.c | 65 +- src/fragments/38/fragment38.c | 114 +- src/fragments/39/fragment39.c | 147 +- src/fragments/4/fragment4.c | 20 +- src/fragments/4/fragment4.h | 2 +- src/fragments/40/fragment40.c | 48 +- src/fragments/41/fragment41.c | 422 +- src/fragments/42/fragment42.c | 56 +- src/fragments/43/fragment43.c | 115 +- src/fragments/44/fragment44.c | 62 +- src/fragments/45/fragment45.c | 54 +- src/fragments/46/fragment46.c | 19 +- src/fragments/47/fragment47.c | 136 +- src/fragments/48/fragment48.c | 22 +- src/fragments/49/fragment49.c | 20 +- src/fragments/5/fragment5.c | 6 +- src/fragments/50/fragment50.c | 84 +- src/fragments/51/fragment51.c | 4 +- src/fragments/52/fragment52.c | 14 +- src/fragments/53/fragment53.c | 10 +- src/fragments/54/fragment54.c | 36 +- src/fragments/55/fragment55.c | 112 +- src/fragments/56/fragment56.c | 30 +- src/fragments/57/fragment57.c | 102 +- src/fragments/58/fragment58.c | 68 +- src/fragments/59/fragment59.c | 36 +- src/fragments/6/fragment6.c | 10 +- src/fragments/6/fragment6.h | 2 +- src/fragments/60/fragment60.c | 22 +- src/fragments/61/fragment61.c | 459 +- src/fragments/62/fragment62.c | 4037 ++++++++------- src/fragments/63/fragment63.c | 410 +- src/fragments/64/fragment64.c | 74 +- src/fragments/65/fragment65.c | 48 +- src/fragments/66/fragment66.c | 60 +- src/fragments/67/fragment67.c | 4 +- src/fragments/68/fragment68.c | 4 +- src/fragments/69/fragment69.c | 4 +- src/fragments/7/fragment7.c | 116 +- src/fragments/70/fragment70.c | 4 +- src/fragments/71/fragment71.c | 4 +- src/fragments/72/fragment72.c | 4 +- src/fragments/73/fragment73.c | 4 +- src/fragments/74/fragment74.c | 4 +- src/fragments/75/fragment75.c | 10 +- src/fragments/76/fragment76.c | 4 +- src/fragments/77/fragment77.c | 4 +- src/fragments/8/fragment8.c | 61 +- src/fragments/9/fragment9.c | 32 +- src/libleo/leocmdex.c | 2 +- src/libultra/al/.clang-format | 2 - src/libultra/al/sl.c | 40 - src/libultra/gu/perspective.c | 47 - src/libultra/gu/scale.c | 20 - src/libultra/gu/sinf.c | 86 - src/libultra/gu/sqrtf.c | 11 - src/libultra/io/aisetfreq.c | 30 - src/libultra/io/aisetnextbuf.c | 31 - src/libultra/io/cartrominit.c | 65 - src/libultra/io/conteeplongread.c | 17 - src/libultra/io/conteeplongwrite.c | 18 - src/libultra/io/conteepprobe.c | 35 - src/libultra/io/conteepread.c | 106 - src/libultra/io/conteepwrite.c | 157 - src/libultra/io/contpfs.c | 315 -- src/libultra/io/contramread.c | 73 - src/libultra/io/contramwrite.c | 74 - src/libultra/io/contreaddata.c | 73 - src/libultra/io/controller.c | 109 - src/libultra/io/crc.c | 96 - src/libultra/io/devmgr.c | 114 - src/libultra/io/epidma.c | 28 - src/libultra/io/epirawdma.c | 24 - src/libultra/io/epirawread.c | 11 - src/libultra/io/epirawwrite.c | 58 - src/libultra/io/epiread.c | 13 - src/libultra/io/epiwrite.c | 13 - src/libultra/io/gbpakcheckconnector.c | 218 - src/libultra/io/gbpakgetstatus.c | 49 - src/libultra/io/gbpakinit.c | 96 - src/libultra/io/gbpakpower.c | 40 - src/libultra/io/gbpakreadid.c | 91 - src/libultra/io/gbpakreadwrite.c | 77 - src/libultra/io/gbpakselectbank.c | 42 - src/libultra/io/pfsgetstatus.c | 85 - src/libultra/io/pfsisplug.c | 94 - src/libultra/io/pfsselectbank.c | 24 - src/libultra/io/piacs.c | 25 - src/libultra/io/pigetcmdq.c | 14 - src/libultra/io/pimgr.c | 58 - src/libultra/io/pirawdma.c | 23 - src/libultra/io/si.c | 10 - src/libultra/io/siacs.c | 30 - src/libultra/io/sirawdma.c | 26 - src/libultra/io/sirawread.c | 10 - src/libultra/io/sp.c | 11 - src/libultra/io/sprawdma.c | 19 - src/libultra/io/sptask.c | 60 - src/libultra/io/sptaskyield.c | 7 - src/libultra/io/sptaskyielded.c | 23 - src/libultra/io/vi.c | 39 - src/libultra/io/vigetcurrframebuf.c | 10 - src/libultra/io/vimgr.c | 112 - src/libultra/io/virepeatline.c | 15 - src/libultra/io/visetevent.c | 14 - src/libultra/io/visetmode.c | 12 - src/libultra/io/visetxscale.c | 16 - src/libultra/io/visetyscale.c | 13 - src/libultra/io/viswapbuf.c | 10 - src/libultra/libc/ldiv.c | 31 - src/libultra/libc/ll.c | 47 - src/libultra/libc/sprintf.c | 25 - src/libultra/libc/syncprintf.c | 13 - src/libultra/libc/xprintf.c | 244 - src/libultra/os/afterprenmi.c | 5 - src/libultra/os/createmesgqueue.c | 13 - src/libultra/os/createthread.c | 30 - src/libultra/os/dequeuethread.c | 15 - src/libultra/os/destroythread.c | 37 - src/libultra/os/getmemsize.c | 31 - src/libultra/os/getthreadpri.c | 9 - src/libultra/os/gettime.c | 18 - src/libultra/os/initialize.c | 99 - src/libultra/os/jammesg.c | 31 - src/libultra/os/recvmesg.c | 31 - src/libultra/os/sendmesg.c | 30 - src/libultra/os/seteventmesg.c | 23 - src/libultra/os/sethwinterrupt.c | 16 - src/libultra/os/settime.c | 6 - src/libultra/os/settimer.c | 27 - src/libultra/os/startthread.c | 33 - src/libultra/os/stopthread.c | 28 - src/libultra/os/timerintr.c | 99 - src/libultra/os/virtualtophysical.c | 12 - src/main.c | 2 +- src/rsp.c | 2 +- src/stage_loader.c | 4 +- src/stage_loader.h | 2 +- .../.github/workflows/check-poetry-lock.yml | 20 + .../.github/workflows/unit-tests.yml | 15 + tools/asm-differ/.gitignore | 3 + tools/asm-differ/.gitrepo | 12 + tools/asm-differ/.pre-commit-config.yaml | 5 + tools/asm-differ/LICENSE | 24 + tools/asm-differ/README.md | 56 + tools/asm-differ/diff-stylesheet.css | 67 + tools/asm-differ/diff.py | 3523 +++++++++++++ tools/asm-differ/diff_settings.py | 12 + tools/asm-differ/mypy.ini | 17 + tools/asm-differ/poetry.lock | 321 ++ tools/asm-differ/pyproject.toml | 21 + tools/asm-differ/screenshot.png | Bin 0 -> 99842 bytes tools/asm-differ/test.py | 185 + tools/asm-processor/.gitignore | 2 + tools/asm-processor/.gitrepo | 12 + tools/asm-processor/LICENSE | 24 + tools/asm-processor/README.md | 112 + tools/asm-processor/add-test.sh | 5 + tools/asm-processor/asm_processor.py | 1477 ++++++ tools/asm-processor/build.py | 114 + tools/asm-processor/compile-test.sh | 26 + tools/asm-processor/prelude.inc | 53 + 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/asmproc | 1 - tools/{ido_recomp => ido}/linux/5.3/as1 | Bin tools/{ido_recomp => ido}/linux/5.3/cc | Bin tools/{ido_recomp => ido}/linux/5.3/cfe | Bin .../linux/5.3/err.english.cc | 0 tools/{ido_recomp => ido}/linux/5.3/ugen | Bin tools/{ido_recomp => ido}/linux/5.3/ujoin | Bin tools/{ido_recomp => ido}/linux/5.3/uld | Bin tools/{ido_recomp => ido}/linux/5.3/umerge | Bin tools/{ido_recomp => ido}/linux/5.3/uopt | Bin tools/{ido_recomp => ido}/linux/5.3/usplit | Bin tools/{ido_recomp => ido}/linux/7.1/as1 | Bin tools/{ido_recomp => ido}/linux/7.1/cc | Bin tools/{ido_recomp => ido}/linux/7.1/cfe | Bin .../linux/7.1/err.english.cc | 0 tools/{ido_recomp => ido}/linux/7.1/ugen | Bin tools/{ido_recomp => ido}/linux/7.1/uopt | Bin tools/{ido_recomp => ido}/macos/5.3/acpp | Bin tools/{ido_recomp => ido}/macos/5.3/as0 | Bin tools/{ido_recomp => ido}/macos/5.3/as1 | Bin tools/{ido_recomp => ido}/macos/5.3/cc | Bin tools/{ido_recomp => ido}/macos/5.3/cfe | Bin tools/{ido_recomp => ido}/macos/5.3/copt | Bin .../macos/5.3/err.english.cc | 0 tools/{ido_recomp => ido}/macos/5.3/ld | Bin tools/{ido_recomp => ido}/macos/5.3/strip | Bin tools/{ido_recomp => ido}/macos/5.3/ugen | Bin tools/{ido_recomp => ido}/macos/5.3/ujoin | Bin tools/{ido_recomp => ido}/macos/5.3/uld | Bin tools/{ido_recomp => ido}/macos/5.3/umerge | Bin tools/{ido_recomp => ido}/macos/5.3/uopt | Bin tools/{ido_recomp => ido}/macos/5.3/usplit | Bin tools/{ido_recomp => ido}/macos/7.1/acpp | Bin tools/{ido_recomp => ido}/macos/7.1/as0 | Bin tools/{ido_recomp => ido}/macos/7.1/as1 | Bin tools/{ido_recomp => ido}/macos/7.1/cc | Bin tools/{ido_recomp => ido}/macos/7.1/cfe | Bin .../macos/7.1/err.english.cc | 0 tools/{ido_recomp => ido}/macos/7.1/ugen | Bin tools/{ido_recomp => ido}/macos/7.1/ujoin | Bin tools/{ido_recomp => ido}/macos/7.1/uld | Bin tools/{ido_recomp => ido}/macos/7.1/umerge | Bin tools/{ido_recomp => ido}/macos/7.1/uopt | Bin tools/{ido_recomp => ido}/macos/7.1/upas | Bin tools/{ido_recomp => ido}/macos/7.1/usplit | Bin yamls/us/header.yaml | 54 + splat.yaml => yamls/us/rom.yaml | 12 - 1062 files changed, 87503 insertions(+), 11926 deletions(-) rename include/{common.h => global.h} (100%) create mode 100644 lib/ultralib/.github/workflows/ci_egcs.txt create mode 100644 lib/ultralib/.github/workflows/ci_gcc.yml create mode 100644 lib/ultralib/.github/workflows/ci_ido.yml create mode 100644 lib/ultralib/.gitignore create mode 100644 lib/ultralib/.gitrepo create mode 100644 lib/ultralib/Makefile create mode 100644 lib/ultralib/Makefile.gcc create mode 100644 lib/ultralib/Makefile.ido create mode 100644 lib/ultralib/README.md create mode 100644 lib/ultralib/base/I/libgultra.txt create mode 100644 lib/ultralib/base/I/libgultra_d.txt create mode 100644 lib/ultralib/base/I/libgultra_rom.txt create mode 100644 lib/ultralib/base/I/libultra.txt create mode 100644 lib/ultralib/base/I/libultra_d.txt create mode 100644 lib/ultralib/base/I/libultra_rom.txt create mode 100644 lib/ultralib/base/J/libgultra.txt create mode 100644 lib/ultralib/base/J/libgultra_d.txt create mode 100644 lib/ultralib/base/J/libgultra_rom.txt create mode 100644 lib/ultralib/base/J/libultra.txt create mode 100644 lib/ultralib/base/J/libultra_d.txt create mode 100644 lib/ultralib/base/J/libultra_rom.txt create mode 100644 lib/ultralib/base/K/libgultra.txt create mode 100644 lib/ultralib/base/K/libgultra_d.txt create mode 100644 lib/ultralib/base/K/libgultra_rom.txt create mode 100644 lib/ultralib/base/K/libultra.txt create mode 100644 lib/ultralib/base/K/libultra_d.txt create mode 100644 lib/ultralib/base/K/libultra_rom.txt create mode 100644 lib/ultralib/base/L/libgultra.txt create mode 100644 lib/ultralib/base/L/libgultra_d.txt create mode 100644 lib/ultralib/base/L/libgultra_rom.txt create mode 100644 lib/ultralib/base/L/libultra.txt create mode 100644 lib/ultralib/base/L/libultra_d.txt create mode 100644 lib/ultralib/base/L/libultra_rom.txt create mode 100644 lib/ultralib/include/PR/R4300.h create mode 100644 lib/ultralib/include/PR/abi.h create mode 100644 lib/ultralib/include/PR/gbi.h create mode 100644 lib/ultralib/include/PR/gs2dex.h create mode 100644 lib/ultralib/include/PR/gt.h create mode 100644 lib/ultralib/include/PR/gu.h rename {include => lib/ultralib/include}/PR/leo.h (100%) rename {include => lib/ultralib/include}/PR/leoappli.h (100%) create mode 100644 lib/ultralib/include/PR/libaudio.h create mode 100644 lib/ultralib/include/PR/mbi.h create mode 100644 lib/ultralib/include/PR/os.h create mode 100644 lib/ultralib/include/PR/os_ai.h create mode 100644 lib/ultralib/include/PR/os_cache.h create mode 100644 lib/ultralib/include/PR/os_cont.h create mode 100644 lib/ultralib/include/PR/os_convert.h create mode 100644 lib/ultralib/include/PR/os_debug.h create mode 100644 lib/ultralib/include/PR/os_eeprom.h create mode 100644 lib/ultralib/include/PR/os_error.h create mode 100644 lib/ultralib/include/PR/os_exception.h create mode 100644 lib/ultralib/include/PR/os_flash.h create mode 100644 lib/ultralib/include/PR/os_gbpak.h create mode 100644 lib/ultralib/include/PR/os_gio.h create mode 100644 lib/ultralib/include/PR/os_host.h create mode 100644 lib/ultralib/include/PR/os_internal.h create mode 100644 lib/ultralib/include/PR/os_internal_debug.h create mode 100644 lib/ultralib/include/PR/os_internal_error.h create mode 100644 lib/ultralib/include/PR/os_internal_exception.h create mode 100644 lib/ultralib/include/PR/os_internal_flash.h create mode 100644 lib/ultralib/include/PR/os_internal_gio.h create mode 100644 lib/ultralib/include/PR/os_internal_host.h create mode 100644 lib/ultralib/include/PR/os_internal_reg.h create mode 100644 lib/ultralib/include/PR/os_internal_rsp.h create mode 100644 lib/ultralib/include/PR/os_internal_si.h create mode 100644 lib/ultralib/include/PR/os_internal_thread.h create mode 100644 lib/ultralib/include/PR/os_internal_tlb.h create mode 100644 lib/ultralib/include/PR/os_libc.h create mode 100644 lib/ultralib/include/PR/os_message.h create mode 100644 lib/ultralib/include/PR/os_motor.h create mode 100644 lib/ultralib/include/PR/os_pfs.h create mode 100644 lib/ultralib/include/PR/os_pi.h create mode 100644 lib/ultralib/include/PR/os_rdp.h create mode 100644 lib/ultralib/include/PR/os_reg.h create mode 100644 lib/ultralib/include/PR/os_rsp.h create mode 100644 lib/ultralib/include/PR/os_si.h create mode 100644 lib/ultralib/include/PR/os_system.h create mode 100644 lib/ultralib/include/PR/os_thread.h create mode 100644 lib/ultralib/include/PR/os_time.h create mode 100644 lib/ultralib/include/PR/os_tlb.h create mode 100644 lib/ultralib/include/PR/os_version.h create mode 100644 lib/ultralib/include/PR/os_vi.h create mode 100644 lib/ultralib/include/PR/os_voice.h create mode 100644 lib/ultralib/include/PR/ramrom.h create mode 100644 lib/ultralib/include/PR/rcp.h create mode 100644 lib/ultralib/include/PR/rdb.h create mode 100644 lib/ultralib/include/PR/region.h create mode 100644 lib/ultralib/include/PR/rmon.h create mode 100644 lib/ultralib/include/PR/sched.h create mode 100644 lib/ultralib/include/PR/sp.h create mode 100644 lib/ultralib/include/PR/sptask.h create mode 100644 lib/ultralib/include/PR/ucode.h create mode 100644 lib/ultralib/include/PR/ultraerror.h create mode 100644 lib/ultralib/include/PR/ultralog.h create mode 100644 lib/ultralib/include/PR/ultratypes.h create mode 100644 lib/ultralib/include/asm.h create mode 100644 lib/ultralib/include/assert.h create mode 100644 lib/ultralib/include/dbgdefs.h create mode 100644 lib/ultralib/include/dbgproto.h create mode 100644 lib/ultralib/include/fpregdef.h create mode 100644 lib/ultralib/include/gcc/math.h create mode 100644 lib/ultralib/include/gcc/memory.h create mode 100644 lib/ultralib/include/gcc/sgidefs.h create mode 100644 lib/ultralib/include/gcc/stdarg.h create mode 100644 lib/ultralib/include/gcc/stdio.h create mode 100644 lib/ultralib/include/gcc/stdlib.h create mode 100644 lib/ultralib/include/gcc/string.h create mode 100644 lib/ultralib/include/ido/math.h create mode 100644 lib/ultralib/include/ido/memory.h create mode 100644 lib/ultralib/include/ido/stdarg.h create mode 100644 lib/ultralib/include/ido/stdio.h create mode 100644 lib/ultralib/include/ido/stdlib.h create mode 100644 lib/ultralib/include/ido/string.h create mode 100644 lib/ultralib/include/macros.h create mode 100644 lib/ultralib/include/regdef.h create mode 100644 lib/ultralib/include/sgidefs.h create mode 100644 lib/ultralib/include/sys/asm.h create mode 100644 lib/ultralib/include/sys/fpregdef.h create mode 100644 lib/ultralib/include/sys/regdef.h create mode 100644 lib/ultralib/include/ultra64.h create mode 100644 lib/ultralib/include/ultrahost.h create mode 100644 lib/ultralib/src/audio/Makefile rename {src/libultra/al => lib/ultralib/src/audio}/auxbus.c (100%) rename {src/libultra/al => lib/ultralib/src/audio}/bnkf.c (100%) create mode 100644 lib/ultralib/src/audio/cents2ratio.c rename {src/libultra/al => lib/ultralib/src/audio}/copy.c (99%) create mode 100644 lib/ultralib/src/audio/cseq.c create mode 100644 lib/ultralib/src/audio/cseq.h create mode 100644 lib/ultralib/src/audio/cseqp.h create mode 100644 lib/ultralib/src/audio/cspdelete.c create mode 100644 lib/ultralib/src/audio/cspgetchlvol.c create mode 100644 lib/ultralib/src/audio/cspgetfxmix.c create mode 100644 lib/ultralib/src/audio/cspgetpan.c create mode 100644 lib/ultralib/src/audio/cspgetpriority.c create mode 100644 lib/ultralib/src/audio/cspgetprogram.c create mode 100644 lib/ultralib/src/audio/cspgetseq.c create mode 100644 lib/ultralib/src/audio/cspgetstate.c create mode 100644 lib/ultralib/src/audio/cspgettempo.c create mode 100644 lib/ultralib/src/audio/cspgetvol.c create mode 100644 lib/ultralib/src/audio/csplayer.c create mode 100644 lib/ultralib/src/audio/cspplay.c create mode 100644 lib/ultralib/src/audio/cspsendmidi.c create mode 100644 lib/ultralib/src/audio/cspsetbank.c create mode 100644 lib/ultralib/src/audio/cspsetchlvol.c create mode 100644 lib/ultralib/src/audio/cspsetfxmix.c create mode 100644 lib/ultralib/src/audio/cspsetpan.c create mode 100644 lib/ultralib/src/audio/cspsetpriority.c create mode 100644 lib/ultralib/src/audio/cspsetprogram.c create mode 100644 lib/ultralib/src/audio/cspsetseq.c create mode 100644 lib/ultralib/src/audio/cspsettempo.c create mode 100644 lib/ultralib/src/audio/cspsetvol.c create mode 100644 lib/ultralib/src/audio/cspstop.c rename src/libultra/al/drvrNew.c => lib/ultralib/src/audio/drvrnew.c (99%) rename {src/libultra/al => lib/ultralib/src/audio}/env.c (98%) create mode 100644 lib/ultralib/src/audio/event.c rename {src/libultra/al => lib/ultralib/src/audio}/filter.c (100%) rename {src/libultra/al => lib/ultralib/src/audio}/heapalloc.c (100%) create mode 100644 lib/ultralib/src/audio/heapcheck.c rename {src/libultra/al => lib/ultralib/src/audio}/heapinit.c (100%) create mode 100644 lib/ultralib/src/audio/initfx.h rename {src/libultra/al => lib/ultralib/src/audio}/load.c (100%) rename {src/libultra/al => lib/ultralib/src/audio}/mainbus.c (100%) create mode 100644 lib/ultralib/src/audio/parse_abi.c rename {src/libultra/al => lib/ultralib/src/audio}/resample.c (99%) rename {src/libultra/al => lib/ultralib/src/audio}/reverb.c (98%) rename {src/libultra/al => lib/ultralib/src/audio}/save.c (98%) create mode 100644 lib/ultralib/src/audio/seq.c create mode 100644 lib/ultralib/src/audio/seq.h create mode 100644 lib/ultralib/src/audio/seqp.h create mode 100644 lib/ultralib/src/audio/seqpdelete.c create mode 100644 lib/ultralib/src/audio/seqpgetchlvol.c create mode 100644 lib/ultralib/src/audio/seqpgetfxmix.c create mode 100644 lib/ultralib/src/audio/seqpgetpan.c create mode 100644 lib/ultralib/src/audio/seqpgetpriority.c create mode 100644 lib/ultralib/src/audio/seqpgetprogram.c create mode 100644 lib/ultralib/src/audio/seqpgetseq.c create mode 100644 lib/ultralib/src/audio/seqpgetstate.c create mode 100644 lib/ultralib/src/audio/seqpgettempo.c create mode 100644 lib/ultralib/src/audio/seqpgetvol.c create mode 100644 lib/ultralib/src/audio/seqplayer.c create mode 100644 lib/ultralib/src/audio/seqploop.c create mode 100644 lib/ultralib/src/audio/seqpplay.c create mode 100644 lib/ultralib/src/audio/seqpsendmidi.c create mode 100644 lib/ultralib/src/audio/seqpsetbank.c create mode 100644 lib/ultralib/src/audio/seqpsetchlvol.c create mode 100644 lib/ultralib/src/audio/seqpsetfxmix.c create mode 100644 lib/ultralib/src/audio/seqpsetpan.c create mode 100644 lib/ultralib/src/audio/seqpsetpriority.c create mode 100644 lib/ultralib/src/audio/seqpsetprogram.c create mode 100644 lib/ultralib/src/audio/seqpsetseq.c create mode 100644 lib/ultralib/src/audio/seqpsettempo.c create mode 100644 lib/ultralib/src/audio/seqpsetvol.c create mode 100644 lib/ultralib/src/audio/seqpstop.c create mode 100644 lib/ultralib/src/audio/sl.c create mode 100644 lib/ultralib/src/audio/sndp.h create mode 100644 lib/ultralib/src/audio/sndpallocate.c create mode 100644 lib/ultralib/src/audio/sndpdeallocate.c create mode 100644 lib/ultralib/src/audio/sndpdelete.c create mode 100644 lib/ultralib/src/audio/sndpgetsound.c create mode 100644 lib/ultralib/src/audio/sndpgetstate.c create mode 100644 lib/ultralib/src/audio/sndplayer.c create mode 100644 lib/ultralib/src/audio/sndpplay.c create mode 100644 lib/ultralib/src/audio/sndpplayat.c create mode 100644 lib/ultralib/src/audio/sndpsetfxmix.c create mode 100644 lib/ultralib/src/audio/sndpsetpan.c create mode 100644 lib/ultralib/src/audio/sndpsetpitch.c create mode 100644 lib/ultralib/src/audio/sndpsetpriority.c create mode 100644 lib/ultralib/src/audio/sndpsetsound.c create mode 100644 lib/ultralib/src/audio/sndpsetvol.c create mode 100644 lib/ultralib/src/audio/sndpstop.c create mode 100644 lib/ultralib/src/audio/synaddplayer.c rename {src/libultra/al => lib/ultralib/src/audio}/synallocfx.c (99%) create mode 100644 lib/ultralib/src/audio/synallocvoice.c rename {src/libultra/al => lib/ultralib/src/audio}/syndelete.c (99%) create mode 100644 lib/ultralib/src/audio/synfreefx.c create mode 100644 lib/ultralib/src/audio/synfreevoice.c create mode 100644 lib/ultralib/src/audio/syngetfxref.c create mode 100644 lib/ultralib/src/audio/syngetpriority.c create mode 100644 lib/ultralib/src/audio/synremoveplayer.c create mode 100644 lib/ultralib/src/audio/synsetfxmix.c create mode 100644 lib/ultralib/src/audio/synsetfxparam.c create mode 100644 lib/ultralib/src/audio/synsetpan.c create mode 100644 lib/ultralib/src/audio/synsetpitch.c create mode 100644 lib/ultralib/src/audio/synsetpriority.c create mode 100644 lib/ultralib/src/audio/synsetvol.c create mode 100644 lib/ultralib/src/audio/synstartvoice.c create mode 100644 lib/ultralib/src/audio/synstartvoiceparam.c create mode 100644 lib/ultralib/src/audio/synstopvoice.c create mode 100644 lib/ultralib/src/audio/synthInternals.h rename {src/libultra/al => lib/ultralib/src/audio}/synthesizer.c (98%) create mode 100644 lib/ultralib/src/debug/assert.c create mode 100644 lib/ultralib/src/debug/assertbreak.s create mode 100644 lib/ultralib/src/debug/atomic.c create mode 100644 lib/ultralib/src/debug/kdebugserver.c create mode 100644 lib/ultralib/src/debug/osint_debug.h create mode 100644 lib/ultralib/src/debug/profile.c create mode 100644 lib/ultralib/src/debug/threadprofile.c create mode 100644 lib/ultralib/src/debug/threadprofileclear.c create mode 100644 lib/ultralib/src/debug/threadprofileinit.c create mode 100644 lib/ultralib/src/debug/threadprofilereadcount.c create mode 100644 lib/ultralib/src/debug/threadprofilereadtime.c create mode 100644 lib/ultralib/src/debug/threadprofilestart.c create mode 100644 lib/ultralib/src/debug/threadprofilestop.c create mode 100644 lib/ultralib/src/error/commonerror.c create mode 100644 lib/ultralib/src/error/error.c create mode 100644 lib/ultralib/src/error/errorasm.s create mode 100644 lib/ultralib/src/flash/flashallerase.c create mode 100644 lib/ultralib/src/flash/flashallerasethrough.c create mode 100644 lib/ultralib/src/flash/flashchange.c create mode 100644 lib/ultralib/src/flash/flashcheckeraseend.c create mode 100644 lib/ultralib/src/flash/flashclearstatus.c create mode 100644 lib/ultralib/src/flash/flashgetaddr.c create mode 100644 lib/ultralib/src/flash/flashinit.c create mode 100644 lib/ultralib/src/flash/flashreadarray.c create mode 100644 lib/ultralib/src/flash/flashreadid.c create mode 100644 lib/ultralib/src/flash/flashreadstatus.c create mode 100644 lib/ultralib/src/flash/flashreinit.c create mode 100644 lib/ultralib/src/flash/flashsectorerase.c create mode 100644 lib/ultralib/src/flash/flashsectorerasethrough.c create mode 100644 lib/ultralib/src/flash/flashwritearray.c create mode 100644 lib/ultralib/src/flash/flashwritebuffer.c create mode 100644 lib/ultralib/src/gio/giointerrupt.c create mode 100644 lib/ultralib/src/gio/giorawinterrupt.c create mode 100644 lib/ultralib/src/gt/Makefile create mode 100644 lib/ultralib/src/gt/dumpturbo.c create mode 100644 lib/ultralib/src/gt/gt.c create mode 100644 lib/ultralib/src/gt/gtint.h create mode 100644 lib/ultralib/src/gu/Makefile create mode 100644 lib/ultralib/src/gu/align.c rename {src/libultra => lib/ultralib/src}/gu/cosf.c (100%) create mode 100644 lib/ultralib/src/gu/coss.c create mode 100644 lib/ultralib/src/gu/dump_gbi.c create mode 100644 lib/ultralib/src/gu/frustum.c rename {src/libultra => lib/ultralib/src}/gu/guint.h (100%) create mode 100644 lib/ultralib/src/gu/guloadtile_bug.c create mode 100644 lib/ultralib/src/gu/libm_vals.s create mode 100644 lib/ultralib/src/gu/loadtextureblockmipmap.c create mode 100644 lib/ultralib/src/gu/lookat.c create mode 100644 lib/ultralib/src/gu/lookathil.c rename {src/libultra => lib/ultralib/src}/gu/lookatref.c (78%) create mode 100644 lib/ultralib/src/gu/lookatstereo.c rename {src/libultra => lib/ultralib/src}/gu/mtxcatf.c (77%) rename {src/libultra => lib/ultralib/src}/gu/mtxcatl.c (96%) rename {src/libultra => lib/ultralib/src}/gu/mtxutil.c (100%) rename {src/libultra => lib/ultralib/src}/gu/normalize.c (84%) rename {src/libultra => lib/ultralib/src}/gu/ortho.c (100%) create mode 100644 lib/ultralib/src/gu/parse_gbi.c create mode 100644 lib/ultralib/src/gu/parse_rdp.c create mode 100644 lib/ultralib/src/gu/parse_string.c create mode 100644 lib/ultralib/src/gu/perspective.c create mode 100644 lib/ultralib/src/gu/position.c create mode 100644 lib/ultralib/src/gu/poslight.c create mode 100644 lib/ultralib/src/gu/poslighthil.c rename {src/libultra => lib/ultralib/src}/gu/random.c (100%) create mode 100644 lib/ultralib/src/gu/readme.txt rename {src/libultra => lib/ultralib/src}/gu/rotate.c (54%) rename src/libultra/gu/rotateRPY.c => lib/ultralib/src/gu/rotaterpy.c (82%) create mode 100644 lib/ultralib/src/gu/scale.c create mode 100644 lib/ultralib/src/gu/sinf.c create mode 100644 lib/ultralib/src/gu/sins.c create mode 100644 lib/ultralib/src/gu/sintable.h create mode 100644 lib/ultralib/src/gu/sqrtf.s rename {src/libultra => lib/ultralib/src}/gu/translate.c (81%) create mode 100644 lib/ultralib/src/gu/us2dex.c create mode 100644 lib/ultralib/src/gu/us2dex2_emu.c create mode 100644 lib/ultralib/src/gu/us2dex_emu.c create mode 100644 lib/ultralib/src/gu/usprite.c create mode 100644 lib/ultralib/src/host/host_ptn64.c create mode 100644 lib/ultralib/src/host/readhost.c create mode 100644 lib/ultralib/src/host/writehost.c rename {src/libultra => lib/ultralib/src}/io/ai.c (88%) rename {src/libultra => lib/ultralib/src}/io/aigetlen.c (100%) rename {src/libultra => lib/ultralib/src}/io/aigetstat.c (100%) create mode 100644 lib/ultralib/src/io/aisetfreq.c create mode 100644 lib/ultralib/src/io/aisetnextbuf.c create mode 100644 lib/ultralib/src/io/cartrominit.c create mode 100644 lib/ultralib/src/io/contchannelreset.c create mode 100644 lib/ultralib/src/io/conteeplongread.c create mode 100644 lib/ultralib/src/io/conteeplongwrite.c create mode 100644 lib/ultralib/src/io/conteepprobe.c create mode 100644 lib/ultralib/src/io/conteepread.c create mode 100644 lib/ultralib/src/io/conteepwrite.c create mode 100644 lib/ultralib/src/io/contpfs.c create mode 100644 lib/ultralib/src/io/contquery.c create mode 100644 lib/ultralib/src/io/contramread.c create mode 100644 lib/ultralib/src/io/contramwrite.c create mode 100644 lib/ultralib/src/io/contreaddata.c create mode 100644 lib/ultralib/src/io/contreset.c create mode 100644 lib/ultralib/src/io/controller.c create mode 100644 lib/ultralib/src/io/controller.h create mode 100644 lib/ultralib/src/io/controller_gbpak.h create mode 100644 lib/ultralib/src/io/controller_voice.h create mode 100644 lib/ultralib/src/io/contsetch.c create mode 100644 lib/ultralib/src/io/crc.c create mode 100644 lib/ultralib/src/io/devmgr.c create mode 100644 lib/ultralib/src/io/dp.c rename {src/libultra => lib/ultralib/src}/io/dpctr.c (85%) rename {src/libultra => lib/ultralib/src}/io/dpgetstat.c (100%) create mode 100644 lib/ultralib/src/io/dpsetnextbuf.c rename {src/libultra => lib/ultralib/src}/io/dpsetstat.c (100%) create mode 100644 lib/ultralib/src/io/driverominit.c create mode 100644 lib/ultralib/src/io/epidma.c create mode 100644 lib/ultralib/src/io/epigettype.c rename {src/libultra/os => lib/ultralib/src/io}/epilinkhandle.c (67%) create mode 100644 lib/ultralib/src/io/epirawdma.c create mode 100644 lib/ultralib/src/io/epirawread.c create mode 100644 lib/ultralib/src/io/epirawwrite.c create mode 100644 lib/ultralib/src/io/epiread.c create mode 100644 lib/ultralib/src/io/epiwrite.c create mode 100644 lib/ultralib/src/io/gbpakcheckconnector.c create mode 100644 lib/ultralib/src/io/gbpakgetbank.c create mode 100644 lib/ultralib/src/io/gbpakgetstatus.c create mode 100644 lib/ultralib/src/io/gbpakinit.c create mode 100644 lib/ultralib/src/io/gbpakpower.c create mode 100644 lib/ultralib/src/io/gbpakreadid.c create mode 100644 lib/ultralib/src/io/gbpakreadwrite.c create mode 100644 lib/ultralib/src/io/gbpaksetbank.c create mode 100644 lib/ultralib/src/io/leodiskinit.c create mode 100644 lib/ultralib/src/io/leointerrupt.c create mode 100644 lib/ultralib/src/io/motor.c create mode 100644 lib/ultralib/src/io/pfsallocatefile.c create mode 100644 lib/ultralib/src/io/pfschecker.c create mode 100644 lib/ultralib/src/io/pfsdeletefile.c create mode 100644 lib/ultralib/src/io/pfsfilestate.c create mode 100644 lib/ultralib/src/io/pfsfreeblocks.c create mode 100644 lib/ultralib/src/io/pfsgetlabel.c create mode 100644 lib/ultralib/src/io/pfsgetstatus.c create mode 100644 lib/ultralib/src/io/pfsinit.c create mode 100644 lib/ultralib/src/io/pfsinitpak.c create mode 100644 lib/ultralib/src/io/pfsisplug.c create mode 100644 lib/ultralib/src/io/pfsnumfiles.c create mode 100644 lib/ultralib/src/io/pfsreadwritefile.c create mode 100644 lib/ultralib/src/io/pfsreformat.c create mode 100644 lib/ultralib/src/io/pfsrepairid.c create mode 100644 lib/ultralib/src/io/pfssearchfile.c create mode 100644 lib/ultralib/src/io/pfsselectbank.c create mode 100644 lib/ultralib/src/io/pfssetlabel.c create mode 100644 lib/ultralib/src/io/pi.c create mode 100644 lib/ultralib/src/io/piacs.c create mode 100644 lib/ultralib/src/io/pidma.c create mode 100644 lib/ultralib/src/io/pigetcmdq.c create mode 100644 lib/ultralib/src/io/pigetstat.c create mode 100644 lib/ultralib/src/io/pigettype.c rename {src/libultra => lib/ultralib/src}/io/piint.h (75%) create mode 100644 lib/ultralib/src/io/pimgr.c create mode 100644 lib/ultralib/src/io/pirawdma.c create mode 100644 lib/ultralib/src/io/pirawread.c create mode 100644 lib/ultralib/src/io/pirawwrite.c create mode 100644 lib/ultralib/src/io/piread.c create mode 100644 lib/ultralib/src/io/piwrite.c create mode 100644 lib/ultralib/src/io/si.c create mode 100644 lib/ultralib/src/io/siacs.c create mode 100644 lib/ultralib/src/io/sigetstat.c rename {src/libultra => lib/ultralib/src}/io/siint.h (58%) create mode 100644 lib/ultralib/src/io/sirawdma.c create mode 100644 lib/ultralib/src/io/sirawread.c rename {src/libultra => lib/ultralib/src}/io/sirawwrite.c (58%) create mode 100644 lib/ultralib/src/io/sp.c rename {src/libultra => lib/ultralib/src}/io/spgetstat.c (100%) create mode 100644 lib/ultralib/src/io/sprawdma.c create mode 100644 lib/ultralib/src/io/sprawread.c create mode 100644 lib/ultralib/src/io/sprawwrite.c rename {src/libultra => lib/ultralib/src}/io/spsetpc.c (100%) rename {src/libultra => lib/ultralib/src}/io/spsetstat.c (100%) create mode 100644 lib/ultralib/src/io/sptask.c create mode 100644 lib/ultralib/src/io/sptaskyield.c create mode 100644 lib/ultralib/src/io/sptaskyielded.c create mode 100644 lib/ultralib/src/io/vi.c rename {src/libultra => lib/ultralib/src}/io/viblack.c (54%) create mode 100644 lib/ultralib/src/io/viextendvstart.c create mode 100644 lib/ultralib/src/io/vifade.c rename {src/libultra => lib/ultralib/src}/io/vigetcurrcontext.c (58%) create mode 100644 lib/ultralib/src/io/vigetcurrframebuf.c create mode 100644 lib/ultralib/src/io/vigetfield.c create mode 100644 lib/ultralib/src/io/vigetline.c create mode 100644 lib/ultralib/src/io/vigetmode.c create mode 100644 lib/ultralib/src/io/vigetnextcontext.c create mode 100644 lib/ultralib/src/io/vigetnextframebuf.c create mode 100644 lib/ultralib/src/io/vigetstat.c rename {src/libultra => lib/ultralib/src}/io/viint.h (73%) create mode 100644 lib/ultralib/src/io/vimgr.c create mode 100644 lib/ultralib/src/io/virepeatline.c create mode 100644 lib/ultralib/src/io/visetevent.c create mode 100644 lib/ultralib/src/io/visetmode.c rename {src/libultra => lib/ultralib/src}/io/visetspecial.c (57%) create mode 100644 lib/ultralib/src/io/visetxscale.c create mode 100644 lib/ultralib/src/io/visetyscale.c create mode 100644 lib/ultralib/src/io/viswapbuf.c rename {src/libultra => lib/ultralib/src}/io/viswapcontext.c (82%) create mode 100644 lib/ultralib/src/io/vitbl.c create mode 100644 lib/ultralib/src/libc/bcmp.s create mode 100644 lib/ultralib/src/libc/bcopy.s create mode 100644 lib/ultralib/src/libc/bzero.s create mode 100644 lib/ultralib/src/libc/ldiv.c create mode 100644 lib/ultralib/src/libc/ll.c create mode 100644 lib/ultralib/src/libc/llbit.c rename {src/libultra => lib/ultralib/src}/libc/llcvt.c (73%) create mode 100644 lib/ultralib/src/libc/sprintf.c rename {src/libultra => lib/ultralib/src}/libc/string.c (50%) create mode 100644 lib/ultralib/src/libc/syncprintf.c rename {src/libultra => lib/ultralib/src}/libc/xldtob.c (82%) rename {src/libultra => lib/ultralib/src}/libc/xlitob.c (87%) create mode 100644 lib/ultralib/src/libc/xprintf.c create mode 100644 lib/ultralib/src/libc/xstdio.h create mode 100644 lib/ultralib/src/log/delay.s create mode 100644 lib/ultralib/src/log/log.c create mode 100644 lib/ultralib/src/log/logfloat.c create mode 100644 lib/ultralib/src/mgu/Makefile create mode 100644 lib/ultralib/src/mgu/asm.h create mode 100644 lib/ultralib/src/mgu/mtxcatf.s create mode 100644 lib/ultralib/src/mgu/mtxcatl.c create mode 100644 lib/ultralib/src/mgu/mtxf2l.s create mode 100644 lib/ultralib/src/mgu/mtxident.s create mode 100644 lib/ultralib/src/mgu/mtxidentf.s create mode 100644 lib/ultralib/src/mgu/mtxl2f.s create mode 100644 lib/ultralib/src/mgu/mtxxfmf.c create mode 100644 lib/ultralib/src/mgu/mtxxfml.c create mode 100644 lib/ultralib/src/mgu/normalize.s create mode 100644 lib/ultralib/src/mgu/regdef.h create mode 100644 lib/ultralib/src/mgu/rotate.c create mode 100644 lib/ultralib/src/mgu/scale.s create mode 100644 lib/ultralib/src/mgu/scalef.s create mode 100644 lib/ultralib/src/mgu/translate.s create mode 100644 lib/ultralib/src/mgu/translatef.s create mode 100644 lib/ultralib/src/monutil.s create mode 100644 lib/ultralib/src/os/ackramromread.c create mode 100644 lib/ultralib/src/os/ackramromwrite.c create mode 100644 lib/ultralib/src/os/afterprenmi.c create mode 100644 lib/ultralib/src/os/atomic.c create mode 100644 lib/ultralib/src/os/createmesgqueue.c create mode 100644 lib/ultralib/src/os/createthread.c create mode 100644 lib/ultralib/src/os/destroythread.c create mode 100644 lib/ultralib/src/os/exceptasm.h create mode 100644 lib/ultralib/src/os/exceptasm.s create mode 100644 lib/ultralib/src/os/exit.c rename {src/libultra => lib/ultralib/src}/os/getactivequeue.c (67%) create mode 100644 lib/ultralib/src/os/getcause.s create mode 100644 lib/ultralib/src/os/getcompare.s create mode 100644 lib/ultralib/src/os/getconfig.s create mode 100644 lib/ultralib/src/os/getcount.s create mode 100644 lib/ultralib/src/os/getcurrfaultthread.c create mode 100644 lib/ultralib/src/os/getfpccsr.s create mode 100644 lib/ultralib/src/os/gethwinterrupt.c create mode 100644 lib/ultralib/src/os/getintmask.s create mode 100644 lib/ultralib/src/os/getmemsize.c create mode 100644 lib/ultralib/src/os/getnextfaultthread.c create mode 100644 lib/ultralib/src/os/getsr.s create mode 100644 lib/ultralib/src/os/getthreadid.c create mode 100644 lib/ultralib/src/os/getthreadpri.c create mode 100644 lib/ultralib/src/os/gettime.c create mode 100644 lib/ultralib/src/os/gettlbasid.s create mode 100644 lib/ultralib/src/os/gettlbhi.s create mode 100644 lib/ultralib/src/os/gettlblo0.s create mode 100644 lib/ultralib/src/os/gettlblo1.s create mode 100644 lib/ultralib/src/os/gettlbpagemask.s create mode 100644 lib/ultralib/src/os/getwatchlo.s create mode 100644 lib/ultralib/src/os/initialize.c create mode 100644 lib/ultralib/src/os/initialize_emu.c create mode 100644 lib/ultralib/src/os/initialize_isv.c create mode 100644 lib/ultralib/src/os/initialize_kmc.c create mode 100644 lib/ultralib/src/os/initialize_msp.c create mode 100644 lib/ultralib/src/os/initrdb.c create mode 100644 lib/ultralib/src/os/interrupt.s create mode 100644 lib/ultralib/src/os/invaldcache.s create mode 100644 lib/ultralib/src/os/invalicache.s create mode 100644 lib/ultralib/src/os/jammesg.c create mode 100644 lib/ultralib/src/os/maptlb.s create mode 100644 lib/ultralib/src/os/maptlbrdb.s rename {src/libultra => lib/ultralib/src}/os/osint.h (87%) create mode 100644 lib/ultralib/src/os/parameters.s create mode 100644 lib/ultralib/src/os/physicaltovirtual.c create mode 100644 lib/ultralib/src/os/probetlb.s create mode 100644 lib/ultralib/src/os/rdbsend.c create mode 100644 lib/ultralib/src/os/recvmesg.c rename {src/libultra => lib/ultralib/src}/os/resetglobalintmask.c (60%) create mode 100644 lib/ultralib/src/os/sendmesg.c create mode 100644 lib/ultralib/src/os/setcause.s create mode 100644 lib/ultralib/src/os/setcompare.s create mode 100644 lib/ultralib/src/os/setconfig.s create mode 100644 lib/ultralib/src/os/setcount.s create mode 100644 lib/ultralib/src/os/seterrorhandler.c create mode 100644 lib/ultralib/src/os/seteventmesg.c create mode 100644 lib/ultralib/src/os/setfpccsr.s rename {src/libultra => lib/ultralib/src}/os/setglobalintmask.c (69%) create mode 100644 lib/ultralib/src/os/sethwinterrupt.c create mode 100644 lib/ultralib/src/os/setintmask.s create mode 100644 lib/ultralib/src/os/setpiinterrupt.c create mode 100644 lib/ultralib/src/os/setsr.s rename {src/libultra => lib/ultralib/src}/os/setthreadpri.c (52%) create mode 100644 lib/ultralib/src/os/settime.c create mode 100644 lib/ultralib/src/os/settimer.c create mode 100644 lib/ultralib/src/os/settlbasid.s create mode 100644 lib/ultralib/src/os/setwatchlo.s create mode 100644 lib/ultralib/src/os/startthread.c create mode 100644 lib/ultralib/src/os/stopthread.c create mode 100644 lib/ultralib/src/os/stoptimer.c create mode 100644 lib/ultralib/src/os/syncputchars.c create mode 100644 lib/ultralib/src/os/testhost.c create mode 100644 lib/ultralib/src/os/thread.c create mode 100644 lib/ultralib/src/os/threadasm.h create mode 100644 lib/ultralib/src/os/timerintr.c create mode 100644 lib/ultralib/src/os/unmaptlb.s create mode 100644 lib/ultralib/src/os/unmaptlball.s create mode 100644 lib/ultralib/src/os/virtualtophysical.c create mode 100644 lib/ultralib/src/os/writebackdcache.s create mode 100644 lib/ultralib/src/os/writebackdcacheall.s rename {src/libultra => lib/ultralib/src}/os/yieldthread.c (97%) create mode 100644 lib/ultralib/src/rg/free.c create mode 100644 lib/ultralib/src/rg/getbufcount.c create mode 100644 lib/ultralib/src/rg/getsize.c create mode 100644 lib/ultralib/src/rg/malloc.c create mode 100644 lib/ultralib/src/rg/printregion.c create mode 100644 lib/ultralib/src/rg/region.c create mode 100644 lib/ultralib/src/rmon/rmonbrk.c create mode 100644 lib/ultralib/src/rmon/rmoncmds.c create mode 100644 lib/ultralib/src/rmon/rmonint.h create mode 100644 lib/ultralib/src/rmon/rmonmain.c create mode 100644 lib/ultralib/src/rmon/rmonmem.c create mode 100644 lib/ultralib/src/rmon/rmonmisc.c create mode 100644 lib/ultralib/src/rmon/rmonprint.c create mode 100644 lib/ultralib/src/rmon/rmonrcp.s create mode 100644 lib/ultralib/src/rmon/rmonregs.c create mode 100644 lib/ultralib/src/rmon/rmonsio.c create mode 100644 lib/ultralib/src/rmon/rmontask.c create mode 100644 lib/ultralib/src/sched/Makefile create mode 100644 lib/ultralib/src/sched/sched.c create mode 100644 lib/ultralib/src/sched/sched_log.fmt create mode 100644 lib/ultralib/src/sp/Makefile create mode 100644 lib/ultralib/src/sp/clearattribute.c create mode 100644 lib/ultralib/src/sp/color.c create mode 100644 lib/ultralib/src/sp/hide.c create mode 100644 lib/ultralib/src/sp/setattribute.c create mode 100644 lib/ultralib/src/sp/show.c create mode 100644 lib/ultralib/src/sp/sprite.c create mode 100644 lib/ultralib/src/sp/spriteex.c create mode 100644 lib/ultralib/src/sp/spriteex2.c create mode 100644 lib/ultralib/src/sp/spscale.c create mode 100644 lib/ultralib/src/vimodes/vimodefpalhaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpalhan1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpalhpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpalhpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodefpalhpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpalhpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallaf2.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallan1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallan2.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodefpallpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodempalhaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodempalhan1.c create mode 100644 lib/ultralib/src/vimodes/vimodempalhpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodempalhpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodempalhpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodempalhpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodempallaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodempallaf2.c create mode 100644 lib/ultralib/src/vimodes/vimodempallan1.c create mode 100644 lib/ultralib/src/vimodes/vimodempallan2.c create mode 100644 lib/ultralib/src/vimodes/vimodempallpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodempallpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodempallpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodempallpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodentschaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodentschan1.c create mode 100644 lib/ultralib/src/vimodes/vimodentschpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodentschpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodentschpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodentschpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclaf2.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclan1.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclan2.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodentsclpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodepalhaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodepalhan1.c create mode 100644 lib/ultralib/src/vimodes/vimodepalhpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodepalhpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodepalhpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodepalhpn2.c create mode 100644 lib/ultralib/src/vimodes/vimodepallaf1.c create mode 100644 lib/ultralib/src/vimodes/vimodepallaf2.c create mode 100644 lib/ultralib/src/vimodes/vimodepallan1.c create mode 100644 lib/ultralib/src/vimodes/vimodepallan2.c create mode 100644 lib/ultralib/src/vimodes/vimodepallpf1.c create mode 100644 lib/ultralib/src/vimodes/vimodepallpf2.c create mode 100644 lib/ultralib/src/vimodes/vimodepallpn1.c create mode 100644 lib/ultralib/src/vimodes/vimodepallpn2.c create mode 100644 lib/ultralib/src/voice/voicecheckresult.c create mode 100644 lib/ultralib/src/voice/voicecheckword.c create mode 100644 lib/ultralib/src/voice/voicecleardictionary.c create mode 100644 lib/ultralib/src/voice/voicecontread2.c create mode 100644 lib/ultralib/src/voice/voicecontread36.c create mode 100644 lib/ultralib/src/voice/voicecontrolgain.c create mode 100644 lib/ultralib/src/voice/voicecontwrite20.c create mode 100644 lib/ultralib/src/voice/voicecontwrite4.c create mode 100644 lib/ultralib/src/voice/voicecountsyllables.c create mode 100644 lib/ultralib/src/voice/voicecrc.c create mode 100644 lib/ultralib/src/voice/voicegetreaddata.c create mode 100644 lib/ultralib/src/voice/voicegetstatus.c create mode 100644 lib/ultralib/src/voice/voiceinit.c create mode 100644 lib/ultralib/src/voice/voiceinternal.h create mode 100644 lib/ultralib/src/voice/voicemaskdictionary.c create mode 100644 lib/ultralib/src/voice/voicesetadconverter.c create mode 100644 lib/ultralib/src/voice/voicesetword.c create mode 100644 lib/ultralib/src/voice/voicestartreaddata.c create mode 100644 lib/ultralib/src/voice/voicestopreaddata.c create mode 100644 lib/ultralib/tools/Makefile create mode 100755 lib/ultralib/tools/ar.py create mode 100644 lib/ultralib/tools/asm_differ/.gitignore create mode 100644 lib/ultralib/tools/asm_differ/.gitrepo create mode 100644 lib/ultralib/tools/asm_differ/.pre-commit-config.yaml create mode 100644 lib/ultralib/tools/asm_differ/LICENSE create mode 100644 lib/ultralib/tools/asm_differ/README.md create mode 100644 lib/ultralib/tools/asm_differ/diff-stylesheet.css create mode 100755 lib/ultralib/tools/asm_differ/diff.py create mode 100644 lib/ultralib/tools/asm_differ/diff_settings.py create mode 100644 lib/ultralib/tools/asm_differ/mypy.ini create mode 100644 lib/ultralib/tools/asm_differ/screenshot.png create mode 100755 lib/ultralib/tools/compile_sjis.py create mode 100755 lib/ultralib/tools/disassemble_elf.py create mode 100755 lib/ultralib/tools/fix_objfile.py create mode 100755 lib/ultralib/tools/libdiff.py create mode 100755 lib/ultralib/tools/libelf.py create mode 100755 lib/ultralib/tools/m2ctx.py create mode 100644 lib/ultralib/tools/mdebug.py create mode 100644 lib/ultralib/tools/mips_isa.py create mode 100755 lib/ultralib/tools/patch_ar_meta.py create mode 100755 lib/ultralib/tools/print_mdebug.py create mode 100755 lib/ultralib/tools/set_o32abi_bit.py create mode 100755 lib/ultralib/tools/shiftjis_conv.py create mode 100755 lib/ultralib/tools/strip_debug.sh create mode 100644 lib/ultralib/tools/util.py rename {tools => linker_scripts/us}/symbol_addrs.txt (100%) rename undefined_syms.txt => linker_scripts/us/undefined_syms.ld (100%) delete mode 100644 src/libultra/al/.clang-format delete mode 100644 src/libultra/al/sl.c delete mode 100644 src/libultra/gu/perspective.c delete mode 100644 src/libultra/gu/scale.c delete mode 100644 src/libultra/gu/sinf.c delete mode 100644 src/libultra/gu/sqrtf.c delete mode 100644 src/libultra/io/aisetfreq.c delete mode 100644 src/libultra/io/aisetnextbuf.c delete mode 100644 src/libultra/io/cartrominit.c delete mode 100644 src/libultra/io/conteeplongread.c delete mode 100644 src/libultra/io/conteeplongwrite.c delete mode 100644 src/libultra/io/conteepprobe.c delete mode 100644 src/libultra/io/conteepread.c delete mode 100644 src/libultra/io/conteepwrite.c delete mode 100644 src/libultra/io/contpfs.c delete mode 100644 src/libultra/io/contramread.c delete mode 100644 src/libultra/io/contramwrite.c delete mode 100644 src/libultra/io/contreaddata.c delete mode 100644 src/libultra/io/controller.c delete mode 100644 src/libultra/io/crc.c delete mode 100644 src/libultra/io/devmgr.c delete mode 100644 src/libultra/io/epidma.c delete mode 100644 src/libultra/io/epirawdma.c delete mode 100644 src/libultra/io/epirawread.c delete mode 100644 src/libultra/io/epirawwrite.c delete mode 100644 src/libultra/io/epiread.c delete mode 100644 src/libultra/io/epiwrite.c delete mode 100644 src/libultra/io/gbpakcheckconnector.c delete mode 100644 src/libultra/io/gbpakgetstatus.c delete mode 100644 src/libultra/io/gbpakinit.c delete mode 100644 src/libultra/io/gbpakpower.c delete mode 100644 src/libultra/io/gbpakreadid.c delete mode 100644 src/libultra/io/gbpakreadwrite.c delete mode 100644 src/libultra/io/gbpakselectbank.c delete mode 100644 src/libultra/io/pfsgetstatus.c delete mode 100644 src/libultra/io/pfsisplug.c delete mode 100644 src/libultra/io/pfsselectbank.c delete mode 100644 src/libultra/io/piacs.c delete mode 100644 src/libultra/io/pigetcmdq.c delete mode 100644 src/libultra/io/pimgr.c delete mode 100644 src/libultra/io/pirawdma.c delete mode 100644 src/libultra/io/si.c delete mode 100644 src/libultra/io/siacs.c delete mode 100644 src/libultra/io/sirawdma.c delete mode 100644 src/libultra/io/sirawread.c delete mode 100644 src/libultra/io/sp.c delete mode 100644 src/libultra/io/sprawdma.c delete mode 100644 src/libultra/io/sptask.c delete mode 100644 src/libultra/io/sptaskyield.c delete mode 100644 src/libultra/io/sptaskyielded.c delete mode 100644 src/libultra/io/vi.c delete mode 100644 src/libultra/io/vigetcurrframebuf.c delete mode 100644 src/libultra/io/vimgr.c delete mode 100644 src/libultra/io/virepeatline.c delete mode 100644 src/libultra/io/visetevent.c delete mode 100644 src/libultra/io/visetmode.c delete mode 100644 src/libultra/io/visetxscale.c delete mode 100644 src/libultra/io/visetyscale.c delete mode 100644 src/libultra/io/viswapbuf.c delete mode 100644 src/libultra/libc/ldiv.c delete mode 100644 src/libultra/libc/ll.c delete mode 100644 src/libultra/libc/sprintf.c delete mode 100644 src/libultra/libc/syncprintf.c delete mode 100644 src/libultra/libc/xprintf.c delete mode 100644 src/libultra/os/afterprenmi.c delete mode 100644 src/libultra/os/createmesgqueue.c delete mode 100644 src/libultra/os/createthread.c delete mode 100644 src/libultra/os/dequeuethread.c delete mode 100644 src/libultra/os/destroythread.c delete mode 100644 src/libultra/os/getmemsize.c delete mode 100644 src/libultra/os/getthreadpri.c delete mode 100644 src/libultra/os/gettime.c delete mode 100644 src/libultra/os/initialize.c delete mode 100644 src/libultra/os/jammesg.c delete mode 100644 src/libultra/os/recvmesg.c delete mode 100644 src/libultra/os/sendmesg.c delete mode 100644 src/libultra/os/seteventmesg.c delete mode 100644 src/libultra/os/sethwinterrupt.c delete mode 100644 src/libultra/os/settime.c delete mode 100644 src/libultra/os/settimer.c delete mode 100644 src/libultra/os/startthread.c delete mode 100644 src/libultra/os/stopthread.c delete mode 100644 src/libultra/os/timerintr.c delete mode 100644 src/libultra/os/virtualtophysical.c create mode 100644 tools/asm-differ/.github/workflows/check-poetry-lock.yml create mode 100644 tools/asm-differ/.github/workflows/unit-tests.yml create mode 100644 tools/asm-differ/.gitignore create mode 100644 tools/asm-differ/.gitrepo create mode 100644 tools/asm-differ/.pre-commit-config.yaml create mode 100644 tools/asm-differ/LICENSE create mode 100644 tools/asm-differ/README.md create mode 100644 tools/asm-differ/diff-stylesheet.css create mode 100755 tools/asm-differ/diff.py create mode 100644 tools/asm-differ/diff_settings.py create mode 100644 tools/asm-differ/mypy.ini create mode 100644 tools/asm-differ/poetry.lock create mode 100644 tools/asm-differ/pyproject.toml create mode 100644 tools/asm-differ/screenshot.png create mode 100644 tools/asm-differ/test.py create mode 100644 tools/asm-processor/.gitignore create mode 100644 tools/asm-processor/.gitrepo create mode 100644 tools/asm-processor/LICENSE create mode 100644 tools/asm-processor/README.md create mode 100755 tools/asm-processor/add-test.sh create mode 100644 tools/asm-processor/asm_processor.py create mode 100644 tools/asm-processor/build.py create mode 100755 tools/asm-processor/compile-test.sh create mode 100644 tools/asm-processor/prelude.inc create mode 100755 tools/asm-processor/run-tests.sh create mode 100644 tools/asm-processor/tests/ascii.c create mode 100644 tools/asm-processor/tests/ascii.objdump create mode 100644 tools/asm-processor/tests/comments.c create mode 100644 tools/asm-processor/tests/comments.objdump create mode 100644 tools/asm-processor/tests/force.c create mode 100644 tools/asm-processor/tests/force.objdump create mode 100644 tools/asm-processor/tests/kpic-o1.c create mode 100644 tools/asm-processor/tests/kpic-o1.objdump create mode 100644 tools/asm-processor/tests/kpic-o2.c create mode 100644 tools/asm-processor/tests/kpic-o2.objdump create mode 100644 tools/asm-processor/tests/label-sameline.c create mode 100644 tools/asm-processor/tests/label-sameline.objdump create mode 100644 tools/asm-processor/tests/large.c create mode 100644 tools/asm-processor/tests/large.objdump create mode 100644 tools/asm-processor/tests/late_rodata_align.c create mode 100644 tools/asm-processor/tests/late_rodata_align.objdump create mode 100644 tools/asm-processor/tests/late_rodata_doubles.c create mode 100644 tools/asm-processor/tests/late_rodata_doubles.objdump create mode 100644 tools/asm-processor/tests/late_rodata_doubles_mips1.c create mode 100644 tools/asm-processor/tests/late_rodata_doubles_mips1.objdump create mode 100644 tools/asm-processor/tests/late_rodata_jtbl.c create mode 100644 tools/asm-processor/tests/late_rodata_jtbl.objdump create mode 100644 tools/asm-processor/tests/late_rodata_jtbl_mips1.c create mode 100644 tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump create mode 100644 tools/asm-processor/tests/late_rodata_misaligned_doubles.c create mode 100644 tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump create mode 100644 tools/asm-processor/tests/line-continuation-separate-file.s create mode 100644 tools/asm-processor/tests/line-continuation.asmproc.d create mode 100644 tools/asm-processor/tests/line-continuation.c create mode 100644 tools/asm-processor/tests/line-continuation.objdump create mode 100644 tools/asm-processor/tests/o0.c create mode 100644 tools/asm-processor/tests/o0.objdump create mode 100644 tools/asm-processor/tests/o2.c create mode 100644 tools/asm-processor/tests/o2.objdump create mode 100644 tools/asm-processor/tests/pascal.objdump create mode 100644 tools/asm-processor/tests/pascal.p create mode 100644 tools/asm-processor/tests/static-global.c create mode 100644 tools/asm-processor/tests/static-global.objdump create mode 100644 tools/asm-processor/tests/static.c create mode 100644 tools/asm-processor/tests/static.objdump create mode 100644 tools/asm-processor/tests/test1.c create mode 100644 tools/asm-processor/tests/test1.objdump create mode 100644 tools/asm-processor/tests/test2.c create mode 100644 tools/asm-processor/tests/test2.objdump create mode 100644 tools/asm-processor/tests/test3.c create mode 100644 tools/asm-processor/tests/test3.objdump delete mode 160000 tools/asmproc rename tools/{ido_recomp => ido}/linux/5.3/as1 (100%) rename tools/{ido_recomp => ido}/linux/5.3/cc (100%) rename tools/{ido_recomp => ido}/linux/5.3/cfe (100%) rename tools/{ido_recomp => ido}/linux/5.3/err.english.cc (100%) rename tools/{ido_recomp => ido}/linux/5.3/ugen (100%) rename tools/{ido_recomp => ido}/linux/5.3/ujoin (100%) rename tools/{ido_recomp => ido}/linux/5.3/uld (100%) rename tools/{ido_recomp => ido}/linux/5.3/umerge (100%) rename tools/{ido_recomp => ido}/linux/5.3/uopt (100%) rename tools/{ido_recomp => ido}/linux/5.3/usplit (100%) rename tools/{ido_recomp => ido}/linux/7.1/as1 (100%) rename tools/{ido_recomp => ido}/linux/7.1/cc (100%) rename tools/{ido_recomp => ido}/linux/7.1/cfe (100%) rename tools/{ido_recomp => ido}/linux/7.1/err.english.cc (100%) rename tools/{ido_recomp => ido}/linux/7.1/ugen (100%) rename tools/{ido_recomp => ido}/linux/7.1/uopt (100%) rename tools/{ido_recomp => ido}/macos/5.3/acpp (100%) rename tools/{ido_recomp => ido}/macos/5.3/as0 (100%) rename tools/{ido_recomp => ido}/macos/5.3/as1 (100%) rename tools/{ido_recomp => ido}/macos/5.3/cc (100%) rename tools/{ido_recomp => ido}/macos/5.3/cfe (100%) rename tools/{ido_recomp => ido}/macos/5.3/copt (100%) rename tools/{ido_recomp => ido}/macos/5.3/err.english.cc (100%) rename tools/{ido_recomp => ido}/macos/5.3/ld (100%) rename tools/{ido_recomp => ido}/macos/5.3/strip (100%) rename tools/{ido_recomp => ido}/macos/5.3/ugen (100%) rename tools/{ido_recomp => ido}/macos/5.3/ujoin (100%) rename tools/{ido_recomp => ido}/macos/5.3/uld (100%) rename tools/{ido_recomp => ido}/macos/5.3/umerge (100%) rename tools/{ido_recomp => ido}/macos/5.3/uopt (100%) rename tools/{ido_recomp => ido}/macos/5.3/usplit (100%) rename tools/{ido_recomp => ido}/macos/7.1/acpp (100%) rename tools/{ido_recomp => ido}/macos/7.1/as0 (100%) rename tools/{ido_recomp => ido}/macos/7.1/as1 (100%) rename tools/{ido_recomp => ido}/macos/7.1/cc (100%) rename tools/{ido_recomp => ido}/macos/7.1/cfe (100%) rename tools/{ido_recomp => ido}/macos/7.1/err.english.cc (100%) rename tools/{ido_recomp => ido}/macos/7.1/ugen (100%) rename tools/{ido_recomp => ido}/macos/7.1/ujoin (100%) rename tools/{ido_recomp => ido}/macos/7.1/uld (100%) rename tools/{ido_recomp => ido}/macos/7.1/umerge (100%) rename tools/{ido_recomp => ido}/macos/7.1/uopt (100%) rename tools/{ido_recomp => ido}/macos/7.1/upas (100%) rename tools/{ido_recomp => ido}/macos/7.1/usplit (100%) create mode 100644 yamls/us/header.yaml rename splat.yaml => yamls/us/rom.yaml (99%) diff --git a/.gitignore b/.gitignore index 909e221..505b924 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,28 @@ -# Generated by splat +.splat/ asm/ bin/ assets/ - -# Build directory build/ -.vscode/ +linker_scripts/*/auto/ +linker_scripts/*/pokestadium.ld +*_auto.ld +pokestadium.ld +pokestadium-*yaml + __pycache__/ +.make_options +ctx.c +ctx.c.m2c *.o + *.z64 -*.ld -*.csv +*.n64 +*.v64 +*.plf +*.sym +.venv -undefined_funcs_auto.txt -undefined_syms_auto.txt - -# qemu-irix compilers -tools/ido5.3_compiler/ -tools/ido7.1_compiler/ - -# diffing directory -expected/ - -# misc -.DS_Store +.vscode/* +!.vscode/c_cpp_properties.json diff --git a/Makefile b/Makefile index 32e12b3..8543e07 100644 --- a/Makefile +++ b/Makefile @@ -1,427 +1,351 @@ -BASEROM = baserom.z64 -TARGET = pokestadium -NON_MATCHING ?= 0 -RUN_CC_CHECK ?= 1 -WERROR ?= 0 +# Build options can be changed by modifying the makefile or by building with 'make SETTING=value'. +# It is also possible to override the settings in Defaults in a file called .make_options as 'SETTING=value'. -# Fail early if baserom does not exist -ifeq ($(wildcard $(BASEROM)),) -$(error Baserom `$(BASEROM)' not found.) -endif +-include .make_options -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Linux) - HOST_OS := linux -else ifeq ($(UNAME_S),Darwin) - HOST_OS := macos +MAKEFLAGS += --no-builtin-rules + +# Ensure the build fails if a piped command fails +SHELL = /bin/bash +.SHELLFLAGS = -o pipefail -c + +# OS Detection +ifeq ($(OS),Windows_NT) +$(error Native Windows is currently unsupported for building this repository, use WSL instead c:) else - $(error Unsupported host/building OS <$(UNAME_S)>) + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + DETECTED_OS = linux + MAKE = make + VENV_BIN_DIR = bin + endif + ifeq ($(UNAME_S),Darwin) + DETECTED_OS = macos + MAKE = gmake + VENV_BIN_DIR = bin + endif endif -FRAGMENT_DIRS := \ - fragments/1/ \ - fragments/2/ \ - fragments/3/ \ - fragments/4/ \ - fragments/5/ \ - fragments/6/ \ - fragments/7/ \ - fragments/8/ \ - fragments/9/ \ - fragments/10/ \ - fragments/11/ \ - fragments/12/ \ - fragments/13/ \ - fragments/14/ \ - fragments/15/ \ - fragments/16/ \ - fragments/17/ \ - fragments/18/ \ - fragments/19/ \ - fragments/20/ \ - fragments/21/ \ - fragments/22/ \ - fragments/23/ \ - fragments/24/ \ - fragments/25/ \ - fragments/26/ \ - fragments/27/ \ - fragments/28/ \ - fragments/29/ \ - fragments/30/ \ - fragments/31/ \ - fragments/32/ \ - fragments/33/ \ - fragments/34/ \ - fragments/35/ \ - fragments/36/ \ - fragments/37/ \ - fragments/38/ \ - fragments/39/ \ - fragments/40/ \ - fragments/41/ \ - fragments/42/ \ - fragments/43/ \ - fragments/44/ \ - fragments/45/ \ - fragments/46/ \ - fragments/47/ \ - fragments/48/ \ - fragments/49/ \ - fragments/50/ \ - fragments/51/ \ - fragments/52/ \ - fragments/53/ \ - fragments/54/ \ - fragments/55/ \ - fragments/56/ \ - fragments/57/ \ - fragments/58/ \ - fragments/59/ \ - fragments/60/ \ - fragments/61/ \ - fragments/62/ \ - fragments/63/ \ - fragments/64/ \ - fragments/65/ \ - fragments/66/ \ - fragments/67/ \ - fragments/68/ \ - fragments/69/ \ - fragments/70/ \ - fragments/71/ \ - fragments/72/ \ - fragments/73/ \ - fragments/74/ \ - fragments/75/ \ - fragments/76/ \ - fragments/77/ +#### Defaults #### +# Target game version. Currently only the following version is supported: +# us N64 US (default) +VERSION ?= us +# If COMPARE is 1, check the output md5sum after building +COMPARE ?= 1 +# If NON_MATCHING is 1, define the NON_MATCHING C flag when building +NON_MATCHING ?= 0 +# if WERROR is 1, pass -Werror to CC_CHECK, so warnings would be treated as errors +WERROR ?= 0 +# Keep .mdebug section in build +KEEP_MDEBUG ?= 0 +# Check code syntax with host compiler +RUN_CC_CHECK ?= 1 +CC_CHECK_COMP ?= gcc +# Dump build object files +OBJDUMP_BUILD ?= 0 +# Number of threads to compress with +N_THREADS ?= $(shell nproc) +# Not meant to be used by normal users. Toggles some options to improve the use of the warning checker system +WARNINGS_CHECK ?= 0 +# Disassembles matched functions and migrated data as well +FULL_DISASM ?= 0 +# Python virtual environment +VENV ?= .venv +# Python interpreter +PYTHON ?= $(VENV)/$(VENV_BIN_DIR)/python3 +# Emulator w/ flags +N64_EMULATOR ?= +# Set prefix to mips binutils binaries (mips-linux-gnu-ld => 'mips-linux-gnu-') - Change at your own risk! +# In nearly all cases, not having 'mips-linux-gnu-*' binaries on the PATH is indicative of missing dependencies +MIPS_BINUTILS_PREFIX ?= mips-linux-gnu- + +TARGET := pokestadium + +BASEROM_DIR := baseroms/$(VERSION) +BASEROM := $(BASEROM_DIR)/baserom.z64 + +ULTRALIB_VERSION := L +ULTRALIB_TARGET := libultra_rom + +### Output ### BUILD_DIR := build -ROM := $(TARGET).z64 -ELF := $(BUILD_DIR)/$(TARGET).elf -LD_SCRIPT := $(TARGET).ld -LD_MAP := $(BUILD_DIR)/$(TARGET).map -# TODO: Recursively make fragment folders correctly. -ASM_DIRS := asm asm/os asm/libleo asm/libultra asm/libultra/os asm/libultra/io asm/libultra/gu asm/libultra/libc asm/libultra/al asm/data -DATA_DIRS := bin assets -SRC_DIRS := $(shell find src -type d) +ROM := $(BUILD_DIR)/$(TARGET)-$(VERSION).z64 +ELF := $(ROM:.z64=.elf) +MAP := $(ROM:.z64=.map) +LDSCRIPT := $(ROM:.z64=.ld) -# Append FRAGMENT_DIRS to each dirs. -ASM_DIRS += $(addprefix asm/,$(FRAGMENT_DIRS)) -ASM_DIRS += $(addprefix asm/data/,$(FRAGMENT_DIRS)) -DATA_DIRS += $(addprefix assets/,$(FRAGMENT_DIRS)) -C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) -S_FILES := $(foreach dir,$(ASM_DIRS),$(wildcard $(dir)/*.s)) -DATA_FILES := $(foreach dir,$(DATA_DIRS),$(wildcard $(dir)/*.bin)) +#### Setup #### -# Object files -O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.c.o)) \ - $(foreach file,$(S_FILES),$(BUILD_DIR)/$(file:.s=.s.o)) \ - $(foreach file,$(DATA_FILES),$(BUILD_DIR)/$(file:.bin=.bin.o)) \ +BUILD_DEFINES ?= -DECOMP_C_OBJS := $(filter %.c.o,$(filter-out $(BUILD_DIR)/src/libultra%,$(O_FILES))) -DECOMP_POKE_STADIUM := $(filter %.c.o,$(filter-out $(BUILD_DIR)/src/libleo%,$(DECOMP_C_OBJS))) -DECOMP_LIBLEO := $(filter $(BUILD_DIR)/src/libleo/%.c.o,$(O_FILES)) - -DEP_FILES := $(O_FILES:.o=.d) $(DECOMP_C_OBJS:.o=.asmproc.d) - -SPLAT_YAML := splat.yaml -SPLAT = $(PYTHON) tools/n64splat/split.py $(SPLAT_YAML) - -##################### Compiler Options ####################### -findcmd = $(shell type $(1) >/dev/null 2>/dev/null; echo $$?) - -ifeq ($(call findcmd,mips-linux-gnu-ld),0) - CROSS := mips-linux-gnu- -else ifeq ($(call findcmd,mips64-elf-ld),0) - CROSS := mips64-elf- -else ifeq ($(call findcmd,mips-elf-ld),0) - CROSS := mips-elf- +ifeq ($(VERSION),us) + BUILD_DEFINES += -DVERSION_US=1 else - $(error Missing cross compilation toolchain) +$(error Invalid VERSION variable detected. Please use 'us') endif -AS = $(CROSS)as -LD = $(CROSS)ld -OBJDUMP = $(CROSS)objdump -OBJCOPY = $(CROSS)objcopy -ifeq ($(HOST_OS),macos) - CPP := clang -E -P -x c -else - CPP := cpp + +ifeq ($(NON_MATCHING),1) + BUILD_DEFINES += -DNON_MATCHING -DAVOID_UB + COMPARE := 0 endif -#CC := $(QEMU_IRIX) -L tools/ido7.1_compiler tools/ido7.1_compiler/usr/bin/cc -#CC_OLD := $(QEMU_IRIX) -L tools/ido5.3_compiler tools/ido5.3_compiler/usr/bin/cc +MAKE = make +CPPFLAGS += -fno-dollars-in-identifiers -P +LDFLAGS := --no-check-sections --accept-unknown-input-arch --emit-relocs -CC = tools/ido_recomp/$(HOST_OS)/7.1/cc -CC_OLD = tools/ido_recomp/$(HOST_OS)/5.3/cc -ASMPROC = python3 tools/asmproc/build.py -ASMPROC_FLAGS := +ifeq ($(DETECTED_OS), macos) + CPPFLAGS += -xc++ +endif -MIPS_VERSION := -mips2 +#### Tools #### +ifneq ($(shell type $(MIPS_BINUTILS_PREFIX)ld >/dev/null 2>/dev/null; echo $$?), 0) +$(error Unable to find $(MIPS_BINUTILS_PREFIX)ld. Please install or build MIPS binutils, commonly mips-linux-gnu. (or set MIPS_BINUTILS_PREFIX if your MIPS binutils install uses another prefix)) +endif -OPTFLAGS := -O2 -OBJDUMP_FLAGS := -d -r -z -Mreg-names=32 +CC := tools/ido/$(DETECTED_OS)/7.1/cc +CC_OLD := tools/ido/$(DETECTED_OS)/5.3/cc -# include locations -INC_DIRS := include include/PR include/audio . -IINCS := $(foreach d,$(INC_DIRS),-I$d) -# defines for SGI IDO -CDEFS := -D_LANGUAGE_C -DF3DEX_GBI_2 -DNDEBUG +AS := $(MIPS_BINUTILS_PREFIX)as +LD := $(MIPS_BINUTILS_PREFIX)ld +OBJCOPY := $(MIPS_BINUTILS_PREFIX)objcopy +OBJDUMP := $(MIPS_BINUTILS_PREFIX)objdump +NM := $(MIPS_BINUTILS_PREFIX)nm +AR := ar +CPP := cpp +ICONV := iconv +CAT := cat + +ASM_PROC := $(PYTHON) tools/asm-processor/build.py +ASM_PROC_FLAGS := --input-enc=utf-8 --output-enc=euc-jp --convert-statics=global-with-filename + +SPLAT := $(PYTHON) -m splat split +SPLAT_YAML := $(TARGET)-$(VERSION).yaml + +IINC := -Iinclude -Isrc -Iassets/$(VERSION) -I. -I$(BUILD_DIR) +IINC += -Ilib/ultralib/include -Ilib/ultralib/include/PR -Ilib/ultralib/include/ido +IINC += -Iinclude/ + +ifeq ($(KEEP_MDEBUG),0) + RM_MDEBUG = $(OBJCOPY) --remove-section .mdebug $@ +else + RM_MDEBUG = @: +endif + +# Check code syntax with host compiler +CHECK_WARNINGS := -Wall -Wextra -Wimplicit-fallthrough -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-uninitialized -Wno-unused-label +# Have CC_CHECK pretend to be a MIPS compiler +MIPS_BUILTIN_DEFS := -DMIPSEB -D_MIPS_FPSET=16 -D_MIPS_ISA=2 -D_ABIO32=1 -D_MIPS_SIM=_ABIO32 -D_MIPS_SZINT=32 -D_MIPS_SZPTR=32 ifneq ($(RUN_CC_CHECK),0) - CHECK_WARNINGS := -Wall -Wextra -Wno-unknown-pragmas - CHECK_DEFS := -D_MIPS_SZLONG=32 -DNON_MATCHING - CHECK_FLAGS := -fno-builtin -funsigned-char -fdiagnostics-color -std=gnu89 $(CDEFS) $(CHECK_DEFS) $(IINCS) -nostdinc - CC_CHECK := gcc -fsyntax-only - - ifeq ($(HOST_OS),linux) - CC_CHECK += -m32 - endif - - ifneq ($(WERROR),0) - CHECK_WARNINGS += -Werror +# The -MMD flags additionaly creates a .d file with the same name as the .o file. + CC_CHECK := $(CC_CHECK_COMP) + CC_CHECK_FLAGS := -MMD -MP -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -m32 -DNON_MATCHING -DAVOID_UB -DCC_CHECK=1 + ifneq ($(WERROR), 0) + CHECK_WARNINGS += -Werror endif else - CC_CHECK := @: + CC_CHECK := @: endif -######################## Flags ############################# -ASFLAGS = -EB -mtune=vr4300 -march=vr4300 $(IINCS) -32 +CFLAGS += -G 0 -non_shared -Xcpluscomm -nostdinc -Wab,-r4300_mul -# we support Microsoft extensions such as anonymous structs, which the compiler does support but warns for their usage. Surpress the warnings with -woff. -CFLAGS = -G 0 -non_shared -Xfullwarn -Xcpluscomm $(IINCS) -Wab,-r4300_mul $(CDEFS) -woff 624,649,838,712,516,513,596,564,594,807 $(MIPS_VERSION) +WARNINGS := -fullwarn -verbose -woff 624,649,838,712,516,513,596,564,594 +ASFLAGS := -march=vr4300 -32 -G0 +COMMON_DEFINES := -D_MIPS_SZLONG=32 +GBI_DEFINES := -DF3DEX_GBI_2 +RELEASE_DEFINES := -DNDEBUG -D_FINALROM +AS_DEFINES := -DMIPSEB -D_LANGUAGE_ASSEMBLY -D_ULTRA64 +C_DEFINES := -DLANGUAGE_C -D_LANGUAGE_C +LIBULTRA_DEFINES := -DBUILD_VERSION=VERSION_$(ULTRALIB_VERSION) +ENDIAN := -EB -LDFLAGS = -T undefined_syms.txt -T undefined_syms_auto.txt -T undefined_funcs_auto.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/$(TARGET).map --no-check-sections +OPTFLAGS := -O2 -g3 +MIPS_VERSION := -mips2 +ICONV_FLAGS := --from-code=UTF-8 --to-code=EUC-JP -######################## Targets ############################# +# Use relocations and abi fpr names in the dump +OBJDUMP_FLAGS := --disassemble --reloc --disassemble-zeroes -Mreg-names=32 -Mno-aliases -$(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(DATA_DIRS) $(COMPRESSED_DIRS) $(MAP_DIRS) $(BGM_DIRS),$(shell mkdir -p build/$(dir))) +ifneq ($(OBJDUMP_BUILD), 0) + OBJDUMP_CMD = $(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s) + OBJCOPY_BIN = $(OBJCOPY) -O binary $@ $@.bin + LIBDUMP_CMD = $(AR) xo --output $(@:.a=) $@ +else + OBJDUMP_CMD = @: + OBJCOPY_BIN = @: + LIBDUMP_CMD = @: +endif -# The reimplementations of the string functions need to treat char as signed. -build/src/hal_libc.c.o: CFLAGS += -signed +SPLAT_FLAGS ?= +ifneq ($(WARNINGS_CHECK), 0) + SPLAT_FLAGS += --stdout-only +endif -# Libultra O1 files -build/src/libultra/os/sendmesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/stopthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/recvmesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/destroythread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/dequeuethread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/createthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/virtualtophysical.c.o: OPTFLAGS := -O1 -build/src/libultra/os/initialize.c.o: OPTFLAGS := -O1 -build/src/libultra/os/epilinkhandle.c.o: OPTFLAGS := -O1 -build/src/libultra/os/getmemsize.c.o: OPTFLAGS := -O1 -build/src/libultra/os/seteventmesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/createmesgqueue.c.o: OPTFLAGS := -O1 -build/src/libultra/os/jammesg.c.o: OPTFLAGS := -O1 -build/src/libultra/os/setthreadpri.c.o: OPTFLAGS := -O1 -build/src/libultra/os/gettime.c.o: OPTFLAGS := -O1 -build/src/libultra/os/timerintr.c.o: OPTFLAGS := -O1 -build/src/libultra/os/setglobalintmask.c.o: OPTFLAGS := -O1 -build/src/libultra/os/resetglobalintmask.c.o: OPTFLAGS := -O1 -build/src/libultra/os/settime.c.o: OPTFLAGS := -O1 -build/src/libultra/os/yieldthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/settimer.c.o: OPTFLAGS := -O1 -build/src/libultra/os/startthread.c.o: OPTFLAGS := -O1 -build/src/libultra/os/sethwinterrupt.c.o: OPTFLAGS := -O1 -build/src/libultra/io/pigetcmdq.c.o: OPTFLAGS := -O1 -build/src/libultra/io/sptask.c.o: OPTFLAGS := -O1 -build/src/libultra/io/controller.c.o: OPTFLAGS := -O1 -build/src/libultra/io/conteeplongread.c.o: OPTFLAGS := -O1 -build/src/libultra/io/viblack.c.o: OPTFLAGS := -O1 -build/src/libultra/io/visetmode.c.o: OPTFLAGS := -O1 -build/src/libultra/io/virepeatline.c.o: OPTFLAGS := -O1 -build/src/libultra/io/pfsisplug.c.o: OPTFLAGS := -O1 -build/src/libultra/io/epidma.c.o: OPTFLAGS := -O1 -build/src/libultra/io/dpctr.c.o: OPTFLAGS := -O1 -build/src/libultra/io/conteeplongwrite.c.o: OPTFLAGS := -O1 -build/src/libultra/io/si.c.o: OPTFLAGS := -O1 -build/src/libultra/io/sp.c.o: OPTFLAGS := -O1 -build/src/libultra/io/viswapbuf.c.o: OPTFLAGS := -O1 -build/src/libultra/io/sptaskyielded.c.o: OPTFLAGS := -O1 -build/src/libultra/io/vi.c.o: OPTFLAGS := -O1 -build/src/libultra/io/visetevent.c.o: OPTFLAGS := -O1 -build/src/libultra/io/aisetnextbuf.c.o: OPTFLAGS := -O1 -build/src/libultra/io/ai.c.o: OPTFLAGS := -O1 -build/src/libultra/io/vigetcurrframebuf.c.o: OPTFLAGS := -O1 -build/src/libultra/io/spsetpc.c.o: OPTFLAGS := -O1 -build/src/libultra/libc/ll.c.o: OPTFLAGS := -O1 -build/src/libultra/libc/ll.c.o: MIPS_VERSION := -mips3 -32 -build/src/libultra/libc/llcvt.c.o: OPTFLAGS := -O1 -build/src/libultra/libc/llcvt.c.o: MIPS_VERSION := -mips3 -32 +ifneq ($(FULL_DISASM), 0) + SPLAT_FLAGS += --disassemble-all +endif -# cheap hack. TODO: Make the override better -build/src/libultra/io/gbpakpower.c.o: OPTFLAGS += -Wo,-loopunroll,0 -build/src/libultra/io/gbpakinit.c.o: OPTFLAGS += -Wo,-loopunroll,0 -build/src/libultra/io/gbpakselectbank.c.o: OPTFLAGS += -Wo,-loopunroll,0 +#### Files #### -build/src/C030.c.o: OPTFLAGS += -Wo,-loopunroll,0 +$(shell mkdir -p asm/$(VERSION) assets/$(VERSION) linker_scripts/$(VERSION)/auto) -# Libultra misc -build/src/libultra/gu/scale.c.o: CC := $(CC_OLD) -build/src/libultra/gu/scale.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/translate.c.o: CC := $(CC_OLD) -build/src/libultra/gu/translate.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/mtxcatf.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxcatf.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/mtxcatl.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxcatl.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/rotateRPY.c.o: CC := $(CC_OLD) -build/src/libultra/gu/rotateRPY.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/rotate.c.o: CC := $(CC_OLD) -build/src/libultra/gu/rotate.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/ortho.c.o: CC := $(CC_OLD) -build/src/libultra/gu/ortho.c.o: OPTFLAGS := -O3 -build/src/libultra/gu/sinf.c.o: CC := $(CC_OLD) -build/src/libultra/gu/cosf.c.o: CC := $(CC_OLD) -build/src/libultra/gu/random.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xprintf.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xprintf.c.o: OPTFLAGS := -O3 -build/src/libultra/libc/xldtob.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xldtob.c.o: OPTFLAGS := -O3 -build/src/libultra/libc/xlitob.c.o: CC := $(CC_OLD) -build/src/libultra/libc/xlitob.c.o: OPTFLAGS := -O3 -build/src/libultra/libc/string.c.o: CC := $(CC_OLD) -build/src/libultra/libc/string.c.o: OPTFLAGS := -O3 -build/src/libultra/io/controller.c.o: CC := $(CC_OLD) -build/src/libultra/io/contreaddata.c.o: CC := $(CC_OLD) -build/src/libultra/io/devmgr.c.o: CC := $(CC_OLD) -build/src/libultra/os/initialize.c.o: CC := $(CC_OLD) -build/src/libultra/io/pfsgetstatus.c.o: CC := $(CC_OLD) -build/src/libultra/io/epiread.c.o: CC := $(CC_OLD) -build/src/libultra/al/reverb.c.o: CC := $(CC_OLD) -build/src/libultra/al/bnkf.c.o: CC := $(CC_OLD) -build/src/libultra/al/bnkf.c.o: OPTFLAGS := -O3 -build/src/libultra/al/load.c.o: CC := $(CC_OLD) -build/src/libultra/al/load.c.o: OPTFLAGS := -O3 -build/src/libultra/al/synthesizer.c.o: CC := $(CC_OLD) -build/src/libultra/al/drvrNew.c.o: CC := $(CC_OLD) -build/src/libultra/al/mainbus.c.o: CC := $(CC_OLD) -build/src/libultra/al/mainbus.c.o: OPTFLAGS := -O3 -build/src/libultra/al/auxbus.c.o: CC := $(CC_OLD) -build/src/libultra/al/auxbus.c.o: OPTFLAGS := -O3 -build/src/libultra/al/env.c.o: CC := $(CC_OLD) -build/src/libultra/al/resample.c.o: CC := $(CC_OLD) -build/src/libultra/al/resample.c.o: OPTFLAGS := -O3 -build/src/libultra/al/save.c.o: CC := $(CC_OLD) -build/src/libultra/al/heapalloc.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxutil.c.o: CC := $(CC_OLD) -build/src/libultra/gu/mtxutil.c.o: OPTFLAGS := -O3 -build/src/libultra/io/pfsisplug.c.o: CC := $(CC_OLD) -build/src/libultra/io/conteepprobe.c.o: CC := $(CC_OLD) -build/src/libultra/io/conteepwrite.c.o: CC := $(CC_OLD) -build/src/libultra/io/conteepread.c.o: CC := $(CC_OLD) -build/src/libultra/io/contpfs.c.o: CC := $(CC_OLD) -build/src/libultra/io/viswapcontext.c.o: CC := $(CC_OLD) -build/src/libultra/io/contramwrite.c.o: CC := $(CC_OLD) -build/src/libultra/io/contramread.c.o: CC := $(CC_OLD) -build/src/libultra/io/crc.c.o: CC := $(CC_OLD) -build/src/libultra/libc/ldiv.c.o: CC := $(CC_OLD) -build/src/libultra/io/vimgr.c.o: CC := $(CC_OLD) -build/src/libultra/io/visetxscale.c.o: CC := $(CC_OLD) -build/src/libultra/io/visetxscale.c.o: OPTFLAGS := -O1 -build/src/libultra/io/visetyscale.c.o: CC := $(CC_OLD) -build/src/libultra/io/visetyscale.c.o: OPTFLAGS := -O1 -build/src/libultra/al/synallocfx.c.o: CC := $(CC_OLD) -build/src/libultra/al/synallocfx.c.o: OPTFLAGS := -O3 +ULTRALIB_DIR := lib/ultralib +ULTRALIB_LIB := $(ULTRALIB_DIR)/build/$(ULTRALIB_VERSION)/$(ULTRALIB_TARGET)/$(ULTRALIB_TARGET).a +LIBULTRA_DIR := lib/libultra +LIBULTRA_LIB := $(BUILD_DIR)/$(LIBULTRA_DIR).a -build/src/libultra/io/gbpakcheckconnector.c.o: CC := $(CC_OLD) -build/src/libultra/io/gbpakreadid.c.o: CC := $(CC_OLD) -build/src/libultra/io/gbpakreadwrite.c.o: CC := $(CC_OLD) -build/src/libultra/io/gbpakselectbank.c.o: CC := $(CC_OLD) +SRC_DIRS := $(shell find src -type d) +ASM_DIRS := $(shell find asm/$(VERSION) -type d -not -path "asm/$(VERSION)/nonmatchings/*" -not -path "asm/$(VERSION)/lib/*") +ASSET_DIRS := $(shell find assets/$(VERSION) -type d) +LIB_DIRS := $(foreach f, $(LIBULTRA_DIR), $f) -# run ASM-processor on non-libultra source files -$(DECOMP_POKE_STADIUM): CC := $(ASMPROC) $(ASMPROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- -$(DECOMP_LIBLEO): CC := $(ASMPROC) $(ASMPROC_FLAGS) $(CC_OLD) -- $(AS) $(ASFLAGS) -- +C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) +S_FILES := $(foreach dir,$(ASM_DIRS) $(SRC_DIRS),$(wildcard $(dir)/*.s)) +BIN_FILES := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.bin)) +O_FILES := $(foreach f,$(C_FILES:.c=.o),$(BUILD_DIR)/$f) \ + $(foreach f,$(S_FILES:.s=.o),$(BUILD_DIR)/$f) \ + $(foreach f,$(BIN_FILES:.bin=.o),$(BUILD_DIR)/$f) -# turn off syntax checking errors for libultra -build/src/libultra/al/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/gu/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/io/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/libc/%.c.o: CHECK_WARNINGS := -w -build/src/libultra/os/%.c.o: CHECK_WARNINGS := -w +ASSET_PNGS := $(foreach dir,$(ASSET_DIRS),$(wildcard $(dir)/*.png)) +ASSET_BINS := $(foreach f,$(ASSET_PNGS:.png=.bin),$(BUILD_DIR)/$f) +ASSET_INC_C := $(foreach f,$(ASSET_PNGS:.png=.inc.c),$(BUILD_DIR)/$f) -######################## Build ############################# -default: all +# Automatic dependency files +DEP_FILES := $(O_FILES:.o=.d) \ + $(O_FILES:.o=.asmproc.d) -LD_SCRIPT = $(TARGET).ld +# create build directories +$(shell mkdir -p $(BUILD_DIR)/linker_scripts/$(VERSION) $(BUILD_DIR)/linker_scripts/$(VERSION)/auto $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(ASSET_DIRS) $(LIB_DIRS),$(BUILD_DIR)/$(dir))) + + +# directory flags +build/src/boot/O2/%.o: OPTFLAGS := -O2 +build/src/boot/libc/%.o: OPTFLAGS := -O2 +build/src/boot/libc64/%.o: OPTFLAGS := -O2 +build/src/boot/libm/%.o: OPTFLAGS := -O2 +build/src/boot/libu64/%.o: OPTFLAGS := -O2 + +# per-file flags + +build/src/boot/fault.o: CFLAGS += -trapuv +build/src/boot/fault_drawer.o: CFLAGS += -trapuv + +# cc & asm-processor +build/src/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(CC) -- $(AS) $(ASFLAGS) -- + + +#### Main Targets ### + +all: rom rom: $(ROM) - -all: $(BUILD_DIR) $(BUILD_DIR)/$(ROM) verify - -distclean: - rm -rf asm bin assets $(BUILD_DIR) undefined_syms_auto.txt undefined_funcs_auto.txt +ifneq ($(COMPARE),0) + @md5sum $(ROM) + @md5sum -c $(BASEROM_DIR)/checksum.md5 +endif clean: - rm -rf $(BUILD_DIR) + $(RM) -r $(BUILD_DIR) -submodules: - git submodule update --init --recursive +libclean: + $(MAKE) -C lib/ultralib clean VERSION=$(ULTRALIB_VERSION) TARGET=$(ULTRALIB_TARGET) -split: - rm -rf $(DATA_DIRS) $(ASM_DIRS) && ./tools/n64splat/split.py $(SPLAT_YAML) +distclean: clean libclean + $(RM) -r $(BUILD_DIR) asm/ assets/ .splat/ + $(RM) -r linker_scripts/$(VERSION)/auto $(LDSCRIPT) + $(MAKE) -C tools distclean -tools: - make -s -C tools +venv: + test -d $(VENV) || python3 -m venv $(VENV) + $(PYTHON) -m pip install -U pip + $(PYTHON) -m pip install -U -r requirements.txt -expected: +setup: + $(MAKE) -C tools WARNINGS_CHECK=$(WARNINGS_CHECK) + +extract: + $(RM) -r asm/$(VERSION) assets/$(VERSION) + $(CAT) yamls/$(VERSION)/header.yaml yamls/$(VERSION)/rom.yaml > $(SPLAT_YAML) + $(SPLAT) $(SPLAT_FLAGS) $(SPLAT_YAML) + +lib: $(ULTRALIB_LIB) + +diff-init: rom $(RM) -r expected/ mkdir -p expected/ cp -r $(BUILD_DIR) expected/$(BUILD_DIR) -setup: distclean submodules split tools all expected +init: distclean + $(MAKE) venv + $(MAKE) setup + $(MAKE) extract + $(MAKE) all + $(MAKE) diff-init -$(BUILD_DIR): - echo $(C_FILES) - mkdir $(BUILD_DIR) +run: $(ROM) +ifeq ($(N64_EMULATOR),) + $(error Emulator path not set. Set N64_EMULATOR in the Makefile, .make_options, or define it as an environment variable) +endif + $(N64_EMULATOR) $< -$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) - @mkdir -p $(shell dirname $@) - $(CPP) -P -DBUILD_DIR=$(BUILD_DIR) -o $@ $< +.PHONY: all rom clean libclean distclean venv setup extract lib diff-init init run +.DEFAULT_GOAL := rom +# Prevent removing intermediate files +.SECONDARY: -$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf - $(OBJCOPY) $< $@ -O binary --gap-fill 0xFF -$(BUILD_DIR)/$(TARGET).elf: $(O_FILES) $(BUILD_DIR)/$(LD_SCRIPT) - @$(LD) $(LDFLAGS) -o $@ +#### Various Recipes #### -$(BUILD_DIR)/%.c.o: %.c - $(CC_CHECK) $(CHECK_FLAGS) $(CHECK_WARNINGS) -MMD -MP -MT $@ -MF $(@:.o=.d) $< - $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< +$(ROM): $(ELF) + $(OBJCOPY) -O binary --gap-fill=0xFF $< $@ +# TODO: update rom header checksum -$(BUILD_DIR)/src/libultra/libc/ll.c.o: src/libultra/libc/ll.c - $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< - python3 tools/set_o32abi_bit.py $@ - @$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s) +# TODO: avoid using auto/undefined +$(ELF): $(O_FILES) $(LIBULTRA_LIB) $(LDSCRIPT) $(BUILD_DIR)/linker_scripts/$(VERSION)/hardware_regs.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/undefined_syms.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/unused_syms.ld $(BUILD_DIR)/linker_scripts/common_undef_syms.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_syms_auto.ld $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_funcs_auto.ld + $(LD) $(LDFLAGS) -T $(LDSCRIPT) \ + -T $(BUILD_DIR)/linker_scripts/$(VERSION)/hardware_regs.ld -T $(BUILD_DIR)/linker_scripts/$(VERSION)/undefined_syms.ld \ + -T $(BUILD_DIR)/linker_scripts/$(VERSION)/unused_syms.ld -T $(BUILD_DIR)/linker_scripts/common_undef_syms.ld \ + -T $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_syms_auto.ld -T $(BUILD_DIR)/linker_scripts/$(VERSION)/auto/undefined_funcs_auto.ld \ + -Map $(MAP) $(LIBULTRA_LIB) -o $@ -$(BUILD_DIR)/src/libultra/libc/llcvt.c.o: src/libultra/libc/llcvt.c - $(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $< - python3 tools/set_o32abi_bit.py $@ - @$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s) +$(LDSCRIPT): linker_scripts/$(VERSION)/$(TARGET).ld + cp $< $@ -$(BUILD_DIR)/%.s.o: %.s - iconv --from UTF-8 --to EUC-JP $^ | $(AS) $(ASFLAGS) -o $@ +$(BUILD_DIR)/%.ld: %.ld + $(CPP) $(CPPFLAGS) $(BUILD_DEFINES) $(IINC) $< > $@ -$(BUILD_DIR)/%.bin.o: %.bin - $(LD) -r -b binary -o $@ $< +$(LIBULTRA_LIB): $(ULTRALIB_LIB) + cp $< $@ + $(LIBDUMP_CMD) -# final z64 updates checksum -$(BUILD_DIR)/$(ROM): $(BUILD_DIR)/$(TARGET).bin - @cp $< $@ +$(ULTRALIB_LIB): + $(MAKE) -C lib/ultralib VERSION=$(ULTRALIB_VERSION) TARGET=$(ULTRALIB_TARGET) FIXUPS=1 CROSS=$(MIPS_BINUTILS_PREFIX) CC=../../$(CC_OLD) -verify: $(BUILD_DIR)/$(ROM) - md5sum -c checksum.md5 +$(BUILD_DIR)/%.o: %.bin + $(OBJCOPY) -I binary -O elf32-big $< $@ -.PHONY: all clean distclean default split setup +$(BUILD_DIR)/%.o: %.s + $(ICONV) $(ICONV_FLAGS) $< | $(AS) $(ASFLAGS) $(ENDIAN) $(IINC) -I $(dir $*) -o $@ + $(OBJDUMP_CMD) -print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true +$(BUILD_DIR)/%.o: %.c + $(CC_CHECK) $(CC_CHECK_FLAGS) $(IINC) -I $(dir $*) $(CHECK_WARNINGS) $(BUILD_DEFINES) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(LIBULTRA_DEFINES) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $< + $(CC) -c $(CFLAGS) $(BUILD_DEFINES) $(IINC) $(WARNINGS) $(MIPS_VERSION) $(ENDIAN) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(LIBULTRA_DEFINES) $(C_DEFINES) $(OPTFLAGS) -o $@ $< + $(OBJDUMP_CMD) + $(RM_MDEBUG) + +# Add these as a dependency for .o files +asset_files: $(ASSET_INC_C) +$(O_FILES): | asset_files +.PHONY: asset_files -include $(DEP_FILES) + +# Print target for debugging +print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true diff --git a/include/common.h b/include/global.h similarity index 100% rename from include/common.h rename to include/global.h diff --git a/lib/ultralib/.github/workflows/ci_egcs.txt b/lib/ultralib/.github/workflows/ci_egcs.txt new file mode 100644 index 0000000..b6d8fe7 --- /dev/null +++ b/lib/ultralib/.github/workflows/ci_egcs.txt @@ -0,0 +1,42 @@ +# CI file for EGCS builds +# TODO: rename to `ci_egcs.yml` when the repo has EGCS / iQue support + +name: Build EGCS libultra + +# 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: [ique_v1.5] + suffix: [_rom] # [~, _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 build-essential python3 + + - name: Get extra dependencies + uses: actions/checkout@v3 + with: + repository: ${{ secrets.SECRETREPO }} + token: ${{ secrets.SECRETTOKEN }} + path: deps_repo + - name: Get the dependency + run: cp deps_repo/libultra/${{ matrix.version }}/* . + + - name: Setup + run: make setup -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} + + - name: Build libultra${{ matrix.suffix }} ${{ matrix.version }} + run: make -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} diff --git a/lib/ultralib/.github/workflows/ci_gcc.yml b/lib/ultralib/.github/workflows/ci_gcc.yml new file mode 100644 index 0000000..31efff8 --- /dev/null +++ b/lib/ultralib/.github/workflows/ci_gcc.yml @@ -0,0 +1,41 @@ +# CI file for GCC/KMC 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: [I, J, K, 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 build-essential python3 + + - name: Get extra dependencies + uses: actions/checkout@v3 + with: + repository: ${{ secrets.SECRETREPO }} + token: ${{ secrets.SECRETTOKEN }} + path: deps_repo + - name: Get the dependency + run: cp deps_repo/libultra/${{ matrix.version }}/* base/${{ matrix.version }} + + - 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/ultralib/.github/workflows/ci_ido.yml b/lib/ultralib/.github/workflows/ci_ido.yml new file mode 100644 index 0000000..1410108 --- /dev/null +++ b/lib/ultralib/.github/workflows/ci_ido.yml @@ -0,0 +1,41 @@ +# CI file for IDO builds + +name: Build IDO libultra + +# 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: [I, J, K, L] # [E, F, G, H, I, I_patch, J, K, L] + suffix: [~, _rom] # [~, _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 build-essential python3 binutils-mips-linux-gnu + + - name: Get extra dependencies + uses: actions/checkout@v3 + with: + repository: ${{ secrets.SECRETREPO }} + token: ${{ secrets.SECRETTOKEN }} + path: deps_repo + - name: Get the dependency + run: cp deps_repo/libultra/${{ matrix.version }}/* base/${{ matrix.version }} + + - name: Setup + run: make setup -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} + + - name: Build libultra${{ matrix.suffix }} ${{ matrix.version }} + run: make -j $(nproc) TARGET=libultra${{ matrix.suffix }} VERSION=${{ matrix.version }} diff --git a/lib/ultralib/.gitignore b/lib/ultralib/.gitignore new file mode 100644 index 0000000..1193e99 --- /dev/null +++ b/lib/ultralib/.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/ultralib/.gitrepo b/lib/ultralib/.gitrepo new file mode 100644 index 0000000..f9183f9 --- /dev/null +++ b/lib/ultralib/.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/git-commands/git-subrepo#readme +; +[subrepo] + remote = git@github.com:decompals/ultralib.git + branch = main + commit = 299d7faf8798cbe75e3247ccdf4e65c09f5270dd + parent = a10bb11ed6784c6a16a09b7eb17657d2e1bb303c + method = merge + cmdver = 0.4.6 diff --git a/lib/ultralib/Makefile b/lib/ultralib/Makefile new file mode 100644 index 0000000..a4714b6 --- /dev/null +++ b/lib/ultralib/Makefile @@ -0,0 +1,234 @@ +COMPARE ?= 1 +FIXUPS ?= 0 + +ifneq ($(FIXUPS),0) +COMPARE := 0 +endif + +# One of: +# libgultra_rom, libgultra_d, libgultra +# libultra_rom, libultra_d, libultra +TARGET ?= libgultra_rom +VERSION ?= L +CROSS ?= mips-linux-gnu- + +BASE_DIR := extracted/$(VERSION)/$(TARGET) +BASE_AR := base/$(VERSION)/$(TARGET).a +BUILD_ROOT := build +BUILD_DIR := $(BUILD_ROOT)/$(VERSION)/$(TARGET) +BUILD_AR := $(BUILD_DIR)/$(TARGET).a + +WORKING_DIR := $(shell pwd) + +CPP := cpp -P +AR := ar + +VERSION_D := 1 +VERSION_E := 2 +VERSION_F := 3 +VERSION_G := 4 +VERSION_H := 5 +VERSION_I := 6 +VERSION_J := 7 +VERSION_K := 8 +VERSION_L := 9 + +VERSION_DEFINE := -DBUILD_VERSION=$(VERSION_$(VERSION)) -DBUILD_VERSION_STRING=\"2.0$(VERSION)\" + +ifeq ($(findstring _d,$(TARGET)),_d) +DEBUGFLAG := -D_DEBUG +else +DEBUGFLAG := -DNDEBUG +endif + +ifeq ($(findstring libgultra,$(TARGET)),libgultra) +-include Makefile.gcc +else ifeq ($(findstring libultra,$(TARGET)),libultra) +-include Makefile.ido +else +$(error Invalid Target) +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) +# Because we patch the object file timestamps, we can't use them as the targets since they'll always be older than the C file +# Therefore instead we use marker files that have actual timestamps as the dependencies for the archive +C_MARKER_FILES := $(C_O_FILES:.o=.marker) +S_MARKER_FILES := $(S_O_FILES:.o=.marker) +S_MARKER_FILES := $(filter-out $(MDEBUG_FILES),$(S_MARKER_FILES)) +MARKER_FILES := $(C_MARKER_FILES) $(S_MARKER_FILES) $(MDEBUG_FILES) + +ifneq ($(COMPARE),0) +COMPARE_OBJ = cmp $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o) && echo "$(@:.marker=.o): OK" +COMPARE_AR = cmp $(BASE_AR) $@ && echo "$@: OK" +ifeq ($(COMPILER),ido) +COMPARE_OBJ = $(CROSS)objcopy -p --strip-debug $(WORKING_DIR)/$(@:.marker=.o) $(WORKING_DIR)/$(@:.marker=.cmp.o) && \ + cmp $(BASE_DIR)/.cmp/$(@F:.marker=.cmp.o) $(WORKING_DIR)/$(@:.marker=.cmp.o) && echo "$(@:.marker=.o): OK" +COMPARE_AR = echo "$@: Cannot compare archive currently" +endif +else +COMPARE_OBJ := +COMPARE_AR := +AR_OLD := $(AR) +endif + +BASE_OBJS := $(wildcard $(BASE_DIR)/*.o) + +# Check to make sure the current version has been set up +ifneq ($(COMPARE),0) +ifeq ($(BASE_OBJS),) +# Ignore this check if the user is currently running setup, clean or distclean +ifeq ($(filter $(MAKECMDGOALS),setup clean distclean),) +$(error Current version ($(TARGET) 2.0$(VERSION)) has not been setup!) +endif +endif +endif + +AR_OBJECTS := $(shell cat base/$(VERSION)/$(TARGET).txt) +# If the version and target doesn't have a text file yet, resort back to using the base archive to get objects +ifeq ($(AR_OBJECTS),) +AR_OBJECTS := $(shell ar t $(BASE_AR)) +endif + + +# Try to find a file corresponding to an archive file in src/ or the base directory, prioritizing src then the original file +AR_ORDER = $(foreach f,$(AR_OBJECTS),$(shell find $(BUILD_DIR)/src $(BASE_DIR) -iname $f -type f -print -quit)) +MATCHED_OBJS = $(filter-out $(BASE_DIR)/%,$(AR_ORDER)) +UNMATCHED_OBJS = $(filter-out $(MATCHED_OBJS),$(AR_ORDER)) +NUM_OBJS = $(words $(AR_ORDER)) +NUM_OBJS_MATCHED = $(words $(MATCHED_OBJS)) +NUM_OBJS_UNMATCHED = $(words $(UNMATCHED_OBJS)) + +$(shell mkdir -p $(BASE_DIR) src $(foreach dir,$(SRC_DIRS),$(BUILD_DIR)/$(dir))) + +.PHONY: all clean distclean setup +all: $(BUILD_AR) + +$(BUILD_AR): $(MARKER_FILES) + $(AR_OLD) rcs $@ $(AR_ORDER) +ifneq ($(COMPARE),0) +# patch archive creation time and individual files' ownership & permissions + dd bs=1 skip=24 seek=24 count=12 conv=notrunc if=$(BASE_AR) of=$@ status=none + python3 tools/patch_ar_meta.py $@ $(BASE_AR) $(PATCH_AR_FLAGS) + @$(COMPARE_AR) + @echo "Matched: $(NUM_OBJS_MATCHED)/$(NUM_OBJS)" +endif + +clean: + $(RM) -rf $(BUILD_DIR) + +distclean: + $(MAKE) -C tools distclean + $(RM) -rf extracted/ $(BUILD_ROOT) + +setup: + $(MAKE) -C tools +ifneq ($(COMPARE),0) + cd $(BASE_DIR) && $(AR) xo $(WORKING_DIR)/$(BASE_AR) + chmod -R +rw $(BASE_DIR) +ifeq ($(COMPILER),ido) + export CROSS=$(CROSS) && ./tools/strip_debug.sh $(BASE_DIR) +endif +endif + +$(BUILD_DIR)/$(BASE_DIR)/%.marker: $(BASE_DIR)/%.o + cp $< $(@:.marker=.o) +ifneq ($(COMPARE),0) +# change file timestamps to match original + @touch -r $(BASE_DIR)/$(@F:.marker=.o) $(@:.marker=.o) + @$(COMPARE_OBJ) + @touch $@ +endif + +GBIDEFINE := -DF3DEX_GBI + +$(BUILD_DIR)/src/gu/parse_gbi.marker: GBIDEFINE := -DF3D_GBI +$(BUILD_DIR)/src/gu/us2dex_emu.marker: GBIDEFINE := +$(BUILD_DIR)/src/gu/us2dex2_emu.marker: GBIDEFINE := +$(BUILD_DIR)/src/sp/sprite.marker: GBIDEFINE := -DF3D_GBI +$(BUILD_DIR)/src/sp/spriteex.marker: GBIDEFINE := +$(BUILD_DIR)/src/sp/spriteex2.marker: GBIDEFINE := +$(BUILD_DIR)/src/voice/%.marker: OPTFLAGS += -DLANG_JAPANESE -I$(WORKING_DIR)/src -I$(WORKING_DIR)/src/voice +$(BUILD_DIR)/src/voice/%.marker: CC := tools/compile_sjis.py -D__CC=$(WORKING_DIR)/$(CC) -D__BUILD_DIR=$(BUILD_DIR) + +$(C_MARKER_FILES): $(BUILD_DIR)/%.marker: %.c + cd $( + +/* + * 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/ultralib/include/PR/abi.h b/lib/ultralib/include/PR/abi.h new file mode 100644 index 0000000..e121526 --- /dev/null +++ b/lib/ultralib/include/PR/abi.h @@ -0,0 +1,410 @@ +#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/ultralib/include/PR/gbi.h b/lib/ultralib/include/PR/gbi.h new file mode 100644 index 0000000..e3881e9 --- /dev/null +++ b/lib/ultralib/include/PR/gbi.h @@ -0,0 +1,4585 @@ +/************************************************************************** + * * + * 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) + * + */ + +/* Private macro to wrap other macros in do {...} while (0) */ +#define _DW(macro) do {macro} while (0) + +#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]; + unsigned char kc; + unsigned char colc[3]; + unsigned char kl; + short pos[3]; + unsigned char kq; +} PointLight_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; + PointLight_t p; + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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)<>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, G_TX_RENDERTILE, \ + (uls)<>3), tmem, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPLoadSync(pkt); \ + gDPLoadTile( pkt, G_TX_LOADTILE, \ + (uls)<>3), tmem, \ + rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts); \ + gDPSetTileSize(pkt, rtile, \ + (uls)<>3), 0, \ + G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<>3), 0, \ + G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks,\ + shifts), \ + gsDPSetTileSize(G_TX_RENDERTILE, \ + (uls)<>3), \ + tmem, G_TX_LOADTILE, 0 , cmt, maskt, shiftt, cms, \ + masks, shifts), \ + gsDPLoadSync(), \ + gsDPLoadTile( G_TX_LOADTILE, \ + (uls)<>3), \ + tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, \ + shifts), \ + gsDPSetTileSize(rtile, \ + (uls)<>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)<>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)<>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)<>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)<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) \ +_DW({ \ + 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) \ +_DW({ \ + 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) \ +_DW({ \ + 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)\ +_DW({ \ + 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) \ +_DW({ \ + 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/ultralib/include/PR/gs2dex.h b/lib/ultralib/include/PR/gs2dex.h new file mode 100644 index 0000000..ced4685 --- /dev/null +++ b/lib/ultralib/include/PR/gs2dex.h @@ -0,0 +1,392 @@ +/*--------------------------------------------------------------------- + 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/ultralib/include/PR/gt.h b/lib/ultralib/include/PR/gt.h new file mode 100644 index 0000000..09b6ba2 --- /dev/null +++ b/lib/ultralib/include/PR/gt.h @@ -0,0 +1,365 @@ + +/* + * 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/ultralib/include/PR/gu.h b/lib/ultralib/include/PR/gu.h new file mode 100644 index 0000000..9a2fa2b --- /dev/null +++ b/lib/ultralib/include/PR/gu.h @@ -0,0 +1,270 @@ +#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/include/PR/leo.h b/lib/ultralib/include/PR/leo.h similarity index 100% rename from include/PR/leo.h rename to lib/ultralib/include/PR/leo.h diff --git a/include/PR/leoappli.h b/lib/ultralib/include/PR/leoappli.h similarity index 100% rename from include/PR/leoappli.h rename to lib/ultralib/include/PR/leoappli.h diff --git a/lib/ultralib/include/PR/libaudio.h b/lib/ultralib/include/PR/libaudio.h new file mode 100644 index 0000000..33017b7 --- /dev/null +++ b/lib/ultralib/include/PR/libaudio.h @@ -0,0 +1,947 @@ +/*==================================================================== + * 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/ultralib/include/PR/mbi.h b/lib/ultralib/include/PR/mbi.h new file mode 100644 index 0000000..ac900a5 --- /dev/null +++ b/lib/ultralib/include/PR/mbi.h @@ -0,0 +1,100 @@ +#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/ultralib/include/PR/os.h b/lib/ultralib/include/PR/os.h new file mode 100644 index 0000000..4b52dfb --- /dev/null +++ b/lib/ultralib/include/PR/os.h @@ -0,0 +1,108 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_ai.h b/lib/ultralib/include/PR/os_ai.h new file mode 100644 index 0000000..f89d87c --- /dev/null +++ b/lib/ultralib/include/PR/os_ai.h @@ -0,0 +1,92 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_cache.h b/lib/ultralib/include/PR/os_cache.h new file mode 100644 index 0000000..54ed923 --- /dev/null +++ b/lib/ultralib/include/PR/os_cache.h @@ -0,0 +1,96 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_cont.h b/lib/ultralib/include/PR/os_cont.h new file mode 100644 index 0000000..2b69330 --- /dev/null +++ b/lib/ultralib/include/PR/os_cont.h @@ -0,0 +1,208 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_convert.h b/lib/ultralib/include/PR/os_convert.h new file mode 100644 index 0000000..0a5da10 --- /dev/null +++ b/lib/ultralib/include/PR/os_convert.h @@ -0,0 +1,111 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_debug.h b/lib/ultralib/include/PR/os_debug.h new file mode 100644 index 0000000..f8f5a89 --- /dev/null +++ b/lib/ultralib/include/PR/os_debug.h @@ -0,0 +1,117 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_eeprom.h b/lib/ultralib/include/PR/os_eeprom.h new file mode 100644 index 0000000..b3bca81 --- /dev/null +++ b/lib/ultralib/include/PR/os_eeprom.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_error.h b/lib/ultralib/include/PR/os_error.h new file mode 100644 index 0000000..f4c3b83 --- /dev/null +++ b/lib/ultralib/include/PR/os_error.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_exception.h b/lib/ultralib/include/PR/os_exception.h new file mode 100644 index 0000000..2457bde --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/os_flash.h b/lib/ultralib/include/PR/os_flash.h new file mode 100644 index 0000000..9eb0bf7 --- /dev/null +++ b/lib/ultralib/include/PR/os_flash.h @@ -0,0 +1,77 @@ +/*---------------------------------------------------------------------* + 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/ultralib/include/PR/os_gbpak.h b/lib/ultralib/include/PR/os_gbpak.h new file mode 100644 index 0000000..0a99994 --- /dev/null +++ b/lib/ultralib/include/PR/os_gbpak.h @@ -0,0 +1,107 @@ + +/*---------------------------------------------------------------------* + 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/ultralib/include/PR/os_gio.h b/lib/ultralib/include/PR/os_gio.h new file mode 100644 index 0000000..ad3c020 --- /dev/null +++ b/lib/ultralib/include/PR/os_gio.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_host.h b/lib/ultralib/include/PR/os_host.h new file mode 100644 index 0000000..3192f6a --- /dev/null +++ b/lib/ultralib/include/PR/os_host.h @@ -0,0 +1,166 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_internal.h b/lib/ultralib/include/PR/os_internal.h new file mode 100644 index 0000000..754d1ee --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/os_internal_debug.h b/lib/ultralib/include/PR/os_internal_debug.h new file mode 100644 index 0000000..7b307d6 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_debug.h @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * 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/ultralib/include/PR/os_internal_error.h b/lib/ultralib/include/PR/os_internal_error.h new file mode 100644 index 0000000..de188d2 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_error.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_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/ultralib/include/PR/os_internal_exception.h b/lib/ultralib/include/PR/os_internal_exception.h new file mode 100644 index 0000000..dae8a9f --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_exception.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_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/ultralib/include/PR/os_internal_flash.h b/lib/ultralib/include/PR/os_internal_flash.h new file mode 100644 index 0000000..1c6f780 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/os_internal_gio.h b/lib/ultralib/include/PR/os_internal_gio.h new file mode 100644 index 0000000..ff13385 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_gio.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_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/ultralib/include/PR/os_internal_host.h b/lib/ultralib/include/PR/os_internal_host.h new file mode 100644 index 0000000..b6d1951 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_host.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_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/ultralib/include/PR/os_internal_reg.h b/lib/ultralib/include/PR/os_internal_reg.h new file mode 100644 index 0000000..206b721 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/os_internal_rsp.h b/lib/ultralib/include/PR/os_internal_rsp.h new file mode 100644 index 0000000..646e667 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_rsp.h @@ -0,0 +1,48 @@ +/************************************************************************** + * * + * 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/ultralib/include/PR/os_internal_si.h b/lib/ultralib/include/PR/os_internal_si.h new file mode 100644 index 0000000..d0eeedc --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_si.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_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/ultralib/include/PR/os_internal_thread.h b/lib/ultralib/include/PR/os_internal_thread.h new file mode 100644 index 0000000..1305eb5 --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_thread.h @@ -0,0 +1,43 @@ +/************************************************************************** + * * + * 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/ultralib/include/PR/os_internal_tlb.h b/lib/ultralib/include/PR/os_internal_tlb.h new file mode 100644 index 0000000..b92918f --- /dev/null +++ b/lib/ultralib/include/PR/os_internal_tlb.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_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/ultralib/include/PR/os_libc.h b/lib/ultralib/include/PR/os_libc.h new file mode 100644 index 0000000..35d0e8e --- /dev/null +++ b/lib/ultralib/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 */ + + +extern void bcopy(const void *, void *, int); +extern int bcmp(const void *, const void *, int); +extern void bzero(void *, int); + +/* 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/ultralib/include/PR/os_message.h b/lib/ultralib/include/PR/os_message.h new file mode 100644 index 0000000..606c5cb --- /dev/null +++ b/lib/ultralib/include/PR/os_message.h @@ -0,0 +1,162 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_motor.h b/lib/ultralib/include/PR/os_motor.h new file mode 100644 index 0000000..2edb8e6 --- /dev/null +++ b/lib/ultralib/include/PR/os_motor.h @@ -0,0 +1,84 @@ + +/*---------------------------------------------------------------------* + 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/ultralib/include/PR/os_pfs.h b/lib/ultralib/include/PR/os_pfs.h new file mode 100644 index 0000000..9c86e23 --- /dev/null +++ b/lib/ultralib/include/PR/os_pfs.h @@ -0,0 +1,200 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_pi.h b/lib/ultralib/include/PR/os_pi.h new file mode 100644 index 0000000..f408d6c --- /dev/null +++ b/lib/ultralib/include/PR/os_pi.h @@ -0,0 +1,221 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_rdp.h b/lib/ultralib/include/PR/os_rdp.h new file mode 100644 index 0000000..6b3d288 --- /dev/null +++ b/lib/ultralib/include/PR/os_rdp.h @@ -0,0 +1,92 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_reg.h b/lib/ultralib/include/PR/os_reg.h new file mode 100644 index 0000000..50aa218 --- /dev/null +++ b/lib/ultralib/include/PR/os_reg.h @@ -0,0 +1,90 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_rsp.h b/lib/ultralib/include/PR/os_rsp.h new file mode 100644 index 0000000..1211605 --- /dev/null +++ b/lib/ultralib/include/PR/os_rsp.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_si.h b/lib/ultralib/include/PR/os_si.h new file mode 100644 index 0000000..23b07c0 --- /dev/null +++ b/lib/ultralib/include/PR/os_si.h @@ -0,0 +1,86 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_system.h b/lib/ultralib/include/PR/os_system.h new file mode 100644 index 0000000..1179189 --- /dev/null +++ b/lib/ultralib/include/PR/os_system.h @@ -0,0 +1,118 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_thread.h b/lib/ultralib/include/PR/os_thread.h new file mode 100644 index 0000000..68c8e74 --- /dev/null +++ b/lib/ultralib/include/PR/os_thread.h @@ -0,0 +1,161 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_time.h b/lib/ultralib/include/PR/os_time.h new file mode 100644 index 0000000..deaec65 --- /dev/null +++ b/lib/ultralib/include/PR/os_time.h @@ -0,0 +1,114 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_tlb.h b/lib/ultralib/include/PR/os_tlb.h new file mode 100644 index 0000000..2cdd5c9 --- /dev/null +++ b/lib/ultralib/include/PR/os_tlb.h @@ -0,0 +1,107 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_version.h b/lib/ultralib/include/PR/os_version.h new file mode 100644 index 0000000..aa10d20 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/os_vi.h b/lib/ultralib/include/PR/os_vi.h new file mode 100644 index 0000000..5a17f25 --- /dev/null +++ b/lib/ultralib/include/PR/os_vi.h @@ -0,0 +1,298 @@ + +/*==================================================================== + * 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/ultralib/include/PR/os_voice.h b/lib/ultralib/include/PR/os_voice.h new file mode 100644 index 0000000..4e3cf6e --- /dev/null +++ b/lib/ultralib/include/PR/os_voice.h @@ -0,0 +1,108 @@ + +/*---------------------------------------------------------------------* + 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/ultralib/include/PR/ramrom.h b/lib/ultralib/include/PR/ramrom.h new file mode 100644 index 0000000..42e5c2d --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/rcp.h b/lib/ultralib/include/PR/rcp.h new file mode 100644 index 0000000..47c4b34 --- /dev/null +++ b/lib/ultralib/include/PR/rcp.h @@ -0,0 +1,848 @@ +#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_1 0x00100 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_ANTIALIAS_MODE_2 0x00200 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_ANTIALIAS_MODE_3 0x00300 /* Bit [9:8] anti-alias mode */ +#define VI_CTRL_PIXEL_ADV_MASK 0x01000 /* [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/ultralib/include/PR/rdb.h b/lib/ultralib/include/PR/rdb.h new file mode 100644 index 0000000..e089749 --- /dev/null +++ b/lib/ultralib/include/PR/rdb.h @@ -0,0 +1,93 @@ + +/************************************************************************** + * + * $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/ultralib/include/PR/region.h b/lib/ultralib/include/PR/region.h new file mode 100644 index 0000000..0ac8a25 --- /dev/null +++ b/lib/ultralib/include/PR/region.h @@ -0,0 +1,123 @@ + +/************************************************************************** + * * + * 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/ultralib/include/PR/rmon.h b/lib/ultralib/include/PR/rmon.h new file mode 100644 index 0000000..199e569 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/sched.h b/lib/ultralib/include/PR/sched.h new file mode 100644 index 0000000..2d305a2 --- /dev/null +++ b/lib/ultralib/include/PR/sched.h @@ -0,0 +1,115 @@ +/*==================================================================== + * 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/ultralib/include/PR/sp.h b/lib/ultralib/include/PR/sp.h new file mode 100644 index 0000000..8167ca2 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/sptask.h b/lib/ultralib/include/PR/sptask.h new file mode 100644 index 0000000..960cab9 --- /dev/null +++ b/lib/ultralib/include/PR/sptask.h @@ -0,0 +1,201 @@ +/************************************************************************** + * * + * 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/ultralib/include/PR/ucode.h b/lib/ultralib/include/PR/ucode.h new file mode 100644 index 0000000..e43f52a --- /dev/null +++ b/lib/ultralib/include/PR/ucode.h @@ -0,0 +1,192 @@ +/************************************************************************** + * * + * 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/ultralib/include/PR/ultraerror.h b/lib/ultralib/include/PR/ultraerror.h new file mode 100644 index 0000000..ebaf59a --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/ultralog.h b/lib/ultralib/include/PR/ultralog.h new file mode 100644 index 0000000..48b84b9 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/PR/ultratypes.h b/lib/ultralib/include/PR/ultratypes.h new file mode 100644 index 0000000..235cc73 --- /dev/null +++ b/lib/ultralib/include/PR/ultratypes.h @@ -0,0 +1,85 @@ +#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/ultralib/include/asm.h b/lib/ultralib/include/asm.h new file mode 100644 index 0000000..1de9f0a --- /dev/null +++ b/lib/ultralib/include/asm.h @@ -0,0 +1 @@ +#include diff --git a/lib/ultralib/include/assert.h b/lib/ultralib/include/assert.h new file mode 100644 index 0000000..bfbf255 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/dbgdefs.h b/lib/ultralib/include/dbgdefs.h new file mode 100644 index 0000000..f7ead71 --- /dev/null +++ b/lib/ultralib/include/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/ultralib/include/dbgproto.h b/lib/ultralib/include/dbgproto.h new file mode 100644 index 0000000..2eabf9a --- /dev/null +++ b/lib/ultralib/include/dbgproto.h @@ -0,0 +1,402 @@ +#ifndef _DBGPROTO_H__ +#define _DBGPROTO_H__ + +#include "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/ultralib/include/fpregdef.h b/lib/ultralib/include/fpregdef.h new file mode 100644 index 0000000..e69de29 diff --git a/lib/ultralib/include/gcc/math.h b/lib/ultralib/include/gcc/math.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/gcc/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/gcc/memory.h b/lib/ultralib/include/gcc/memory.h new file mode 100644 index 0000000..edfff5e --- /dev/null +++ b/lib/ultralib/include/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/ultralib/include/gcc/sgidefs.h b/lib/ultralib/include/gcc/sgidefs.h new file mode 100644 index 0000000..56567e8 --- /dev/null +++ b/lib/ultralib/include/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/ultralib/include/gcc/stdarg.h b/lib/ultralib/include/gcc/stdarg.h new file mode 100644 index 0000000..af337f6 --- /dev/null +++ b/lib/ultralib/include/gcc/stdarg.h @@ -0,0 +1,121 @@ +#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/ultralib/include/gcc/stdio.h b/lib/ultralib/include/gcc/stdio.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/gcc/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/gcc/stdlib.h b/lib/ultralib/include/gcc/stdlib.h new file mode 100644 index 0000000..98f8a2e --- /dev/null +++ b/lib/ultralib/include/gcc/stdlib.h @@ -0,0 +1,81 @@ +#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/ultralib/include/gcc/string.h b/lib/ultralib/include/gcc/string.h new file mode 100644 index 0000000..d82e1f1 --- /dev/null +++ b/lib/ultralib/include/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/ultralib/include/ido/math.h b/lib/ultralib/include/ido/math.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/ido/math.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/ido/memory.h b/lib/ultralib/include/ido/memory.h new file mode 100644 index 0000000..edfff5e --- /dev/null +++ b/lib/ultralib/include/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/ultralib/include/ido/stdarg.h b/lib/ultralib/include/ido/stdarg.h new file mode 100644 index 0000000..62f68e0 --- /dev/null +++ b/lib/ultralib/include/ido/stdarg.h @@ -0,0 +1,33 @@ +#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/ultralib/include/ido/stdio.h b/lib/ultralib/include/ido/stdio.h new file mode 100644 index 0000000..3e93ceb --- /dev/null +++ b/lib/ultralib/include/ido/stdio.h @@ -0,0 +1 @@ +// Nothing needed here diff --git a/lib/ultralib/include/ido/stdlib.h b/lib/ultralib/include/ido/stdlib.h new file mode 100644 index 0000000..98f8a2e --- /dev/null +++ b/lib/ultralib/include/ido/stdlib.h @@ -0,0 +1,81 @@ +#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/ultralib/include/ido/string.h b/lib/ultralib/include/ido/string.h new file mode 100644 index 0000000..d82e1f1 --- /dev/null +++ b/lib/ultralib/include/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/ultralib/include/macros.h b/lib/ultralib/include/macros.h new file mode 100644 index 0000000..3057fc8 --- /dev/null +++ b/lib/ultralib/include/macros.h @@ -0,0 +1,16 @@ +#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 + +#endif diff --git a/lib/ultralib/include/regdef.h b/lib/ultralib/include/regdef.h new file mode 100644 index 0000000..c29cc69 --- /dev/null +++ b/lib/ultralib/include/regdef.h @@ -0,0 +1,3 @@ +#include +#include +#include diff --git a/lib/ultralib/include/sgidefs.h b/lib/ultralib/include/sgidefs.h new file mode 100644 index 0000000..8d4b6e1 --- /dev/null +++ b/lib/ultralib/include/sgidefs.h @@ -0,0 +1,3 @@ +#ifdef __GNUC__ +#include "gcc/sgidefs.h" +#endif diff --git a/lib/ultralib/include/sys/asm.h b/lib/ultralib/include/sys/asm.h new file mode 100644 index 0000000..97f8fb2 --- /dev/null +++ b/lib/ultralib/include/sys/asm.h @@ -0,0 +1,116 @@ +/************************************************************************ + 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 STAY1(stmnt) \ + .set noreorder ;\ + stmnt ;\ + .set reorder + +#define STAY2(stmnt, arg1) \ + .set noreorder ;\ + stmnt, arg1 ;\ + .set reorder + +#define STAY3(stmnt, arg1, arg2) \ + .set noreorder ;\ + stmnt, arg1, arg2 ;\ + .set reorder + +#define NOP \ + .set noreorder ;\ + nop ;\ + .set reorder + +#define CACHE(op, reg) \ + .set noreorder ;\ + cache op, reg ;\ + .set reorder + +#ifdef __cplusplus +} +#endif + +#endif /* !__ASM_H__ */ diff --git a/lib/ultralib/include/sys/fpregdef.h b/lib/ultralib/include/sys/fpregdef.h new file mode 100644 index 0000000..e69de29 diff --git a/lib/ultralib/include/sys/regdef.h b/lib/ultralib/include/sys/regdef.h new file mode 100644 index 0000000..ac9c109 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/ultra64.h b/lib/ultralib/include/ultra64.h new file mode 100644 index 0000000..053db38 --- /dev/null +++ b/lib/ultralib/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/ultralib/include/ultrahost.h b/lib/ultralib/include/ultrahost.h new file mode 100644 index 0000000..2c50b95 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/audio/Makefile b/lib/ultralib/src/audio/Makefile new file mode 100644 index 0000000..d8fdce4 --- /dev/null +++ b/lib/ultralib/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/src/libultra/al/auxbus.c b/lib/ultralib/src/audio/auxbus.c similarity index 100% rename from src/libultra/al/auxbus.c rename to lib/ultralib/src/audio/auxbus.c diff --git a/src/libultra/al/bnkf.c b/lib/ultralib/src/audio/bnkf.c similarity index 100% rename from src/libultra/al/bnkf.c rename to lib/ultralib/src/audio/bnkf.c diff --git a/lib/ultralib/src/audio/cents2ratio.c b/lib/ultralib/src/audio/cents2ratio.c new file mode 100644 index 0000000..55cd2a3 --- /dev/null +++ b/lib/ultralib/src/audio/cents2ratio.c @@ -0,0 +1,33 @@ +/* + * 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/src/libultra/al/copy.c b/lib/ultralib/src/audio/copy.c similarity index 99% rename from src/libultra/al/copy.c rename to lib/ultralib/src/audio/copy.c index e1d7955..e80a8df 100644 --- a/src/libultra/al/copy.c +++ b/lib/ultralib/src/audio/copy.c @@ -32,3 +32,4 @@ void alCopy(void *src, void *dest, s32 len) *d++ = *s++; } } + diff --git a/lib/ultralib/src/audio/cseq.c b/lib/ultralib/src/audio/cseq.c new file mode 100644 index 0000000..9c4b8bd --- /dev/null +++ b/lib/ultralib/src/audio/cseq.c @@ -0,0 +1,409 @@ +/*==================================================================== + * 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/ultralib/src/audio/cseq.h b/lib/ultralib/src/audio/cseq.h new file mode 100644 index 0000000..0342398 --- /dev/null +++ b/lib/ultralib/src/audio/cseq.h @@ -0,0 +1,11 @@ + + + +#ifndef __cseq__ +#define __cseq__ + + +char __alCSeqNextDelta(ALCSeq *seq, s32 *pDeltaTicks); + + +#endif /* __cseq__ */ diff --git a/lib/ultralib/src/audio/cseqp.h b/lib/ultralib/src/audio/cseqp.h new file mode 100644 index 0000000..bb72541 --- /dev/null +++ b/lib/ultralib/src/audio/cseqp.h @@ -0,0 +1,10 @@ + + +#ifndef __cseqp__ +#define __cseqp__ + + +void __CSPPostNextSeqEvent(ALCSPlayer *seqp); + + +#endif /* __cseqp__ */ diff --git a/lib/ultralib/src/audio/cspdelete.c b/lib/ultralib/src/audio/cspdelete.c new file mode 100644 index 0000000..063c543 --- /dev/null +++ b/lib/ultralib/src/audio/cspdelete.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetchlvol.c b/lib/ultralib/src/audio/cspgetchlvol.c new file mode 100644 index 0000000..23d256e --- /dev/null +++ b/lib/ultralib/src/audio/cspgetchlvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetfxmix.c b/lib/ultralib/src/audio/cspgetfxmix.c new file mode 100644 index 0000000..c67e033 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetfxmix.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetpan.c b/lib/ultralib/src/audio/cspgetpan.c new file mode 100644 index 0000000..5c0e322 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetpan.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetpriority.c b/lib/ultralib/src/audio/cspgetpriority.c new file mode 100644 index 0000000..ac38cae --- /dev/null +++ b/lib/ultralib/src/audio/cspgetpriority.c @@ -0,0 +1,26 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetprogram.c b/lib/ultralib/src/audio/cspgetprogram.c new file mode 100644 index 0000000..382616f --- /dev/null +++ b/lib/ultralib/src/audio/cspgetprogram.c @@ -0,0 +1,42 @@ +/*==================================================================== + * 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; iinstCount; i++){ + inst = b->instArray[i]; + if (inst == s.instrument) + return i; + } + return(-1); + +} + diff --git a/lib/ultralib/src/audio/cspgetseq.c b/lib/ultralib/src/audio/cspgetseq.c new file mode 100644 index 0000000..85d2545 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetseq.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetstate.c b/lib/ultralib/src/audio/cspgetstate.c new file mode 100644 index 0000000..9be7937 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetstate.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgettempo.c b/lib/ultralib/src/audio/cspgettempo.c new file mode 100644 index 0000000..ed3dfe2 --- /dev/null +++ b/lib/ultralib/src/audio/cspgettempo.c @@ -0,0 +1,31 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspgetvol.c b/lib/ultralib/src/audio/cspgetvol.c new file mode 100644 index 0000000..5353228 --- /dev/null +++ b/lib/ultralib/src/audio/cspgetvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/csplayer.c b/lib/ultralib/src/audio/csplayer.c new file mode 100644 index 0000000..5cd3df6 --- /dev/null +++ b/lib/ultralib/src/audio/csplayer.c @@ -0,0 +1,882 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspplay.c b/lib/ultralib/src/audio/cspplay.c new file mode 100644 index 0000000..e34914c --- /dev/null +++ b/lib/ultralib/src/audio/cspplay.c @@ -0,0 +1,34 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsendmidi.c b/lib/ultralib/src/audio/cspsendmidi.c new file mode 100644 index 0000000..3d03c9b --- /dev/null +++ b/lib/ultralib/src/audio/cspsendmidi.c @@ -0,0 +1,40 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetbank.c b/lib/ultralib/src/audio/cspsetbank.c new file mode 100644 index 0000000..63292b4 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetbank.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetchlvol.c b/lib/ultralib/src/audio/cspsetchlvol.c new file mode 100644 index 0000000..28e62bb --- /dev/null +++ b/lib/ultralib/src/audio/cspsetchlvol.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetfxmix.c b/lib/ultralib/src/audio/cspsetfxmix.c new file mode 100644 index 0000000..f099297 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetfxmix.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetpan.c b/lib/ultralib/src/audio/cspsetpan.c new file mode 100644 index 0000000..c0dab00 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetpan.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetpriority.c b/lib/ultralib/src/audio/cspsetpriority.c new file mode 100644 index 0000000..b449b82 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetpriority.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetprogram.c b/lib/ultralib/src/audio/cspsetprogram.c new file mode 100644 index 0000000..2b19e63 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetprogram.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetseq.c b/lib/ultralib/src/audio/cspsetseq.c new file mode 100644 index 0000000..4b6718e --- /dev/null +++ b/lib/ultralib/src/audio/cspsetseq.c @@ -0,0 +1,34 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsettempo.c b/lib/ultralib/src/audio/cspsettempo.c new file mode 100644 index 0000000..b085b45 --- /dev/null +++ b/lib/ultralib/src/audio/cspsettempo.c @@ -0,0 +1,36 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspsetvol.c b/lib/ultralib/src/audio/cspsetvol.c new file mode 100644 index 0000000..6782f33 --- /dev/null +++ b/lib/ultralib/src/audio/cspsetvol.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/cspstop.c b/lib/ultralib/src/audio/cspstop.c new file mode 100644 index 0000000..9929820 --- /dev/null +++ b/lib/ultralib/src/audio/cspstop.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/src/libultra/al/drvrNew.c b/lib/ultralib/src/audio/drvrnew.c similarity index 99% rename from src/libultra/al/drvrNew.c rename to lib/ultralib/src/audio/drvrnew.c index f5e2ba2..7ca2e10 100644 --- a/src/libultra/al/drvrNew.c +++ b/lib/ultralib/src/audio/drvrnew.c @@ -17,15 +17,13 @@ * 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!!! diff --git a/src/libultra/al/env.c b/lib/ultralib/src/audio/env.c similarity index 98% rename from src/libultra/al/env.c rename to lib/ultralib/src/audio/env.c index 3453afa..fda20f4 100644 --- a/src/libultra/al/env.c +++ b/lib/ultralib/src/audio/env.c @@ -17,23 +17,20 @@ * 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, @@ -96,19 +93,19 @@ Acmd *alEnvmixerPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset, */ inp = AL_RESAMPLER_OUT; - while (e->ctrlList != 0) { - + while (e->ctrlList != 0) { lastOffset = thisOffset; thisOffset = e->ctrlList->delta; samples = thisOffset - lastOffset; if (samples > outCount) break; - -#ifdef _DEBUG +#if BUILD_VERSION < VERSION_J +#line 103 +#endif assert(samples >= 0); assert(samples <= AL_MAX_RSP_SAMPLES); -#endif - + + switch (e->ctrlList->type) { case (AL_FILTER_START_VOICE_ALT): { @@ -310,8 +307,7 @@ Acmd *alEnvmixerPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset, return ptr; } -s32 -alEnvmixerParam(void *filter, s32 paramID, void *param) +s32 alEnvmixerParam(void *filter, s32 paramID, void *param) { ALFilter *f = (ALFilter *) filter; ALEnvMixer *e = (ALEnvMixer *) filter; @@ -352,9 +348,10 @@ alEnvmixerParam(void *filter, s32 paramID, void *param) } return 0; } - -static -Acmd* _pullSubFrame(void *filter, s16 *inp, s16 *outp, s32 outCount, +#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; @@ -369,9 +366,9 @@ Acmd* _pullSubFrame(void *filter, s16 *inp, s16 *outp, s32 outCount, * ask all filters upstream from us to build their command * lists. */ -#ifdef _DEBUG + assert(source); -#endif + ptr = (*source->handler)(source, inp, outCount, sampleOffset, p); diff --git a/lib/ultralib/src/audio/event.c b/lib/ultralib/src/audio/event.c new file mode 100644 index 0000000..3112c99 --- /dev/null +++ b/lib/ultralib/src/audio/event.c @@ -0,0 +1,272 @@ +/*==================================================================== + * 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/src/libultra/al/filter.c b/lib/ultralib/src/audio/filter.c similarity index 100% rename from src/libultra/al/filter.c rename to lib/ultralib/src/audio/filter.c diff --git a/src/libultra/al/heapalloc.c b/lib/ultralib/src/audio/heapalloc.c similarity index 100% rename from src/libultra/al/heapalloc.c rename to lib/ultralib/src/audio/heapalloc.c diff --git a/lib/ultralib/src/audio/heapcheck.c b/lib/ultralib/src/audio/heapcheck.c new file mode 100644 index 0000000..baae643 --- /dev/null +++ b/lib/ultralib/src/audio/heapcheck.c @@ -0,0 +1,71 @@ +/*==================================================================== + * 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/src/libultra/al/heapinit.c b/lib/ultralib/src/audio/heapinit.c similarity index 100% rename from src/libultra/al/heapinit.c rename to lib/ultralib/src/audio/heapinit.c diff --git a/lib/ultralib/src/audio/initfx.h b/lib/ultralib/src/audio/initfx.h new file mode 100644 index 0000000..704e1f4 --- /dev/null +++ b/lib/ultralib/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/src/libultra/al/load.c b/lib/ultralib/src/audio/load.c similarity index 100% rename from src/libultra/al/load.c rename to lib/ultralib/src/audio/load.c diff --git a/src/libultra/al/mainbus.c b/lib/ultralib/src/audio/mainbus.c similarity index 100% rename from src/libultra/al/mainbus.c rename to lib/ultralib/src/audio/mainbus.c diff --git a/lib/ultralib/src/audio/parse_abi.c b/lib/ultralib/src/audio/parse_abi.c new file mode 100644 index 0000000..f1fd37d --- /dev/null +++ b/lib/ultralib/src/audio/parse_abi.c @@ -0,0 +1,47 @@ +#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/src/libultra/al/resample.c b/lib/ultralib/src/audio/resample.c similarity index 99% rename from src/libultra/al/resample.c rename to lib/ultralib/src/audio/resample.c index 776c015..2baf26f 100644 --- a/src/libultra/al/resample.c +++ b/lib/ultralib/src/audio/resample.c @@ -21,6 +21,7 @@ #include #include "synthInternals.h" #include +#include // TODO: this comes from a header #ident "$Revision: 1.49 $" diff --git a/src/libultra/al/reverb.c b/lib/ultralib/src/audio/reverb.c similarity index 98% rename from src/libultra/al/reverb.c rename to lib/ultralib/src/audio/reverb.c index a4bcecf..f5158c3 100644 --- a/src/libultra/al/reverb.c +++ b/lib/ultralib/src/audio/reverb.c @@ -8,7 +8,6 @@ * 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 @@ -17,15 +16,17 @@ * 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; @@ -44,6 +45,7 @@ extern u32 load_num, load_cnt, load_max, load_min, save_num, save_cnt, save_max, 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); @@ -68,8 +70,11 @@ Acmd *alFxPull(void *filter, s16 *outp, s32 outCount, s32 sampleOffset, #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 */ diff --git a/src/libultra/al/save.c b/lib/ultralib/src/audio/save.c similarity index 98% rename from src/libultra/al/save.c rename to lib/ultralib/src/audio/save.c index bc15294..59bd09b 100644 --- a/src/libultra/al/save.c +++ b/lib/ultralib/src/audio/save.c @@ -3,7 +3,6 @@ * * 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, @@ -17,26 +16,24 @@ * 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; - -#ifdef _DEBUG - assert(f->filter.source); +#if BUILD_VERSION < VERSION_J +#line 33 #endif + assert(f->filter.source); + ptr = (*source->handler)(source, outp, outCount, sampleOffset, ptr); diff --git a/lib/ultralib/src/audio/seq.c b/lib/ultralib/src/audio/seq.c new file mode 100644 index 0000000..5da5b11 --- /dev/null +++ b/lib/ultralib/src/audio/seq.c @@ -0,0 +1,343 @@ +/*==================================================================== + * 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/ultralib/src/audio/seq.h b/lib/ultralib/src/audio/seq.h new file mode 100644 index 0000000..479b339 --- /dev/null +++ b/lib/ultralib/src/audio/seq.h @@ -0,0 +1,9 @@ + + +#ifndef __seq__ +#define __seq__ + +char __alSeqNextDelta (ALSeq *seq, s32 *pDeltaTicks); + + +#endif /* __seq__ */ diff --git a/lib/ultralib/src/audio/seqp.h b/lib/ultralib/src/audio/seqp.h new file mode 100644 index 0000000..c9ab02b --- /dev/null +++ b/lib/ultralib/src/audio/seqp.h @@ -0,0 +1,37 @@ + + +#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/ultralib/src/audio/seqpdelete.c b/lib/ultralib/src/audio/seqpdelete.c new file mode 100644 index 0000000..142f190 --- /dev/null +++ b/lib/ultralib/src/audio/seqpdelete.c @@ -0,0 +1,39 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetchlvol.c b/lib/ultralib/src/audio/seqpgetchlvol.c new file mode 100644 index 0000000..e205651 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetchlvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetfxmix.c b/lib/ultralib/src/audio/seqpgetfxmix.c new file mode 100644 index 0000000..5d7ee3f --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetfxmix.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetpan.c b/lib/ultralib/src/audio/seqpgetpan.c new file mode 100644 index 0000000..23f1067 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetpan.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetpriority.c b/lib/ultralib/src/audio/seqpgetpriority.c new file mode 100644 index 0000000..e6f77a4 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetpriority.c @@ -0,0 +1,26 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetprogram.c b/lib/ultralib/src/audio/seqpgetprogram.c new file mode 100644 index 0000000..d421cde --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetprogram.c @@ -0,0 +1,42 @@ +/*==================================================================== + * 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; iinstCount; i++){ + inst = b->instArray[i]; + if (inst == s.instrument) + return i; + } + return(-1); + +} + diff --git a/lib/ultralib/src/audio/seqpgetseq.c b/lib/ultralib/src/audio/seqpgetseq.c new file mode 100644 index 0000000..d35ea19 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetseq.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetstate.c b/lib/ultralib/src/audio/seqpgetstate.c new file mode 100644 index 0000000..8d36b49 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetstate.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgettempo.c b/lib/ultralib/src/audio/seqpgettempo.c new file mode 100644 index 0000000..41cd4b4 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgettempo.c @@ -0,0 +1,31 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpgetvol.c b/lib/ultralib/src/audio/seqpgetvol.c new file mode 100644 index 0000000..43a3bb8 --- /dev/null +++ b/lib/ultralib/src/audio/seqpgetvol.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqplayer.c b/lib/ultralib/src/audio/seqplayer.c new file mode 100644 index 0000000..9d77a6f --- /dev/null +++ b/lib/ultralib/src/audio/seqplayer.c @@ -0,0 +1,1228 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqploop.c b/lib/ultralib/src/audio/seqploop.c new file mode 100644 index 0000000..9bbaf5f --- /dev/null +++ b/lib/ultralib/src/audio/seqploop.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpplay.c b/lib/ultralib/src/audio/seqpplay.c new file mode 100644 index 0000000..8e65504 --- /dev/null +++ b/lib/ultralib/src/audio/seqpplay.c @@ -0,0 +1,48 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsendmidi.c b/lib/ultralib/src/audio/seqpsendmidi.c new file mode 100644 index 0000000..56a9510 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsendmidi.c @@ -0,0 +1,40 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetbank.c b/lib/ultralib/src/audio/seqpsetbank.c new file mode 100644 index 0000000..1c00e8b --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetbank.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetchlvol.c b/lib/ultralib/src/audio/seqpsetchlvol.c new file mode 100644 index 0000000..9b48803 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetchlvol.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetfxmix.c b/lib/ultralib/src/audio/seqpsetfxmix.c new file mode 100644 index 0000000..9397963 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetfxmix.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetpan.c b/lib/ultralib/src/audio/seqpsetpan.c new file mode 100644 index 0000000..85d07d9 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetpan.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetpriority.c b/lib/ultralib/src/audio/seqpsetpriority.c new file mode 100644 index 0000000..0910726 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetpriority.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetprogram.c b/lib/ultralib/src/audio/seqpsetprogram.c new file mode 100644 index 0000000..dfd6d94 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetprogram.c @@ -0,0 +1,36 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetseq.c b/lib/ultralib/src/audio/seqpsetseq.c new file mode 100644 index 0000000..3fe8175 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetseq.c @@ -0,0 +1,34 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsettempo.c b/lib/ultralib/src/audio/seqpsettempo.c new file mode 100644 index 0000000..592320a --- /dev/null +++ b/lib/ultralib/src/audio/seqpsettempo.c @@ -0,0 +1,36 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpsetvol.c b/lib/ultralib/src/audio/seqpsetvol.c new file mode 100644 index 0000000..b698a40 --- /dev/null +++ b/lib/ultralib/src/audio/seqpsetvol.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/seqpstop.c b/lib/ultralib/src/audio/seqpstop.c new file mode 100644 index 0000000..abec781 --- /dev/null +++ b/lib/ultralib/src/audio/seqpstop.c @@ -0,0 +1,33 @@ +/*==================================================================== + * 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/ultralib/src/audio/sl.c b/lib/ultralib/src/audio/sl.c new file mode 100644 index 0000000..d184972 --- /dev/null +++ b/lib/ultralib/src/audio/sl.c @@ -0,0 +1,65 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndp.h b/lib/ultralib/src/audio/sndp.h new file mode 100644 index 0000000..17d7015 --- /dev/null +++ b/lib/ultralib/src/audio/sndp.h @@ -0,0 +1,102 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpallocate.c b/lib/ultralib/src/audio/sndpallocate.c new file mode 100644 index 0000000..0629ac7 --- /dev/null +++ b/lib/ultralib/src/audio/sndpallocate.c @@ -0,0 +1,43 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpdeallocate.c b/lib/ultralib/src/audio/sndpdeallocate.c new file mode 100644 index 0000000..7c18b56 --- /dev/null +++ b/lib/ultralib/src/audio/sndpdeallocate.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpdelete.c b/lib/ultralib/src/audio/sndpdelete.c new file mode 100644 index 0000000..5cfb4f7 --- /dev/null +++ b/lib/ultralib/src/audio/sndpdelete.c @@ -0,0 +1,44 @@ +/*==================================================================== + * 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; imaxSounds; i++) + if ((sState + i)->state != AL_STOPPED) + notStopped = 1; + ALFailIf(notStopped, ERR_ALSNDPDELETE); + } +#endif + alSynRemovePlayer(&alGlobals->drvr, &sndp->node); +} + diff --git a/lib/ultralib/src/audio/sndpgetsound.c b/lib/ultralib/src/audio/sndpgetsound.c new file mode 100644 index 0000000..9088982 --- /dev/null +++ b/lib/ultralib/src/audio/sndpgetsound.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpgetstate.c b/lib/ultralib/src/audio/sndpgetstate.c new file mode 100644 index 0000000..882b4a3 --- /dev/null +++ b/lib/ultralib/src/audio/sndpgetstate.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndplayer.c b/lib/ultralib/src/audio/sndplayer.c new file mode 100644 index 0000000..f2d7b56 --- /dev/null +++ b/lib/ultralib/src/audio/sndplayer.c @@ -0,0 +1,297 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpplay.c b/lib/ultralib/src/audio/sndpplay.c new file mode 100644 index 0000000..ff5d123 --- /dev/null +++ b/lib/ultralib/src/audio/sndpplay.c @@ -0,0 +1,36 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpplayat.c b/lib/ultralib/src/audio/sndpplayat.c new file mode 100644 index 0000000..b37f796 --- /dev/null +++ b/lib/ultralib/src/audio/sndpplayat.c @@ -0,0 +1,32 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpsetfxmix.c b/lib/ultralib/src/audio/sndpsetfxmix.c new file mode 100644 index 0000000..147c956 --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetfxmix.c @@ -0,0 +1,42 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpsetpan.c b/lib/ultralib/src/audio/sndpsetpan.c new file mode 100644 index 0000000..5f98648 --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetpan.c @@ -0,0 +1,42 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpsetpitch.c b/lib/ultralib/src/audio/sndpsetpitch.c new file mode 100644 index 0000000..0ee174c --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetpitch.c @@ -0,0 +1,48 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpsetpriority.c b/lib/ultralib/src/audio/sndpsetpriority.c new file mode 100644 index 0000000..0d0fbc0 --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetpriority.c @@ -0,0 +1,38 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpsetsound.c b/lib/ultralib/src/audio/sndpsetsound.c new file mode 100644 index 0000000..3d341ec --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetsound.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 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/ultralib/src/audio/sndpsetvol.c b/lib/ultralib/src/audio/sndpsetvol.c new file mode 100644 index 0000000..ad79f5f --- /dev/null +++ b/lib/ultralib/src/audio/sndpsetvol.c @@ -0,0 +1,42 @@ +/*==================================================================== + * 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/ultralib/src/audio/sndpstop.c b/lib/ultralib/src/audio/sndpstop.c new file mode 100644 index 0000000..69aead6 --- /dev/null +++ b/lib/ultralib/src/audio/sndpstop.c @@ -0,0 +1,35 @@ +/*==================================================================== + * 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/ultralib/src/audio/synaddplayer.c b/lib/ultralib/src/audio/synaddplayer.c new file mode 100644 index 0000000..77efb29 --- /dev/null +++ b/lib/ultralib/src/audio/synaddplayer.c @@ -0,0 +1,34 @@ +/*==================================================================== + * 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/src/libultra/al/synallocfx.c b/lib/ultralib/src/audio/synallocfx.c similarity index 99% rename from src/libultra/al/synallocfx.c rename to lib/ultralib/src/audio/synallocfx.c index 5831062..e0e7f26 100644 --- a/src/libultra/al/synallocfx.c +++ b/lib/ultralib/src/audio/synallocfx.c @@ -29,3 +29,4 @@ ALFxRef *alSynAllocFX(ALSynth *s, s16 bus, ALSynConfig *c, ALHeap *hp) return (ALFxRef)(&s->auxBus[bus].fx[0]); } + diff --git a/lib/ultralib/src/audio/synallocvoice.c b/lib/ultralib/src/audio/synallocvoice.c new file mode 100644 index 0000000..73d608d --- /dev/null +++ b/lib/ultralib/src/audio/synallocvoice.c @@ -0,0 +1,132 @@ +/*==================================================================== + * 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/src/libultra/al/syndelete.c b/lib/ultralib/src/audio/syndelete.c similarity index 99% rename from src/libultra/al/syndelete.c rename to lib/ultralib/src/audio/syndelete.c index 74abaa4..900fe76 100644 --- a/src/libultra/al/syndelete.c +++ b/lib/ultralib/src/audio/syndelete.c @@ -24,3 +24,4 @@ void alSynDelete(ALSynth *drvr) { drvr->head = 0; } + diff --git a/lib/ultralib/src/audio/synfreefx.c b/lib/ultralib/src/audio/synfreefx.c new file mode 100644 index 0000000..be436ea --- /dev/null +++ b/lib/ultralib/src/audio/synfreefx.c @@ -0,0 +1,26 @@ +/*==================================================================== + * 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/ultralib/src/audio/synfreevoice.c b/lib/ultralib/src/audio/synfreevoice.c new file mode 100644 index 0000000..eaa71ac --- /dev/null +++ b/lib/ultralib/src/audio/synfreevoice.c @@ -0,0 +1,54 @@ +/*==================================================================== + * 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/ultralib/src/audio/syngetfxref.c b/lib/ultralib/src/audio/syngetfxref.c new file mode 100644 index 0000000..b0fa577 --- /dev/null +++ b/lib/ultralib/src/audio/syngetfxref.c @@ -0,0 +1,33 @@ +/*==================================================================== + * 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/ultralib/src/audio/syngetpriority.c b/lib/ultralib/src/audio/syngetpriority.c new file mode 100644 index 0000000..68de365 --- /dev/null +++ b/lib/ultralib/src/audio/syngetpriority.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/synremoveplayer.c b/lib/ultralib/src/audio/synremoveplayer.c new file mode 100644 index 0000000..0248a7e --- /dev/null +++ b/lib/ultralib/src/audio/synremoveplayer.c @@ -0,0 +1,49 @@ +/*==================================================================== + * 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/ultralib/src/audio/synsetfxmix.c b/lib/ultralib/src/audio/synsetfxmix.c new file mode 100644 index 0000000..c787103 --- /dev/null +++ b/lib/ultralib/src/audio/synsetfxmix.c @@ -0,0 +1,60 @@ +/*==================================================================== + * 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/ultralib/src/audio/synsetfxparam.c b/lib/ultralib/src/audio/synsetfxparam.c new file mode 100644 index 0000000..b3991f6 --- /dev/null +++ b/lib/ultralib/src/audio/synsetfxparam.c @@ -0,0 +1,29 @@ +/*==================================================================== + * 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/ultralib/src/audio/synsetpan.c b/lib/ultralib/src/audio/synsetpan.c new file mode 100644 index 0000000..0d68538 --- /dev/null +++ b/lib/ultralib/src/audio/synsetpan.c @@ -0,0 +1,50 @@ +/*==================================================================== + * 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/ultralib/src/audio/synsetpitch.c b/lib/ultralib/src/audio/synsetpitch.c new file mode 100644 index 0000000..0bfb7ba --- /dev/null +++ b/lib/ultralib/src/audio/synsetpitch.c @@ -0,0 +1,50 @@ +/*==================================================================== + * 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/ultralib/src/audio/synsetpriority.c b/lib/ultralib/src/audio/synsetpriority.c new file mode 100644 index 0000000..c680bcc --- /dev/null +++ b/lib/ultralib/src/audio/synsetpriority.c @@ -0,0 +1,27 @@ +/*==================================================================== + * 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/ultralib/src/audio/synsetvol.c b/lib/ultralib/src/audio/synsetvol.c new file mode 100644 index 0000000..181c96f --- /dev/null +++ b/lib/ultralib/src/audio/synsetvol.c @@ -0,0 +1,50 @@ +/*==================================================================== + * 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/ultralib/src/audio/synstartvoice.c b/lib/ultralib/src/audio/synstartvoice.c new file mode 100644 index 0000000..9ad1d89 --- /dev/null +++ b/lib/ultralib/src/audio/synstartvoice.c @@ -0,0 +1,48 @@ +/*==================================================================== + * 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/ultralib/src/audio/synstartvoiceparam.c b/lib/ultralib/src/audio/synstartvoiceparam.c new file mode 100644 index 0000000..8d1a54b --- /dev/null +++ b/lib/ultralib/src/audio/synstartvoiceparam.c @@ -0,0 +1,75 @@ +/*==================================================================== + * 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/ultralib/src/audio/synstopvoice.c b/lib/ultralib/src/audio/synstopvoice.c new file mode 100644 index 0000000..69c09d8 --- /dev/null +++ b/lib/ultralib/src/audio/synstopvoice.c @@ -0,0 +1,44 @@ +/*==================================================================== + * 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/ultralib/src/audio/synthInternals.h b/lib/ultralib/src/audio/synthInternals.h new file mode 100644 index 0000000..c6c476c --- /dev/null +++ b/lib/ultralib/src/audio/synthInternals.h @@ -0,0 +1,344 @@ +/*==================================================================== + * 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/src/libultra/al/synthesizer.c b/lib/ultralib/src/audio/synthesizer.c similarity index 98% rename from src/libultra/al/synthesizer.c rename to lib/ultralib/src/audio/synthesizer.c index d42a21a..9123874 100644 --- a/src/libultra/al/synthesizer.c +++ b/lib/ultralib/src/audio/synthesizer.c @@ -3,12 +3,10 @@ * * 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 @@ -17,10 +15,9 @@ * 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 $" @@ -284,7 +281,6 @@ void _freePVoice(ALSynth *drvr, PVoice *pvoice) alLink((ALLink *)pvoice, &drvr->pLameList); } - /* Add 0.5 to adjust the average affect of the truncation error produced by casting @@ -306,10 +302,10 @@ static s32 __nextSampleTime(ALSynth *drvr, ALPlayer **client) { ALMicroTime delta = 0x7fffffff; /* max delta for s32 */ ALPlayer *cl; - -#ifdef _DEBUG - assert(drvr->head); +#if BUILD_VERSION < VERSION_J // Adjust line numbers to match assert +#line 306 #endif + assert(drvr->head); *client = 0; diff --git a/lib/ultralib/src/debug/assert.c b/lib/ultralib/src/debug/assert.c new file mode 100644 index 0000000..ab7e313 --- /dev/null +++ b/lib/ultralib/src/debug/assert.c @@ -0,0 +1,12 @@ +#include "os.h" +#include "../os/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/ultralib/src/debug/assertbreak.s b/lib/ultralib/src/debug/assertbreak.s new file mode 100644 index 0000000..69de71d --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/atomic.c b/lib/ultralib/src/debug/atomic.c new file mode 100644 index 0000000..a0bd8fe --- /dev/null +++ b/lib/ultralib/src/debug/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/ultralib/src/debug/kdebugserver.c b/lib/ultralib/src/debug/kdebugserver.c new file mode 100644 index 0000000..948a460 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/osint_debug.h b/lib/ultralib/src/debug/osint_debug.h new file mode 100644 index 0000000..6d644f2 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/profile.c b/lib/ultralib/src/debug/profile.c new file mode 100644 index 0000000..47b19d8 --- /dev/null +++ b/lib/ultralib/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 "../os/osint.h" +#include "macros.h" +#include "osint_debug.h" + +#ifndef _FINALROM + +OSTimer __osProfTimer; +OSMesg __osProfTimerMsg; + +OSMesgQueue __osProfFlushMQ ALIGNED(8); +OSMesg __osProfFlushMesg; + +OSMesgQueue __osProfAckMQ ALIGNED(8); +OSMesg __osProfAckMesg; + +u32 __osProfTimerPeriod; + +u32 __osProfNumSections; + +static u32 __osProfileActive = FALSE; +static u32 __osProfileIOActive = FALSE; + +unsigned char __osProfileIOStack[2400] ALIGNED(16); + +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, &__osProfileIOStack[2400], 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/ultralib/src/debug/threadprofile.c b/lib/ultralib/src/debug/threadprofile.c new file mode 100644 index 0000000..e383773 --- /dev/null +++ b/lib/ultralib/src/debug/threadprofile.c @@ -0,0 +1,22 @@ +#include "osint_debug.h" + +#include "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/ultralib/src/debug/threadprofileclear.c b/lib/ultralib/src/debug/threadprofileclear.c new file mode 100644 index 0000000..42788f8 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/threadprofileinit.c b/lib/ultralib/src/debug/threadprofileinit.c new file mode 100644 index 0000000..7fef229 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/threadprofilereadcount.c b/lib/ultralib/src/debug/threadprofilereadcount.c new file mode 100644 index 0000000..3237987 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/threadprofilereadtime.c b/lib/ultralib/src/debug/threadprofilereadtime.c new file mode 100644 index 0000000..9930cac --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/threadprofilestart.c b/lib/ultralib/src/debug/threadprofilestart.c new file mode 100644 index 0000000..3ef8fa7 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/debug/threadprofilestop.c b/lib/ultralib/src/debug/threadprofilestop.c new file mode 100644 index 0000000..4803620 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/error/commonerror.c b/lib/ultralib/src/error/commonerror.c new file mode 100644 index 0000000..5a6f1c9 --- /dev/null +++ b/lib/ultralib/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 "macros.h" +#include "stdarg.h" + +#ifndef _FINALROM + +void __osSyncVPrintf(const char* fmt, va_list args); + +static u32 errorLogData[19] ALIGNED(8); +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[] = { '\0' }; + +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/ultralib/src/error/error.c b/lib/ultralib/src/error/error.c new file mode 100644 index 0000000..3f9ae2d --- /dev/null +++ b/lib/ultralib/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 "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(8); +static OSLog errorLog ALIGNED(8) = { + 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/ultralib/src/error/errorasm.s b/lib/ultralib/src/error/errorasm.s new file mode 100644 index 0000000..10f3561 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashallerase.c b/lib/ultralib/src/flash/flashallerase.c new file mode 100644 index 0000000..0e982a5 --- /dev/null +++ b/lib/ultralib/src/flash/flashallerase.c @@ -0,0 +1,33 @@ +#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/ultralib/src/flash/flashallerasethrough.c b/lib/ultralib/src/flash/flashallerasethrough.c new file mode 100644 index 0000000..1c3c1dd --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashchange.c b/lib/ultralib/src/flash/flashchange.c new file mode 100644 index 0000000..d92ff7b --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashcheckeraseend.c b/lib/ultralib/src/flash/flashcheckeraseend.c new file mode 100644 index 0000000..c87876b --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashclearstatus.c b/lib/ultralib/src/flash/flashclearstatus.c new file mode 100644 index 0000000..86165d6 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashgetaddr.c b/lib/ultralib/src/flash/flashgetaddr.c new file mode 100644 index 0000000..a530947 --- /dev/null +++ b/lib/ultralib/src/flash/flashgetaddr.c @@ -0,0 +1,15 @@ +#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/ultralib/src/flash/flashinit.c b/lib/ultralib/src/flash/flashinit.c new file mode 100644 index 0000000..33c7dc3 --- /dev/null +++ b/lib/ultralib/src/flash/flashinit.c @@ -0,0 +1,44 @@ +#include "ultra64.h" +#include "PR/os_internal_flash.h" +#include "macros.h" + +u32 __osFlashID[4] ALIGNED(8); +OSIoMesg __osFlashMsg ALIGNED(8); +OSMesgQueue __osFlashMessageQ ALIGNED(8); +OSPiHandle __osFlashHandler ALIGNED(8); +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/ultralib/src/flash/flashreadarray.c b/lib/ultralib/src/flash/flashreadarray.c new file mode 100644 index 0000000..543f236 --- /dev/null +++ b/lib/ultralib/src/flash/flashreadarray.c @@ -0,0 +1,51 @@ +#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/ultralib/src/flash/flashreadid.c b/lib/ultralib/src/flash/flashreadid.c new file mode 100644 index 0000000..3112d74 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashreadstatus.c b/lib/ultralib/src/flash/flashreadstatus.c new file mode 100644 index 0000000..6ff5560 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashreinit.c b/lib/ultralib/src/flash/flashreinit.c new file mode 100644 index 0000000..b2ab93d --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashsectorerase.c b/lib/ultralib/src/flash/flashsectorerase.c new file mode 100644 index 0000000..14a0583 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashsectorerasethrough.c b/lib/ultralib/src/flash/flashsectorerasethrough.c new file mode 100644 index 0000000..474ee96 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashwritearray.c b/lib/ultralib/src/flash/flashwritearray.c new file mode 100644 index 0000000..d5f56a0 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/flash/flashwritebuffer.c b/lib/ultralib/src/flash/flashwritebuffer.c new file mode 100644 index 0000000..ad3f790 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/gio/giointerrupt.c b/lib/ultralib/src/gio/giointerrupt.c new file mode 100644 index 0000000..3abc04f --- /dev/null +++ b/lib/ultralib/src/gio/giointerrupt.c @@ -0,0 +1,8 @@ +#include "PR/os_internal.h" +#include "../io/piint.h" + +void __osGIOInterrupt(s32 value) { + __osPiGetAccess(); + __osGIORawInterrupt(value); + __osPiRelAccess(); +} diff --git a/lib/ultralib/src/gio/giorawinterrupt.c b/lib/ultralib/src/gio/giorawinterrupt.c new file mode 100644 index 0000000..2fdc909 --- /dev/null +++ b/lib/ultralib/src/gio/giorawinterrupt.c @@ -0,0 +1,13 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/gt/Makefile b/lib/ultralib/src/gt/Makefile new file mode 100644 index 0000000..b0868fd --- /dev/null +++ b/lib/ultralib/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/ultralib/src/gt/dumpturbo.c b/lib/ultralib/src/gt/dumpturbo.c new file mode 100644 index 0000000..02c0e63 --- /dev/null +++ b/lib/ultralib/src/gt/dumpturbo.c @@ -0,0 +1,260 @@ + +/************************************************************************** + * * + * 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 "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(8); +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/ultralib/src/gt/gt.c b/lib/ultralib/src/gt/gt.c new file mode 100644 index 0000000..bf99e85 --- /dev/null +++ b/lib/ultralib/src/gt/gt.c @@ -0,0 +1,155 @@ + +/* + * 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/ultralib/src/gt/gtint.h b/lib/ultralib/src/gt/gtint.h new file mode 100644 index 0000000..31ddd7c --- /dev/null +++ b/lib/ultralib/src/gt/gtint.h @@ -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. + * + */ + +/* + * 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/ultralib/src/gu/Makefile b/lib/ultralib/src/gu/Makefile new file mode 100644 index 0000000..ad6e2fa --- /dev/null +++ b/lib/ultralib/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/ultralib/src/gu/align.c b/lib/ultralib/src/gu/align.c new file mode 100644 index 0000000..9be7b4a --- /dev/null +++ b/lib/ultralib/src/gu/align.c @@ -0,0 +1,75 @@ +/************************************************************************** + * * + * 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/src/libultra/gu/cosf.c b/lib/ultralib/src/gu/cosf.c similarity index 100% rename from src/libultra/gu/cosf.c rename to lib/ultralib/src/gu/cosf.c diff --git a/lib/ultralib/src/gu/coss.c b/lib/ultralib/src/gu/coss.c new file mode 100644 index 0000000..0d95530 --- /dev/null +++ b/lib/ultralib/src/gu/coss.c @@ -0,0 +1,45 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/dump_gbi.c b/lib/ultralib/src/gu/dump_gbi.c new file mode 100644 index 0000000..a5e5e12 --- /dev/null +++ b/lib/ultralib/src/gu/dump_gbi.c @@ -0,0 +1,274 @@ + +/************************************************************************** + * * + * 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/ultralib/src/gu/frustum.c b/lib/ultralib/src/gu/frustum.c new file mode 100644 index 0000000..4af9c5d --- /dev/null +++ b/lib/ultralib/src/gu/frustum.c @@ -0,0 +1,42 @@ +/************************************************************************** + * * + * 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/src/libultra/gu/guint.h b/lib/ultralib/src/gu/guint.h similarity index 100% rename from src/libultra/gu/guint.h rename to lib/ultralib/src/gu/guint.h diff --git a/lib/ultralib/src/gu/guloadtile_bug.c b/lib/ultralib/src/gu/guloadtile_bug.c new file mode 100644 index 0000000..e16e250 --- /dev/null +++ b/lib/ultralib/src/gu/guloadtile_bug.c @@ -0,0 +1,235 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/libm_vals.s b/lib/ultralib/src/gu/libm_vals.s new file mode 100644 index 0000000..b88ad98 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/gu/loadtextureblockmipmap.c b/lib/ultralib/src/gu/loadtextureblockmipmap.c new file mode 100644 index 0000000..30ffc65 --- /dev/null +++ b/lib/ultralib/src/gu/loadtextureblockmipmap.c @@ -0,0 +1,717 @@ +/************************************************************************** + * * + * 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 "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(8); +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; hh; h++) + { + flip = (h & 1) << 2; /*shift does not depend on txlsize*/ + for (b=0; b> 4); + } + /* add last aligned nibble */ + if (!endUnAligned) *(taddr+((b-1)^flip)) &= (0xf0); + /* pickup trailing bytes */ + for (b=im_bytes; blsize; + taddr += tr_bytes; + } + } + else /* if start aligned */ + { + for (h=0; hh; h++) + { + flip = (h & 1) << 2; /*shift does not depend on txlsize*/ + for (b=0; blsize; + 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) 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) 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 <> (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/ultralib/src/gu/lookat.c b/lib/ultralib/src/gu/lookat.c new file mode 100644 index 0000000..1fadc17 --- /dev/null +++ b/lib/ultralib/src/gu/lookat.c @@ -0,0 +1,83 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/lookathil.c b/lib/ultralib/src/gu/lookathil.c new file mode 100644 index 0000000..a848688 --- /dev/null +++ b/lib/ultralib/src/gu/lookathil.c @@ -0,0 +1,185 @@ +/************************************************************************** + * * + * 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/src/libultra/gu/lookatref.c b/lib/ultralib/src/gu/lookatref.c similarity index 78% rename from src/libultra/gu/lookatref.c rename to lib/ultralib/src/gu/lookatref.c index bce2013..3cd3b65 100644 --- a/src/libultra/gu/lookatref.c +++ b/lib/ultralib/src/gu/lookatref.c @@ -1,4 +1,17 @@ -#include +/************************************************************************** + * * + * 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, diff --git a/lib/ultralib/src/gu/lookatstereo.c b/lib/ultralib/src/gu/lookatstereo.c new file mode 100644 index 0000000..b60ca08 --- /dev/null +++ b/lib/ultralib/src/gu/lookatstereo.c @@ -0,0 +1,111 @@ +/************************************************************************** + * * + * 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/src/libultra/gu/mtxcatf.c b/lib/ultralib/src/gu/mtxcatf.c similarity index 77% rename from src/libultra/gu/mtxcatf.c rename to lib/ultralib/src/gu/mtxcatf.c index af2ae96..6572e0f 100644 --- a/src/libultra/gu/mtxcatf.c +++ b/lib/ultralib/src/gu/mtxcatf.c @@ -1,63 +1,63 @@ - -/* - * 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]; -} - + +/* + * 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/src/libultra/gu/mtxcatl.c b/lib/ultralib/src/gu/mtxcatl.c similarity index 96% rename from src/libultra/gu/mtxcatl.c rename to lib/ultralib/src/gu/mtxcatl.c index 36e3312..3f165bb 100644 --- a/src/libultra/gu/mtxcatl.c +++ b/lib/ultralib/src/gu/mtxcatl.c @@ -31,6 +31,7 @@ */ #include "guint.h" +#include "os_version.h" void guMtxCatL(Mtx *m, Mtx *n, Mtx *res) { @@ -44,6 +45,7 @@ void guMtxCatL(Mtx *m, Mtx *n, Mtx *res) 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]; @@ -52,3 +54,4 @@ void guMtxXFML(Mtx *m, float x, float y, float z, float *ox, float *oy, float *o guMtxXFMF(mf, x, y, z, ox, oy, oz); } +#endif diff --git a/src/libultra/gu/mtxutil.c b/lib/ultralib/src/gu/mtxutil.c similarity index 100% rename from src/libultra/gu/mtxutil.c rename to lib/ultralib/src/gu/mtxutil.c diff --git a/src/libultra/gu/normalize.c b/lib/ultralib/src/gu/normalize.c similarity index 84% rename from src/libultra/gu/normalize.c rename to lib/ultralib/src/gu/normalize.c index b07848b..6884b29 100644 --- a/src/libultra/gu/normalize.c +++ b/lib/ultralib/src/gu/normalize.c @@ -1,23 +1,23 @@ -/************************************************************************** - * * - * 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 guNormalize(float *x, float *y, float *z) -{ - float m; - - m = 1/sqrtf((*x)*(*x) + (*y)*(*y) + (*z)*(*z)); - *x *= m; - *y *= m; - *z *= m; -} +/************************************************************************** + * * + * 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 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/src/libultra/gu/ortho.c b/lib/ultralib/src/gu/ortho.c similarity index 100% rename from src/libultra/gu/ortho.c rename to lib/ultralib/src/gu/ortho.c diff --git a/lib/ultralib/src/gu/parse_gbi.c b/lib/ultralib/src/gu/parse_gbi.c new file mode 100644 index 0000000..d736d4a --- /dev/null +++ b/lib/ultralib/src/gu/parse_gbi.c @@ -0,0 +1,139 @@ + +/************************************************************************** + * * + * 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/ultralib/src/gu/parse_rdp.c b/lib/ultralib/src/gu/parse_rdp.c new file mode 100644 index 0000000..c17c978 --- /dev/null +++ b/lib/ultralib/src/gu/parse_rdp.c @@ -0,0 +1,36 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/parse_string.c b/lib/ultralib/src/gu/parse_string.c new file mode 100644 index 0000000..71a58a8 --- /dev/null +++ b/lib/ultralib/src/gu/parse_string.c @@ -0,0 +1,35 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/perspective.c b/lib/ultralib/src/gu/perspective.c new file mode 100644 index 0000000..be571d4 --- /dev/null +++ b/lib/ultralib/src/gu/perspective.c @@ -0,0 +1,58 @@ + +/************************************************************************** + * * + * 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; + + guMtxIdentF(mf); + + fovy *= 3.1415926 / 180.0; + cot = cosf (fovy/2) / sinf (fovy/2); + + mf[0][0] = cot / aspect; + mf[1][1] = cot; + mf[2][2] = (near + far) / (near - far); + mf[2][3] = -1; + 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; + + 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; + + guPerspectiveF(mf, perspNorm, fovy, aspect, near, far, scale); + + guMtxF2L(mf, m); +} + + diff --git a/lib/ultralib/src/gu/position.c b/lib/ultralib/src/gu/position.c new file mode 100644 index 0000000..52cdd96 --- /dev/null +++ b/lib/ultralib/src/gu/position.c @@ -0,0 +1,73 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/poslight.c b/lib/ultralib/src/gu/poslight.c new file mode 100644 index 0000000..389a04d --- /dev/null +++ b/lib/ultralib/src/gu/poslight.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" + + +/* + * 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 (al.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/ultralib/src/gu/poslighthil.c b/lib/ultralib/src/gu/poslighthil.c new file mode 100644 index 0000000..259fe8c --- /dev/null +++ b/lib/ultralib/src/gu/poslighthil.c @@ -0,0 +1,168 @@ +/************************************************************************** + * * + * 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 (al.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 (al.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)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/src/libultra/gu/random.c b/lib/ultralib/src/gu/random.c similarity index 100% rename from src/libultra/gu/random.c rename to lib/ultralib/src/gu/random.c diff --git a/lib/ultralib/src/gu/readme.txt b/lib/ultralib/src/gu/readme.txt new file mode 100644 index 0000000..114174e --- /dev/null +++ b/lib/ultralib/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/src/libultra/gu/rotate.c b/lib/ultralib/src/gu/rotate.c similarity index 54% rename from src/libultra/gu/rotate.c rename to lib/ultralib/src/gu/rotate.c index 7612729..c843d9f 100644 --- a/src/libultra/gu/rotate.c +++ b/lib/ultralib/src/gu/rotate.c @@ -11,50 +11,62 @@ **************************************************************************/ #include "guint.h" - -extern f32 __cosf(f32); +#include "os_version.h" void guRotateF(float mf[4][4], float a, float x, float y, float z) { - static float dtor = 3.1415926f / 180.0f; - float sine; - float cosine; - float ab, bc, ca, t; + 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; - + a *= dtor; sine = sinf(a); - cosine = __cosf(a); - t = 1 - cosine; - ab = x * y * t; - bc = y * z * t; - ca = z * x * t; + cosine = cosf(a); + t = (1-cosine); + ab = x*y*t; + bc = y*z*t; + ca = z*x*t; guMtxIdentF(mf); - t = x * x; - mf[0][0] = t + cosine * (1 - t); - mf[2][1] = bc - x * sine; - mf[1][2] = bc + x * sine; +#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 = y * y; - mf[1][1] = t + cosine * (1 - t); - mf[2][0] = ca + y * sine; - mf[0][2] = ca - y * sine; + t = x*x; + mf[0][0] = t+cosine*(1-t); + mf[2][1] = bc-xxsine; + mf[1][2] = bc+xxsine; - t = z * z; - mf[2][2] = t + cosine * (1 - t); - mf[1][0] = ab - z * sine; - mf[0][1] = ab + z * sine; + 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) { - f32 mf[4][4]; + Matrix mf; guRotateF(mf, a, x, y, z); guMtxF2L(mf, m); -} \ No newline at end of file +} diff --git a/src/libultra/gu/rotateRPY.c b/lib/ultralib/src/gu/rotaterpy.c similarity index 82% rename from src/libultra/gu/rotateRPY.c rename to lib/ultralib/src/gu/rotaterpy.c index 7c8e2db..c239d21 100644 --- a/src/libultra/gu/rotateRPY.c +++ b/lib/ultralib/src/gu/rotaterpy.c @@ -12,13 +12,6 @@ #include "guint.h" -// conflict with gu.h -#define M_DTOR_2 (3.1415926f / 180.0f) - -extern float D_80103870; - -extern float __cosf(float angle); - /* * Return rotation matrix given roll, pitch, and yaw in degrees * @@ -26,22 +19,19 @@ extern float __cosf(float angle); void guRotateRPYF(float mf[4][4], float r, float p, float h) { - // float dtor = ; + static float dtor = 3.1415926 / 180.0; float sinr, sinp, sinh; float cosr, cosp, cosh; - r *= M_DTOR_2; - p *= M_DTOR_2; - h *= M_DTOR_2; - - D_80103870 = M_DTOR_2; - + r *= dtor; + p *= dtor; + h *= dtor; sinr = sinf(r); - cosr = __cosf(r); + cosr = cosf(r); sinp = sinf(p); - cosp = __cosf(p); + cosp = cosf(p); sinh = sinf(h); - cosh = __cosf(h); + cosh = cosf(h); guMtxIdentF(mf); diff --git a/lib/ultralib/src/gu/scale.c b/lib/ultralib/src/gu/scale.c new file mode 100644 index 0000000..1523cd0 --- /dev/null +++ b/lib/ultralib/src/gu/scale.c @@ -0,0 +1,32 @@ +/************************************************************************** + * * + * 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 guScaleF(float mf[4][4], float x, float y, float z) +{ + guMtxIdentF(mf); + + mf[0][0] = x; + mf[1][1] = y; + mf[2][2] = z; + mf[3][3] = 1; +} + +void guScale(Mtx *m, float x, float y, float z) +{ + Matrix mf; + + guScaleF(mf, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/ultralib/src/gu/sinf.c b/lib/ultralib/src/gu/sinf.c new file mode 100644 index 0000000..f4bb1ad --- /dev/null +++ b/lib/ultralib/src/gu/sinf.c @@ -0,0 +1,157 @@ +/************************************************************************** + * * + * 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: fsin.c + * $Revision: 1.3 $ + * $Date: 1998/10/09 06:14:51 $ + * $Author: has $ + * $Source: /exdisk2/cvs/N64OS/Master/cvsmdev2/PR/libultra/monegi/gu/sinf.c,v $ + * + * Revision history: + * 09-Jun-93 - Original Version + * + * 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 rpi = +{0x3fd45f30, 0x6dc9c883}; + +static const du pihi = +{0x400921fb, 0x50000000}; + +static const du pilo = +{0x3e6110b4, 0x611a6263}; + +static const fu zero = {0x00000000}; + + +/* ==================================================================== + * + * 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; + xpt = (ix >> 22); + xpt &= 0x1ff; + + /* xpt is exponent(x) + 1 bit of mantissa */ + + if ( xpt < 0xff ) + { + /* |x| < 1.5 */ + + dx = x; + + if ( xpt >= 0xe6 ) + { + /* |x| >= 2^(-12) */ + + /* compute sin(x) with a standard polynomial approximation */ + + xsq = dx*dx; + + poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + + result = dx + (dx*xsq)*poly; + + return ( (float)result ); + } + + return ( x ); + } + + if ( xpt < 0x136 ) + { + /* |x| < 2^28 */ + + dx = x; + + /* reduce argument to +/- pi/2 */ + + dn = dx*rpi.d; + + n = ROUND(dn); + dn = n; + + 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; + + poly = ((P[4].d*xsq + P[3].d)*xsq + P[2].d)*xsq + P[1].d; + + result = dx + (dx*xsq)*poly; + + + if ( (n & 1) == 0 ) + return ( (float)result ); + + return ( -(float)result ); + } + + if ( x != x ) + { + /* x is a NaN; return a quiet NaN */ + +#ifdef _IP_NAN_SETS_ERRNO + + *__errnoaddr = EDOM; +#endif + + return ( __libm_qnan_f ); + } + + /* just give up and return 0.0 */ + + return ( zero.f ); +} + diff --git a/lib/ultralib/src/gu/sins.c b/lib/ultralib/src/gu/sins.c new file mode 100644 index 0000000..b24851f --- /dev/null +++ b/lib/ultralib/src/gu/sins.c @@ -0,0 +1,61 @@ +/************************************************************************** + * * + * 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/ultralib/src/gu/sintable.h b/lib/ultralib/src/gu/sintable.h new file mode 100644 index 0000000..b5e1a45 --- /dev/null +++ b/lib/ultralib/src/gu/sintable.h @@ -0,0 +1,1031 @@ + +/* + * 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/ultralib/src/gu/sqrtf.s b/lib/ultralib/src/gu/sqrtf.s new file mode 100644 index 0000000..475a827 --- /dev/null +++ b/lib/ultralib/src/gu/sqrtf.s @@ -0,0 +1,25 @@ +/************************************************************************** + * * + * 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. * + * * + **************************************************************************/ + +/* + * Due to compiler bug, it won't insert a sqrt.s opcode in the stream so we + * make a function and call it for now. When compiler fixed, also remove the + * seperate Makefile rules + */ + +#include "sys/asm.h" +#include "sys/regdef.h" + +LEAF(sqrtf) + sqrt.s fv0, fa0 + j ra +END(sqrtf) diff --git a/src/libultra/gu/translate.c b/lib/ultralib/src/gu/translate.c similarity index 81% rename from src/libultra/gu/translate.c rename to lib/ultralib/src/gu/translate.c index 8e46be0..f086f39 100644 --- a/src/libultra/gu/translate.c +++ b/lib/ultralib/src/gu/translate.c @@ -1,31 +1,31 @@ -/************************************************************************** - * * - * 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 guTranslateF(float mf[4][4], float x, float y, float z) -{ - guMtxIdentF(mf); - - mf[3][0] = x; - mf[3][1] = y; - mf[3][2] = z; -} - -void guTranslate(Mtx *m, float x, float y, float z) -{ - Matrix mf; - - guTranslateF(mf, x, y, z); - - guMtxF2L(mf, m); -} +/************************************************************************** + * * + * 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 guTranslateF(float mf[4][4], float x, float y, float z) +{ + guMtxIdentF(mf); + + mf[3][0] = x; + mf[3][1] = y; + mf[3][2] = z; +} + +void guTranslate(Mtx *m, float x, float y, float z) +{ + Matrix mf; + + guTranslateF(mf, x, y, z); + + guMtxF2L(mf, m); +} diff --git a/lib/ultralib/src/gu/us2dex.c b/lib/ultralib/src/gu/us2dex.c new file mode 100644 index 0000000..92f42bb --- /dev/null +++ b/lib/ultralib/src/gu/us2dex.c @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------- + $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/ultralib/src/gu/us2dex2_emu.c b/lib/ultralib/src/gu/us2dex2_emu.c new file mode 100644 index 0000000..cc32179 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/gu/us2dex_emu.c b/lib/ultralib/src/gu/us2dex_emu.c new file mode 100644 index 0000000..c0a9e30 --- /dev/null +++ b/lib/ultralib/src/gu/us2dex_emu.c @@ -0,0 +1,521 @@ +/*---------------------------------------------------------------------* + 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/ultralib/src/gu/usprite.c b/lib/ultralib/src/gu/usprite.c new file mode 100644 index 0000000..a10ed34 --- /dev/null +++ b/lib/ultralib/src/gu/usprite.c @@ -0,0 +1,39 @@ + +/************************************************************************** + * * + * 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/ultralib/src/host/host_ptn64.c b/lib/ultralib/src/host/host_ptn64.c new file mode 100644 index 0000000..54e5e9e --- /dev/null +++ b/lib/ultralib/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 "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(8); +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/ultralib/src/host/readhost.c b/lib/ultralib/src/host/readhost.c new file mode 100644 index 0000000..ed6402d --- /dev/null +++ b/lib/ultralib/src/host/readhost.c @@ -0,0 +1,36 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" + +#include "macros.h" + +static int readHostInitialized = FALSE; +static OSMesgQueue readHostMesgQueue ALIGNED(8); +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/ultralib/src/host/writehost.c b/lib/ultralib/src/host/writehost.c new file mode 100644 index 0000000..c7477e6 --- /dev/null +++ b/lib/ultralib/src/host/writehost.c @@ -0,0 +1,57 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/ultraerror.h" + +#include "macros.h" + +static int writeHostInitialized = FALSE; +static OSMesgQueue writeHostMesgQueue ALIGNED(8); +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/src/libultra/io/ai.c b/lib/ultralib/src/io/ai.c similarity index 88% rename from src/libultra/io/ai.c rename to lib/ultralib/src/io/ai.c index 5e345dc..4ece0f1 100644 --- a/src/libultra/io/ai.c +++ b/lib/ultralib/src/io/ai.c @@ -6,10 +6,10 @@ 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/src/libultra/io/aigetlen.c b/lib/ultralib/src/io/aigetlen.c similarity index 100% rename from src/libultra/io/aigetlen.c rename to lib/ultralib/src/io/aigetlen.c diff --git a/src/libultra/io/aigetstat.c b/lib/ultralib/src/io/aigetstat.c similarity index 100% rename from src/libultra/io/aigetstat.c rename to lib/ultralib/src/io/aigetstat.c diff --git a/lib/ultralib/src/io/aisetfreq.c b/lib/ultralib/src/io/aisetfreq.c new file mode 100644 index 0000000..e41d6fa --- /dev/null +++ b/lib/ultralib/src/io/aisetfreq.c @@ -0,0 +1,53 @@ +#include "PR/rcp.h" +#include "PR/ultraerror.h" +#include "../os/osint.h" +// TODO: not sure if this should be here +extern s32 osViClock; + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +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 + + f = osViClock / (float)frequency + .5f; + dacRate = f; + + if (dacRate < AI_MIN_DAC_RATE) { + return -1; + } + + bitRate = dacRate / 66; + + 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 osViClock / (s32)dacRate; +} diff --git a/lib/ultralib/src/io/aisetnextbuf.c b/lib/ultralib/src/io/aisetnextbuf.c new file mode 100644 index 0000000..041b61d --- /dev/null +++ b/lib/ultralib/src/io/aisetnextbuf.c @@ -0,0 +1,52 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "../os/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +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 + 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/ultralib/src/io/cartrominit.c b/lib/ultralib/src/io/cartrominit.c new file mode 100644 index 0000000..87aa8bb --- /dev/null +++ b/lib/ultralib/src/io/cartrominit.c @@ -0,0 +1,95 @@ +#include "macros.h" +#include "PR/os_version.h" +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "piint.h" + +#if BUILD_VERSION >= VERSION_J +OSPiHandle __CartRomHandle ALIGNED(8); +OSPiHandle* osCartRomInit(void) { + u32 value = 0; + u32 saveMask; + static int first = 1; + register u32 stat; + u32 latency; + u32 pulse; + u32 pageSize; + u32 relDuration; + + __osPiGetAccess(); + + if (!first) { + __osPiRelAccess(); + return &__CartRomHandle; + } + + first = 0; + __CartRomHandle.type = DEVICE_TYPE_CART; + __CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); + __CartRomHandle.domain = PI_DOMAIN1; + __CartRomHandle.speed = 0; + + bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); + + WAIT_ON_IOBUSY(stat); + + latency = IO_READ(PI_BSD_DOM1_LAT_REG); + pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); + relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); + pulse = IO_READ(PI_BSD_DOM1_PWD_REG); + + IO_WRITE(PI_BSD_DOM1_LAT_REG, 0xFF); + IO_WRITE(PI_BSD_DOM1_PGS_REG, 0); + IO_WRITE(PI_BSD_DOM1_RLS_REG, 3); + IO_WRITE(PI_BSD_DOM1_PWD_REG, 0xFF); + + value = IO_READ(__CartRomHandle.baseAddress); + __CartRomHandle.latency = value & 0xFF; + __CartRomHandle.pageSize = (value >> 0x10) & 0xF; + __CartRomHandle.relDuration = (value >> 0x14) & 0xF; + __CartRomHandle.pulse = (value >> 8) & 0xFF; + + IO_WRITE(PI_BSD_DOM1_LAT_REG, latency); + IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize); + IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration); + IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse); + + saveMask = __osDisableInt(); + __CartRomHandle.next = __osPiTable; + __osPiTable = &__CartRomHandle; + __osRestoreInt(saveMask); + __osPiRelAccess(); + + return &__CartRomHandle; +} +#else + +OSPiHandle CartRomHandle ALIGNED(8); +OSPiHandle* osCartRomInit(void) { + u32 domain = 0; + u32 saveMask; + + 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(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; + CartRomHandle.speed = 0; + + bzero(&CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); + + saveMask = __osDisableInt(); + CartRomHandle.next = __osPiTable; + __osPiTable = &CartRomHandle; + __osRestoreInt(saveMask); + + return &CartRomHandle; +} +#endif diff --git a/lib/ultralib/src/io/contchannelreset.c b/lib/ultralib/src/io/contchannelreset.c new file mode 100644 index 0000000..f6ed8a2 --- /dev/null +++ b/lib/ultralib/src/io/contchannelreset.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/conteeplongread.c b/lib/ultralib/src/io/conteeplongread.c new file mode 100644 index 0000000..d8d59f6 --- /dev/null +++ b/lib/ultralib/src/io/conteeplongread.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/conteeplongwrite.c b/lib/ultralib/src/io/conteeplongwrite.c new file mode 100644 index 0000000..c5668e1 --- /dev/null +++ b/lib/ultralib/src/io/conteeplongwrite.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "controller.h" + +s32 osEepromLongWrite(OSMesgQueue* mq, u8 address, u8* buffer, int length) { + s32 ret = 0; + + while (length > 0) { + ERRCK(osEepromWrite(mq, address, buffer)); + length -= EEPROM_BLOCK_SIZE; + address++; + buffer += EEPROM_BLOCK_SIZE; + osSetTimer(&__osEepromTimer, OS_USEC_TO_CYCLES(12000), 0, &__osEepromTimerQ, &__osEepromTimerMsg); + osRecvMesg(&__osEepromTimerQ, NULL, OS_MESG_BLOCK); + } + + return ret; +} diff --git a/lib/ultralib/src/io/conteepprobe.c b/lib/ultralib/src/io/conteepprobe.c new file mode 100644 index 0000000..b19dc49 --- /dev/null +++ b/lib/ultralib/src/io/conteepprobe.c @@ -0,0 +1,34 @@ +#include "controller.h" +#include "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/ultralib/src/io/conteepread.c b/lib/ultralib/src/io/conteepread.c new file mode 100644 index 0000000..2d334fa --- /dev/null +++ b/lib/ultralib/src/io/conteepread.c @@ -0,0 +1,139 @@ +#include "macros.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +OSPifRam __osEepPifRam ALIGNED(16); +#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/ultralib/src/io/conteepwrite.c b/lib/ultralib/src/io/conteepwrite.c new file mode 100644 index 0000000..7352430 --- /dev/null +++ b/lib/ultralib/src/io/conteepwrite.c @@ -0,0 +1,203 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +static void __osPackEepWriteData(u8 address, u8* buffer); +s32 osEepromWrite(OSMesgQueue* mq, u8 address, u8* buffer) { + s32 ret = 0; +#if BUILD_VERSION < VERSION_J + int i; +#endif + u16 type; + u8* ptr = (u8*)&__osEepPifRam.ramarray; + __OSContEepromFormat eepromformat; + OSContStatus sdata; +#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 + + 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 if (__osEepromRead16K) { + __osEepromRead16K = 0; + __osSiRelAccess(); + osEepromRead(mq, (address ^ 1), temp); + __osSiGetAccess(); + } +#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 -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 + + while (sdata.status & CONT_EEPROM_BUSY) { + __osEepStatus(mq, &sdata); + } + + __osPackEepWriteData(address, buffer); + 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_WRITE_EEPROM; + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + // skip the first 4 bytes +#if BUILD_VERSION >= VERSION_J + ptr += 4; +#else + for (i = 0; i < 4; i++) { + ptr++; + } +#endif + + eepromformat = *(__OSContEepromFormat*)ptr; + + ret = CHNL_ERR(eepromformat); + + __osSiRelAccess(); + return ret; +} + +static void __osPackEepWriteData(u8 address, u8* buffer) { + 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_WRITE_EEPROM_TX; + eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX; + eepromformat.cmd = CONT_CMD_WRITE_EEPROM; + eepromformat.address = address; + + for (i = 0; i < ARRLEN(eepromformat.data); i++) { + eepromformat.data[i] = *buffer++; + } + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = 0; + } + + *(__OSContEepromFormat*)(ptr) = eepromformat; + ptr += sizeof(__OSContEepromFormat); + ptr[0] = CONT_CMD_END; +} + +s32 __osEepStatus(OSMesgQueue* mq, OSContStatus* data) { + s32 ret = 0; + int i; + u8* ptr = (u8*)__osEepPifRam.ramarray; + __OSContRequesFormat requestformat; + + for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { + __osEepPifRam.ramarray[i] = 0; + } + + __osEepPifRam.pifstatus = CONT_CMD_EXE; + ptr = (u8*)__osEepPifRam.ramarray; + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + requestformat.dummy = CONT_CMD_NOP; + requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; + requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; + requestformat.cmd = CONT_CMD_REQUEST_STATUS; + requestformat.typeh = CONT_CMD_NOP; + requestformat.typel = CONT_CMD_NOP; + requestformat.status = CONT_CMD_NOP; + requestformat.dummy1 = CONT_CMD_NOP; + *(__OSContRequesFormat*)ptr = requestformat; + ptr += sizeof(__OSContRequesFormat); + *ptr = CONT_CMD_END; + + ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); +#if BUILD_VERSION >= VERSION_J + __osContLastCmd = CONT_CMD_END; +#else + __osContLastCmd = CONT_CMD_REQUEST_STATUS; +#endif + ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + if (ret != 0) { + return ret; + } + + ptr = (u8*)&__osEepPifRam; + + for (i = 0; i < MAXCONTROLLERS; i++) { + *ptr++ = 0; + } + + requestformat = *(__OSContRequesFormat*)ptr; + data->errno = CHNL_ERR(requestformat); + data->type = (requestformat.typel << 8) | requestformat.typeh; + data->status = requestformat.status; + + if (data->errno != 0) { + return data->errno; + } + + return 0; +} diff --git a/lib/ultralib/src/io/contpfs.c b/lib/ultralib/src/io/contpfs.c new file mode 100644 index 0000000..c845a7d --- /dev/null +++ b/lib/ultralib/src/io/contpfs.c @@ -0,0 +1,393 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "controller.h" +#include "PR/rmon.h" + +#if BUILD_VERSION >= VERSION_J +__OSInode __osPfsInodeCache ALIGNED(8); +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/ultralib/src/io/contquery.c b/lib/ultralib/src/io/contquery.c new file mode 100644 index 0000000..df038ce --- /dev/null +++ b/lib/ultralib/src/io/contquery.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +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; +} + +void osContGetQuery(OSContStatus* data) { + u8 pattern; + __osContGetInitData(&pattern, data); +} diff --git a/lib/ultralib/src/io/contramread.c b/lib/ultralib/src/io/contramread.c new file mode 100644 index 0000000..9c399ee --- /dev/null +++ b/lib/ultralib/src/io/contramread.c @@ -0,0 +1,163 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + +#if BUILD_VERSION >= VERSION_J +s32 __osPfsLastChannel = -1; + +s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { + s32 ret = 0; + s32 i; + u8* ptr; + s32 retry = 2; + + __osSiGetAccess(); + + do { + ptr = (u8*)&__osPfsPifRam; + + if (__osContLastCmd != CONT_CMD_READ_PAK || (u32)__osPfsLastChannel != channel) { + __osContLastCmd = CONT_CMD_READ_PAK; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READFORMAT(ptr)->dummy = CONT_CMD_NOP; + READFORMAT(ptr)->txsize = CONT_CMD_READ_PAK_TX; + READFORMAT(ptr)->rxsize = CONT_CMD_READ_PAK_RX; + READFORMAT(ptr)->cmd = CONT_CMD_READ_PAK; + READFORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + +#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 + + + 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(*READFORMAT(ptr)); + + if (!ret) { + if (__osContDataCrc(READFORMAT(ptr)->data) != READFORMAT(ptr)->datacrc) { + ret = __osPfsGetStatus(mq, channel); + + if (ret) { + break; + } else { + ret = PFS_ERR_CONTRFAIL; + } + } else { + bcopy(READFORMAT(ptr)->data, buffer, BLOCKSIZE); + } + } else { + ret = PFS_ERR_NOPACK; + } + } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); + __osSiRelAccess(); + return ret; +} +#else + +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; + __OSContRamReadFormat ramreadformat; + int retry = 2; + + __osSiGetAccess(); + __osContLastCmd = CONT_CMD_READ_PAK; + __osPackRamReadData(channel, address); + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + do { + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ptr = (u8*)&__osPfsPifRam; + + if (channel != 0) { + for (i = 0; i < channel; i++) { + ptr++; + } + } + + ramreadformat = *READFORMAT(ptr); + + ret = CHNL_ERR(ramreadformat); + if (ret == 0) { + u8 c = __osContDataCrc((u8*)&ramreadformat.data); + if (c != ramreadformat.datacrc) { + ret = __osPfsGetStatus(mq, channel); + + if (ret != 0) { + __osSiRelAccess(); + return ret; + } + + ret = PFS_ERR_CONTRFAIL; + } else { + for (i = 0; i < ARRLEN(ramreadformat.data); i++) { + *buffer++ = ramreadformat.data[i]; + } + } + } else { + ret = PFS_ERR_NOPACK; + } + } while ((ret == PFS_ERR_CONTRFAIL) && retry-- >= 0); + + __osSiRelAccess(); + + return ret; +} + +static void __osPackRamReadData(int channel, u16 address) { + u8 *ptr; + __OSContRamReadFormat ramreadformat; + int i; + + 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; + ramreadformat.address = (address << 0x5) | __osContAddressCrc(address); + ramreadformat.datacrc = CONT_CMD_NOP; + + for (i = 0; i < ARRLEN(ramreadformat.data); i++) { + ramreadformat.data[i] = CONT_CMD_NOP; + } + + if (channel != 0) { + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + } + + *(__OSContRamReadFormat *)ptr = ramreadformat; + ptr += sizeof(__OSContRamReadFormat); + ptr[0] = CONT_CMD_END; +} + +#endif + diff --git a/lib/ultralib/src/io/contramwrite.c b/lib/ultralib/src/io/contramwrite.c new file mode 100644 index 0000000..a213049 --- /dev/null +++ b/lib/ultralib/src/io/contramwrite.c @@ -0,0 +1,165 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "controller.h" +#include "siint.h" + +extern s32 __osPfsLastChannel; + +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + +#if BUILD_VERSION >= VERSION_J +s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) { + s32 ret = 0; + s32 i; + u8* ptr; + s32 retry = 2; + u8 crc; + + if ((force != TRUE) && (address < PFS_LABEL_AREA) && (address != 0)) { + return 0; + } + + __osSiGetAccess(); + + do { + ptr = (u8*)__osPfsPifRam.ramarray; + + if (__osContLastCmd != CONT_CMD_WRITE_PAK || (u32)__osPfsLastChannel != channel) { + __osContLastCmd = CONT_CMD_WRITE_PAK; + __osPfsLastChannel = channel; + + for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } + + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + + READFORMAT(ptr)->dummy = CONT_CMD_NOP; + READFORMAT(ptr)->txsize = CONT_CMD_WRITE_PAK_TX; + READFORMAT(ptr)->rxsize = CONT_CMD_WRITE_PAK_RX; + READFORMAT(ptr)->cmd = CONT_CMD_WRITE_PAK; + READFORMAT(ptr)->datacrc = 0xFF; + + ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; + } else { + ptr += channel; + } + +#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); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + crc = __osContDataCrc(buffer); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + ret = CHNL_ERR(*READFORMAT(ptr)); + + if (!ret) { + if (crc != READFORMAT(ptr)->datacrc) { + if ((ret = __osPfsGetStatus(mq, channel))) { + break; + } else { + ret = PFS_ERR_CONTRFAIL; + } + } + } else { + ret = PFS_ERR_NOPACK; + } + } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); + + __osSiRelAccess(); + + return ret; +} +#else + +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)) { + return 0; + } + + __osSiGetAccess(); + __osContLastCmd = CONT_CMD_WRITE_PAK; + __osPackRamWriteData(channel, address, buffer); + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + + do { + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + ptr = (u8*)&__osPfsPifRam; + + if (channel != 0) { + for (i = 0; i < channel; i++) { + ptr++; + } + } + + ramreadformat = *READFORMAT(ptr); + + ret = CHNL_ERR(ramreadformat); + if (ret == 0) { + if (__osContDataCrc(buffer) != ramreadformat.datacrc) { + ret = __osPfsGetStatus(mq, channel); + + if (ret != 0) { + __osSiRelAccess(); + return ret; + } + + ret = PFS_ERR_CONTRFAIL; + } + } else { + ret = PFS_ERR_NOPACK; + } + } while ((ret == PFS_ERR_CONTRFAIL) && retry-- >= 0); + + __osSiRelAccess(); + + return ret; +} + +static void __osPackRamWriteData(int channel, u16 address, u8 *buffer) { + u8 *ptr; + __OSContRamReadFormat ramreadformat; + int i; + + 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; + 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++ = CONT_CMD_REQUEST_STATUS; } + } + + *(__OSContRamReadFormat *)ptr = ramreadformat; + ptr += sizeof(__OSContRamReadFormat); + ptr[0] = CONT_CMD_END; +} + +#endif diff --git a/lib/ultralib/src/io/contreaddata.c b/lib/ultralib/src/io/contreaddata.c new file mode 100644 index 0000000..da0cac3 --- /dev/null +++ b/lib/ultralib/src/io/contreaddata.c @@ -0,0 +1,68 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/contreset.c b/lib/ultralib/src/io/contreset.c new file mode 100644 index 0000000..140088a --- /dev/null +++ b/lib/ultralib/src/io/contreset.c @@ -0,0 +1,51 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/controller.c b/lib/ultralib/src/io/controller.c new file mode 100644 index 0000000..728c207 --- /dev/null +++ b/lib/ultralib/src/io/controller.c @@ -0,0 +1,101 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +OSPifRam __osContPifRam ALIGNED(16); +u8 __osContLastCmd; +u8 __osMaxControllers; + +OSTimer __osEepromTimer; +OSMesgQueue __osEepromTimerQ ALIGNED(8); +OSMesg __osEepromTimerMsg; + +s32 __osContinitialized = 0; + +s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) { + OSMesg dummy; + s32 ret = 0; + OSTime t; + OSTimer mytimer; + OSMesgQueue timerMesgQueue; + + if (__osContinitialized != 0) { + 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 = 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/ultralib/src/io/controller.h b/lib/ultralib/src/io/controller.h new file mode 100644 index 0000000..5dac7f5 --- /dev/null +++ b/lib/ultralib/src/io/controller.h @@ -0,0 +1,289 @@ +#ifndef _CONTROLLER_H +#define _CONTROLLER_H + +#include "PR/os_internal.h" +#include "PR/os_version.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 +{ + /* 0x0 */ 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 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/ultralib/src/io/controller_gbpak.h b/lib/ultralib/src/io/controller_gbpak.h new file mode 100644 index 0000000..db98bd4 --- /dev/null +++ b/lib/ultralib/src/io/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/ultralib/src/io/controller_voice.h b/lib/ultralib/src/io/controller_voice.h new file mode 100644 index 0000000..1b9dee6 --- /dev/null +++ b/lib/ultralib/src/io/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/ultralib/src/io/contsetch.c b/lib/ultralib/src/io/contsetch.c new file mode 100644 index 0000000..0cababd --- /dev/null +++ b/lib/ultralib/src/io/contsetch.c @@ -0,0 +1,19 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +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/ultralib/src/io/crc.c b/lib/ultralib/src/io/crc.c new file mode 100644 index 0000000..3293b2d --- /dev/null +++ b/lib/ultralib/src/io/crc.c @@ -0,0 +1,114 @@ +#include "PR/os_internal.h" + +#if BUILD_VERSION >= VERSION_J + +u8 __osContAddressCrc(u16 addr) { + u32 temp = 0; + u32 i = 0x400; + + do { + temp <<= 1; + + if ((u32)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/ultralib/src/io/devmgr.c b/lib/ultralib/src/io/devmgr.c new file mode 100644 index 0000000..616dee5 --- /dev/null +++ b/lib/ultralib/src/io/devmgr.c @@ -0,0 +1,108 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "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/ultralib/src/io/dp.c b/lib/ultralib/src/io/dp.c new file mode 100644 index 0000000..e636217 --- /dev/null +++ b/lib/ultralib/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/src/libultra/io/dpctr.c b/lib/ultralib/src/io/dpctr.c similarity index 85% rename from src/libultra/io/dpctr.c rename to lib/ultralib/src/io/dpctr.c index 0c2164b..a53b030 100644 --- a/src/libultra/io/dpctr.c +++ b/lib/ultralib/src/io/dpctr.c @@ -1,7 +1,7 @@ #include "PR/os_internal.h" #include "PR/rcp.h" -void osDpGetCounters(u32 *array) { +void osDpGetCounters(u32* array) { *array++ = IO_READ(DPC_CLOCK_REG); *array++ = IO_READ(DPC_BUFBUSY_REG); *array++ = IO_READ(DPC_PIPEBUSY_REG); diff --git a/src/libultra/io/dpgetstat.c b/lib/ultralib/src/io/dpgetstat.c similarity index 100% rename from src/libultra/io/dpgetstat.c rename to lib/ultralib/src/io/dpgetstat.c diff --git a/lib/ultralib/src/io/dpsetnextbuf.c b/lib/ultralib/src/io/dpsetnextbuf.c new file mode 100644 index 0000000..6314472 --- /dev/null +++ b/lib/ultralib/src/io/dpsetnextbuf.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "../os/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/src/libultra/io/dpsetstat.c b/lib/ultralib/src/io/dpsetstat.c similarity index 100% rename from src/libultra/io/dpsetstat.c rename to lib/ultralib/src/io/dpsetstat.c diff --git a/lib/ultralib/src/io/driverominit.c b/lib/ultralib/src/io/driverominit.c new file mode 100644 index 0000000..d73d349 --- /dev/null +++ b/lib/ultralib/src/io/driverominit.c @@ -0,0 +1,31 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "macros.h" + +OSPiHandle DriveRomHandle ALIGNED(8); + +OSPiHandle *osDriveRomInit() { + 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/ultralib/src/io/epidma.c b/lib/ultralib/src/io/epidma.c new file mode 100644 index 0000000..06a9f69 --- /dev/null +++ b/lib/ultralib/src/io/epidma.c @@ -0,0 +1,61 @@ +#include "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/ultralib/src/io/epigettype.c b/lib/ultralib/src/io/epigettype.c new file mode 100644 index 0000000..c94012c --- /dev/null +++ b/lib/ultralib/src/io/epigettype.c @@ -0,0 +1,7 @@ +#include "piint.h" + +s32 osEPiGetDeviceType(OSPiHandle* pihandle, OSPiInfo* info) { + info->type = pihandle->type; + info->address = pihandle->baseAddress; + return 0; +} diff --git a/src/libultra/os/epilinkhandle.c b/lib/ultralib/src/io/epilinkhandle.c similarity index 67% rename from src/libultra/os/epilinkhandle.c rename to lib/ultralib/src/io/epilinkhandle.c index 6872c1f..5f51854 100644 --- a/src/libultra/os/epilinkhandle.c +++ b/lib/ultralib/src/io/epilinkhandle.c @@ -1,10 +1,11 @@ -#include +#include "piint.h" -s32 osEPiLinkHandle(OSPiHandle *EPiHandle) -{ +s32 osEPiLinkHandle(OSPiHandle* EPiHandle) { u32 saveMask = __osDisableInt(); + EPiHandle->next = __osPiTable; __osPiTable = EPiHandle; + __osRestoreInt(saveMask); return 0; } diff --git a/lib/ultralib/src/io/epirawdma.c b/lib/ultralib/src/io/epirawdma.c new file mode 100644 index 0000000..69a404d --- /dev/null +++ b/lib/ultralib/src/io/epirawdma.c @@ -0,0 +1,53 @@ +#include "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/ultralib/src/io/epirawread.c b/lib/ultralib/src/io/epirawread.c new file mode 100644 index 0000000..500a2ce --- /dev/null +++ b/lib/ultralib/src/io/epirawread.c @@ -0,0 +1,48 @@ +#include "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/ultralib/src/io/epirawwrite.c b/lib/ultralib/src/io/epirawwrite.c new file mode 100644 index 0000000..79fba31 --- /dev/null +++ b/lib/ultralib/src/io/epirawwrite.c @@ -0,0 +1,22 @@ +#include "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/ultralib/src/io/epiread.c b/lib/ultralib/src/io/epiread.c new file mode 100644 index 0000000..08cd0be --- /dev/null +++ b/lib/ultralib/src/io/epiread.c @@ -0,0 +1,19 @@ +#include "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/ultralib/src/io/epiwrite.c b/lib/ultralib/src/io/epiwrite.c new file mode 100644 index 0000000..42a239e --- /dev/null +++ b/lib/ultralib/src/io/epiwrite.c @@ -0,0 +1,19 @@ +#include "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/ultralib/src/io/gbpakcheckconnector.c b/lib/ultralib/src/io/gbpakcheckconnector.c new file mode 100644 index 0000000..8eb3298 --- /dev/null +++ b/lib/ultralib/src/io/gbpakcheckconnector.c @@ -0,0 +1,131 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "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/ultralib/src/io/gbpakgetbank.c b/lib/ultralib/src/io/gbpakgetbank.c new file mode 100644 index 0000000..a2e5f38 --- /dev/null +++ b/lib/ultralib/src/io/gbpakgetbank.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/gbpakgetstatus.c b/lib/ultralib/src/io/gbpakgetstatus.c new file mode 100644 index 0000000..d17d15c --- /dev/null +++ b/lib/ultralib/src/io/gbpakgetstatus.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/gbpakinit.c b/lib/ultralib/src/io/gbpakinit.c new file mode 100644 index 0000000..102d962 --- /dev/null +++ b/lib/ultralib/src/io/gbpakinit.c @@ -0,0 +1,90 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" +#include "controller_gbpak.h" + +OSTimer __osGbpakTimer; +OSMesgQueue __osGbpakTimerQ ALIGNED(8); +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/ultralib/src/io/gbpakpower.c b/lib/ultralib/src/io/gbpakpower.c new file mode 100644 index 0000000..3d4a8f4 --- /dev/null +++ b/lib/ultralib/src/io/gbpakpower.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/gbpakreadid.c b/lib/ultralib/src/io/gbpakreadid.c new file mode 100644 index 0000000..3e2fa19 --- /dev/null +++ b/lib/ultralib/src/io/gbpakreadid.c @@ -0,0 +1,97 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "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/ultralib/src/io/gbpakreadwrite.c b/lib/ultralib/src/io/gbpakreadwrite.c new file mode 100644 index 0000000..a6d4b02 --- /dev/null +++ b/lib/ultralib/src/io/gbpakreadwrite.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/gbpaksetbank.c b/lib/ultralib/src/io/gbpaksetbank.c new file mode 100644 index 0000000..7a08646 --- /dev/null +++ b/lib/ultralib/src/io/gbpaksetbank.c @@ -0,0 +1,35 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/leodiskinit.c b/lib/ultralib/src/io/leodiskinit.c new file mode 100644 index 0000000..e9f140b --- /dev/null +++ b/lib/ultralib/src/io/leodiskinit.c @@ -0,0 +1,36 @@ +// This file was removed in 2.0J +#include "PR/os_internal.h" +#include "PR/os_libc.h" +#include "PR/rcp.h" +#include "macros.h" + +OSPiHandle LeoDiskHandle ALIGNED(8); +OSPiHandle *__osDiskHandle; + +OSPiHandle *osLeoDiskInit() { + u32 saveMask; + + LeoDiskHandle.type = DEVICE_TYPE_64DD; + LeoDiskHandle.baseAddress = PHYS_TO_K1(PI_DOM2_ADDR1); + LeoDiskHandle.latency = 3; + LeoDiskHandle.pulse = 6; + LeoDiskHandle.pageSize = 6; + LeoDiskHandle.relDuration = 2; + LeoDiskHandle.domain = PI_DOMAIN2; + + 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); + LeoDiskHandle.speed = 0; + + bzero(&LeoDiskHandle.transferInfo, sizeof(__OSTranxInfo)); + + saveMask = __osDisableInt(); + LeoDiskHandle.next = __osPiTable; + __osPiTable = &LeoDiskHandle; + __osDiskHandle = &LeoDiskHandle; + __osRestoreInt(saveMask); + + return &LeoDiskHandle; +} diff --git a/lib/ultralib/src/io/leointerrupt.c b/lib/ultralib/src/io/leointerrupt.c new file mode 100644 index 0000000..ad34e45 --- /dev/null +++ b/lib/ultralib/src/io/leointerrupt.c @@ -0,0 +1,194 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/osint.h" +#include "piint.h" +#include "macros.h" + +extern OSPiHandle *__osDiskHandle; + +u8 leoDiskStack[OS_PIM_STACKSIZE] ALIGNED(16); + +static void __osLeoAbnormalResume(void); +static void __osLeoResume(void); + +s32 __osLeoInterrupt() { + 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/ultralib/src/io/motor.c b/lib/ultralib/src/io/motor.c new file mode 100644 index 0000000..8028d69 --- /dev/null +++ b/lib/ultralib/src/io/motor.c @@ -0,0 +1,332 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/os_version.h" +#include "controller.h" +#include "siint.h" + +#if BUILD_VERSION >= VERSION_J +static OSPifRam __MotorDataBuf[MAXCONTROLLERS] ALIGNED(8); + +#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) + +s32 __osMotorAccess(OSPfs* pfs, s32 flag) { + int i; + s32 ret; + u8* ptr = (u8*)&__MotorDataBuf[pfs->channel]; + + if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { + return 5; + } + + __osSiGetAccess(); + __MotorDataBuf[pfs->channel].pifstatus = CONT_CMD_EXE; + ptr += pfs->channel; + + for (i = 0; i < BLOCKSIZE; i++) { + READFORMAT(ptr)->data[i] = flag; + } + + __osContLastCmd = CONT_CMD_END; + __osSiRawStartDma(OS_WRITE, &__MotorDataBuf[pfs->channel]); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + ret = __osSiRawStartDma(OS_READ, &__MotorDataBuf[pfs->channel]); + osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); + + ret = READFORMAT(ptr)->rxsize & CHNL_ERR_MASK; + if (!ret) { + if (!flag) { + if (READFORMAT(ptr)->datacrc != 0) { + ret = PFS_ERR_CONTRFAIL; + } + } else { + if (READFORMAT(ptr)->datacrc != 0xEB) { + ret = PFS_ERR_CONTRFAIL; + } + } + } + + __osSiRelAccess(); + + return ret; +} + +static void __osMakeMotorData(int channel, OSPifRam* mdata) { + u8* ptr = (u8*)mdata->ramarray; + __OSContRamReadFormat ramreadformat; + int i; + + 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.addrh = CONT_BLOCK_RUMBLE >> 3; + ramreadformat.addrl = (u8)(__osContAddressCrc(CONT_BLOCK_RUMBLE) | (CONT_BLOCK_RUMBLE << 5)); + + if (channel != 0) { + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + } + + *READFORMAT(ptr) = ramreadformat; + ptr += sizeof(__OSContRamReadFormat); + ptr[0] = CONT_CMD_END; +} + +s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, int channel) { + s32 ret; + u8 temp[32]; + + pfs->queue = mq; + pfs->channel = channel; + pfs->activebank = 0xFF; + pfs->status = 0; + + ret = SELECT_BANK(pfs, 0xFE); + + if (ret == PFS_ERR_NEW_PACK) { + ret = SELECT_BANK(pfs, 0x80); + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); + + if (ret == PFS_ERR_NEW_PACK) { + 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; + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(mq, channel, CONT_BLOCK_DETECT, temp); + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } else if (temp[31] != 0x80) { + return PFS_ERR_DEVICE; + } + + if (!(pfs->status & PFS_MOTOR_INITIALIZED)) { + __osMakeMotorData(channel, &__MotorDataBuf[channel]); + } + + pfs->status = PFS_MOTOR_INITIALIZED; + return 0; +} + +#else + +OSPifRam _MotorStopData[MAXCONTROLLERS] ALIGNED(8); +OSPifRam _MotorStartData[MAXCONTROLLERS] ALIGNED(8); +u8 _motorstopbuf[32] ALIGNED(8); +u8 _motorstartbuf[32] ALIGNED(8); +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; + } + + __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); + } + + if (ret != 0) { + return ret; + } + + 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; + } + + if (ret != 0) { + return ret; + } + + if (temp[31] != 0x80) { + return PFS_ERR_DEVICE; + } + + if (!__osMotorinitialized[channel]) { + for (i = 0; i < ARRLEN(_motorstartbuf); i++) { + _motorstartbuf[i] = 1; + _motorstopbuf[i] = 0; + } + _MakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstartbuf, &_MotorStartData[channel]); + _MakeMotorData(channel, CONT_BLOCK_RUMBLE, _motorstopbuf, &_MotorStopData[channel]); + __osMotorinitialized[channel] = 1; + } + + return 0; +} + +#endif diff --git a/lib/ultralib/src/io/pfsallocatefile.c b/lib/ultralib/src/io/pfsallocatefile.c new file mode 100644 index 0000000..24f6fe7 --- /dev/null +++ b/lib/ultralib/src/io/pfsallocatefile.c @@ -0,0 +1,371 @@ +#include "PR/os_internal.h" +#include "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, OS_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/ultralib/src/io/pfschecker.c b/lib/ultralib/src/io/pfschecker.c new file mode 100644 index 0000000..b736200 --- /dev/null +++ b/lib/ultralib/src/io/pfschecker.c @@ -0,0 +1,258 @@ +#include "PR/os_internal.h" +#include "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, OS_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, OS_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, 0, 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, OS_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, OS_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, 0, 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/ultralib/src/io/pfsdeletefile.c b/lib/ultralib/src/io/pfsdeletefile.c new file mode 100644 index 0000000..e013211 --- /dev/null +++ b/lib/ultralib/src/io/pfsdeletefile.c @@ -0,0 +1,180 @@ +#include "PR/os_internal.h" +#include "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, OS_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, OS_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/ultralib/src/io/pfsfilestate.c b/lib/ultralib/src/io/pfsfilestate.c new file mode 100644 index 0000000..4f80020 --- /dev/null +++ b/lib/ultralib/src/io/pfsfilestate.c @@ -0,0 +1,112 @@ +#include "PR/os_internal.h" +#include "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, OS_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/ultralib/src/io/pfsfreeblocks.c b/lib/ultralib/src/io/pfsfreeblocks.c new file mode 100644 index 0000000..68a54c6 --- /dev/null +++ b/lib/ultralib/src/io/pfsfreeblocks.c @@ -0,0 +1,31 @@ +#include "PR/os_internal.h" +#include "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, OS_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/ultralib/src/io/pfsgetlabel.c b/lib/ultralib/src/io/pfsgetlabel.c new file mode 100644 index 0000000..0e4de49 --- /dev/null +++ b/lib/ultralib/src/io/pfsgetlabel.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/pfsgetstatus.c b/lib/ultralib/src/io/pfsgetstatus.c new file mode 100644 index 0000000..955412b --- /dev/null +++ b/lib/ultralib/src/io/pfsgetstatus.c @@ -0,0 +1,100 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +#if BUILD_VERSION >= VERSION_J +void __osPfsRequestOneChannel(int channel, u8 cmd); +#else +void __osPfsRequestOneChannel(int channel); +#endif +void __osPfsGetOneChannelData(int channel, OSContStatus* data); + +s32 __osPfsGetStatus(OSMesgQueue* queue, int channel) { + s32 ret = 0; + OSMesg dummy; + OSContStatus data; + +#if BUILD_VERSION >= VERSION_J + __osPfsInodeCacheBank = 250; + + __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); +#else + __osPfsRequestOneChannel(channel); +#endif + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(queue, &dummy, OS_MESG_BLOCK); + + __osPfsGetOneChannelData(channel, &data); + + if (((data.status & CONT_CARD_ON) != 0) && ((data.status & CONT_CARD_PULL) != 0)) { + return PFS_ERR_NEW_PACK; + } else if ((data.errno != 0) || ((data.status & CONT_CARD_ON) == 0)) { + return PFS_ERR_NOPACK; + } else if ((data.status & CONT_ADDR_CRC_ER) != 0) { + return PFS_ERR_CONTRFAIL; + } + + return ret; +} + +#if BUILD_VERSION >= VERSION_J +void __osPfsRequestOneChannel(int channel, u8 cmd) { +#else +void __osPfsRequestOneChannel(int channel) { +#endif + u8* ptr; + __OSContRequesFormatShort requestformat; + int i; + +#if BUILD_VERSION >= VERSION_J + __osContLastCmd = CONT_CMD_END; +#else + __osContLastCmd = CONT_CMD_REQUEST_STATUS; +#endif + __osPfsPifRam.pifstatus = CONT_CMD_READ_BUTTON; + + ptr = (u8*)&__osPfsPifRam; + + requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; + requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; +#if BUILD_VERSION >= VERSION_J + requestformat.cmd = cmd; +#else + requestformat.cmd = CONT_CMD_REQUEST_STATUS; +#endif + requestformat.typeh = CONT_CMD_NOP; + requestformat.typel = CONT_CMD_NOP; + requestformat.status = CONT_CMD_NOP; + + for (i = 0; i < channel; i++) { + *ptr++ = CONT_CMD_REQUEST_STATUS; + } + + *(__OSContRequesFormatShort*)ptr = requestformat; + ptr += sizeof(__OSContRequesFormatShort); + *ptr = CONT_CMD_END; +} + +void __osPfsGetOneChannelData(int channel, OSContStatus* data) { + u8* ptr = (u8*)&__osPfsPifRam; + __OSContRequesFormatShort requestformat; + int i; + + for (i = 0; i < channel; i++) { + ptr++; + } + + requestformat = *(__OSContRequesFormatShort*)ptr; + data->errno = CHNL_ERR(requestformat); + + if (data->errno != 0) { + return; + } + + data->type = (requestformat.typel << 8) | (requestformat.typeh); + data->status = requestformat.status; +} diff --git a/lib/ultralib/src/io/pfsinit.c b/lib/ultralib/src/io/pfsinit.c new file mode 100644 index 0000000..5633c78 --- /dev/null +++ b/lib/ultralib/src/io/pfsinit.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/pfsinitpak.c b/lib/ultralib/src/io/pfsinitpak.c new file mode 100644 index 0000000..d3fde1f --- /dev/null +++ b/lib/ultralib/src/io/pfsinitpak.c @@ -0,0 +1,129 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/pfsisplug.c b/lib/ultralib/src/io/pfsisplug.c new file mode 100644 index 0000000..9607907 --- /dev/null +++ b/lib/ultralib/src/io/pfsisplug.c @@ -0,0 +1,97 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "controller.h" +#include "siint.h" + +OSPifRam __osPfsPifRam ALIGNED(16); + +s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern) { + s32 ret = 0; + OSMesg msg; + u8 bitpattern; + OSContStatus contData[MAXCONTROLLERS]; + s32 channel; + u8 bits = 0; + s32 crcErrorCount = 3; + + __osSiGetAccess(); + + do { + __osPfsRequestData(CONT_CMD_REQUEST_STATUS); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + __osPfsGetInitData(&bitpattern, &contData[0]); + + for (channel = 0; channel < __osMaxControllers; channel++) { + if ((contData[channel].status & CONT_ADDR_CRC_ER) == 0) { + crcErrorCount--; + break; + } + } + + if (channel == __osMaxControllers) { + crcErrorCount = 0; + } + } while (crcErrorCount > 0); + + for (channel = 0; channel < __osMaxControllers; channel++) { + if ((contData[channel].errno == 0) && ((contData[channel].status & CONT_CARD_ON) != 0)) { + bits |= (1 << channel); + } + } + __osSiRelAccess(); + *pattern = bits; + return ret; +} + +void __osPfsRequestData(u8 cmd) { + u8* ptr = (u8*)&__osPfsPifRam; + __OSContRequesFormat requestformat; + int i; + + __osContLastCmd = cmd; + __osPfsPifRam.pifstatus = CONT_CMD_EXE; + requestformat.dummy = CONT_CMD_NOP; + requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; + requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; + requestformat.cmd = cmd; + requestformat.typeh = CONT_CMD_NOP; + requestformat.typel = CONT_CMD_NOP; + requestformat.status = CONT_CMD_NOP; + requestformat.dummy1 = CONT_CMD_NOP; + + for (i = 0; i < __osMaxControllers; i++) { + *((__OSContRequesFormat*)ptr) = requestformat; + ptr += sizeof(__OSContRequesFormat); + } + + *ptr = CONT_CMD_END; +} + +void __osPfsGetInitData(u8* pattern, OSContStatus* data) { + u8* ptr; + __OSContRequesFormat requestformat; + int i; + u8 bits = 0; + + ptr = (u8*)&__osPfsPifRam; + + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestformat), data++) { + requestformat = *((__OSContRequesFormat*)ptr); + data->errno = CHNL_ERR(requestformat); + + if (data->errno != 0) { + continue; + } + + data->type = ((requestformat.typel << 8) | requestformat.typeh); + data->status = requestformat.status; + bits |= (1 << i); + } + *pattern = bits; +} diff --git a/lib/ultralib/src/io/pfsnumfiles.c b/lib/ultralib/src/io/pfsnumfiles.c new file mode 100644 index 0000000..7fa352e --- /dev/null +++ b/lib/ultralib/src/io/pfsnumfiles.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/pfsreadwritefile.c b/lib/ultralib/src/io/pfsreadwritefile.c new file mode 100644 index 0000000..17afe54 --- /dev/null +++ b/lib/ultralib/src/io/pfsreadwritefile.c @@ -0,0 +1,124 @@ +#include "PR/os_internal.h" +#include "controller.h" + +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, 0, *bank)); + } + + *page = inode->inode_page[page->inode_t.page]; + + if (page->ipage < pfs->inode_start_page || page->inode_t.bank >= pfs->banks || page->inode_t.page <= 0 || + page->inode_t.page >= ARRLEN(inode->inode_page)) { + + if (page->ipage == 1) { + 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 (dir.start_page.ipage < pfs->inode_start_page || dir.start_page.inode_t.bank >= pfs->banks || + dir.start_page.inode_t.page <= 0 || dir.start_page.inode_t.page >= ARRLEN(inode.inode_page)) { + if ((dir.start_page.ipage == 1)) { + 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/ultralib/src/io/pfsreformat.c b/lib/ultralib/src/io/pfsreformat.c new file mode 100644 index 0000000..687b456 --- /dev/null +++ b/lib/ultralib/src/io/pfsreformat.c @@ -0,0 +1,71 @@ +#include "PR/os_internal.h" +#include "controller.h" +#include "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/ultralib/src/io/pfsrepairid.c b/lib/ultralib/src/io/pfsrepairid.c new file mode 100644 index 0000000..348f8b2 --- /dev/null +++ b/lib/ultralib/src/io/pfsrepairid.c @@ -0,0 +1,73 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/pfssearchfile.c b/lib/ultralib/src/io/pfssearchfile.c new file mode 100644 index 0000000..4fa3c57 --- /dev/null +++ b/lib/ultralib/src/io/pfssearchfile.c @@ -0,0 +1,56 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/pfsselectbank.c b/lib/ultralib/src/io/pfsselectbank.c new file mode 100644 index 0000000..7e33b2d --- /dev/null +++ b/lib/ultralib/src/io/pfsselectbank.c @@ -0,0 +1,22 @@ +#include "PR/os_internal.h" +#include "controller.h" + +#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++) { + temp[i] = bank; + } + + ret = __osContRamWrite(pfs->queue, pfs->channel, CONT_BLOCK_DETECT, temp, FALSE); + + if (ret == 0) { + pfs->activebank = bank; + } + + return ret; +} +#endif diff --git a/lib/ultralib/src/io/pfssetlabel.c b/lib/ultralib/src/io/pfssetlabel.c new file mode 100644 index 0000000..43308c7 --- /dev/null +++ b/lib/ultralib/src/io/pfssetlabel.c @@ -0,0 +1,41 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/pi.c b/lib/ultralib/src/io/pi.c new file mode 100644 index 0000000..3e67ddb --- /dev/null +++ b/lib/ultralib/src/io/pi.c @@ -0,0 +1,15 @@ + +#include "PR/os_internal.h" +#include "piint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osPiDeviceBusy() { + 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/ultralib/src/io/piacs.c b/lib/ultralib/src/io/piacs.c new file mode 100644 index 0000000..c95147f --- /dev/null +++ b/lib/ultralib/src/io/piacs.c @@ -0,0 +1,25 @@ +#include "macros.h" +#include "PR/os_internal.h" + +#define PI_Q_BUF_LEN 1 +u32 __osPiAccessQueueEnabled = 0; +static OSMesg piAccessBuf[PI_Q_BUF_LEN]; +OSMesgQueue __osPiAccessQueue ALIGNED(8); + +void __osPiCreateAccessQueue(void) { + __osPiAccessQueueEnabled = 1; + osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, PI_Q_BUF_LEN); + osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); +} + +void __osPiGetAccess(void) { + OSMesg dummyMesg; + if (!__osPiAccessQueueEnabled) { + __osPiCreateAccessQueue(); + } + osRecvMesg(&__osPiAccessQueue, &dummyMesg, OS_MESG_BLOCK); +} + +void __osPiRelAccess(void) { + osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); +} diff --git a/lib/ultralib/src/io/pidma.c b/lib/ultralib/src/io/pidma.c new file mode 100644 index 0000000..0584e12 --- /dev/null +++ b/lib/ultralib/src/io/pidma.c @@ -0,0 +1,66 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "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/ultralib/src/io/pigetcmdq.c b/lib/ultralib/src/io/pigetcmdq.c new file mode 100644 index 0000000..4724301 --- /dev/null +++ b/lib/ultralib/src/io/pigetcmdq.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "piint.h" + +OSMesgQueue* osPiGetCmdQueue(void) { + if (!__osPiDevMgr.active) { + return NULL; + } else { + return __osPiDevMgr.cmdQueue; + } +} diff --git a/lib/ultralib/src/io/pigetstat.c b/lib/ultralib/src/io/pigetstat.c new file mode 100644 index 0000000..43e9a27 --- /dev/null +++ b/lib/ultralib/src/io/pigetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "piint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 osPiGetStatus() { + return IO_READ(PI_STATUS_REG); +} diff --git a/lib/ultralib/src/io/pigettype.c b/lib/ultralib/src/io/pigettype.c new file mode 100644 index 0000000..f918306 --- /dev/null +++ b/lib/ultralib/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() { + return osRomType; +} diff --git a/src/libultra/io/piint.h b/lib/ultralib/src/io/piint.h similarity index 75% rename from src/libultra/io/piint.h rename to lib/ultralib/src/io/piint.h index 734fdde..50a0858 100644 --- a/src/libultra/io/piint.h +++ b/lib/ultralib/src/io/piint.h @@ -94,12 +94,22 @@ #define LEO_ERROR_29 29 // extern OSDevMgr __osPiDevMgr; -extern OSPiHandle *__osCurrentHandle[2]; +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); @@ -114,14 +124,18 @@ s32 __osEPiRawStartDma(OSPiHandle *, s32 , u32 , void *, u32 ); OSMesgQueue *osPiGetCmdQueue(void); #define WAIT_ON_IOBUSY(stat) \ - while (stat = IO_READ(PI_STATUS_REG), stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \ - ; \ - (void)0 + { \ + 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); \ @@ -151,4 +165,33 @@ OSMesgQueue *osPiGetCmdQueue(void); 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/ultralib/src/io/pimgr.c b/lib/ultralib/src/io/pimgr.c new file mode 100644 index 0000000..d98c6ad --- /dev/null +++ b/lib/ultralib/src/io/pimgr.c @@ -0,0 +1,114 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "piint.h" +#include "PR/rdb.h" + +static OSThread piThread ALIGNED(8); +static char piThreadStack[OS_PIM_STACKSIZE] ALIGNED(16); + +#ifndef _FINALROM +static OSThread ramromThread ALIGNED(8); +static char ramromThreadStack[1024] ALIGNED(16); +static OSMesgQueue getRamromQ ALIGNED(8); +static OSMesg getRamromBuf[1]; +static OSMesgQueue freeRamromQ ALIGNED(8); +static OSMesg freeRamromBuf[1]; +static void ramromMain(void*); +#endif + +static OSMesgQueue piEventQueue ALIGNED(8); +static OSMesg piEventBuf[1]; + +OSDevMgr __osPiDevMgr = { 0 }; +OSPiHandle* __osPiTable = NULL; +#if BUILD_VERSION >= VERSION_J +OSPiHandle __Dom1SpeedParam ALIGNED(8); +OSPiHandle __Dom2SpeedParam ALIGNED(8); +OSPiHandle* __osCurrentHandle[2] ALIGNED(8) = { &__Dom1SpeedParam, &__Dom2SpeedParam }; +#else +extern OSPiHandle CartRomHandle; +extern OSPiHandle LeoDiskHandle; +OSPiHandle* __osCurrentHandle[2] ALIGNED(8) = { &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, &piThreadStack[OS_PIM_STACKSIZE], pri); + osStartThread(&piThread); + +#ifndef _FINALROM + osCreateThread(&ramromThread, 0, ramromMain, NULL, ramromThreadStack + 1024, (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/ultralib/src/io/pirawdma.c b/lib/ultralib/src/io/pirawdma.c new file mode 100644 index 0000000..d5ea8c3 --- /dev/null +++ b/lib/ultralib/src/io/pirawdma.c @@ -0,0 +1,53 @@ +#include "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/ultralib/src/io/pirawread.c b/lib/ultralib/src/io/pirawread.c new file mode 100644 index 0000000..95d7082 --- /dev/null +++ b/lib/ultralib/src/io/pirawread.c @@ -0,0 +1,66 @@ +#include "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/ultralib/src/io/pirawwrite.c b/lib/ultralib/src/io/pirawwrite.c new file mode 100644 index 0000000..92eba84 --- /dev/null +++ b/lib/ultralib/src/io/pirawwrite.c @@ -0,0 +1,21 @@ +#include "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/ultralib/src/io/piread.c b/lib/ultralib/src/io/piread.c new file mode 100644 index 0000000..42bcf3e --- /dev/null +++ b/lib/ultralib/src/io/piread.c @@ -0,0 +1,19 @@ +#include "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/ultralib/src/io/piwrite.c b/lib/ultralib/src/io/piwrite.c new file mode 100644 index 0000000..75c00d1 --- /dev/null +++ b/lib/ultralib/src/io/piwrite.c @@ -0,0 +1,19 @@ +#include "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/ultralib/src/io/si.c b/lib/ultralib/src/io/si.c new file mode 100644 index 0000000..0188927 --- /dev/null +++ b/lib/ultralib/src/io/si.c @@ -0,0 +1,15 @@ +#include "PR/os_internal.h" +#include "siint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osSiDeviceBusy() { + register u32 stat = IO_READ(SI_STATUS_REG); + + if (stat & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/lib/ultralib/src/io/siacs.c b/lib/ultralib/src/io/siacs.c new file mode 100644 index 0000000..8ef5b3f --- /dev/null +++ b/lib/ultralib/src/io/siacs.c @@ -0,0 +1,25 @@ +#include "macros.h" +#include "PR/os_internal.h" + +#define SI_Q_BUF_LEN 1 +static OSMesg siAccessBuf[SI_Q_BUF_LEN] ALIGNED(8); +OSMesgQueue __osSiAccessQueue ALIGNED(8); +u32 __osSiAccessQueueEnabled = 0; + +void __osSiCreateAccessQueue(void) { + __osSiAccessQueueEnabled = 1; + osCreateMesgQueue(&__osSiAccessQueue, siAccessBuf, SI_Q_BUF_LEN); + osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); +} + +void __osSiGetAccess(void) { + OSMesg dummyMesg; + if (!__osSiAccessQueueEnabled) { + __osSiCreateAccessQueue(); + } + osRecvMesg(&__osSiAccessQueue, &dummyMesg, OS_MESG_BLOCK); +} + +void __osSiRelAccess(void) { + osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); +} diff --git a/lib/ultralib/src/io/sigetstat.c b/lib/ultralib/src/io/sigetstat.c new file mode 100644 index 0000000..0225445 --- /dev/null +++ b/lib/ultralib/src/io/sigetstat.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" +#include "siint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +u32 __osSiGetStatus() { + return IO_READ(SI_STATUS_REG); +} diff --git a/src/libultra/io/siint.h b/lib/ultralib/src/io/siint.h similarity index 58% rename from src/libultra/io/siint.h rename to lib/ultralib/src/io/siint.h index 45bf56b..636a87f 100644 --- a/src/libultra/io/siint.h +++ b/lib/ultralib/src/io/siint.h @@ -1,10 +1,15 @@ #ifndef _SIINT_H #define _SIINT_H -#include -#include + +#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/ultralib/src/io/sirawdma.c b/lib/ultralib/src/io/sirawdma.c new file mode 100644 index 0000000..5fb5f8a --- /dev/null +++ b/lib/ultralib/src/io/sirawdma.c @@ -0,0 +1,85 @@ +#include "PR/os_internal.h" +#include "assert.h" +#include "siint.h" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// Adjust line numbers to match assert +#if BUILD_VERSION < VERSION_J +#line 49 +#endif + +// 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; + } +#else + if (__osSiDeviceBusy()) { + return -1; + } +#endif + + if (direction == OS_WRITE) { + osWritebackDCache(dramAddr, 64); + } + + IO_WRITE(SI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); + + if (direction == OS_READ) { + IO_WRITE(SI_PIF_ADDR_RD64B_REG, PIF_RAM_START); + } else { + IO_WRITE(SI_PIF_ADDR_WR64B_REG, PIF_RAM_START); + } + + if (direction == OS_READ) { + osInvalDCache(dramAddr, 64); + } + + return 0; +} diff --git a/lib/ultralib/src/io/sirawread.c b/lib/ultralib/src/io/sirawread.c new file mode 100644 index 0000000..4ce8330 --- /dev/null +++ b/lib/ultralib/src/io/sirawread.c @@ -0,0 +1,62 @@ +#include "PR/os_internal.h" +#include "assert.h" +#include "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/src/libultra/io/sirawwrite.c b/lib/ultralib/src/io/sirawwrite.c similarity index 58% rename from src/libultra/io/sirawwrite.c rename to lib/ultralib/src/io/sirawwrite.c index 9967c1d..795d38a 100644 --- a/src/libultra/io/sirawwrite.c +++ b/lib/ultralib/src/io/sirawwrite.c @@ -1,14 +1,61 @@ #include "PR/os_internal.h" #include "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/ultralib/src/io/sp.c b/lib/ultralib/src/io/sp.c new file mode 100644 index 0000000..3ad9076 --- /dev/null +++ b/lib/ultralib/src/io/sp.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "../os/osint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +int __osSpDeviceBusy() { + 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; + } +} diff --git a/src/libultra/io/spgetstat.c b/lib/ultralib/src/io/spgetstat.c similarity index 100% rename from src/libultra/io/spgetstat.c rename to lib/ultralib/src/io/spgetstat.c diff --git a/lib/ultralib/src/io/sprawdma.c b/lib/ultralib/src/io/sprawdma.c new file mode 100644 index 0000000..6d95a49 --- /dev/null +++ b/lib/ultralib/src/io/sprawdma.c @@ -0,0 +1,77 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/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/ultralib/src/io/sprawread.c b/lib/ultralib/src/io/sprawread.c new file mode 100644 index 0000000..5910a9e --- /dev/null +++ b/lib/ultralib/src/io/sprawread.c @@ -0,0 +1,61 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/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/ultralib/src/io/sprawwrite.c b/lib/ultralib/src/io/sprawwrite.c new file mode 100644 index 0000000..9ce3ebf --- /dev/null +++ b/lib/ultralib/src/io/sprawwrite.c @@ -0,0 +1,61 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "../os/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/src/libultra/io/spsetpc.c b/lib/ultralib/src/io/spsetpc.c similarity index 100% rename from src/libultra/io/spsetpc.c rename to lib/ultralib/src/io/spsetpc.c diff --git a/src/libultra/io/spsetstat.c b/lib/ultralib/src/io/spsetstat.c similarity index 100% rename from src/libultra/io/spsetstat.c rename to lib/ultralib/src/io/spsetstat.c diff --git a/lib/ultralib/src/io/sptask.c b/lib/ultralib/src/io/sptask.c new file mode 100644 index 0000000..8fbfeb2 --- /dev/null +++ b/lib/ultralib/src/io/sptask.c @@ -0,0 +1,82 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/sptask.h" +#include "PR/rcp.h" +#include "../os/osint.h" + +#if BUILD_VERSION < VERSION_J +#ident "$Revision: 1.4 $" +#endif + +#define _osVirtualToPhysical(ptr) \ + if (ptr != NULL) { \ + ptr = (void*)osVirtualToPhysical(ptr); \ + } + +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/ultralib/src/io/sptaskyield.c b/lib/ultralib/src/io/sptaskyield.c new file mode 100644 index 0000000..78bacae --- /dev/null +++ b/lib/ultralib/src/io/sptaskyield.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" + +void osSpTaskYield(void) { + __osSpSetStatus(SP_SET_YIELD); +} diff --git a/lib/ultralib/src/io/sptaskyielded.c b/lib/ultralib/src/io/sptaskyielded.c new file mode 100644 index 0000000..3ecab55 --- /dev/null +++ b/lib/ultralib/src/io/sptaskyielded.c @@ -0,0 +1,18 @@ +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "PR/rcp.h" + +OSYieldResult osSpTaskYielded(OSTask* tp) { + u32 status; + OSYieldResult result; + + status = __osSpGetStatus(); + result = (status & SP_STATUS_YIELDED) ? OS_TASK_YIELDED : 0; + + if (status & SP_STATUS_YIELD) { + tp->t.flags |= result; + tp->t.flags &= ~(OS_TASK_DP_WAIT); + } + + return result; +} diff --git a/lib/ultralib/src/io/vi.c b/lib/ultralib/src/io/vi.c new file mode 100644 index 0000000..246f01f --- /dev/null +++ b/lib/ultralib/src/io/vi.c @@ -0,0 +1,39 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "viint.h" + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +static __OSViContext vi[2] ALIGNED(8) = { 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/src/libultra/io/viblack.c b/lib/ultralib/src/io/viblack.c similarity index 54% rename from src/libultra/io/viblack.c rename to lib/ultralib/src/io/viblack.c index 76cd0b2..30dd85c 100644 --- a/src/libultra/io/viblack.c +++ b/lib/ultralib/src/io/viblack.c @@ -1,11 +1,17 @@ -#include +#include "PR/os_internal.h" #include "viint.h" -void osViBlack(u8 active) -{ + +// TODO: this comes from a header +#ident "$Revision: 1.17 $" + +void osViBlack(u8 active) { register u32 saveMask = __osDisableInt(); - if (active) + + if (active) { __osViNext->state |= VI_STATE_BLACK; - else + } else { __osViNext->state &= ~VI_STATE_BLACK; + } + __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/io/viextendvstart.c b/lib/ultralib/src/io/viextendvstart.c new file mode 100644 index 0000000..7ee06d3 --- /dev/null +++ b/lib/ultralib/src/io/viextendvstart.c @@ -0,0 +1,19 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "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/ultralib/src/io/vifade.c b/lib/ultralib/src/io/vifade.c new file mode 100644 index 0000000..6766871 --- /dev/null +++ b/lib/ultralib/src/io/vifade.c @@ -0,0 +1,18 @@ +#include "PR/os_internal.h" +#include "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/src/libultra/io/vigetcurrcontext.c b/lib/ultralib/src/io/vigetcurrcontext.c similarity index 58% rename from src/libultra/io/vigetcurrcontext.c rename to lib/ultralib/src/io/vigetcurrcontext.c index 729d902..7b1df9b 100644 --- a/src/libultra/io/vigetcurrcontext.c +++ b/lib/ultralib/src/io/vigetcurrcontext.c @@ -1,9 +1,9 @@ -#include +#include "PR/os_internal.h" #include "viint.h" // TODO: this comes from a header #ident "$Revision: 1.17 $" -__OSViContext *__osViGetCurrentContext(void) { +__OSViContext* __osViGetCurrentContext(void) { return __osViCurr; } diff --git a/lib/ultralib/src/io/vigetcurrframebuf.c b/lib/ultralib/src/io/vigetcurrframebuf.c new file mode 100644 index 0000000..de36712 --- /dev/null +++ b/lib/ultralib/src/io/vigetcurrframebuf.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "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/ultralib/src/io/vigetfield.c b/lib/ultralib/src/io/vigetfield.c new file mode 100644 index 0000000..9dcb7fc --- /dev/null +++ b/lib/ultralib/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/ultralib/src/io/vigetline.c b/lib/ultralib/src/io/vigetline.c new file mode 100644 index 0000000..5667d61 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/io/vigetmode.c b/lib/ultralib/src/io/vigetmode.c new file mode 100644 index 0000000..2507372 --- /dev/null +++ b/lib/ultralib/src/io/vigetmode.c @@ -0,0 +1,21 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "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/ultralib/src/io/vigetnextcontext.c b/lib/ultralib/src/io/vigetnextcontext.c new file mode 100644 index 0000000..bb6012a --- /dev/null +++ b/lib/ultralib/src/io/vigetnextcontext.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "viint.h" + +__OSViContext* __osViGetNextContext(void) { + return __osViNext; +} diff --git a/lib/ultralib/src/io/vigetnextframebuf.c b/lib/ultralib/src/io/vigetnextframebuf.c new file mode 100644 index 0000000..2985358 --- /dev/null +++ b/lib/ultralib/src/io/vigetnextframebuf.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "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/ultralib/src/io/vigetstat.c b/lib/ultralib/src/io/vigetstat.c new file mode 100644 index 0000000..8fc6f38 --- /dev/null +++ b/lib/ultralib/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/src/libultra/io/viint.h b/lib/ultralib/src/io/viint.h similarity index 73% rename from src/libultra/io/viint.h rename to lib/ultralib/src/io/viint.h index 3ae94c8..ffe0927 100644 --- a/src/libultra/io/viint.h +++ b/lib/ultralib/src/io/viint.h @@ -24,17 +24,17 @@ #define VI_SUBPIXEL_SH 0x10 #define BURST(hsync_width, color_width, vsync_width, color_start) \ - (hsync_width | (color_width << 8) | (vsync_width << 16) | (color_start << 20)) -#define WIDTH(v) v -#define VSYNC(v) v -#define HSYNC(duration, leap) (duration | (leap << 16)) -#define LEAP(upper, lower) ((upper << 16) | lower) -#define START(start, end) ((start << 16) | end) + (((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 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 SCALE(scaleup, off) (F210((1.0f / (f32)(scaleup))) | (F210((f32)(off)) << 16)) #define VCURRENT(v) v //seemingly unused #define ORIGIN(v) v @@ -67,4 +67,5 @@ extern __OSViContext *__osViNext; extern u32 __additional_scanline; __OSViContext *__osViGetCurrentContext(void); void __osViInit(void); +extern OSDevMgr __osViDevMgr; #endif diff --git a/lib/ultralib/src/io/vimgr.c b/lib/ultralib/src/io/vimgr.c new file mode 100644 index 0000000..0fe51d5 --- /dev/null +++ b/lib/ultralib/src/io/vimgr.c @@ -0,0 +1,126 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" +#include "viint.h" +#include "../os/osint.h" + +OSDevMgr __osViDevMgr = { 0 }; +#if BUILD_VERSION >= VERSION_J +u32 __additional_scanline = 0; +#endif +static OSThread viThread; +static unsigned char viThreadStack[OS_VIM_STACKSIZE] ALIGNED(16); +static OSMesgQueue viEventQueue ALIGNED(8); +static OSMesg viEventBuf[5] ALIGNED(8); +static OSIoMesg viRetraceMsg ALIGNED(8); +static OSIoMesg viCounterMsg ALIGNED(8); + +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, &viThreadStack[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; + 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/ultralib/src/io/virepeatline.c b/lib/ultralib/src/io/virepeatline.c new file mode 100644 index 0000000..1bc4984 --- /dev/null +++ b/lib/ultralib/src/io/virepeatline.c @@ -0,0 +1,17 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/io/visetevent.c b/lib/ultralib/src/io/visetevent.c new file mode 100644 index 0000000..f741a0e --- /dev/null +++ b/lib/ultralib/src/io/visetevent.c @@ -0,0 +1,70 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "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/ultralib/src/io/visetmode.c b/lib/ultralib/src/io/visetmode.c new file mode 100644 index 0000000..5ab2094 --- /dev/null +++ b/lib/ultralib/src/io/visetmode.c @@ -0,0 +1,67 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "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/src/libultra/io/visetspecial.c b/lib/ultralib/src/io/visetspecial.c similarity index 57% rename from src/libultra/io/visetspecial.c rename to lib/ultralib/src/io/visetspecial.c index e8f90b8..0a288e5 100644 --- a/src/libultra/io/visetspecial.c +++ b/lib/ultralib/src/io/visetspecial.c @@ -1,12 +1,36 @@ -#include -#include +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/rcp.h" #include "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 + void osViSetSpecialFeatures(u32 func) { - register u32 saveMask = __osDisableInt(); + 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; @@ -15,33 +39,33 @@ void osViSetSpecialFeatures(u32 func) { 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/ultralib/src/io/visetxscale.c b/lib/ultralib/src/io/visetxscale.c new file mode 100644 index 0000000..6af6535 --- /dev/null +++ b/lib/ultralib/src/io/visetxscale.c @@ -0,0 +1,37 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "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/ultralib/src/io/visetyscale.c b/lib/ultralib/src/io/visetyscale.c new file mode 100644 index 0000000..c1c96f4 --- /dev/null +++ b/lib/ultralib/src/io/visetyscale.c @@ -0,0 +1,34 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "PR/ultralog.h" +#include "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/ultralib/src/io/viswapbuf.c b/lib/ultralib/src/io/viswapbuf.c new file mode 100644 index 0000000..aa077cd --- /dev/null +++ b/lib/ultralib/src/io/viswapbuf.c @@ -0,0 +1,75 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "assert.h" +#include "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/src/libultra/io/viswapcontext.c b/lib/ultralib/src/io/viswapcontext.c similarity index 82% rename from src/libultra/io/viswapcontext.c rename to lib/ultralib/src/io/viswapcontext.c index 01edcd4..2f6d2c6 100644 --- a/src/libultra/io/viswapcontext.c +++ b/lib/ultralib/src/io/viswapcontext.c @@ -1,28 +1,28 @@ -#include -#include +#include "PR/os_internal.h" +#include "PR/rcp.h" #include "viint.h" // TODO: this comes from a header #ident "$Revision: 1.17 $" void __osViSwapContext() { - register OSViMode *vm; - register __OSViContext *vc; + register OSViMode* vm; + register __OSViContext* vc; u32 origin; u32 hStart; +#if BUILD_VERSION >= VERSION_J u32 vStart; +#endif u32 nomValue; u32 field; - register u32 s2; field = 0; vc = __osViNext; vm = vc->modep; - field = IO_READ(VI_CURRENT_REG) & 1; //field num + field = IO_READ(VI_CURRENT_REG) & 1; // field num - s2 = osVirtualToPhysical(vc->framep); - origin = (vm->fldRegs[field].origin) + s2; + origin = osVirtualToPhysical(vc->framep) + (vm->fldRegs[field].origin); if (vc->state & VI_STATE_XSCALE_UPDATED) { vc->x.scale |= (vm->comRegs.xScale & ~VI_SCALE_MASK); } else { @@ -37,7 +37,9 @@ void __osViSwapContext() { vc->y.scale = vm->fldRegs[field].yScale; } +#if BUILD_VERSION >= VERSION_J vStart = (vm->fldRegs[field].vStart - (__additional_scanline << 0x10)) + __additional_scanline; +#endif hStart = vm->comRegs.hStart; if (vc->state & VI_STATE_BLACK) { @@ -61,7 +63,11 @@ 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 BUILD_VERSION >= VERSION_J IO_WRITE(VI_V_START_REG, vStart); +#else + IO_WRITE(VI_V_START_REG, vm->fldRegs[field].vStart); +#endif IO_WRITE(VI_V_BURST_REG, vm->fldRegs[field].vBurst); IO_WRITE(VI_INTR_REG, vm->fldRegs[field].vIntr); IO_WRITE(VI_X_SCALE_REG, vc->x.scale); diff --git a/lib/ultralib/src/io/vitbl.c b/lib/ultralib/src/io/vitbl.c new file mode 100644 index 0000000..476036e --- /dev/null +++ b/lib/ultralib/src/io/vitbl.c @@ -0,0 +1,1740 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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/ultralib/src/libc/bcmp.s b/lib/ultralib/src/libc/bcmp.s new file mode 100644 index 0000000..11db46d --- /dev/null +++ b/lib/ultralib/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/ultralib/src/libc/bcopy.s b/lib/ultralib/src/libc/bcopy.s new file mode 100644 index 0000000..216c378 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/libc/bzero.s b/lib/ultralib/src/libc/bzero.s new file mode 100644 index 0000000..894c186 --- /dev/null +++ b/lib/ultralib/src/libc/bzero.s @@ -0,0 +1,64 @@ +#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: + 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/ultralib/src/libc/ldiv.c b/lib/ultralib/src/libc/ldiv.c new file mode 100644 index 0000000..92388d3 --- /dev/null +++ b/lib/ultralib/src/libc/ldiv.c @@ -0,0 +1,34 @@ +#include "os_version.h" +#include "stdlib.h" + +// TODO: these come from headers +#ident "$Revision: 1.34 $" +#ident "$Revision: 1.5 $" + +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 += 1; + ret.rem -= denom; + } + + return ret; +} + +lldiv_t lldiv(long long num, long long denom) { + lldiv_t ret; + + ret.quot = num / denom; + ret.rem = num - denom * ret.quot; + + if (ret.quot < 0 && ret.rem > 0) { + ret.quot += 1; + ret.rem -= denom; + } + + return ret; +} diff --git a/lib/ultralib/src/libc/ll.c b/lib/ultralib/src/libc/ll.c new file mode 100644 index 0000000..4334b03 --- /dev/null +++ b/lib/ultralib/src/libc/ll.c @@ -0,0 +1,48 @@ +#include "PR/os.h" + +unsigned long long __ull_rshift(unsigned long long a0, unsigned long long a1) { + return a0 >> a1; +} + +unsigned long long __ull_rem(unsigned long long a0, unsigned long long a1) { + return a0 % a1; +} + +unsigned long long __ull_div(unsigned long long a0, unsigned long long a1) { + return a0 / a1; +} + +unsigned long long __ll_lshift(unsigned long long a0, unsigned long long a1) { + return a0 << a1; +} + +long long __ll_rem(unsigned long long a0, long long a1) { + return a0 % a1; +} + +long long __ll_div(long long a0, long long a1) { + return a0 / a1; +} + +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) { + *div = a2 / a3; + *rem = a2 % a3; +} + +long long __ll_mod(long long a0, long long a1) { + long long tmp = a0 % a1; + + if ((tmp < 0 && a1 > 0) || (tmp > 0 && a1 < 0)) { + tmp += a1; + } + + return tmp; +} + +long long __ll_rshift(long long a0, long long a1) { + return a0 >> a1; +} diff --git a/lib/ultralib/src/libc/llbit.c b/lib/ultralib/src/libc/llbit.c new file mode 100644 index 0000000..0680726 --- /dev/null +++ b/lib/ultralib/src/libc/llbit.c @@ -0,0 +1,52 @@ +#include "PR/os.h" +#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/src/libultra/libc/llcvt.c b/lib/ultralib/src/libc/llcvt.c similarity index 73% rename from src/libultra/libc/llcvt.c rename to lib/ultralib/src/libc/llcvt.c index 2c423dd..74d244b 100644 --- a/src/libultra/libc/llcvt.c +++ b/lib/ultralib/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/ultralib/src/libc/sprintf.c b/lib/ultralib/src/libc/sprintf.c new file mode 100644 index 0000000..fd95523 --- /dev/null +++ b/lib/ultralib/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 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/src/libultra/libc/string.c b/lib/ultralib/src/libc/string.c similarity index 50% rename from src/libultra/libc/string.c rename to lib/ultralib/src/libc/string.c index 5f085f6..0f01d1f 100644 --- a/src/libultra/libc/string.c +++ b/lib/ultralib/src/libc/string.c @@ -1,38 +1,36 @@ +#include "PR/ultratypes.h" #include "string.h" -const char* strchr(const char* s, int c) { - const unsigned char ch = c; +// 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') { + if (*s == 0) { return NULL; } s++; } - - return s; + return (char*)s; } size_t strlen(const char* s) { const char* sc = s; - - while (*sc != '\0') { + while (*sc != 0) { sc++; } - - return (size_t)(sc - s); + return sc - s; } void* memcpy(void* s1, const void* s2, size_t n) { - unsigned char* su1 = (unsigned char*)s1; - const unsigned char* su2 = (const unsigned char*)s2; - + char* su1 = (char*)s1; + const char* su2 = (const char*)s2; while (n > 0) { *su1 = *su2; su1++; su2++; n--; } - - return s1; + return (void*)s1; } diff --git a/lib/ultralib/src/libc/syncprintf.c b/lib/ultralib/src/libc/syncprintf.c new file mode 100644 index 0000000..572ac73 --- /dev/null +++ b/lib/ultralib/src/libc/syncprintf.c @@ -0,0 +1,154 @@ +#include "stdarg.h" +#include "PR/os.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) { + 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) { + u32 data; + + 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 args) { + + int ans; +#ifndef _FINALROM + if (__printfunc != NULL) { + ans = _Printf(__printfunc, NULL, fmt, args); + } +#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/src/libultra/libc/xldtob.c b/lib/ultralib/src/libc/xldtob.c similarity index 82% rename from src/libultra/libc/xldtob.c rename to lib/ultralib/src/libc/xldtob.c index b032e57..1dc1434 100644 --- a/src/libultra/libc/xldtob.c +++ b/lib/ultralib/src/libc/xldtob.c @@ -69,34 +69,36 @@ void _Ldtob(_Pft* px, char 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) { + f64 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); @@ -107,14 +109,15 @@ void _Ldtob(_Pft* px, char 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; } @@ -136,7 +139,7 @@ void _Ldtob(_Pft* px, char code) { } if (nsig > 0) { - char 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;) { @@ -158,7 +161,7 @@ void _Ldtob(_Pft* px, char code) { } s16 _Ldunscale(s16* pex, _Pft* px) { - u16* ps = px; + u16* ps = (u16*)px; s16 xchar = (ps[_D0] & _DMASK) >> _DOFF; @@ -182,18 +185,17 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { const unsigned char point = '.'; if (nsig <= 0) { - nsig = 1, p = "0"; // memes + nsig = 1, p = "0"; } if (code == 'f' || (code == 'g' || code == 'G') && xexp >= -4 && xexp < px->prec) { - xexp += 1; + 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; } } @@ -216,7 +218,7 @@ void _Genld(_Pft* px, char 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); @@ -224,7 +226,7 @@ void _Genld(_Pft* px, char 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; @@ -255,11 +257,7 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) { px->prec = 0; } - if (code == 'g') { - code = 'e'; - } else { - code = 'E'; - } + code = (code == 'g') ? 'e' : 'E'; } px->s[px->n1++] = *p++; @@ -290,11 +288,11 @@ void _Genld(_Pft* px, char 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); diff --git a/src/libultra/libc/xlitob.c b/lib/ultralib/src/libc/xlitob.c similarity index 87% rename from src/libultra/libc/xlitob.c rename to lib/ultralib/src/libc/xlitob.c index f297df4..2b27b3a 100644 --- a/src/libultra/libc/xlitob.c +++ b/lib/ultralib/src/libc/xlitob.c @@ -19,11 +19,7 @@ void _Litob(_Pft *args, char type) { s32 i; unsigned long long ullval; - if (type == 'X') { - digs = udigs; - } else { - digs = ldigs; - } + digs = (type == 'X') ? udigs : ldigs; base = (type == 'o') ? 8 : ((type != 'x' && type != 'X') ? 10 : 16); i = BUFF_LEN; @@ -55,9 +51,7 @@ void _Litob(_Pft *args, char type) { } if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { - i = args->width - args->n0 - args->nz0 - args->n1; - - if (i > 0) { + if ((i = args->width - args->n0 - args->nz0 - args->n1) > 0) { args->nz0 += i; } } diff --git a/lib/ultralib/src/libc/xprintf.c b/lib/ultralib/src/libc/xprintf.c new file mode 100644 index 0000000..788f42c --- /dev/null +++ b/lib/ultralib/src/libc/xprintf.c @@ -0,0 +1,257 @@ +#include "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 = (*prout)(arg, s, n)) != NULL) \ + x.nchar += (n); \ + else \ + return x.nchar; \ + } +static char spaces[] = " "; +static char zeroes[] = "00000000000000000000000000000000"; + +static void _Putfld(_Pft *pf, va_list *pap, char code, char *ac); + +int _Printf(outfun prout, char *arg, const char *fmt, va_list args) { + _Pft x; + + x.nchar = 0; + + while (TRUE) { + const char *s; + char 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 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(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 + 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, &args, *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 *x, va_list *args, char type, char *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 = (char *)&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 = (char *)&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 = (char *)&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 = (char *)&buff[x->n0]; + _Litob(x, 'x'); + break; + case 's': + x->s = va_arg(*args, char *); + x->n1 = strlen(x->s); + + if (x->prec >= 0 && x->prec < x->n1) { + x->n1 = x->prec; + } + + break; + case '%': + buff[x->n0++] = '%'; + break; + default: + buff[x->n0++] = type; + break; + } +} diff --git a/lib/ultralib/src/libc/xstdio.h b/lib/ultralib/src/libc/xstdio.h new file mode 100644 index 0000000..bd70de8 --- /dev/null +++ b/lib/ultralib/src/libc/xstdio.h @@ -0,0 +1,37 @@ +#ifndef _XSTDIO_H +#define _XSTDIO_H +#include "PR/ultratypes.h" +#include "stdlib.h" +#include "stdarg.h" + +typedef struct { + /* 0x0 */ union { + /* 0x0 */ long long ll; + /* 0x0 */ double ld; + } v; + /* 0x8 */ unsigned char* s; + /* 0xC */ int n0; + /* 0x10 */ int nz0; + /* 0x14 */ int n1; + /* 0x18 */ int nz1; + /* 0x1C */ int n2; + /* 0x20 */ int nz2; + /* 0x24 */ int prec; + /* 0x28 */ int width; + /* 0x2C */ size_t nchar; + /* 0x30 */ unsigned int flags; + /* 0x34 */ char qual; +} _Pft; + +#define FLAGS_SPACE 1 +#define FLAGS_PLUS 2 +#define FLAGS_MINUS 4 +#define FLAGS_HASH 8 +#define FLAGS_ZERO 16 +typedef char *outfun(char*,const char*,size_t); + +int _Printf(outfun prout, char *arg, const char *fmt, va_list args); +void _Litob(_Pft *args, char type); +void _Ldtob(_Pft* args, char type); + +#endif diff --git a/lib/ultralib/src/log/delay.s b/lib/ultralib/src/log/delay.s new file mode 100644 index 0000000..631781a --- /dev/null +++ b/lib/ultralib/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/ultralib/src/log/log.c b/lib/ultralib/src/log/log.c new file mode 100644 index 0000000..85129d2 --- /dev/null +++ b/lib/ultralib/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 "macros.h" + +#ifndef _FINALROM + +static u32 __osLogOKtoWrite = TRUE; +static u32 __osLogInitialized = FALSE; + +static OSMesgQueue __osLogDoneMsgQ ALIGNED(8); +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/ultralib/src/log/logfloat.c b/lib/ultralib/src/log/logfloat.c new file mode 100644 index 0000000..17db739 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/Makefile b/lib/ultralib/src/mgu/Makefile new file mode 100644 index 0000000..52c29f6 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/asm.h b/lib/ultralib/src/mgu/asm.h new file mode 100644 index 0000000..0c417fa --- /dev/null +++ b/lib/ultralib/src/mgu/asm.h @@ -0,0 +1,49 @@ +/************************************************************************ + 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/ultralib/src/mgu/mtxcatf.s b/lib/ultralib/src/mgu/mtxcatf.s new file mode 100644 index 0000000..4b96124 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/mtxcatl.c b/lib/ultralib/src/mgu/mtxcatl.c new file mode 100644 index 0000000..6054972 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxcatl.c @@ -0,0 +1,44 @@ +/************************************************************************ + 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 "../gu/guint.h" +#include "gu.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 +/* End of file */ diff --git a/lib/ultralib/src/mgu/mtxf2l.s b/lib/ultralib/src/mgu/mtxf2l.s new file mode 100644 index 0000000..43bbe7e --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/mtxident.s b/lib/ultralib/src/mgu/mtxident.s new file mode 100644 index 0000000..a9ec491 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/mtxidentf.s b/lib/ultralib/src/mgu/mtxidentf.s new file mode 100644 index 0000000..a6aa779 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxidentf.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 + +/* + * guMtxIdentF( float matrix[4][4] ) + * substitute unit matrix for floating point matrix + * correspond only when alignment is four byte boundary + * Input + * a0 = matrix + * Output + * *matrix unti matix + */ + .text + .align 5 +LEAF( guMtxIdentF ) + .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 zero, 48(a0) /* line 4 */ + sw zero, 52(a0) + sw zero, 56(a0) + sw t0, 60(a0) + + j ra + + END( guMtxIdentF ) + +/* End of file */ \ No newline at end of file diff --git a/lib/ultralib/src/mgu/mtxl2f.s b/lib/ultralib/src/mgu/mtxl2f.s new file mode 100644 index 0000000..897acfb --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/mtxxfmf.c b/lib/ultralib/src/mgu/mtxxfmf.c new file mode 100644 index 0000000..58c6772 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxxfmf.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: 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/ultralib/src/mgu/mtxxfml.c b/lib/ultralib/src/mgu/mtxxfml.c new file mode 100644 index 0000000..1dfa871 --- /dev/null +++ b/lib/ultralib/src/mgu/mtxxfml.c @@ -0,0 +1,41 @@ +/* + * 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/ultralib/src/mgu/normalize.s b/lib/ultralib/src/mgu/normalize.s new file mode 100644 index 0000000..58b9093 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/regdef.h b/lib/ultralib/src/mgu/regdef.h new file mode 100644 index 0000000..ac9c109 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/rotate.c b/lib/ultralib/src/mgu/rotate.c new file mode 100644 index 0000000..1c09bd8 --- /dev/null +++ b/lib/ultralib/src/mgu/rotate.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 "../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/ultralib/src/mgu/scale.s b/lib/ultralib/src/mgu/scale.s new file mode 100644 index 0000000..01bc290 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/scalef.s b/lib/ultralib/src/mgu/scalef.s new file mode 100644 index 0000000..b27d1e3 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/translate.s b/lib/ultralib/src/mgu/translate.s new file mode 100644 index 0000000..472fd8c --- /dev/null +++ b/lib/ultralib/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/ultralib/src/mgu/translatef.s b/lib/ultralib/src/mgu/translatef.s new file mode 100644 index 0000000..47d14bd --- /dev/null +++ b/lib/ultralib/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/ultralib/src/monutil.s b/lib/ultralib/src/monutil.s new file mode 100644 index 0000000..e5974bd --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/ackramromread.c b/lib/ultralib/src/os/ackramromread.c new file mode 100644 index 0000000..3de1f6f --- /dev/null +++ b/lib/ultralib/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() { +} diff --git a/lib/ultralib/src/os/ackramromwrite.c b/lib/ultralib/src/os/ackramromwrite.c new file mode 100644 index 0000000..a99e951 --- /dev/null +++ b/lib/ultralib/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() { +} diff --git a/lib/ultralib/src/os/afterprenmi.c b/lib/ultralib/src/os/afterprenmi.c new file mode 100644 index 0000000..03b5b24 --- /dev/null +++ b/lib/ultralib/src/os/afterprenmi.c @@ -0,0 +1,5 @@ +#include "PR/os_internal.h" + +s32 osAfterPreNMI() { + return __osSpSetPc(0); +} diff --git a/lib/ultralib/src/os/atomic.c b/lib/ultralib/src/os/atomic.c new file mode 100644 index 0000000..a0bd8fe --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/createmesgqueue.c b/lib/ultralib/src/os/createmesgqueue.c new file mode 100644 index 0000000..5c92f04 --- /dev/null +++ b/lib/ultralib/src/os/createmesgqueue.c @@ -0,0 +1,20 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "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/ultralib/src/os/createthread.c b/lib/ultralib/src/os/createthread.c new file mode 100644 index 0000000..7c17834 --- /dev/null +++ b/lib/ultralib/src/os/createthread.c @@ -0,0 +1,54 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "PR/ultraerror.h" +#include "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 = (u64)__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; + +#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/ultralib/src/os/destroythread.c b/lib/ultralib/src/os/destroythread.c new file mode 100644 index 0000000..c668869 --- /dev/null +++ b/lib/ultralib/src/os/destroythread.c @@ -0,0 +1,49 @@ +#include "PR/os_internal.h" +#include "osint.h" + +void osDestroyThread(OSThread* t) { + register u32 saveMask; + register OSThread* pred; + register OSThread* succ; + + saveMask = __osDisableInt(); + + if (t == NULL) { + t = __osRunningThread; + } else if (t->state != OS_STATE_STOPPED) { + __osDequeueThread(t->queue, t); + } + + if (__osActiveQueue == t) { + __osActiveQueue = __osActiveQueue->tlnext; + } else { +#if BUILD_VERSION >= VERSION_J || !defined(__GNUC__) + pred = __osActiveQueue; + while (pred->priority != -1) { + succ = pred->tlnext; + if (succ == t) { + pred->tlnext = t->tlnext; + break; + } + pred = succ; + } +#else + pred = __osActiveQueue; + succ = pred->tlnext; + while (succ != NULL) { + if (succ == t) { + pred->tlnext = t->tlnext; + break; + } + pred = succ; + succ = pred->tlnext; + } +#endif + } + + if (t == __osRunningThread) { + __osDispatchThread(); + } + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/exceptasm.h b/lib/ultralib/src/os/exceptasm.h new file mode 100644 index 0000000..0d7def5 --- /dev/null +++ b/lib/ultralib/src/os/exceptasm.h @@ -0,0 +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_VALIDCOUNT 8 +#define MQ_FIRST 12 +#define MQ_MSGCOUNT 16 +#define MQ_MSG 20 + +#define OS_EVENTSTATE_MESSAGE_QUEUE 0 +#define OS_EVENTSTATE_MESSAGE 4 + +/* __osHwInt struct member offsets */ +#define HWINTR_CALLBACK 0x00 +#define HWINTR_SP 0x04 + +/* __osHwInt struct size */ +#if BUILD_VERSION >= VERSION_J +#define HWINTR_SIZE 0x8 +#else +#define HWINTR_SIZE 0x4 +#endif + +#endif diff --git a/lib/ultralib/src/os/exceptasm.s b/lib/ultralib/src/os/exceptasm.s new file mode 100644 index 0000000..b7699a8 --- /dev/null +++ b/lib/ultralib/src/os/exceptasm.s @@ -0,0 +1,1069 @@ +#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 + +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) + 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) +#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: +STAY2(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: +STAY2(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) +STAY2(mtc0 k1, C0_SR) +.set noreorder + nop + nop + nop + nop + eret +.set reorder + +skip_kmc_mode: +#endif + +savecontext: + 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 interrupts are enabled*/ + 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: + + 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, ~0 + andi t0, t0, 0x3f + lw ta0, THREAD_RCP(k0) + and t0, t0, ta0 + or t1, t1, t0 +endrcp: + sw t1, THREAD_RCP(k0) +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) + +.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 + 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 + +IP6_Hdlr: + and s0, s0, ~CAUSE_IP6 + b next_interrupt + +IP7_Hdlr: + and s0, s0, ~CAUSE_IP7 + b next_interrupt + +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 BUILD_VERSION >= VERSION_J + and s0, s0, ~CAUSE_IP4 + la t1, __osHwIntTable + add t1, HWINTR_SIZE + lw t2, HWINTR_CALLBACK(t1) + + beqz t2, 1f + + lw sp, HWINTR_SP(t1) + jalr t2 + + beqz v0, 1f + b redispatch + +1: + li a0, MESG(OS_EVENT_CART) + jal send_mesg + b next_interrupt +#else + li a0, MESG(OS_EVENT_CART) + and s0, s0, ~CAUSE_IP4 + la sp, leoDiskStack + addiu sp, 0x1000 - 0x10 # Stack size minus initial frame + li t2, HWINTR_SIZE + lw t2, __osHwIntTable(t2) + + beqz t2, 1f + + jalr t2 + li a0, MESG(OS_EVENT_CART) + + beqz v0, 1f + b redispatch + +1: + jal send_mesg + b next_interrupt +#endif + +rcp: + lw s1, PHYS_TO_K1(MI_INTR_REG) + la t0, __OSGlobalIntMask + lw t0, (t0) + + srl t0, t0, 0x10 + and s1, s1, t0 + andi t1, s1, MI_INTR_SP + beqz t1, vi + + andi s1, s1, 0x3e + lw ta0, PHYS_TO_K1(SP_STATUS_REG) + li t1, (SP_CLR_INTR | SP_CLR_SIG3) + + 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 BUILD_VERSION >= VERSION_J + la t1, __osPiIntTable + lw t2, (t1) + beqz t2, 1f + + lw sp, 4(t1) + move a0, v0 + jalr t2 + + bnez v0, 2f +1: +#endif + li a0, MESG(OS_EVENT_PI) + jal send_mesg +#if BUILD_VERSION >= VERSION_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 +#if !defined(_FINALROM) && BUILD_VERSION >= VERSION_K + sw a1, __osPreviousThread +#endif +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: + lw k1, THREAD_SR(a1) + andi t1, k1, SR_IMASK + beqz t1, 2f + + 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 + + la k0, __OSGlobalIntMask + lw k0, 0(k0) + + srl k0, k0, 0x10 + xor k0, k0, ~0 + andi k0, k0, 0x3f + lw t0, THREAD_RCP(a1) + and k0, k0, t0 + or k1, k1, k0 +3: + 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, 2f +1: + move t9, t8 + lw t8, THREAD_NEXT(t8) + lw ta2, THREAD_PRI(t8) + bge ta2, ta3, 1b +2: + 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 BUILD_VERSION >= VERSION_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 + +#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's 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 +STAY2(mtc0 k1, C0_SR) +.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) + 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) + +1: +.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) + + nop + nop + nop + nop + eret +.set reorder +END(__osDispatchThread) + +LEAF(__osCleanupThread) + move a0, zero +#if !defined(BBPLAYER) && !defined(__sgi) + nop +#endif + jal osDestroyThread +END(__osCleanupThread) diff --git a/lib/ultralib/src/os/exit.c b/lib/ultralib/src/os/exit.c new file mode 100644 index 0000000..24a873f --- /dev/null +++ b/lib/ultralib/src/os/exit.c @@ -0,0 +1,9 @@ +#include "PR/os_internal.h" + +void osExit() { + __osGIOInterrupt(16); + + for (;;) { + ; + } +} diff --git a/src/libultra/os/getactivequeue.c b/lib/ultralib/src/os/getactivequeue.c similarity index 67% rename from src/libultra/os/getactivequeue.c rename to lib/ultralib/src/os/getactivequeue.c index 4175e7d..1fefc88 100644 --- a/src/libultra/os/getactivequeue.c +++ b/lib/ultralib/src/os/getactivequeue.c @@ -1,6 +1,6 @@ #include "PR/os_internal.h" #include "osint.h" -OSThread *__osGetActiveQueue(void) { +OSThread* __osGetActiveQueue(void) { return __osActiveQueue; } diff --git a/lib/ultralib/src/os/getcause.s b/lib/ultralib/src/os/getcause.s new file mode 100644 index 0000000..873464f --- /dev/null +++ b/lib/ultralib/src/os/getcause.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetCause) + STAY2(mfc0 v0, C0_CAUSE) + jr ra +END(__osGetCause) diff --git a/lib/ultralib/src/os/getcompare.s b/lib/ultralib/src/os/getcompare.s new file mode 100644 index 0000000..99c1758 --- /dev/null +++ b/lib/ultralib/src/os/getcompare.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetCompare) + STAY2(mfc0 v0, C0_COMPARE) + jr ra +END(__osGetCompare) diff --git a/lib/ultralib/src/os/getconfig.s b/lib/ultralib/src/os/getconfig.s new file mode 100644 index 0000000..8165178 --- /dev/null +++ b/lib/ultralib/src/os/getconfig.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetConfig) + STAY2(mfc0 v0, C0_CONFIG) + jr ra +END(__osGetConfig) diff --git a/lib/ultralib/src/os/getcount.s b/lib/ultralib/src/os/getcount.s new file mode 100644 index 0000000..28d5a79 --- /dev/null +++ b/lib/ultralib/src/os/getcount.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osGetCount) + STAY2(mfc0 v0, C0_COUNT) + jr ra +END(osGetCount) diff --git a/lib/ultralib/src/os/getcurrfaultthread.c b/lib/ultralib/src/os/getcurrfaultthread.c new file mode 100644 index 0000000..d7668c2 --- /dev/null +++ b/lib/ultralib/src/os/getcurrfaultthread.c @@ -0,0 +1,6 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSThread* __osGetCurrFaultedThread() { + return __osFaultedThread; +} diff --git a/lib/ultralib/src/os/getfpccsr.s b/lib/ultralib/src/os/getfpccsr.s new file mode 100644 index 0000000..56837a5 --- /dev/null +++ b/lib/ultralib/src/os/getfpccsr.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetFpcCsr) + STAY2(cfc1 v0, fcr31) + jr ra +END(__osGetSR) # @bug: Should be __osGetFpcCsr diff --git a/lib/ultralib/src/os/gethwinterrupt.c b/lib/ultralib/src/os/gethwinterrupt.c new file mode 100644 index 0000000..46dc366 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/getintmask.s b/lib/ultralib/src/os/getintmask.s new file mode 100644 index 0000000..573eed1 --- /dev/null +++ b/lib/ultralib/src/os/getintmask.s @@ -0,0 +1,33 @@ +#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/ultralib/src/os/getmemsize.c b/lib/ultralib/src/os/getmemsize.c new file mode 100644 index 0000000..814443d --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/getnextfaultthread.c b/lib/ultralib/src/os/getnextfaultthread.c new file mode 100644 index 0000000..44d723a --- /dev/null +++ b/lib/ultralib/src/os/getnextfaultthread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/os/getsr.s b/lib/ultralib/src/os/getsr.s new file mode 100644 index 0000000..bc9c767 --- /dev/null +++ b/lib/ultralib/src/os/getsr.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetSR) + STAY2(mfc0 v0, C0_SR) + jr ra +END(__osGetSR) diff --git a/lib/ultralib/src/os/getthreadid.c b/lib/ultralib/src/os/getthreadid.c new file mode 100644 index 0000000..8bbc9f6 --- /dev/null +++ b/lib/ultralib/src/os/getthreadid.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSId osGetThreadId(OSThread* thread) { + if (thread == NULL) { + thread = __osRunningThread; + } + + return thread->id; +} diff --git a/lib/ultralib/src/os/getthreadpri.c b/lib/ultralib/src/os/getthreadpri.c new file mode 100644 index 0000000..149f3f7 --- /dev/null +++ b/lib/ultralib/src/os/getthreadpri.c @@ -0,0 +1,10 @@ +#include "PR/os_internal.h" +#include "osint.h" + +OSPri osGetThreadPri(OSThread* thread) { + if (thread == NULL) { + thread = __osRunningThread; + } + + return thread->priority; +} diff --git a/lib/ultralib/src/os/gettime.c b/lib/ultralib/src/os/gettime.c new file mode 100644 index 0000000..aab4133 --- /dev/null +++ b/lib/ultralib/src/os/gettime.c @@ -0,0 +1,25 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +OSTime osGetTime() { + 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/ultralib/src/os/gettlbasid.s b/lib/ultralib/src/os/gettlbasid.s new file mode 100644 index 0000000..a0702ea --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/gettlbhi.s b/lib/ultralib/src/os/gettlbhi.s new file mode 100644 index 0000000..04c03e9 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/gettlblo0.s b/lib/ultralib/src/os/gettlblo0.s new file mode 100644 index 0000000..3b2c2ec --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/gettlblo1.s b/lib/ultralib/src/os/gettlblo1.s new file mode 100644 index 0000000..a24baef --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/gettlbpagemask.s b/lib/ultralib/src/os/gettlbpagemask.s new file mode 100644 index 0000000..de9954a --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/getwatchlo.s b/lib/ultralib/src/os/getwatchlo.s new file mode 100644 index 0000000..4eee9ee --- /dev/null +++ b/lib/ultralib/src/os/getwatchlo.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osGetWatchLo) + STAY2(mfc0 v0, C0_WATCHLO) + jr ra +END(__osGetWatchLo) diff --git a/lib/ultralib/src/os/initialize.c b/lib/ultralib/src/os/initialize.c new file mode 100644 index 0000000..89f4b02 --- /dev/null +++ b/lib/ultralib/src/os/initialize.c @@ -0,0 +1,224 @@ +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/os_version.h" +#include "../io/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); // 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() { + +} +#elif !defined(_FINALROM) && BUILD_VERSION < VERSION_K +static void ptstart() { + +} +#endif + +#if BUILD_VERSION >= VERSION_K +void __osInitialize_autodetect() { +#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/ultralib/src/os/initialize_emu.c b/lib/ultralib/src/os/initialize_emu.c new file mode 100644 index 0000000..7f7dd85 --- /dev/null +++ b/lib/ultralib/src/os/initialize_emu.c @@ -0,0 +1,27 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "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/ultralib/src/os/initialize_isv.c b/lib/ultralib/src/os/initialize_isv.c new file mode 100644 index 0000000..50f6379 --- /dev/null +++ b/lib/ultralib/src/os/initialize_isv.c @@ -0,0 +1,175 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "osint.h" + +#include "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(8); +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/ultralib/src/os/initialize_kmc.c b/lib/ultralib/src/os/initialize_kmc.c new file mode 100644 index 0000000..4952a0d --- /dev/null +++ b/lib/ultralib/src/os/initialize_kmc.c @@ -0,0 +1,152 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "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/ultralib/src/os/initialize_msp.c b/lib/ultralib/src/os/initialize_msp.c new file mode 100644 index 0000000..1f120e1 --- /dev/null +++ b/lib/ultralib/src/os/initialize_msp.c @@ -0,0 +1,152 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "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/ultralib/src/os/initrdb.c b/lib/ultralib/src/os/initrdb.c new file mode 100644 index 0000000..5537eb1 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/interrupt.s b/lib/ultralib/src/os/interrupt.s new file mode 100644 index 0000000..01efe1a --- /dev/null +++ b/lib/ultralib/src/os/interrupt.s @@ -0,0 +1,52 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" +#include "PR/os_version.h" + +.text +.set noreorder +LEAF(__osDisableInt) +#if BUILD_VERSION >= VERSION_J + la t2, __OSGlobalIntMask + lw t3, (t2) + andi t3, 0xFF00 + mfc0 t0, C0_SR + and t1, t0, ~SR_IE + mtc0 t1, C0_SR + andi v0, t0, SR_IE + lw t0, (t2) + andi t0, 0xFF00 + beq t0, t3, No_Change_Global_Int + la t2, __osRunningThread # this is intentionally a macro in the branch delay slot + lw t1, 280(t2) + andi t2, t1, 0xFF00 + and t2, t0 + and t1, 0xFFFF00FF + or t1, t2 + and t1, -2 + mtc0 t1, $12 + 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/ultralib/src/os/invaldcache.s b/lib/ultralib/src/os/invaldcache.s new file mode 100644 index 0000000..ea6a657 --- /dev/null +++ b/lib/ultralib/src/os/invaldcache.s @@ -0,0 +1,58 @@ +#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/ultralib/src/os/invalicache.s b/lib/ultralib/src/os/invalicache.s new file mode 100644 index 0000000..f5ceb58 --- /dev/null +++ b/lib/ultralib/src/os/invalicache.s @@ -0,0 +1,41 @@ +#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/ultralib/src/os/jammesg.c b/lib/ultralib/src/os/jammesg.c new file mode 100644 index 0000000..cef68da --- /dev/null +++ b/lib/ultralib/src/os/jammesg.c @@ -0,0 +1,37 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +s32 osJamMesg(OSMesgQueue* mq, OSMesg msg, s32 flag) { + register u32 saveMask; + +#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 { + __osRestoreInt(saveMask); + return -1; + } + } + + mq->first = (mq->first + mq->msgCount - 1) % mq->msgCount; + mq->msg[mq->first] = msg; + mq->validCount++; + + if (mq->mtqueue->next != NULL) { + osStartThread(__osPopThread(&mq->mtqueue)); + } + + __osRestoreInt(saveMask); + return 0; +} diff --git a/lib/ultralib/src/os/maptlb.s b/lib/ultralib/src/os/maptlb.s new file mode 100644 index 0000000..20125b6 --- /dev/null +++ b/lib/ultralib/src/os/maptlb.s @@ -0,0 +1,111 @@ +#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 + 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 + 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: + STAY2(mtc0 vaddr, C0_ENTRYHI) + beq evenpaddr, -1, 9f + #nop + srl t3, evenpaddr, TLBLO_PFNSHIFT + or t3, t3, t2 + STAY2(mtc0 t3, C0_ENTRYLO0) + b 10f + #nop +9: + STAY2(mtc0 ta0, C0_ENTRYLO0) +10: + lw t3, oddpaddr + beq t3, -1, 11f + #nop + srl t3, t3, TLBLO_PFNSHIFT + or t3, t3, t2 + STAY2(mtc0 t3, C0_ENTRYLO1) + b 12f + #nop +11: + STAY2(mtc0 ta0, C0_ENTRYLO1) + bne evenpaddr, -1, 12f + #nop + li t3, K0BASE + STAY2(mtc0 t3, C0_ENTRYHI) +12: + .set noreorder + nop + tlbwi + nop + nop + nop + nop + STAY2(mtc0 t0, C0_ENTRYHI) + jr ra + #nop +END(osMapTLB) diff --git a/lib/ultralib/src/os/maptlbrdb.s b/lib/ultralib/src/os/maptlbrdb.s new file mode 100644 index 0000000..c004362 --- /dev/null +++ b/lib/ultralib/src/os/maptlbrdb.s @@ -0,0 +1,30 @@ +#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/src/libultra/os/osint.h b/lib/ultralib/src/os/osint.h similarity index 87% rename from src/libultra/os/osint.h rename to lib/ultralib/src/os/osint.h index 7a4c0cd..b73b609 100644 --- a/src/libultra/os/osint.h +++ b/lib/ultralib/src/os/osint.h @@ -39,11 +39,14 @@ extern u32 __osViIntrCount; extern u32 __osTimerCounter; extern u32 __osShutdown; -extern __OSEventState __osEventStateTab[OS_NUM_EVENTS]; +extern OSMesgQueue __osProfTimerQ; +extern OSProf *__osProfileList; +extern OSProf *__osProfileListEnd; +extern u32 __osProfileOverflowBin; + +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); diff --git a/lib/ultralib/src/os/parameters.s b/lib/ultralib/src/os/parameters.s new file mode 100644 index 0000000..450af31 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/physicaltovirtual.c b/lib/ultralib/src/os/physicaltovirtual.c new file mode 100644 index 0000000..6fbb9c3 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/probetlb.s b/lib/ultralib/src/os/probetlb.s new file mode 100644 index 0000000..237db23 --- /dev/null +++ b/lib/ultralib/src/os/probetlb.s @@ -0,0 +1,54 @@ +#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, -8192 # This also works: (TLBHI_VPN2MASK << 32) >> 32 + 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/ultralib/src/os/rdbsend.c b/lib/ultralib/src/os/rdbsend.c new file mode 100644 index 0000000..0dc111e --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/recvmesg.c b/lib/ultralib/src/os/recvmesg.c new file mode 100644 index 0000000..043ed21 --- /dev/null +++ b/lib/ultralib/src/os/recvmesg.c @@ -0,0 +1,40 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +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) { + __osRestoreInt(saveMask); + return -1; + } else { + __osRunningThread->state = OS_STATE_WAITING; + __osEnqueueAndYield(&mq->mtqueue); + } + } + + if (msg != NULL) { + *msg = mq->msg[mq->first]; + } + + mq->first = (mq->first + 1) % mq->msgCount; + mq->validCount--; + + if (mq->fullqueue->next != NULL) { + osStartThread(__osPopThread(&mq->fullqueue)); + } + + __osRestoreInt(saveMask); + return 0; +} diff --git a/src/libultra/os/resetglobalintmask.c b/lib/ultralib/src/os/resetglobalintmask.c similarity index 60% rename from src/libultra/os/resetglobalintmask.c rename to lib/ultralib/src/os/resetglobalintmask.c index 9ca3140..780da7c 100644 --- a/src/libultra/os/resetglobalintmask.c +++ b/lib/ultralib/src/os/resetglobalintmask.c @@ -1,12 +1,9 @@ -#include #include "PR/os_internal.h" -extern u32 __osGlobalIntMask; - void __osResetGlobalIntMask(OSHWIntr mask) { register u32 saveMask = __osDisableInt(); - __osGlobalIntMask &= ~(mask & ~OS_IM_RCP); + __OSGlobalIntMask &= ~(mask & ~OS_IM_RCP); __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/os/sendmesg.c b/lib/ultralib/src/os/sendmesg.c new file mode 100644 index 0000000..19cf3de --- /dev/null +++ b/lib/ultralib/src/os/sendmesg.c @@ -0,0 +1,38 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +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)) { + if (flags == OS_MESG_BLOCK) { + __osRunningThread->state = OS_STATE_WAITING; + __osEnqueueAndYield(&mq->fullqueue); + } else { + __osRestoreInt(saveMask); + return -1; + } + } + + last = (mq->first + mq->validCount) % mq->msgCount; + mq->msg[last] = msg; + mq->validCount++; + + if (mq->mtqueue->next != NULL) { + osStartThread(__osPopThread(&mq->mtqueue)); + } + + __osRestoreInt(saveMask); + return 0; +} diff --git a/lib/ultralib/src/os/setcause.s b/lib/ultralib/src/os/setcause.s new file mode 100644 index 0000000..52e4950 --- /dev/null +++ b/lib/ultralib/src/os/setcause.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCause) + STAY2(mtc0 a0, C0_CAUSE) + jr ra +END(__osSetCause) diff --git a/lib/ultralib/src/os/setcompare.s b/lib/ultralib/src/os/setcompare.s new file mode 100644 index 0000000..dec29a2 --- /dev/null +++ b/lib/ultralib/src/os/setcompare.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCompare) + STAY2(mtc0 a0, C0_COMPARE) + jr ra +END(__osSetCompare) diff --git a/lib/ultralib/src/os/setconfig.s b/lib/ultralib/src/os/setconfig.s new file mode 100644 index 0000000..4f062bd --- /dev/null +++ b/lib/ultralib/src/os/setconfig.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetConfig) + STAY2(mtc0 a0, C0_CONFIG) + jr ra +END(__osSetConfig) diff --git a/lib/ultralib/src/os/setcount.s b/lib/ultralib/src/os/setcount.s new file mode 100644 index 0000000..f94f1d2 --- /dev/null +++ b/lib/ultralib/src/os/setcount.s @@ -0,0 +1,9 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetCount) + STAY2(mtc0 a0, C0_COUNT) + jr ra +END(__osSetCount) diff --git a/lib/ultralib/src/os/seterrorhandler.c b/lib/ultralib/src/os/seterrorhandler.c new file mode 100644 index 0000000..4e839e8 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/seteventmesg.c b/lib/ultralib/src/os/seteventmesg.c new file mode 100644 index 0000000..f59308c --- /dev/null +++ b/lib/ultralib/src/os/seteventmesg.c @@ -0,0 +1,39 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +__OSEventState __osEventStateTab[OS_NUM_EVENTS] ALIGNED(8); +#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/ultralib/src/os/setfpccsr.s b/lib/ultralib/src/os/setfpccsr.s new file mode 100644 index 0000000..caeccaf --- /dev/null +++ b/lib/ultralib/src/os/setfpccsr.s @@ -0,0 +1,10 @@ +#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(__osSetSR) # @bug: Should be __osSetFpcCsr diff --git a/src/libultra/os/setglobalintmask.c b/lib/ultralib/src/os/setglobalintmask.c similarity index 69% rename from src/libultra/os/setglobalintmask.c rename to lib/ultralib/src/os/setglobalintmask.c index 18ebd5a..a718980 100644 --- a/src/libultra/os/setglobalintmask.c +++ b/lib/ultralib/src/os/setglobalintmask.c @@ -1,11 +1,9 @@ #include "PR/os_internal.h" -extern u32 __osGlobalIntMask; - void __osSetGlobalIntMask(OSHWIntr mask) { register u32 saveMask = __osDisableInt(); - __osGlobalIntMask |= mask; - + __OSGlobalIntMask |= mask; + __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/os/sethwinterrupt.c b/lib/ultralib/src/os/sethwinterrupt.c new file mode 100644 index 0000000..9aafe1b --- /dev/null +++ b/lib/ultralib/src/os/sethwinterrupt.c @@ -0,0 +1,32 @@ +#include "PR/os_internal.h" + +// A stack frame was added to hardware interrupt handlers in 2.0J +#if BUILD_VERSION >= VERSION_J + +struct __osHwInt { + s32 (*handler)(void); + void* stackEnd; +}; + +extern struct __osHwInt __osHwIntTable[]; + +void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void* stackEnd) { + register u32 saveMask = __osDisableInt(); + + __osHwIntTable[interrupt].handler = handler; + __osHwIntTable[interrupt].stackEnd = stackEnd; + __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/ultralib/src/os/setintmask.s b/lib/ultralib/src/os/setintmask.s new file mode 100644 index 0000000..f19ed17 --- /dev/null +++ b/lib/ultralib/src/os/setintmask.s @@ -0,0 +1,124 @@ +#include "PR/R4300.h" +#include "PR/rcp.h" +#include "PR/os.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +#define MI_INTR_MASK ((1 << 6) - 1) + +.globl __osRcpImTable + +.text +.set noreorder +LEAF(osSetIntMask) + mfc0 ta0, C0_SR + + andi v0, ta0, OS_IM_CPU + + la t0, __OSGlobalIntMask + lw t3, 0(t0) + + xor t0, t3,-1 + andi t0, t0,(SR_IMASK) + or v0, v0,t0 + + lw t2, PHYS_TO_K1(MI_INTR_MASK_REG) + beqz t2, 1f + srl t1, t3,0x10 + + xor t1, t1,-1 + andi t1, t1, MI_INTR_MASK + or t2, t2,t1 +1: + sll t2, t2,0x10 + or v0, v0,t2 + + and t0, a0, MI_INTR_MASK<<0x10 + and t0, t0,t3 + srl t0, t0,0xf + lhu t2, __osRcpImTable(t0) + sw t2, PHYS_TO_K1(MI_INTR_MASK_REG) + + andi t0, a0, OS_IM_CPU + andi t1, t3, SR_IMASK + and t0, t0,t1 + + and ta0, ta0, ~SR_IMASK + or ta0, ta0,t0 + + mtc0 ta0, C0_SR + nop + nop + jr ra + nop +END(osSetIntMask) + +.rdata +EXPORT(__osRcpImTable) +/* LUT to convert between MI_INTR and MI_INTR_MASK */ +/* MI_INTR is status for each interrupt whereas */ +/* MI_INTR_MASK has seperate bits for set/clr */ +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_CLR_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_CLR_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_CLR_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_CLR_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_CLR_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_CLR_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP +.half MI_INTR_MASK_SET_SP | MI_INTR_MASK_SET_SI | MI_INTR_MASK_SET_AI | MI_INTR_MASK_SET_VI | MI_INTR_MASK_SET_PI | MI_INTR_MASK_SET_DP diff --git a/lib/ultralib/src/os/setpiinterrupt.c b/lib/ultralib/src/os/setpiinterrupt.c new file mode 100644 index 0000000..1af72b5 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/setsr.s b/lib/ultralib/src/os/setsr.s new file mode 100644 index 0000000..d7d98fa --- /dev/null +++ b/lib/ultralib/src/os/setsr.s @@ -0,0 +1,10 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetSR) + STAY2(mtc0 a0, C0_SR) + NOP + jr ra +END(__osSetSR) diff --git a/src/libultra/os/setthreadpri.c b/lib/ultralib/src/os/setthreadpri.c similarity index 52% rename from src/libultra/os/setthreadpri.c rename to lib/ultralib/src/os/setthreadpri.c index 870c1b3..d836323 100644 --- a/src/libultra/os/setthreadpri.c +++ b/lib/ultralib/src/os/setthreadpri.c @@ -1,26 +1,36 @@ -#include +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" -extern OSThread* __osRunningThread; -extern OSThread* __osRunQueue; +void osSetThreadPri(OSThread* t, OSPri pri) { + register u32 saveMask; -void osSetThreadPri(OSThread *t, OSPri pri) -{ - register u32 saveMask = __osDisableInt(); - if (t == NULL) +#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; - if (t->priority != pri) - { + } + + if (t->priority != pri) { t->priority = pri; - if (t != __osRunningThread && t->state != OS_STATE_STOPPED) - { + + if (t != __osRunningThread && t->state != OS_STATE_STOPPED) { __osDequeueThread(t->queue, t); __osEnqueueThread(t->queue, t); } - if (__osRunningThread->priority < __osRunQueue->priority) - { + + if (__osRunningThread->priority < __osRunQueue->priority) { __osRunningThread->state = OS_STATE_RUNNABLE; __osEnqueueAndYield(&__osRunQueue); } } + __osRestoreInt(saveMask); } diff --git a/lib/ultralib/src/os/settime.c b/lib/ultralib/src/os/settime.c new file mode 100644 index 0000000..b7d14e3 --- /dev/null +++ b/lib/ultralib/src/os/settime.c @@ -0,0 +1,16 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +void osSetTime(OSTime time) { + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSETTIME, 0); + return; + } +#endif + + __osCurrentTime = time; +} diff --git a/lib/ultralib/src/os/settimer.c b/lib/ultralib/src/os/settimer.c new file mode 100644 index 0000000..252f63c --- /dev/null +++ b/lib/ultralib/src/os/settimer.c @@ -0,0 +1,56 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/viint.h" + +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; +#endif + +#ifdef _DEBUG + if (!__osViDevMgr.active) { + __osError(ERR_OSSETTIMER, 0); + return 0; + } +#endif + + t->next = NULL; + t->prev = NULL; + t->interval = interval; + t->value = (countdown != 0) ? countdown : interval; + t->mq = mq; + t->msg = msg; + +#if BUILD_VERSION >= VERSION_K + saveMask = __osDisableInt(); + if (__osTimerList->next == __osTimerList) { + + } else { + next = __osTimerList->next; + count = osGetCount(); + value = count - __osTimerCounter; + + if (value < next->value) { + next->value -= value; + } else { + next->value = 1; + } + } + + time = __osInsertTimer(t); + __osSetTimerIntr(__osTimerList->next->value); + __osRestoreInt(saveMask); +#else + time = __osInsertTimer(t); + if (__osTimerList->next == t) { + __osSetTimerIntr(time); + } +#endif + + return 0; +} diff --git a/lib/ultralib/src/os/settlbasid.s b/lib/ultralib/src/os/settlbasid.s new file mode 100644 index 0000000..13a17e8 --- /dev/null +++ b/lib/ultralib/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 + STAY2(mtc0 a0, C0_ENTRYHI) + jr ra +END(osSetTLBASID) diff --git a/lib/ultralib/src/os/setwatchlo.s b/lib/ultralib/src/os/setwatchlo.s new file mode 100644 index 0000000..91cc58e --- /dev/null +++ b/lib/ultralib/src/os/setwatchlo.s @@ -0,0 +1,10 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(__osSetWatchLo) + STAY2(mtc0 a0, C0_WATCHLO) + NOP + jr ra +END(__osSetWatchLo) diff --git a/lib/ultralib/src/os/startthread.c b/lib/ultralib/src/os/startthread.c new file mode 100644 index 0000000..2ce1546 --- /dev/null +++ b/lib/ultralib/src/os/startthread.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" + +void osStartThread(OSThread* t) { + register u32 saveMask = __osDisableInt(); + + switch (t->state) { + case OS_STATE_WAITING: + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__osRunQueue, t); + break; + case OS_STATE_STOPPED: + if (t->queue == NULL || t->queue == &__osRunQueue) { + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__osRunQueue, t); + } else { + t->state = OS_STATE_WAITING; + __osEnqueueThread(t->queue, t); + __osEnqueueThread(&__osRunQueue, __osPopThread(t->queue)); + } + break; +#ifdef _DEBUG + default: + __osError(ERR_OSSTARTTHREAD, 0); + __osRestoreInt(saveMask); + return; +#endif + } + + if (__osRunningThread == NULL) { + __osDispatchThread(); + } else if (__osRunningThread->priority < __osRunQueue->priority) { + __osRunningThread->state = OS_STATE_RUNNABLE; + __osEnqueueAndYield(&__osRunQueue); + } + + __osRestoreInt(saveMask); +} diff --git a/lib/ultralib/src/os/stopthread.c b/lib/ultralib/src/os/stopthread.c new file mode 100644 index 0000000..9a51652 --- /dev/null +++ b/lib/ultralib/src/os/stopthread.c @@ -0,0 +1,23 @@ +#include "PR/os_internal.h" +#include "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/ultralib/src/os/stoptimer.c b/lib/ultralib/src/os/stoptimer.c new file mode 100644 index 0000000..b6db1c1 --- /dev/null +++ b/lib/ultralib/src/os/stoptimer.c @@ -0,0 +1,39 @@ +#include "PR/os_internal.h" +#include "PR/ultraerror.h" +#include "osint.h" +#include "../io/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/ultralib/src/os/syncputchars.c b/lib/ultralib/src/os/syncputchars.c new file mode 100644 index 0000000..d2d5332 --- /dev/null +++ b/lib/ultralib/src/os/syncputchars.c @@ -0,0 +1,35 @@ +#include "PR/os_internal.h" +#include "PR/rdb.h" +#include "PR/rcp.h" +#include "PR/R4300.h" + +unsigned int __osRdbSendMessage = 0; +unsigned int __osRdbWriteOK = 1; + +void __osSyncPutChars(int type, int length, const char* buf) { + rdbPacket packet; + int i; + u32 mask; + + packet.type = type; + packet.length = length; + + for (i = 0; i < length; i++) { + packet.buf[i] = buf[i]; + } + + while (!__osAtomicDec(&__osRdbWriteOK)) { + ; + } + + mask = __osDisableInt(); + *(vu32*)RDB_BASE_REG = *(vu32*)&packet; + + while (!(__osGetCause() & CAUSE_IP6)) { + ; + } + + *(vu32*)RDB_READ_INTR_REG = 0; + __osRdbWriteOK++; + __osRestoreInt(mask); +} diff --git a/lib/ultralib/src/os/testhost.c b/lib/ultralib/src/os/testhost.c new file mode 100644 index 0000000..c134317 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/thread.c b/lib/ultralib/src/os/thread.c new file mode 100644 index 0000000..9a4a141 --- /dev/null +++ b/lib/ultralib/src/os/thread.c @@ -0,0 +1,28 @@ +#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; +#ifdef _DEBUG + t->next = NULL; +#endif + return; + } + pred = succ; + succ = pred->next; + } +} diff --git a/lib/ultralib/src/os/threadasm.h b/lib/ultralib/src/os/threadasm.h new file mode 100644 index 0000000..dfd91b6 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/timerintr.c b/lib/ultralib/src/os/timerintr.c new file mode 100644 index 0000000..10dae50 --- /dev/null +++ b/lib/ultralib/src/os/timerintr.c @@ -0,0 +1,141 @@ +#include "macros.h" +#include "PR/os_internal.h" +#include "osint.h" + +OSTime __osCurrentTime; +u32 __osBaseCounter; +u32 __osViIntrCount; +u32 __osTimerCounter; +OSTimer __osBaseTimer; +OSTimer* __osTimerList = &__osBaseTimer; + +#ifndef _FINALROM +OSMesgQueue __osProfTimerQ ALIGNED(8); +OSProf* __osProfileList; +OSProf* __osProfileListEnd; +u32 __osProfileOverflowBin; +#endif + +void __osTimerServicesInit(void) { + __osCurrentTime = 0; + __osBaseCounter = 0; + __osViIntrCount = 0; + __osTimerList->next = __osTimerList->prev = __osTimerList; + __osTimerList->interval = __osTimerList->value = 0; + __osTimerList->mq = NULL; + __osTimerList->msg = 0; +} + +void __osTimerInterrupt(void) { + OSTimer* t; + u32 count; + u32 elapsed_cycles; + +#ifndef _FINALROM + u32 pc; + s32 offset; + OSProf* prof = __osProfileList; +#endif + + if (__osTimerList->next == __osTimerList) { + return; + } + for (;;) { + t = __osTimerList->next; + + if (t == __osTimerList) { + __osSetCompare(0); + __osTimerCounter = 0; + break; + } + + count = osGetCount(); + elapsed_cycles = count - __osTimerCounter; + __osTimerCounter = count; + + if (elapsed_cycles < t->value) { + t->value -= elapsed_cycles; + __osSetTimerIntr(t->value); + break; + } + + t->prev->next = t->next; + t->next->prev = t->prev; + t->next = NULL; + 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; + __osInsertTimer(t); + } + } +} + +void __osSetTimerIntr(OSTime tim) { + OSTime NewTime; + u32 savedMask; + +#if BUILD_VERSION >= VERSION_K + if (tim < 468) { + tim = 468; + } +#endif + + savedMask = __osDisableInt(); + __osTimerCounter = osGetCount(); + NewTime = __osTimerCounter + tim; + __osSetCompare(NewTime); + __osRestoreInt(savedMask); +} + +OSTime __osInsertTimer(OSTimer* t) { + OSTimer* timep; + OSTime tim; + u32 savedMask = __osDisableInt(); + + timep = __osTimerList->next; + tim = t->value; + for (; timep != __osTimerList && tim > timep->value; timep = timep->next) { + tim -= timep->value; + } + + t->value = tim; + + if (timep != __osTimerList) { + timep->value -= tim; + } + + t->next = timep; + t->prev = timep->prev; + timep->prev->next = t; + timep->prev = t; + __osRestoreInt(savedMask); + return tim; +} diff --git a/lib/ultralib/src/os/unmaptlb.s b/lib/ultralib/src/os/unmaptlb.s new file mode 100644 index 0000000..362fd1e --- /dev/null +++ b/lib/ultralib/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/ultralib/src/os/unmaptlball.s b/lib/ultralib/src/os/unmaptlball.s new file mode 100644 index 0000000..6d4b264 --- /dev/null +++ b/lib/ultralib/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, 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 + bgez t1, 1b + nop + mtc0 t0, C0_ENTRYHI + jr ra + nop +END(osUnmapTLBAll) diff --git a/lib/ultralib/src/os/virtualtophysical.c b/lib/ultralib/src/os/virtualtophysical.c new file mode 100644 index 0000000..553fe68 --- /dev/null +++ b/lib/ultralib/src/os/virtualtophysical.c @@ -0,0 +1,13 @@ +#include "PR/os_internal.h" +#include "PR/R4300.h" +#include "osint.h" + +u32 osVirtualToPhysical(void* addr) { + if (IS_KSEG0(addr)) { + return K0_TO_PHYS(addr); + } else if (IS_KSEG1(addr)) { + return K1_TO_PHYS(addr); + } else { + return __osProbeTLB(addr); + } +} diff --git a/lib/ultralib/src/os/writebackdcache.s b/lib/ultralib/src/os/writebackdcache.s new file mode 100644 index 0000000..5f5b485 --- /dev/null +++ b/lib/ultralib/src/os/writebackdcache.s @@ -0,0 +1,35 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +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: + .set noreorder + cache (C_HWB|CACH_PD), (t0) + 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: + .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/ultralib/src/os/writebackdcacheall.s b/lib/ultralib/src/os/writebackdcacheall.s new file mode 100644 index 0000000..ee8df88 --- /dev/null +++ b/lib/ultralib/src/os/writebackdcacheall.s @@ -0,0 +1,18 @@ +#include "PR/R4300.h" +#include "sys/asm.h" +#include "sys/regdef.h" + +.text +LEAF(osWritebackDCacheAll) + li t0, KUSIZE + li t2, DCACHE_SIZE + addu t1, t0,t2 + addiu t1, t1, -DCACHE_LINESIZE +1: + .set noreorder + cache (C_IWBINV | CACH_PD), (t0) + bltu t0, t1, 1b + addiu t0, t0, DCACHE_LINESIZE + .set reorder + jr ra +END(osWritebackDCacheAll) diff --git a/src/libultra/os/yieldthread.c b/lib/ultralib/src/os/yieldthread.c similarity index 97% rename from src/libultra/os/yieldthread.c rename to lib/ultralib/src/os/yieldthread.c index f4ed7c5..9a4dafb 100644 --- a/src/libultra/os/yieldthread.c +++ b/lib/ultralib/src/os/yieldthread.c @@ -3,7 +3,7 @@ void osYieldThread(void) { register u32 saveMask = __osDisableInt(); - + __osRunningThread->state = OS_STATE_RUNNABLE; __osEnqueueAndYield(&__osRunQueue); __osRestoreInt(saveMask); diff --git a/lib/ultralib/src/rg/free.c b/lib/ultralib/src/rg/free.c new file mode 100644 index 0000000..c426000 --- /dev/null +++ b/lib/ultralib/src/rg/free.c @@ -0,0 +1,73 @@ +#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/ultralib/src/rg/getbufcount.c b/lib/ultralib/src/rg/getbufcount.c new file mode 100644 index 0000000..d4deeba --- /dev/null +++ b/lib/ultralib/src/rg/getbufcount.c @@ -0,0 +1,57 @@ +#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/ultralib/src/rg/getsize.c b/lib/ultralib/src/rg/getsize.c new file mode 100644 index 0000000..2b1fb90 --- /dev/null +++ b/lib/ultralib/src/rg/getsize.c @@ -0,0 +1,57 @@ +#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/ultralib/src/rg/malloc.c b/lib/ultralib/src/rg/malloc.c new file mode 100644 index 0000000..59c0399 --- /dev/null +++ b/lib/ultralib/src/rg/malloc.c @@ -0,0 +1,70 @@ +#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/ultralib/src/rg/printregion.c b/lib/ultralib/src/rg/printregion.c new file mode 100644 index 0000000..6db8f18 --- /dev/null +++ b/lib/ultralib/src/rg/printregion.c @@ -0,0 +1,27 @@ +#include "os_version.h" +#if !defined(_FINALROM) || BUILD_VERSION < VERSION_J + +#include "../os/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/ultralib/src/rg/region.c b/lib/ultralib/src/rg/region.c new file mode 100644 index 0000000..377ec9e --- /dev/null +++ b/lib/ultralib/src/rg/region.c @@ -0,0 +1,232 @@ +#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/ultralib/src/rmon/rmonbrk.c b/lib/ultralib/src/rmon/rmonbrk.c new file mode 100644 index 0000000..0eb3242 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonbrk.c @@ -0,0 +1,432 @@ +#ifndef _FINALROM + +#include "PR/os_internal.h" +#include "dbgproto.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "rmonint.h" + +#include "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(8); +/* breakpoint for alternate branch target */ +static BREAKINFO altBreak; + +static BREAKINFO RCPbreakpoints[NUM_BREAKPOINTS] ALIGNED(8); + +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/ultralib/src/rmon/rmoncmds.c b/lib/ultralib/src/rmon/rmoncmds.c new file mode 100644 index 0000000..88600a6 --- /dev/null +++ b/lib/ultralib/src/rmon/rmoncmds.c @@ -0,0 +1,54 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "rmonint.h" + +#include "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/ultralib/src/rmon/rmonint.h b/lib/ultralib/src/rmon/rmonint.h new file mode 100644 index 0000000..59ad736 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonint.h @@ -0,0 +1,169 @@ +#ifndef _RMONINT_H +#define _RMONINT_H + +#include "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/ultralib/src/rmon/rmonmain.c b/lib/ultralib/src/rmon/rmonmain.c new file mode 100644 index 0000000..564ac44 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonmain.c @@ -0,0 +1,138 @@ +#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 "dbgproto.h" +#include "PR/os_internal.h" +#include "rmonint.h" +#include "PR/rcp.h" +#include "sptask.h" +#include "PR/rdb.h" + +#include "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/ultralib/src/rmon/rmonmem.c b/lib/ultralib/src/rmon/rmonmem.c new file mode 100644 index 0000000..a11051b --- /dev/null +++ b/lib/ultralib/src/rmon/rmonmem.c @@ -0,0 +1,283 @@ +#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 "dbgproto.h" +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "rmonint.h" +#include "PR/rdb.h" + +#include "macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +u8 __rmonUtilityBuffer[256] ALIGNED(8); + +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/ultralib/src/rmon/rmonmisc.c b/lib/ultralib/src/rmon/rmonmisc.c new file mode 100644 index 0000000..a1aa96c --- /dev/null +++ b/lib/ultralib/src/rmon/rmonmisc.c @@ -0,0 +1,76 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "PR/os_internal.h" +#include "PR/sptask.h" +#include "rmonint.h" + +#include "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(8); +static OSThread rmonIOThread ALIGNED(8); +static OSMesg rmonMsgs[8] ALIGNED(8); +static u64 rmonIOStack[2048] ALIGNED(16); +static OSMesg rmonPiMsgs[8] ALIGNED(8); +static OSMesgQueue rmonPiMQ ALIGNED(8); + +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, rmonIOStack + ARRLEN(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/ultralib/src/rmon/rmonprint.c b/lib/ultralib/src/rmon/rmonprint.c new file mode 100644 index 0000000..8ac91a5 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonprint.c @@ -0,0 +1 @@ +/* Empty file */ diff --git a/lib/ultralib/src/rmon/rmonrcp.s b/lib/ultralib/src/rmon/rmonrcp.s new file mode 100644 index 0000000..539f41d --- /dev/null +++ b/lib/ultralib/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/ultralib/src/rmon/rmonregs.c b/lib/ultralib/src/rmon/rmonregs.c new file mode 100644 index 0000000..39cf5b2 --- /dev/null +++ b/lib/ultralib/src/rmon/rmonregs.c @@ -0,0 +1,417 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "PR/os_internal.h" +#include "PR/rcp.h" +#include "PR/sptask.h" +#include "rmonint.h" +#include "PR/rdb.h" +#include "PR/os_version.h" + +#include "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(8); + +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/ultralib/src/rmon/rmonsio.c b/lib/ultralib/src/rmon/rmonsio.c new file mode 100644 index 0000000..3e45995 --- /dev/null +++ b/lib/ultralib/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 "dbgproto.h" +#include "rmonint.h" +#include "PR/ramrom.h" +#include "PR/rdb.h" +#include "PR/rmon.h" + +#include "macros.h" + +// TODO: this comes from a header +#if BUILD_VERSION >= VERSION_J +#ident "$Revision: 1.4 $" +#endif + +static OSMesgQueue IOmq ALIGNED(8); +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/ultralib/src/rmon/rmontask.c b/lib/ultralib/src/rmon/rmontask.c new file mode 100644 index 0000000..25757a7 --- /dev/null +++ b/lib/ultralib/src/rmon/rmontask.c @@ -0,0 +1,343 @@ +#ifndef _FINALROM + +#include "dbgproto.h" +#include "PR/os_internal.h" +#include "rmonint.h" +#include "PR/rcp.h" +#include "PR/sptask.h" + +#include "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/ultralib/src/sched/Makefile b/lib/ultralib/src/sched/Makefile new file mode 100644 index 0000000..d4cd659 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/sched/sched.c b/lib/ultralib/src/sched/sched.c new file mode 100644 index 0000000..70ebf55 --- /dev/null +++ b/lib/ultralib/src/sched/sched.c @@ -0,0 +1,620 @@ +/*==================================================================== + * + * 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/ultralib/src/sched/sched_log.fmt b/lib/ultralib/src/sched/sched_log.fmt new file mode 100644 index 0000000..50e042d --- /dev/null +++ b/lib/ultralib/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/ultralib/src/sp/Makefile b/lib/ultralib/src/sp/Makefile new file mode 100644 index 0000000..7807431 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/sp/clearattribute.c b/lib/ultralib/src/sp/clearattribute.c new file mode 100644 index 0000000..e5faf16 --- /dev/null +++ b/lib/ultralib/src/sp/clearattribute.c @@ -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. + */ + +#include + +/* + * spClearAttribute() + * + * Clears attributes about a sprite. + */ +void +spClearAttribute (Sprite *sp, s32 attr) +{ + sp->attr &= ~attr; +} diff --git a/lib/ultralib/src/sp/color.c b/lib/ultralib/src/sp/color.c new file mode 100644 index 0000000..a5abc85 --- /dev/null +++ b/lib/ultralib/src/sp/color.c @@ -0,0 +1,39 @@ +/* + * 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/ultralib/src/sp/hide.c b/lib/ultralib/src/sp/hide.c new file mode 100644 index 0000000..6223c2c --- /dev/null +++ b/lib/ultralib/src/sp/hide.c @@ -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. + */ + +#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/ultralib/src/sp/setattribute.c b/lib/ultralib/src/sp/setattribute.c new file mode 100644 index 0000000..887df08 --- /dev/null +++ b/lib/ultralib/src/sp/setattribute.c @@ -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. + */ + +#include + +/* + * spSetAttribute() + * + * Sets attributes about a sprite. + */ +void +spSetAttribute ( Sprite *sp, s32 attr) +{ + sp->attr |= attr; +} diff --git a/lib/ultralib/src/sp/show.c b/lib/ultralib/src/sp/show.c new file mode 100644 index 0000000..dc0db54 --- /dev/null +++ b/lib/ultralib/src/sp/show.c @@ -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. + */ + +#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/ultralib/src/sp/sprite.c b/lib/ultralib/src/sp/sprite.c new file mode 100644 index 0000000..719a662 --- /dev/null +++ b/lib/ultralib/src/sp/sprite.c @@ -0,0 +1,761 @@ +/* + * 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/ultralib/src/sp/spriteex.c b/lib/ultralib/src/sp/spriteex.c new file mode 100644 index 0000000..772036f --- /dev/null +++ b/lib/ultralib/src/sp/spriteex.c @@ -0,0 +1,2 @@ +#define F3DEX_GBI +#include "sprite.c" diff --git a/lib/ultralib/src/sp/spriteex2.c b/lib/ultralib/src/sp/spriteex2.c new file mode 100644 index 0000000..2ef1221 --- /dev/null +++ b/lib/ultralib/src/sp/spriteex2.c @@ -0,0 +1,2 @@ +#define F3DEX_GBI_2 +#include "sprite.c" diff --git a/lib/ultralib/src/sp/spscale.c b/lib/ultralib/src/sp/spscale.c new file mode 100644 index 0000000..4f1bd92 --- /dev/null +++ b/lib/ultralib/src/sp/spscale.c @@ -0,0 +1,42 @@ +/* + * 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/ultralib/src/vimodes/vimodefpalhaf1.c b/lib/ultralib/src/vimodes/vimodefpalhaf1.c new file mode 100644 index 0000000..5ad95fa --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodefpalhan1.c b/lib/ultralib/src/vimodes/vimodefpalhan1.c new file mode 100644 index 0000000..f29ff4b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodefpalhpf1.c b/lib/ultralib/src/vimodes/vimodefpalhpf1.c new file mode 100644 index 0000000..db0eb9d --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpalhpf2.c b/lib/ultralib/src/vimodes/vimodefpalhpf2.c new file mode 100644 index 0000000..dfd3d92 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpalhpn1.c b/lib/ultralib/src/vimodes/vimodefpalhpn1.c new file mode 100644 index 0000000..8b665a8 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpalhpn2.c b/lib/ultralib/src/vimodes/vimodefpalhpn2.c new file mode 100644 index 0000000..c046e97 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpalhpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpallaf1.c b/lib/ultralib/src/vimodes/vimodefpallaf1.c new file mode 100644 index 0000000..e4a8a9e --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodefpallaf2.c b/lib/ultralib/src/vimodes/vimodefpallaf2.c new file mode 100644 index 0000000..8b3b608 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodefpallan1.c b/lib/ultralib/src/vimodes/vimodefpallan1.c new file mode 100644 index 0000000..f190f55 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpallan2.c b/lib/ultralib/src/vimodes/vimodefpallan2.c new file mode 100644 index 0000000..13c71e5 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodefpallpf1.c b/lib/ultralib/src/vimodes/vimodefpallpf1.c new file mode 100644 index 0000000..d1c307c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpallpf2.c b/lib/ultralib/src/vimodes/vimodefpallpf2.c new file mode 100644 index 0000000..385b1df --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpallpn1.c b/lib/ultralib/src/vimodes/vimodefpallpn1.c new file mode 100644 index 0000000..6fbcfe9 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodefpallpn2.c b/lib/ultralib/src/vimodes/vimodefpallpn2.c new file mode 100644 index 0000000..c852cf9 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodefpallpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempalhaf1.c b/lib/ultralib/src/vimodes/vimodempalhaf1.c new file mode 100644 index 0000000..c9a74dc --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodempalhan1.c b/lib/ultralib/src/vimodes/vimodempalhan1.c new file mode 100644 index 0000000..038163b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodempalhpf1.c b/lib/ultralib/src/vimodes/vimodempalhpf1.c new file mode 100644 index 0000000..4bbb0e5 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempalhpf2.c b/lib/ultralib/src/vimodes/vimodempalhpf2.c new file mode 100644 index 0000000..b2fad3d --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempalhpn1.c b/lib/ultralib/src/vimodes/vimodempalhpn1.c new file mode 100644 index 0000000..3955a4f --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempalhpn2.c b/lib/ultralib/src/vimodes/vimodempalhpn2.c new file mode 100644 index 0000000..b4c7a6d --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempalhpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempallaf1.c b/lib/ultralib/src/vimodes/vimodempallaf1.c new file mode 100644 index 0000000..1369d39 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodempallaf2.c b/lib/ultralib/src/vimodes/vimodempallaf2.c new file mode 100644 index 0000000..0502362 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodempallan1.c b/lib/ultralib/src/vimodes/vimodempallan1.c new file mode 100644 index 0000000..a3f4e69 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempallan2.c b/lib/ultralib/src/vimodes/vimodempallan2.c new file mode 100644 index 0000000..65817e7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodempallpf1.c b/lib/ultralib/src/vimodes/vimodempallpf1.c new file mode 100644 index 0000000..7df1655 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempallpf2.c b/lib/ultralib/src/vimodes/vimodempallpf2.c new file mode 100644 index 0000000..285832e --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempallpn1.c b/lib/ultralib/src/vimodes/vimodempallpn1.c new file mode 100644 index 0000000..8914794 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodempallpn2.c b/lib/ultralib/src/vimodes/vimodempallpn2.c new file mode 100644 index 0000000..40f381c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodempallpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentschaf1.c b/lib/ultralib/src/vimodes/vimodentschaf1.c new file mode 100644 index 0000000..e6ad8bc --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodentschan1.c b/lib/ultralib/src/vimodes/vimodentschan1.c new file mode 100644 index 0000000..14711e7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodentschpf1.c b/lib/ultralib/src/vimodes/vimodentschpf1.c new file mode 100644 index 0000000..8f70311 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentschpf2.c b/lib/ultralib/src/vimodes/vimodentschpf2.c new file mode 100644 index 0000000..8533e23 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentschpn1.c b/lib/ultralib/src/vimodes/vimodentschpn1.c new file mode 100644 index 0000000..f82e277 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentschpn2.c b/lib/ultralib/src/vimodes/vimodentschpn2.c new file mode 100644 index 0000000..d1b5974 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentschpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentsclaf1.c b/lib/ultralib/src/vimodes/vimodentsclaf1.c new file mode 100644 index 0000000..fe12792 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodentsclaf2.c b/lib/ultralib/src/vimodes/vimodentsclaf2.c new file mode 100644 index 0000000..acf2c3c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodentsclan1.c b/lib/ultralib/src/vimodes/vimodentsclan1.c new file mode 100644 index 0000000..0092a00 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentsclan2.c b/lib/ultralib/src/vimodes/vimodentsclan2.c new file mode 100644 index 0000000..da2747b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodentsclpf1.c b/lib/ultralib/src/vimodes/vimodentsclpf1.c new file mode 100644 index 0000000..b6bb5e7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentsclpf2.c b/lib/ultralib/src/vimodes/vimodentsclpf2.c new file mode 100644 index 0000000..f3f82c7 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentsclpn1.c b/lib/ultralib/src/vimodes/vimodentsclpn1.c new file mode 100644 index 0000000..ecc68cb --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodentsclpn2.c b/lib/ultralib/src/vimodes/vimodentsclpn2.c new file mode 100644 index 0000000..bce83b8 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodentsclpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepalhaf1.c b/lib/ultralib/src/vimodes/vimodepalhaf1.c new file mode 100644 index 0000000..3ff1394 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodepalhan1.c b/lib/ultralib/src/vimodes/vimodepalhan1.c new file mode 100644 index 0000000..3d32ba6 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodepalhpf1.c b/lib/ultralib/src/vimodes/vimodepalhpf1.c new file mode 100644 index 0000000..bdd0871 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepalhpf2.c b/lib/ultralib/src/vimodes/vimodepalhpf2.c new file mode 100644 index 0000000..565ac4f --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepalhpn1.c b/lib/ultralib/src/vimodes/vimodepalhpn1.c new file mode 100644 index 0000000..a0c1ecc --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepalhpn2.c b/lib/ultralib/src/vimodes/vimodepalhpn2.c new file mode 100644 index 0000000..d6e05b8 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepalhpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepallaf1.c b/lib/ultralib/src/vimodes/vimodepallaf1.c new file mode 100644 index 0000000..3d03857 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallaf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodepallaf2.c b/lib/ultralib/src/vimodes/vimodepallaf2.c new file mode 100644 index 0000000..4fc496c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallaf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodepallan1.c b/lib/ultralib/src/vimodes/vimodepallan1.c new file mode 100644 index 0000000..22a893c --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallan1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepallan2.c b/lib/ultralib/src/vimodes/vimodepallan2.c new file mode 100644 index 0000000..d32360b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallan2.c @@ -0,0 +1,36 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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_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/ultralib/src/vimodes/vimodepallpf1.c b/lib/ultralib/src/vimodes/vimodepallpf1.c new file mode 100644 index 0000000..37d68e4 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpf1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepallpf2.c b/lib/ultralib/src/vimodes/vimodepallpf2.c new file mode 100644 index 0000000..c37ebe1 --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpf2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepallpn1.c b/lib/ultralib/src/vimodes/vimodepallpn1.c new file mode 100644 index 0000000..eafbe6b --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpn1.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/vimodes/vimodepallpn2.c b/lib/ultralib/src/vimodes/vimodepallpn2.c new file mode 100644 index 0000000..49a26fd --- /dev/null +++ b/lib/ultralib/src/vimodes/vimodepallpn2.c @@ -0,0 +1,37 @@ +#include "PR/os.h" +#include "PR/rcp.h" +#include "../io/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/ultralib/src/voice/voicecheckresult.c b/lib/ultralib/src/voice/voicecheckresult.c new file mode 100644 index 0000000..5318652 --- /dev/null +++ b/lib/ultralib/src/voice/voicecheckresult.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicecheckword.c b/lib/ultralib/src/voice/voicecheckword.c new file mode 100644 index 0000000..05c2a59 --- /dev/null +++ b/lib/ultralib/src/voice/voicecheckword.c @@ -0,0 +1,80 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicecleardictionary.c b/lib/ultralib/src/voice/voicecleardictionary.c new file mode 100644 index 0000000..6ed1464 --- /dev/null +++ b/lib/ultralib/src/voice/voicecleardictionary.c @@ -0,0 +1,29 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicecontread2.c b/lib/ultralib/src/voice/voicecontread2.c new file mode 100644 index 0000000..a204ffc --- /dev/null +++ b/lib/ultralib/src/voice/voicecontread2.c @@ -0,0 +1,73 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/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/ultralib/src/voice/voicecontread36.c b/lib/ultralib/src/voice/voicecontread36.c new file mode 100644 index 0000000..c537aff --- /dev/null +++ b/lib/ultralib/src/voice/voicecontread36.c @@ -0,0 +1,73 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/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/ultralib/src/voice/voicecontrolgain.c b/lib/ultralib/src/voice/voicecontrolgain.c new file mode 100644 index 0000000..95e9bb2 --- /dev/null +++ b/lib/ultralib/src/voice/voicecontrolgain.c @@ -0,0 +1,28 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicecontwrite20.c b/lib/ultralib/src/voice/voicecontwrite20.c new file mode 100644 index 0000000..d1a7446 --- /dev/null +++ b/lib/ultralib/src/voice/voicecontwrite20.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/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/ultralib/src/voice/voicecontwrite4.c b/lib/ultralib/src/voice/voicecontwrite4.c new file mode 100644 index 0000000..6f00586 --- /dev/null +++ b/lib/ultralib/src/voice/voicecontwrite4.c @@ -0,0 +1,74 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/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/ultralib/src/voice/voicecountsyllables.c b/lib/ultralib/src/voice/voicecountsyllables.c new file mode 100644 index 0000000..b0112ef --- /dev/null +++ b/lib/ultralib/src/voice/voicecountsyllables.c @@ -0,0 +1,55 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicecrc.c b/lib/ultralib/src/voice/voicecrc.c new file mode 100644 index 0000000..56b4838 --- /dev/null +++ b/lib/ultralib/src/voice/voicecrc.c @@ -0,0 +1,40 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" + +#define VOICE_CRC_LENGTH 8 +#define VOICE_CRC_GENERATOR 0x85 + +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/ultralib/src/voice/voicegetreaddata.c b/lib/ultralib/src/voice/voicegetreaddata.c new file mode 100644 index 0000000..d2f5063 --- /dev/null +++ b/lib/ultralib/src/voice/voicegetreaddata.c @@ -0,0 +1,94 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicegetstatus.c b/lib/ultralib/src/voice/voicegetstatus.c new file mode 100644 index 0000000..e7328c1 --- /dev/null +++ b/lib/ultralib/src/voice/voicegetstatus.c @@ -0,0 +1,62 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/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/ultralib/src/voice/voiceinit.c b/lib/ultralib/src/voice/voiceinit.c new file mode 100644 index 0000000..5074a84 --- /dev/null +++ b/lib/ultralib/src/voice/voiceinit.c @@ -0,0 +1,42 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voiceinternal.h b/lib/ultralib/src/voice/voiceinternal.h new file mode 100644 index 0000000..8dc6299 --- /dev/null +++ b/lib/ultralib/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/ultralib/src/voice/voicemaskdictionary.c b/lib/ultralib/src/voice/voicemaskdictionary.c new file mode 100644 index 0000000..39db7ac --- /dev/null +++ b/lib/ultralib/src/voice/voicemaskdictionary.c @@ -0,0 +1,48 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicesetadconverter.c b/lib/ultralib/src/voice/voicesetadconverter.c new file mode 100644 index 0000000..d1c5eb2 --- /dev/null +++ b/lib/ultralib/src/voice/voicesetadconverter.c @@ -0,0 +1,69 @@ +#include "PR/os_internal.h" +#include "io/controller.h" +#include "PR/os_voice.h" +#include "voiceinternal.h" +#include "io/controller_voice.h" +#include "io/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/ultralib/src/voice/voicesetword.c b/lib/ultralib/src/voice/voicesetword.c new file mode 100644 index 0000000..7969fae --- /dev/null +++ b/lib/ultralib/src/voice/voicesetword.c @@ -0,0 +1,54 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicestartreaddata.c b/lib/ultralib/src/voice/voicestartreaddata.c new file mode 100644 index 0000000..ea83da0 --- /dev/null +++ b/lib/ultralib/src/voice/voicestartreaddata.c @@ -0,0 +1,36 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/src/voice/voicestopreaddata.c b/lib/ultralib/src/voice/voicestopreaddata.c new file mode 100644 index 0000000..b43eb81 --- /dev/null +++ b/lib/ultralib/src/voice/voicestopreaddata.c @@ -0,0 +1,59 @@ +#include "PR/os_internal.h" +#include "io/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/ultralib/tools/Makefile b/lib/ultralib/tools/Makefile new file mode 100644 index 0000000..cf0d35e --- /dev/null +++ b/lib/ultralib/tools/Makefile @@ -0,0 +1,46 @@ + +.PHONY: all clean distclean + +# GCC +GCC_DIR := gcc +AR := $(GCC_DIR)/ar +GCC-2.7.2 := $(GCC_DIR)/gcc +STRIP-2.7 := $(GCC_DIR)/strip-2.7 + +# IDO +IDO_DIR := ido +IDO-5.3 := $(IDO_DIR)/cc + +all: $(AR) $(GCC-2.7.2) $(STRIP-2.7) $(IDO-5.3) + +$(AR): | $(GCC_DIR) + wget https://github.com/decompals/mips-binutils-2.6/releases/download/main/binutils-2.6-linux.tar.gz + tar xf binutils-2.6-linux.tar.gz -C $(GCC_DIR) + $(RM) binutils-2.6-linux.tar.gz + +$(GCC-2.7.2): | $(GCC_DIR) + wget https://github.com/decompals/mips-gcc-2.7.2/releases/download/main/gcc-2.7.2-linux.tar.gz + tar xf gcc-2.7.2-linux.tar.gz -C $(GCC_DIR) + $(RM) gcc-2.7.2-linux.tar.gz + +$(STRIP-2.7): | $(GCC_DIR) + wget https://github.com/decompals/mips-binutils-2.7/releases/download/release/binutils-2.7.tar.gz + tar xf binutils-2.7.tar.gz -C $(GCC_DIR) + $(RM) binutils-2.7.tar.gz + +$(GCC_DIR): + mkdir -p $@ + +$(IDO-5.3): | $(IDO_DIR) + wget https://github.com/decompals/ido-static-recomp/releases/latest/download/ido-5.3-recomp-linux.tar.gz + tar xf ido-5.3-recomp-linux.tar.gz -C $(IDO_DIR) + $(RM) ido-5.3-recomp-linux.tar.gz + +$(IDO_DIR): + mkdir -p $@ + +clean: + $(RM) -rf $(GCC_DIR) + $(RM) -rf $(IDO_DIR) + +distclean: clean diff --git a/lib/ultralib/tools/ar.py b/lib/ultralib/tools/ar.py new file mode 100755 index 0000000..0f3e574 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/asm_differ/.gitignore b/lib/ultralib/tools/asm_differ/.gitignore new file mode 100644 index 0000000..eb176dc --- /dev/null +++ b/lib/ultralib/tools/asm_differ/.gitignore @@ -0,0 +1,2 @@ +.mypy_cache/ +__pycache__/ diff --git a/lib/ultralib/tools/asm_differ/.gitrepo b/lib/ultralib/tools/asm_differ/.gitrepo new file mode 100644 index 0000000..2e999c8 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/.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/git-commands/git-subrepo#readme +; +[subrepo] + remote = https://github.com/simonlindholm/asm-differ + branch = main + commit = 4b38c884c1efdc3bfa8b14f13015a69368a8d3a2 + parent = 32a1a8061de197c4f10d4904cd72a22dd7cf905c + method = merge + cmdver = 0.4.3 diff --git a/lib/ultralib/tools/asm_differ/.pre-commit-config.yaml b/lib/ultralib/tools/asm_differ/.pre-commit-config.yaml new file mode 100644 index 0000000..6695f71 --- /dev/null +++ b/lib/ultralib/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/lib/ultralib/tools/asm_differ/LICENSE b/lib/ultralib/tools/asm_differ/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/lib/ultralib/tools/asm_differ/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/lib/ultralib/tools/asm_differ/README.md b/lib/ultralib/tools/asm_differ/README.md new file mode 100644 index 0000000..4a7f329 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/asm_differ/diff-stylesheet.css b/lib/ultralib/tools/asm_differ/diff-stylesheet.css new file mode 100644 index 0000000..79da120 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/asm_differ/diff.py b/lib/ultralib/tools/asm_differ/diff.py new file mode 100755 index 0000000..8ed764f --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/asm_differ/diff_settings.py b/lib/ultralib/tools/asm_differ/diff_settings.py new file mode 100644 index 0000000..183b96b --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/asm_differ/mypy.ini b/lib/ultralib/tools/asm_differ/mypy.ini new file mode 100644 index 0000000..138b939 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/asm_differ/screenshot.png b/lib/ultralib/tools/asm_differ/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3230555328cd9acdf388ce1626415ceb78760535 GIT binary patch literal 99842 zcmd431yG#Zx~@w?g1b9Gg1b8j?(Ul4?yezdaCdiicXxMpXxtjt+nIC8T?|I+RzvN^@;bCxKz`(%Z#l?gaz`)*jgWgV15TGr};=9eDAJ8^p z>h@q@2))1G@8YNtaKXSnfr$%!RdPu^S#woWo_ig*yyF8fki`5Th6sk)PK;JWNis|Z zsu^+aDCNg#=!G|=0-dGpsRFN!*d=R5V@HWtjq$!zFb{tE^mFtRRO-tUcq%diOwffV zZ^T4S^`iOdq5b%}ds!X2tgI|Lksp!(6cH8H*o@VW-y=UH*`6J5CQL_(Z*_qu*{tga7bR<#a{)OOf4fWVsTgfN-|O~^HU_AgLGLcgL@F$H4n zWr;G-r0}(Es%!V>?c=6wf1ONQ`%w_<1L{LxpY?I@Q-aQ`neWb-rQz3gs#AUH&UsU< zY)xdWjZP#W(P)lq3pRdOxv<-GjZ?%dMuI)7(gO+PE$QRg!DbZbrc6Ovt=^Fq766-5)c zGoJ(ITpZQBar&%xo?I~-vuyJnJBZ*?jigQ@u}@?ogV3@)qEfx%#l}N|r64mG?-`8F zC|c7jt0s+N&^*JzapP;uL>btv30uhMTA6lvAKR9Z$Y&$&h6d2+Y>bJ=mZsGoa5s;2HN!v8s<;Ip1Pf~_@MNjk&d(l7Sf(N7P_`YCW+gYaKmom&3px9qBtjw3|*?;4C zWYSRGs%><_9@!+@vPfgbZQ1gw9dAhe97l8AtHUX3V!}u0`Y2W}g)=yRVqpgc^@(8# zyTX-TaYA|I>_d|(sgQU~Dt+Q^E9jyoI)Is(F}N?#8#r6M#|}oXTZaGM8>l!KbYZx+ zWFc2-%4&qLqa(Fjac)$@qY-EyBh#wN){174%ry zAqm9t3_bi5842voGw*BplO2k@d(jWyeuN{uoyPw$4`s@$wLCykf6TeBCMWjPzM z%;z6e7*CsAvzNXpNt)f;I+bb;H+x3iZG0TgDY@m+4`3xfTljS^I7TWLRB1HU(Z zcp=R2bPm{VtswGqVfo{lV~W`6#Hw<|7CWS}pz0RHc)XngJ_zMzS9$roDh95$b*p|w zq)2{m^ou2Tw9Oy(K1l~rqilZCk-}CTnLCkx8!9EaE=xK^^?Fm6<1LCdA&rsbu6}vZ$nN3VBk^*_{vTVn6%)|Ofsb!l z-*oP1^F5~!k3DN19EQGb@0und49n(;=)6EeiR zlh&o_FGPZ(o|0;5UT~(mr&Fkd)XGI0nJ|x)-?~F^KIEw+NSN(%%0NP(pkay0O>$;W z2XFC3WM6#KN9QK&m-571d0|efRqK`yQuxeijWy)jBR(EtCmZvZzC4o6}C?EOp=3f`~j66SNK z#;z<<$zn6Qs?!WPyIE2h0xrRMcWcJ|H3KjBP(j@yx?3CDj;;G`S;^`WMZdxlosn?rLJheNxys8Q zPKs6=j$^7Jcn6;C7;TxGO38>&4YAW9A*H3?*-)p=Q1gG6$fkec4&SV4pq(Gije6=GAa zLLusT?mQz}LF+S#H+lJY5*k(8Id^*^zRg;|9^GOICQy+X2xWW+ zJU5l{#Xfg}3w-33rRTArnXJ3Y^4UYkR-B!#82O^HkS?XWikPq>%aF!rIAl(BsmVW< zb}Pm>&}s*-W403IT%z$kHco1EFXov=AD(~Xj6HvGXG{KLS{pMVy{Y@gRZY0p5O>Ur z>+Z}KqTZN)%+r-wyVKZKacHABdkz z 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 literal 0 HcmV?d00001 diff --git a/lib/ultralib/tools/compile_sjis.py b/lib/ultralib/tools/compile_sjis.py new file mode 100755 index 0000000..136bdc7 --- /dev/null +++ b/lib/ultralib/tools/compile_sjis.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +import sys, os +from shiftjis_conv import sjis_process + +os.chdir("../../") +WORKING_DIR = os.getcwd() + +fb = [] +original_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 = original_c_file + +sys.argv[sys.argv.index(original_c_file)] = output_c_file + +original_c_file = "src/voice/" + original_c_file + +with open(original_c_file) as f: + fb = f.read() + +os.chdir(build_dir + "/src/voice") + +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/ultralib/tools/disassemble_elf.py b/lib/ultralib/tools/disassemble_elf.py new file mode 100755 index 0000000..1fa58a8 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/fix_objfile.py b/lib/ultralib/tools/fix_objfile.py new file mode 100755 index 0000000..52a79bc --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/libdiff.py b/lib/ultralib/tools/libdiff.py new file mode 100755 index 0000000..ac6b139 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/libelf.py b/lib/ultralib/tools/libelf.py new file mode 100755 index 0000000..11c4c03 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/m2ctx.py b/lib/ultralib/tools/m2ctx.py new file mode 100755 index 0000000..39c5dc5 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/mdebug.py b/lib/ultralib/tools/mdebug.py new file mode 100644 index 0000000..6f061ec --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/mips_isa.py b/lib/ultralib/tools/mips_isa.py new file mode 100644 index 0000000..d99dcda --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/patch_ar_meta.py b/lib/ultralib/tools/patch_ar_meta.py new file mode 100755 index 0000000..d831785 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/print_mdebug.py b/lib/ultralib/tools/print_mdebug.py new file mode 100755 index 0000000..e0b295a --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/set_o32abi_bit.py b/lib/ultralib/tools/set_o32abi_bit.py new file mode 100755 index 0000000..fc22d2c --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/shiftjis_conv.py b/lib/ultralib/tools/shiftjis_conv.py new file mode 100755 index 0000000..73037d2 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/strip_debug.sh b/lib/ultralib/tools/strip_debug.sh new file mode 100755 index 0000000..4a8be78 --- /dev/null +++ b/lib/ultralib/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/ultralib/tools/util.py b/lib/ultralib/tools/util.py new file mode 100644 index 0000000..b6c6155 --- /dev/null +++ b/lib/ultralib/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/tools/symbol_addrs.txt b/linker_scripts/us/symbol_addrs.txt similarity index 100% rename from tools/symbol_addrs.txt rename to linker_scripts/us/symbol_addrs.txt diff --git a/undefined_syms.txt b/linker_scripts/us/undefined_syms.ld similarity index 100% rename from undefined_syms.txt rename to linker_scripts/us/undefined_syms.ld diff --git a/requirements.txt b/requirements.txt index ddc322b..650fefe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,10 +3,14 @@ PyYAML pylibyaml pypng colorama -spimdisasm>=1.27.0 rabbitizer>=1.2.0 pygfxd tqdm intervaltree n64img crunch64 +splat64[mips]==0.24.0 +mapfile-parser>=2.4.0,<3.0.0 +libyaz0 +ipl3checksum>=1.2.0,<2.0.0 +spimdisasm>=1.16.3,<2.0.0 diff --git a/src/11BA0.c b/src/11BA0.c index 54d211e..48ead59 100644 --- a/src/11BA0.c +++ b/src/11BA0.c @@ -1,77 +1,77 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80010FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80010FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80010FDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80010FDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_8001103C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_8001103C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800110E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800110E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800111A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800111A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800111FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800111FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800112BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800112BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800113AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800113AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800113F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800113F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_8001156C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_8001156C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800115F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800115F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800116C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800116C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800117A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800117A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800118D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800118D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011ABC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011ABC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011B94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011B94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80011FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80011FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80012044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80012044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80012094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80012094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_800120DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_800120DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/11BA0/func_80012120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/11BA0/func_80012120.s") diff --git a/src/12D80.c b/src/12D80.c index b612dd9..4122632 100644 --- a/src/12D80.c +++ b/src/12D80.c @@ -1,146 +1,146 @@ -#include "common.h" +#include "global.h" #include "12D80.h" -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800121C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800121C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800122B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800122B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800123D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800123D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800124D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800124D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80012D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80012D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800131B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800131B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800133D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800133D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013764.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013764.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001378C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001378C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800138F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800138F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001395C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001395C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800139E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800139E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013C14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013C14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80013F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80013F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800142BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800142BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800143C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800143C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800148D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800148D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80014D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80014D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001533C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001533C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001550C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001550C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001554C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001554C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001587C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001587C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015DD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015DD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80015F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80015F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_800160E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_800160E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_80016364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_80016364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001638C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001638C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/12D80/func_8001660C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/12D80/func_8001660C.s") diff --git a/src/12D80.h b/src/12D80.h index 1ed5d4f..5ccd5ad 100644 --- a/src/12D80.h +++ b/src/12D80.h @@ -1,7 +1,7 @@ #ifndef _12D80_H_ #define _12D80_H_ -#include "common.h" +#include "global.h" void func_80015094(unk_D_86002F34*); void func_80015348(void); diff --git a/src/17300.c b/src/17300.c index edfe274..81c9561 100644 --- a/src/17300.c +++ b/src/17300.c @@ -1,42 +1,42 @@ -#include "common.h" +#include "global.h" #include "17300.h" -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800167B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800167B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80016FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800171A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800171A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800173CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800173CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800173DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800173DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_800174E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_800174E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/17300/func_80017514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80017514.s") diff --git a/src/17300.h b/src/17300.h index 1d172b5..c38621d 100644 --- a/src/17300.h +++ b/src/17300.h @@ -1,7 +1,7 @@ #ifndef _17300_H_ #define _17300_H_ -#include "common.h" +#include "global.h" void func_800173CC(unk_D_86002F58_004*); s32 func_80017514(unk_D_86002F58_004*); diff --git a/src/18140.c b/src/18140.c index f2035a7..153d6cf 100644 --- a/src/18140.c +++ b/src/18140.c @@ -1,25 +1,25 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800175D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800175D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800175E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800175E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800176BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800176BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_800176DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_800176DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017798.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017798.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_8001781C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_8001781C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_8001783C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_8001783C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18140/func_80017858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18140/func_80017858.s") diff --git a/src/18480.c b/src/18480.c index 42653c9..d138c8a 100644 --- a/src/18480.c +++ b/src/18480.c @@ -1,85 +1,84 @@ -#include "common.h" +#include "global.h" #include "18480.h" -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001799C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001799C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800179C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800179C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017BBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017BBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017C48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017C48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017F1C.s") -void func_80017F5C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017F5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80017FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80017FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800180BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800180BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800180D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800180D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001812C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001812C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001819C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001819C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800181FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800181FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001824C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001824C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001829C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001829C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800183C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800183C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800185A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800185A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_8001878C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_8001878C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800188C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800188C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_800189B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_800189B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018AD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/18480/func_80018B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/18480/func_80018B70.s") diff --git a/src/18480.h b/src/18480.h index 55c8141..4258440 100644 --- a/src/18480.h +++ b/src/18480.h @@ -1,7 +1,7 @@ #ifndef _18480_H_ #define _18480_H_ -#include "common.h" +#include "global.h" #include "src/memory.h" s32 func_80018B70(MemoryBlock*, uintptr_t); diff --git a/src/19840.c b/src/19840.c index 2a4f2cf..7777f9a 100644 --- a/src/19840.c +++ b/src/19840.c @@ -1,64 +1,64 @@ -#include "common.h" +#include "global.h" #include "19840.h" -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018DE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018DE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018E7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018E7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80018FF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80018FF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_800191B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_800191B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_800196DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_800196DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_8001987C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_8001987C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_800198E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_800198E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019C08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019C08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019CA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019CA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/19840/func_80019F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/19840/func_80019F0C.s") diff --git a/src/19840.h b/src/19840.h index 4fe4814..e520ac6 100644 --- a/src/19840.h +++ b/src/19840.h @@ -1,7 +1,7 @@ #ifndef _19840_H_ #define _19840_H_ -#include "common.h" +#include "global.h" #include "src/memory.h" void func_8001987C(void); diff --git a/src/1AB70.c b/src/1AB70.c index 782a8d3..c7ecc2a 100644 --- a/src/1AB70.c +++ b/src/1AB70.c @@ -1,63 +1,63 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_80019F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_80019F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_80019F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_80019F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A1D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A1D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A46C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A46C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A6D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A6D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001A714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001A714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AA18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001ABAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001ABAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AD90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AD90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001AFD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001AFD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B0DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B0DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B1FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B1FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B2D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B6BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B6BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B6C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B6C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1AB70/func_8001B9D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1AB70/func_8001B9D4.s") diff --git a/src/1C720.c b/src/1C720.c index 1e992a2..b54305a 100644 --- a/src/1C720.c +++ b/src/1C720.c @@ -1,38 +1,38 @@ -#include "common.h" +#include "global.h" #include "1C720.h" -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BB20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BB20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BBC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BBC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BC34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BC34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BCF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BCF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BD04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BD04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BD9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BD9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001BEE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001BEE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C07C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C07C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C1E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C1E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1C720/func_8001C2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1C720/func_8001C2D8.s") diff --git a/src/1C720.h b/src/1C720.h index 418eea1..a18dabf 100644 --- a/src/1C720.h +++ b/src/1C720.h @@ -1,7 +1,7 @@ #ifndef _1C720_H_ #define _1C720_H_ -#include "common.h" +#include "global.h" void func_8001BB20(void); void func_8001BB58(unk_D_86002F58_004*); diff --git a/src/1CF30.c b/src/1CF30.c index d26b789..a0214f4 100644 --- a/src/1CF30.c +++ b/src/1CF30.c @@ -1,94 +1,94 @@ -#include "common.h" +#include "global.h" #include "1CF30.h" -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C4E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C4E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C6AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C6AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001C8C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001C8C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001CADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001CADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001CCF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001CCF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001CF10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001CF10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D12C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D12C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001D924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001D924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001DBDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001DBDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E6E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E6E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E730.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E7C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E7C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E7D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E7D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E94C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E94C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E9CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E9CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001E9F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001E9F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001EAD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001EAD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001EBE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001EBE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001EC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001EC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001ECB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001ECB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F1C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F1C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F1E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F1E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F2E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F2E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F36C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F36C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F3F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F3F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F4C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F4C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F5B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F5B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/1CF30/func_8001F6E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/1CF30/func_8001F6E8.s") diff --git a/src/1CF30.h b/src/1CF30.h index 28a31c1..f315bdd 100644 --- a/src/1CF30.h +++ b/src/1CF30.h @@ -1,7 +1,7 @@ #ifndef _1CF30_H_ #define _1CF30_H_ -#include "common.h" +#include "global.h" s32 func_8001E94C(s32, s32); void func_8001E9CC(void); diff --git a/src/20330.c b/src/20330.c index f799de4..f2676b6 100644 --- a/src/20330.c +++ b/src/20330.c @@ -1,9 +1,8 @@ -#include "common.h" +#include "global.h" #include "20330.h" -void func_8001F730(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/20330/func_8001F730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20330/func_8001F738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20330/func_8001F738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20330/func_8001F750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20330/func_8001F750.s") diff --git a/src/20330.h b/src/20330.h index fd47d0c..fb3c8e1 100644 --- a/src/20330.h +++ b/src/20330.h @@ -1,7 +1,7 @@ #ifndef _20330_H_ #define _20330_H_ -#include "common.h" +#include "global.h" void func_8001F730(void); diff --git a/src/20470.c b/src/20470.c index dede06b..4038b17 100644 --- a/src/20470.c +++ b/src/20470.c @@ -1,36 +1,36 @@ -#include "common.h" +#include "global.h" #include "20470.h" -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001F870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001F870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001F9D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001F9D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FB40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FB40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FCAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FCAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FE18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FE18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8001FF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8001FF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_800200B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_800200B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_8002053C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_8002053C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020678.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020678.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_800207FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_800207FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_800209B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_800209B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80020B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80020B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80021270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80021270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/20470/func_80021920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/20470/func_80021920.s") diff --git a/src/20470.h b/src/20470.h index 8006d4a..45124ad 100644 --- a/src/20470.h +++ b/src/20470.h @@ -1,7 +1,7 @@ #ifndef _20470_H_ #define _20470_H_ -#include "common.h" +#include "global.h" void func_80020460(s32, s32, s32, s32, s32); diff --git a/src/225A0.c b/src/225A0.c index a5a4f30..77a5060 100644 --- a/src/225A0.c +++ b/src/225A0.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/225A0/func_800219A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/225A0/func_800219A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/225A0/func_800219FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/225A0/func_800219FC.s") diff --git a/src/22630.c b/src/22630.c index ec71e12..cd79cbd 100644 --- a/src/22630.c +++ b/src/22630.c @@ -1,230 +1,229 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021D9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021D9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80021F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80021F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022084.s") -void func_800220C4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800220C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800220CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800220CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002240C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002240C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800224B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800224B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800226C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800226C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800228B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800228B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800228F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800228F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80022F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80022F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002311C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002311C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800232A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800232A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800232D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800232D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800233F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800233F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800237C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800237C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800238D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800238D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80023F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80023F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800240A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800240A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002431C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002431C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800243D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800243D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002447C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002447C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800244F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800244F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800246F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800246F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800247C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800247C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800249B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800249B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800249FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800249FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80024FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80024FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800250E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800250E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002513C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002513C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800251B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800251B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002526C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002526C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800252CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800252CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002539C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002539C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800253C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800253C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800253F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800253F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_8002564C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_8002564C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_800256F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_800256F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/22630/func_80025AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/22630/func_80025AD0.s") diff --git a/src/26820.c b/src/26820.c index fc356d2..b7c105b 100644 --- a/src/26820.c +++ b/src/26820.c @@ -1,127 +1,127 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025DE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025DE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025EF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025EF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80025F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80025F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800262DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800262DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800264DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800264DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002685C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002685C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80026E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80026E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002707C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002707C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800270AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800270AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800272BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800272BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800275E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800275E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800276F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800276F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002782C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002782C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002797C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002797C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80027FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80027FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800280C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800280C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800280D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800280D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002816C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002816C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002817C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002817C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800281D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800281D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002847C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002847C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800284B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800284B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800286D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800286D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_8002873C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_8002873C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800288F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800288F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_800289AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_800289AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028C48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028C48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/26820/func_80028EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/26820/func_80028EB8.s") diff --git a/src/29BA0.c b/src/29BA0.c index c88603a..975947d 100644 --- a/src/29BA0.c +++ b/src/29BA0.c @@ -1,7 +1,7 @@ #include #include "memory.h" -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80028FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80028FA0.s") s32 func_80029008(s32 arg0, s32 romStart, s32 romEnd, s32 arg3, s32 arg4) { s32 result; @@ -13,75 +13,74 @@ s32 func_80029008(s32 arg0, s32 romStart, s32 romEnd, s32 arg3, s32 arg4) { return result; } -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002908C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002908C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800290B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800290B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800290E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800290E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800291E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800291E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800293CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800293CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800296AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800296AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800296E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800296E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_800298D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_800298D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029BC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_80029E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_80029E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A06C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A06C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002A8A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002A8A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002AAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002AAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002ADE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002ADE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002AF38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002AF38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B07C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B07C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B180.s") -void func_8002B244(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B24C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B24C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/29BA0/func_8002B330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/29BA0/func_8002B330.s") diff --git a/src/2C1C0.c b/src/2C1C0.c index 1c0dbe7..b407358 100644 --- a/src/2C1C0.c +++ b/src/2C1C0.c @@ -1,39 +1,39 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B5C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B5C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B5EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B5EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B6BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B6BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002B924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002B924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BA34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BA34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BB7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BB7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BC64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BC64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BD14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BD14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BD60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BD60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BE70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BE70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BEC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BEC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002BFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002BFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2C1C0/func_8002C5E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2C1C0/func_8002C5E8.s") diff --git a/src/2D340.c b/src/2D340.c index 667cc37..3768803 100644 --- a/src/2D340.c +++ b/src/2D340.c @@ -1,49 +1,49 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C7AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C7AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C7D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C7D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002C990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002C990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CA00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CA00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CAAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CAAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CBB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CBB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CBC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CBC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CC04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CC04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CC2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CC2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CC80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CC80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CD58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CD58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002CE34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002CE34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D1AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D1AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D28C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D28C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D3F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D3F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2D340/func_8002D444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2D340/func_8002D444.s") diff --git a/src/2E110.c b/src/2E110.c index 318c1f9..e8cff39 100644 --- a/src/2E110.c +++ b/src/2E110.c @@ -1,16 +1,16 @@ -#include "common.h" +#include "global.h" #include "2E110.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D5AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D5AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D7C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D7C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E110/func_8002D80C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E110/func_8002D80C.s") diff --git a/src/2E110.h b/src/2E110.h index 1570981..93777f7 100644 --- a/src/2E110.h +++ b/src/2E110.h @@ -1,7 +1,7 @@ #ifndef _2E110_H_ #define _2E110_H_ -#include "common.h" +#include "global.h" s32 func_8002D7C0(s32, s32, s32, s32); diff --git a/src/2E460.c b/src/2E460.c index 427d2b0..d91f360 100644 --- a/src/2E460.c +++ b/src/2E460.c @@ -1,59 +1,59 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002D860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002D860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002D8C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002D8C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DCB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DCB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DD64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DD64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DD98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DD98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DE44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DE44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002DF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002DF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E0F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E0F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E5A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E5A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002E8E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002E8E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EBD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EBD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EC08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EC08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EC1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EC1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ECDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ECDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ED08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ED08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ED40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ED40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002ED78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002ED78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EDEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EDEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EE1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EE1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EEA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EEA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EF18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EF18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002EF44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002EF44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002F1C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002F1C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/2E460/func_8002F264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2E460/func_8002F264.s") diff --git a/src/2FEA0.c b/src/2FEA0.c index 451b63f..5f8214b 100644 --- a/src/2FEA0.c +++ b/src/2FEA0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/2FEA0/func_8002F2A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/2FEA0/func_8002F2A0.s") diff --git a/src/30640.c b/src/30640.c index 3275c1b..2cbca08 100644 --- a/src/30640.c +++ b/src/30640.c @@ -1,79 +1,79 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FA40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FA40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8002FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8002FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800300CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800300CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8003013C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8003013C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800301A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800301A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80030240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80030240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800302A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800302A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800303C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800303C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8003107C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8003107C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800314BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800314BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800317D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800317D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_8003181C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_8003181C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_800318F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_800318F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031910.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031910.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031BE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031BE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80031EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80031EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/30640/func_80032034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/30640/func_80032034.s") diff --git a/src/32D10.c b/src/32D10.c index 301ed01..f8baba6 100644 --- a/src/32D10.c +++ b/src/32D10.c @@ -1,22 +1,22 @@ -#include "common.h" +#include "global.h" #include "32D10.h" -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800325AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800325AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800325B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800325B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800325E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800325E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_8003260C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_8003260C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_80032738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_80032738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/32D10/func_800327CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/32D10/func_800327CC.s") diff --git a/src/32D10.h b/src/32D10.h index 36a453e..3fdbb9c 100644 --- a/src/32D10.h +++ b/src/32D10.h @@ -1,7 +1,7 @@ #ifndef _32D10_H_ #define _32D10_H_ -#include "common.h" +#include "global.h" void func_80032110(u8, s32); void func_80032244(u8, s16); diff --git a/src/334D0.c b/src/334D0.c index f5006b0..083f8c1 100644 --- a/src/334D0.c +++ b/src/334D0.c @@ -1,23 +1,23 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_800328D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_800328D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_800328D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_800328D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_800328E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_800328E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/334D0/func_80032F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/334D0/func_80032F94.s") diff --git a/src/33E30.c b/src/33E30.c index 72be973..0092ecc 100644 --- a/src/33E30.c +++ b/src/33E30.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/33E30/func_80033230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33E30/func_80033230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33E30/func_80033264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33E30/func_80033264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33E30/func_80033284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33E30/func_80033284.s") diff --git a/src/33FE0.c b/src/33FE0.c index 6b8c8aa..7e88456 100644 --- a/src/33FE0.c +++ b/src/33FE0.c @@ -1,88 +1,87 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800333E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800333E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_8003342C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_8003342C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800334C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800334C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800336F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800336F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800337D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800337D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033890.s") -void func_800338B0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800338B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800338B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800338B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800338D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800338D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033D1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033D1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80033D44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80033D44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034824.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034824.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80034F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80034F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800350E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800350E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800355A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800355A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800357F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800357F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800359FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800359FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035C4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035C4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_80035FA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_80035FA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800361C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800361C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_8003658C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_8003658C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/33FE0/func_800366A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/33FE0/func_800366A4.s") diff --git a/src/37370.c b/src/37370.c index 71e6d14..50c5d9d 100644 --- a/src/37370.c +++ b/src/37370.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/37370/func_80036770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/37370/func_80036770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/37370/func_80036790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/37370/func_80036790.s") diff --git a/src/373A0.c b/src/373A0.c index 9e69e27..f49f8b8 100644 --- a/src/373A0.c +++ b/src/373A0.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_800367A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_800367A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_80037234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_80037234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_80037340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_80037340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_80037360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_80037360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/373A0/func_800373D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/373A0/func_800373D8.s") diff --git a/src/38BB0.c b/src/38BB0.c index 3275b4e..a53a5c1 100644 --- a/src/38BB0.c +++ b/src/38BB0.c @@ -1,209 +1,209 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80037FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80037FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80037FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80037FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003802C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003802C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800381B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800381B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003827C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003827C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800382AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800382AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800383E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800383E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003844C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003844C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800384E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800384E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800385D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800385D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800386E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800386E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800387B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800387B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800387C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800387C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038864.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038864.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800388B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800388B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800388C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800388C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800389C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800389C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038B68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038B68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80038F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80038F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003916C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003916C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800392A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800392A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800393DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800393DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800395FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800395FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800396D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800396D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003979C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003979C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800397BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800397BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003986C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003986C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_800398F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_800398F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039D58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039D58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_80039F28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_80039F28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A10C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A10C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A2F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A2F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A39C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A39C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A4D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A4D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A6D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A6D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003A78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003A78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003AD58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003AD58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B00C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B00C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B0DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B0DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B2B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B2B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B8A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B8A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003B94C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003B94C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BA44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BA44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BBA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BBA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BD2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BD2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BEF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BEF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003BFF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003BFF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C1D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C1D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C2F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C2F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C35C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C35C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/38BB0/func_8003C408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/38BB0/func_8003C408.s") diff --git a/src/3D140.c b/src/3D140.c index a799814..2f25e2c 100644 --- a/src/3D140.c +++ b/src/3D140.c @@ -1,87 +1,87 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003C540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003C540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003C8DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003C8DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003CADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003CADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D32C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D32C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D494.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D494.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D4A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D4A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D54C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D54C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D6B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D6B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D6DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D6DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003D918.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003D918.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003DB84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003DB84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003EB40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003EB40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F1AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F1AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F4C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F4C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8003F660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8003F660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80040A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80040A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800414B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800414B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_8004153C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_8004153C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800416BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800416BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041E40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80041EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80041EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800420C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800420C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800420F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800420F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80042158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80042158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_80042850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_80042850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3D140/func_800428FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3D140/func_800428FC.s") diff --git a/src/3FB0.c b/src/3FB0.c index 41ab347..f028afc 100644 --- a/src/3FB0.c +++ b/src/3FB0.c @@ -1,37 +1,37 @@ #include #include "memory.h" -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800033B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800033B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800033C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800033C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003648.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003648.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003D64.s") void* func_80003DC4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { u32* addr; @@ -71,15 +71,15 @@ void* func_80003DC4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { return ret; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80003F54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80003F54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800040EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800040EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800041C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800041C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004200.s") s32 func_80004258(s32 id, s32 arg1, s32 arg2, s32 arg3) { s32 vaddr = func_80003DC4(arg1, arg2, arg3, 0); @@ -91,11 +91,11 @@ s32 func_80004258(s32 id, s32 arg1, s32 arg2, s32 arg3) { return vaddr; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800042E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800042E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800043BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800043BC.s") void* func_80004454(s32 arg0, uintptr_t romStart, uintptr_t romEnd) { void* addr = func_80003DC4(romStart, romEnd, 0, 0); @@ -106,7 +106,7 @@ void* func_80004454(s32 arg0, uintptr_t romStart, uintptr_t romEnd) { return addr; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800044A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800044A8.s") void* func_800044F4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { u32* ret; @@ -159,14 +159,14 @@ void* func_800044F4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3) { return ret; } -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800047A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800047A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_800047C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_800047C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_80004804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_80004804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_8000484C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_8000484C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/3FB0/func_8000495C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/3FB0/func_8000495C.s") diff --git a/src/3FB0.h b/src/3FB0.h index a904148..77d64c4 100644 --- a/src/3FB0.h +++ b/src/3FB0.h @@ -1,7 +1,7 @@ #ifndef _3FB0_H_ #define _3FB0_H_ -#include "common.h" +#include "global.h" void* func_80003DC4(uintptr_t romStart, uintptr_t romEnd, s32 arg2, s32 arg3); s32 func_80004258(s32 id, s32 arg1, s32 arg2, s32 arg3); diff --git a/src/43520.c b/src/43520.c index ac346b5..8964441 100644 --- a/src/43520.c +++ b/src/43520.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" void func_800491C0(s32 arg0); void func_8004FD90(void); diff --git a/src/435B0.c b/src/435B0.c index 59b9779..72ece79 100644 --- a/src/435B0.c +++ b/src/435B0.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" typedef struct { /* 0x00 */ char unk_00[0x16]; diff --git a/src/435D0.c b/src/435D0.c index 813e841..ed5a4e7 100644 --- a/src/435D0.c +++ b/src/435D0.c @@ -1,89 +1,89 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800429D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800429D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80042F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80042F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800430AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800430AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800431DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800431DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800431FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800431FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_8004327C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_8004327C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_8004340C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_8004340C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800434E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800434E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800435CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800435CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800435E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800435E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043708.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043708.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800437A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800437A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043C08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043C08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80043F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80043F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800441A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800441A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800441F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800441F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_8004473C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_8004473C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800448B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800448B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_800449F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_800449F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/435D0/func_80044A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/435D0/func_80044A50.s") diff --git a/src/45720.c b/src/45720.c index 9874c2f..ccd594e 100644 --- a/src/45720.c +++ b/src/45720.c @@ -1,25 +1,25 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80044EA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80044EA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_800455DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_800455DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_800456D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_800456D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80045780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80045780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_800459E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_800459E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80045A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80045A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/45720/func_80045A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/45720/func_80045A68.s") diff --git a/src/46680.c b/src/46680.c index 15a9117..b9961ba 100644 --- a/src/46680.c +++ b/src/46680.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80045FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80045FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/46680/func_80046EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/46680/func_80046EF0.s") diff --git a/src/47B60.c b/src/47B60.c index 272196d..6bc3a7b 100644 --- a/src/47B60.c +++ b/src/47B60.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_80046F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_80046F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_80047500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_80047500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_800475A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_800475A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_800477D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_800477D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/47B60/func_80047958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/47B60/func_80047958.s") diff --git a/src/485C0.c b/src/485C0.c index 04317fe..78c2670 100644 --- a/src/485C0.c +++ b/src/485C0.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/485C0/func_800479C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/485C0/func_800479C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/485C0/func_80048014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/485C0/func_80048014.s") diff --git a/src/48C60.c b/src/48C60.c index 2942e37..edfb559 100644 --- a/src/48C60.c +++ b/src/48C60.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/48C60/func_80048060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/48C60/func_80048060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/48C60/func_80048464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/48C60/func_80048464.s") diff --git a/src/490A0.c b/src/490A0.c index 1a6b65e..738e65b 100644 --- a/src/490A0.c +++ b/src/490A0.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_800484A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_800484A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_800484C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_800484C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_800484E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_800484E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_80048574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_80048574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/490A0/func_80048580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/490A0/func_80048580.s") diff --git a/src/49790.c b/src/49790.c index e8aaa4f..6e39ec6 100644 --- a/src/49790.c +++ b/src/49790.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #include "49790.h" -#pragma GLOBAL_ASM("asm/nonmatchings/49790/func_80048B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49790/func_80048B90.s") diff --git a/src/49790.h b/src/49790.h index 750405e..f6c2cb1 100644 --- a/src/49790.h +++ b/src/49790.h @@ -1,7 +1,7 @@ #ifndef _49790_H_ #define _49790_H_ -#include "common.h" +#include "global.h" void func_80048B90(s32); diff --git a/src/49BA0.c b/src/49BA0.c index f77c6e1..0b25c08 100644 --- a/src/49BA0.c +++ b/src/49BA0.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/49BA0/func_80048FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49BA0/func_80048FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49BA0/func_800490CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49BA0/func_800490CC.s") diff --git a/src/49DC0.c b/src/49DC0.c index 8801895..9ba0b43 100644 --- a/src/49DC0.c +++ b/src/49DC0.c @@ -1,17 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800491C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800491C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800495F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800495F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049648.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049648.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800496AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800496AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_800496E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_800496E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/49DC0/func_80049734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/49DC0/func_80049734.s") diff --git a/src/4A360.c b/src/4A360.c index 6afd492..23c953a 100644 --- a/src/4A360.c +++ b/src/4A360.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4A360/func_80049760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A360/func_80049760.s") diff --git a/src/4A3E0.c b/src/4A3E0.c index 56bf4e4..1120e86 100644 --- a/src/4A3E0.c +++ b/src/4A3E0.c @@ -1,25 +1,25 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_800497E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_800497E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004980C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004980C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_800498A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_800498A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_80049DF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_80049DF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004A474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004A474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004A89C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004A89C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004AC9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004AC9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004ACD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004ACD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4A3E0/func_8004AD2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4A3E0/func_8004AD2C.s") diff --git a/src/4B940.c b/src/4B940.c index e62ef47..ca3710d 100644 --- a/src/4B940.c +++ b/src/4B940.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4B940/func_8004AD40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4B940/func_8004AD40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4B940/func_8004ADB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4B940/func_8004ADB0.s") diff --git a/src/4BA90.c b/src/4BA90.c index ad9267f..b31c63c 100644 --- a/src/4BA90.c +++ b/src/4BA90.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004AE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004AE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004AF24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004AF24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004AF44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004AF44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004B094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004B094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BA90/func_8004B154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BA90/func_8004B154.s") diff --git a/src/4BDC0.c b/src/4BDC0.c index ca09d12..70e9857 100644 --- a/src/4BDC0.c +++ b/src/4BDC0.c @@ -1,14 +1,14 @@ -#include "common.h" +#include "global.h" #include "4BDC0.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004B1C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004B1C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004B1CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004B1CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004B9C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004B9C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004BA88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004BA88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004BC84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004BC84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4BDC0/func_8004BFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4BDC0/func_8004BFB0.s") diff --git a/src/4BDC0.h b/src/4BDC0.h index fab1cba..637e5ec 100644 --- a/src/4BDC0.h +++ b/src/4BDC0.h @@ -1,7 +1,7 @@ #ifndef _4BDC0_H_ #define _4BDC0_H_ -#include "common.h" +#include "global.h" void func_8004B9C4(s32); void func_8004B1CC(s32); diff --git a/src/4CBC0.c b/src/4CBC0.c index 0165a5e..f5c54df 100644 --- a/src/4CBC0.c +++ b/src/4CBC0.c @@ -1,57 +1,57 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004BFC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004BFC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C16C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C16C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C17C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C17C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C4FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C4FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C6CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C6CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C6DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C6DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C8A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C8A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004C8B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004C8B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CA6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CA6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CA7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CA7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004CCD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004CCD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D16C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D16C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D1B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D3B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D3B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004D9B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004D9B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004DC8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004DC8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004DDA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004DDA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004DF94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004DF94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4CBC0/func_8004E304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4CBC0/func_8004E304.s") diff --git a/src/4F410.c b/src/4F410.c index d2729cd..68e1983 100644 --- a/src/4F410.c +++ b/src/4F410.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4F410/func_8004E810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F410/func_8004E810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4F410/func_8004EBC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F410/func_8004EBC8.s") diff --git a/src/4F7F0.c b/src/4F7F0.c index 9a7b060..d236d25 100644 --- a/src/4F7F0.c +++ b/src/4F7F0.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" struct UnkArray4 { u32 unk0; diff --git a/src/4F870.c b/src/4F870.c index 9d08d15..f43426d 100644 --- a/src/4F870.c +++ b/src/4F870.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4F870/func_8004EC70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F870/func_8004EC70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4F870/func_8004F084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4F870/func_8004F084.s") diff --git a/src/4FDB0.c b/src/4FDB0.c index 3c0326f..0c90b4a 100644 --- a/src/4FDB0.c +++ b/src/4FDB0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4FDB0/func_8004F1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FDB0/func_8004F1B0.s") diff --git a/src/4FE60.c b/src/4FE60.c index 9e8c4cc..a34dfa5 100644 --- a/src/4FE60.c +++ b/src/4FE60.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4FE60/func_8004F260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FE60/func_8004F260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4FE60/func_8004F2F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FE60/func_8004F2F0.s") diff --git a/src/4FF50.c b/src/4FF50.c index 1b4853f..8d88c3b 100644 --- a/src/4FF50.c +++ b/src/4FF50.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/4FF50/func_8004F350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FF50/func_8004F350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/4FF50/func_8004F4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/4FF50/func_8004F4F8.s") diff --git a/src/50120.c b/src/50120.c index 68a3f79..1af632d 100644 --- a/src/50120.c +++ b/src/50120.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50120/func_8004F520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50120/func_8004F520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50120/func_8004F95C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50120/func_8004F95C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50120/func_8004FB1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50120/func_8004FB1C.s") diff --git a/src/50860.c b/src/50860.c index a7c9895..b4185a6 100644 --- a/src/50860.c +++ b/src/50860.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FC60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FC60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FCD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FCD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FD44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FD44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50860/func_8004FD64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50860/func_8004FD64.s") diff --git a/src/50990.c b/src/50990.c index 3e13444..b969f46 100644 --- a/src/50990.c +++ b/src/50990.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50990/func_8004FD90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50990/func_8004FD90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50990/func_8004FDA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50990/func_8004FDA0.s") diff --git a/src/50A00.c b/src/50A00.c index 263fd2d..cf3746f 100644 --- a/src/50A00.c +++ b/src/50A00.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50A00/func_8004FE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50A00/func_8004FE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50A00/func_8004FF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50A00/func_8004FF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50A00/func_8004FF40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50A00/func_8004FF40.s") diff --git a/src/50C20.c b/src/50C20.c index 1164da1..8ba3e0e 100644 --- a/src/50C20.c +++ b/src/50C20.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50C20/func_80050020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50C20/func_80050020.s") diff --git a/src/50CC0.c b/src/50CC0.c index fce6b84..a3fa8fe 100644 --- a/src/50CC0.c +++ b/src/50CC0.c @@ -1,15 +1,15 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_800500C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_800500C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_800503A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_800503A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/50CC0/func_80050B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/50CC0/func_80050B40.s") diff --git a/src/517A0.c b/src/517A0.c index 7a1d06b..83d797c 100644 --- a/src/517A0.c +++ b/src/517A0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/517A0/func_80050BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/517A0/func_80050BA0.s") diff --git a/src/51850.c b/src/51850.c index 3cda97b..e99d70c 100644 --- a/src/51850.c +++ b/src/51850.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/51850/func_80050C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/51850/func_80050C50.s") diff --git a/src/518A0.c b/src/518A0.c index 9c80959..decd8be 100644 --- a/src/518A0.c +++ b/src/518A0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/518A0/func_80050CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/518A0/func_80050CA0.s") diff --git a/src/51B20.c b/src/51B20.c index 546d540..17ee62d 100644 --- a/src/51B20.c +++ b/src/51B20.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/51B20/func_80050F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/51B20/func_80050F20.s") diff --git a/src/5580.c b/src/5580.c index 2312606..9fadb82 100644 --- a/src/5580.c +++ b/src/5580.c @@ -1,50 +1,49 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800049AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800049AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800049D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800049D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004C68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004C68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004D64.s") -void func_80004DB4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004DB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80004F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80004F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800052B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800052B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_80005370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_80005370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/5580/func_800053B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/5580/func_800053B4.s") diff --git a/src/6A40.c b/src/6A40.c index e961c9b..d9075af 100644 --- a/src/6A40.c +++ b/src/6A40.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #include "6A40.h" struct UnkStruct800A7428 { diff --git a/src/6A40.h b/src/6A40.h index 172b4ae..77b9cee 100644 --- a/src/6A40.h +++ b/src/6A40.h @@ -1,7 +1,7 @@ #ifndef _6A40_H_ #define _6A40_H_ -#include "common.h" +#include "global.h" void func_80005E40(u32 arg0, s32 arg1); void func_80005EAC(void); diff --git a/src/6BC0.c b/src/6BC0.c index da2ade3..27ad9ce 100644 --- a/src/6BC0.c +++ b/src/6BC0.c @@ -1,28 +1,28 @@ -#include "common.h" +#include "global.h" #include "6BC0.h" -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80005FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80005FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800060E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800060E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800062E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800062E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_8000648C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_8000648C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_80006498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_80006498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800065B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800065B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_800067E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_800067E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/6BC0/func_8000699C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/6BC0/func_8000699C.s") diff --git a/src/6BC0.h b/src/6BC0.h index dd65762..d997b67 100644 --- a/src/6BC0.h +++ b/src/6BC0.h @@ -1,7 +1,7 @@ #ifndef _6BC0_H_ #define _6BC0_H_ -#include "common.h" +#include "global.h" void func_800060E0(Gfx**, s32, s32, s16, s16); void* func_80006314(s32, s32, s32, s32, s32); diff --git a/src/8EB0.c b/src/8EB0.c index 05443fb..5870b8c 100644 --- a/src/8EB0.c +++ b/src/8EB0.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/8EB0/func_800082B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/8EB0/func_800082B0.s") diff --git a/src/C970.c b/src/C970.c index 2418e87..3507a62 100644 --- a/src/C970.c +++ b/src/C970.c @@ -1,17 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BE5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BE5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BEC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BEC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000BF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000C02C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C02C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000C104.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C104.s") -#pragma GLOBAL_ASM("asm/nonmatchings/C970/func_8000C1AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C1AC.s") diff --git a/src/CE80.c b/src/CE80.c index 0936eb1..a1c707c 100644 --- a/src/CE80.c +++ b/src/CE80.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C4A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C4A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/CE80/func_8000C780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/CE80/func_8000C780.s") diff --git a/src/D470.c b/src/D470.c index e9669eb..1df9c31 100644 --- a/src/D470.c +++ b/src/D470.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000C870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000C870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000C8F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000C8F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CA4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CA4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CB18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CB18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CC30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CC30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CC9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CC9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CDB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CDB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CEE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CEE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000CFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000CFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/D470/func_8000D0B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/D470/func_8000D0B4.s") diff --git a/src/E570.c b/src/E570.c index d8df8ef..f3546fa 100644 --- a/src/E570.c +++ b/src/E570.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/E570/func_8000D970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E570/func_8000D970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E570/func_8000DA78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E570/func_8000DA78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E570/func_8000DAFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E570/func_8000DAFC.s") diff --git a/src/E890.c b/src/E890.c index d9fcb35..a167240 100644 --- a/src/E890.c +++ b/src/E890.c @@ -1,132 +1,132 @@ -#include "common.h" +#include "global.h" #include "E890.h" -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DC90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DC90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DD68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DD68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DDB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DDB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DDE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DDE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DE18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DE18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DE70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DE70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000DED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000DED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E0EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E0EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E21C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E21C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E51C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E51C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E6EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E6EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E7E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E7E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E8B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E8B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000E9D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000E9D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EA84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EA84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EAF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EAF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EB70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EB70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EBA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EBA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EBE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EBE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EC18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EC18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EC50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EC50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EC88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EC88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000ED4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000ED4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000ED98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000ED98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000EE1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000EE1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F2C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F2C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F3FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F3FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F5A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F5A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F730.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000F88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000F88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FA94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FA94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FBB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FBB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FDE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FDE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FF04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FF04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8000FFB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8000FFB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800102A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800102A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800103F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800103F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_8001046C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_8001046C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800104AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800104AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_800107F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_800107F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010CA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010CA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/E890/func_80010E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/E890/func_80010E20.s") diff --git a/src/E890.h b/src/E890.h index 33f2051..92c2322 100644 --- a/src/E890.h +++ b/src/E890.h @@ -1,7 +1,7 @@ #ifndef _E890_H_ #define _E890_H_ -#include "common.h" +#include "global.h" void func_80010354(f32*, f32*, f32, s16, s32); diff --git a/src/dma.c b/src/dma.c index 7915240..44be775 100644 --- a/src/dma.c +++ b/src/dma.c @@ -1,5 +1,5 @@ #include -#include "common.h" +#include "global.h" #include "dma.h" #include "rsp.h" diff --git a/src/dp_intro.c b/src/dp_intro.c index 1bc98f7..3427d33 100644 --- a/src/dp_intro.c +++ b/src/dp_intro.c @@ -1,6 +1,6 @@ #include #include -#include "common.h" +#include "global.h" #include "dp_intro.h" #include "crash_screen.h" #include "profiler.h" diff --git a/src/fragments/1/fragment1.c b/src/fragments/1/fragment1.c index f1fd001..26bf7ac 100644 --- a/src/fragments/1/fragment1.c +++ b/src/fragments/1/fragment1.c @@ -1,156 +1,153 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812000DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812000DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120019C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120019C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812001E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812001E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812002BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812002BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200358.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200358.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812003EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812003EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812004B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812004B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812005D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812005D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812006AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812006AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812008C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812008C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812009D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812009D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81200AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81200AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812011D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812011D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120157C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120157C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812015E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812015E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812015EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812015EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812016DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812016DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812018C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812018C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201DDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201DDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81201FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81201FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812020C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812020C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120241C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120241C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812029B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812029B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202EA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202EA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81202FCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81202FCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120311C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120311C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120334C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120334C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812033F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812033F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81203F3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81203F3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81204A84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81204A84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120572C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120572C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206D9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206D9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81206FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81206FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812070A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812070A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812072B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812072B0.s") -void func_81207330(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207348.s") -void func_81207354(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120735C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120735C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812073A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812073A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812073B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812073B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207494.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207494.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_812075C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_812075C0.s") -void func_81207690(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207774.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207774.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81207DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81207DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120806C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120806C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208C08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208C08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81208F9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81208F9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_8120935C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_8120935C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/1/fragment1/func_81209690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/1/fragment1/func_81209690.s") diff --git a/src/fragments/10/fragment10.c b/src/fragments/10/fragment10.c index c4a75f9..b8dc796 100644 --- a/src/fragments/10/fragment10.c +++ b/src/fragments/10/fragment10.c @@ -1,43 +1,43 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864001A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864001A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864002F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864002F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864005EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864005EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400BE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400BE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86400EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86400EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401A9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401A9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401D1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401D1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86401F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86401F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_8640203C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_8640203C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_86402130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_86402130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864025A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864025A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/10/fragment10/func_864026D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/10/fragment10/func_864026D0.s") diff --git a/src/fragments/11/fragment11.c b/src/fragments/11/fragment11.c index 7427c90..5a0e221 100644 --- a/src/fragments/11/fragment11.c +++ b/src/fragments/11/fragment11.c @@ -1,45 +1,45 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865000C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865000C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_8650077C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_8650077C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86500D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86500D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865013D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865013D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865019E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865019E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86501FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86501FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_865029C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_865029C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/11/fragment11/func_86502BB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/11/fragment11/func_86502BB8.s") diff --git a/src/fragments/12/fragment12.c b/src/fragments/12/fragment12.c index ac38e2a..d086f67 100644 --- a/src/fragments/12/fragment12.c +++ b/src/fragments/12/fragment12.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_866000FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_866000FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_8660048C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_8660048C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_866004F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_866004F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_866005B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_866005B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_86600658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_86600658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/12/fragment12/func_8660070C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/12/fragment12/func_8660070C.s") diff --git a/src/fragments/13/fragment13.c b/src/fragments/13/fragment13.c index 9b916a4..2087cf6 100644 --- a/src/fragments/13/fragment13.c +++ b/src/fragments/13/fragment13.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867000FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867000FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_8670047C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_8670047C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867004E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867004E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867005A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867005A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_86700648.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_86700648.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/13/fragment13/func_867006FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/13/fragment13/func_867006FC.s") diff --git a/src/fragments/14/fragment14.c b/src/fragments/14/fragment14.c index 139889e..3112fc4 100644 --- a/src/fragments/14/fragment14.c +++ b/src/fragments/14/fragment14.c @@ -1,143 +1,143 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86800070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86800070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868001A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868001A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868004F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868004F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868005A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868005A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_8680091C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_8680091C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86800B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86800B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801CA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801CA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86801FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86801FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_8680262C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_8680262C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868026B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868026B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868026E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868026E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86802FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86802FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868031A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868031A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868035FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868035FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868038A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868038A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86803C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86803C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868049C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868049C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804BD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804BD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86804F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86804F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868051E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868051E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868055D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868055D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86805FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86805FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868061E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868061E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868063C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868063C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_868064BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_868064BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/14/fragment14/func_86806BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/14/fragment14/func_86806BF0.s") diff --git a/src/fragments/15/fragment15.c b/src/fragments/15/fragment15.c index 6388fd2..4bd1e22 100644 --- a/src/fragments/15/fragment15.c +++ b/src/fragments/15/fragment15.c @@ -1,145 +1,143 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869000F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869000F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869002AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869002AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690060C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690060C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869006DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869006DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690079C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690079C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869009E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869009E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86900FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86900FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690172C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690172C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869017D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869017D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869018A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869018A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690193C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690193C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869019BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869019BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86901FB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86901FB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869022D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869022D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869024B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869024B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869025BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869025BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690274C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690274C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902AE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86902E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86902E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690325C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690325C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_8690351C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_8690351C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869035F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869035F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86903888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86903888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86903D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86903D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904070.s") -void func_869043F4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869043F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869043FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869043FC.s") -void func_86904BFC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86904F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86904F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869050C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869050C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86905734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86905734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86905F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86905F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869066C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869066C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86906E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86906E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869073D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869073D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86907D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86907D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86908418.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86908418.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_86908668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_86908668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/15/fragment15/func_869089AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/15/fragment15/func_869089AC.s") diff --git a/src/fragments/16/fragment16.c b/src/fragments/16/fragment16.c index bfc11c9..40799fb 100644 --- a/src/fragments/16/fragment16.c +++ b/src/fragments/16/fragment16.c @@ -1,53 +1,53 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0003C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0003C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A000B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A000B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0056C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0056C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0092C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0092C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00D00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00D00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A00ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A00ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A013C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A013C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A014F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A014F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A018C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A018C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A018D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A018D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A01CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A01CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A02164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A02164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A021C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A021C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A023A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A023A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/16/fragment16/func_86A0240C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/16/fragment16/func_86A0240C.s") diff --git a/src/fragments/17/fragment17.c b/src/fragments/17/fragment17.c index 6d6986e..7677f2a 100644 --- a/src/fragments/17/fragment17.c +++ b/src/fragments/17/fragment17.c @@ -1,349 +1,347 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B000D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B000D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B001B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B001B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B001D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B001D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B001FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B001FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0027C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0027C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B003CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B003CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0054C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0054C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B007EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B007EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B008C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B008C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00B14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00B14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B00C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B00C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0100C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0100C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0107C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0107C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B010FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B010FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0111C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0111C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0145C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0145C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B014C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B014C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B018D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B018D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B018E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B018E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0194C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0194C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01C00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01C00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B01D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B01D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B024D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B024D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B025A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B025A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B026C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B026C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B028F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B028F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0299C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0299C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02F34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02F34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B02F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B02F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B03048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B03048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B034AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B034AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B03B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B03B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B03DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B03DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B040C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B040C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B042B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B042B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0434C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0434C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B044A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B044A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B044B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B044B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B048D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B048D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04DF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04DF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04EBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04EBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B04FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B04FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B05EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B05EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B061E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B061E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0630C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0630C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B065C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B065C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B069D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B069D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06FCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06FCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B06FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B06FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B075EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B075EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07F14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07F14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B07FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B07FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0819C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0819C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B087A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B087A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B087E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B087E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B088E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B088E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B089B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B089B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B089E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B089E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08AD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08C44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08C44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08EA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08EA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B08F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B08F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B095C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B095C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0961C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0961C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B097B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B097B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09AD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09AD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09B80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09B80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B09F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B09F64.s") -void func_86B0A0B0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A0B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A0B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A0B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A15C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A15C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A18C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A18C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A47C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A47C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A7F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A7F8.s") -void func_86B0A81C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A81C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0A824.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0A824.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B0B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B0B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B12C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B12C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B4D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B4D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0B8DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0B8DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/17/fragment17/func_86B0BA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/17/fragment17/func_86B0BA18.s") diff --git a/src/fragments/18/fragment18.c b/src/fragments/18/fragment18.c index 54fc62e..9221b9e 100644 --- a/src/fragments/18/fragment18.c +++ b/src/fragments/18/fragment18.c @@ -1,128 +1,127 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C005D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C005D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C0063C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C0063C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00AA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00AA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00EF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00EF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C00F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C00F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01408.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C014A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C014A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C016C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C016C8.s") -void func_86C01748(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C018B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C018B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C01FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C01FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C021FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C021FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C022D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C022D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C026F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C026F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C0276C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C0276C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C027BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C027BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C028C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C028C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C02C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C02C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C030EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C030EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C031E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C031E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C035E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C035E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03BE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03BE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03C64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03C64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03E8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03E8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C03ED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C03ED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C040B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C040B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C04170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C04170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C041E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C041E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C043C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C043C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C044B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C044B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/18/fragment18/func_86C046B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/18/fragment18/func_86C046B0.s") diff --git a/src/fragments/19/fragment19.c b/src/fragments/19/fragment19.c index 9acfb4a..41ce6a9 100644 --- a/src/fragments/19/fragment19.c +++ b/src/fragments/19/fragment19.c @@ -1,17 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D000A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D000A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D000D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D000D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D00134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D00134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D0015C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D0015C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D0032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D0032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D0037C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D0037C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/19/fragment19/func_86D003EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/19/fragment19/func_86D003EC.s") diff --git a/src/fragments/2/fragment2.c b/src/fragments/2/fragment2.c index 65db38f..f40ed76 100644 --- a/src/fragments/2/fragment2.c +++ b/src/fragments/2/fragment2.c @@ -1,88 +1,88 @@ -#include "common.h" +#include "global.h" #include "fragment2.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780005C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780005C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878001D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878001D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878001E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878001E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780024C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780024C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878009BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878009BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878010C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878010C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780118C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780118C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878013D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878013D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801824.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801824.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878018F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878018F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801AC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801AC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87801F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87801F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878021B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878021B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878025D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878025D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780295C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780295C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878029C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878029C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802E1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802E1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802EB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802F4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802F4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87802FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87802FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_8780304C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_8780304C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_878038B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_878038B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87803EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87803EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87804320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87804320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87804AD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87804AD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/2/fragment2/func_87804FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/2/fragment2/func_87804FD4.s") diff --git a/src/fragments/2/fragment2.h b/src/fragments/2/fragment2.h index c48216c..55a341a 100644 --- a/src/fragments/2/fragment2.h +++ b/src/fragments/2/fragment2.h @@ -1,7 +1,7 @@ #ifndef _FRAGMENT2_H_ #define _FRAGMENT2_H_ -#include "common.h" +#include "global.h" extern s32 D_87806330; extern s16 D_8780FA2A; diff --git a/src/fragments/20/fragment20.c b/src/fragments/20/fragment20.c index f06e612..66a59ab 100644 --- a/src/fragments/20/fragment20.c +++ b/src/fragments/20/fragment20.c @@ -1,118 +1,117 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E001A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E001A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E001E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E001E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E002E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E002E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0034C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0034C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E004FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E004FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0063C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0063C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0073C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0073C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E007BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E007BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E007CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E007CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00CAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00CAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E00FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E00FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0103C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0103C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E010E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E010E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E016EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E016EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0172C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0172C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E017C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E017C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E0182C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0182C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E019B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E019B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E019F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E019F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01B08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01B08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E01F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E01F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E021D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E021D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E026D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E026D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E027D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E027D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E027FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E027FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02924.s") -void func_86E0296C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E0296C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02A28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02A28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02BB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02BB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/20/fragment20/func_86E02E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/20/fragment20/func_86E02E40.s") diff --git a/src/fragments/21/fragment21.c b/src/fragments/21/fragment21.c index 9455992..8a8d897 100644 --- a/src/fragments/21/fragment21.c +++ b/src/fragments/21/fragment21.c @@ -1,83 +1,83 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F001CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F001CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F002F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F002F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0035C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0035C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F003FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F003FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0048C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0048C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0050C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0050C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F00F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F00F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F010B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F010B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F011E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F011E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F012B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F012B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0132C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0132C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F013B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F013B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F014B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F014B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F014F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F014F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0164C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0164C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F016D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F016D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0174C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0174C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F018E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F018E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F01F58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F01F58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F0204C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F0204C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/21/fragment21/func_86F02520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/21/fragment21/func_86F02520.s") diff --git a/src/fragments/22/fragment22.c b/src/fragments/22/fragment22.c index a4f79f7..3a60558 100644 --- a/src/fragments/22/fragment22.c +++ b/src/fragments/22/fragment22.c @@ -1,49 +1,49 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_8800008C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_8800008C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880001A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880001A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_8800071C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_8800071C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880007C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880007C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880008C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880008C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880008E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880008E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000CC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000CC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88000E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88000E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88001D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88001D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_8800233C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_8800233C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88002580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88002580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_880025D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_880025D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/22/fragment22/func_88002628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/22/fragment22/func_88002628.s") diff --git a/src/fragments/23/fragment23.c b/src/fragments/23/fragment23.c index c8ee4df..e4766bc 100644 --- a/src/fragments/23/fragment23.c +++ b/src/fragments/23/fragment23.c @@ -1,540 +1,539 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882000E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882000E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882004BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882004BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882004C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882004C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882009B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882009B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200C44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200C44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88200FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88200FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820104C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820104C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820130C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820130C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882013F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882013F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88201DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88201DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820213C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820213C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820253C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820253C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882025AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882025AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882025B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882025B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882025E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882025E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882027F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882027F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882028EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882028EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202B74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202B74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202E74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202E74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202EB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88202F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88202F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88203538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88203538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820399C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820399C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88203A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88203A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88203ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88203ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204E0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204E0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88204EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88204EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820508C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820508C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882051EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882051EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882052F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882052F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882057B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882057B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88205F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88205F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882062E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882062E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820634C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820634C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820660C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820660C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882068B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882068B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882069C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882069C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206C4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206C4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88206F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88206F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820723C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820723C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882079D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882079D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88207F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88207F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820817C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820817C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820820C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820820C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882082BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882082BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882082FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882082FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882083D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882083D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88208CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88208CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882091E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882091E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882091F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882091F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820920C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820920C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820927C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820927C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820938C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820938C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88209A88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88209A88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88209AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88209AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88209B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88209B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820ADEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820ADEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820AF78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820AF78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820AFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820AFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B0A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B0A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B0E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B0E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B12C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B12C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B3AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B3AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B3C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B3C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820B838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820B838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820BE14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820BE14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820C97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820C97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CA2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CA2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820CC30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820CC30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D0EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D0EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D0F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D0F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D5E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D5E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D7C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D7C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820D9B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820D9B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DB98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DB98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DBE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DBE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DC1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DC1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DC90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DC90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DDC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DDC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DDE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DDE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820DF38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820DF38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E6A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E6A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E90C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E90C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820E99C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820E99C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EBF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EBF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EC1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EC1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EC68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EC68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EC9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EC9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820ECAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820ECAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820ED14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820ED14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EFD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EFD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820EFD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820EFD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820F3B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820F3B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8820FFF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8820FFF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821004C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821004C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882101B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882101B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882101E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882101E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821064C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821064C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882107D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882107D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882107F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882107F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882108A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882108A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882108D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882108D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882109C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882109C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210D8C.s") -void func_88210DA8(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210DA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88210F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88210F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882110E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882110E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882111C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882111C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882111F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882111F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882112E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882112E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88211794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88211794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882118CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882118CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88212150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88212150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882121E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882121E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821347C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821347C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882135D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882135D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882136F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882136F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213774.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213774.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882137B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882137B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882138D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882138D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882139C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882139C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213B90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88213CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88213CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821421C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821421C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88214720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88214720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882147BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882147BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821483C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821483C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882149A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882149A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88214A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88214A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882158BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882158BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882158CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882158CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88215974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88215974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882159AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882159AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882159BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882159BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88215D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88215D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88216000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88216000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882169D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882169D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88216F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88216F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882170A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882170A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821711C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821711C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_8821738C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_8821738C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882173EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882173EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882175F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882175F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882176C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882176C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_882177A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_882177A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/23/fragment23/func_88217BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/23/fragment23/func_88217BC0.s") diff --git a/src/fragments/24/fragment24.c b/src/fragments/24/fragment24.c index 3692565..7f8da96 100644 --- a/src/fragments/24/fragment24.c +++ b/src/fragments/24/fragment24.c @@ -1,564 +1,561 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883003E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883003E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883006B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883006B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830089C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830089C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830090C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830090C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300B68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300B68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300D54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300D54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88300FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88300FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830133C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830133C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883013AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883013AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883018D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883018D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301B34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301B34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301BA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301BA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88301FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88301FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883024E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883024E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883026CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883026CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830290C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830290C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88302E04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88302E04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88303520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88303520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883036AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883036AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883045C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883045C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883047CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883047CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88304850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88304850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883050CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883050CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883051B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883051B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883051F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883051F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883054DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883054DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883057F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883057F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883058C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883058C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305CDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305CDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305DA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305DA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88305F28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88305F28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830681C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830681C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306F90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306F90.s") -void func_88306FE4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306FE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88306FEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88306FEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883073E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883073E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883074D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883074D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830757C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830757C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830772C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830772C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88307C2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88307C2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830858C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830858C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830867C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830867C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88308D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88308D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88308DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88308DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88308E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88308E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883092C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883092C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883094CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883094CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883096BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883096BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309774.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309774.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883097D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883097D4.s") -void func_883097E4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883097E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883097EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883097EC.s") -void func_88309808(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883098D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883098D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883099D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883099D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88309E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88309E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A5E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A5E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A88C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A88C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830A9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830A9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830AAA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830AAA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830AADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830AADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830AC0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830AC0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830ACA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830ACA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B2EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B2EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B8A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B8A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830B954.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830B954.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BAC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BAC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BCE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BCE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BF30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BF30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BF5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BF5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830BFE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830BFE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830C218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830C218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CD4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CD4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CE84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CE84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CF88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CF88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830CFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830CFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D0B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D0B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D11C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D11C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830D2F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830D2F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DBE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DBE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DC0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DC0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DC58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DC58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DD8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DD8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830DDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830DDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830E090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830E090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830E4A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830E4A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830E504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830E504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830EE58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830EE58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F05C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F05C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F09C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F09C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F0C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F0C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F2A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F2A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830F5DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830F5DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830FA10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830FA10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830FA20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830FA20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8830FA80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8830FA80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883103CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883103CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883105D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883105D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831067C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831067C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883106C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883106C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88310CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88310CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883112B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883112B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311C64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311C64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88311F70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88311F70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883121F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883121F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831221C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831221C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883122E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883122E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831239C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831239C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831247C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831247C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883125B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883125B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831286C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831286C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883128B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883128B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883128FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883128FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88312D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88312D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883137C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883137C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883139E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883139E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313B4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313B4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313B90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88313FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88313FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883142F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883142F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883149E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883149E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88314A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88314A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883151B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883151B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883151E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883151E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831527C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831527C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883152D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883152D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883156B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883156B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883156E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883156E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_8831577C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_8831577C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883157D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883157D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315CFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315CFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88315FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88315FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883160BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883160BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883160DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883160DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883161D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883161D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883163A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883163A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883163B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883163B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883164C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883164C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883166A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883166A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883167CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883167CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_883168B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_883168B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316E10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316E10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88316F98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88316F98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/24/fragment24/func_88317144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/24/fragment24/func_88317144.s") diff --git a/src/fragments/25/fragment25.c b/src/fragments/25/fragment25.c index 1c4658c..bba7caa 100644 --- a/src/fragments/25/fragment25.c +++ b/src/fragments/25/fragment25.c @@ -1,7 +1,7 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/25/fragment25/func_88400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/25/fragment25/func_88400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/25/fragment25/func_8840007C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/25/fragment25/func_8840007C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/25/fragment25/func_884000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/25/fragment25/func_884000C4.s") diff --git a/src/fragments/26/fragment26.c b/src/fragments/26/fragment26.c index 87dc4bd..7bc9be0 100644 --- a/src/fragments/26/fragment26.c +++ b/src/fragments/26/fragment26.c @@ -1,297 +1,297 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850067C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850067C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850068C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850068C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885006CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885006CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850074C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850074C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885007CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885007CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885008C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885008C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850093C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850093C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885009E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885009E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88500F6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88500F6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885012A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885012A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88501314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88501314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850143C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850143C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885014BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885014BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850182C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850182C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850189C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850189C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850230C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850230C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885023F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885023F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502D00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502D00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88502D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88502D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850318C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850318C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885031B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885031B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885031E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885031E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885032E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885032E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885033CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885033CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885033E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885033E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88503C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88503C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885045FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885045FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88504F98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88504F98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885054CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885054CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885054D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885054D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850555C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850555C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850562C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850562C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88505EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88505EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885060BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885060BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850628C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850628C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885062D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885062D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850633C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850633C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885063B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885063B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885065E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885065E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506DCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506DCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88506FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88506FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850734C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850734C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885075BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885075BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507B80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507B80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507CC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507CC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507D4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507D4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88507DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88507DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850878C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850878C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850882C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850882C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_885088F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_885088F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850897C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850897C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88508AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88508AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509E8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509E8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_88509F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_88509F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A10C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A10C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A29C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A29C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A2DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A2DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A2FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A2FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A3CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A3CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A3EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A3EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850A480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850A480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850AB48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850AB48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850ABBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850ABBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850B254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850B254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850B2D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850B2D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BD40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BD40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BD8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BD8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BDC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BDC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BDF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BDF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BF60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BF60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BF80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BF80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850BFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850BFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C0D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C0D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C1D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C1D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C3B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C3B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850C924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850C924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CB48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CB48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CBA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CBA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CBF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CBF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CC54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CC54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CC74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CC74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CCA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CCA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CD24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CD24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CD44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CD44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CE80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CE80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/26/fragment26/func_8850CF00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/26/fragment26/func_8850CF00.s") diff --git a/src/fragments/27/fragment27.c b/src/fragments/27/fragment27.c index a16e4fb..3d59cea 100644 --- a/src/fragments/27/fragment27.c +++ b/src/fragments/27/fragment27.c @@ -1,124 +1,123 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600214.s") -void func_88600240(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886002A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886002A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886006D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886006D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600DDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600DDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88600F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88600F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860115C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860115C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886011EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886011EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886011F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886011F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886015F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886015F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886018C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886018C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860192C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860192C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601DE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601DE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88601DF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88601DF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602D40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602D40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88602FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88602FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860308C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860308C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886033E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886033E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88603468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88603468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88604190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88604190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88604198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88604198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886041F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886041F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_8860439C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_8860439C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88604F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88604F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886050C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886050C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886052F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886052F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886056D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886056D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_886058B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_886058B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/27/fragment27/func_88605A0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/27/fragment27/func_88605A0C.s") diff --git a/src/fragments/28/fragment28.c b/src/fragments/28/fragment28.c index 89fe07a..d61bd7a 100644 --- a/src/fragments/28/fragment28.c +++ b/src/fragments/28/fragment28.c @@ -1,129 +1,129 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888002F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888002F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88800E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88800E20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880123C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880123C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888018E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888018E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880193C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880193C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888019A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888019A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88801E1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88801E1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880231C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880231C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888025C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888025C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880261C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880261C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888026D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888026D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880276C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880276C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88802F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88802F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880316C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880316C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888031FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888031FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888038E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888038E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88803FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88803FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880412C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880412C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880431C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880431C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888044BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888044BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888047D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888047D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88804EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88804EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880554C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880554C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88805960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88805960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88805AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88805AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888069B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888069B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88806EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88806EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88806EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88806EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88806F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88806F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88807090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88807090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_888071C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_888071C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880725C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880725C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88807AC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88807AC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_88807D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_88807D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/28/fragment28/func_8880812C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/28/fragment28/func_8880812C.s") diff --git a/src/fragments/29/fragment29.c b/src/fragments/29/fragment29.c index 270e2bf..a0268d7 100644 --- a/src/fragments/29/fragment29.c +++ b/src/fragments/29/fragment29.c @@ -1,23 +1,23 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889000C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889006D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889006D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889007AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889007AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889007BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889007BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_88900A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_88900A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889010AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889010AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889010C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889010C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/29/fragment29/func_889010D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/29/fragment29/func_889010D0.s") diff --git a/src/fragments/3/fragment3.c b/src/fragments/3/fragment3.c index cbedc41..e86af8b 100644 --- a/src/fragments/3/fragment3.c +++ b/src/fragments/3/fragment3.c @@ -1,157 +1,157 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790002C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790002C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879000C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879001A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879001A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879002B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879002B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879002FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879002FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879003A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879003A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879004F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879004F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879005AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879005AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879005C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879005C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790060C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790060C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879009B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879009B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87900F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87900F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879010A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879010A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790168C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790168C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879018B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879018B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901A28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901A28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901B08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901B08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901BB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901BB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87901FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87901FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790215C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790215C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902318.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902318.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879023EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879023EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879024DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879024DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879026D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879026D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879027F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879027F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879028E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879028E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879029F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879029F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87902FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87902FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790320C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790320C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879032BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879032BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903358.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903358.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879033FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879033FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790354C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790354C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879036B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879036B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_8790370C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_8790370C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879037D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879037D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_879038AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_879038AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/3/fragment3/func_87903D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/3/fragment3/func_87903D64.s") diff --git a/src/fragments/30/fragment30.c b/src/fragments/30/fragment30.c index d4e8084..7eaf735 100644 --- a/src/fragments/30/fragment30.c +++ b/src/fragments/30/fragment30.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/30/fragment30/func_88A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/30/fragment30/func_88A00020.s") diff --git a/src/fragments/31/fragment31.c b/src/fragments/31/fragment31.c index e873c14..e23c33e 100644 --- a/src/fragments/31/fragment31.c +++ b/src/fragments/31/fragment31.c @@ -1,103 +1,103 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810002DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810002DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810004E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810004E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_8100059C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_8100059C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810005F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810005F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810007A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810007A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810007F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810007F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_8100080C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_8100080C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81000E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81000E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810010BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810010BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81001D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81001D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81001E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81001E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810024E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810024E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810027E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810027E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810029B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810029B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002BC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002C00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002C00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81002FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81002FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003138.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003138.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810031C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810031C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810033C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810033C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810035C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810035C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003678.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003678.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_810038D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_810038D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003A24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/31/fragment31/func_81003F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/31/fragment31/func_81003F20.s") diff --git a/src/fragments/32/fragment32.c b/src/fragments/32/fragment32.c index 6369fbc..6da0e8d 100644 --- a/src/fragments/32/fragment32.c +++ b/src/fragments/32/fragment32.c @@ -1,13 +1,13 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_81100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_81100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811001C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811001C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811002D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811002D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_81100368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_81100368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811007AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811007AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/32/fragment32/func_811007F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/32/fragment32/func_811007F8.s") diff --git a/src/fragments/34/fragment34.c b/src/fragments/34/fragment34.c index d7edc59..4b519af 100644 --- a/src/fragments/34/fragment34.c +++ b/src/fragments/34/fragment34.c @@ -1,1037 +1,1035 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814000E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814000E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140012C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140012C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140015C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140015C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140018C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140018C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814001DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814001DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814002A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814002A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814002F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814002F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140033C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140033C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814003F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814003F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140043C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140043C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814004D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814004D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814005EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814005EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814006CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814006CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140082C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140082C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814008B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814008B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140094C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140094C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140099C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140099C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814009D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814009D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400A60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400A60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400BBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400BBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400D00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400D00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400E8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400E8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81400FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81400FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814010D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814010D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140119C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140119C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814011E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814011E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401268.s") -void func_8140138C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140138C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814014E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814014E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814015A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814015A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814015F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814015F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814017E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814017E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401ABC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401ABC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81401FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81401FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140203C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140203C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814020B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814020B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140213C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140213C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814021A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814021A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140227C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140227C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814022EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814022EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140238C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140238C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402494.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402494.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814024C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814024C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140297C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140297C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81402E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81402E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814030C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814030C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814032B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814032B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140353C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140353C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403EA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403EA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81403FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81403FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814040E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814040E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140419C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140419C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814041BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814041BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814041DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814041DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814042C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814042C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140430C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140430C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140437C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140437C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140439C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140439C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814043BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814043BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140441C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140441C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814044FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814044FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814045CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814045CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404A6C.s") -void func_81404AB4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404ABC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404ABC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404CF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404CF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404DB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404DB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81404F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81404F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814050BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814050BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140515C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140515C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814054B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814054B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814059C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814059C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405D38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405D38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405E04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405E04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405ED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405ED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81405FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81405FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814060D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814060D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814064B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814064B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81406564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81406564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140679C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140679C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814067F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814067F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814072B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814072B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140743C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140743C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814078B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814078B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81407FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81407FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814080EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814080EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140810C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140810C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140819C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140819C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814081BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814081BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814081F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814081F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140826C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140826C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814082E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814082E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814083FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814083FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814084D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814084D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814087F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814087F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408864.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408864.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814089AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814089AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408C68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408C68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408C88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408C88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408DD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408DD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408E90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408E90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81408FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81408FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140901C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140901C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140908C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140908C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140910C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140910C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814091B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814091B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814092C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814092C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140935C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140935C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814093B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814093B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140948C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140948C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140959C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140959C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409708.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409708.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814097D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814097D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814098A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814098A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814098E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814098E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409900.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409900.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409918.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409918.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814099C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814099C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_814099E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_814099E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409A98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409AD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409AD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409B18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409B18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409BC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409BC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409C94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409C94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409DD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_81409FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_81409FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A03C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A03C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A07C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A07C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A0AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A0AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A0C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A0C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A11C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A11C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A24C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A24C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A2E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A2E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A3EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A3EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A4F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A4F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A52C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A52C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A5B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A5B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A5CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A5CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A6BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A6BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A6E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A6E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A73C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A73C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A7DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A7DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A878.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A878.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A8C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A8C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A91C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A91C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140A9C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140A9C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AA18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AC70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AC70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AD8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AD8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140ADA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140ADA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140ADBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140ADBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AE40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AE40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AE84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AE84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AFA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AFA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140AFFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140AFFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B0F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B0F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B14C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B14C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B1C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B1C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B1EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B1EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B23C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B23C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B2B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B2B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B3AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B3AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B42C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B42C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B4A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B4A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B7C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B7C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B854.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B854.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B95C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B95C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B98C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B98C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140B9D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140B9D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BA48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BA48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BA84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BA84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BAC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BAC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BAE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BAE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BBC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BBC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BBF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BBF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BC2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BC2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BC5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BC5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BCA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BCA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BCBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BCBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BD08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BD08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BD34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BD34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BD80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BD80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BDAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BDAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BDD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BDD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BE8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BE8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BEF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BEF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BF98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BF98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140BFEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140BFEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C0D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C0D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C13C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C13C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C1C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C1C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C1E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C1E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C2D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C4CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C4CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C5D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C5D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C7C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C7C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C7EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C7EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C84C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C84C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C8B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C8B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C8F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C8F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C96C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C96C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C9B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C9B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140C9EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140C9EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CA30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CA30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CA64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CA64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CA90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CA90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CAC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CAC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CC04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CC04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CC90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CC90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CD80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CD80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CDDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CDDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CE68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CE68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CF30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CF30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140CFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140CFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D1FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D1FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D4A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D4A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D4E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D4E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D5A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D5A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D5F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D5F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D624.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D624.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D708.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D708.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D78C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D78C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D7C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D7C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140D908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140D908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/34/fragment34/func_8140DA40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/34/fragment34/func_8140DA40.s") diff --git a/src/fragments/35/fragment35.c b/src/fragments/35/fragment35.c index 60a9b61..ad2dc54 100644 --- a/src/fragments/35/fragment35.c +++ b/src/fragments/35/fragment35.c @@ -1,11 +1,11 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_82000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_82000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_820002B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_820002B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_820002F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_820002F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_8200036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_8200036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/35/fragment35/func_820003A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/35/fragment35/func_820003A4.s") diff --git a/src/fragments/36/fragment36.c b/src/fragments/36/fragment36.c index 596d3b8..909c5de 100644 --- a/src/fragments/36/fragment36.c +++ b/src/fragments/36/fragment36.c @@ -1,40 +1,39 @@ -#include "common.h" +#include "global.h" -void func_82100020(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821000C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821000C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821002F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821002F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_8210046C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_8210046C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821005EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821005EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_8210071C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_8210071C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821009AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821009AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_821009B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_821009B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/36/fragment36/func_82100C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/36/fragment36/func_82100C98.s") diff --git a/src/fragments/37/fragment37.c b/src/fragments/37/fragment37.c index 4d67c48..d5d5580 100644 --- a/src/fragments/37/fragment37.c +++ b/src/fragments/37/fragment37.c @@ -1,64 +1,63 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82200FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82200FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82201108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82201108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822012E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822012E8.s") -void func_822014C0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822014C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822014C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822014C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82201654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82201654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822018D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822018D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82201AC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82201AC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822022C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822022C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822023A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822023A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_8220263C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_8220263C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822026BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822026BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_822027E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_822027E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/37/fragment37/func_82202DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/37/fragment37/func_82202DC4.s") diff --git a/src/fragments/38/fragment38.c b/src/fragments/38/fragment38.c index 746d192..1b61c70 100644 --- a/src/fragments/38/fragment38.c +++ b/src/fragments/38/fragment38.c @@ -1,113 +1,113 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82300214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82300214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230047C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230047C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82300C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82300C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230147C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230147C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301CC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301CC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82301FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82301FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823020B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823020B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823023F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823023F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823025B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823025B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302B78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302B78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302E34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302E34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82302E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82302E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823031B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823031B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230340C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230340C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823034AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823034AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230391C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230391C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303CA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303CA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303F58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303F58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303FB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303FB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82303FE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82303FE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304358.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304358.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230443C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230443C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823045D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823045D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823046C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823046C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823047B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823047B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230495C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230495C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82304EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82304EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82305038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82305038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230519C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230519C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_8230527C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_8230527C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_82305370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_82305370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823056C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823056C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/38/fragment38/func_823057E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/38/fragment38/func_823057E4.s") diff --git a/src/fragments/39/fragment39.c b/src/fragments/39/fragment39.c index cb0ff7c..7f581e1 100644 --- a/src/fragments/39/fragment39.c +++ b/src/fragments/39/fragment39.c @@ -1,146 +1,145 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825001B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825001B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250042C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250042C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250088C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250088C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500D14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500D14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82500FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82500FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825010A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825010A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825014B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825014B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825017F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825017F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250182C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250182C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501B18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501B18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501C88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501C88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82501ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82501ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825023D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825023D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250244C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250244C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825024C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825024C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250281C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250281C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502BB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502BB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82502FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82502FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825031FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825031FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825032BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825032BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825039AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825039AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82503F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82503F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_8250416C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_8250416C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825042A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825042A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825045C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825045C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825046AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825046AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504A08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504A08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82504BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82504BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825053B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825053B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825054F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825054F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505720.s") -void func_825057A0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825057A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825057A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825057A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505B94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505B94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505C10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505C10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_82505FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_82505FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/39/fragment39/func_825060E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/39/fragment39/func_825060E0.s") diff --git a/src/fragments/4/fragment4.c b/src/fragments/4/fragment4.c index 7537897..3d36bbc 100644 --- a/src/fragments/4/fragment4.c +++ b/src/fragments/4/fragment4.c @@ -1,19 +1,19 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A0002C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A0002C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A005BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A005BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A009F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A009F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A00DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A00DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A010C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A010C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/4/fragment4/func_87A010D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/4/fragment4/func_87A010D4.s") diff --git a/src/fragments/4/fragment4.h b/src/fragments/4/fragment4.h index 1f1238d..eaa62ea 100644 --- a/src/fragments/4/fragment4.h +++ b/src/fragments/4/fragment4.h @@ -1,7 +1,7 @@ #ifndef _FRAGMENT4_H_ #define _FRAGMENT4_H_ -#include "common.h" +#include "global.h" void func_87A00020(unk_D_86002F34_00C*); Gfx* func_87A0002C(Gfx*); diff --git a/src/fragments/40/fragment40.c b/src/fragments/40/fragment40.c index 949a667..5387f3a 100644 --- a/src/fragments/40/fragment40.c +++ b/src/fragments/40/fragment40.c @@ -1,47 +1,47 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_8310024C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_8310024C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831006D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831006D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831006F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831006F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100CD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100CD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83100D4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83100D4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_8310102C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_8310102C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831010B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831010B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831010E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831010E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831011D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831011D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831013FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831013FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101608.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101608.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_831016D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_831016D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/40/fragment40/func_83101A98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/40/fragment40/func_83101A98.s") diff --git a/src/fragments/41/fragment41.c b/src/fragments/41/fragment41.c index 88bf148..1dae2bd 100644 --- a/src/fragments/41/fragment41.c +++ b/src/fragments/41/fragment41.c @@ -1,421 +1,419 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F000C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F000C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00138.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00138.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F002BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F002BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00378.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00378.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F003F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F003F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00568.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00568.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00838.s") -void func_82F00960(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00AC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00AC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00C14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00C14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00E88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00E88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00F3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00F3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F00FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F00FD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0109C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0109C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F014E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F014E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F018F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F018F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F01FE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F01FE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F020B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F020B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F022DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F022DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F028AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F028AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F029FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F029FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02CE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02CE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F02FEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F02FEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F037EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F037EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F04010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F04010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F040D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F040D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F043A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F043A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F04604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F04604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F04FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F04FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0504C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0504C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F051B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F051B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0525C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0525C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F052F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F052F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F053F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F053F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F056D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F056D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F05F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F05F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06E04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06E04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06E38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06E38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F06F9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F06F9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0761C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0761C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0763C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0763C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F077E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F077E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F07DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F07DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F081FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F081FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0822C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0822C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F083B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F083B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F084EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F084EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0856C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0856C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0866C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0866C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F087F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F087F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F088F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F088F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F08EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F08EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0917C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0917C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F094B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F094B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F097D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F097D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F09F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F09F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A0A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A0A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A23C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A23C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A5F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A5F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A804.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A804.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A850.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A850.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0A950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0A950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0AA50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0AA50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0AB68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0AB68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0ACC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0ACC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0B2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0B2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0B3E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0B3E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0B7B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0B7B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BBE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BBE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BD38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BD38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BE7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BE7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0BEF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0BEF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C16C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C16C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C630.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C630.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C7FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C7FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C8EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C8EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0C958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0C958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0CA7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0CA7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0CB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0CB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0CC3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0CC3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D27C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D27C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D2F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D2F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D3F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D3F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D51C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D51C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D64C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D64C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D6D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D6D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0D834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0D834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0DA60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0DA60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0DCF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0DCF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0DD90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0DD90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0E5C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0E5C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0E97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0E97C.s") -void func_82F0ECA4(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0ECA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0ECAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0ECAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0EE58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0EE58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0EF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0EF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0EFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0EFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F2AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F2AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F79C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F79C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F89C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F89C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0F9E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0F9E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0FCC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0FCC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0FDCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0FDCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F0FDEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F0FDEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F101C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F101C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1050C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1050C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1084C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1084C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1091C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1091C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10A24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F10ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F10ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F11264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F11264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F115F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F115F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1198C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1198C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F11D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F11D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F1228C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F1228C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F12614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F12614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F12DE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F12DE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F132D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F132D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13B4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13B4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/41/fragment41/func_82F13B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/41/fragment41/func_82F13B64.s") diff --git a/src/fragments/42/fragment42.c b/src/fragments/42/fragment42.c index 67e1b44..ec66be2 100644 --- a/src/fragments/42/fragment42.c +++ b/src/fragments/42/fragment42.c @@ -1,55 +1,55 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_8330032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_8330032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833005CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833005CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83300D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83300D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83301090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83301090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833013C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833013C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833015C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833015C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833017BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833017BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83301998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83301998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83301D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83301D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833023D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833023D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_8330267C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_8330267C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_8330277C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_8330277C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833028FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833028FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_833029F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_833029F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302E3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302E3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302F48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302F48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/42/fragment42/func_83302FD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/42/fragment42/func_83302FD8.s") diff --git a/src/fragments/43/fragment43.c b/src/fragments/43/fragment43.c index 1e02156..56526a9 100644 --- a/src/fragments/43/fragment43.c +++ b/src/fragments/43/fragment43.c @@ -1,114 +1,113 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834002C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834002C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834002E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834002E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400410.s") -void func_8340051C(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_8340051C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834006A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834006A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834006BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834006BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834006CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834006CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834007B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834007B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834008DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834008DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83400928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83400928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_8340144C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_8340144C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834016C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834016C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834018C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834018C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401D0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83401FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83401FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834020D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834020D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834021C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834021C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834021D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834021D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834021EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834021EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834023A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834023A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834023CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834023CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834023FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834023FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834024C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834024C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834026A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834026A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834028C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834028C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_834028D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_834028D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/43/fragment43/func_83402DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/43/fragment43/func_83402DC8.s") diff --git a/src/fragments/44/fragment44.c b/src/fragments/44/fragment44.c index b2f3ca2..c283fb2 100644 --- a/src/fragments/44/fragment44.c +++ b/src/fragments/44/fragment44.c @@ -1,61 +1,61 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_8350057C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_8350057C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500D9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500D9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83500FE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83500FE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83501FA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83501FA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835022F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835022F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835023F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835023F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835024FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835024FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835028D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835028D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83502F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83502F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835034A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835034A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_8350355C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_8350355C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835035E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835035E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_8350365C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_8350365C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835038DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835038DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_835039C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_835039C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/44/fragment44/func_83503C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/44/fragment44/func_83503C9C.s") diff --git a/src/fragments/45/fragment45.c b/src/fragments/45/fragment45.c index 0cc938d..d455ad9 100644 --- a/src/fragments/45/fragment45.c +++ b/src/fragments/45/fragment45.c @@ -1,53 +1,53 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600310.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600310.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_8360086C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_8360086C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_836009A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_836009A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83600E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83600E20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83601F28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83601F28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_8360282C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_8360282C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_836028E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_836028E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_8360296C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_8360296C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602C14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602C14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602F4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602F4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_83602FF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_83602FF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/45/fragment45/func_836030A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/45/fragment45/func_836030A8.s") diff --git a/src/fragments/46/fragment46.c b/src/fragments/46/fragment46.c index 2b87d2d..4ca0e4b 100644 --- a/src/fragments/46/fragment46.c +++ b/src/fragments/46/fragment46.c @@ -1,18 +1,17 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700020.s") -void func_83700090(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_83700174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_83700174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_8370023C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_8370023C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_8370026C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_8370026C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/46/fragment46/func_837002EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/46/fragment46/func_837002EC.s") diff --git a/src/fragments/47/fragment47.c b/src/fragments/47/fragment47.c index 586f3ad..13bc9cd 100644 --- a/src/fragments/47/fragment47.c +++ b/src/fragments/47/fragment47.c @@ -1,135 +1,135 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380008C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380008C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838003B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838003B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800730.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800730.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800900.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800900.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800AA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800AA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800D8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800D8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83800EFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83800EFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380101C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380101C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380142C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380142C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838014B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838014B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838015F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838015F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801C94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801C94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801E00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801E00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83801F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83801F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380217C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380217C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838022C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838022C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380248C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380248C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838024C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838024C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838024EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838024EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380252C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380252C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838029D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838029D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802C98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802C98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83802EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83802EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838030A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838030A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380311C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380311C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838031F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838031F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838032C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838032C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838033DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838033DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803438.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803438.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380355C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380355C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380369C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380369C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_83803F34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_83803F34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_8380419C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_8380419C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/47/fragment47/func_838043F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/47/fragment47/func_838043F8.s") diff --git a/src/fragments/48/fragment48.c b/src/fragments/48/fragment48.c index 9413674..09d4199 100644 --- a/src/fragments/48/fragment48.c +++ b/src/fragments/48/fragment48.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839000E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839000E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900180.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900180.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839002B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839002B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839002F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839002F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839003DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839003DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_83900484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_83900484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839004B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839004B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/48/fragment48/func_839004F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/48/fragment48/func_839004F4.s") diff --git a/src/fragments/49/fragment49.c b/src/fragments/49/fragment49.c index 581e2ba..a4bdfef 100644 --- a/src/fragments/49/fragment49.c +++ b/src/fragments/49/fragment49.c @@ -1,19 +1,19 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A0031C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A0031C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00880.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00880.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A009C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A009C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/49/fragment49/func_83A00A4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/49/fragment49/func_83A00A4C.s") diff --git a/src/fragments/5/fragment5.c b/src/fragments/5/fragment5.c index ea2c2f9..816f007 100644 --- a/src/fragments/5/fragment5.c +++ b/src/fragments/5/fragment5.c @@ -1,5 +1,5 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/5/fragment5/func_87B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/5/fragment5/func_87B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/5/fragment5/func_87B00050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/5/fragment5/func_87B00050.s") diff --git a/src/fragments/50/fragment50.c b/src/fragments/50/fragment50.c index d9368b6..598b156 100644 --- a/src/fragments/50/fragment50.c +++ b/src/fragments/50/fragment50.c @@ -1,83 +1,81 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826000D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826000D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826007C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826007C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826007F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826007F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600C00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600C00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600C10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600C10.s") -void func_82600CFC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600CFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600D44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600D44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82600F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82600F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_8260125C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_8260125C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826024F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826024F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826026D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826026D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826028B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826028B8.s") -void func_826028CC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826028CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826028D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826028D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602AD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602AD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82602F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82602F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_8260332C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_8260332C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826034EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826034EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_826035D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_826035D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_8260365C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_8260365C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603924.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603924.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/50/fragment50/func_82603D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/50/fragment50/func_82603D20.s") diff --git a/src/fragments/51/fragment51.c b/src/fragments/51/fragment51.c index 5d7c18c..f52a20d 100644 --- a/src/fragments/51/fragment51.c +++ b/src/fragments/51/fragment51.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/51/fragment51/func_82800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/51/fragment51/func_82800020.s") diff --git a/src/fragments/52/fragment52.c b/src/fragments/52/fragment52.c index e699001..b98e662 100644 --- a/src/fragments/52/fragment52.c +++ b/src/fragments/52/fragment52.c @@ -1,13 +1,13 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_829001D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_829001D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_829002E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_829002E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/52/fragment52/func_82900390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/52/fragment52/func_82900390.s") diff --git a/src/fragments/53/fragment53.c b/src/fragments/53/fragment53.c index 8b9ced7..71f5ee3 100644 --- a/src/fragments/53/fragment53.c +++ b/src/fragments/53/fragment53.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A000F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A000F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A00144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A00144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/53/fragment53/func_82A00224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/53/fragment53/func_82A00224.s") diff --git a/src/fragments/54/fragment54.c b/src/fragments/54/fragment54.c index 80b16b1..8ffad4a 100644 --- a/src/fragments/54/fragment54.c +++ b/src/fragments/54/fragment54.c @@ -1,35 +1,35 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B000F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B000F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B0029C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B0029C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B003B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B003B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B005AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B005AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00BC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00BC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B00FFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B00FFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/54/fragment54/func_82B0104C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/54/fragment54/func_82B0104C.s") diff --git a/src/fragments/55/fragment55.c b/src/fragments/55/fragment55.c index bafe58a..b7d80e7 100644 --- a/src/fragments/55/fragment55.c +++ b/src/fragments/55/fragment55.c @@ -1,111 +1,111 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830003A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830003A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000418.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000418.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830004BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830004BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_8300059C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_8300059C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830007C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830007C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830007F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830007F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83000F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83000F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830014B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830014B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830015EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830015EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830017C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830017C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001A9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001A9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001B64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001B64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001C4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001C4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83001CF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83001CF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830020D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830020D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830022B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830022B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830023B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830023B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830023CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830023CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_8300243C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_8300243C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830025F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830025F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_8300269C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_8300269C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830026C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830026C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830026D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830026D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830027C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830027C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002A0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002A0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002BA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002BA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83002F9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83002F9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83003054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83003054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830032D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830032D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830033F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830033F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83003484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83003484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830038DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830038DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_83003988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_83003988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/55/fragment55/func_830039AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/55/fragment55/func_830039AC.s") diff --git a/src/fragments/56/fragment56.c b/src/fragments/56/fragment56.c index bc37771..cb6aa77 100644 --- a/src/fragments/56/fragment56.c +++ b/src/fragments/56/fragment56.c @@ -1,29 +1,29 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C0025C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C0025C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00AA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00AA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00E10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00E10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C00F88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C00F88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C01054.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C01054.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C0115C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C0115C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C0120C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C0120C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C012FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C012FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/56/fragment56/func_82C014FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/56/fragment56/func_82C014FC.s") diff --git a/src/fragments/57/fragment57.c b/src/fragments/57/fragment57.c index 0ad0fd2..03f3c9d 100644 --- a/src/fragments/57/fragment57.c +++ b/src/fragments/57/fragment57.c @@ -1,101 +1,101 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D00088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D00088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D002C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D002C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0053C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0053C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D00D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D00D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0153C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0153C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D01758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D01758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0180C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0180C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D018AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D018AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0194C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0194C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D01AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D01AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D021B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D021B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D022E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D022E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D029E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D029E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02D94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02D94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D02FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D02FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D03DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D03DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D043CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D043CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0442C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0442C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04EB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04EB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D04FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D04FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D053F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D053F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0580C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0580C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D05EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D05EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D063E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D063E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D0670C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D0670C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D067A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D067A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06B98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06B98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/57/fragment57/func_82D06D0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/57/fragment57/func_82D06D0C.s") diff --git a/src/fragments/58/fragment58.c b/src/fragments/58/fragment58.c index 53538d0..8b3ee7b 100644 --- a/src/fragments/58/fragment58.c +++ b/src/fragments/58/fragment58.c @@ -1,67 +1,67 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84000020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840000F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840000F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84000200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84000200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840003A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840003A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840004A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840004A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84000698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84000698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_8400094C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_8400094C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_8400114C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_8400114C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840012B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840012B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840017AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840017AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840019A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840019A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840019BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840019BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84001FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84001FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840021CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840021CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840021F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840021F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840023B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840023B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840024B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840024B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_8400253C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_8400253C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840025FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840025FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_840026D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_840026D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/58/fragment58/func_84002A84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/58/fragment58/func_84002A84.s") diff --git a/src/fragments/59/fragment59.c b/src/fragments/59/fragment59.c index ca902a9..21bd82c 100644 --- a/src/fragments/59/fragment59.c +++ b/src/fragments/59/fragment59.c @@ -1,35 +1,35 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_841003F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_841003F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_8410048C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_8410048C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84100F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84100F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_841014E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_841014E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101A94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101A94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101D80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101D80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84101EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84101EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84102140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84102140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_84102210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_84102210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/59/fragment59/func_841022C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/59/fragment59/func_841022C0.s") diff --git a/src/fragments/6/fragment6.c b/src/fragments/6/fragment6.c index 73f48ac..c6d67df 100644 --- a/src/fragments/6/fragment6.c +++ b/src/fragments/6/fragment6.c @@ -482,7 +482,7 @@ void func_86000020(void) { } } #else -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86000020.s") #endif s32 func_86000410(void) { @@ -646,7 +646,7 @@ static u8 D_86002B88[] = { 150, }; void func_860005B8(s32 arg0); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_860005B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_860005B8.s") #endif static Gfx D_86002B90[] = { @@ -1144,7 +1144,7 @@ void func_86001C90(void) { } #else void func_86001C90(void); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86001C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86001C90.s") #endif s32 func_86001EEC(void) { @@ -1296,7 +1296,7 @@ void func_86001F64(void) { } #else void func_86001F64(void); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86001F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86001F64.s") #endif void func_86002264(void) { @@ -1426,7 +1426,7 @@ void func_86002440(void) { } #else void func_86002440(void); -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/6/fragment6/func_86002440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/6/fragment6/func_86002440.s") #endif void func_86002778(UNUSED s32 arg0, UNUSED s32 arg1) { diff --git a/src/fragments/6/fragment6.h b/src/fragments/6/fragment6.h index 5d952a0..c845363 100644 --- a/src/fragments/6/fragment6.h +++ b/src/fragments/6/fragment6.h @@ -1,7 +1,7 @@ #ifndef _FRAGMENT6_H_ #define _FRAGMENT6_H_ -#include "common.h" +#include "global.h" diff --git a/src/fragments/60/fragment60.c b/src/fragments/60/fragment60.c index 1c94476..624b0ec 100644 --- a/src/fragments/60/fragment60.c +++ b/src/fragments/60/fragment60.c @@ -1,21 +1,21 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00274.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00274.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E0036C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E0036C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E0045C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E0045C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/60/fragment60/func_82E00F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/60/fragment60/func_82E00F2C.s") diff --git a/src/fragments/61/fragment61.c b/src/fragments/61/fragment61.c index a406489..40bd07a 100644 --- a/src/fragments/61/fragment61.c +++ b/src/fragments/61/fragment61.c @@ -1,458 +1,457 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842000C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842000C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842000F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842000F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842001B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842001B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84200738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84200738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420092C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420092C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420112C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420112C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420192C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420192C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201A00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201A00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201AD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201AD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84201F04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84201F04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842023E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842023E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842024DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842024DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202AF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202AF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84202EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84202EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420305C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420305C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420318C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420318C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842034E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842034E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842037AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842037AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842039B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842039B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203BBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203BBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84203E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84203E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420448C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420448C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204A3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204A3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204BF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204BF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204E0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204E0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84204F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84204F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842050CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842050CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420545C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420545C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420563C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420563C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420570C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420570C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842057AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842057AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420594C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420594C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84205F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84205F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842062D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842062D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842068DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842068DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206BF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206D10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206D10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206DE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206DE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206E88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206E88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84206FF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84206FF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420720C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420720C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842073A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842073A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842076A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842076A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842076F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842076F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420776C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420776C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842078C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842078C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842079B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842079B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842079F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842079F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84207E3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84207E3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420804C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420804C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842081A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842081A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842081B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842081B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842082D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842082D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842084BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842084BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842088A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842088A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84208F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84208F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209340.s") -void func_84209CEC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209CF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209CF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209D18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209D18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84209DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84209DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A0BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A0BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A1B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A3E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A3E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A4B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A4B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A678.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A678.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A7D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A7D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420A9B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420A9B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AA08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AA08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AB50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AB50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420ABC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420ABC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AC00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AC00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420ACA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420ACA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420AF1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420AF1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B0C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B0C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B1D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B1D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B20C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B20C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B5A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B5A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B71C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B71C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420B8CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420B8CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C484.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C484.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C4DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C4DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C60C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C60C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C6D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C6D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420C930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420C930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CA00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CA00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CAD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CAD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CC54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CC54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CCAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CCAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CE24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CE24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420CFC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420CFC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D2BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D2BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D4F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D75C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D75C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420D9B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420D9B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DA28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DA28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DAF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DAF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DB48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DB48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DC78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DC78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420DD14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420DD14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420E46C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420E46C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420E63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420E63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420EA88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420EA88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420EB7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420EB7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420ED0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420ED0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420EE54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420EE54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F1BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F1BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F1E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F1E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F37C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F37C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F4FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F4FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F53C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F53C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F5F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F5F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F86C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F86C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420F9C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420F9C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FA88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FA88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FB4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FB4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FC0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FC0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FCCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FCCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FDDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FDDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FE50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FE50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FEC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FEC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8420FFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8420FFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421009C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421009C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421015C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421015C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421059C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421059C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_842106FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_842106FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_8421089C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_8421089C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/61/fragment61/func_84210C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/61/fragment61/func_84210C80.s") diff --git a/src/fragments/62/fragment62.c b/src/fragments/62/fragment62.c index 467dc87..0373c76 100644 --- a/src/fragments/62/fragment62.c +++ b/src/fragments/62/fragment62.c @@ -1,4036 +1,4027 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843000C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843000C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430012C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430012C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843001FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843001FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300B34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300B34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300D44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300D44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300E88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300E88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84300FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84300FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843010EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843010EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430123C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430123C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430128C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430128C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843013E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843013E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301430.s") -void func_84301A24(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301B00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301B00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301BEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301BEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301CBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301CBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301DDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301DDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84301FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84301FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430203C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430203C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843020B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843020B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843020F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843020F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302128.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302128.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843021E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843021E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430245C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430245C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430255C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430255C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843025BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843025BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843029D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843029D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84302EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84302EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430305C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430305C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843031A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843031A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430334C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430334C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843033E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843033E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843034D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843034D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303674.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303674.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843037CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843037CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303A48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303A48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303BB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303BB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303D50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303D50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84303ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84303ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304114.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304114.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843043FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843043FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843045DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843045DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843046BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843046BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304834.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304834.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843048C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843048C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843049FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843049FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84304F54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84304F54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430506C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430506C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843052C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843052C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843054F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843054F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843055E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843055E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843056DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843056DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843056E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843056E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843058A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843058A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843058C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843058C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843059C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843059C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305CAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305CAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84305E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84305E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430602C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430602C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843060EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843060EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843061EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843061EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843062F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843062F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306584.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306584.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843065C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843065C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430663C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430663C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843066E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843066E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306914.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306914.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306BC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306BC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306C1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306C1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306DA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306DA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84306FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84306FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843071B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843071B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430732C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430732C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307394.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307394.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430741C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430741C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430742C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430742C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430743C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430743C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430744C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430744C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430745C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430745C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430746C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430746C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430748C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430748C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843074A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843074A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843074EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843074EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843074F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843074F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430751C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430751C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430753C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430753C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430754C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430754C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843075D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843075D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843077B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843077B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843078F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843078F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843079C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843079C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307A50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307A50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307C5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307C5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307DE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307DE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307F00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307F00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84307FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84307FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430808C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430808C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308190.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308190.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843081F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843081F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843083A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843083A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843085C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843085C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843085E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843085E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843085F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843085F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430862C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430862C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843087F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843087F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430897C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430897C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843089DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843089DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843089F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843089F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843089FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843089FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308A4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308A4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308BD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308BD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308D54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308D54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308D90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308D90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308ED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308ED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84308F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84308F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430920C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430920C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843092B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843092B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309328.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309328.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843093F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843093F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843095A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843095A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843096EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843096EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309A24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309A24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84309FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84309FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A17C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A17C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A22C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A22C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A3E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A3E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A4E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A4E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A6AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A6AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A7BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A7BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430A8DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430A8DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AA18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AA18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AA84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AA84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AB00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AB00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430ABF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430ABF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AD10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AD10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AD7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AD7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430ADE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430ADE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AE90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AE90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AF08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AF08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430AF80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430AF80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B104.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B104.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B2AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B2AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B3C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B3C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B6F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B6F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B8FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B8FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430B968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430B968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BB0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BB0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BB24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BB24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BBE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BBE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BC44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BC44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BD9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BD9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BDB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BDB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BDBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BDBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BE08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BE08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BEC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BEC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430BFB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430BFB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C138.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C138.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C19C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C19C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C1E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C1E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C2A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C2A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C4F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C59C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C59C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C7B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C7B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C7E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C7E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C8A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C8A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430C97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430C97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CA4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CA4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CB3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CB3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CC84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CC84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CCC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CCC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CD0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CD0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CDAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CDAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430CE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430CE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D02C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D02C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D5BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D5BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D6D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D6D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D8C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D8C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430D9EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430D9EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DB58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DB58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DE20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DE20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DF60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DF60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430DFCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430DFCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E1CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E1CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E5AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E5AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E72C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E72C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430E8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430E8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EB1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EB1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EBA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EBA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430ED88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430ED88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EE50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EE50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430EF4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430EF4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F044.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F044.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F0C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F0C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F27C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F27C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F4AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F4AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F5F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F5F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430F8B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430F8B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FB20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FB20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FB68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FB68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FC28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FC28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8430FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8430FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310334.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310334.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310368.s") -void func_843109EC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843109EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843109F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843109F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84310FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84310FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843112C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843112C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843116D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843116D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843118A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843118A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311A38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311A38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84311F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84311F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843128A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843128A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843133B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843133B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843135B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843135B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431379C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431379C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84313A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84313A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431493C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431493C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84314B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84314B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84314B6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84314B6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84314F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84314F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431524C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431524C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431595C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431595C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315BC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315BC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84315FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84315FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843160C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843160C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843161F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843161F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843162E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843162E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843163C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843163C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84316610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84316610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84316640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84316640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843167D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843167D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431694C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431694C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84316A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84316A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431712C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431712C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843172A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843172A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317810.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317810.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431790C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431790C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843179F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843179F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317AA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317AA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84317EDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84317EDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843180AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843180AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843184E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843184E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843184FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843184FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84318514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84318514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84318640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84318640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84318CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84318CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843190A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843190A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843193F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843193F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319408.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843194A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843194A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431962C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431962C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843196A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843196A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843197A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843197A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319878.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319878.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843198EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843198EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431995C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431995C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319AE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319C58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319C58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84319F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84319F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A1C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A1C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A2C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A2C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A4C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A4C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A780.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A780.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A7B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A7B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A8B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A8B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A94C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A94C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431A9E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431A9E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AA3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AA3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AA78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AA78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AAAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AAAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AAFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AAFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AD20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AD20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AD68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AD68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431ADAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431ADAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431ADF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431ADF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AE7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AE7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AF58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AF58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AFB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AFB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AFD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AFD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431AFE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431AFE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B004.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B004.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B078.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B078.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B34C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B34C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B42C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B42C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B4C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B4C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431B858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431B858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BA5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BA5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BB24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BB24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BB80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BB80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BBDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BBDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BCA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BCA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BD10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BD10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BD18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BD18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431BD94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431BD94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C71C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C71C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431C8E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431C8E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CB54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CB54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CCFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CCFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CEF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CEF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431CFA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431CFA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D318.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D318.s") -void func_8431D5C8(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D5C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D5D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D5D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D764.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D764.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D7C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D7C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D7D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D7D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431D968.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431D968.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DA38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DA38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DC78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DC78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431DF98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431DF98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E118.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E118.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E1DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E1DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E368.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E4DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E4DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E63C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E63C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E7D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E7D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431E90C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431E90C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EBD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EBD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431ECEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431ECEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EE08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EE08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431EF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431EF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F420.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F420.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F680.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F680.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F7B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F7B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431F998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431F998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FAB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FAB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FC74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FC74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FCCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FCCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8431FFD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8431FFD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843200B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843200B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843202A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843202A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320400.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320400.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432056C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432056C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320658.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320658.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843206B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843206B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432079C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432079C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320864.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320864.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843208B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843208B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320C38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320C38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320CEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320CEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84320EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84320EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432103C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432103C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843210BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843210BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432113C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432113C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321A40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321A40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321AAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321AAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321B54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321B54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321D34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321D34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321F74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321F74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84321FB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84321FB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843221A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843221A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843223FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843223FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843224C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843224C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843226A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843226A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843226E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843226E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843229A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843229A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84322E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84322E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843230D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843230D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843233E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843233E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843234A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843234A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843234FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843234FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843235F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843235F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843239EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843239EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84323FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84323FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843248B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843248B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843249F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843249F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324A68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324A68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324C28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324C28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84324F1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84324F1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843251D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843251D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843255DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843255DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325724.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325724.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325CAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325CAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325CDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325CDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84325E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84325E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843261CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843261CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843266D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843266D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432691C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432691C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326CB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326CB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84326E84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84326E84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432734C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432734C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843275F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843275F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327B90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327B90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327D98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327D98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84327DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84327DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328990.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328990.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328B30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328B30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328BF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84328F2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84328F2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843290A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843290A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843292D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843292D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843293A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843293A8.s") -void func_843293B0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843293B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843293B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843293B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843294A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843294A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843295D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843295D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843296B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843296B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843297F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843297F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329DB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329DB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84329DFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84329DFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A2D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A2D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A41C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A41C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A4B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A4B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432A578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432A578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ABBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ABBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ADD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ADD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432AEE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432AEE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432AF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432AF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B0E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B0E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B13C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B13C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B1BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B1BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B38C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B38C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B4B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B4B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B4D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B4D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B4F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B4F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B588.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B588.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B5B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B5B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B704.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B704.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432B808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432B808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432BBC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432BBC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432BF88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432BF88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C0D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C0D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C14C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C14C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C1E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C1E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C3F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C3F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C4CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C4CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C6C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C6C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C714.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C714.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C748.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C748.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C7A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C7A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C80C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C80C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C86C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C86C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C8BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C8BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C958.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C958.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432C9C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432C9C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CA48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CA48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CAD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CAD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CB60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CB60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CB68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CB68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CBF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CBF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CC54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CC54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CD14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CD14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CDD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CDD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CE00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CE00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CE3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CE3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CEF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CEF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CF74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CF74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432CFCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432CFCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D0D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D0D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D150.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D150.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D178.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D178.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D4F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D4F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D55C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D55C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D594.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D594.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D5B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D5B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D61C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D61C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D6B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D6B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D6C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D6C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D76C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D76C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432D9BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432D9BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DA64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DA64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DAB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DAB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DAEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DAEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432DE0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432DE0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E0A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E0A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E200.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E200.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E30C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E30C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E4B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E4B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E5A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E5A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E68C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E68C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E6B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E6B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E8B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E8B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E8BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E8BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E8EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E8EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E99C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E99C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E9AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E9AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E9B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E9B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432E9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432E9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EA60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EA60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EC28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EC28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ECA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ECA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ED0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ED0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432ED74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432ED74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EDE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EDE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EE5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EE5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EF40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EF40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432EFB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432EFB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F028.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F028.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F104.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F104.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F1E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F1E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F2C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F2C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F3C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F3C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F440.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F440.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F4BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F4BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F5B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F5B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F6B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F6B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F7A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F7A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F818.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F818.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F93C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F93C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432F9CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432F9CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FA0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FA0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FA30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FA30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FA54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FA54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FB38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FB38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FBBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FBBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FCB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FCB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FCF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FCF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FDF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FDF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FE24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FE24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FE44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FE44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FEC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FEC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FEEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FEEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8432FF8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8432FF8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843300B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843300B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433010C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433010C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330218.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330218.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330300.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330300.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843304AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843304AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433079C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433079C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330B18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330B18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330C70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330C70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330D64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330D64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84330F4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84330F4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843310A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843310A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843311D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843311D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331314.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331314.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433157C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433157C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843316A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843316A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843317D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843317D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843318F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843318F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331A1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331A1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331C34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331C34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331D60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331D60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331DA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331DA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331EAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331EAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84331FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84331FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843320A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843320A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843321BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843321BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433227C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433227C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843322C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843322C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433237C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433237C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843323BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843323BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843324A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843324A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843324EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843324EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843325C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843325C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843326EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843326EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843327B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843327B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843328A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843328A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332964.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332964.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332AD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332AD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332BA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332BA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332CD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332CD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332D68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332D68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332F90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332F90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84332FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84332FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843330A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843330A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333130.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333130.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333210.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333210.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843332B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843332B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843334DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843334DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433378C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433378C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333884.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333884.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333928.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333928.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333E28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333E28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84333FBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84333FBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843340B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843340B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843343F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843343F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843344A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843344A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843345A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843345A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843346BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843346BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843347A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843347A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843348DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843348DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334A78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334A78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334E4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334E4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84334F84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84334F84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433507C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433507C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843351C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843351C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843352AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843352AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843353C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843353C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843354E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843354E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433574C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433574C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433595C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433595C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335A84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335A84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335BA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335D10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335D10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84335EF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84335EF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433617C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433617C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336360.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336360.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433661C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433661C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433679C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433679C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843369AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843369AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336A58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336A58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336DD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336DD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84336EE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84336EE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843371C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843371C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843372D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843372D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843374A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843374A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843375B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843375B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433766C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433766C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843378D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843378D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84337F6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84337F6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843380B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843380B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843380F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843380F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433837C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433837C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843386B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843386B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338778.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338778.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843388A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843388A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338AC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338AC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338B44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338B44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84338FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84338FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433903C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433903C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843390E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843390E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433913C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433913C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339398.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339398.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843393E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843393E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843394D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843394D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433958C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433958C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339688.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339688.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339710.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339710.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843397A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843397A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339874.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339874.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843398F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843398F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339B20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339B20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339C0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339C0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339CDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339CDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339E38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339E38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339ECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339ECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84339F8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84339F8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A024.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A024.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A0E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A0E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A378.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A378.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A4D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A4D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A5C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A5C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433A954.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433A954.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AA28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AA28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AB08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AB08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AC00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AC00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433ADE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433ADE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433AF20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433AF20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B120.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B120.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B290.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B290.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B2E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B2E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B3D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B3D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B4AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B4AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B58C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B58C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B6FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B6FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B7E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B7E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433B988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433B988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BB78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BB78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BC38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BC38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BD08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BD08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BDFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BDFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433BF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433BF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C06C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C06C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C284.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C284.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C3A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C3A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C784.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C784.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433C940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433C940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CAFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CAFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CCFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CCFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CDAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CDAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CEA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CEA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CEFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CEFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433CFA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433CFA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D308.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D308.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D3B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D3B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D604.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D604.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D6EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D6EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433D90C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433D90C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DA54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DA54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DAF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DAF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DBDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DBDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DC80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DC80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DECC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DECC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433DFF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433DFF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E33C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E33C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E46C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E46C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E524.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E524.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E8A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E8A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433E950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433E950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EA04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EA04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EB0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EB0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EB9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EB9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433ED3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433ED3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433EE10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433EE10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F06C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F06C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F208.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F208.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F414.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F414.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F4CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F4CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F5B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F5B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F5D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F5D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433F974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433F974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FAF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FAF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FD30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FD30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FD80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FD80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FDC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FDC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FE80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FE80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8433FF44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8433FF44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843400BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843400BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434016C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434016C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843403D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843403D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340690.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340690.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340D14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340D14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340DC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340DC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84340E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84340E40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843416B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843416B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434171C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434171C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434174C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434174C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843417AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843417AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843418C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843418C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84341F44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84341F44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434234C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434234C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843423C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843423C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434261C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434261C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342908.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342908.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342980.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342980.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84342D48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84342D48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843431B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843431B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843432E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843432E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343988.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343988.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343D24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343D24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343D6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343D6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84343FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84343FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344050.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344050.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434411C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434411C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843441F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843441F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344318.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344318.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843443E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843443E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434459C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434459C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843445E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843445E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344698.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344698.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344734.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344734.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843448D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843448D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434495C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434495C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344A4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344A4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344BDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344BDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344CE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344CE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344DA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344DA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344E20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344E20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84344F58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84344F58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843450B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843450B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434523C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434523C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843452F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843452F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345338.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434539C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434539C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843453E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843453E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843456DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843456DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434575C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434575C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843459A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843459A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345B28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345B28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345B84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345B84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345CF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345CF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345E3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345E3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345EC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345EC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84345F38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84345F38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434605C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434605C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843460EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843460EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843461D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843461D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843463C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843463C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346488.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346488.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434669C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434669C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843466EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843466EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843467B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843467B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843467F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843467F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346960.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346960.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843469A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843469A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346BE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346BE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346DC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346DC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346E50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346E50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346EEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346EEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84346F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84346F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434719C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434719C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434729C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434729C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843473BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843473BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434749C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434749C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843476D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843476D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434775C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434775C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843477F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843477F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347904.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347A20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347A20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347BF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347BF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347D2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347D2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84347E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84347E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843482D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843482D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843483D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843483D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348514.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348514.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348630.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348630.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843489FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843489FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348C6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348C6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348D4C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348D4C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84348F24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84348F24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843490A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843490A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349108.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349108.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434915C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434915C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434917C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434917C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843491D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843491D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843492AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843492AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434933C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434933C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843494AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843494AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349504.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349504.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843495F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843495F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434967C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434967C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843497A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843497A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349830.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349830.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843498D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843498D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349A14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349A14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349A70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349A70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349AE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349C74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349C74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349D10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349D10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349F80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349F80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84349FC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84349FC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A18C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A18C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A1D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A1D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A2B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A2B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A324.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A324.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A574.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A574.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A6D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A6D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A7DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A7DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A930.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A930.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A9CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A9CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434A9EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434A9EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AA6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AA6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AAEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AAEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AC44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AC44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AC8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AC8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ACEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ACEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AD1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AD1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AD70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AD70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434AE68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434AE68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B0D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B0D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B14C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B14C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B21C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B21C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434B2B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434B2B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BA28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BA28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BA70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BA70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BCD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BCD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434BF2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434BF2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C070.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C070.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C0C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C0C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C214.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C214.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C29C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C29C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C320.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C320.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C3A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C3A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C3F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C3F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C548.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C548.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C590.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C590.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C5F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C5F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C618.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C618.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434C814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434C814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CA48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CA48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CA90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CA90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CAD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CAD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CC68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CC68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CE14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CE14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434CF64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434CF64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D0F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D0F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D1B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D1B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D2E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D2E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D4A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D4A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D5EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D5EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D6C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D72C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D72C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D77C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D77C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D8D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D8D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434D9F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434D9F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DA94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DA94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DB40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DB40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DD08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DD08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DE24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DE24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DE6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DE6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434DFC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434DFC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E02C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E02C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E0CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E0CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E1B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E1B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E21C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E21C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E6AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E6AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E6F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E6F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E74C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E74C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E7CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E7CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E8E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E8E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434E9A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434E9A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EA10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EA10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EBA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EBA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EC08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EC08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EC68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EC68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ECF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ECF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ED48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ED48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434ED70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434ED70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EEA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EEA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EF68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EF68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434EFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434EFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F0B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F0B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F248.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F248.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F3E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F3E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F554.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F554.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F610.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F610.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434F888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434F888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FA98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FA98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FB3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FB3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FBE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FBE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FCC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FCC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FD6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FD6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FE58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FE58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8434FF40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8434FF40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435000C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435000C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350100.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350100.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843501CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843501CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435043C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435043C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350520.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350520.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350828.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350828.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843508F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843508F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350A04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350A04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350AFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350AFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350CD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350CD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350EC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350EC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84350FC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84350FC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351144.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351144.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351264.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351264.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843512AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843512AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843513F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843513F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843514B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843514B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843515C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843515C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843516A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843516A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351BCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351BCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351CE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351CE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351D20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351D20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84351D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84351D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435226C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435226C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435235C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435235C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843526A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843526A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843529D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843529D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352A8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84352F90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84352F90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353098.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435324C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435324C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843532B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843532B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843534BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843534BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843535F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843535F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435375C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435375C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353998.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353998.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353BD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353BD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353D30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353D30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353E10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353E10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84353F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84353F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843540FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843540FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354BE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354BE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354D58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354D58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354E44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354E44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84354FA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84354FA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355240.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355240.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843553BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843553BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355500.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355500.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355584.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355584.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355794.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355794.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435581C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435581C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435586C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435586C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435593C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435593C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355B08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355B08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355B8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355B8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355C54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355C54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355D70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355D70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355E58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355E58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355EF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355EF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84355F88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84355F88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843560B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843560B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843561A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843561A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843561F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843561F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356254.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356254.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435643C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435643C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843565DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843565DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843566F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843566F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435674C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435674C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843567F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843567F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843568C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843568C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843569A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843569A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356A74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356A74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356AC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356AC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356AF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356EF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356EF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84356FAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84356FAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435727C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435727C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435742C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435742C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843574FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843574FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435783C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435783C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843579C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843579C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357A64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357A64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357AE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357B80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357B80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357BA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357BA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357CC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357CC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84357F64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84357F64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358034.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435811C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435811C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843581FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843581FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435839C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435839C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843584C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843584C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843588D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843588D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358DE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358DE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358EA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358EA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358EDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358EDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358F6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358F6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84358FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84358FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359000.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359000.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843590E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843590E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843592E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843592E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359330.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359330.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359338.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359338.s") -void func_84359340(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359348.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359348.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843593F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843593F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359470.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359470.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359490.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359490.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359650.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359650.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843596DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843596DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843596FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843596FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843597AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843597AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843597CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843597CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359820.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359820.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435989C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435989C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843598BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843598BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359910.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359910.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435998C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435998C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843599AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843599AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359A00.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359A00.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359A6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359A6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359A8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359A8C.s") -void func_84359AE0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359AE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AE8.s") -void func_84359AF0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359AF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359AF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359C84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359C84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359CB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359CB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359D7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359D7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359DF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359DF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359E14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359E14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359E68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359E68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84359FE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84359FE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A0D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A0D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A298.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A298.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A2CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A2CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A33C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A33C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A390.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A390.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A40C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A40C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A42C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A42C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A4F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A4F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A518.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A518.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A56C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A56C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A6F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A6F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A72C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A72C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A79C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A79C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A7F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A7F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A81C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A81C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A99C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A99C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435A9F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435A9F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AA1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AA1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AB9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AB9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ABF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ABF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AC94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AC94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ACC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ACC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ACE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ACE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AD38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AD38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AD68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AD68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AD88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AD88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435ADDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435ADDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435AE08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435AE08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B048.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B048.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B0B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B0B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B0DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B0DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B2C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B2C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B408.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B408.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B454.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B454.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B4A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B4A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B5B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B5B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B600.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B600.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B918.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B918.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B938.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B938.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435B98C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435B98C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BB64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BB64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BB98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BB98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BC40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BC40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BED8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BED8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BF08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BF08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BF28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BF28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435BF7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435BF7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C220.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C220.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C250.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C250.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C2C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C2C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C498.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C498.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C4EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C4EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C96C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C96C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435C9AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435C9AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CA08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CA08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CA70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CA70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CAA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CAA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435CAE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435CAE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D1E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D1E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D24C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D24C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D8C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D8C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435D97C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435D97C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435DB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435DB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435DED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435DED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435E158.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435E158.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435E530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435E530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435EB9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435EB9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435EDF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435EDF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435EE78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435EE78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435FB90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435FB90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435FCD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435FCD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8435FD50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8435FD50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436032C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436032C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843605C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843605C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843606D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843606D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436090C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436090C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84360B10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84360B10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84360EFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84360EFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843612F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843612F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843616B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843616B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84361744.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84361744.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84361FB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84361FB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84362084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84362084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843638E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843638E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84363A5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84363A5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84363FF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84363FF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843640A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843640A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843648E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843648E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84364C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84364C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843651D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843651D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365288.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365288.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365558.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365558.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84365B88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84365B88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436611C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436611C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843661D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843661D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436643C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436643C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366DCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366DCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84366E54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84366E54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367014.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367014.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843670C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843670C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367660.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367660.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367CB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367CB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84367E2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84367E2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843684CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843684CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368AB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368AB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368C04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368C04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368E78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368E78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84368F08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84368F08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843692E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843692E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369388.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369388.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843697F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843697F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369BF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369BF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369C80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369C80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369F0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369F0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84369FA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84369FA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A540.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A540.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A808.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A808.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436A890.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436A890.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436ABA8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436ABA8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436AC44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436AC44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B270.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B270.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B5C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B5C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B8D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B8D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436B974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436B974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436BE70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436BE70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436BFB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436BFB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C344.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C344.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C3CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C3CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C62C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C62C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436C6A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436C6A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436CB60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436CB60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436CE34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436CE34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436D370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436D370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436D4A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436D4A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436D920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436D920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DA38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DA38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DAC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DAC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DE60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DE60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436DFB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436DFB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E0E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E0E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E3BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E3BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436E944.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436E944.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EA0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EA0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EB54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EB54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436ECB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436ECB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EDE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EDE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EED4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EED4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EEE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EEE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EEF0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EEF0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EF48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EF48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EF54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EF54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436EFE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436EFE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F664.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F664.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F6C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F6C0.s") -void func_8436F6D0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F6D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F6D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F6D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F788.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F788.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F838.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F838.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436F9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436F9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FA80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FA80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FC7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FC7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FD54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FD54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FD9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FD9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FDBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FDBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8436FDF4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8436FDF4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370090.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370090.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843700F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843700F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370260.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370260.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843703BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843703BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843706E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843706E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843708A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843708A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843708CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843708CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370B44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370B44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370B7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370B7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370E30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370E30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370E80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370E80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84370F40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84370F40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371010.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371010.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371080.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371080.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437114C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437114C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843712CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843712CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843714D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843714D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371564.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371564.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843715C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843715C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437166C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437166C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437176C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437176C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843718E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843718E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371B3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371B3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84371DCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84371DCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372670.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372670.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84372ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84372ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373018.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373018.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373160.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373160.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843732B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843732B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437345C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437345C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373570.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373570.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843736B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843736B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373754.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373754.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373A30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373A30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373D04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373D04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373E24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373E24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84373E60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84373E60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843741C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843741C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843744F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843744F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437483C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437483C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374C9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374C9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374D58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374D58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374E08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374E08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84374FD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84374FD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375038.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375038.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843751F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843751F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843752C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843752C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375384.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375384.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375508.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375508.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843755E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843755E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375894.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375894.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843759C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843759C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843759DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843759DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843759F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843759F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375B1C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375B1C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375C60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375C60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375D78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375D78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375DA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375DA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84375E6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84375E6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437600C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437600C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376258.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376258.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843765E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843765E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437670C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437670C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376768.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376768.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376790.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376790.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843767E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843767E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843768D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843768D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376B38.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376B38.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376B9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376B9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376C90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376C90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376E40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376E40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84376F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84376F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377030.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377030.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437717C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437717C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843772E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843772E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437731C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437731C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437738C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437738C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377550.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377550.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377644.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377644.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843776FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843776FC.s") -void func_843779C0(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843779C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843779C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843779C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84377FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84377FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843780FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843780FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378140.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378140.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437828C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437828C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843783CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843783CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437865C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437865C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843787F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843787F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84378B0C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84378B0C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843791AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843791AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843791E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843791E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84379224.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84379224.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843793E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843793E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843794CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843794CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437AC20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437AC20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437ACB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437ACB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437AEA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437AEA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437B0CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437B0CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E3B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E3B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E448.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E448.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E7A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E7A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E860.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E860.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E920.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E920.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437E974.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437E974.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437ECFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437ECFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437ED54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437ED54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437EDB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437EDB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437EFBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437EFBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437F068.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437F068.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437F2EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437F2EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437F85C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437F85C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FB14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FB14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FC10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FC10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FCCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FCCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8437FD74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8437FD74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380164.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380164.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843804F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843804F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380598.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380598.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380EB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380EB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84380F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84380F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843811D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843811D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843813D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843813D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381584.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381584.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381BD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381BD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381C78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381C78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381DD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84381F50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84381F50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843820B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843820B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438220C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438220C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438223C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438223C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438249C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438249C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438255C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438255C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843825D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843825D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382840.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382840.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84382ACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84382ACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843831A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843831A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_8438363C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_8438363C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84383B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84383B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_84384124.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_84384124.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/62/fragment62/func_843841C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/62/fragment62/func_843841C4.s") diff --git a/src/fragments/63/fragment63.c b/src/fragments/63/fragment63.c index 0cd282e..5c1d013 100644 --- a/src/fragments/63/fragment63.c +++ b/src/fragments/63/fragment63.c @@ -1,409 +1,409 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B000F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B000F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B001D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B001D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00280.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00280.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0037C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0037C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B003D4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B003D4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00404.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00404.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00478.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00478.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B004C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B004C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0053C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0053C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B00D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B00D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0117C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0117C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B014DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B014DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01538.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01538.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01578.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01578.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B016F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B016F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0174C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0174C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B017AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B017AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01994.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01994.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01AA0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01AA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01B40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01B40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01C2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01C2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01DBC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01DBC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B01F94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B01F94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0204C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0204C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02188.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02188.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B021FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B021FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B022A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B022A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B023C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B023C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B025D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B025D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02654.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02654.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02DF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02DF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02E5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02E5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B02F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B02F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B033E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B033E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0345C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0345C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B038F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B038F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03B58.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03B58.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03C20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03C20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03CC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03CC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03D74.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03D74.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B03F10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B03F10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B040AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B040AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04628.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04628.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04798.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04798.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0492C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0492C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04A7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04A7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04AE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04AE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04B5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04B5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04CCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04CCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04DB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04DB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04E94.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04E94.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B04F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B04F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0509C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0509C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B050AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B050AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0535C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0535C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B053F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B053F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B055B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B055B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05668.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05668.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05728.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05728.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05760.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05760.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05844.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05844.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05A2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05A2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05B04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05B04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05CE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05CE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05DD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05DD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05E64.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05E64.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05F18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05F18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B05FCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B05FCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06204.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06204.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B062E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B062E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06364.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06364.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B064FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B064FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B067B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B067B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06A54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06A54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06B50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06B50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06E08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06E08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06ED0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06ED0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B06F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B06F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07058.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07058.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B070EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B070EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B071C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B071C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07294.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07294.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B073D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B073D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07428.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07428.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07758.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07758.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07848.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07848.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07978.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07978.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07AB8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07AB8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07CF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07CF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07EB0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07EB0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B07F78.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B07F78.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B080F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B080F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08230.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08230.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B083D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B083D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0852C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0852C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08694.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08694.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08858.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08858.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08954.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08954.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08BFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08BFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08D54.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08D54.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B08F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B08F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B091A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B091A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09268.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09268.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09354.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09354.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09444.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09444.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0962C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0962C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09720.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09720.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B099D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B099D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B09F60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B09F60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A18C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A18C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A1F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A1F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A244.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A244.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A36C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A36C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A544.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A544.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A634.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A634.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A738.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A738.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A82C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A82C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0A9D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0A9D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AC60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AC60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AD48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AD48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AE30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AE30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0AF48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0AF48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B05C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B05C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B228.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B228.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B6EC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B6EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B7F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B7F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0B984.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0B984.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BBEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BBEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BC6C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BC6C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BDCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BDCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BE28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BE28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BF10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BF10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0BFE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0BFE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C174.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C174.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C278.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C278.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C3A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C3A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C45C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C45C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C534.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C534.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C5E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C5E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C6B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C6B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0C7D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0C7D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CA34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CA34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CBCC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CBCC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CC7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CC7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CCFC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CCFC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0CDEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0CDEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D194.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D194.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D31C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D31C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D3E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D3E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D4B4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D4B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D54C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D54C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D7A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D7A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D870.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D870.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D878.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D878.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D8F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D8F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D970.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D970.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0D9D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0D9D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DA90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DA90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DAA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DAA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DB30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DB30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DD5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DD5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DE04.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DE04.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0DF70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0DF70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E198.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E198.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E2D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E2D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E50C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E50C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0E948.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0E948.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0EC18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0EC18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0ECE8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0ECE8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0EF14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0EF14.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F464.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F464.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F6C4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F6C4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F888.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F888.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F8BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F8BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F8E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F8E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0F950.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0F950.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0FACC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0FACC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/63/fragment63/func_84B0FADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/63/fragment63/func_84B0FADC.s") diff --git a/src/fragments/64/fragment64.c b/src/fragments/64/fragment64.c index 9170099..636aaa7 100644 --- a/src/fragments/64/fragment64.c +++ b/src/fragments/64/fragment64.c @@ -1,73 +1,73 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800458.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800458.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800530.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800530.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480067C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480067C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848007B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848007B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848009E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848009E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800C18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800C18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800C68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800C68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800CA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800CA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84800D08.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84800D08.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848012A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848012A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84801340.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84801340.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848015F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848015F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84801800.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84801800.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84801A88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84801A88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480218C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480218C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480225C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480225C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802350.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802350.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802430.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802430.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480247C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480247C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848025A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848025A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802740.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802740.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_848027F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_848027F0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_8480290C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_8480290C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802A44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802A44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802A90.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802A90.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802C40.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802C40.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802D84.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802D84.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802DC8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802DC8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802E18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802E18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84802F7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84802F7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84803110.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84803110.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/64/fragment64/func_84803368.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/64/fragment64/func_84803368.s") diff --git a/src/fragments/65/fragment65.c b/src/fragments/65/fragment65.c index 97015af..3ce294c 100644 --- a/src/fragments/65/fragment65.c +++ b/src/fragments/65/fragment65.c @@ -1,47 +1,47 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A003BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A003BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00638.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00638.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A008A8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A008A8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00B44.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00B44.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00E98.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00E98.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A00FEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A00FEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A012B8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A012B8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01424.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01424.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01BAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01BAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01DAC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01DAC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A01EE0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A01EE0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02074.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02074.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A0207C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A0207C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02304.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02304.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02410.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02410.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02580.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02580.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02898.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02898.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02A34.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02A34.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02B70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02B70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/65/fragment65/func_84A02D14.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/65/fragment65/func_84A02D14.s") diff --git a/src/fragments/66/fragment66.c b/src/fragments/66/fragment66.c index be17e27..8e528ba 100644 --- a/src/fragments/66/fragment66.c +++ b/src/fragments/66/fragment66.c @@ -1,59 +1,59 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200064.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200064.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832000A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832000A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200148.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200148.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320029C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320029C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320037C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320037C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832003AC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832003AC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200468.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200468.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320058C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320058C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832005E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832005E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200684.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200684.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200700.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200700.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832007A4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832007A4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320084C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320084C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200934.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200934.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200ADC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200ADC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200CD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200CD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83200FF8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83200FF8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832010BC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832010BC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320118C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320118C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_8320126C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_8320126C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832016F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832016F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_832018DC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_832018DC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201A18.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201A18.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201B60.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201B60.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201BD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201BD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201C8C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201C8C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/66/fragment66/func_83201DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/66/fragment66/func_83201DD4.s") diff --git a/src/fragments/67/fragment67.c b/src/fragments/67/fragment67.c index 751562d..143b51b 100644 --- a/src/fragments/67/fragment67.c +++ b/src/fragments/67/fragment67.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/67/fragment67/func_8F000020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/67/fragment67/func_8F000020.s") diff --git a/src/fragments/68/fragment68.c b/src/fragments/68/fragment68.c index 76ff4cc..c421f1b 100644 --- a/src/fragments/68/fragment68.c +++ b/src/fragments/68/fragment68.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/68/fragment68/func_8F100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/68/fragment68/func_8F100020.s") diff --git a/src/fragments/69/fragment69.c b/src/fragments/69/fragment69.c index b7db25c..26d098c 100644 --- a/src/fragments/69/fragment69.c +++ b/src/fragments/69/fragment69.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/69/fragment69/func_8F200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/69/fragment69/func_8F200020.s") diff --git a/src/fragments/7/fragment7.c b/src/fragments/7/fragment7.c index 6641dca..2c269fc 100644 --- a/src/fragments/7/fragment7.c +++ b/src/fragments/7/fragment7.c @@ -1,115 +1,115 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100040.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100040.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100060.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100060.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100084.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100084.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100170.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100170.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100480.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100480.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100798.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100798.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100A80.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100A80.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100AEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100AEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100B48.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100B48.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86100C30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86100C30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101434.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101434.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101560.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101560.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101718.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101718.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861017E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861017E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610197C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610197C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101BB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101BB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101D3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101D3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101DD4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101DD4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101E70.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101E70.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101F20.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101F20.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101F88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101F88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86101FD0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86101FD0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102088.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102088.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861020E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861020E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102134.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102134.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102184.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102184.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610228C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610228C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102370.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861023E4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861023E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102460.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102460.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102614.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102614.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610268C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610268C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102750.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102750.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861029E0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861029E0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102A10.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102A10.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102B2C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102B2C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102C24.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102C24.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102CC0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102CC0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102F30.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102F30.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86102FDC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86102FDC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861032D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861032D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103374.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103374.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103450.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103450.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103474.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_861035B0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_861035B0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103868.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103868.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103AB4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103AB4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103D28.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103D28.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103D88.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103D88.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103DEC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103DEC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86103E9C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86103E9C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_8610426C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_8610426C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86104380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86104380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/7/fragment7/func_86104474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/7/fragment7/func_86104474.s") diff --git a/src/fragments/70/fragment70.c b/src/fragments/70/fragment70.c index 7730bec..52cecd7 100644 --- a/src/fragments/70/fragment70.c +++ b/src/fragments/70/fragment70.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/70/fragment70/func_8F300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/70/fragment70/func_8F300020.s") diff --git a/src/fragments/71/fragment71.c b/src/fragments/71/fragment71.c index ae3a9dc..5107b30 100644 --- a/src/fragments/71/fragment71.c +++ b/src/fragments/71/fragment71.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/71/fragment71/func_8F400020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/71/fragment71/func_8F400020.s") diff --git a/src/fragments/72/fragment72.c b/src/fragments/72/fragment72.c index d4fd9c8..cb55caa 100644 --- a/src/fragments/72/fragment72.c +++ b/src/fragments/72/fragment72.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/72/fragment72/func_8F500020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/72/fragment72/func_8F500020.s") diff --git a/src/fragments/73/fragment73.c b/src/fragments/73/fragment73.c index d797202..c92bf1c 100644 --- a/src/fragments/73/fragment73.c +++ b/src/fragments/73/fragment73.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/73/fragment73/func_8F600020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/73/fragment73/func_8F600020.s") diff --git a/src/fragments/74/fragment74.c b/src/fragments/74/fragment74.c index a9a7a0f..cf0b6ed 100644 --- a/src/fragments/74/fragment74.c +++ b/src/fragments/74/fragment74.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/74/fragment74/func_8F700020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/74/fragment74/func_8F700020.s") diff --git a/src/fragments/75/fragment75.c b/src/fragments/75/fragment75.c index d5293c9..bd65228 100644 --- a/src/fragments/75/fragment75.c +++ b/src/fragments/75/fragment75.c @@ -1,9 +1,9 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA00020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA0047C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA0047C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA00510.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA00510.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/75/fragment75/func_8FA0051C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/75/fragment75/func_8FA0051C.s") diff --git a/src/fragments/76/fragment76.c b/src/fragments/76/fragment76.c index 6c33574..22d2290 100644 --- a/src/fragments/76/fragment76.c +++ b/src/fragments/76/fragment76.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/76/fragment76/func_8FB00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/76/fragment76/func_8FB00020.s") diff --git a/src/fragments/77/fragment77.c b/src/fragments/77/fragment77.c index b36aed7..8871126 100644 --- a/src/fragments/77/fragment77.c +++ b/src/fragments/77/fragment77.c @@ -1,3 +1,3 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/77/fragment77/func_8FC00020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/77/fragment77/func_8FC00020.s") diff --git a/src/fragments/8/fragment8.c b/src/fragments/8/fragment8.c index 4f09447..f369b5b 100644 --- a/src/fragments/8/fragment8.c +++ b/src/fragments/8/fragment8.c @@ -1,60 +1,59 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200034.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200034.s") -void func_862002EC(void) { -} +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862002EC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862002F4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862002F4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862004D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862004D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200528.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200528.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200620.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200620.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200940.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200940.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86200EC4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86200EC4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862011E8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862011E8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862013C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862013C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862015A0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862015A0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862015C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862015C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201640.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201640.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201770.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201770.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201814.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201814.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201900.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201900.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86201CD8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86201CD8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862022CC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862022CC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862023F8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862023F8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202C7C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202C7C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202D5C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202D5C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202EE4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202EE4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202F3C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202F3C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86202FA4.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86202FA4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86203008.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86203008.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_862030D0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_862030D0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_86203380.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_86203380.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/8/fragment8/func_8620369C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/8/fragment8/func_8620369C.s") diff --git a/src/fragments/9/fragment9.c b/src/fragments/9/fragment9.c index dda921f..bf404f9 100644 --- a/src/fragments/9/fragment9.c +++ b/src/fragments/9/fragment9.c @@ -1,31 +1,31 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300020.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300020.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_8630011C.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_8630011C.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300154.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300154.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300238.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300238.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863006D8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863006D8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300764.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300764.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863008C0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863008C0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863009FC.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863009FC.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300C50.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300C50.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86300F68.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86300F68.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301094.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301094.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301168.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301168.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_863011C8.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_863011C8.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301234.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301234.s") -#pragma GLOBAL_ASM("asm/nonmatchings/fragments/9/fragment9/func_86301474.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/fragments/9/fragment9/func_86301474.s") diff --git a/src/libleo/leocmdex.c b/src/libleo/leocmdex.c index 54d759f..dec3007 100644 --- a/src/libleo/leocmdex.c +++ b/src/libleo/leocmdex.c @@ -7,7 +7,7 @@ extern u16 LEOrw_flags; // D_8007DA40 const u8 leo_sys_form_lbas[] = { 0, 1, 8, 9, 0, 0, 0, 0 }; // EXTRA 0 IS A HACK -#pragma GLOBAL_ASM("asm/nonmatchings/libleo/leocmdex/leomain.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/libleo/leocmdex/leomain.s") /*const LEOCmdRead leo_sys_read_cmd = { diff --git a/src/libultra/al/.clang-format b/src/libultra/al/.clang-format deleted file mode 100644 index 15f9b6f..0000000 --- a/src/libultra/al/.clang-format +++ /dev/null @@ -1,2 +0,0 @@ -DisableFormat: true -SortIncludes: Never \ No newline at end of file diff --git a/src/libultra/al/sl.c b/src/libultra/al/sl.c deleted file mode 100644 index 5f9a9dc..0000000 --- a/src/libultra/al/sl.c +++ /dev/null @@ -1,40 +0,0 @@ -#include - -extern ALGlobals* D_80079640; - -void alUnlink(ALLink *ln) -{ - if (ln->next) { - ln->next->prev = ln->prev; - } - - if (ln->prev) { - ln->prev->next = ln->next; - } -} - -void alLink(ALLink *ln, ALLink *to) -{ - ln->next = to->next; - ln->prev = to; - - if (to->next) { - to->next->prev = ln; - } - - to->next = ln; -} - -void alClose(ALGlobals* glob) { - if (alGlobals != NULL) { - alSynDelete(&glob->drvr); - alGlobals = NULL; - } -} - -void alInit(ALGlobals* glob, ALSynConfig* c) { - if (alGlobals == NULL) { - alGlobals = glob; - alSynNew(&glob->drvr, c); - } -} diff --git a/src/libultra/gu/perspective.c b/src/libultra/gu/perspective.c deleted file mode 100644 index b7ce6a0..0000000 --- a/src/libultra/gu/perspective.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include "math.h" - -#define GU_PI 3.1415926 - -// todo, fix when pragma aliases this -extern float __cosf(float angle); - -void guPerspectiveF(f32 mf[4][4], u16* perspNorm, f32 fovy, f32 aspect, f32 near, f32 far, f32 scale) { - f32 yscale; - s32 row; - s32 col; - - guMtxIdentF(mf); - - fovy *= GU_PI / 180.0; - yscale = __cosf(fovy / 2) / sinf(fovy / 2); - mf[0][0] = yscale / aspect; - mf[1][1] = yscale; - mf[2][2] = (near + far) / (near - far); - mf[2][3] = -1; - mf[3][2] = 2 * near * far / (near - far); - mf[3][3] = 0.0f; - - for (row = 0; row < 4; row++) { - for (col = 0; col < 4; col++) { - mf[row][col] *= scale; - } - } - - if (perspNorm != NULL) { - if (near + far <= 2.0) { - *perspNorm = 65535; - } else { - *perspNorm = (f64)(1 << 17) / (near + far); - if (*perspNorm <= 0) { - *perspNorm = 1; - } - } - } -} -void guPerspective(Mtx* m, u16* perspNorm, f32 fovy, f32 aspect, f32 near, f32 far, f32 scale) { - f32 mf[4][4]; - - guPerspectiveF(mf, perspNorm, fovy, aspect, near, far, scale); - guMtxF2L((MtxF*)mf, m); -} diff --git a/src/libultra/gu/scale.c b/src/libultra/gu/scale.c deleted file mode 100644 index fdb838d..0000000 --- a/src/libultra/gu/scale.c +++ /dev/null @@ -1,20 +0,0 @@ -#include - -void guScaleF(float mf[4][4], float x, float y, float z) -{ - guMtxIdentF(mf); - - mf[0][0] = x; - mf[1][1] = y; - mf[2][2] = z; - mf[3][3] = 1; -} - -void guScale(Mtx *m, float x, float y, float z) -{ - f32 mf[4][4]; - - guScaleF(mf, x, y, z); - - guMtxF2L(mf, m); -} diff --git a/src/libultra/gu/sinf.c b/src/libultra/gu/sinf.c deleted file mode 100644 index 2c21848..0000000 --- a/src/libultra/gu/sinf.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include "libc/math.h" -#include "macros.h" - -#pragma weak sinf = __sinf - -// Coefficients of a degree 9 polynomial approximation of sine. It is not the Maclaurin polynamial, but some as-yet -// undetermined more uniform approximation. -static const du P[] = { - { 1.0 }, - { -0.16666659550427756 }, - { 0.008333066246082155 }, - { -0.0001980960290193795 }, - { 0.000002605780637968037 }, -}; - -static const du rpi = { 1 / 3.14159265358979323846 }; // 1/M_PI, "reciprocal of pi" - -// pihi + pilo is the closest double to pi, this representation allows more precise calculations since pi itself is not -// an exact float -static const du pihi = { 3.1415926218032837 }; - -static const du pilo = { 3.178650954705639E-8 }; - -static const fu zero = { 0x00000000 }; - -/** - * Returns the sine of a float as a float, using the Maclaurin series and shifting. - */ -f32 __sinf(f32 x) { - f64 dx; // x promoted to double - f64 xSq; // square of dx - f64 polyApprox; // Most of the polynomial approximation to sin(x) - f64 dn; // n promoted to double - s32 n; // number of multiples of pi away from the first half-period - f64 result; - s32 ix = *(s32*)&x; // Type-pun x into an s32, i.e. its IEEE-754 hex representation - s32 xpt = (ix >> 22); // Obtain the exponent of x (actually 2 * exponent + 127) - - xpt &= 0x1FF; // Remove the sign bit - - // |x| < 1 - if (xpt < 255) { - dx = x; - - // |x| > 2^{-12}: for x smaller in magnitude than this, sin(x) - x is too small for a float to register the - // error - if (xpt >= 230) { - xSq = SQ(dx); - polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; - - result = dx + (dx * xSq) * polyApprox; - return (f32)result; - } - return x; - } - - // |x| < 2^{28} (beyond this range, floats are too sparse to make the trig functions useable) - if (xpt < 310) { - dx = x; - dn = dx * rpi.d; - n = ROUND(dn); - dn = n; - - // Bring x to the first half-period where the Maclaurin polynomial can be used - dx -= dn * pihi.d; - dx -= dn * pilo.d; - - xSq = SQ(dx); - polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; - result = dx + (dx * xSq) * polyApprox; // Actual Maclaurin polynomial for sin(x) - - // add a minus sign if x is an odd number of multiples of pi away from the first half-period - if (n % 2 == 0) { - return (f32)result; - } - return -(f32)result; - } - - // if x is NaN - if (x != x) { - return __libm_qnan_f; - } - - return zero.f; -} diff --git a/src/libultra/gu/sqrtf.c b/src/libultra/gu/sqrtf.c deleted file mode 100644 index 7cfab9c..0000000 --- a/src/libultra/gu/sqrtf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#pragma intrinsic(sqrtf) - -#ifndef __GNUC__ -#define __builtin_sqrtf sqrtf -#endif - -f32 sqrtf(f32 f) { - return __builtin_sqrtf(f); -} diff --git a/src/libultra/io/aisetfreq.c b/src/libultra/io/aisetfreq.c deleted file mode 100644 index fbd899d..0000000 --- a/src/libultra/io/aisetfreq.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "PR/rcp.h" - -extern s32 osViClock; - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -s32 osAiSetFrequency(u32 frequency) { - register unsigned int dacRate; - register unsigned char bitRate; - register float f; - - f = osViClock / (float)frequency + .5f; - dacRate = f; - - if (dacRate < AI_MIN_DAC_RATE) { - return -1; - } - - bitRate = dacRate / 66; - - 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); - // IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); - return osViClock / (s32)dacRate; -} diff --git a/src/libultra/io/aisetnextbuf.c b/src/libultra/io/aisetnextbuf.c deleted file mode 100644 index d789133..0000000 --- a/src/libultra/io/aisetnextbuf.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "../os/osint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -s32 osAiSetNextBuffer(void *bufPtr, u32 size) { - static u8 hdwrBugFlag = FALSE; - char *bptr; - - bptr = bufPtr; - - if (hdwrBugFlag) { - bptr -= 0x2000; - } - - if ((((u32)bufPtr + size) & 0x1fff) == 0) { - hdwrBugFlag = TRUE; - } else { - hdwrBugFlag = FALSE; - } - - if (__osAiDeviceBusy()) { - return -1; - } - - IO_WRITE(AI_DRAM_ADDR_REG, osVirtualToPhysical(bptr)); - IO_WRITE(AI_LEN_REG, size); - return 0; -} diff --git a/src/libultra/io/cartrominit.c b/src/libultra/io/cartrominit.c deleted file mode 100644 index 35d6e38..0000000 --- a/src/libultra/io/cartrominit.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include "PR/os_internal.h" -#include "PR/R4300.h" -#include "PR/rcp.h" - -OSPiHandle __CartRomHandle; -OSPiHandle *osCartRomInit(void) -{ - u32 value; - u32 saveMask; - static int first = 1; - register u32 stat; - u32 latency; - u32 pulse; - u32 pageSize; - u32 relDuration; - - __osPiGetAccess(); - - if (!first) { - __osPiRelAccess(); - return &__CartRomHandle; - } - - first = 0; - __CartRomHandle.type = DEVICE_TYPE_CART; - __CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); - __CartRomHandle.domain = PI_DOMAIN1; - __CartRomHandle.speed = 0; - - bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo)); - - while (stat = IO_READ(PI_STATUS_REG), stat & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { - ; - } - - latency = IO_READ(PI_BSD_DOM1_LAT_REG); - pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); - relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); - pulse = IO_READ(PI_BSD_DOM1_PWD_REG); - - IO_WRITE(PI_BSD_DOM1_LAT_REG, 0xFF); - IO_WRITE(PI_BSD_DOM1_PGS_REG, 0); - IO_WRITE(PI_BSD_DOM1_RLS_REG, 3); - IO_WRITE(PI_BSD_DOM1_PWD_REG, 0xFF); - - value = IO_READ(__CartRomHandle.baseAddress); - __CartRomHandle.latency = value & 0xFF; - __CartRomHandle.pageSize = (value >> 0x10) & 0xF; - __CartRomHandle.relDuration = (value >> 0x14) & 0xF; - __CartRomHandle.pulse = (value >> 8) & 0xFF; - - IO_WRITE(PI_BSD_DOM1_LAT_REG, latency); - IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize); - IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration); - IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse); - - saveMask = __osDisableInt(); - __CartRomHandle.next = __osPiTable; - __osPiTable = &__CartRomHandle; - __osRestoreInt(saveMask); - __osPiRelAccess(); - - return &__CartRomHandle; -} diff --git a/src/libultra/io/conteeplongread.c b/src/libultra/io/conteeplongread.c deleted file mode 100644 index f7ca599..0000000 --- a/src/libultra/io/conteeplongread.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, int length) -{ - s32 ret; - ret = 0; - - while (length > 0) { - ERRCK(osEepromRead(mq, address, buffer)); - length -= EEPROM_BLOCK_SIZE; - address++; - buffer += EEPROM_BLOCK_SIZE; - } - - return ret; -} diff --git a/src/libultra/io/conteeplongwrite.c b/src/libultra/io/conteeplongwrite.c deleted file mode 100644 index 0124860..0000000 --- a/src/libultra/io/conteeplongwrite.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, int length) -{ - s32 ret; - ret = 0; - while (length > 0) - { - ERRCK(osEepromWrite(mq, address, buffer)); - length -= EEPROM_BLOCK_SIZE; - address++; - buffer += EEPROM_BLOCK_SIZE; - osSetTimer(&__osEepromTimer, 562500, 0, &__osEepromTimerQ, &__osEepromTimerMsg); - osRecvMesg(&__osEepromTimerQ, NULL, OS_MESG_BLOCK); - } - return ret; -} diff --git a/src/libultra/io/conteepprobe.c b/src/libultra/io/conteepprobe.c deleted file mode 100644 index 040fe47..0000000 --- a/src/libultra/io/conteepprobe.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -s32 osEepromProbe(OSMesgQueue *mq) -{ - s32 ret; - u16 type; - OSContStatus sdata; - ret = 0; - __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; - } - } - __osSiRelAccess(); - return ret; -} diff --git a/src/libultra/io/conteepread.c b/src/libultra/io/conteepread.c deleted file mode 100644 index b42b0b2..0000000 --- a/src/libultra/io/conteepread.c +++ /dev/null @@ -1,106 +0,0 @@ -#include -#include "PR/rcp.h" -#include "ultra64/controller.h" -#include "siint.h" - -void __osPackEepReadData(u8 address); -OSPifRam __osEepPifRam; - -#define CONT_RANGE_ERROR -1 - -s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) -{ - s32 ret; - int i; - u16 type; - u8 *ptr; - OSContStatus sdata; - __OSContEepromFormat eepromformat; - ret = 0; - i = 0; - ptr = (u8 *)&__osEepPifRam.ramarray; - __osSiGetAccess(); - ret = __osEepStatus(mq, &sdata); - - if (ret == 0) { - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - - switch (type) { - case CONT_EEPROM: - // @bug: Should be > EEPROM_MAXBLOCKS - if (address >= EEPROM_MAXBLOCKS) { - ret = -1; - } - break; - case CONT_EEPROM | CONT_EEP16K: - // @bug: Should be > EEP16K_MAXBLOCKS - if (address >= EEP16K_MAXBLOCKS) { - ret = -1; - } else { - // __osEepromRead16K support seems to have been removed from this particular - // revision. - //__osEepromRead16K = -1; - } - break; - default: - ret = CONT_NO_RESPONSE_ERROR; - } - } - - if (ret != 0) { - __osSiRelAccess(); - return ret; - } - - while (sdata.status & CONT_EEPROM_BUSY) { - __osEepStatus(mq, &sdata); - } - - __osPackEepReadData(address); - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); - __osContLastCmd = CONT_CMD_READ_EEPROM; - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - for (i = 0; i < 4; i++) { - 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; -} - -void __osPackEepReadData(u8 address) { - u8 *ptr = (u8 *)&__osEepPifRam.ramarray; - __OSContEepromFormat eepromformat; - int i; - - __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; - - for (i = 0; i < MAXCONTROLLERS; i++) { - *ptr++ = 0; - } - - *(__OSContEepromFormat *)(ptr) = eepromformat; - ptr += sizeof(__OSContEepromFormat); - ptr[0] = CONT_CMD_END; -} diff --git a/src/libultra/io/conteepwrite.c b/src/libultra/io/conteepwrite.c deleted file mode 100644 index 705f74d..0000000 --- a/src/libultra/io/conteepwrite.c +++ /dev/null @@ -1,157 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" -#include - -void __osPackEepWriteData(u8 address, u8 *buffer); - -s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) -{ - s32 ret; - u16 type; - u8 *ptr; - __OSContEepromFormat eepromformat; - OSContStatus sdata; - - ret = 0; - ptr = (u8 *)&__osEepPifRam.ramarray; - __osSiGetAccess(); - ret = __osEepStatus(mq, &sdata); - - type = sdata.type & (CONT_EEPROM | CONT_EEP16K); - - if (ret == 0) { - switch (type) { - case CONT_EEPROM: - // @bug: Should be > EEPROM_MAXBLOCKS - if (address >= EEPROM_MAXBLOCKS) { - ret = -1; - } - break; - case CONT_EEPROM | CONT_EEP16K: - // @bug: Should be > EEP16K_MAXBLOCKS - if (address >= EEP16K_MAXBLOCKS) { - ret = -1; - } - break; - default: - if (1); - ret = CONT_NO_RESPONSE_ERROR; - break; - } - } - - if (ret != 0) { - __osSiRelAccess(); - return ret; - } - - while (sdata.status & CONT_EEPROM_BUSY) { - __osEepStatus(mq, &sdata); - } - - __osPackEepWriteData(address, buffer); - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); - __osContLastCmd = CONT_CMD_WRITE_EEPROM; - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ptr += 4; - - eepromformat = *(__OSContEepromFormat *)ptr; - - ret = CHNL_ERR(eepromformat); - - __osSiRelAccess(); - return ret; -} - -void __osPackEepWriteData(u8 address, u8 *buffer) -{ - u8 *ptr; - __OSContEepromFormat eepromformat; - int i; - ptr = (u8 *)&__osEepPifRam.ramarray; - __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 < ARRLEN(eepromformat.data); i++) { - eepromformat.data[i] = *buffer++; - } - - for (i = 0; i < 4; i++) { - *ptr++ = 0; - } - - *(__OSContEepromFormat *)(ptr) = eepromformat; - ptr += sizeof(__OSContEepromFormat); - ptr[0] = CONT_CMD_END; -} - -s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) -{ - s32 ret; - int i; - u8 *ptr; - __OSContRequestFormat requestformat; - - ret = 0; - ptr = (u8 *)__osEepPifRam.ramarray; - - for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) { - __osEepPifRam.ramarray[i] = 0; - } - - __osEepPifRam.pifstatus = CONT_CMD_EXE; - ptr = (u8 *)__osEepPifRam.ramarray; - - for (i = 0; i < 4; i++) { - *ptr++ = 0; - } - - requestformat.dummy = CONT_CMD_NOP; - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = CONT_CMD_REQUEST_STATUS; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - requestformat.dummy1 = CONT_CMD_NOP; - *(__OSContRequestFormat *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormat); - *ptr = CONT_CMD_END; - - ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - __osContLastCmd = CONT_CMD_END; - ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - if (ret != 0) { - return ret; - } - - ptr = (u8 *)&__osEepPifRam; - - for (i = 0; i < 4; i++) { - *ptr++ = 0; - } - - requestformat = *(__OSContRequestFormat *)ptr; - data->errno = CHNL_ERR(requestformat); - data->type = (requestformat.typel << 8) | requestformat.typeh; - data->status = requestformat.status; - - if (data->errno != 0) { - return data->errno; - } - - return 0; -} diff --git a/src/libultra/io/contpfs.c b/src/libultra/io/contpfs.c deleted file mode 100644 index 39bbf33..0000000 --- a/src/libultra/io/contpfs.c +++ /dev/null @@ -1,315 +0,0 @@ -#include -#include "ultra64/controller.h" - -extern u8 __osPfsInodeCacheBank; -extern s32 __osPfsInodeCacheChannel; - -extern __OSInode __osPfsInodeCache; - -#define PFS_INODE_SIZE_PER_PAGE 128 - -u16 __osSumcalc(u8* ptr, s32 length) { - s32 i; - u32 sum = 0; - u8* temp = ptr; - - for (i = 0; i < length; i++) { - sum += *temp++; - } - return sum & 0xFFFF; -} - -s32 __osIdCheckSum(u16* ptr, u16* checkSum, u16* idSum) { - u16 data = 0; - u32 i; - - *checkSum = *idSum = 0; - for (i = 0; i < ((sizeof(__OSPackId) - sizeof(u32)) / sizeof(u8)); i += sizeof(u16)) { - data = *((u16*)((uintptr_t)ptr + i)); - *checkSum += data; - *idSum += ~data; - } - return 0; -} - -s32 __osRepairPackId(OSPfs* pfs, __OSPackId* badid, __OSPackId* newid) { - s32 ret = 0; - u8 temp[BLOCKSIZE]; - u8 comp[BLOCKSIZE]; - u8 mask = 0; - s32 i; - s32 j = 0; - u16 index[4]; - - newid->repaired = -1; - newid->random = osGetCount(); - newid->serial_mid = badid->serial_mid; - newid->serial_low = badid->serial_low; - - if ((pfs->activebank != 0) && ((ret = __osPfsSelectBank(pfs, 0)) != 0)) { - return ret; - } - - do { - if ((ret = __osPfsSelectBank(pfs, j)) != 0) { - return ret; - } - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, temp)) != 0) { - return ret; - } - temp[0] = j | 0x80; - for (i = 1; i < BLOCKSIZE; i++) { - temp[i] = ~temp[i]; - } - - if ((ret = __osContRamWrite(pfs->queue, pfs->channel, 0, temp, 0)) != 0) { - return ret; - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, comp)) != 0) { - return (ret); - } - for (i = 0; i < BLOCKSIZE; i++) { - if (comp[i] != temp[i]) { - break; - } - } - if (i != BLOCKSIZE) { - break; - } - - if (j > 0) { - if ((ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, 0, temp)) != 0) { - return ret; - } - if (temp[0] != 0x80) { - break; - } - } - - j++; - } while (j < PFS_MAX_BANKS); - - if ((pfs->activebank != 0) && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - mask = (j > 0) ? 1 : 0; - newid->deviceid = (badid->deviceid & 0xFFFE) | 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 < 4; i++) { - if ((ret = __osContRamWrite(pfs->queue, pfs->channel, index[i], (u8*)newid, PFS_FORCE)) != 0) { - return ret; - } - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - return ret; - } - for (i = 0; i < BLOCKSIZE; i++) { - if (temp[i] != ((u8*)newid)[i]) { - return PFS_ERR_DEVICE; - } - } - return 0; -} - -s32 __osCheckPackId(OSPfs* pfs, __OSPackId* check) { - u16 index[4]; - s32 ret = 0; - u16 sum; - u16 idSum; - s32 i; - s32 j; - - if (pfs->activebank != 0 && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - index[0] = PFS_ID_0AREA; - index[1] = PFS_ID_1AREA; - index[2] = PFS_ID_2AREA; - index[3] = PFS_ID_3AREA; - - for (i = 1; i < ARRAY_COUNT(index); i++) { - if ((ret = __osContRamRead(pfs->queue, pfs->channel, index[i], (u8*)check)) != 0) { - return ret; - } - __osIdCheckSum((u16*)check, &sum, &idSum); - if (check->checksum == sum && check->inverted_checksum == idSum) { - break; - } - } - if (i == ARRAY_COUNT(index)) { - return PFS_ERR_ID_FATAL; - } - - for (j = 0; j < ARRAY_COUNT(index); j++) { - if (j != i) { - if ((ret = __osContRamWrite(pfs->queue, pfs->channel, index[j], (u8*)check, PFS_FORCE)) != 0) { - return ret; - } - } - } - return 0; -} - -s32 __osGetId(OSPfs* pfs) { - u16 sum; - u16 isum; - u8 temp[BLOCKSIZE]; - __OSPackId* id; - __OSPackId newid; - s32 ret; - - if (pfs->activebank != 0 && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - return ret; - } - - __osIdCheckSum((u16*)temp, &sum, &isum); - id = (__OSPackId*)temp; - if (id->checksum != sum || id->inverted_checksum != isum) { - if ((ret = __osCheckPackId(pfs, id)) == PFS_ERR_ID_FATAL) { - ret = __osRepairPackId(pfs, id, &newid); - if (ret) { - return ret; - } - id = &newid; - } else if (ret != 0) { - return ret; - } - } - - if ((id->deviceid & 1) == 0) { - ret = __osRepairPackId(pfs, id, &newid); - if (ret) { - return ret; - } - id = &newid; - if ((id->deviceid & 1) == 0) { - return PFS_ERR_DEVICE; - } - } - - _bcopy(id, pfs->id, BLOCKSIZE); - - if (0) {} - - 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); - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_LABEL_AREA, pfs->label)) != 0) { - return ret; - } - - return 0; -} - -s32 __osCheckId(OSPfs* pfs) { - u8 temp[BLOCKSIZE]; - s32 ret; - - if (pfs->activebank != 0) { - ret = __osPfsSelectBank(pfs, 0); - if (ret == PFS_ERR_NEW_PACK) { - ret = __osPfsSelectBank(pfs, 0); - } - if (ret != 0) { - return ret; - } - } - - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - if (ret != PFS_ERR_NEW_PACK) { - return ret; - } - if ((ret = __osContRamRead(pfs->queue, pfs->channel, PFS_ID_0AREA, temp)) != 0) { - return ret; - } - } - - if (bcmp(pfs->id, temp, BLOCKSIZE) != 0) { - return PFS_ERR_NEW_PACK; - } - - return 0; -} - -s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank) { - u8 sum; - s32 j; - s32 ret; - s32 offset; - u8* addr; - - if (flag == PFS_READ && bank == __osPfsInodeCacheBank && (pfs->channel == __osPfsInodeCacheChannel)) { - _bcopy(&__osPfsInodeCache, inode, sizeof(__OSInode)); - return 0; - } - - if ((pfs->activebank != 0) && (ret = __osPfsSelectBank(pfs, 0)) != 0) { - return ret; - } - - 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*)(((u8*)inode) + (j * BLOCKSIZE)); - if (flag == PFS_WRITE) { - ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->inode_table + (bank * PFS_ONE_PAGE) + j, addr, 0); - ret = __osContRamWrite(pfs->queue, pfs->channel, pfs->minode_table + (bank * PFS_ONE_PAGE) + j, addr, 0); - } else { - ret = __osContRamRead(pfs->queue, pfs->channel, pfs->inode_table + (bank * PFS_ONE_PAGE) + j, addr); - } - if (ret) { - 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); - } - sum = __osSumcalc((u8*)(inode->inode_page + offset), (PFS_INODE_SIZE_PER_PAGE - offset) * 2); - 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, 0); - } - } - } - __osPfsInodeCacheBank = bank; - _bcopy(inode, &__osPfsInodeCache, sizeof(__OSInode)); - __osPfsInodeCacheChannel = pfs->channel; - - return 0; -} diff --git a/src/libultra/io/contramread.c b/src/libultra/io/contramread.c deleted file mode 100644 index cc85547..0000000 --- a/src/libultra/io/contramread.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "ultra64/controller.h" - -extern s32 __osPfsLastChannel; - -#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) - -s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) { - s32 ret; - s32 i; - u8* ptr; - s32 retry = 2; - - __osSiGetAccess(); - - do { - ptr = (u8*)&__osPfsPifRam; - - if (__osContLastCmd != CONT_CMD_READ_MEMPACK || __osPfsLastChannel != channel) { - __osContLastCmd = CONT_CMD_READ_MEMPACK; - __osPfsLastChannel = channel; - - for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; } - - __osPfsPifRam.pifstatus = CONT_CMD_EXE; - - READFORMAT(ptr)->dummy = CONT_CMD_NOP; - READFORMAT(ptr)->txsize = CONT_CMD_READ_MEMPACK_TX; - READFORMAT(ptr)->rxsize = CONT_CMD_READ_MEMPACK_RX; - READFORMAT(ptr)->cmd = CONT_CMD_READ_MEMPACK; - READFORMAT(ptr)->datacrc = 0xFF; - - ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; - } else { - ptr += channel; - } - - READFORMAT(ptr)->hi = address >> 3; - READFORMAT(ptr)->lo = (u8)(__osContAddressCrc(address) | (address << 5)); - - __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4); - - if (!ret) { - if (__osContDataCrc(&READFORMAT(ptr)->data) != READFORMAT(ptr)->datacrc) { - ret = __osPfsGetStatus(mq, channel); - - if (ret) { - break; - } - - ret = PFS_ERR_CONTRFAIL; - } else { - _bcopy(&READFORMAT(ptr)->data, buffer, BLOCKSIZE); - } - } else { - ret = PFS_ERR_NOPACK; - } - if (ret != PFS_ERR_CONTRFAIL) { - break; - } - } while (0 <= retry--); - __osSiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/contramwrite.c b/src/libultra/io/contramwrite.c deleted file mode 100644 index 8499892..0000000 --- a/src/libultra/io/contramwrite.c +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include "PR/os_internal.h" -#include "PR/rcp.h" -#include "ultra64/controller.h" - -extern s32 __osPfsLastChannel; - -#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr)) - -s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) { - s32 ret = 0; - s32 i; - u8* ptr; - s32 retry = 2; - u8 crc; - - if ((force != PFS_FORCE) && (address < PFS_LABEL_AREA) && (address != 0)) { - return 0; - } - - __osSiGetAccess(); - - do { - ptr = (u8*)(&__osPfsPifRam.ramarray); - - if (__osContLastCmd != CONT_CMD_WRITE_MEMPACK || __osPfsLastChannel != channel) { - __osContLastCmd = CONT_CMD_WRITE_MEMPACK; - __osPfsLastChannel = channel; - - // clang-format off - for (i = 0; i < channel; i++) { *ptr++ = 0; } - // clang-format on - - __osPfsPifRam.pifstatus = 1; - - READFORMAT(ptr)->dummy = CONT_CMD_NOP; - READFORMAT(ptr)->txsize = CONT_CMD_WRITE_MEMPACK_TX; - READFORMAT(ptr)->rxsize = CONT_CMD_WRITE_MEMPACK_RX; - READFORMAT(ptr)->cmd = CONT_CMD_WRITE_MEMPACK; - READFORMAT(ptr)->datacrc = 0xFF; - - ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END; - } else { - ptr += channel; - } - READFORMAT(ptr)->hi = address >> 3; - READFORMAT(ptr)->lo = ((address << 5) | __osContAddressCrc(address)); - - _bcopy(buffer, READFORMAT(ptr)->data, BLOCKSIZE); - - ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - crc = __osContDataCrc(buffer); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - - ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4); - if (!ret) { - if (crc != ((__OSContRamReadFormat*)ptr)->datacrc) { - if ((ret = __osPfsGetStatus(mq, channel))) { - break; - } else { - ret = PFS_ERR_CONTRFAIL; - } - } - } else { - ret = PFS_ERR_NOPACK; - } - } while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0)); - __osSiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/contreaddata.c b/src/libultra/io/contreaddata.c deleted file mode 100644 index 81ac291..0000000 --- a/src/libultra/io/contreaddata.c +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include "ultra64/controller.h" - -void __osPackReadData(void); - -s32 osContStartReadData(OSMesgQueue *mq) -{ - s32 ret = 0; - s32 i; - - __osSiGetAccess(); - - if (__osContLastCmd != 1) { - __osPackReadData(); - ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); - osRecvMesg(mq, NULL, OS_MESG_BLOCK); - } - - ret = __osSiRawStartDma(OS_READ, &__osContPifRam); - - __osContLastCmd = 1; - __osSiRelAccess(); - - return ret; -} - -void osContGetReadData(OSContPad *data) -{ - u8 *ptr; - __OSContReadFormat readformat; - int i; - ptr = (u8 *)&__osContPifRam.ramarray; - - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContReadFormat), data++) { - readformat = *(__OSContReadFormat *)ptr; - data->errno = CHNL_ERR(readformat); - - if (data->errno == 0) { - data->button = readformat.button; - data->stick_x = readformat.stick_x; - data->stick_y = readformat.stick_y; - } - } -} - -void __osPackReadData(void) -{ - u8 *ptr; - __OSContReadFormat readformat; - int i; - - ptr = (u8*)&__osContPifRam.ramarray; - - 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 = -1; - 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/src/libultra/io/controller.c b/src/libultra/io/controller.c deleted file mode 100644 index 10c5c76..0000000 --- a/src/libultra/io/controller.c +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include "ultra64/controller.h" - -extern OSPifRam __osContPifRam; -extern u8 __osContLastCmd; -extern u8 __osMaxControllers; -extern OSTimer __osEepromTimer; -extern OSMesgQueue __osEepromTimerQ; -extern OSMesg __osEepromTimerMsg; - -extern u32 __osContInitialized; - -void __osContGetInitData(u8 *pattern, OSContStatus *data); -void __osPackRequestData(u8 cmd); - -s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus *data) -{ - OSMesg dummy; - s32 ret; - OSTime t; - OSTimer mytimer; - OSMesgQueue timerMesgQueue; - - ret = 0; - - if (__osContInitialized) { - return ret; - } - - __osContInitialized = TRUE; - t = osGetTime(); - - if (t < 23437500) { - osCreateMesgQueue(&timerMesgQueue, &dummy, 1); - osSetTimer(&mytimer, 23437500 - t, 0, &timerMesgQueue, &dummy); - osRecvMesg(&timerMesgQueue, &dummy, OS_MESG_BLOCK); - } - - __osMaxControllers = MAXCONTROLLERS; - __osPackRequestData(CONT_CMD_REQUEST_STATUS); - - ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); - osRecvMesg(mq, &dummy, OS_MESG_BLOCK); - - ret = __osSiRawStartDma(OS_READ, &__osContPifRam); - 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; - __OSContRequestFormat requestformat; - int i; - u8 bits; - bits = 0; - ptr = (u8 *)&__osContPifRam; - - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContRequestFormat), data++) { - requestformat = *(__OSContRequestFormat *)ptr; - data->errno = CHNL_ERR(requestformat); - - if (data->errno == 0) { - data->type = (requestformat.typel << 8) | requestformat.typeh; - data->status = requestformat.status; - bits |= 1 << i; - } - } - - *pattern = bits; -} - -void __osPackRequestData(u8 cmd) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - - for (i = 0; i < ARRLEN(__osContPifRam.ramarray); i++) { - __osContPifRam.ramarray[i] = 0; - } - - __osContPifRam.pifstatus = CONT_CMD_EXE; - - ptr = (u8 *)&__osContPifRam.ramarray; - - requestformat.dummy = CONT_CMD_NOP; - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = cmd; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - requestformat.dummy1 = CONT_CMD_NOP; - - for (i = 0; i < __osMaxControllers; i++) { - *(__OSContRequestFormat *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormat); - } - - ptr[0] = CONT_CMD_END; -} diff --git a/src/libultra/io/crc.c b/src/libultra/io/crc.c deleted file mode 100644 index 7d39201..0000000 --- a/src/libultra/io/crc.c +++ /dev/null @@ -1,96 +0,0 @@ -#include "PR/os_internal.h" - -u8 __osContAddressCrc(u16 inaddr) -{ - u32 crc; - u32 mask; - u32 addr = inaddr; - - crc = 0; - - for (mask = 0x400; mask != 0; mask >>= 1) { - crc *= 2; - - if (addr & mask) { - if (crc & 0x20) { - crc ^= 20; - } else { - crc++; - } - } else { - if (crc & 0x20) { - crc ^= 21; - } - } - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - crc <<= 1; - - if (crc & 0x20) { - crc ^= 21; - } - - return crc & 0x1f; -} - -u8 __osContDataCrc(u8 *data) -{ - u32 i; - u32 mask; - u32 crc = 0; - - for (i = 32; i != 0; i--) { - for (mask = 0x80; mask != 0; mask >>= 1) { - crc *= 2; - - if (*data & mask) { - if (crc & 0x100) { - crc ^= 132; - } else { - crc++; - } - } else { - if (crc & 0x100) { - crc ^= 133; - } - } - } - - data++; - } - - do { - crc <<= 1; - - if (crc & 0x100) { - crc ^= 133; - } - i++; - } while (i < 8); - - return crc; -} diff --git a/src/libultra/io/devmgr.c b/src/libultra/io/devmgr.c deleted file mode 100644 index 6ddacce..0000000 --- a/src/libultra/io/devmgr.c +++ /dev/null @@ -1,114 +0,0 @@ -#include -#include -#include "piint.h" - -void __osDevMgrMain(void *args) -{ - OSIoMesg *mb; - OSMesg em; - OSMesg dummy; - s32 ret; - OSDevMgr *dm; - s32 messageSend; - - messageSend = 0; - mb = NULL; - ret = 0; - dm = (OSDevMgr *)args; - 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)); - while (TRUE) - { - - 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); //TODO: remove magic constants - osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow); - osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat); - - if (stat & LEO_STATUS_MECHANIC_INTERRUPT) //TODO: remove magic constants - { - 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) - break; - if (mb->piHandle->transferInfo.block[0].errStatus != LEO_ERROR_GOOD) - break; - messageSend = 0; - } - 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/src/libultra/io/epidma.c b/src/libultra/io/epidma.c deleted file mode 100644 index 6009385..0000000 --- a/src/libultra/io/epidma.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include "piint.h" - -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; -} diff --git a/src/libultra/io/epirawdma.c b/src/libultra/io/epirawdma.c deleted file mode 100644 index 0dc889f..0000000 --- a/src/libultra/io/epirawdma.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "piint.h" - -s32 osEPiRawStartDma(OSPiHandle *pihandle, s32 direction, u32 devAddr, void *dramAddr, u32 size) -{ - u32 stat; - u32 domain; - - 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/src/libultra/io/epirawread.c b/src/libultra/io/epirawread.c deleted file mode 100644 index 44be711..0000000 --- a/src/libultra/io/epirawread.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "piint.h" - -s32 osEPiRawReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { - u32 stat; - u32 domain; - - EPI_SYNC(pihandle, stat, domain); - *data = IO_READ(pihandle->baseAddress | devAddr); - - return 0; -} diff --git a/src/libultra/io/epirawwrite.c b/src/libultra/io/epirawwrite.c deleted file mode 100644 index f5798b1..0000000 --- a/src/libultra/io/epirawwrite.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include "piint.h" - -s32 osEPiRawWriteIo(OSPiHandle *handle, u32 devAddr, u32 data) -{ - u32 stat = IO_READ(PI_STATUS_REG); - - while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) { - stat = IO_READ(PI_STATUS_REG); - } - - if (__osCurrentHandle[handle->domain]->type != handle->type) { - OSPiHandle *cHandle = __osCurrentHandle[handle->domain]; - - if (handle->domain == PI_DOMAIN1) { - if (cHandle->latency != handle->latency) { - IO_WRITE(PI_BSD_DOM1_LAT_REG, handle->latency); - } - - if (cHandle->pageSize != handle->pageSize) { - IO_WRITE(PI_BSD_DOM1_PGS_REG, handle->pageSize); - } - - if (cHandle->relDuration != handle->relDuration) { - IO_WRITE(PI_BSD_DOM1_RLS_REG, handle->relDuration); - } - - if (cHandle->pulse != handle->pulse) { - IO_WRITE(PI_BSD_DOM1_PWD_REG, handle->pulse); - } - } else { - if (cHandle->latency != handle->latency) { - IO_WRITE(PI_BSD_DOM2_LAT_REG, handle->latency); - } - - if (cHandle->pageSize != handle->pageSize) { - IO_WRITE(PI_BSD_DOM2_PGS_REG, handle->pageSize); - } - - if (cHandle->relDuration != handle->relDuration) { - IO_WRITE(PI_BSD_DOM2_RLS_REG, handle->relDuration); - } - - if (cHandle->pulse != handle->pulse) { - IO_WRITE(PI_BSD_DOM2_PWD_REG, handle->pulse); - } - } - - cHandle->type = handle->type; - cHandle->latency = handle->latency; - cHandle->pageSize = handle->pageSize; - cHandle->relDuration = handle->relDuration; - cHandle->pulse = handle->pulse; - } - - IO_WRITE(handle->baseAddress | devAddr, data); - return 0; -} diff --git a/src/libultra/io/epiread.c b/src/libultra/io/epiread.c deleted file mode 100644 index c20e61a..0000000 --- a/src/libultra/io/epiread.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "piint.h" - -s32 osEPiRawReadIo(OSPiHandle*, u32, u32*); - -s32 osEPiReadIo(OSPiHandle* pihandle, u32 devAddr, u32* data) { - register s32 ret; - - __osPiGetAccess(); - ret = osEPiRawReadIo(pihandle, devAddr, data); - __osPiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/epiwrite.c b/src/libultra/io/epiwrite.c deleted file mode 100644 index e5c7a33..0000000 --- a/src/libultra/io/epiwrite.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "piint.h" - -s32 osEPiRawWriteIo(OSPiHandle*, u32, u32); - -s32 osEPiWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) { - register s32 ret; - - __osPiGetAccess(); - ret = osEPiRawWriteIo(pihandle, devAddr, data); - __osPiRelAccess(); - - return ret; -} diff --git a/src/libultra/io/gbpakcheckconnector.c b/src/libultra/io/gbpakcheckconnector.c deleted file mode 100644 index d6ed4ad..0000000 --- a/src/libultra/io/gbpakcheckconnector.c +++ /dev/null @@ -1,218 +0,0 @@ -#include - -/** - * The internal operations performed by the osGbpakCheckConnector function are - * as follows. - * - * - Checks the ROM area addresses of the Game Boy Game Pak and performs the - * following processing for 0x0000, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, - * 0x1000, 0x2000, and 0x4000. - * - * 1. Compares data starting at the above addresses with neighboring data in - * 32-byte units. - * 2. If the data are identical, compares the next 32 bytes, and if this is - * also the same, compares the next 32 bytes. Up to 4 comparisons (ie, 128 - * bytes) are performed. If all data are identical, the address line is - * considered insecurely connected and an error is returned. If different - * data are detected even once, it is determined that the data are being - * read properly and the function advances. - * 3. Data at each of the above addresses are compared with the data starting - * at 0x0000 in 32-byte units. - * 4. As in 2., up to 4 comparisons (128 bytes) are made. If all the data are - * identical, an error is returned. If different data are detected even - * once, it is determined that the data are being read properly and the - * function advances. - * - * - If a RAM area exists, the function checks the address of the Game Boy Game - * Pak RAM area and performs the following processing for 0x2000 and 0xa000. - * - * 1. Compares the data starting at the above addresses in 32-byte units. - * 2. If the data are identical, compares the next 32 bytes, and if this is - * also the same, compares the next 32 bytes. Up to 4 comparisons (ie, 128 - * bytes) are performed. If all the data are the same, the address line is - * evaluated to be insecurely connected and an error is returned. If - * different data are detected even once, it is determined that the data - * are being read properly and the function advances. - */ -s32 osGbpakCheckConnector(OSPfs *pfs, u8 *status) -{ - s32 ret; - s32 thisslot = 1; - s32 prevslot = 0; - u16 thischunkaddr; - u16 prevchunkaddr = 0; - u16 offset; - u16 blocknum; - u8 blocks[3][4][0x20]; - u8 blocksloaded[3][4]; - s32 stilllooking; - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = osGbpakGetStatus(pfs, status); - } - - if (ret == PFS_ERR_NEW_GBCART) { - return PFS_ERR_CONTRFAIL; - } - - if (ret == 0) { - if ((*status & OS_GBPAK_POWER) == 0) { - ret = osGbpakPower(pfs, OS_GBPAK_POWER_ON); - - if (ret != 0) { - return ret; - } - } - - bzero(blocksloaded, 12); - - for (thischunkaddr = 0x80; thischunkaddr <= 0x4000; thischunkaddr *= 2) { - blocknum = 0; - offset = 0; - - do { - // Load the current block - ret = osGbpakReadWrite(pfs, PFS_READ, thischunkaddr + offset, blocks[thisslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[thisslot][blocknum] = 1; - - // Load the same block from the previous chunk if not already loaded - // (This only applies for the 0x0000 chunk) - if (blocksloaded[prevslot][blocknum] == 0) { - ret = osGbpakReadWrite(pfs, PFS_READ, prevchunkaddr + offset, blocks[prevslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[prevslot][blocknum] = 1; - } - - // Compare them and bail out if different - if (bcmp(blocks[thisslot][blocknum], blocks[prevslot][blocknum], 32) != 0) { - blocknum = 0; - break; - } - - stilllooking = blocknum < 3; - offset += 0x20; blocknum++; - } while (stilllooking); - - if (blocknum); - if (blocknum); - if (blocknum); - if (blocknum); - if (blocknum); - if (blocknum); - - stilllooking = blocknum; - - if (stilllooking) { - return PFS_ERR_CONTRFAIL; - } - - // Now compare each block in this chunk with each block in the - // 0x0000 chunk - blocknum = 0; - offset = 0; - - if (prevslot != 0) { - do { - // Make sure the current block is loaded - if (blocksloaded[thisslot][blocknum] == 0) { - ret = osGbpakReadWrite(pfs, PFS_READ, thischunkaddr + offset, blocks[thisslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[thisslot][blocknum] = 1; - } - - // Make sure this block in chunk 0x0000 is loaded - if (blocksloaded[0][blocknum] == 0) { - ret = osGbpakReadWrite(pfs, PFS_READ, offset, blocks[0][blocknum], 32); - - if (ret != 0) { - return ret; - } - - blocksloaded[0][blocknum] = 1; - } - - // Compare them and bail out if different - if (bcmp(blocks[thisslot][blocknum], blocks[0][blocknum], 32) != 0) { - stilllooking = 0; - goto end; - } - - stilllooking = blocknum < 3; - offset += 0x20; blocknum++; - } while (stilllooking); - - stilllooking = blocknum; - } - -end: - if (stilllooking) { - return PFS_ERR_CONTRFAIL; - } - - if (prevslot != 0) { - bzero(&blocksloaded[prevslot][0], 4); - } - - prevchunkaddr = thischunkaddr; - prevslot = thisslot; - thisslot ^= 3; // toggle between 1 and 2 - } - - // Check RAM if present - if (pfs->dir_size >= 2 || pfs->version == 2) { - blocknum = 0; - offset = 0; - - do { - ret = osGbpakReadWrite(pfs, PFS_READ, 0xa000 + offset, blocks[thisslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - ret = osGbpakReadWrite(pfs, PFS_READ, 0x2000 + offset, blocks[prevslot][blocknum], 32); - - if (ret != 0) { - return ret; - } - - if (bcmp(blocks[thisslot][blocknum], blocks[prevslot][blocknum], 32) != 0) { - blocknum = 0; - break; - } - - stilllooking = blocknum < 3; - offset += 0x20; blocknum++; - } while (stilllooking); - - stilllooking = blocknum; - - if (stilllooking) { - return PFS_ERR_CONTRFAIL; - } - } - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = PFS_ERR_CONTRFAIL; - } - } - - return ret; -} diff --git a/src/libultra/io/gbpakgetstatus.c b/src/libultra/io/gbpakgetstatus.c deleted file mode 100644 index 2d45bb3..0000000 --- a/src/libultra/io/gbpakgetstatus.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -s32 osGbpakGetStatus(OSPfs *pfs, u8 *status) -{ - s32 ret; - s32 i; - u8 buffer[32]; - - ret = __osContRamRead(pfs->queue, pfs->channel, 0x400, buffer); - - if (ret == PFS_ERR_NEW_PACK || buffer[31] != (OS_GBPAK_RSTB_DETECTION | OS_GBPAK_GBCART_ON)) { - ret = osGbpakInit(pfs->queue, pfs, pfs->channel); - - if (ret != 0) { - return ret; - } - } - - ret = __osContRamRead(pfs->queue, pfs->channel, 0x580, buffer); - - if (ret == 0) { - ret = __osPfsGetStatus(pfs->queue, pfs->channel); - - if (ret != 0) { - return ret; - } - - *status = buffer[0]; - - for (i = 1; i < 32; i++) { - *status |= ((u8 *)buffer)[i]; - } - - *status &= (OS_GBPAK_RSTB_DETECTION | OS_GBPAK_GBCART_PULL); - *status |= buffer[31]; - - if ((*status & OS_GBPAK_GBCART_ON) == 0) { - ret = PFS_ERR_NO_GBCART; - } else if (*status & OS_GBPAK_GBCART_PULL) { - ret = PFS_ERR_NEW_GBCART; - } - } else if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - return ret; -} diff --git a/src/libultra/io/gbpakinit.c b/src/libultra/io/gbpakinit.c deleted file mode 100644 index b61eae5..0000000 --- a/src/libultra/io/gbpakinit.c +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include "ultra64/controller.h" - -// .bss -extern OSTimer var80090ab0; -extern OSMesgQueue g_GbpakMesgQueue; -extern OSMesg var80090ae8; - -s32 osGbpakInit(OSMesgQueue *queue, OSPfs *pfs, int channel) -{ - s32 ret; - s32 i; - u8 buffer[32]; - - pfs->status = 0; - - for (i = 0; i < 32; i++) { - buffer[i] = 0xfe; - } - - ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); - } - - if (ret != 0) { - return ret; - } - - ret = __osContRamRead(queue, channel, 0x400, buffer); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - if (buffer[31] == 0xfe) { - return PFS_ERR_DEVICE; - } - - // ok but why tho. the earlier loop isnt like this - for (i = 0; i < 32; i+=4) { - buffer[i+0] = 0x84; - buffer[i+1] = 0x84; - buffer[i+2] = 0x84; - buffer[i+3] = 0x84; - } - - ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - ret = __osContRamRead(queue, channel, 0x400, buffer); - - if (ret == 2) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - if (buffer[31] != 0x84) { - return PFS_ERR_DEVICE; - } - - ret = __osPfsGetStatus(queue, channel); - - if (ret != 0) { - return ret; - } - - osCreateMesgQueue(&g_GbpakMesgQueue, &var80090ae8, 1); - osSetTimer(&var80090ab0, 9000000, 0, &g_GbpakMesgQueue, &var80090ae8); - osRecvMesg(&g_GbpakMesgQueue, 0, OS_MESG_BLOCK); - - pfs->queue = queue; - pfs->status = 0x10; - pfs->channel = channel; - pfs->activebank = 0x84; - pfs->banks = 0xff; - pfs->version = 0xff; - pfs->dir_size = 0xff; - - return 0; -} diff --git a/src/libultra/io/gbpakpower.c b/src/libultra/io/gbpakpower.c deleted file mode 100644 index 0eaf8ee..0000000 --- a/src/libultra/io/gbpakpower.c +++ /dev/null @@ -1,40 +0,0 @@ -#include - -extern OSTimer var80090ab0; -extern OSMesgQueue g_GbpakMesgQueue; -extern OSMesg var80090ae8; - -s32 osGbpakPower(OSPfs *pfs, s32 flag) -{ - s32 i; - s32 ret; - u8 buffer[32]; - - for (i = 0; i < 32; i+=4) { - buffer[i+0] = flag; - buffer[i+1] = flag; - buffer[i+2] = flag; - buffer[i+3] = flag; - } - - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x580, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = osGbpakInit(pfs->queue, pfs, pfs->channel); - - if (ret == 0) { - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x580, buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - } - } - - if (flag != OS_GBPAK_POWER_OFF) { - osSetTimer(&var80090ab0, 0x55D4A8, 0, &g_GbpakMesgQueue, &var80090ae8); - osRecvMesg(&g_GbpakMesgQueue, NULL, OS_MESG_BLOCK); - } - - return ret; -} diff --git a/src/libultra/io/gbpakreadid.c b/src/libultra/io/gbpakreadid.c deleted file mode 100644 index 3585c99..0000000 --- a/src/libultra/io/gbpakreadid.c +++ /dev/null @@ -1,91 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -extern void _bcopy(void *, void *, u32); - -u32 g_OsGbNintendoData[] = { - 0xceed6666, 0xcc0d000b, 0x03730083, 0x000c000d, - 0x0008111f, 0x8889000e, 0xdccc6ee6, 0xddddd999, - 0xbbbb6763, 0x6e0eeccc, 0xdddc999f, 0xbbb9333e, -}; - -u8 g_OsGbCartVersions[] = { - 0x00, 0x01, 0x01, 0x01, - 0xff, 0x02, 0x02, 0xff, - 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x03, - 0x03, 0x03, 0x03, 0x03, -}; - -s32 osGbpakReadId(OSPfs *pfs, OSGbpakId *id, u8 *status) -{ - s32 i; - s32 ret; - u8 sum; - u8 buffer[0x60]; - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = osGbpakGetStatus(pfs, status); - } - - if (ret == PFS_ERR_NEW_GBCART) { - return PFS_ERR_CONTRFAIL; - } - - if (ret == 0) { - if ((*status & OS_GBPAK_POWER) == 0) { - ret = osGbpakPower(pfs, OS_GBPAK_POWER_ON); - - if (ret != 0) { - return ret; - } - } - - ret = osGbpakReadWrite(pfs, PFS_READ, 0x100, buffer, 0x60); - - if (ret != 0) { - return ret; - } - - ret = osGbpakGetStatus(pfs, status); - - if (ret == PFS_ERR_NEW_GBCART) { - ret = PFS_ERR_CONTRFAIL; - } - - if (ret != 0) { - return ret; - } - - // Compare id->nintendo_chr with expected data - if (bcmp(g_OsGbNintendoData, &buffer[4], sizeof(id->nintendo_chr)) != 0) { - return PFS_ERR_CONTRFAIL; - } - - // Sum game_title through to isum - sum = 0; - - for (i = 0x34; i < 0x4e; i++) { - sum += buffer[i]; - } - - sum = (sum + 25) & 0xff; - - if (sum != 0) { - return PFS_ERR_CONTRFAIL; - } - - _bcopy(buffer, id, sizeof(OSGbpakId)); - - if (id->cart_type < 20) { - pfs->version = g_OsGbCartVersions[id->cart_type]; - } - - pfs->dir_size = id->ram_size; - } - - return ret; -} diff --git a/src/libultra/io/gbpakreadwrite.c b/src/libultra/io/gbpakreadwrite.c deleted file mode 100644 index d1c8436..0000000 --- a/src/libultra/io/gbpakreadwrite.c +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 osGbpakReadWrite(OSPfs *pfs, u16 flag, u16 address, u8 *buffer, u16 size) -{ - s32 i; - s32 ret; - u8 bank; - u16 addr; - - bank = address >> 14; - - if (bank != pfs->banks) { - ret = __osGbpakSelectBank(pfs, bank); - - if (ret != 0) { - return ret; - } - } - - size = size >> 5; - address = (address | 0xc000) >> 5; - - if (flag == PFS_WRITE) { - for (i = 0; i < size; i++) { - ret = __osContRamWrite(pfs->queue, pfs->channel, address, buffer, 0); - - if (ret != 0) { - break; - } - - address++; - - if (address >= 0x800 && i < size - 1) { - bank++; - ret = __osGbpakSelectBank(pfs, bank); - - if (ret != 0) { - break; - } - - address = 0x600; - } - - buffer += BLOCKSIZE; - } - } else { - for (i = 0; i < size; i++) { - ret = __osContRamRead(pfs->queue, pfs->channel, address, buffer); - - if (ret != 0) { - break; - } - - address++; - - if (address >= 0x800 && i < size - 1) { - bank++; - ret = __osGbpakSelectBank(pfs, bank); - - if (ret != 0) { - break; - } - - address = 0x600; - } - - buffer += BLOCKSIZE; - } - } - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - - return ret; -} diff --git a/src/libultra/io/gbpakselectbank.c b/src/libultra/io/gbpakselectbank.c deleted file mode 100644 index 27de904..0000000 --- a/src/libultra/io/gbpakselectbank.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -s32 __osGbpakSelectBank(OSPfs *pfs, u8 bank) -{ - s32 ret; - s32 i; - u8 buffer[32]; - s32 j; - - if (bank >= 3) { - return PFS_ERR_INVALID; - } - - for (i = 0; i < 32; i+=4) { - buffer[i+0] = bank; - buffer[i+1] = bank; - buffer[i+2] = bank; - buffer[i+3] = bank; - } - - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x500, (u8 *)buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = osGbpakInit(pfs->queue, pfs, pfs->channel); - - if (ret == 0) { - ret = __osContRamWrite(pfs->queue, pfs->channel, 0x500, (u8 *)buffer, 0); - - if (ret == PFS_ERR_NEW_PACK) { - ret = PFS_ERR_CONTRFAIL; - } - } - } - - if (ret == 0) { - pfs->banks = bank; - } - - return ret; -} diff --git a/src/libultra/io/pfsgetstatus.c b/src/libultra/io/pfsgetstatus.c deleted file mode 100644 index dc4afdb..0000000 --- a/src/libultra/io/pfsgetstatus.c +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include "ultra64/controller.h" - -void __osPfsRequestOneChannel(int channel, u8 cmd); -void __osPfsGetOneChannelData(int channel, OSContStatus *data); - -extern u8 __osPfsInodeCacheBank; - -s32 __osPfsGetStatus(OSMesgQueue *queue, int channel) -{ - s32 ret; - OSMesg dummy; - OSContStatus data; - - ret = 0; - __osPfsInodeCacheBank = 0xfa; - - __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); - ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - __osPfsGetOneChannelData(channel, &data); - - if ((data.status & CONT_CARD_ON) && (data.status & CONT_CARD_PULL)) { - return PFS_ERR_NEW_PACK; - } - - if (data.errno != 0 || (data.status & CONT_CARD_ON) == 0) { - return PFS_ERR_NOPACK; - } - - if (data.status & CONT_ADDR_CRC_ER) { - return PFS_ERR_CONTRFAIL; - } - - return ret; -} - -void __osPfsRequestOneChannel(int channel, u8 cmd) -{ - u8 *ptr; - __OSContRequestFormatShort requestformat; - int i; - - __osContLastCmd = CONT_CMD_END; - __osPfsPifRam.pifstatus = CONT_CMD_EXE; - ptr = (u8 *)&__osPfsPifRam; - - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = cmd; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - - for (i = 0; i < channel; i++) { - *ptr++ = 0; - } - - *(__OSContRequestFormatShort *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormatShort); - *ptr = CONT_CMD_END; -} - -void __osPfsGetOneChannelData(int channel, OSContStatus *data) -{ - u8 *ptr; - __OSContRequestFormatShort requestformat; - int i; - - ptr = (u8*)&__osPfsPifRam; - - for (i = 0; i < channel; i++) { - ptr++; - } - - requestformat = *(__OSContRequestFormatShort *)ptr; - data->errno = CHNL_ERR(requestformat); - - if (data->errno == 0) { - data->type = (requestformat.typel << 8) | (requestformat.typeh); - data->status = requestformat.status; - } -} diff --git a/src/libultra/io/pfsisplug.c b/src/libultra/io/pfsisplug.c deleted file mode 100644 index 7b35ef4..0000000 --- a/src/libultra/io/pfsisplug.c +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include "ultra64/controller.h" -#include "siint.h" - -extern OSPifRam __osPfsPifRam; -s32 osPfsIsPlug(OSMesgQueue *queue, u8 *pattern) -{ - s32 ret; - OSMesg dummy; - u8 bitpattern; - OSContStatus data[MAXCONTROLLERS]; - int channel; - u8 bits; - int crc_error_cnt; - ret = 0; - bits = 0; - crc_error_cnt = 3; - __osSiGetAccess(); - while (TRUE) - { - __osPfsRequestData(CONT_CMD_REQUEST_STATUS); - ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); - osRecvMesg(queue, &dummy, OS_MESG_BLOCK); - __osPfsGetInitData(&bitpattern, data); - for (channel = 0; channel < __osMaxControllers; channel++) - { - if ((data[channel].status & CONT_ADDR_CRC_ER) == 0) - { - crc_error_cnt--; - break; - } - } - if (__osMaxControllers == channel) - crc_error_cnt = 0; - if (crc_error_cnt < 1) - { - for (channel = 0; channel < __osMaxControllers; channel++) - { - if (data[channel].errno == 0 && (data[channel].status & CONT_CARD_ON) != 0) - bits |= 1 << channel; - } - __osSiRelAccess(); - *pattern = bits; - return ret; - } - } -} -void __osPfsRequestData(u8 cmd) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - ptr = (u8 *)&__osPfsPifRam; - __osContLastCmd = cmd; - __osPfsPifRam.pifstatus = CONT_CMD_EXE; - requestformat.dummy = CONT_CMD_NOP; - requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; - requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; - requestformat.cmd = cmd; - requestformat.typeh = CONT_CMD_NOP; - requestformat.typel = CONT_CMD_NOP; - requestformat.status = CONT_CMD_NOP; - requestformat.dummy1 = CONT_CMD_NOP; - for (i = 0; i < __osMaxControllers; i++) - { - *(__OSContRequestFormat *)ptr = requestformat; - ptr += sizeof(__OSContRequestFormat); - } - *ptr = CONT_CMD_END; -} -void __osPfsGetInitData(u8 *pattern, OSContStatus *data) -{ - u8 *ptr; - __OSContRequestFormat requestformat; - int i; - u8 bits; - bits = 0; - ptr = (u8 *)&__osPfsPifRam; - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(__OSContRequestFormat)) - { - requestformat = *(__OSContRequestFormat *)ptr; - data->errno = CHNL_ERR(requestformat); - if (data->errno == 0) - { - data->type = (requestformat.typel << 8) | (requestformat.typeh); - data->status = requestformat.status; - bits |= 1 << i; - } - data++; - } - *pattern = bits; -} diff --git a/src/libultra/io/pfsselectbank.c b/src/libultra/io/pfsselectbank.c deleted file mode 100644 index 4c03254..0000000 --- a/src/libultra/io/pfsselectbank.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include "ultra64/controller.h" - -s32 __osPfsSelectBank(OSPfs *pfs, u8 bank) -{ - u8 temp[8][4]; - int i, j; - s32 ret; - ret = 0; - - for (i = 0; i < 8; i++) { - for(j = 0; j < 4; j++) { - temp[i][j] = bank; - } - } - - ret = __osContRamWrite(pfs->queue, pfs->channel, 1024, (u8*)temp, FALSE); - - if (ret == 0) { - pfs->activebank = bank; - } - - return ret; -} diff --git a/src/libultra/io/piacs.c b/src/libultra/io/piacs.c deleted file mode 100644 index e61222d..0000000 --- a/src/libultra/io/piacs.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -extern u32 __osPiAccessQueueEnabled; -extern OSMesg piAccessBuf[1]; -extern OSMesgQueue __osPiAccessQueue; - -void __osPiCreateAccessQueue(void) { - __osPiAccessQueueEnabled = 1; - osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, ARRAY_COUNT(piAccessBuf)); - osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); -} - -void __osPiGetAccess(void) { - OSMesg msg; - - if (!__osPiAccessQueueEnabled) { - __osPiCreateAccessQueue(); - } - - osRecvMesg(&__osPiAccessQueue, &msg, OS_MESG_BLOCK); -} - -void __osPiRelAccess(void) { - osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK); -} diff --git a/src/libultra/io/pigetcmdq.c b/src/libultra/io/pigetcmdq.c deleted file mode 100644 index a820be0..0000000 --- a/src/libultra/io/pigetcmdq.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "common.h" - -extern s32 D_8007A860; -extern s32 D_8007A868; - -// TODO: This returns an OSMesgQueue pointer. D_8007A860 should -// be __osPiDevMgr.active and D_8007A868 should be -// __osPiDevMgr.cmdQueue. -s32 osPiGetCmdQueue(void) { - if (D_8007A860 == 0) { - return 0; - } - return D_8007A868; -} diff --git a/src/libultra/io/pimgr.c b/src/libultra/io/pimgr.c deleted file mode 100644 index 53843dd..0000000 --- a/src/libultra/io/pimgr.c +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include "piint.h" - -extern s32 osPiRawStartDma(s32, u32, void *, u32); // TODO: DEFINE -extern s32 osEPiRawStartDma(OSPiHandle *, s32, u32, void *, u32); // TODO: DEFINE - -extern OSDevMgr __osPiDevMgr; -extern OSPiHandle *__osPiTable; -extern OSPiHandle *__osCurrentHandle[2]; -extern OSThread piThread; -extern char piThreadStack[OS_PIM_STACKSIZE]; -#ifdef _DEBUG -extern OSThread ramromThread; -extern char ramromThreadStack[OS_RAMROM_STACKSIZE]; -extern OSMesgQueue getRamromQ; -extern OSMesg getRamromBuf[1]; -extern OSMesgQueue freeRamromQ; -extern OSMesg freeRamromBuf[1]; -#endif -extern OSMesgQueue piEventQueue; -extern OSMesg piEventBuf[1]; -void osCreatePiManager(OSPri pri, OSMesgQueue *cmdQ, OSMesg *cmdBuf, s32 cmdMsgCnt) -{ - u32 savedMask; - OSPri oldPri; - OSPri myPri; - if (!__osPiDevMgr.active) - { - 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, &piThreadStack[OS_PIM_STACKSIZE], pri); - osStartThread(&piThread); - __osRestoreInt(savedMask); - if (oldPri != -1) - { - osSetThreadPri(NULL, oldPri); - } - } -} diff --git a/src/libultra/io/pirawdma.c b/src/libultra/io/pirawdma.c deleted file mode 100644 index 9fc7901..0000000 --- a/src/libultra/io/pirawdma.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include "piint.h" - -s32 osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) -{ - register u32 stat; - 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/src/libultra/io/si.c b/src/libultra/io/si.c deleted file mode 100644 index c20c71b..0000000 --- a/src/libultra/io/si.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "siint.h" - -int __osSiDeviceBusy() -{ - register u32 stat = IO_READ(SI_STATUS_REG); - if (stat & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) - return 1; - return 0; -} diff --git a/src/libultra/io/siacs.c b/src/libultra/io/siacs.c deleted file mode 100644 index 8001295..0000000 --- a/src/libultra/io/siacs.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -extern OSMesg siAccessBuf; -extern u32 var8009c7c4; -extern OSMesgQueue __osSiAccessQueue; - -extern u32 __osSiAccessQueueEnabled; - -void __osSiCreateAccessQueue(void) -{ - __osSiAccessQueueEnabled = 1; - osCreateMesgQueue(&__osSiAccessQueue, &siAccessBuf, 1); - osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); -} - -void __osSiGetAccess(void) -{ - OSMesg dummyMesg; - - if (!__osSiAccessQueueEnabled) { - __osSiCreateAccessQueue(); - } - - osRecvMesg(&__osSiAccessQueue, &dummyMesg, OS_MESG_BLOCK); -} - -void __osSiRelAccess(void) -{ - osSendMesg(&__osSiAccessQueue, NULL, OS_MESG_NOBLOCK); -} diff --git a/src/libultra/io/sirawdma.c b/src/libultra/io/sirawdma.c deleted file mode 100644 index b464a10..0000000 --- a/src/libultra/io/sirawdma.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -s32 __osSiRawStartDma(s32 direction, void *dramAddr) -{ - if (IO_READ(SI_STATUS_REG) & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY)) { - return -1; - } - - if (direction == OS_WRITE) { - osWritebackDCache(dramAddr, 64); - } - - IO_WRITE(SI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr)); - - if (direction == OS_READ) { - IO_WRITE(SI_PIF_ADDR_RD64B_REG, 0x1fc007c0); - } else { - IO_WRITE(SI_PIF_ADDR_WR64B_REG, 0x1fc007c0); - } - - if (direction == OS_READ) { - osInvalDCache(dramAddr, 64); - } - - return 0; -} diff --git a/src/libultra/io/sirawread.c b/src/libultra/io/sirawread.c deleted file mode 100644 index ea27761..0000000 --- a/src/libultra/io/sirawread.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "siint.h" - -s32 __osSiRawReadIo(u32 devAddr, u32 *data) -{ - if (__osSiDeviceBusy()) - return -1; - *data = IO_READ(devAddr); - return 0; -} diff --git a/src/libultra/io/sp.c b/src/libultra/io/sp.c deleted file mode 100644 index 9517083..0000000 --- a/src/libultra/io/sp.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -int __osSpDeviceBusy() -{ - register u32 stat = IO_READ(SP_STATUS_REG); - if (stat & (SP_STATUS_DMA_BUSY | SP_STATUS_DMA_FULL | SP_STATUS_IO_FULL)) - return 1; - return 0; -} diff --git a/src/libultra/io/sprawdma.c b/src/libultra/io/sprawdma.c deleted file mode 100644 index 9d20e5e..0000000 --- a/src/libultra/io/sprawdma.c +++ /dev/null @@ -1,19 +0,0 @@ -#include - -s32 __osSpRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) -{ - 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/src/libultra/io/sptask.c b/src/libultra/io/sptask.c deleted file mode 100644 index a0ebde9..0000000 --- a/src/libultra/io/sptask.c +++ /dev/null @@ -1,60 +0,0 @@ -#include - -#define _osVirtualToPhysical(ptr) \ - if (ptr != NULL) { \ - ptr = (void*)osVirtualToPhysical(ptr); \ - } - -extern OSTask sTmpTask; - -OSTask* _VirtualToPhysicalTask(OSTask* intp) { - OSTask* tp = &sTmpTask; - - _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 = _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*)HW_REG((u32)intp->t.yield_data_ptr + OS_YIELD_DATA_SIZE - 4, u32); - } - } - osWritebackDCache(tp, sizeof(OSTask)); - __osSpSetStatus(SP_CLR_SIG0 | SP_CLR_SIG1 | SP_CLR_SIG2 | SP_SET_INTR_BREAK); - - while (__osSpSetPc((void*)SP_IMEM_START) == -1) { - ; - } - while (__osSpRawStartDma(OS_WRITE, (void*)(SP_IMEM_START - sizeof(*tp)), tp, sizeof(OSTask)) == -1) { - ; - } - while (__osSpDeviceBusy()) { - ; - } - while (__osSpRawStartDma(OS_WRITE, (void*)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/src/libultra/io/sptaskyield.c b/src/libultra/io/sptaskyield.c deleted file mode 100644 index 78637ce..0000000 --- a/src/libultra/io/sptaskyield.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -void osSpTaskYield(void) -{ - __osSpSetStatus(SP_SET_YIELD); -} diff --git a/src/libultra/io/sptaskyielded.c b/src/libultra/io/sptaskyielded.c deleted file mode 100644 index 030f46e..0000000 --- a/src/libultra/io/sptaskyielded.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "PR/os_internal.h" -#include "PR/sptask.h" -#include "PR/rcp.h" - -OSYieldResult osSpTaskYielded(OSTask *tp) { - u32 status; - OSYieldResult result; - - status = __osSpGetStatus(); - - if (status & SP_STATUS_YIELDED) { - result = OS_TASK_YIELDED; - } else { - result = 0; - } - - if (status & SP_STATUS_YIELD) { - tp->t.flags |= result; - tp->t.flags &= ~(OS_TASK_DP_WAIT); - } - - return result; -} diff --git a/src/libultra/io/vi.c b/src/libultra/io/vi.c deleted file mode 100644 index 93a6795..0000000 --- a/src/libultra/io/vi.c +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -static __OSViContext vi[2] = {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/src/libultra/io/vigetcurrframebuf.c b/src/libultra/io/vigetcurrframebuf.c deleted file mode 100644 index 987e86b..0000000 --- a/src/libultra/io/vigetcurrframebuf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "viint.h" - -void *osViGetCurrentFramebuffer(void) { - register u32 saveMask = __osDisableInt(); - void *framep = __osViCurr->framep; - - __osRestoreInt(saveMask); - return framep; -} diff --git a/src/libultra/io/vimgr.c b/src/libultra/io/vimgr.c deleted file mode 100644 index 0377d64..0000000 --- a/src/libultra/io/vimgr.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include "viint.h" -#include "../os/osint.h" - -#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0]))) - -OSDevMgr __osViDevMgr = {0}; -u32 __additional_scanline = 0; -static OSThread viThread; -static unsigned char viThreadStack[OS_VIM_STACKSIZE]; -static OSMesgQueue viEventQueue; -static OSMesg viEventBuf[5]; -static OSIoMesg viRetraceMsg; -static OSIoMesg viCounterMsg; - -static void viMgrMain(void *arg); -void osCreateViManager(OSPri pri) -{ - u32 savedMask; - OSPri oldPri; - OSPri myPri; - - if (!__osViDevMgr.active) { - __osTimerServicesInit(); - __additional_scanline = 0; - 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, &viThreadStack[OS_VIM_STACKSIZE], pri); - __osViInit(); - osStartThread(&viThread); - __osRestoreInt(savedMask); - - if (oldPri != -1) { - osSetThreadPri(0, 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; - } - } -} diff --git a/src/libultra/io/virepeatline.c b/src/libultra/io/virepeatline.c deleted file mode 100644 index 0eaf66e..0000000 --- a/src/libultra/io/virepeatline.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include "viint.h" - -void osViRepeatLine(u8 active) -{ - register u32 saveMask; - saveMask = __osDisableInt(); - if (active) - { - __osViNext->state |= VI_STATE_REPEATLINE; - } - else - __osViNext->state &= ~VI_STATE_REPEATLINE; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/visetevent.c b/src/libultra/io/visetevent.c deleted file mode 100644 index 589647a..0000000 --- a/src/libultra/io/visetevent.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -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/src/libultra/io/visetmode.c b/src/libultra/io/visetmode.c deleted file mode 100644 index 03ddae7..0000000 --- a/src/libultra/io/visetmode.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include "viint.h" - -void osViSetMode(OSViMode *modep) -{ - register u32 saveMask; - saveMask = __osDisableInt(); - __osViNext->modep = modep; - __osViNext->state = VI_STATE_MODE_UPDATED; - __osViNext->control = __osViNext->modep->comRegs.ctrl; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/visetxscale.c b/src/libultra/io/visetxscale.c deleted file mode 100644 index 328987c..0000000 --- a/src/libultra/io/visetxscale.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -void osViSetXScale(f32 value) { - register u32 nomValue; - register u32 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/src/libultra/io/visetyscale.c b/src/libultra/io/visetyscale.c deleted file mode 100644 index 525e0eb..0000000 --- a/src/libultra/io/visetyscale.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include "viint.h" - -// TODO: this comes from a header -#ident "$Revision: 1.17 $" - -void osViSetYScale(f32 value) { - register u32 saveMask = __osDisableInt(); - - __osViNext->y.factor = value; - __osViNext->state |= VI_STATE_YSCALE_UPDATED; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/io/viswapbuf.c b/src/libultra/io/viswapbuf.c deleted file mode 100644 index ee58f17..0000000 --- a/src/libultra/io/viswapbuf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "viint.h" - -void osViSwapBuffer(void* frameBufPtr) { - u32 saveMask = __osDisableInt(); - - __osViNext->framep = frameBufPtr; - __osViNext->state |= VI_STATE_BUFFER_UPDATED; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/libc/ldiv.c b/src/libultra/libc/ldiv.c deleted file mode 100644 index 3a7d57c..0000000 --- a/src/libultra/libc/ldiv.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -lldiv_t lldiv(long long num, long long denom) -{ - lldiv_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; -} - -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; -} diff --git a/src/libultra/libc/ll.c b/src/libultra/libc/ll.c deleted file mode 100644 index f05204a..0000000 --- a/src/libultra/libc/ll.c +++ /dev/null @@ -1,47 +0,0 @@ -#include - -s64 __ull_rshift(u64 l, s64 r) { - return l >> r; -} - -u64 __ull_rem(u64 l, u64 r) { - return l % r; -} - -u64 __ull_div(u64 l, u64 r) { - return l / r; -} - -s64 __ll_lshift(s64 l, s64 r) { - return l << r; -} - -s64 __ll_rem(s64 l, u64 r) { - return l % r; -} - -s64 __ll_div(s64 l, s64 r) { - return l / r; -} - -s64 __ll_mul(s64 l, s64 r) { - return l * r; -} - -void __ull_divremi(u64* quotient, u64* remainder, u64 dividend, u16 divisor) { - *quotient = dividend / divisor; - *remainder = dividend % divisor; -} - -s64 __ll_mod(s64 l, s64 r) { - s64 remainder = l % r; - - if (((remainder < 0) && (r > 0)) || ((remainder > 0) && (r < 0))) { - remainder += r; - } - return remainder; -} - -s64 __ll_rshift(s64 l, s64 r) { - return l >> r; -} diff --git a/src/libultra/libc/sprintf.c b/src/libultra/libc/sprintf.c deleted file mode 100644 index fb0eb6e..0000000 --- a/src/libultra/libc/sprintf.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include "stdarg.h" - -typedef unsigned long uintptr_t; - -int _Printf(char *(*prout)(char *, const char *, size_t), char *dst, const char *fmt, va_list args); - -void* proutSprintf(void* dst, const char* fmt, size_t size) { - return (void*)((uintptr_t)memcpy(dst, fmt, size) + size); -} - -int sprintf(char* dst, char* fmt, ...) { - int ans; - va_list args; - va_start(args, fmt); - - ans = _Printf((void*)&proutSprintf, dst, fmt, args); - if (ans > -1) { - dst[ans] = 0; - } - - va_end(args); - - return ans; -} diff --git a/src/libultra/libc/syncprintf.c b/src/libultra/libc/syncprintf.c deleted file mode 100644 index 0dc0ce9..0000000 --- a/src/libultra/libc/syncprintf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -void osSyncPrintf(const char *fmt, ...) -{ - int ans; - va_list ap; - // these functions intentionally left blank. ifdeffed out in rom release -} -void rmonPrintf(const char *fmt, ...) -{ - int ans; - va_list ap; -} diff --git a/src/libultra/libc/xprintf.c b/src/libultra/libc/xprintf.c deleted file mode 100644 index 893ca31..0000000 --- a/src/libultra/libc/xprintf.c +++ /dev/null @@ -1,244 +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 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 = (*prout)(arg, s, n)) != NULL) \ - x.size += (n); \ - else \ - return x.size; \ - } -static char spaces[] = " "; -static char zeroes[] = "00000000000000000000000000000000"; - -static void _Putfld(printf_struct *pf, va_list *pap, char code, char *ac); -int _Printf(outfun prout, char *arg, const char *fmt, va_list args) -{ - printf_struct x; - const char *s; - char c; - const char *t; - static const char fchar[6] = " +-#0"; - static const int fbit[6] = {FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAGS_ZERO, 0}; - char ac[32]; - x.size = 0; - for (;;) - { - s = fmt; - for (c = *s; c != 0 && c != '%';) - { - - c = *++s; - } - PUT(fmt, s - fmt); - if (c == 0) - return x.size; - fmt = ++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.precision = -1; - else if (*++s == '*') - { - x.precision = va_arg(args, int); - ++s; - } - else - { - ATOI(x.precision, s); - } - x.length = strchr("hlL", *s) ? *s++ : '\0'; - if (x.length == 'l' && *s == 'l') - { - x.length = 'L'; - ++s; - } - _Putfld(&x, &args, *s, ac); - x.width -= x.n0 + x.num_leading_zeros + x.part2_len + x.num_mid_zeros + x.part3_len + x.num_trailing_zeros; - if (!(x.flags & FLAGS_MINUS)) - PAD(spaces, x.width); - PUT(ac, x.n0); - PAD(zeroes, x.num_leading_zeros); - PUT(x.buff, x.part2_len); - PAD(zeroes, x.num_mid_zeros); - PUT(x.buff + x.part2_len, x.part3_len); - PAD(zeroes, x.num_trailing_zeros); - if (x.flags & FLAGS_MINUS) - PAD(spaces, x.width); - fmt = s + 1; - } - return 0; -} - -static void _Putfld(printf_struct *x, va_list *args, char type, char *buff) -{ - x->n0 = x->num_leading_zeros = x->part2_len = x->num_mid_zeros = x->part3_len = - x->num_trailing_zeros = 0; - - switch (type) - { - case 'c': - buff[x->n0++] = va_arg(*args, int); - break; - - case 'd': - case 'i': - if (x->length == 'l') - x->value.s64 = va_arg(*args, int); - else if (x->length == 'L') - x->value.s64 = va_arg(*args, s64); - else - x->value.s64 = va_arg(*args, int); - - if (x->length == 'h') - { - x->value.s64 = (s16)x->value.s64; - } - - if (x->value.s64 < 0) - { - buff[x->n0++] = '-'; - } - else if (x->flags & FLAGS_PLUS) - { - buff[x->n0++] = '+'; - } - else if (x->flags & FLAGS_SPACE) - { - buff[x->n0++] = ' '; - } - - x->buff = (char *)&buff[x->n0]; - - _Litob(x, type); - break; - - case 'x': - case 'X': - case 'u': - case 'o': - if (x->length == 'l') - { - x->value.s64 = va_arg(*args, int); - } - else if (x->length == 'L') - { - x->value.s64 = va_arg(*args, s64); - } - else - { - x->value.s64 = va_arg(*args, int); - } - - if (x->length == 'h') - { - x->value.s64 = (u16)x->value.s64; - } - else if (x->length == 0) - { - x->value.s64 = (unsigned int)x->value.s64; - } - - if (x->flags & FLAGS_HASH) - { - buff[x->n0++] = '0'; - if (type == 'x' || type == 'X') - { - - buff[x->n0++] = type; - } - } - x->buff = (char *)&buff[x->n0]; - _Litob(x, type); - break; - - case 'e': - case 'f': - case 'g': - case 'E': - case 'G': - //... okay? - x->value.f64 = x->length == 'L' ? va_arg(*args, f64) : va_arg(*args, f64); - - if (LDSIGN(x->value.f64)) - buff[x->n0++] = '-'; - else if (x->flags & FLAGS_PLUS) - buff[x->n0++] = '+'; - else if (x->flags & FLAGS_SPACE) - buff[x->n0++] = ' '; - - x->buff = (char *)&buff[x->n0]; - _Ldtob(x, type); - break; - - case 'n': - if (x->length == 'h') - *(va_arg(*args, u16 *)) = x->size; - else if (x->length == 'l') - *va_arg(*args, unsigned int *) = x->size; - else if (x->length == 'L') - *va_arg(*args, u64 *) = x->size; - else - *va_arg(*args, unsigned int *) = x->size; - break; - - case 'p': - x->value.s64 = (long)va_arg(*args, void *); - x->buff = (char *)&buff[x->n0]; - _Litob(x, 'x'); - break; - - case 's': - x->buff = va_arg(*args, char *); - x->part2_len = strlen(x->buff); - if (x->precision >= 0 && x->part2_len > x->precision) - x->part2_len = x->precision; - break; - case '%': - //this doesn't match in -g because of regalloc issues?? - buff[x->n0++] = '%'; - break; - default: - buff[x->n0++] = type; - break; - } -} diff --git a/src/libultra/os/afterprenmi.c b/src/libultra/os/afterprenmi.c deleted file mode 100644 index 234d4b7..0000000 --- a/src/libultra/os/afterprenmi.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -s32 osAfterPreNMI(void) { - return __osSpSetPc(0); -} diff --git a/src/libultra/os/createmesgqueue.c b/src/libultra/os/createmesgqueue.c deleted file mode 100644 index 2649739..0000000 --- a/src/libultra/os/createmesgqueue.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -extern void *__osThreadTail; - -void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg, s32 msgCount) -{ - mq->mtqueue = (OSThread *)&__osThreadTail; - mq->fullqueue = (OSThread *)&__osThreadTail; - mq->validCount = 0; - mq->first = 0; - mq->msgCount = msgCount; - mq->msg = msg; -} diff --git a/src/libultra/os/createthread.c b/src/libultra/os/createthread.c deleted file mode 100644 index 7059a40..0000000 --- a/src/libultra/os/createthread.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -void __osCleanupThread(void); - -extern OSThread *__osActiveQueue; - -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 = (u64)arg; - t->context.sp = (u64)sp - 16; - t->context.ra = (u64)__osCleanupThread; - mask = OS_IM_ALL; - t->context.sr = SR_IMASK | SR_EXL | SR_IE; - 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/src/libultra/os/dequeuethread.c b/src/libultra/os/dequeuethread.c deleted file mode 100644 index df3d1f8..0000000 --- a/src/libultra/os/dequeuethread.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -void __osDequeueThread(OSThread** queue, OSThread* thread) { - register OSThread** a2 = queue; - register OSThread* a3 = *a2; - - while (a3 != NULL) { - if (a3 == thread) { - *a2 = thread->next; - return; - } - a2 = &a3->next; - a3 = *a2; - } -} diff --git a/src/libultra/os/destroythread.c b/src/libultra/os/destroythread.c deleted file mode 100644 index 712d6a6..0000000 --- a/src/libultra/os/destroythread.c +++ /dev/null @@ -1,37 +0,0 @@ -#include - -extern OSThread *__osRunningThread; -extern OSThread *__osActiveQueue; - -void osDestroyThread(OSThread* thread) { - register u32 prevInt = __osDisableInt(); - register OSThread* s1; - register OSThread* s2; - - if (thread == NULL) { - thread = __osRunningThread; - - } else if (thread->state != OS_STATE_STOPPED) { - __osDequeueThread(thread->queue, thread); - } - - if (__osActiveQueue == thread) { - __osActiveQueue = __osActiveQueue->tlnext; - } else { - s1 = __osActiveQueue; - while (s1->priority != OS_PRIORITY_THREADTAIL) { - s2 = s1->tlnext; - if (s2 == thread) { - s1->tlnext = thread->tlnext; - break; - } - s1 = s2; - } - } - - if (thread == __osRunningThread) { - __osDispatchThread(); - } - - __osRestoreInt(prevInt); -} diff --git a/src/libultra/os/getmemsize.c b/src/libultra/os/getmemsize.c deleted file mode 100644 index f1f4b48..0000000 --- a/src/libultra/os/getmemsize.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -#define STEP 0x100000 - -u32 osGetMemSize(void) { - u32* ptr; - u32 size = 0x400000; - u32 data0; - u32 data1; - - while (size < 0x800000) { - ptr = (u32*)(0xA0000000 + 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; -} diff --git a/src/libultra/os/getthreadpri.c b/src/libultra/os/getthreadpri.c deleted file mode 100644 index 21a6dda..0000000 --- a/src/libultra/os/getthreadpri.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -extern OSThread *__osRunningThread; -OSPri osGetThreadPri(OSThread *thread) -{ - if (thread == NULL) - thread = __osRunningThread; - return thread->priority; -} diff --git a/src/libultra/os/gettime.c b/src/libultra/os/gettime.c deleted file mode 100644 index de235ed..0000000 --- a/src/libultra/os/gettime.c +++ /dev/null @@ -1,18 +0,0 @@ -#include - -extern u32 __osBaseCounter; -extern OSTime __osCurrentTime; - -OSTime osGetTime(void) { - u32 count; - u32 base; - u64 t; - register u32 prevInt = __osDisableInt(); - - count = osGetCount(); - base = count - __osBaseCounter; - t = __osCurrentTime; - __osRestoreInt(prevInt); - - return base + t; -} diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c deleted file mode 100644 index a1cf36e..0000000 --- a/src/libultra/os/initialize.c +++ /dev/null @@ -1,99 +0,0 @@ -#include - -#define RESETTYPE_COLD 0 -#define RESETTYPE_WARM 1 - -typedef struct { - unsigned int inst1; - unsigned int inst2; - unsigned int inst3; - unsigned int inst4; -} __osExceptionVector; - -extern __osExceptionVector __osExceptionPreamble; -extern s32 osAppNMIBuffer[]; - -extern u32 __osFinalRom; - -OSTime osClockRate = 62500000; - -s32 osViClock = VI_NTSC_CLOCK; - -u32 __osShutdown = 0; -u32 __osGlobalIntMask = OS_IM_ALL; - -u32 var8005cf74 = 0; -u32 var8005cf78 = 0; -u32 var8005cf7c = 0; - -OSPiHandle *__osCartRomInit(void); - -void osInitialize(void) -{ - u32 pifdata; - u32 unused = 0; - - __osFinalRom = TRUE; - __osSetSR(__osGetSR() | SR_CU1); - __osSetFpcCsr(FPCSR_FS | FPCSR_EV); - - while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)); - - while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8)); - - *(__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)); - __osCartRomInit(); - osUnmapTLBAll(); - osMapTLBRdb(); - - osClockRate = osClockRate * 3 / 4; - - if (osResetType == RESETTYPE_COLD) { - bzero(&osAppNMIBuffer, 0x40); - } - - 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 (__osGetCause() & CAUSE_IP5) { - while (1); - } - - *(u32 *)PHYS_TO_K1(AI_CONTROL_REG) = 1; - *(u32 *)PHYS_TO_K1(AI_DACRATE_REG) = 0x3fff; - *(u32 *)PHYS_TO_K1(AI_BITRATE_REG) = 0xf; -} - -extern OSPiHandle CartRomHandle; -extern OSPiHandle LeoDiskHandle; - -/** - * According to Nintendo's SDK this function should return a pointer to an - * OSPiHandle, but the function only matches if the return statement is omitted. - * By chance the value in v0 happens to be &CartRomHandle anyway. - */ -OSPiHandle *__osCartRomInit(void) -{ - CartRomHandle.type = DEVICE_TYPE_INIT; - CartRomHandle.latency = IO_READ(0xa4600014); - CartRomHandle.pulse = IO_READ(0xa4600018); - CartRomHandle.pageSize = IO_READ(0xa460001c); - CartRomHandle.relDuration = IO_READ(0xa4600020); - - LeoDiskHandle.type = DEVICE_TYPE_INIT; - LeoDiskHandle.latency = IO_READ(0xa4600024); - LeoDiskHandle.pulse = IO_READ(0xa4600028); - LeoDiskHandle.pageSize = IO_READ(0xa460002c); - LeoDiskHandle.relDuration = IO_READ(0xa4600030); -} diff --git a/src/libultra/os/jammesg.c b/src/libultra/os/jammesg.c deleted file mode 100644 index 894c15c..0000000 --- a/src/libultra/os/jammesg.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -extern OSThread *__osRunningThread; - -s32 osJamMesg(OSMesgQueue *mq, OSMesg msg, s32 flag) -{ - register u32 saveMask = __osDisableInt(); - while (mq->validCount >= mq->msgCount) - { - if (flag == OS_MESG_BLOCK) - { - __osRunningThread->state = OS_STATE_WAITING; - __osEnqueueAndYield(&mq->fullqueue); - } - else - { - __osRestoreInt(saveMask); - return -1; - } - } - - mq->first = (mq->first + mq->msgCount - 1) % mq->msgCount; - mq->msg[mq->first] = msg; - mq->validCount++; - if (mq->mtqueue->next != NULL) - { - osStartThread(__osPopThread(&mq->mtqueue)); - } - __osRestoreInt(saveMask); - return 0; -} diff --git a/src/libultra/os/recvmesg.c b/src/libultra/os/recvmesg.c deleted file mode 100644 index 7895630..0000000 --- a/src/libultra/os/recvmesg.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "common.h" - -extern OSThread* __osRunningThread; // todo remove eventually - -s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flag) { - register s32 s0 = __osDisableInt(); - - while (mq->validCount == 0) { - if (flag == OS_MESG_NOBLOCK) { - __osRestoreInt(s0); - return -1; - } - __osRunningThread->state = 8; - __osEnqueueAndYield(mq); - } - - if (msg != NULL) { - *msg = mq->msg[mq->first]; - } - - mq->first = (mq->first + 1) % mq->msgCount; - mq->validCount--; - - if (mq->fullqueue->next != NULL) { - osStartThread(__osPopThread(&mq->fullqueue)); - } - - __osRestoreInt(s0); - - return 0; -} diff --git a/src/libultra/os/sendmesg.c b/src/libultra/os/sendmesg.c deleted file mode 100644 index 3047197..0000000 --- a/src/libultra/os/sendmesg.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "common.h" - -extern OSThread* __osRunningThread; // todo remove eventually - -s32 osSendMesg(OSMesgQueue* mq, OSMesg mesg, s32 flag) { - register u32 s0 = __osDisableInt(); - register u32 index; - - while (mq->validCount >= mq->msgCount) { - if (flag == OS_MESG_BLOCK) { - __osRunningThread->state = 8; - __osEnqueueAndYield(&mq->fullqueue); - } else { - __osRestoreInt(s0); - return -1; - } - } - - index = (mq->first + mq->validCount) % mq->msgCount; - mq->msg[index] = mesg; - mq->validCount++; - - if (mq->mtqueue->next != NULL) { - osStartThread(__osPopThread(&mq->mtqueue)); - } - - __osRestoreInt(s0); - - return 0; -} diff --git a/src/libultra/os/seteventmesg.c b/src/libultra/os/seteventmesg.c deleted file mode 100644 index 701eea2..0000000 --- a/src/libultra/os/seteventmesg.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include "ultra64/internal.h" - -extern __OSEventState __osEventStateTab[OS_NUM_EVENTS]; - -extern u32 __osPreNMI; -extern u32 __osShutdown; - -void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg msg) { - register u32 prevInt = __osDisableInt(); - __OSEventState* msgs = &__osEventStateTab[e]; - - msgs->queue = mq; - msgs->msg = msg; - - if (e == OS_EVENT_PRENMI) { - if (__osShutdown && !__osPreNMI) { - osSendMesg(mq, msg, OS_MESG_NOBLOCK); - } - __osPreNMI = true; - } - __osRestoreInt(prevInt); -} diff --git a/src/libultra/os/sethwinterrupt.c b/src/libultra/os/sethwinterrupt.c deleted file mode 100644 index 0fc9d30..0000000 --- a/src/libultra/os/sethwinterrupt.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "PR/os_internal.h" - -struct __osHwInt { - s32 (*handler)(void); - void *stackEnd; -}; - -extern struct __osHwInt __osHwIntTable[]; - -void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void *stackEnd) { - register u32 saveMask= __osDisableInt(); - - __osHwIntTable[interrupt].handler = handler; - __osHwIntTable[interrupt].stackEnd = stackEnd; - __osRestoreInt(saveMask); -} diff --git a/src/libultra/os/settime.c b/src/libultra/os/settime.c deleted file mode 100644 index 5bae2a2..0000000 --- a/src/libultra/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/src/libultra/os/settimer.c b/src/libultra/os/settimer.c deleted file mode 100644 index 7d10f9e..0000000 --- a/src/libultra/os/settimer.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include "osint.h" - -int osSetTimer(OSTimer *t, OSTime value, OSTime interval, OSMesgQueue *mq, OSMesg msg) -{ - OSTime time; - - t->next = NULL; - t->prev = NULL; - t->interval = interval; - - if (value != 0) { - t->value = value; - } else { - t->value = interval; - } - - t->mq = mq; - t->msg = msg; - time = __osInsertTimer(t); - - if (__osTimerList->next == t) { - __osSetTimerIntr(time); - } - - return 0; -} diff --git a/src/libultra/os/startthread.c b/src/libultra/os/startthread.c deleted file mode 100644 index 0358ebb..0000000 --- a/src/libultra/os/startthread.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include "osint.h" - -void osStartThread(OSThread *t) -{ - register u32 saveMask = __osDisableInt(); - - switch (t->state) { - case OS_STATE_WAITING: - t->state = OS_STATE_RUNNABLE; - __osEnqueueThread(&__osRunQueue, t); - break; - case OS_STATE_STOPPED: - if (t->queue == NULL || t->queue == &__osRunQueue) { - t->state = OS_STATE_RUNNABLE; - __osEnqueueThread(&__osRunQueue, t); - } else { - t->state = OS_STATE_WAITING; - __osEnqueueThread(t->queue, t); - __osEnqueueThread(&__osRunQueue, __osPopThread(t->queue)); - } - break; - } - - if (__osRunningThread == NULL) { - __osDispatchThread(); - } else if (__osRunningThread->priority < __osRunQueue->priority) { - __osRunningThread->state = OS_STATE_RUNNABLE; - __osEnqueueAndYield(&__osRunQueue); - } - - __osRestoreInt(saveMask); -} diff --git a/src/libultra/os/stopthread.c b/src/libultra/os/stopthread.c deleted file mode 100644 index 4962f5a..0000000 --- a/src/libultra/os/stopthread.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "common.h" - -extern OSThread* __osRunningThread; // todo remove eventually - -void osStopThread(OSThread* thread) { - register u32 s0 = __osDisableInt(); - register u32 state; - - if (thread == NULL) { - state = 4; - } else { - state = thread->state; - } - - switch (state) { - case 4: - __osRunningThread->state = 1; - __osEnqueueAndYield(NULL); - break; - case 2: - case 8: - thread->state = 1; - __osDequeueThread(thread->queue, thread); - break; - } - - __osRestoreInt(s0); -} diff --git a/src/libultra/os/timerintr.c b/src/libultra/os/timerintr.c deleted file mode 100644 index 18fcde0..0000000 --- a/src/libultra/os/timerintr.c +++ /dev/null @@ -1,99 +0,0 @@ -#include "PR/os_internal.h" -#include "osint.h" - -OSTimer *__osTimerList = &__osBaseTimer; -OSTimer __osBaseTimer; -OSTime __osCurrentTime; -u32 __osBaseCounter; -u32 __osViIntrCount; -u32 __osTimerCounter; - -void __osTimerServicesInit(void) { - __osCurrentTime = 0; - __osBaseCounter = 0; - __osViIntrCount = 0; - __osTimerList->prev = __osTimerList; - __osTimerList->next = __osTimerList->prev; - __osTimerList->value = 0; - __osTimerList->interval = __osTimerList->value; - __osTimerList->mq = NULL; - __osTimerList->msg = 0; -} - -void __osTimerInterrupt(void) { - OSTimer *t; - u32 count; - u32 elapsed_cycles; - - if (__osTimerList->next != __osTimerList) { - while (TRUE) { - t = __osTimerList->next; - if (t == __osTimerList) { - __osSetCompare(0); - __osTimerCounter = 0; - break; - } - - count = osGetCount(); - elapsed_cycles = count - __osTimerCounter; - __osTimerCounter = count; - - if (elapsed_cycles < t->value) - { - t->value -= elapsed_cycles; - __osSetTimerIntr(t->value); - break; - } else { - t->prev->next = t->next; - t->next->prev = t->prev; - t->next = NULL; - t->prev = NULL; - - if (t->mq != NULL) { - osSendMesg(t->mq, t->msg, OS_MESG_NOBLOCK); - } - - if (t->interval != 0) { - t->value = t->interval; - __osInsertTimer(t); - } - } - } - } -} - -void __osSetTimerIntr(OSTime tim) { - OSTime NewTime; - u32 savedMask; - - savedMask = __osDisableInt(); - __osTimerCounter = osGetCount(); - NewTime = __osTimerCounter + tim; - __osSetCompare(NewTime); - __osRestoreInt(savedMask); -} - -OSTime __osInsertTimer(OSTimer* timer) { - OSTimer* nextTimer; - u64 timerValue; - u32 prevInt = __osDisableInt(); - - for (nextTimer = __osTimerList->next, timerValue = timer->value; - nextTimer != __osTimerList && timerValue > nextTimer->value; - timerValue -= nextTimer->value, nextTimer = nextTimer->next) { - ; - } - - timer->value = timerValue; - if (nextTimer != __osTimerList) { - nextTimer->value -= timerValue; - } - - timer->next = nextTimer; - timer->prev = nextTimer->prev; - nextTimer->prev->next = timer; - nextTimer->prev = timer; - __osRestoreInt(prevInt); - - return timerValue; -} diff --git a/src/libultra/os/virtualtophysical.c b/src/libultra/os/virtualtophysical.c deleted file mode 100644 index 283a8d5..0000000 --- a/src/libultra/os/virtualtophysical.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -u32 osVirtualToPhysical(void *addr) -{ - if (IS_KSEG0(addr)) { - return K0_TO_PHYS(addr); - } else if (IS_KSEG1(addr)) { - return K1_TO_PHYS(addr); - } else { - return __osProbeTLB(addr); - } -} diff --git a/src/main.c b/src/main.c index 7176d27..7b3348c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,5 @@ #include -#include "common.h" +#include "global.h" #include "dp_intro.h" #include "crash_screen.h" #include "rsp.h" diff --git a/src/rsp.c b/src/rsp.c index 6bf5780..9460298 100644 --- a/src/rsp.c +++ b/src/rsp.c @@ -1,5 +1,5 @@ #include -#include "common.h" +#include "global.h" #include "rsp.h" // All from n64 programming manual section 27.2 diff --git a/src/stage_loader.c b/src/stage_loader.c index 4b93756..ee59fd2 100644 --- a/src/stage_loader.c +++ b/src/stage_loader.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #include "stage_loader.h" #include "memory.h" #include "string.h" @@ -230,7 +230,7 @@ void func_800069F0(void) { } #else void func_800069F0(void); -#pragma GLOBAL_ASM("asm/nonmatchings/stage_loader/func_800069F0.s") +#pragma GLOBAL_ASM("asm/us/nonmatchings/stage_loader/func_800069F0.s") #endif s32 func_80006C04(s32 arg0) { diff --git a/src/stage_loader.h b/src/stage_loader.h index 9140f1b..7d0ac18 100644 --- a/src/stage_loader.h +++ b/src/stage_loader.h @@ -1,7 +1,7 @@ #ifndef _STAGE_LOADER_H_ #define _STAGE_LOADER_H_ -#include "common.h" +#include "global.h" s32 func_80006C6C(s32); s32 func_80006CB4(s32); diff --git a/tools/asm-differ/.github/workflows/check-poetry-lock.yml b/tools/asm-differ/.github/workflows/check-poetry-lock.yml new file mode 100644 index 0000000..6104770 --- /dev/null +++ b/tools/asm-differ/.github/workflows/check-poetry-lock.yml @@ -0,0 +1,20 @@ +name: flake check + +on: + pull_request: + push: + +permissions: read-all + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + # Install `nix` which is just a dead-simple way to get a stable `poetry` + # in scope. + - uses: cachix/install-nix-action@v20 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + # Check that poetry.lock is in sync with pyproject.toml + - run: nix run github:NixOS/nixpkgs/22.11#poetry -- lock --check diff --git a/tools/asm-differ/.github/workflows/unit-tests.yml b/tools/asm-differ/.github/workflows/unit-tests.yml new file mode 100644 index 0000000..a77498a --- /dev/null +++ b/tools/asm-differ/.github/workflows/unit-tests.yml @@ -0,0 +1,15 @@ +name: unit tests + +on: + pull_request: + push: + +permissions: read-all + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: python3 -m pip install --user colorama watchdog levenshtein cxxfilt + - run: python3 test.py diff --git a/tools/asm-differ/.gitignore b/tools/asm-differ/.gitignore new file mode 100644 index 0000000..90df93b --- /dev/null +++ b/tools/asm-differ/.gitignore @@ -0,0 +1,3 @@ +.mypy_cache/ +__pycache__/ +.vscode/ diff --git a/tools/asm-differ/.gitrepo b/tools/asm-differ/.gitrepo new file mode 100644 index 0000000..b40f427 --- /dev/null +++ b/tools/asm-differ/.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/git-commands/git-subrepo#readme +; +[subrepo] + remote = git@github.com:simonlindholm/asm-differ.git + branch = main + commit = 6d3e4c44d1ad8ad59bcae3abecb35f0d10e135e1 + parent = da9fca47be7d8f957b786c02d7bf4b4a48830f4a + method = merge + cmdver = 0.4.3 diff --git a/tools/asm-differ/.pre-commit-config.yaml b/tools/asm-differ/.pre-commit-config.yaml new file mode 100644 index 0000000..67ba03d --- /dev/null +++ b/tools/asm-differ/.pre-commit-config.yaml @@ -0,0 +1,5 @@ +repos: +- repo: https://github.com/psf/black + rev: 22.3.0 + hooks: + - id: black diff --git a/tools/asm-differ/LICENSE b/tools/asm-differ/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/tools/asm-differ/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/tools/asm-differ/README.md b/tools/asm-differ/README.md new file mode 100644 index 0000000..63b5253 --- /dev/null +++ b/tools/asm-differ/README.md @@ -0,0 +1,56 @@ +# asm-differ + +Nice differ for assembly code. Currently supports MIPS, PPC, AArch64, ARM32, and SH2; should be easy to hack to support other instruction sets. + +![](screenshot.png) + +## Dependencies + +- Python >= 3.6 +- `python3 -m pip install --user colorama watchdog levenshtein cxxfilt` (also `dataclasses` if on 3.6) + +## Usage + +Create a file `diff_settings.py` in some directory (see the one in this repo for an example). Then from that directory, run + +```bash +/path/to/diff.py [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/tools/asm-differ/diff-stylesheet.css b/tools/asm-differ/diff-stylesheet.css new file mode 100644 index 0000000..79da120 --- /dev/null +++ b/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/tools/asm-differ/diff.py b/tools/asm-differ/diff.py new file mode 100755 index 0000000..543e8fe --- /dev/null +++ b/tools/asm-differ/diff.py @@ -0,0 +1,3523 @@ +#!/usr/bin/env python3 +# PYTHON_ARGCOMPLETE_OK +import argparse +import enum +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)) + + +class DiffMode(enum.Enum): + SINGLE = "single" + SINGLE_BASE = "single_base" + NORMAL = "normal" + THREEWAY_PREV = "3prev" + THREEWAY_BASE = "3base" + + +# ==== 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, ARM32, or SH2 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( + "-f", + "--objfile", + dest="objfile", + type=str, + help="""File path for an object file being diffed. When used + the map file isn't searched for the function given. Useful for dynamically + linked libraries.""", + ) + 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-at-ret", + dest="stop_at_ret", + action="store_true", + help="""Stop disassembling at the first return instruction. + 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( + "-R", + "--no-show-rodata-refs", + dest="show_rodata_refs", + action="store_false", + help="Don't show .rodata -> .text references (typically from jump tables).", + ) + 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( + "-0", + "--diff_mode=single_base", + dest="diff_mode", + action="store_const", + const=DiffMode.SINGLE_BASE, + help="""View the base asm only (not a diff).""", + ) + parser.add_argument( + "-1", + "--diff_mode=single", + dest="diff_mode", + action="store_const", + const=DiffMode.SINGLE, + help="""View the current asm only (not a diff).""", + ) + parser.add_argument( + "-3", + "--threeway=prev", + dest="diff_mode", + action="store_const", + const=DiffMode.THREEWAY_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="diff_mode", + action="store_const", + const=DiffMode.THREEWAY_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 +from collections import Counter, defaultdict +from dataclasses import asdict, dataclass, field, replace +import difflib +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 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 + objdump_flags: List[str] + build_command: List[str] + map_format: str + build_dir: str + map_address_offset: int + 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 + reg_categories: Dict[str, int] + expected_dir: str + + +@dataclass +class Compress: + context: int + same_instr: bool + + +@dataclass +class Config: + arch: "ArchSettings" + + # Build/objdump options + diff_obj: bool + objfile: Optional[str] + 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" + diff_mode: DiffMode + base_shift: int + skip_lines: int + compress: Optional[Compress] + show_rodata_refs: bool + show_branches: bool + show_line_numbers: bool + show_source: bool + stop_at_ret: bool + ignore_large_imms: bool + ignore_addr_diffs: bool + algorithm: str + reg_categories: Dict[str, int] + + # 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")), + objdump_flags=settings.get("objdump_flags", []), + expected_dir=settings.get("expected_dir", "expected/"), + map_format=settings.get("map_format", "gnu"), + map_address_offset=settings.get( + "map_address_offset", settings.get("ms_map_address_offset", 0) + ), + build_dir=settings.get("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), + reg_categories=settings.get("reg_categories", {}), + ) + + +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, + objfile=args.objfile, + 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, + diff_mode=args.diff_mode or DiffMode.NORMAL, + 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_rodata_refs=args.show_rodata_refs, + show_branches=args.show_branches, + show_line_numbers=show_line_numbers, + show_source=args.show_source or args.source_old_binutils, + stop_at_ret=args.stop_at_ret, + ignore_large_imms=args.ignore_large_imms, + ignore_addr_diffs=args.ignore_addr_diffs, + algorithm=args.algorithm, + reg_categories=project.reg_categories, + ) + + +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", + "sh-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", "-+F", "-+X", "-#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() + REGISTER_CATEGORY = 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 TableLine: + key: Optional[str] + is_data_ref: bool + cells: Tuple[Tuple[Text, Optional["Line"]], ...] + + +@dataclass +class TableData: + headers: Tuple[Text, ...] + current_score: int + max_score: int + previous_score: Optional[int] + lines: List[TableLine] + + +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, data: TableData) -> 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(line: TableLine) -> Tuple[Text, ...]: + return tuple(cell[0] for cell in line.cells) + + +@dataclass +class PlainFormatter(Formatter): + column_width: int + + def apply_format(self, chunk: str, f: Format) -> str: + return chunk + + def table(self, data: TableData) -> str: + rows = [data.headers] + [self.outputline_texts(line) for line in data.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" + STYLE_RESET = "\x1b[0m" + + BASIC_ANSI_CODES = { + BasicFormat.NONE: "", + BasicFormat.IMMEDIATE: Fore.LIGHTBLUE_EX, + BasicFormat.STACK: Fore.YELLOW, + BasicFormat.REGISTER: Fore.YELLOW, + BasicFormat.REGISTER_CATEGORY: Fore.LIGHTYELLOW_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, data: TableData) -> str: + rows = [(data.headers, False)] + [ + ( + self.outputline_texts(line), + line.is_data_ref, + ) + for line in data.lines + ] + return "\n".join( + "".join( + (self.STYLE_INVERT if is_data_ref else "") + + self.apply(x.ljust(self.column_width)) + + (self.STYLE_RESET if is_data_ref else "") + 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, data: TableData) -> 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(data.headers, False, "th") + output += " \n" + output += " \n" + output += "".join( + table_row(self.outputline_texts(line), line.is_data_ref, "td") + for line in data.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, data: TableData) -> 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] + + output: Dict[str, Any] = {} + output["arch_str"] = self.arch_str + output["header"] = { + name: serialize(h) + for h, name in zip(data.headers, ("base", "current", "previous")) + } + output["current_score"] = data.current_score + output["max_score"] = data.max_score + if data.previous_score is not None: + output["previous_score"] = data.previous_score + output_rows: List[Dict[str, Any]] = [] + for row in data.lines: + output_row: Dict[str, Any] = {} + output_row["key"] = row.key + output_row["is_data_ref"] = row.is_data_ref + iters: List[Tuple[str, Text, Optional[Line]]] = [ + (label, *cell) + for label, cell in zip(("base", "current", "previous"), row.cells) + ] + 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]] + +# eval_expr adapted from https://stackoverflow.com/a/9558001 + +import ast +import operator as op + +# supported operators +operators: Dict[Type[Union[ast.operator, ast.unaryop]], Any] = { + ast.Add: op.add, + ast.Sub: op.sub, + ast.Mult: op.mul, + ast.Div: op.truediv, + ast.Pow: op.pow, + ast.BitXor: op.xor, + ast.USub: op.neg, +} + + +def eval_expr(expr: str) -> Any: + return eval_(ast.parse(expr, mode="eval").body) + + +def eval_(node: ast.AST) -> Any: + if isinstance(node, ast.Num): # + return node.n + elif isinstance(node, ast.BinOp): # + return operators[type(node.op)](eval_(node.left), eval_(node.right)) + elif isinstance(node, ast.UnaryOp): # e.g., -1 + return operators[type(node.op)](eval_(node.operand)) + else: + raise TypeError(node) + + +def maybe_eval_int(expr: str) -> Optional[int]: + try: + ret = eval_expr(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_rodata_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 + + project.objdump_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 and config.show_rodata_refs: + out = ( + serialize_rodata_references(parse_elf_rodata_references(obj_data, config)) + + out + ) + + return out + + +def search_build_objects(objname: str, project: ProjectSettings) -> Optional[str]: + objfiles = [ + os.path.join(dirpath, f) + for dirpath, _, filenames in os.walk(project.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.build_dir}, " + f"cannot determine which to diff against: \n{all_objects}" + ) + if len(objfiles) == 1: + return objfiles[0] + + return None + + +def search_map_file( + fn_name: str, project: ProjectSettings, config: Config, *, for_binary: bool +) -> 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": + if for_binary and "load address" not in contents: + fail( + 'Failed to find "load address" in map file. Maybe you need to add\n' + '"export LANG := C" to your Makefile to avoid localized output?' + ) + + 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) or f" {fn_name} = 0x" in line: + ram = int(line.split()[0], 0) + if (for_binary and ram_to_rom is not None) or ( + not for_binary and cur_objfile is not None + ): + cands.append((cur_objfile, ram + (ram_to_rom or 0))) + 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": + find = re.findall( + # ram elf rom alignment + r" \S+ \S+ (\S+) (\S+) +\S+ " + + re.escape(fn_name) + + r"(?: \(entry of " + + re.escape(config.diff_section) + + r"\))? \t" + # object name + + "(\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] + objfile = search_build_objects(objname, project) + + # 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. + if objfile is not None: + return objfile, rom + elif project.map_format == "ms": + load_address_find = re.search( + r"Preferred load address is ([0-9a-f]+)", + contents, + ) + if not load_address_find: + fail(f"Couldn't find module load address in map file.") + load_address = int(load_address_find.group(1), 16) + + diff_segment_find = re.search( + r"([0-9a-f]+):[0-9a-f]+ [0-9a-f]+H " + re.escape(config.diff_section), + contents, + ) + if not diff_segment_find: + fail(f"Couldn't find segment for section in map file.") + diff_segment = diff_segment_find.group(1) + + find = re.findall( + r" (?:" + + re.escape(diff_segment) + + r")\S+\s+(?:" + + re.escape(fn_name) + + r")\s+\S+ ... \S+", + contents, + ) + if len(find) > 1: + fail(f"Found multiple occurrences of function {fn_name} in map file.") + if len(find) == 1: + names_find = re.search(r"(\S+) ... (\S+)", find[0]) + assert names_find is not None + fileofs = int(names_find.group(1), 16) - load_address + if for_binary: + return None, fileofs + + objname = names_find.group(2) + objfile = search_build_objects(objname, project) + if objfile is not None: + return objfile, fileofs + else: + fail(f"Linker map format {project.map_format} unrecognised.") + return None, None + + +def parse_elf_rodata_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 + R_MIPS_32 = 2 + R_MIPS_GPREL32 = 12 + + 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" + + 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 not in (".rodata", ".late_rodata"): + 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 in (R_MIPS_32, R_MIPS_GPREL32): + (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 = config.objfile + if not objfile: + objfile, _ = search_map_file(start, project, config, for_binary=False) + + 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 = os.path.join(project.expected_dir, objfile) + if config.diff_mode != DiffMode.SINGLE and 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, for_binary=True) + if start_addr is None: + fail("Not able to find function in map file.") + start_addr += project.map_address_offset + 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 pre_process( + self, mnemonic: str, args: str, next_row: Optional[str] + ) -> Tuple[str, str]: + return mnemonic, args + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + return prev, None + + 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 + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + return False + + +class AsmProcessorMIPS(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + self.seen_jr_ra = False + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + arch = self.config.arch + if "R_MIPS_NONE" in row or "R_MIPS_JALR" 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, None + before, imm, after = parse_relocated_line(prev) + addend = reloc_addend_from_imm(imm, before, self.config.arch) + repl = row.split()[-1] + addend + 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})" + elif "R_MIPS_GOT16" in row: + repl = f"%got({repl})" + elif "R_MIPS_CALL16" in row: + repl = f"%call16({repl})" + elif "R_MIPS_LITERAL" in row: + repl = repl[:-len(addend)] + else: + assert False, f"unknown relocation type '{row}' for line '{prev}'" + return before + repl + after, repl + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + if self.seen_jr_ra: + return True + if mnemonic == "jr" and args == "ra": + self.seen_jr_ra = True + return False + + +class AsmProcessorPPC(AsmProcessor): + def pre_process( + self, mnemonic: str, args: str, next_row: Optional[str] + ) -> Tuple[str, str]: + + if next_row and "R_PPC_EMB_SDA21" in next_row: + # With sda21 relocs, the linker transforms `r0` into `r2`/`r13`, and + # we may encounter this in either pre-transformed or post-transformed + # versions depending on if the .o file comes from compiler output or + # from disassembly. Normalize, to make sure both forms are treated as + # equivalent. + + args = args.replace("(r2)", "(0)") + args = args.replace("(r13)", "(0)") + args = args.replace(",r2,", ",0,") + args = args.replace(",r13,", ",0,") + + # We want to convert li and lis with an sda21 reloc, + # because the r0 to r2/r13 transformation results in + # turning an li/lis into an addi/addis with r2/r13 arg + # our preprocessing normalizes all versions to addi with a 0 arg + if mnemonic in {"li", "lis"}: + mnemonic = mnemonic.replace("li", "addi") + args_parts = args.split(",") + args = args_parts[0] + ",0," + args_parts[1] + + return mnemonic, args + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + arch = self.config.arch + assert any( + r in row + for r in ["R_PPC_REL24", "R_PPC_ADDR16", "R_PPC_EMB_SDA21", "R_PPC_REL14"] + ), 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 + if "R_PPC_REL14" in row: + 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: + # sda21 relocations; r2/r13 --> 0 swaps are performed in pre_process + repl = f"{repl}@sda21" + + return before + repl + after, repl + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + return mnemonic == "blr" + + +class AsmProcessorARM32(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + arch = self.config.arch + if "R_ARM_V4BX" in row: + # R_ARM_V4BX converts "bx " to "mov pc," for some targets. + # Ignore for now. + return prev, None + if "R_ARM_ABS32" in row and not prev.startswith(".word"): + # Don't crash on R_ARM_ABS32 relocations incorrectly applied to code. + # (We may want to do something more fancy here that actually shows the + # related symbol, but this serves as a stop-gap.) + return prev, None + before, imm, after = parse_relocated_line(prev) + repl = row.split()[-1] + reloc_addend_from_imm(imm, before, self.config.arch) + return before + repl + after, repl + + 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 + + +class AsmProcessorI686(AsmProcessor): + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + repl = row.split()[-1] + mnemonic, args = prev.split(maxsplit=1) + + addr_imm = re.search(r"(? bool: + return mnemonic == "ret" + + +class AsmProcessorSH2(AsmProcessor): + def __init__(self, config: Config) -> None: + super().__init__(config) + + def process_reloc(self, row: str, prev: str) -> Tuple[str, Optional[str]]: + return prev, None + + def is_end_of_function(self, mnemonic: str, args: str) -> bool: + return mnemonic == "rts" + + +@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-", +} + +I686_BRANCH_INSTRUCTIONS = { + "call", + "jmp", + "ljmp", + "ja", + "jae", + "jb", + "jbe", + "jc", + "jcxz", + "jecxz", + "jrcxz", + "je", + "jg", + "jge", + "jl", + "jle", + "jna", + "jnae", + "jnb", + "jnbe", + "jnc", + "jne", + "jng", + "jnge", + "jnl", + "jnle", + "jno", + "jnp", + "jns", + "jnz", + "jo", + "jp", + "jpe", + "jpo", + "js", + "jz", + "ja", + "jae", + "jb", + "jbe", + "jc", + "je", + "jz", + "jg", + "jge", + "jl", + "jle", + "jna", + "jnae", + "jnb", + "jnbe", + "jnc", + "jne", + "jng", + "jnge", + "jnl", + "jnle", + "jno", + "jnp", + "jns", + "jnz", + "jo", + "jp", + "jpe", + "jpo", + "js", + "jz", +} + +SH2_BRANCH_INSTRUCTIONS = { + "bf", + "bf.s", + "bt", + "bt.s", + "bra", + "bsr", +} + +MIPS_SETTINGS = ArchSettings( + name="mips", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"<.*>"), + # Includes: + # - General purpose registers v0..1, a0..7, t0..9, s0..8, zero, at, fp, k0..1/kt0..1 + # - Float registers f0..31, or fv0..1, fa0..7, ft0..15, fs0..8 plus odd complements + # (actually used number depends on ABI) + # sp, gp should not be in this list + re_reg=re.compile(r"\$?\b([astv][0-9]|at|f[astv]?[0-9]+f?|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|got|gp_rel|call16)\([^)]*\)" + ), + 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({"j", "jal"}), + delay_slot_instructions=MIPS_BRANCH_INSTRUCTIONS.union({"j", "jal", "jr", "jalr"}), + proc=AsmProcessorMIPS, +) + +MIPSEL_SETTINGS = replace(MIPS_SETTINGS, name="mipsel", big_endian=False) + +MIPSEE_SETTINGS = replace( + MIPSEL_SETTINGS, name="mipsee", arch_flags=["-m", "mips:5900"] +) + +MIPS_ARCH_NAMES = {"mips", "mipsel", "mipsee"} + +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"(?|//.*$)"), + # r1 not included + re_reg=re.compile(r"\$?\b([rf](?:[02-9]|[1-9][0-9]+)|f1)\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)|[^ \t,]+@(l|ha|h|sda21)" + ), + re_reloc=re.compile(r"R_PPC_"), + arch_flags=["-m", "powerpc", "-M", "broadway"], + branch_instructions=PPC_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=PPC_BRANCH_INSTRUCTIONS.union({"bl"}), + proc=AsmProcessorPPC, +) + +I686_SETTINGS = ArchSettings( + name="i686", + re_int=re.compile(r"[0-9]+"), + re_comment=re.compile(r"<.*>"), + # Includes: + # - (e)a-d(x,l,h) + # - (e)s,d,b(i,p)(l) + # - cr0-7 + # - x87 st + # - MMX, SSE vector registers + # - cursed registers: eal ebl ebh edl edh... + re_reg=re.compile( + r"\%?\b(e?(([sd]i|[sb]p)l?|[abcd][xhl])|[cdesfg]s|cr[0-7]|x?mm[0-7]|st)\b" + ), + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_sprel=re.compile(r"-?(0x[0-9a-f]+|[0-9]+)(?=\((%ebp|%esi)\))"), + re_imm=re.compile(r"-?(0x[0-9a-f]+|[0-9]+)"), + re_reloc=re.compile(r"R_386_"), + # The x86 architecture has a variable instruction length. The raw bytes of + # an instruction as displayed by objdump can line wrap if it's long enough. + # This destroys the objdump output processor logic, so we avoid this. + arch_flags=["-m", "i386", "--no-show-raw-insn"], + branch_instructions=I686_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=I686_BRANCH_INSTRUCTIONS.union({"mov"}), + proc=AsmProcessorI686, +) + +SH2_SETTINGS = ArchSettings( + name="sh2", + # match -128-127 preceded by a '#' with a ',' after (8 bit immediates) + re_int=re.compile(r"(?<=#)(-?(?:1[01][0-9]|12[0-8]|[1-9][0-9]?|0))(?=,)"), + # match , match ! and after + re_comment=re.compile(r"<.*?>|!.*"), + # - r0-r15 general purpose registers, r15 is stack pointer during exceptions + # - sr, gbr, vbr - control registers + # - mach, macl, pr, pc - system registers + re_reg=re.compile(r"r1[0-5]|r[0-9]"), + # sh2 has pc-relative and gbr-relative but not stack-pointer-relative + re_sprel=re.compile(r"(?<=,)([0-9]+|0x[0-9a-f]+)\(sp\)"), + # max immediate size is 8-bit + re_large_imm=re.compile(r"-?[1-9][0-9]{2,}|-?0x[0-9a-f]{3,}"), + re_imm=re.compile(r"\b0[xX][0-9a-fA-F]+\b"), + # https://github.com/bminor/binutils-gdb/blob/master/bfd/elf32-sh-relocs.h#L21 + re_reloc=re.compile(r"R_SH_"), + arch_flags=["-m", "sh2"], + branch_instructions=SH2_BRANCH_INSTRUCTIONS, + instructions_with_address_immediates=SH2_BRANCH_INSTRUCTIONS.union( + {"bf", "bf.s", "bt", "bt.s", "bra", "bsr"} + ), + delay_slot_instructions=SH2_BRANCH_INSTRUCTIONS.union( + {"bf.s", "bt.s", "bra", "braf", "bsr", "bsrf", "jmp", "jsr", "rts"} + ), + proc=AsmProcessorSH2, +) + +ARCH_SETTINGS = [ + MIPS_SETTINGS, + MIPSEL_SETTINGS, + MIPSEE_SETTINGS, + ARM32_SETTINGS, + ARMEL_SETTINGS, + AARCH64_SETTINGS, + PPC_SETTINGS, + I686_SETTINGS, + SH2_SETTINGS, +] + + +def hexify_int(row: str, pat: Match[str], arch: ArchSettings) -> str: + full = pat.group(0) + + # sh2 only has 8-bit immediates, just convert them uniformly without + # any -hex stuff + if arch.name == "sh2": + return hex(int(full) & 0xFF) + + 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]: + # Pick out the last argument + 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 :] + # Move an optional ($reg) part of it to 'after' + ind2 = after.find("(") + if ind2 == -1: + imm, after = after, "" + else: + imm, after = after[:ind2], after[ind2:] + return before, imm, after + + +def reloc_addend_from_imm(imm: str, before: str, arch: ArchSettings) -> str: + """For architectures like MIPS where relocations have addends embedded in + the code as immediates, convert such an immediate into an addition/ + subtraction that can occur just after the symbol.""" + # TODO this is incorrect for MIPS %lo/%hi which need to be paired up + # and combined. In practice, this means we only get symbol offsets within + # %lo, while %hi just shows the symbol. Unfortunately, objdump's output + # loses relocation order, so we cannot do this without parsing ELF relocs + # ourselves... + mnemonic = before.split()[0] + if mnemonic in arch.instructions_with_address_immediates: + addend = int(imm, 16) + else: + addend = int(imm, 0) + if addend == 0: + return "" + elif addend < 0: + return hex(addend) + else: + return "+" + hex(addend) + + +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 + symbol: Optional[str] = None + 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) + 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] = [] + 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 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") + line_num = eval_line_num(line_num_str.strip()) + + # TODO: use --no-show-raw-insn for all arches + if arch.name == "i686": + row = "\t".join(tabs[1:]) + else: + row = "\t".join(tabs[2:]) + + 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() + args = row_parts[1].strip() if len(row_parts) >= 2 else "" + + next_line = lines[i] if i < len(lines) else None + mnemonic, args = processor.pre_process(mnemonic, args, next_line) + row = mnemonic + "\t" + args.replace("\t", " ") + + addr = "" + if mnemonic in arch.instructions_with_address_immediates: + row, addr = split_off_address(row) + # objdump prefixes addresses with 0x/-0x if they don't resolve to some + # symbol + offset. Strip that. + addr = addr.replace("0x", "") + + row = re.sub(arch.re_int, lambda m: hexify_int(row, m, arch), row) + row += addr + + # Let 'original' be 'row' with relocations applied, while we continue + # transforming 'row' into a coarser version that ignores registers and + # immediates. + original = row + + symbol = None + while i < len(lines): + reloc_row = lines[i] + if re.search(arch.re_reloc, reloc_row): + original, reloc_symbol = processor.process_reloc(reloc_row, original) + if reloc_symbol is not None: + symbol = reloc_symbol + else: + break + i += 1 + + is_text_relative_j = False + if ( + arch.name in MIPS_ARCH_NAMES + and mnemonic == "j" + and symbol is not None + and symbol.startswith(".text") + ): + symbol = None + original = row + is_text_relative_j = True + + 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) + + row = re.sub(arch.re_reg, "", row) + row = re.sub(arch.re_sprel, "addr(sp)", 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 or is_text_relative_j + ) and symbol is None: + x86_longjmp = re.search(r"\*(.*)\(", args) + if x86_longjmp: + capture = x86_longjmp.group(1) + if capture != "": + branch_target = int(capture, 16) + else: + branch_target = int(args.split(",")[-1], 16) + + output.append( + Line( + mnemonic=mnemonic, + diff_row=row, + original=original, + normalized_original=normalized_original, + scorable_line=scorable_line, + symbol=symbol, + 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_at_ret and processor.is_end_of_function(mnemonic, args): + 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 check_for_symbol_mismatch( + old_line: Line, new_line: Line, symbol_map: Dict[str, str] +) -> bool: + + assert old_line.symbol is not None + assert new_line.symbol is not None + + if new_line.symbol.startswith("%hi"): + return False + + if old_line.symbol not in symbol_map: + symbol_map[old_line.symbol] = new_line.symbol + return False + elif symbol_map[old_line.symbol] == new_line.symbol: + return False + + return True + + +def field_matches_any_symbol(field: str, arch: ArchSettings) -> bool: + if arch.name == "ppc": + if "..." in field: + return True + + parts = field.rsplit("@", 1) + if len(parts) == 2 and parts[1] in {"l", "h", "ha", "sda21"}: + field = parts[0] + + return re.fullmatch((r"^@\d+$"), field) is not None + + if arch.name in MIPS_ARCH_NAMES: + return "." in field + + # Example: ".text+0x34" + if arch.name == "arm32": + return "." in field + + return False + + +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) + if len(parts) < 2: + parts.append("") + off = len(line) - len(parts[-1].strip()) + 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": + return diff_sequences_difflib(seq1, seq2) + + # The Levenshtein library assumes that we compare strings, not lists. Convert. + 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) + + try: + rem1 = remap(seq1) + rem2 = remap(seq2) + except ValueError: + if len(seq1) + len(seq2) < 0x110000: + raise + # If there are too many unique elements, chr() doesn't work. + # Assume this is the case and fall back to difflib. + return diff_sequences_difflib(seq1, 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 diff_sameline( + old_line: Line, new_line: Line, config: Config, symbol_map: Dict[str, str] +) -> Tuple[int, int, bool]: + + old = old_line.scorable_line + new = new_line.scorable_line + if old == new: + return (0, 0, False) + + num_stack_penalties = 0 + num_regalloc_penalties = 0 + has_symbol_mismatch = False + + 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) + num_stack_penalties += abs(oldrel - newrel) + ignore_last_field = True + + # Probably regalloc difference, or signed vs unsigned + + # Compare each field in order + new_parts, old_parts = new.split(None, 1), old.split(None, 1) + newfields, oldfields = new_parts[1].split(","), old_parts[1].split(",") + if ignore_last_field: + newfields = newfields[:-1] + oldfields = oldfields[:-1] + else: + # If the last field has a parenthesis suffix, e.g. "0x38(r7)" + # we split that part out to make it a separate field + # however, we don't split if it has a proceeding % macro, e.g. "%lo(.data)" + re_paren = re.compile(r"(? int: + # This logic is copied from `scorer.py` from the decomp permuter project + # https://github.com/simonlindholm/decomp-permuter/blob/main/src/scorer.py + num_stack_penalties = 0 + num_regalloc_penalties = 0 + num_reordering_penalties = 0 + num_insertion_penalties = 0 + num_deletion_penalties = 0 + deletions = [] + insertions = [] + + 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: + sp, rp, _ = diff_sameline(line1, line2, config, symbol_map) + num_stack_penalties += sp + num_regalloc_penalties += rp + 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) + num_insertion_penalties += ins - common + num_deletion_penalties += dels - common + num_reordering_penalties += common + + return ( + num_stack_penalties * config.penalty_stackdiff + + num_regalloc_penalties * config.penalty_regalloc + + num_reordering_penalties * config.penalty_reordering + + num_insertion_penalties * config.penalty_insertion + + num_deletion_penalties * config.penalty_deletion + ) + + +@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] = [] + symbol_map: Dict[str, str] = {} + + 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) + + 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 + 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) + + # Adjust the branch target for scoring and three-way diffing. + norm2, norm_branch2 = split_off_address(line2.normalized_original) + if norm_branch2 != "": + retargetted = hex(line2_target[0]).replace("0x", "") + if line2_target[1] != 0: + retargetted += f"+{line2_target[1]}" + line2.normalized_original = norm2 + retargetted + sc_base, _ = split_off_address(line2.scorable_line) + line2.scorable_line = sc_base + retargetted + 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 + ): + ( + stack_penalties, + regalloc_penalties, + has_symbol_mismatch, + ) = diff_sameline(line1, line2, config, symbol_map) + + if ( + regalloc_penalties == 0 + and stack_penalties == 0 + and not has_symbol_mismatch + ): + # 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) + cats = config.reg_categories + if cats and any( + cats.get(of.group()) != cats.get(nf.group()) + for (of, nf) in zip( + out1.finditer(arch.re_reg), out2.finditer(arch.re_reg) + ) + ): + sym_color = BasicFormat.REGISTER_CATEGORY + line_prefix = "R" + else: + sym_color = BasicFormat.REGISTER + line_prefix = "r" + line_color1 = line_color2 = sym_color + + 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 :] + + score = score_diff_lines(diffed_lines, config, symbol_map) + max_score = len(lines1) * config.penalty_deletion + 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) -> TableData: + headers: Tuple[Text, ...] + diff_lines: List[Tuple[OutputLine, ...]] + padding = " " * 7 if config.show_line_numbers else " " * 2 + + if config.diff_mode in (DiffMode.THREEWAY_PREV, DiffMode.THREEWAY_BASE): + 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 + ] + 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 + elif config.diff_mode in (DiffMode.SINGLE, DiffMode.SINGLE_BASE): + header = Text("BASE" if config.diff_mode == DiffMode.SINGLE_BASE else "CURRENT") + diff_lines = [(line,) for line in new_diff.lines] + headers = (header,) + # Scoring is disabled for view mode + current_score = 0 + max_score = 0 + previous_score = None + else: + diff_lines = [(line, line) for line in new_diff.lines] + headers = ( + Text("TARGET"), + Text(f"{padding}CURRENT ({new_diff.score})"), + ) + current_score = new_diff.score + max_score = new_diff.max_score + previous_score = None + if config.compress: + diff_lines = compress_matching(diff_lines, config.compress.context) + + def diff_line_to_table_line(line: Tuple[OutputLine, ...]) -> TableLine: + cells = [ + (line[0].base or Text(), line[0].line1), + ] + for ol in line[1:]: + cells.append((ol.fmt2, ol.line2)) + + return TableLine( + key=line[0].key2, + is_data_ref=line[0].is_data_ref, + cells=tuple(cells), + ) + + return TableData( + headers=headers, + current_score=current_score, + max_score=max_score, + previous_score=previous_score, + lines=[diff_line_to_table_line(line) for line in 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) + + if self.config.diff_mode == DiffMode.SINGLE_BASE: + diff_output = do_diff(self.base_lines, self.base_lines, self.config) + elif self.config.diff_mode == DiffMode.SINGLE: + diff_output = do_diff(my_lines, my_lines, self.config) + else: + diff_output = do_diff(self.base_lines, my_lines, self.config) + + last_diff_output = self.last_diff_output or diff_output + if self.config.diff_mode != DiffMode.THREEWAY_BASE or not self.last_diff_output: + self.last_diff_output = diff_output + + data = align_diffs(last_diff_output, diff_output, self.config) + output = self.config.formatter.table(data) + + 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.diff_mode in (DiffMode.THREEWAY_BASE, DiffMode.THREEWAY_PREV) + 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() + elif config.diff_mode != DiffMode.SINGLE: + basedump = run_objdump(basecmd, config, project) + else: + basedump = "" + + 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/tools/asm-differ/diff_settings.py b/tools/asm-differ/diff_settings.py new file mode 100644 index 0000000..19d67d5 --- /dev/null +++ b/tools/asm-differ/diff_settings.py @@ -0,0 +1,12 @@ +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, mw, ms + # config["build_dir"] = "build/" # only needed for mw and ms map format + # config["expected_dir"] = "expected/" # needed for -o + # config["makeflags"] = [] + # config["objdump_executable"] = "" diff --git a/tools/asm-differ/mypy.ini b/tools/asm-differ/mypy.ini new file mode 100644 index 0000000..138b939 --- /dev/null +++ b/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/tools/asm-differ/poetry.lock b/tools/asm-differ/poetry.lock new file mode 100644 index 0000000..2826d78 --- /dev/null +++ b/tools/asm-differ/poetry.lock @@ -0,0 +1,321 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "ansiwrap" +version = "0.8.4" +description = "textwrap, but savvy to ANSI colors and styles" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ansiwrap-0.8.4-py2.py3-none-any.whl", hash = "sha256:7b053567c88e1ad9eed030d3ac41b722125e4c1271c8a99ade797faff1f49fb1"}, + {file = "ansiwrap-0.8.4.zip", hash = "sha256:ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7"}, +] + +[package.dependencies] +textwrap3 = ">=0.9.2" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cxxfilt" +version = "0.3.0" +description = "Python interface to c++filt / abi::__cxa_demangle" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cxxfilt-0.3.0-py2.py3-none-any.whl", hash = "sha256:774e85a8d0157775ed43276d89397d924b104135762d86b3a95f81f203094e07"}, + {file = "cxxfilt-0.3.0.tar.gz", hash = "sha256:7df6464ba5e8efbf0d8974c0b2c78b32546676f06059a83515dbdfa559b34214"}, +] + +[package.extras] +test = ["pytest (>=3.0.0)"] + +[[package]] +name = "levenshtein" +version = "0.20.9" +description = "Python extension for computing string edit distances and similarities." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Levenshtein-0.20.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:105c239ec786750cd5136991c58196b440cc39b6acf3ec8227f6562c9a94e4b9"}, + {file = "Levenshtein-0.20.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f7728bea7fe6dc55ceecde0dcda4287e74fe3b6733ad42530f46aaa8d2f81d0"}, + {file = "Levenshtein-0.20.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc7eca755c13c92814c8cce8175524cf764ce38f39228b602f59eac58cfdc51a"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8a552e79d053dc1324fb90d342447fd4e15736f4cbc5363b6fbd5577f53dce9"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5474b2681ee0b7944fb1e7fe281cd44e2dfe75b03ba4558dca49c96fa0861b62"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56e132c203b0dd8fc72a33e791c39ad0d5a25bcf24b130a1e202abbf489a3e75"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3badc94708ac05b405e795fde58a53272b90a9ee6099ecd54a345658b7b812e1"}, + {file = "Levenshtein-0.20.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48b9b3ae095b14dad7bc4bd219c7cd9113a7aa123a033337c85b00fe2ed565d3"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0d3a1f7328c91caeb1f857ddd2787e3f19d60cc2c688339d249ca8841da61454"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ef67c50428c99caf67d31bd209da21d9378da5f0cc3ad4f7bafb6caa78aee6f2"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:47f6d1592c0891f7355e38a302becd233336ca2f55f9a8be3a8635f946a6784f"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2891019740e874f05e0349e9f27b6af8ad837b1612f42e9c90c296d54d1404fd"}, + {file = "Levenshtein-0.20.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c554704eec4f4ba742febdcc79a85491f8f9a1d493cb103bb2af18536d6cf122"}, + {file = "Levenshtein-0.20.9-cp310-cp310-win32.whl", hash = "sha256:7628e356b3f9c78ad7272c3b9137f0641a1368849e749ff6f2c8fe372795806b"}, + {file = "Levenshtein-0.20.9-cp310-cp310-win_amd64.whl", hash = "sha256:ba2bafe3511194a37044cae4e7d328cca70657933052691c37eba2ca428a379d"}, + {file = "Levenshtein-0.20.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7605a94145198d19fdaaa7e29c0f8a56ad719b12386f3ae8cd8ed4cb9fa6c2e4"}, + {file = "Levenshtein-0.20.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29db4dabfad2ddf33c7986eb6fd525c7587cca4c4d9e187365cff0a5281f5a35"}, + {file = "Levenshtein-0.20.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:965336c1772a4fc5fb2686a2a0bfaf3455dced96f19f50f278da8bc139076d31"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67235753035ac898d6475c0b29540521018db2e0027a3c1deb9aa0af0a84fd74"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:120dca58136aee3d8c7b190e30db7b6a6eb9579ea5712df84ad076a389801743"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6496ea66a6f755e48c0d82f1eee396d16edcd5592d4b3677d26fa789a636a728"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0af20327acc2c904d11611cb3a0d8d17f80c279a12e0b84189eafc35297186d"}, + {file = "Levenshtein-0.20.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d2f891ef53afbab6cf2eeb92ff13151884d17dc80a2d6d3c7ae74d7738b772"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2ab9c72380582bf4745d1c5b055b1df0c85f7a980a04bd7603a855dd91478c0f"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6de13be3eb5ac48053fb1635a7b4daa936b9114ad4b264942e9eb709fcaa41dd"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a9fc296860588251d8d72b4f4637cca4eef7351e042a7a23d44e6385aef1e160"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:35777b20fe35858248c22da37984469e6dd1278f55d17c53378312853d5d683d"}, + {file = "Levenshtein-0.20.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6b9e0642ddb4c431f77c38cec9edbd0317e26c3f37d072ccf281ab58926dce69"}, + {file = "Levenshtein-0.20.9-cp311-cp311-win32.whl", hash = "sha256:f88ec322d86d3cc9d3936dbf6b421ad813950c2658599d48ac4ede59f2a6047e"}, + {file = "Levenshtein-0.20.9-cp311-cp311-win_amd64.whl", hash = "sha256:2907a6888455f9915d5b656f5d058f63eaf6063b2c7f0f1ff6bc05706ae5bc39"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6bcebc79760be08488cb921732af34ade6abc7476a94866881c68b45ec4b6c82"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d8d4f3825d1d8f3b19382537a8536e689cf57aaa224d2cb4f44cf844811885"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d40e18a5817ee7f0675401613a26c492fd4ea68d2103c1480fb5a6ab1b8763d"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d258f3d44f6bac17f33002fea34570049507d3476c3716b5267170c666b20b4"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c621e0c389546147ed43c33ca4168de0f91c920508ab8a94a400835fa084f486"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a31527dc7994353091626e62b7d82d53290cb00df48d3e5d29cb291fb4c03c"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:129c8f192e656b7c2c543bf0d704d677720771b8bc2f30c50db02fbc2001bac2"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5a01fca58255be6bf724a40af2575d7cf644c099c28a00d1f5f6a81675e60e7d"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:4c13749ea39a228f05d5bd9d473e76f726fc2dcd493cafc322f740921a6eeffb"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:69daa0f8eefa5b947255a81346741ed86fe7030e0909741dbd978e38b30da3fd"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fcc78a73ed423bbb09ac902dd2e1ff1094d159d1c6766e5e52da5f376a4cba18"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-win32.whl", hash = "sha256:d82ae57982a9f33c55778f1f0f63d5e51e291aee236abed3b90497578b944202"}, + {file = "Levenshtein-0.20.9-cp36-cp36m-win_amd64.whl", hash = "sha256:4082379b406752fc1173ed1f8c3a122c5d5491e10e564ed721602e4e049e3d4c"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cb499783b7126e6fc45c39ab34c8114148425c5d975b1ce35e6c47c0eda58a94"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ce747b296aad3bd8a563cccf2119cf37bf72f668076bfdad6ec55f0a0596dd9"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1347c3ebbe8f42f7a487e8d23a95bde6529379b4939ad51d32246d001565c499"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a2f1c1e8360603a6da29416da61d1907a27656843e269413091c8c3a3e6286e"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73c1caaedbee3617fd29139aac8dab7743776b59c3c1fed2790308ecb43c7b25"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1f24133df69f8b618fc508d6023695130ad3c3c8968ef43aaeca21835eb337a"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cf7260722f8170c09af5cfa714bb45626a4dfc85d71d1c1c9c52c2a6901cc501"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:01668178fd9244df290db0340293982fe7641162a12a35ad9ffb3fe145ce6377"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:1e46f9d3483dc4991ac60ff3711b0d40f93e352cc8edc16b68df57ccc472bd6c"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:680cd250dc1875eb80cf2a0cca742bd13f6f9ab11c48317244fcc483eba1dd67"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2346e2f7dfbbc2936bd81e19f7734984e72486ffc086760c897b39b9f674b2fa"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-win32.whl", hash = "sha256:7f31bcf257fec9719d0d97185c419d315f6f20a194f0b442919e352d19418b2e"}, + {file = "Levenshtein-0.20.9-cp37-cp37m-win_amd64.whl", hash = "sha256:48262bc9830ad60de96411fcb2e96a522c7206e7069169e04d89dd79364a7722"}, + {file = "Levenshtein-0.20.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eba5696e1f8e8da225498fd1d743886d639400cafd0e5be3c553978cbb54c345"}, + {file = "Levenshtein-0.20.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:679333188f9791c85109d2981e97e8721a99b2b975b5c52d16aca50ac9c70757"}, + {file = "Levenshtein-0.20.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06c9cfc61cf66833692d1ed258ec5a0871221b0779f1281c32a10348c492e2c5"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5d80d949168df406f2ac9ade1a5d0419cef0a8df611c8c2efe88f0248c9d0c0"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9275c6e601ff7f659116e2235e8585950c9c39d72504006077be85bf27950b35"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6414eea342d9632045e12b66bef043dbc6557189a283dc4dcc5966f63fa48998"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56571c58700600a382ecdf3f9efcb132ed16a0476cbb4e23a9478ab0ae788fd9"}, + {file = "Levenshtein-0.20.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7ccb76ffd9b851384f9cf1595b90b17cae46f0ab895e234de11ea48f9d9f73a"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109172943cff7fb10f28a9eb819eb3eaf9c88fe38661fb1d0f230a8ae68a615c"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:534c8bbdfd033fa20575d57332d9ac0447b5afbeca7db975ba169762ece2051f"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:381a725963c392585135654caa3c7fc32cb1755ed977fb9db72e8838fee261be"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7e4a44b1223980a9880e6f2bbf19121a125928580df9e4e81207199190343e11"}, + {file = "Levenshtein-0.20.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc0ced58ee6d07351cde140a7ec88e5f2ceb053c805af1f90514d21914d21cad"}, + {file = "Levenshtein-0.20.9-cp38-cp38-win32.whl", hash = "sha256:5eec0868ffcd825564dd5e3399305eaa159220554d1aedbff13af0de1fe01f6c"}, + {file = "Levenshtein-0.20.9-cp38-cp38-win_amd64.whl", hash = "sha256:e9db476e40a3aa184631d102b716a019f70837eb0fcdd5b5d1504f099f91359c"}, + {file = "Levenshtein-0.20.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d5a20ecc20a09a32c72128c43d7df23877a2469b3c17780ae83f9a9d55873c08"}, + {file = "Levenshtein-0.20.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b7b772f2f62a19a15ccb1b09c6c7754ca7430bb7e19d4ca4ff232958786873b"}, + {file = "Levenshtein-0.20.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af92326b90ea6fe4521cf6a5dfe450e21150393c573ef3ad9ee446f1009fbfbd"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b48554dad328e198a636f937e2f4c057aac8e4bfcb8467b10e0f5daa94307b17"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82304821e128d5453d1755d1c2f3d9cdf75e9def3517cf913b09df174e20283b"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2052357c5da195ede7dbc81a4e3408ebd6374a1ff1b86a0a9d8b8ce9562b32c3"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d60c6b47ccd6841c990418f7f4f58c28f7da9b07b81eaafc99b836cf351df1"}, + {file = "Levenshtein-0.20.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dc2194c917e4466cb604580b16e42286f04e3fe0424489459e68f0834f5c527"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb1e20965d759d89318cac7ff7eb045eb1fafcb5c3fa3047a23f6ae20c810ad7"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74e959035da10a54e7a2eee28408eff672297ce96cdadd6f4a2f269a06e395c4"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4a441b23d9704f57eb34af6a300ae5c335b9e77e6a065ada36ca69d6fc582af9"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f59470c49114a5da064712a427317f2b1fa5bb89aa2dfd0e300f8289e26aec28"}, + {file = "Levenshtein-0.20.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:06191f5d0527e3224107aea260b5cffc8a78722e0efb4e793f0e45c449b813a2"}, + {file = "Levenshtein-0.20.9-cp39-cp39-win32.whl", hash = "sha256:3235c461904fe94b4f62fee78a1658c1316344411c81b02400c27d692a893f8f"}, + {file = "Levenshtein-0.20.9-cp39-cp39-win_amd64.whl", hash = "sha256:8b852def43d165c2f2b468239d66b847d9e6f52a775fc657773ced04d26062bd"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f674cc75f127692525563155e500a3fa16aaf24dafd33a9bcda46e2979f793a1"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a34e3fd21acb31fcd29a0c8353dca74dfbb59957210a6f142505907a9dff3d59"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0ddddf2beafd1a2e17a87f80be562a7f7478e6098ccfc15de4c879972dfa2f9"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9649af1a896a4a7fc7f6f1fd093e8a92f463297f56c7bd0f8d7d16dfabeb236d"}, + {file = "Levenshtein-0.20.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d7bd7f25336849027fbe5ed32b6ffd404436727d78a014e348dcd17347c73fd8"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0371d996ae81089296f42b6e886c7bf138d1cb0f002b0c724a9e5d689b29b5a0"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7e00e2fda9f225b5f4537647f6195cf220d468532739d3390eaf082b1d76c87"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1600f5ebe2f2aebf13e88cf488ec2e5ce25f7a42b5846335018693baf4ea63bd"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bcd59fcf06aaedda98da185ec289dc2c2c9922ce789f6a9c101709d4a22cac9"}, + {file = "Levenshtein-0.20.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:1549e307028fa5c3a8cf28ae8bcb1f6072df2abf7f36b9d7adf7fd60690fe372"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:795f2e95d09a33c66c73cd49be3ee632fb4b8c41be72c0cb8df29a329ce7d111"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:726bfb361d3b6786bea31392752f0ffcca568db7dc3f1e274f1b529489b8ad05"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0fd315132786375de532355fa06b2f11c4b4af5784b7e064dc54b6ee0c3281"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0674bc0549d5ea9edb934b3b03a160a116cc410feb5739a51f9c4f618ee674e3"}, + {file = "Levenshtein-0.20.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1ef8f3ecdfca5d6f0538226338d58617270439a1cc9b6cacb30a388984bb1608"}, + {file = "Levenshtein-0.20.9.tar.gz", hash = "sha256:70a8ad5e28bb76d87da1eb3f31de940836596547d6d01317c2289f5b7cd0b0ea"}, +] + +[package.dependencies] +rapidfuzz = ">=2.3.0,<3.0.0" + +[[package]] +name = "rapidfuzz" +version = "2.15.1" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc0bc259ebe3b93e7ce9df50b3d00e7345335d35acbd735163b7c4b1957074d3"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d59fb3a410d253f50099d7063855c2b95df1ef20ad93ea3a6b84115590899f25"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c525a3da17b6d79d61613096c8683da86e3573e807dfaecf422eea09e82b5ba6"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4deae6a918ecc260d0c4612257be8ba321d8e913ccb43155403842758c46fbe"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2577463d10811386e704a3ab58b903eb4e2a31b24dfd9886d789b0084d614b01"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f67d5f56aa48c0da9de4ab81bffb310683cf7815f05ea38e5aa64f3ba4368339"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7927722ff43690e52b3145b5bd3089151d841d350c6f8378c3cfac91f67573a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6534afc787e32c4104f65cdeb55f6abe4d803a2d0553221d00ef9ce12788dcde"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d0ae6ec79a1931929bb9dd57bc173eb5ba4c7197461bf69e3a34b6dd314feed2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be7ccc45c4d1a7dfb595f260e8022a90c6cb380c2a346ee5aae93f85c96d362b"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:8ba013500a2b68c64b2aecc5fb56a2dad6c2872cf545a0308fd044827b6e5f6a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4d9f7d10065f657f960b48699e7dddfce14ab91af4bab37a215f0722daf0d716"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7e24a1b802cea04160b3fccd75d2d0905065783ebc9de157d83c14fb9e1c6ce2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win32.whl", hash = "sha256:dffdf03499e0a5b3442951bb82b556333b069e0661e80568752786c79c5b32de"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d150d90a7c6caae7962f29f857a4e61d42038cfd82c9df38508daf30c648ae7"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_arm64.whl", hash = "sha256:87c30e9184998ff6eb0fa9221f94282ce7c908fd0da96a1ef66ecadfaaa4cdb7"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6986413cb37035eb796e32f049cbc8c13d8630a4ac1e0484e3e268bb3662bd1b"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a72f26e010d4774b676f36e43c0fc8a2c26659efef4b3be3fd7714d3491e9957"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5cd54c98a387cca111b3b784fc97a4f141244bbc28a92d4bde53f164464112e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7fac7c3da39f93e6b2ebe386ed0ffe1cefec91509b91857f6e1204509e931f"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f976e76ac72f650790b3a5402431612175b2ac0363179446285cb3c901136ca9"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abde47e1595902a490ed14d4338d21c3509156abb2042a99e6da51f928e0c117"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca8f1747007a3ce919739a60fa95c5325f7667cccf6f1c1ef18ae799af119f5e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35da09ab9797b020d0d4f07a66871dfc70ea6566363811090353ea971748b5a"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3a769ca7580686a66046b77df33851b3c2d796dc1eb60c269b68f690f3e1b65"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d50622efefdb03a640a51a6123748cd151d305c1f0431af762e833d6ffef71f0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b7461b0a7651d68bc23f0896bffceea40f62887e5ab8397bf7caa883592ef5cb"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:074ee9e17912e025c72a5780ee4c7c413ea35cd26449719cc399b852d4e42533"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7025fb105a11f503943f17718cdb8241ea3bb4d812c710c609e69bead40e2ff0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win32.whl", hash = "sha256:2084d36b95139413cef25e9487257a1cc892b93bd1481acd2a9656f7a1d9930c"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:5a738fcd24e34bce4b19126b92fdae15482d6d3a90bd687fd3d24ce9d28ce82d"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:dc3cafa68cfa54638632bdcadf9aab89a3d182b4a3f04d2cad7585ed58ea8731"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c53d57ba7a88f7bf304d4ea5a14a0ca112db0e0178fff745d9005acf2879f7d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6ee758eec4cf2215dc8d8eafafcea0d1f48ad4b0135767db1b0f7c5c40a17dd"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d93ba3ae59275e7a3a116dac4ffdb05e9598bf3ee0861fecc5b60fb042d539e"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c3ff75e647908ddbe9aa917fbe39a112d5631171f3fcea5809e2363e525a59d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d89c421702474c6361245b6b199e6e9783febacdbfb6b002669e6cb3ef17a09"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f69e6199fec0f58f9a89afbbaea78d637c7ce77f656a03a1d6ea6abdc1d44f8"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:41dfea282844d0628279b4db2929da0dacb8ac317ddc5dcccc30093cf16357c1"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2dd03477feefeccda07b7659dd614f6738cfc4f9b6779dd61b262a73b0a9a178"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5efe035aa76ff37d1b5fa661de3c4b4944de9ff227a6c0b2e390a95c101814c0"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ed2cf7c69102c7a0a06926d747ed855bc836f52e8d59a5d1e3adfd980d1bd165"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a0e441d4c2025110ec3eba5d54f11f78183269a10152b3a757a739ffd1bb12bf"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win32.whl", hash = "sha256:a4a54efe17cc9f53589c748b53f28776dfdfb9bc83619685740cb7c37985ac2f"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:bb8318116ecac4dfb84841d8b9b461f9bb0c3be5b616418387d104f72d2a16d1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e9296c530e544f68858c3416ad1d982a1854f71e9d2d3dcedb5b216e6d54f067"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:49c4bcdb9238f11f8c4eba1b898937f09b92280d6f900023a8216008f299b41a"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb40a279e134bb3fef099a8b58ed5beefb201033d29bdac005bddcdb004ef71"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7381c11cb590bbd4e6f2d8779a0b34fdd2234dfa13d0211f6aee8ca166d9d05"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfdcdedfd12a0077193f2cf3626ff6722c5a184adf0d2d51f1ec984bf21c23c3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85bece1ec59bda8b982bd719507d468d4df746dfb1988df11d916b5e9fe19e8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b393f4a1eaa6867ffac6aef58cfb04bab2b3d7d8e40b9fe2cf40dd1d384601"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53de456ef020a77bf9d7c6c54860a48e2e902584d55d3001766140ac45c54bc7"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2492330bc38b76ed967eab7bdaea63a89b6ceb254489e2c65c3824efcbf72993"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:099e4c6befaa8957a816bdb67ce664871f10aaec9bebf2f61368cf7e0869a7a1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:46599b2ad4045dd3f794a24a6db1e753d23304699d4984462cf1ead02a51ddf3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:591f19d16758a3c55c9d7a0b786b40d95599a5b244d6eaef79c7a74fcf5104d8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed17359061840eb249f8d833cb213942e8299ffc4f67251a6ed61833a9f2ea20"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win32.whl", hash = "sha256:aa1e5aad325168e29bf8e17006479b97024aa9d2fdbe12062bd2f8f09080acf8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:c2bb68832b140c551dbed691290bef4ee6719d4e8ce1b7226a3736f61a9d1a83"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3fac40972cf7b6c14dded88ae2331eb50dfbc278aa9195473ef6fc6bfe49f686"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0e456cbdc0abf39352800309dab82fd3251179fa0ff6573fa117f51f4e84be8"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:22b9d22022b9d09fd4ece15102270ab9b6a5cfea8b6f6d1965c1df7e3783f5ff"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46754fe404a9a6f5cbf7abe02d74af390038d94c9b8c923b3f362467606bfa28"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91abb8bf7610efe326394adc1d45e1baca8f360e74187f3fa0ef3df80cdd3ba6"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e40a2f60024f9d3c15401e668f732800114a023f3f8d8c40f1521a62081ff054"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a48ee83916401ac73938526d7bd804e01d2a8fe61809df7f1577b0b3b31049a3"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71580052f9dbac443c02f60484e5a2e5f72ad4351b84b2009fbe345b1f38422"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82b86d5b8c1b9bcbc65236d75f81023c78d06a721c3e0229889ff4ed5c858169"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fc4528b7736e5c30bc954022c2cf410889abc19504a023abadbc59cdf9f37cae"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e1e0e569108a5760d8f01d0f2148dd08cc9a39ead79fbefefca9e7c7723c7e88"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94e1c97f0ad45b05003806f8a13efc1fc78983e52fa2ddb00629003acf4676ef"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47e81767a962e41477a85ad7ac937e34d19a7d2a80be65614f008a5ead671c56"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win32.whl", hash = "sha256:79fc574aaf2d7c27ec1022e29c9c18f83cdaf790c71c05779528901e0caad89b"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:f3dd4bcef2d600e0aa121e19e6e62f6f06f22a89f82ef62755e205ce14727874"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_arm64.whl", hash = "sha256:cac095cbdf44bc286339a77214bbca6d4d228c9ebae3da5ff6a80aaeb7c35634"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b89d1126be65c85763d56e3b47d75f1a9b7c5529857b4d572079b9a636eaa8a7"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7460e91168229768be882ea365ba0ac7da43e57f9416e2cfadc396a7df3c2"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c33c03e7092642c38f8a15ca2d8fc38da366f2526ec3b46adf19d5c7aa48ba"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040faca2e26d9dab5541b45ce72b3f6c0e36786234703fc2ac8c6f53bb576743"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6e2a3b23e1e9aa13474b3c710bba770d0dcc34d517d3dd6f97435a32873e3f28"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e597b9dfd6dd180982684840975c458c50d447e46928efe3e0120e4ec6f6686"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d14752c9dd2036c5f36ebe8db5f027275fa7d6b3ec6484158f83efb674bab84e"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558224b6fc6124d13fa32d57876f626a7d6188ba2a97cbaea33a6ee38a867e31"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c89cfa88dc16fd8c9bcc0c7f0b0073f7ef1e27cceb246c9f5a3f7004fa97c4d"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:509c5b631cd64df69f0f011893983eb15b8be087a55bad72f3d616b6ae6a0f96"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f73a04135a03a6e40393ecd5d46a7a1049d353fc5c24b82849830d09817991f"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99d53138a2dfe8ada67cb2855719f934af2733d726fbf73247844ce4dd6dd5"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f01fa757f0fb332a1f045168d29b0d005de6c39ee5ce5d6c51f2563bb53c601b"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60368e1add6e550faae65614844c43f8a96e37bf99404643b648bf2dba92c0fb"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785744f1270828cc632c5a3660409dee9bcaac6931a081bae57542c93e4d46c4"}, + {file = "rapidfuzz-2.15.1.tar.gz", hash = "sha256:d62137c2ca37aea90a11003ad7dc109c8f1739bfbe5a9a217f3cdb07d7ac00f6"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "textwrap3" +version = "0.9.2" +description = "textwrap from Python 3.6 backport (plus a few tweaks)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "textwrap3-0.9.2-py2.py3-none-any.whl", hash = "sha256:bf5f4c40faf2a9ff00a9e0791fed5da7415481054cef45bb4a3cfb1f69044ae0"}, + {file = "textwrap3-0.9.2.zip", hash = "sha256:5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414"}, +] + +[[package]] +name = "watchdog" +version = "2.3.1" +description = "Filesystem events monitoring" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1f1200d4ec53b88bf04ab636f9133cb703eb19768a39351cee649de21a33697"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:564e7739abd4bd348aeafbf71cc006b6c0ccda3160c7053c4a53b67d14091d42"}, + {file = "watchdog-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95ad708a9454050a46f741ba5e2f3468655ea22da1114e4c40b8cbdaca572565"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a073c91a6ef0dda488087669586768195c3080c66866144880f03445ca23ef16"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa8b028750b43e80eea9946d01925168eeadb488dfdef1d82be4b1e28067f375"}, + {file = "watchdog-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:964fd236cd443933268ae49b59706569c8b741073dbfd7ca705492bae9d39aab"}, + {file = "watchdog-2.3.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:91fd146d723392b3e6eb1ac21f122fcce149a194a2ba0a82c5e4d0ee29cd954c"}, + {file = "watchdog-2.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efe3252137392a471a2174d721e1037a0e6a5da7beb72a021e662b7000a9903f"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85bf2263290591b7c5fa01140601b64c831be88084de41efbcba6ea289874f44"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f2df370cd8e4e18499dd0bfdef476431bcc396108b97195d9448d90924e3131"}, + {file = "watchdog-2.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ea5d86d1bcf4a9d24610aa2f6f25492f441960cf04aed2bd9a97db439b643a7b"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f5d0f7eac86807275eba40b577c671b306f6f335ba63a5c5a348da151aba0fc"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b848c71ef2b15d0ef02f69da8cc120d335cec0ed82a3fa7779e27a5a8527225"}, + {file = "watchdog-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0d9878be36d2b9271e3abaa6f4f051b363ff54dbbe7e7df1af3c920e4311ee43"}, + {file = "watchdog-2.3.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cd61f98cb37143206818cb1786d2438626aa78d682a8f2ecee239055a9771d5"}, + {file = "watchdog-2.3.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d2dbcf1acd96e7a9c9aefed201c47c8e311075105d94ce5e899f118155709fd"}, + {file = "watchdog-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03f342a9432fe08107defbe8e405a2cb922c5d00c4c6c168c68b633c64ce6190"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7a596f9415a378d0339681efc08d2249e48975daae391d58f2e22a3673b977cf"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_armv7l.whl", hash = "sha256:0e1dd6d449267cc7d6935d7fe27ee0426af6ee16578eed93bacb1be9ff824d2d"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_i686.whl", hash = "sha256:7a1876f660e32027a1a46f8a0fa5747ad4fcf86cb451860eae61a26e102c8c79"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64.whl", hash = "sha256:2caf77ae137935c1466f8cefd4a3aec7017b6969f425d086e6a528241cba7256"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:53f3e95081280898d9e4fc51c5c69017715929e4eea1ab45801d5e903dd518ad"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_s390x.whl", hash = "sha256:9da7acb9af7e4a272089bd2af0171d23e0d6271385c51d4d9bde91fe918c53ed"}, + {file = "watchdog-2.3.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8a4d484e846dcd75e96b96d80d80445302621be40e293bfdf34a631cab3b33dc"}, + {file = "watchdog-2.3.1-py3-none-win32.whl", hash = "sha256:a74155398434937ac2780fd257c045954de5b11b5c52fc844e2199ce3eecf4cf"}, + {file = "watchdog-2.3.1-py3-none-win_amd64.whl", hash = "sha256:5defe4f0918a2a1a4afbe4dbb967f743ac3a93d546ea4674567806375b024adb"}, + {file = "watchdog-2.3.1-py3-none-win_ia64.whl", hash = "sha256:4109cccf214b7e3462e8403ab1e5b17b302ecce6c103eb2fc3afa534a7f27b96"}, + {file = "watchdog-2.3.1.tar.gz", hash = "sha256:d9f9ed26ed22a9d331820a8432c3680707ea8b54121ddcc9dc7d9f2ceeb36906"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.7" +content-hash = "f48df5c526c5e9e9b6c8dd83bb06b628c347f616a66670800e3032a83ba50c08" diff --git a/tools/asm-differ/pyproject.toml b/tools/asm-differ/pyproject.toml new file mode 100644 index 0000000..7a112ae --- /dev/null +++ b/tools/asm-differ/pyproject.toml @@ -0,0 +1,21 @@ +[tool.poetry] +name = "asm-differ" +version = "0.1.0" +description = "" +authors = ["Simon Lindholm "] +license = "UNLICENSE" +readme = "README.md" +packages = [{ include = "diff.py" }] + +[tool.poetry.dependencies] +python = "^3.7" +colorama = "^0.4.6" +ansiwrap = "^0.8.4" +watchdog = "^2.2.0" +levenshtein = "^0.20.9" +cxxfilt = "^0.3.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/tools/asm-differ/screenshot.png b/tools/asm-differ/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3230555328cd9acdf388ce1626415ceb78760535 GIT binary patch literal 99842 zcmd431yG#Zx~@w?g1b9Gg1b8j?(Ul4?yezdaCdiicXxMpXxtjt+nIC8T?|I+RzvN^@;bCxKz`(%Z#l?gaz`)*jgWgV15TGr};=9eDAJ8^p z>h@q@2))1G@8YNtaKXSnfr$%!RdPu^S#woWo_ig*yyF8fki`5Th6sk)PK;JWNis|Z zsu^+aDCNg#=!G|=0-dGpsRFN!*d=R5V@HWtjq$!zFb{tE^mFtRRO-tUcq%diOwffV zZ^T4S^`iOdq5b%}ds!X2tgI|Lksp!(6cH8H*o@VW-y=UH*`6J5CQL_(Z*_qu*{tga7bR<#a{)OOf4fWVsTgfN-|O~^HU_AgLGLcgL@F$H4n zWr;G-r0}(Es%!V>?c=6wf1ONQ`%w_<1L{LxpY?I@Q-aQ`neWb-rQz3gs#AUH&UsU< zY)xdWjZP#W(P)lq3pRdOxv<-GjZ?%dMuI)7(gO+PE$QRg!DbZbrc6Ovt=^Fq766-5)c zGoJ(ITpZQBar&%xo?I~-vuyJnJBZ*?jigQ@u}@?ogV3@)qEfx%#l}N|r64mG?-`8F zC|c7jt0s+N&^*JzapP;uL>btv30uhMTA6lvAKR9Z$Y&$&h6d2+Y>bJ=mZsGoa5s;2HN!v8s<;Ip1Pf~_@MNjk&d(l7Sf(N7P_`YCW+gYaKmom&3px9qBtjw3|*?;4C zWYSRGs%><_9@!+@vPfgbZQ1gw9dAhe97l8AtHUX3V!}u0`Y2W}g)=yRVqpgc^@(8# zyTX-TaYA|I>_d|(sgQU~Dt+Q^E9jyoI)Is(F}N?#8#r6M#|}oXTZaGM8>l!KbYZx+ zWFc2-%4&qLqa(Fjac)$@qY-EyBh#wN){174%ry zAqm9t3_bi5842voGw*BplO2k@d(jWyeuN{uoyPw$4`s@$wLCykf6TeBCMWjPzM z%;z6e7*CsAvzNXpNt)f;I+bb;H+x3iZG0TgDY@m+4`3xfTljS^I7TWLRB1HU(Z zcp=R2bPm{VtswGqVfo{lV~W`6#Hw<|7CWS}pz0RHc)XngJ_zMzS9$roDh95$b*p|w zq)2{m^ou2Tw9Oy(K1l~rqilZCk-}CTnLCkx8!9EaE=xK^^?Fm6<1LCdA&rsbu6}vZ$nN3VBk^*_{vTVn6%)|Ofsb!l z-*oP1^F5~!k3DN19EQGb@0und49n(;=)6EeiR zlh&o_FGPZ(o|0;5UT~(mr&Fkd)XGI0nJ|x)-?~F^KIEw+NSN(%%0NP(pkay0O>$;W z2XFC3WM6#KN9QK&m-571d0|efRqK`yQuxeijWy)jBR(EtCmZvZzC4o6}C?EOp=3f`~j66SNK z#;z<<$zn6Qs?!WPyIE2h0xrRMcWcJ|H3KjBP(j@yx?3CDj;;G`S;^`WMZdxlosn?rLJheNxys8Q zPKs6=j$^7Jcn6;C7;TxGO38>&4YAW9A*H3?*-)p=Q1gG6$fkec4&SV4pq(Gije6=GAa zLLusT?mQz}LF+S#H+lJY5*k(8Id^*^zRg;|9^GOICQy+X2xWW+ zJU5l{#Xfg}3w-33rRTArnXJ3Y^4UYkR-B!#82O^HkS?XWikPq>%aF!rIAl(BsmVW< zb}Pm>&}s*-W403IT%z$kHco1EFXov=AD(~Xj6HvGXG{KLS{pMVy{Y@gRZY0p5O>Ur z>+Z}KqTZN)%+r-wyVKZKacHABdkz z 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 literal 0 HcmV?d00001 diff --git a/tools/asm-differ/test.py b/tools/asm-differ/test.py new file mode 100644 index 0000000..c0c2a9c --- /dev/null +++ b/tools/asm-differ/test.py @@ -0,0 +1,185 @@ +import unittest +import diff +import json + +class TestSh2(unittest.TestCase): + def get_config(self): + arch = diff.get_arch('sh2') + formatter = diff.JsonFormatter(arch_str='sh2') + config = diff.Config( + arch=arch, + diff_obj=True, + objfile='', + make=False, + source_old_binutils=True, + diff_section='.text', + inlines=False, + max_function_size_lines=25000, + max_function_size_bytes=100000, + formatter=formatter, + diff_mode=diff.DiffMode.NORMAL, + base_shift=0, + skip_lines=0, + compress=None, + show_rodata_refs=True, + show_branches=True, + show_line_numbers=False, + show_source=False, + stop_at_ret=False, + ignore_large_imms=False, + ignore_addr_diffs=True, + algorithm='levenshtein', + reg_categories={}) + return config + + # check that comment <> regex has ? to avoid ",r1 ! 60e87d0" + # all being a comment for: + # mov.l 44 ,r1 ! 60e87d0 + def test_sh2_comment(self): + # parser specifically looks for tabs so make sure they are represented + + # 16: d1 0b mov.l 44 ,r1 ! 60e87d0 + sh2_theirs = " 16:\td1 0b \tmov.l\t44 ,r1\t! 60e87d0\n" + + # 16: d1 0b mov.l 44 <_func_060E8780+0x44>,r1 ! 0 <_func_060E8780> + sh2_ours = " 16:\td1 0b \tmov.l\t44 <_func_060E8780+0x44>,r1\t! 0 <_func_060E8780>\n" + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + curr = loaded['rows'][0]['current']['src_comment'] + + assert(curr != "<_func_060E8780+0x44>,r1 ! 0 <_func_060E8780>") + assert(curr == "<_func_060E8780+0x44>") + + def test_sh2_immediates(self): + # test parsing these immediates + # func_0606B760(): + # 0: ec 01 mov #1,r12 + # 2: 71 01 add #1,r1 + # 4: ec ff mov #-1,r12 + # 6: 71 ff add #-1,r1 + # 8: ec 7f mov #127,r12 + # a: 71 7f add #127,r1 + # c: ec 80 mov #-128,r12 + # e: 71 80 add #-128,r1 + sh2_theirs = 'func_0606B760():\n 0:\tec 01 \tmov\t#1,r12\n 2:\t71 01 \tadd\t#1,r1\n 4:\tec ff \tmov\t#-1,r12\n 6:\t71 ff \tadd\t#-1,r1\n 8:\tec 7f \tmov\t#127,r12\n a:\t71 7f \tadd\t#127,r1\n c:\tec 80 \tmov\t#-128,r12\n e:\t71 80 \tadd\t#-128,r1' + + # just diff with self + sh2_ours = sh2_theirs + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + expected = [ + "0: mov #0x1,r12", + "2: add #0x1,r1", + "4: mov #0xff,r12", + "6: add #0xff,r1", + "8: mov #0x7f,r12", + "a: add #0x7f,r1", + "c: mov #0x80,r12", + "e: add #0x80,r1" + ] + + i = 0 + for text in loaded['rows']: + assert(text['base']['text'][0]['text'] == expected[i]) + i += 1 + + def test_more_sh2_immediates(self): + # test that the re_int regex is able to catch all these "boundary" numbers + # since we have to match 0-9 one digit at a time + # 0: 71 00 add #0,r1 + # 2: 71 01 add #1,r1 + # 4: 71 09 add #9,r1 + # 6: 71 0a add #10,r1 + # 8: 71 0b add #11,r1 + # a: 71 13 add #19,r1 + # c: 71 64 add #100,r1 + # e: 71 65 add #101,r1 + # 10: 71 6d add #109,r1 + # 12: 71 6f add #111,r1 + # 14: 71 77 add #119,r1 + # 16: 71 f7 add #-9,r1 + # 18: 71 f6 add #-10,r1 + # 1a: 71 f5 add #-11,r1 + # 1c: 71 ed add #-19,r1 + # 1e: 71 9c add #-100,r1 + # 20: 71 9b add #-101,r1 + # 22: 71 93 add #-109,r1 + # 24: 71 91 add #-111,r1 + # 26: 71 89 add #-119,r1 + sh2_theirs = 'func_0606B760():\n 0:\t71 00 \tadd\t#0,r1\n 2:\t71 01 \tadd\t#1,r1\n 4:\t71 09 \tadd\t#9,r1\n 6:\t71 0a \tadd\t#10,r1\n 8:\t71 0b \tadd\t#11,r1\n a:\t71 13 \tadd\t#19,r1\n c:\t71 64 \tadd\t#100,r1\n e:\t71 65 \tadd\t#101,r1\n 10:\t71 6d \tadd\t#109,r1\n 12:\t71 6f \tadd\t#111,r1\n 14:\t71 77 \tadd\t#119,r1\n 16:\t71 f7 \tadd\t#-9,r1\n 18:\t71 f6 \tadd\t#-10,r1\n 1a:\t71 f5 \tadd\t#-11,r1\n 1c:\t71 ed \tadd\t#-19,r1\n 1e:\t71 9c \tadd\t#-100,r1\n 20:\t71 9b \tadd\t#-101,r1\n 22:\t71 93 \tadd\t#-109,r1\n 24:\t71 91 \tadd\t#-111,r1\n 26:\t71 89 \tadd\t#-119,r1' + + # just diff with self + sh2_ours = sh2_theirs + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + expected = [ + "0: add #0x0,r1", + "2: add #0x1,r1", + "4: add #0x9,r1", + "6: add #0xa,r1", + "8: add #0xb,r1", + "a: add #0x13,r1", + "c: add #0x64,r1", + "e: add #0x65,r1", + "10: add #0x6d,r1", + "12: add #0x6f,r1", + "14: add #0x77,r1", + "16: add #0xf7,r1", + "18: add #0xf6,r1", + "1a: add #0xf5,r1", + "1c: add #0xed,r1", + "1e: add #0x9c,r1", + "20: add #0x9b,r1", + "22: add #0x93,r1", + "24: add #0x91,r1", + "26: add #0x89,r1" + ] + + i = 0 + for text in loaded['rows']: + assert(text['base']['text'][0]['text'] == expected[i]) + i += 1 + + def test_branch(self): + # test that bt.s and bra get ~> + # func(): + # 0: 8d 02 bt.s 8 + # 2: 6e f3 mov r15,r14 + # 4: a0 01 bra a + # 6: 00 09 nop + + # 00000008 : + # lab_0606B780(): + # 8: db 32 mov.l d4 ,r11 + + # 0000000a : + # lab_0606B8E0(): + # a: 00 0b rts + # c: 00 09 nop + sh2_theirs = 'func():\n 0:\t8d 02 \tbt.s\t8 \n 2:\t6e f3 \tmov\tr15,r14\n 4:\ta0 01 \tbra\ta \n 6:\t00 09 \tnop\t\n\n00000008 :\nlab_0606B780():\n 8:\tdb 32 \tmov.l\td4 ,r11\n\n0000000a :\nlab_0606B8E0():\n a:\t00 0b \trts\t\n c:\t00 09 \tnop\t' + sh2_ours = sh2_theirs + + config = self.get_config() + display = diff.Display(sh2_theirs, sh2_ours, config) + loaded = json.loads(display.run_diff()[0]) + + # bt.s 8 + print(loaded['rows'][0]['base']['text'][1]['text'] == '~>') + print(loaded['rows'][0]['base']['text'][1]['key'] == '8') + + # bra a + print(loaded['rows'][2]['base']['text'][1]['text'] == '~>') + print(loaded['rows'][2]['base']['text'][1]['key'] == '10') + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/asm-processor/.gitignore b/tools/asm-processor/.gitignore new file mode 100644 index 0000000..cc5bba4 --- /dev/null +++ b/tools/asm-processor/.gitignore @@ -0,0 +1,2 @@ +*.o +*.py[cod] diff --git a/tools/asm-processor/.gitrepo b/tools/asm-processor/.gitrepo new file mode 100644 index 0000000..fd4c97a --- /dev/null +++ b/tools/asm-processor/.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/git-commands/git-subrepo#readme +; +[subrepo] + remote = git@github.com:simonlindholm/asm-processor.git + branch = main + commit = 6dd4d3adcbfb3ee607b9a1e2bba3502d27217d44 + parent = 39a2e453bb882b2498c7c4aa9073a9f85d048f0c + method = merge + cmdver = 0.4.3 diff --git a/tools/asm-processor/LICENSE b/tools/asm-processor/LICENSE new file mode 100644 index 0000000..cf1ab25 --- /dev/null +++ b/tools/asm-processor/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to diff --git a/tools/asm-processor/README.md b/tools/asm-processor/README.md new file mode 100644 index 0000000..009147c --- /dev/null +++ b/tools/asm-processor/README.md @@ -0,0 +1,112 @@ +# 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 new file mode 100755 index 0000000..708548e --- /dev/null +++ b/tools/asm-processor/add-test.sh @@ -0,0 +1,5 @@ +#!/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 new file mode 100644 index 0000000..23f6102 --- /dev/null +++ b/tools/asm-processor/asm_processor.py @@ -0,0 +1,1477 @@ +#!/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 ') or line.startswith('jlabel ')) 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('jlabel ') 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'): + align = int(line.split()[1]) + if align != 4: + self.fail("only .balign 4 is supported", real_line) + self.align4() + elif line.startswith('.align'): + align = int(line.split()[1]) + if align != 2: + self.fail("only .align 2 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') or line.startswith('.hword'): + 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 and sectype == '.text': + 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 new file mode 100644 index 0000000..efbaade --- /dev/null +++ b/tools/asm-processor/build.py @@ -0,0 +1,114 @@ +#!/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 new file mode 100755 index 0000000..6551662 --- /dev/null +++ b/tools/asm-processor/compile-test.sh @@ -0,0 +1,26 @@ +#!/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 new file mode 100644 index 0000000..9bc8939 --- /dev/null +++ b/tools/asm-processor/prelude.inc @@ -0,0 +1,53 @@ +.set noat +.set noreorder +.set gp=64 + +.macro glabel label + .global \label + \label: +.endm + +.macro dlabel label + .global \label + \label: +.endm + +.macro jlabel 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 new file mode 100755 index 0000000..5cae0a7 --- /dev/null +++ b/tools/asm-processor/run-tests.sh @@ -0,0 +1,6 @@ +#!/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 new file mode 100644 index 0000000..bb27d25 --- /dev/null +++ b/tools/asm-processor/tests/ascii.c @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..bf42638 --- /dev/null +++ b/tools/asm-processor/tests/ascii.objdump @@ -0,0 +1,29 @@ + +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 new file mode 100644 index 0000000..4c93669 --- /dev/null +++ b/tools/asm-processor/tests/comments.c @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..246df20 --- /dev/null +++ b/tools/asm-processor/tests/comments.objdump @@ -0,0 +1,21 @@ + +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 new file mode 100644 index 0000000..03b630c --- /dev/null +++ b/tools/asm-processor/tests/force.c @@ -0,0 +1,17 @@ +// 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 new file mode 100644 index 0000000..7ef7024 --- /dev/null +++ b/tools/asm-processor/tests/force.objdump @@ -0,0 +1,47 @@ + +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 new file mode 100644 index 0000000..4d3346d --- /dev/null +++ b/tools/asm-processor/tests/kpic-o1.c @@ -0,0 +1,93 @@ +// 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 new file mode 100644 index 0000000..6e33675 --- /dev/null +++ b/tools/asm-processor/tests/kpic-o1.objdump @@ -0,0 +1,46 @@ + +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 new file mode 100644 index 0000000..f037341 --- /dev/null +++ b/tools/asm-processor/tests/kpic-o2.c @@ -0,0 +1,92 @@ +// 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 new file mode 100644 index 0000000..abf87ae --- /dev/null +++ b/tools/asm-processor/tests/kpic-o2.objdump @@ -0,0 +1,46 @@ + +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 new file mode 100644 index 0000000..a35b43d --- /dev/null +++ b/tools/asm-processor/tests/label-sameline.c @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..1f1aacf --- /dev/null +++ b/tools/asm-processor/tests/label-sameline.objdump @@ -0,0 +1,25 @@ + +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 new file mode 100644 index 0000000..4ffb4ac --- /dev/null +++ b/tools/asm-processor/tests/large.c @@ -0,0 +1,164 @@ + +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 new file mode 100644 index 0000000..17409a7 --- /dev/null +++ b/tools/asm-processor/tests/large.objdump @@ -0,0 +1,58 @@ + +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 new file mode 100644 index 0000000..7367c79 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_align.c @@ -0,0 +1,80 @@ +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 new file mode 100644 index 0000000..87c05e8 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_align.objdump @@ -0,0 +1,51 @@ + +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 new file mode 100644 index 0000000..0a27b41 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles.c @@ -0,0 +1,83 @@ +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 new file mode 100644 index 0000000..84d7e67 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles.objdump @@ -0,0 +1,55 @@ + +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 new file mode 100644 index 0000000..b97261f --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles_mips1.c @@ -0,0 +1,86 @@ +// 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 new file mode 100644 index 0000000..8fac85f --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_doubles_mips1.objdump @@ -0,0 +1,52 @@ + +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 new file mode 100644 index 0000000..3c2a5bb --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl.c @@ -0,0 +1,153 @@ +// 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 new file mode 100644 index 0000000..44bb6e8 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl.objdump @@ -0,0 +1,110 @@ + +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 new file mode 100644 index 0000000..505f4c1 --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl_mips1.c @@ -0,0 +1,155 @@ +// 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 new file mode 100644 index 0000000..d37c8bb --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_jtbl_mips1.objdump @@ -0,0 +1,110 @@ + +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 new file mode 100644 index 0000000..a453dbd --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_misaligned_doubles.c @@ -0,0 +1,77 @@ +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 new file mode 100644 index 0000000..cdba84d --- /dev/null +++ b/tools/asm-processor/tests/late_rodata_misaligned_doubles.objdump @@ -0,0 +1,56 @@ + +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 new file mode 100644 index 0000000..e130180 --- /dev/null +++ b/tools/asm-processor/tests/line-continuation-separate-file.s @@ -0,0 +1,4 @@ +.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 new file mode 100644 index 0000000..687dd1a --- /dev/null +++ b/tools/asm-processor/tests/line-continuation.asmproc.d @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..d5ab093 --- /dev/null +++ b/tools/asm-processor/tests/line-continuation.c @@ -0,0 +1,22 @@ +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 new file mode 100644 index 0000000..038766f --- /dev/null +++ b/tools/asm-processor/tests/line-continuation.objdump @@ -0,0 +1,30 @@ + +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 new file mode 100644 index 0000000..6f8e5e4 --- /dev/null +++ b/tools/asm-processor/tests/o0.c @@ -0,0 +1,28 @@ +// 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 new file mode 100644 index 0000000..f94ec7a --- /dev/null +++ b/tools/asm-processor/tests/o0.objdump @@ -0,0 +1,44 @@ + +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 new file mode 100644 index 0000000..144a604 --- /dev/null +++ b/tools/asm-processor/tests/o2.c @@ -0,0 +1,26 @@ +// 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 new file mode 100644 index 0000000..61e3fb0 --- /dev/null +++ b/tools/asm-processor/tests/o2.objdump @@ -0,0 +1,40 @@ + +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 new file mode 100644 index 0000000..cb3740f --- /dev/null +++ b/tools/asm-processor/tests/pascal.objdump @@ -0,0 +1,137 @@ + +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 new file mode 100644 index 0000000..0886126 --- /dev/null +++ b/tools/asm-processor/tests/pascal.p @@ -0,0 +1,95 @@ +{ 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 new file mode 100644 index 0000000..a7f6169 --- /dev/null +++ b/tools/asm-processor/tests/static-global.c @@ -0,0 +1,33 @@ +// 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 new file mode 100644 index 0000000..a519e4f --- /dev/null +++ b/tools/asm-processor/tests/static-global.objdump @@ -0,0 +1,58 @@ + +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 new file mode 100644 index 0000000..c265021 --- /dev/null +++ b/tools/asm-processor/tests/static.c @@ -0,0 +1,32 @@ +// 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 new file mode 100644 index 0000000..dd62c94 --- /dev/null +++ b/tools/asm-processor/tests/static.objdump @@ -0,0 +1,58 @@ + +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 new file mode 100644 index 0000000..475555a --- /dev/null +++ b/tools/asm-processor/tests/test1.c @@ -0,0 +1,71 @@ + +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 new file mode 100644 index 0000000..b97ae46 --- /dev/null +++ b/tools/asm-processor/tests/test1.objdump @@ -0,0 +1,54 @@ + +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 new file mode 100644 index 0000000..15969fe --- /dev/null +++ b/tools/asm-processor/tests/test2.c @@ -0,0 +1,69 @@ +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 new file mode 100644 index 0000000..276ed9f --- /dev/null +++ b/tools/asm-processor/tests/test2.objdump @@ -0,0 +1,76 @@ + +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 new file mode 100644 index 0000000..d74bb4c --- /dev/null +++ b/tools/asm-processor/tests/test3.c @@ -0,0 +1,70 @@ + +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 new file mode 100644 index 0000000..bfa7f6e --- /dev/null +++ b/tools/asm-processor/tests/test3.objdump @@ -0,0 +1,64 @@ + +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/asmproc b/tools/asmproc deleted file mode 160000 index f2c7624..0000000 --- a/tools/asmproc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f2c7624ed483f6e4b41d0a68dbcfb8f781a09ee3 diff --git a/tools/ido_recomp/linux/5.3/as1 b/tools/ido/linux/5.3/as1 similarity index 100% rename from tools/ido_recomp/linux/5.3/as1 rename to tools/ido/linux/5.3/as1 diff --git a/tools/ido_recomp/linux/5.3/cc b/tools/ido/linux/5.3/cc similarity index 100% rename from tools/ido_recomp/linux/5.3/cc rename to tools/ido/linux/5.3/cc diff --git a/tools/ido_recomp/linux/5.3/cfe b/tools/ido/linux/5.3/cfe similarity index 100% rename from tools/ido_recomp/linux/5.3/cfe rename to tools/ido/linux/5.3/cfe diff --git a/tools/ido_recomp/linux/5.3/err.english.cc b/tools/ido/linux/5.3/err.english.cc similarity index 100% rename from tools/ido_recomp/linux/5.3/err.english.cc rename to tools/ido/linux/5.3/err.english.cc diff --git a/tools/ido_recomp/linux/5.3/ugen b/tools/ido/linux/5.3/ugen similarity index 100% rename from tools/ido_recomp/linux/5.3/ugen rename to tools/ido/linux/5.3/ugen diff --git a/tools/ido_recomp/linux/5.3/ujoin b/tools/ido/linux/5.3/ujoin similarity index 100% rename from tools/ido_recomp/linux/5.3/ujoin rename to tools/ido/linux/5.3/ujoin diff --git a/tools/ido_recomp/linux/5.3/uld b/tools/ido/linux/5.3/uld similarity index 100% rename from tools/ido_recomp/linux/5.3/uld rename to tools/ido/linux/5.3/uld diff --git a/tools/ido_recomp/linux/5.3/umerge b/tools/ido/linux/5.3/umerge similarity index 100% rename from tools/ido_recomp/linux/5.3/umerge rename to tools/ido/linux/5.3/umerge diff --git a/tools/ido_recomp/linux/5.3/uopt b/tools/ido/linux/5.3/uopt similarity index 100% rename from tools/ido_recomp/linux/5.3/uopt rename to tools/ido/linux/5.3/uopt diff --git a/tools/ido_recomp/linux/5.3/usplit b/tools/ido/linux/5.3/usplit similarity index 100% rename from tools/ido_recomp/linux/5.3/usplit rename to tools/ido/linux/5.3/usplit diff --git a/tools/ido_recomp/linux/7.1/as1 b/tools/ido/linux/7.1/as1 similarity index 100% rename from tools/ido_recomp/linux/7.1/as1 rename to tools/ido/linux/7.1/as1 diff --git a/tools/ido_recomp/linux/7.1/cc b/tools/ido/linux/7.1/cc similarity index 100% rename from tools/ido_recomp/linux/7.1/cc rename to tools/ido/linux/7.1/cc diff --git a/tools/ido_recomp/linux/7.1/cfe b/tools/ido/linux/7.1/cfe similarity index 100% rename from tools/ido_recomp/linux/7.1/cfe rename to tools/ido/linux/7.1/cfe diff --git a/tools/ido_recomp/linux/7.1/err.english.cc b/tools/ido/linux/7.1/err.english.cc similarity index 100% rename from tools/ido_recomp/linux/7.1/err.english.cc rename to tools/ido/linux/7.1/err.english.cc diff --git a/tools/ido_recomp/linux/7.1/ugen b/tools/ido/linux/7.1/ugen similarity index 100% rename from tools/ido_recomp/linux/7.1/ugen rename to tools/ido/linux/7.1/ugen diff --git a/tools/ido_recomp/linux/7.1/uopt b/tools/ido/linux/7.1/uopt similarity index 100% rename from tools/ido_recomp/linux/7.1/uopt rename to tools/ido/linux/7.1/uopt diff --git a/tools/ido_recomp/macos/5.3/acpp b/tools/ido/macos/5.3/acpp similarity index 100% rename from tools/ido_recomp/macos/5.3/acpp rename to tools/ido/macos/5.3/acpp diff --git a/tools/ido_recomp/macos/5.3/as0 b/tools/ido/macos/5.3/as0 similarity index 100% rename from tools/ido_recomp/macos/5.3/as0 rename to tools/ido/macos/5.3/as0 diff --git a/tools/ido_recomp/macos/5.3/as1 b/tools/ido/macos/5.3/as1 similarity index 100% rename from tools/ido_recomp/macos/5.3/as1 rename to tools/ido/macos/5.3/as1 diff --git a/tools/ido_recomp/macos/5.3/cc b/tools/ido/macos/5.3/cc similarity index 100% rename from tools/ido_recomp/macos/5.3/cc rename to tools/ido/macos/5.3/cc diff --git a/tools/ido_recomp/macos/5.3/cfe b/tools/ido/macos/5.3/cfe similarity index 100% rename from tools/ido_recomp/macos/5.3/cfe rename to tools/ido/macos/5.3/cfe diff --git a/tools/ido_recomp/macos/5.3/copt b/tools/ido/macos/5.3/copt similarity index 100% rename from tools/ido_recomp/macos/5.3/copt rename to tools/ido/macos/5.3/copt diff --git a/tools/ido_recomp/macos/5.3/err.english.cc b/tools/ido/macos/5.3/err.english.cc similarity index 100% rename from tools/ido_recomp/macos/5.3/err.english.cc rename to tools/ido/macos/5.3/err.english.cc diff --git a/tools/ido_recomp/macos/5.3/ld b/tools/ido/macos/5.3/ld similarity index 100% rename from tools/ido_recomp/macos/5.3/ld rename to tools/ido/macos/5.3/ld diff --git a/tools/ido_recomp/macos/5.3/strip b/tools/ido/macos/5.3/strip similarity index 100% rename from tools/ido_recomp/macos/5.3/strip rename to tools/ido/macos/5.3/strip diff --git a/tools/ido_recomp/macos/5.3/ugen b/tools/ido/macos/5.3/ugen similarity index 100% rename from tools/ido_recomp/macos/5.3/ugen rename to tools/ido/macos/5.3/ugen diff --git a/tools/ido_recomp/macos/5.3/ujoin b/tools/ido/macos/5.3/ujoin similarity index 100% rename from tools/ido_recomp/macos/5.3/ujoin rename to tools/ido/macos/5.3/ujoin diff --git a/tools/ido_recomp/macos/5.3/uld b/tools/ido/macos/5.3/uld similarity index 100% rename from tools/ido_recomp/macos/5.3/uld rename to tools/ido/macos/5.3/uld diff --git a/tools/ido_recomp/macos/5.3/umerge b/tools/ido/macos/5.3/umerge similarity index 100% rename from tools/ido_recomp/macos/5.3/umerge rename to tools/ido/macos/5.3/umerge diff --git a/tools/ido_recomp/macos/5.3/uopt b/tools/ido/macos/5.3/uopt similarity index 100% rename from tools/ido_recomp/macos/5.3/uopt rename to tools/ido/macos/5.3/uopt diff --git a/tools/ido_recomp/macos/5.3/usplit b/tools/ido/macos/5.3/usplit similarity index 100% rename from tools/ido_recomp/macos/5.3/usplit rename to tools/ido/macos/5.3/usplit diff --git a/tools/ido_recomp/macos/7.1/acpp b/tools/ido/macos/7.1/acpp similarity index 100% rename from tools/ido_recomp/macos/7.1/acpp rename to tools/ido/macos/7.1/acpp diff --git a/tools/ido_recomp/macos/7.1/as0 b/tools/ido/macos/7.1/as0 similarity index 100% rename from tools/ido_recomp/macos/7.1/as0 rename to tools/ido/macos/7.1/as0 diff --git a/tools/ido_recomp/macos/7.1/as1 b/tools/ido/macos/7.1/as1 similarity index 100% rename from tools/ido_recomp/macos/7.1/as1 rename to tools/ido/macos/7.1/as1 diff --git a/tools/ido_recomp/macos/7.1/cc b/tools/ido/macos/7.1/cc similarity index 100% rename from tools/ido_recomp/macos/7.1/cc rename to tools/ido/macos/7.1/cc diff --git a/tools/ido_recomp/macos/7.1/cfe b/tools/ido/macos/7.1/cfe similarity index 100% rename from tools/ido_recomp/macos/7.1/cfe rename to tools/ido/macos/7.1/cfe diff --git a/tools/ido_recomp/macos/7.1/err.english.cc b/tools/ido/macos/7.1/err.english.cc similarity index 100% rename from tools/ido_recomp/macos/7.1/err.english.cc rename to tools/ido/macos/7.1/err.english.cc diff --git a/tools/ido_recomp/macos/7.1/ugen b/tools/ido/macos/7.1/ugen similarity index 100% rename from tools/ido_recomp/macos/7.1/ugen rename to tools/ido/macos/7.1/ugen diff --git a/tools/ido_recomp/macos/7.1/ujoin b/tools/ido/macos/7.1/ujoin similarity index 100% rename from tools/ido_recomp/macos/7.1/ujoin rename to tools/ido/macos/7.1/ujoin diff --git a/tools/ido_recomp/macos/7.1/uld b/tools/ido/macos/7.1/uld similarity index 100% rename from tools/ido_recomp/macos/7.1/uld rename to tools/ido/macos/7.1/uld diff --git a/tools/ido_recomp/macos/7.1/umerge b/tools/ido/macos/7.1/umerge similarity index 100% rename from tools/ido_recomp/macos/7.1/umerge rename to tools/ido/macos/7.1/umerge diff --git a/tools/ido_recomp/macos/7.1/uopt b/tools/ido/macos/7.1/uopt similarity index 100% rename from tools/ido_recomp/macos/7.1/uopt rename to tools/ido/macos/7.1/uopt diff --git a/tools/ido_recomp/macos/7.1/upas b/tools/ido/macos/7.1/upas similarity index 100% rename from tools/ido_recomp/macos/7.1/upas rename to tools/ido/macos/7.1/upas diff --git a/tools/ido_recomp/macos/7.1/usplit b/tools/ido/macos/7.1/usplit similarity index 100% rename from tools/ido_recomp/macos/7.1/usplit rename to tools/ido/macos/7.1/usplit diff --git a/yamls/us/header.yaml b/yamls/us/header.yaml new file mode 100644 index 0000000..61d81b8 --- /dev/null +++ b/yamls/us/header.yaml @@ -0,0 +1,54 @@ +name: Pokemon Stadium (North America) +sha1: ed7bef5a306f88c0a6e96b15e71fee2ef32058f3 +options: + basename: pokestadium + target_path: baseroms/us/baserom.z64 + ld_script_path: linker_scripts/us/pokestadium.ld + base_path: . + compiler: IDO + find_file_boundaries: False + header_encoding: ASCII + platform: n64 + + undefined_funcs_auto_path: linker_scripts/us/auto/undefined_funcs_auto.ld + undefined_syms_auto_path: linker_scripts/us/auto/undefined_syms_auto.ld + + symbol_addrs_path: + - linker_scripts/us/symbol_addrs.txt + - linker_scripts/us/ignored_addresses.txt + reloc_addrs_path: + - relocs/reloc_addrs-us.txt + + asm_path: asm/us + src_path: src + asset_path: assets/us + + build_path: build + lib_path: build/lib + + extensions_path: tools/splat_ext + mips_abi_float_regs: o32 + + do_c_func_detection: True + o_as_suffix: True + gfx_ucode: f3dex2 + mnemonic_ljust: 12 + rom_address_padding: True + dump_symbols: True + generated_c_preamble: | + #include "global.h" + asm_inc_header: "" + use_legacy_include_asm: False + create_asm_dependencies: True + asm_function_macro: glabel + asm_jtbl_label_macro: jlabel + asm_data_macro: dlabel + include_macro_inc: False + libultra_symbols: True + hardware_regs: True + asm_emit_size_directive: False + segment_end_before_align: True + ld_align_section_vram_end: False + image_type_in_extension: true + +segments: diff --git a/splat.yaml b/yamls/us/rom.yaml similarity index 99% rename from splat.yaml rename to yamls/us/rom.yaml index a14087a..d3f1337 100644 --- a/splat.yaml +++ b/yamls/us/rom.yaml @@ -1,15 +1,3 @@ -name: Pokemon Stadium (North America) -basename: pokestadium -options: - compiler: IDO - symbol_addrs_path: tools/symbol_addrs.txt - target_path: baserom.z64 - basename: pokestadium - base_path: . - ld_script_path: pokestadium.ld - platform: n64 - ld_legacy_generation: true -segments: - name: header type: header start: 0x00 From a691306153f0ed8d9561d5f07c6d4999fe08ed00 Mon Sep 17 00:00:00 2001 From: Kelebek1 Date: Sat, 10 Aug 2024 00:07:44 +0100 Subject: [PATCH 2/8] close --- Makefile | 2 +- include/macro.inc | 78 +++++ linker_scripts/common_undef_syms.ld | 0 linker_scripts/us/hardware_regs.ld | 94 ++++++ linker_scripts/us/symbol_addrs.txt | 12 +- linker_scripts/us/unused_syms.ld | 0 tools/asm-processor/prelude.inc | 2 + tools/ido/linux/5.3/acpp | Bin 0 -> 149720 bytes tools/ido/linux/5.3/as0 | Bin 0 -> 186584 bytes tools/ido/linux/5.3/as1 | Bin 2570888 -> 923864 bytes tools/ido/linux/5.3/c++filt | Bin 0 -> 84184 bytes tools/ido/linux/5.3/cc | Bin 806832 -> 248024 bytes tools/ido/linux/5.3/cfe | Bin 2640688 -> 796896 bytes tools/ido/linux/5.3/copt | Bin 0 -> 2898144 bytes tools/ido/linux/5.3/ld | Bin 0 -> 633048 bytes tools/ido/linux/5.3/libc.so | Bin 0 -> 1483100 bytes tools/ido/linux/5.3/libc.so.1 | Bin 0 -> 1483100 bytes tools/ido/linux/5.3/libexc.so | Bin 0 -> 29352 bytes tools/ido/linux/5.3/libgen.so | Bin 0 -> 69944 bytes tools/ido/linux/5.3/libm.so | Bin 0 -> 111272 bytes tools/ido/linux/5.3/strip | Bin 0 -> 182488 bytes tools/ido/linux/5.3/ugen | Bin 2100272 -> 600280 bytes tools/ido/linux/5.3/ujoin | Bin 1259664 -> 92304 bytes tools/ido/linux/5.3/uld | Bin 6669016 -> 633048 bytes tools/ido/linux/5.3/umerge | Bin 2115816 -> 141528 bytes tools/ido/linux/5.3/uopt | Bin 2420760 -> 674008 bytes tools/ido/linux/5.3/upas | Bin 0 -> 731352 bytes tools/ido/linux/5.3/usplit | Bin 406192 -> 75920 bytes tools/ido/linux/7.1/NCC | Bin 0 -> 252120 bytes tools/ido/linux/7.1/acpp | Bin 0 -> 153816 bytes tools/ido/linux/7.1/as0 | Bin 0 -> 178392 bytes tools/ido/linux/7.1/as1 | Bin 2586144 -> 907480 bytes tools/ido/linux/7.1/cc | Bin 890728 -> 252120 bytes tools/ido/linux/7.1/cfe | Bin 2811776 -> 809184 bytes tools/ido/linux/7.1/edgcpfe | Bin 0 -> 1505504 bytes tools/ido/linux/7.1/ugen | Bin 2205496 -> 567512 bytes tools/ido/linux/7.1/ujoin | Bin 0 -> 92304 bytes tools/ido/linux/7.1/uld | Bin 0 -> 641240 bytes tools/ido/linux/7.1/umerge | Bin 0 -> 141528 bytes tools/ido/linux/7.1/uopt | Bin 2573296 -> 678104 bytes tools/ido/linux/7.1/upas | Bin 0 -> 735448 bytes tools/ido/linux/7.1/usplit | Bin 0 -> 75920 bytes yamls/us/rom.yaml | 432 +++++++++++++++------------- 43 files changed, 420 insertions(+), 200 deletions(-) create mode 100644 linker_scripts/common_undef_syms.ld create mode 100644 linker_scripts/us/hardware_regs.ld create mode 100644 linker_scripts/us/unused_syms.ld create mode 100755 tools/ido/linux/5.3/acpp create mode 100755 tools/ido/linux/5.3/as0 create mode 100755 tools/ido/linux/5.3/c++filt create mode 100755 tools/ido/linux/5.3/copt create mode 100755 tools/ido/linux/5.3/ld create mode 100644 tools/ido/linux/5.3/libc.so create mode 100644 tools/ido/linux/5.3/libc.so.1 create mode 100644 tools/ido/linux/5.3/libexc.so create mode 100644 tools/ido/linux/5.3/libgen.so create mode 100644 tools/ido/linux/5.3/libm.so create mode 100755 tools/ido/linux/5.3/strip create mode 100755 tools/ido/linux/5.3/upas create mode 100755 tools/ido/linux/7.1/NCC create mode 100755 tools/ido/linux/7.1/acpp create mode 100755 tools/ido/linux/7.1/as0 create mode 100755 tools/ido/linux/7.1/edgcpfe create mode 100755 tools/ido/linux/7.1/ujoin create mode 100755 tools/ido/linux/7.1/uld create mode 100755 tools/ido/linux/7.1/umerge create mode 100755 tools/ido/linux/7.1/upas create mode 100755 tools/ido/linux/7.1/usplit diff --git a/Makefile b/Makefile index 8543e07..18f19c8 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ TARGET := pokestadium BASEROM_DIR := baseroms/$(VERSION) BASEROM := $(BASEROM_DIR)/baserom.z64 -ULTRALIB_VERSION := L +ULTRALIB_VERSION := I ULTRALIB_TARGET := libultra_rom ### Output ### diff --git a/include/macro.inc b/include/macro.inc index 5369a20..1ee4aa4 100644 --- a/include/macro.inc +++ b/include/macro.inc @@ -1,9 +1,87 @@ .macro glabel label + .global \label + .type \label, @function + \label: +.endm + +.macro dlabel label .global \label \label: .endm .macro jlabel label .global \label + .type \label, @function \label: .endm + +# COP0 register aliases + +.set Index, $0 +.set Random, $1 +.set EntryLo0, $2 +.set EntryLo1, $3 +.set Context, $4 +.set PageMask, $5 +.set Wired, $6 +.set Reserved07, $7 +.set BadVaddr, $8 +.set Count, $9 +.set EntryHi, $10 +.set Compare, $11 +.set Status, $12 +.set Cause, $13 +.set EPC, $14 +.set PRevID, $15 +.set Config, $16 +.set LLAddr, $17 +.set WatchLo, $18 +.set WatchHi, $19 +.set XContext, $20 +.set Reserved21, $21 +.set Reserved22, $22 +.set Reserved23, $23 +.set Reserved24, $24 +.set Reserved25, $25 +.set PErr, $26 +.set CacheErr, $27 +.set TagLo, $28 +.set TagHi, $29 +.set ErrorEPC, $30 +.set Reserved31, $31 + + +# 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/linker_scripts/common_undef_syms.ld b/linker_scripts/common_undef_syms.ld new file mode 100644 index 0000000..e69de29 diff --git a/linker_scripts/us/hardware_regs.ld b/linker_scripts/us/hardware_regs.ld new file mode 100644 index 0000000..533a42c --- /dev/null +++ b/linker_scripts/us/hardware_regs.ld @@ -0,0 +1,94 @@ +// Signal Processor Registers +SP_MEM_ADDR_REG = 0xA4040000; // defined:True +SP_DRAM_ADDR_REG = 0xA4040004; // defined:True +SP_RD_LEN_REG = 0xA4040008; // defined:True +SP_WR_LEN_REG = 0xA404000C; // defined:True +SP_STATUS_REG = 0xA4040010; // defined:True +SP_DMA_FULL_REG = 0xA4040014; // defined:True +SP_DMA_BUSY_REG = 0xA4040018; // defined:True +SP_SEMAPHORE_REG = 0xA404001C; // defined:True + +SP_PC = 0xA4080000; // defined:True + +// Display Processor Command Registers / Rasterizer Interface +DPC_START_REG = 0xA4100000; // defined:True +DPC_END_REG = 0xA4100004; // defined:True +DPC_CURRENT_REG = 0xA4100008; // defined:True +DPC_STATUS_REG = 0xA410000C; // defined:True +DPC_CLOCK_REG = 0xA4100010; // defined:True +DPC_BUFBUSY_REG = 0xA4100014; // defined:True +DPC_PIPEBUSY_REG = 0xA4100018; // defined:True +DPC_TMEM_REG = 0xA410001C; // defined:True + +// Display Processor Span Registers +DPS_TBIST_REG = 0xA4200000; // defined:True // DPS_TBIST_REG / DP_TMEM_BIST +DPS_TEST_MODE_REG = 0xA4200004; // defined:True +DPS_BUFTEST_ADDR_REG = 0xA4200008; // defined:True +DPS_BUFTEST_DATA_REG = 0xA420000C; // defined:True + +// MIPS Interface Registers +MI_MODE_REG = 0xA4300000; // defined:True // MI_MODE_REG / MI_INIT_MODE_REG +MI_VERSION_REG = 0xA4300004; // defined:True +MI_INTR_REG = 0xA4300008; // defined:True +MI_INTR_MASK_REG = 0xA430000C; // defined:True + +// Video Interface Registers +VI_STATUS_REG = 0xA4400000; // defined:True // VI_STATUS_REG / VI_CONTROL_REG +VI_DRAM_ADDR_REG = 0xA4400004; // defined:True // VI_DRAM_ADDR_REG / VI_ORIGIN_REG +VI_WIDTH_REG = 0xA4400008; // defined:True +VI_INTR_REG = 0xA440000C; // defined:True +VI_CURRENT_REG = 0xA4400010; // defined:True +VI_BURST_REG = 0xA4400014; // defined:True // VI_BURST_REG / VI_TIMING_REG +VI_V_SYNC_REG = 0xA4400018; // defined:True +VI_H_SYNC_REG = 0xA440001C; // defined:True +VI_LEAP_REG = 0xA4400020; // defined:True +VI_H_START_REG = 0xA4400024; // defined:True +VI_V_START_REG = 0xA4400028; // defined:True +VI_V_BURST_REG = 0xA440002C; // defined:True +VI_X_SCALE_REG = 0xA4400030; // defined:True +VI_Y_SCALE_REG = 0xA4400034; // defined:True + +// Audio Interface Registers +AI_DRAM_ADDR_REG = 0xA4500000; // defined:True +AI_LEN_REG = 0xA4500004; // defined:True +AI_CONTROL_REG = 0xA4500008; // defined:True +AI_STATUS_REG = 0xA450000C; // defined:True +AI_DACRATE_REG = 0xA4500010; // defined:True +AI_BITRATE_REG = 0xA4500014; // defined:True + +// Peripheral/Parallel Interface Registers +PI_DRAM_ADDR_REG = 0xA4600000; // defined:True +PI_CART_ADDR_REG = 0xA4600004; // defined:True +D_A4600005 = 0xA4600005; // defined:True // TODO figure out its name +D_A4600006 = 0xA4600006; // defined:True // TODO figure out its name +D_A4600007 = 0xA4600007; // defined:True // TODO figure out its name +PI_RD_LEN_REG = 0xA4600008; // defined:True +PI_WR_LEN_REG = 0xA460000C; // defined:True +PI_STATUS_REG = 0xA4600010; // defined:True +PI_BSD_DOM1_LAT_REG = 0xA4600014; // defined:True // PI dom1 latency +PI_BSD_DOM1_PWD_REG = 0xA4600018; // defined:True // PI dom1 pulse width +PI_BSD_DOM1_PGS_REG = 0xA460001C; // defined:True // PI dom1 page size +PI_BSD_DOM1_RLS_REG = 0xA4600020; // defined:True // PI dom1 release +PI_BSD_DOM2_LAT_REG = 0xA4600024; // defined:True // PI dom2 latency +PI_BSD_DOM2_LWD_REG = 0xA4600028; // defined:True // PI dom2 pulse width +PI_BSD_DOM2_PGS_REG = 0xA460002C; // defined:True // PI dom2 page size +PI_BSD_DOM2_RLS_REG = 0xA4600030; // defined:True // PI dom2 release + +// RDRAM Interface Registers +RI_MODE_REG = 0xA4700000; // defined:True +RI_CONFIG_REG = 0xA4700004; // defined:True +RI_CURRENT_LOAD_REG = 0xA4700008; // defined:True +RI_SELECT_REG = 0xA470000C; // defined:True +RI_REFRESH_REG = 0xA4700010; // defined:True +RI_LATENCY_REG = 0xA4700014; // defined:True +RI_RERROR_REG = 0xA4700018; // defined:True +RI_WERROR_REG = 0xA470001C; // defined:True + +// Serial Interface Registers +SI_DRAM_ADDR_REG = 0xA4800000; // defined:True +SI_PIF_ADDR_RD64B_REG = 0xA4800004; // defined:True +D_A4800008 = 0xA4800008; // defined:True // reserved +D_A480000C = 0xA480000C; // defined:True // reserved +SI_PIF_ADDR_WR64B_REG = 0xA4800010; // defined:True +D_A4800014 = 0xA4800014; // defined:True // reserved +SI_STATUS_REG = 0xA4800018; // defined:True diff --git a/linker_scripts/us/symbol_addrs.txt b/linker_scripts/us/symbol_addrs.txt index 5ba6f61..e2c7995 100644 --- a/linker_scripts/us/symbol_addrs.txt +++ b/linker_scripts/us/symbol_addrs.txt @@ -366,16 +366,16 @@ alInit = 0x80056FDC; _VirtualToPhysicalTask = 0x80057010; osSpTaskLoad = 0x8005712C; osSpTaskStartGo = 0x800572BC; -sTmpTask = 0x80102100; +tmp_task = 0x80102100; __osPiAccessQueue = 0x801020E8; __osPiAccessQueueEnabled = 0x80079610; piAccessBuf = 0x801020E0; __sinf = 0x80056D90; __libm_qnan_f = 0x8007E5D0; bzero = 0x80057FD0; -var80090ab0 = 0x80102200; -g_GbpakMesgQueue = 0x80102220; -var80090ae8 = 0x80102238; +__osGbpakTimer = 0x80102200; +__osGbpakTimerQ = 0x80102220; +__osGbpakTimerMsg = 0x80102238; __osContPifRam = 0x80102140; __osMaxControllers = 0x80102181; __osContLastCmd = 0x80102180; @@ -442,6 +442,8 @@ __osThreadTail = 0x80079620; __osRunQueue = 0x80079628; __osEnqueueThread = 0x80057DEC; __osCurrentHandle = 0x8007A880; +osViModeNtscLpn1 = 0x8007A890; +osViModeMpalLpn1 = 0x8007A8E0; __osTimerList = 0x8007A9B0; __osBaseTimer = 0x80103890; __osCurrentTime = 0x801038B0; @@ -743,3 +745,5 @@ _79AFB0_ROM_END = 0x79B8F0; // defined:true abs = 0x8000B8A0; // defined:true D_86002B84 = 0x86002B84; // size:3 D_86002B88 = 0x86002B88; // size:3 +F3DEX2_bin = 0x80066090; +F3DEX2_data_bin = 0x8007E650; diff --git a/linker_scripts/us/unused_syms.ld b/linker_scripts/us/unused_syms.ld new file mode 100644 index 0000000..e69de29 diff --git a/tools/asm-processor/prelude.inc b/tools/asm-processor/prelude.inc index 9bc8939..ab83966 100644 --- a/tools/asm-processor/prelude.inc +++ b/tools/asm-processor/prelude.inc @@ -13,6 +13,8 @@ .endm .macro jlabel label + .global \label + .type \label, @function \label: .endm diff --git a/tools/ido/linux/5.3/acpp b/tools/ido/linux/5.3/acpp new file mode 100755 index 0000000000000000000000000000000000000000..4a6dc6d015da0c82ed4841aef009f7228cabca84 GIT binary patch literal 149720 zcmeFadwdkt`9D6JY?37ecY#2nf=MMv!Yzq{B!y@OW^toIV+}THlpq&_21sESVjDHM zS;=9XmR6~Jdij+0(+j;yKlKvQsvE#0&}sv%Hd>YFN9rt#67UwNvcLCpW@eephx2`X zU*A7}FSj)_&->h;^PK0L^PJ}l5BaMXr?^~_^-Gnmk%($;GLT9$piWLP-z2G0DwD?G z?`6_tDIKUA|5ciy&gX!c%zApvc&T_&x?Fm>z;luTOV-n>Aw4Ob=;yn|2(g}$&!8z? z8of5qAN(5l-{e!SGD@(X_H?|wJ!TCY&qk9^*3+Jjc(Z4k!GJyUMm|^O8s+E9W5~)r-m?nY!-ArPLi!!b~>uzQ{Id3Xe5Luh@Lk ziaVaHe(#=p>)%^b(tYG>RvuI)#i1Xix4PJ(Z^H}4q4uX}TR==oC9EF*-G%=OCqFtV z^Q}+E9bWbF+UOrX9anx@opj}aPsjb?C!dZ(@CAQv6mp@!?+b7e;|s;lL4_}be_Ig0 z01dfN{ICGO1GT?Ue6Jw>Ndev~$Y(V0eEjG9JqqAL<^G2t|MddAQGka8{2?`ap>jzu zE`)zskpJ%l^}kFI|BnLvoFJb~g7_B;>c3kM{~|%V{wgT<8-jc)1m(UVh+i$h?-Atl zkN|&QP|v>#@_$@_e;~;Js{;Hz0X|)j|1{JyAOAUjF+u#FA>xJP?U(?U1^M&~;y)n3 z|0KxgK0*8%0X|6}S62%1e@B292=cjI5PzZo|AnBx@&)*Ff_6P7z!wY3Z4l&tSb(Ps z+WV*={*MLtYXZDmP|wqXcC8cS^J76i*9+p`Er|bhLHwHq_%1;`e=Ep8BFN`zW-OUtTimn>VkYQw5~)@%%} z+EBY>QPcW$t7@0u-Ly(tw(Op@>(?#Y7+k&~xNMmb^@0&Mer-c=wM2iVrj@H&nkoMk zX8z0WSru$tzcILO`Px;>Ry5v+Tw9v&S$6mGjjITfHU>AWXucn4^M*C+f~$FyRV{0R zK$dUZxC&V|FAp}ZSif$yw5ny*icQkSRl%n9E0&{vNV;yt+Gc5Wa6@R_isivo()#A$ znsqCs&C8KKxN2=PN|2h@G_R7HS8dp^euK1n{RXN4TD0OmDrwp3UHrF7pKU@IEeu3wp~rjga!`@lu2 z63>IDUMa2FxI7rVUs}6%d9$=~%?94=Wy?^bb?cW=Q-W*OucOjeqL@%Ks!GM6DbmVN z^OY!IwT(3^f@{FE)him;Z(fJmty~`pN~@bg!4=Zl`*_Js8&|EmPg-jsJ+Ro5ID1O%{}NPDq_Xvm59t+ygaymwS+%wh`}3INkOA~);F(OClME#c*{ck zFa6m_<#XXM#b!mz@@1>ntXtl+=Ihj$jkc<-UA2}sarufBt2S<=M)B4lHTq)NG7?8q zjMpw-vrgK)VGV?Z`tqI)&63qfY4wIxlyM8hgT!yO@p4^t)xt%~uAF`4?75QlepT{q zPV()l*>h+Vr{I67{4c$^%{K!lWaR(S9Q4Rgi*lw;OXh3DFv>e$s+G?9q!_d#Ht=*? zJ*}A30@_#6|BSs{KAxdV){LTbvoH_R&xQBpcv}0(@oUzMp`BPc!U@afbegotq=Oez z`c!F&NgMg4B=fWE0G7V2SxcozQm1JjuyCJ=M;-XYLaMDK^*QiTTKM7DFTe)`_@DsS z1^AEvA9mn6ZS?3@M*VPpez5B45#T-no-4rf1$dzVFA?Bn0=!ay2LyPH0Iw6^4FbGT zfHw>976INSz&ix^b^*RqfbSCEy9M|j2X4tprvv|Bnjt??2fon6`yBYami#+#OWp}JjJYMp#!(_DG}gh0=!ay z2ORj*X1~-paI4%p2mYC<9~vCE6~9q{Hw*9<0p2FSI|TT40lrg!?-Jm<1^6BT-YLMN z4*V}y7;@6*z%9P@3-AE}J}AI-2mbyPque0}Zk0PMz@;w>6yfR{P&@0;aTI`EBV{s9M`V(On72Oc;3tImOMHS=$9;ID@GbSX6o z@MZztBEZ`Oc!vPrF2HvR@Ldl45wrfg9r)XujCSo2;GGV9qM1+Bfftx~p98n@?-$?$ z4*W_ppFsy+Y2vyAxAGqn;KKr3GS6|Wb)A)uM}YeTxOE=n%qQOw|3*w?u%K z3Ghk>UT@|faNt({H4gkR@G=2jDZm2)yhec63GfC1-YCGE1$c`9Z*$<5oOC$w_adhJJMeQR zzSDtQ{kThj?{?r;{(A&?rvooE%Z)m4E1y0A-Y>uh1o)r;*9G{H03R0M5**g#fJt5ZpCjD;LQTOMS!;n@D2xV z)n~f^-zmU%3Gm$le2)O{6yQ+--Y3BO1^9pfA9Uac%y~q2;1+*|1o*H3m#z`WzX10M z@LU0&FTe{0c!>Zn6X2BsJRrbp1bCeTx8%IRfm?iTbl_I}W&z&jz&Cu$(B~Zv{0JQs z;x0e8_?CG4Wvs{+5YL*N&9)k4)U-z-NEQsHe|?f6c^m9r&+J zJl}y2n|PrEA8qz;i37jP#LFCbsfkxQ@as%G;K0|Jc#Q-9wTag`@Fz{Y!GZ5L@iqtk zr51xf9S;046W=btcM9-b0(`ds-{ZhXndNpm@MD{edPW`i=O*6gz^(fC3-AE}KIp*9 z&HCsL+{%B*fuAz#Gwi^v_)_IaxwUYQ0QU*-TmhahzzYR)E4=)kRVn;rNyraZSe@PLW8IdH3<9Rhs21HZu>7dsuemCr5# zzT1H}nDvP|@W_u1e)c)=eiQF^;Fs<);tvS$K?fc&f5`x7I6z5^e7z`zRyc!>ZnbKv)z`BXaaP2_NkU%-KXyT`z59Jm#~ zPJlNE@J0u2)u+vY-_UK8+u^{ia<>ccodSH90N*XZ_XzM#0Uj0LeFD5+fDZ`pK>@A{ z@F4*{EWo8jBjwiOvqymY1bD6h&lli@0=z_kmkIDn2Ofa>jZd% z0B>~QR=Ld%+{(X2fVT976IPo zz`qwWR@G=2jDZm2)yvBiFs~dc4aNsB3Gw?1o&M<<>ZGtK2#P-XOpm1$eUnZxP^a z0=&b4hv*^_e%l?mRsWp=e3t;Je7ghx9$nbMZ>Iyd+Ph1D?-t;D1bC+aj|%WU0p2gb2L$+_ z0M`ZhkN_VR;8I|uJX?J82ymYO&lTYL0=!Uwmk97O0bVJ<0|LCpfuA~M$WNUEuRLks z4G#P}!v@~yz%9Nt3-A^PZk5~Sz^!~b1o(CVzEgnj65zW9_#Oe?>A)v`Z15rKz<+7- zr%!R&0(@A2OLXxUKkK~1k`s>r_X+S^2X2jvd@A{@F4*{EWjo6J3;?T{sp*CfO{PGr!BhwCS!c1L+rB*(dT~$Y&d;m!uk!`@EI0} zr*6YGc--OdQaIBwo|C{h-7Ko>HAD!^qZMb#soN)S{ zj`g$dofCei1>#w<#Na~)-i;lT5m;u!jTi=AX~WGcr92>D!`((y{UhBw;q={CIChR?L& zEjE0X4R5pIvu${X4KKFg+iiG>4c}?QOKtcr8-Aq?-)+OMvf+DdIKPB%hIQKTxwiOG z8-BG7@3Z0aY>x zzt)EPY>A--cJ(@WnPfV8gGo;WaiqV8iQd zc$E!ru;JI+@J1VcgAH%C;ng<0#fC4j;cYhjMjPH?!*82zZ1zwz+q zNff`4LQcotP9zfBIZcMp)3L)znoL%wW8F!b44CaKS`5;5$#XXWLQM|lQbC=(f%Y&hD5YKNs|E)?N8EVI7IuC zG#L!h{?D!U=X3h)BuxfFv_DCcVG!+4(qs@s`;#;o0@3~?O$I=;KS`6}5A9FV(>VRL zBuxfDv_DCc;ScRk(q!;M`;#;sK%o6enhbwvf08DHAKIU!$?lQbFV(EmxA40C9Ik|u*3 z+MlG!5Qp|BX)?f}{Yjb(Z)ks#CW9N=pQOpqhW00EGO(fj|F+s+$?3O~G#S*;{v=I? zG_*fSlK~CwPts&KL;I678O+fBBu$1gv_DCcfeh_W(qtGz`;#;o#L)gEO@=VEKS`4T z4DCXum~6 zn}&{)HU%F@e}ewmdn4%|I_Mn^T65452mOG94ms$x4tkY?zSBW3bYyh(=m`#bjDt>d(4YTnBtJiP(C<6wV-EUF2mOkJe#t?<=%Al-&`&$)-#X}@ zIp`lc=p7DPbI=h7{eXiGIq0L`b7u*oP&PaLI2i4|I9)E&_VBT(3*peIOqo) zbjU%kbh<(6b!$R0loTK~HedW9)QIU5)OBvL;lOUdEVs}M6th2VC5KE90(65LKA@<0H%K#%c>WsI{GfWg)7dy3nHNHmZX}Y zU>-7CLz%U3aPDu7%zj7-yQ!>j#bG1sIaeADgbyMhSl|h;Pf!0Y@af?I`>XyP zimd{?p1J=WV7*m|Uj5veL?YgEeXlZQ7!5!!C#%_Mg?*qO`v<4MKYd#Qui*o^3LCuR zPPtybQ@%@Hw%?oAPAT|&SNeVxJA7Awy%Pw(J5*C!t);C7ztQrO^EvD0fG>#&U;ZDL z^wD;3?Q3`mXleJ-qkK3x0b7-c^p35{sKlT*uZ{9W0sM*hGLJu((g%vp1=vua`-5u( z-NUH?S5M&ZxnMRjc>f(E15aXbHJ^vA^dv)V6-$s-3e8vwb{|4aH1t?7E1*`q3PLX* zP9*e|sA5mrRK#=LiL}Y`DSd1+0wII0K1Hpa=kvP`MUDj5DCOP3%UNG|DAoInJ0orT z-I5RQZ3{A_;Al#f=$6a-;%_Kw{k&{{`Qc!Na^c8R!r%RJg*Ta-z>l6if^2De)szi%MBrc%fw8_Cw&hk+fe<975cX zm%SP};*IhcY<;r2Q8l*sF-*ZU1k2HJC6b!)ifxhW3b^AGc`_+sW$_-PD4d z3-TlM4(G?=PzJ@Rj9+hMI+Dks*AN`PwEWdj5g2V`IG$=0S%=PwXH&(gPfMxQ;9Kb@ z@yzGZ^HLZ6Vf}&b!TbQ*2Vol3zh7HCAm2(V<|VFTnlcKt#hvWsYHejkezg|ND7YoS z{>_$3GRrQI*+shheI+IH>i&=m<&GE&3C z%VqE5-QnRzJfeP2cPK49ygroHlOe@ZN{_IM5THQyh3H<*Ue96zisk^Jl7zW|UQHSu?6Ngd!p0@%YuOy1;{&KEL_^I(ed^HqDrWiq7y< zGj{>nIwMQ&by3bT^ZD5|3R^4b4UQcJ+Kd8#tn zZSgJZ!h9o`^X&(7sEO_Zzlugy&+y4=4zUjn_N&+U)wNXq3^%yQdByoOqV-8;aRyTj z^eUd^NUml7Z>|w!acv@!oab66vG0E|&TkB3_W3Q^T>}9vm{(ZE-hgP8nW8l@z~-PM zgLyOAMG(Wh5{0<}=ye|vbIf_Ox&Ra2DDd)58!z`MYH)(&k9=Yiz~k}x#7c41V^!8*AI5;`0>raR) z_oi}5>rEkw^V82V{A_kLt1l?5X0-+RdMa`Xs0!5=LVU7Xr4SV%Ji3YzIN29K$5lgl zsd!TgAj$O*Rke@^pPFlx!p8YovCJ;h_uyaEqI}G@RIAwqU42#stk}IN1eqxwL<-1p z*$6pSpBS2nHn2mipHEa-8QMZu+nLPG6WCS?i5v`7Gae^48zx2rY&$b=^QDR=_siko z4DZ$n2&mS^L|$}BH>vLK_-q9I1VNX0x1NP2N6@dVpz+}|ncfJkruNc;BlbGpZV7)- zA}0n(uk9tPV~qa2Do&BjG4=RQ!cwY*w4U9I1hwDQZ%X{k)NA9HNE9`I=J@vn%x;(ds5EdT3*4ut5@|gM~ zP^>%VwepLV$erMZq;lpdTJ}pIB(_h{>Rgx)6z?-xIda>X;!Sx9`w{0n@p2s20gJTi z%>Lj-awoEq;x8DCW_{hd$J@S#@)(l$l1sPd|xX`?9?u-S+o908YD@GGhg{a*9wtGSO<_whS>W{y)pkdSK1*=ND9h zTx^6Mj6ccxjD)C3a5~lEJa@WE%v$90TIl&$zN(|+ZmJ3EyJJ7=+fT2Cp8Q=MI=ou@ zP4RC~*J|yj#ndXAq~x1rc3Asv3xZ{~L{iwxeg@6c9Y*gl1N? zdd3`; zQwlJi|K(@L^c%5@h(x{ZlfZiP6XxS;ZPq_}T@o8$Z-Iwxt!dJ=-pBw_X&YT^hz}Gc z4Qs70g@-TmZhZj(a$@C+ya(jHWO`qhKYgunbm@Cq%fL@A0z4n8(k=eE&r#>`8yOl;M z-ZMja+N~+=VmDYe6a(K8nn2W#D zgX6l$BpzVhw2*x}KQO9qKdt!LP-0)AhY~F8fZ8#%t~-NL{0}95i(1R;89w8BFsf)( z=Uk`IrP^XwxF-d*qoh6VoO*Vs==8!KcSdI7&_hQRcIfc&`;MGbT!#{ey#Kk+`^=Ge zyKRlqkHuVlafw{R#C25(e^uk2=oVegG}@WAnnBhiz7|H}ZQx5T=Xd@+01d9{~}gf6W=x z#`#dLe()}_4@|AxHpi=eif#RfG=mX5RJ+{;0muxEL9{EdOIVn2XT&Fy zOoSfvvo|P3mFqJ^br%4v53Pt_>MxBdw%kfY#*sGQ%qOYK6V!hw{{C;Q&Qey|Q|>pLPyZNB~O%6jU6{I$uouav8!* z4VgNEb;JatDe){ndmWnB8%dZ`pE{mJ6$V+U>V7Bx_Ucjnw&6yirf8d@^3of%rg;IZ zi*J#?BC{j3=q*3w4R64tD6>B+?9bKO)Yknj@ZXU9?2Pc);>}~Ug`b3nr*6uN(LZTI zy>hnR8<~T5fBE0MkI+jjkB1Z-;QgffrTCrJTfjA(@Oard^jB;YViE4wz7B)T=i!gB z+56o4j30A$eekNVA*jLCU`J^ALRFbpLwrC6z5HegO50pc$=LupErzA5Bx_%xQO9)x zntx9JGfYC1Vf?=-Vri6W_(T+n06RY}%-q0`8G1YZ47%JKxd)l}%a3})cj3h-5?P{H z)XY|_2i%Im79+9OW$oUCz2ehDSNqvNWNcikTnV}D+WJrlECep-0SvLs&@9Mu01HQ* z4qK>Z)ZwI0GD!-(33pCB6RC>5?bs3%bE%czj~xZUIhfc-xyj}Gy^s767={JLBNi%N zbX@x{fzTkuHhci}4WFsU#`a8Rs6Jk0L=3pjc%LZ^pUVuTB_#eG;g%_{(4SKKy-z-i{uz38_uhdn44a^XlFk`43M2A5}j3c$1bb zDVlpCG&$H$8ei+!z6^?zH&zPPuv2m(n&<)D;r0q*gsP9biO+glGF zkb>t#COceoDsk|kclMV?Deit_TZDB`5p8v{jg9sYdg^#Vc!5_6joWgTw%VIKtY1|! z-0@?j(f#tR=(nY)rd+FNs|Rn?>ZcW8bWST=x`e$$3oq?nm(0LbzqD8lPAkF6&<*p@ zU#rW#Euy_jLguD)HF5(CFEJy>&6xdq6Q)*kpV`q(-?K$ zXR^mrs;qD{m5Y07X1tH$0L=_tWKWsMNc6CeV}7bsIT>O;jxE4D`#3%q%5Pe5boh@8 z_*!FB+_zAzo-!xyql^X;8Sy?&vyVZJVtu{tRH{j!`&d5Kuz^v!Wl`xog^tz&gW7h| z73e4|q0n(I)@^i}OY0bhv zx)pPxZ*}k1Lm*tPo~eW6#jzf+4={VFcI=2dLY40dV>C*0snzA1!X*T z8jl~*V?S0YSUO*O`p$CRQEbB-H0zpKzD|NdFpQ^O+m zL{st|rfH;gmIn&e6G?{DoH$@sBQ^ot=E2k=Ljx%6buLe}6QnKswnN}Bo5?^H zwzb01CU`kTU!-N{LOEVAUi{VTwCwyXXP-q zPoe7bCY3y)Xewu|6}#f^zTHC3ue{yb=0rmb|5#MBgy9 z(}q+EjV?VRZ#nZk(9rDCBQ%SAyKCr6k}vi{RFRq#KAZAT&Ux-2 z$_v~ALtA>VI;{jt)U*O)8ye7*w8Fh;0tP~DLDu+Vu%qjne!Fg#^n;#)8{7d&1Ft zEFd@e!o%g8M=RbZ|GHSK_VmZU5>EI+6T-s{6teoE(PUXFiDi3gWFWjl@{q>q5Q?+d*R|zFyY0Y{x8u=5PrLUSdiW-)_p7xWEF~ z&O+WeR$gy+y^9QEw;?x@EbN7od>E;i-;Fp>gGw3TTJ#*&|9706r8 zeHZ-{yc5Q(gc!5E(+^GbxIIP?xYBNXA-ZB8pS6VHHeQkp3hM_oXnSN#NP*& z5R-Dv-t^A^D;N(@)Eo-Qhdl7@=?+R39{fz5hoy-tLOr!uTW~~kpVqPup`)phaX%{E z^;6gwpWlf;SZTnP6aLJox(5~^A2n*9yqCIrFU8Z-KEU#mKBr)-9E#1xN2OlV}a1nIv>H6ck|N|}$fL@<{I7V^uLRkA=1pYuk*5Gh_+ zrSgf(HV&#-gc>TV5gmoWI5;ZNhmwgf`v=v`R@hMNDD1WnJgSp)|J5T~qEJh!(UQ+U zNhG?crqrC7WKJxETn6@;jY0Za)Hu;ee?ylL)8+Zk)q#kQhRG>NWN?BzI3CO8DAq2m zV?6NUxY-jr86TuJv3&%qwG%v%BQ1F*XBC{ek3SzG<8a)K1?2nGcsEM#_+C069g$)LXbg!94W@vp1cI7TR@nu*0W#q*Om%D^>6a`84l zbRi*@Q%Q)&EVQ!&8rtG1`y|%L8@a=j{t4J^XL0erF12=y6wK1HwPX;9^A4`+8CUf( zdz#cnczBX`>%CBO0d4ZwCvg^8z)vCk?A=AGGL=~OQ`9^bFc-EK9>0jh(4syaKs;g# zrE#0Bjb+=?gt1zXVyD275$XElJvMsSmdj`HPBUbWYY|d^B!x!N(=B;-MCnwGecjuML@(dA8X50#jmWyc9hvW- z{(_pCI;4(fL!nXF=)usN8J|>oDoP%Jsc_URQG|}yi(7%qL=f7gE_1U`@ zticJh1}6sp-)rzavj&-o?vTf*Meq?+nAjit@p%^T?pu@!_QdE5_%=2VEt)~>nmH2v zD9O?4sS;=F-v(p%jqI?GNF{SoUZh&FLK%M>jx9pGzv(eJN!bgM7L}uT_=sR!5sw1&tLfrdz&1+w?IUo1#{FEQQNPtb@rh zhr12nq*5UdrUe=DQtX;C+%W2Acw~6!t<1<;%3gv!gKTxi38oKr1{ksA-VDR#Abs~G zpy1cjWxULU2LTpI_|L6>YaBTUfKtQx)1LOu4@;>}dogQc>FH~od_Id#D+}XgW&!3w zcVw4@$nMnh(e_x;j2Cx7vT3GMj(!;mJn#1*Y;7&IwmPGLn%hdv4I0gD%E*EVhueu1 zw!d0)XQ0i6G8-qeQAV>_x7^DeHc+b{@ajzLGM;y08C+YCOKvOBhqO%mHjZ(~!y@T% zK_SEqgX`)zKV~~KH(Ik_Bs0oHp+y|LUG$rIdXO+4U@t_=9V2PiPpRZ&J%}<>>ywcN z9bJed&wmM0ah?USQ72(TfQM|gHgg`CWAAox|E!zUCip7OUnMSG@j zKJ7)KfNLOesAUG@^fsRw9yaif?9>E*k5BEQsASG9e;3QhiAGfKGbKsO7b5ZoJ>9kWnf!;74|~R-LXe>hynIn_uIs;zG3< zh1yU-YM2U5yjcEXJc4TNzlD8>Q;_fp^cS7@{-P7C#2OTyR-wzajZxSNEj$5`VYP4y8|wUo#fO-CJ{dT0!wcRztBGeTAsWVaKaLrqb+_`eGFI0Ueo0%GQ2&q%7(Pjt!^d$h8=Bvg>fSgDj*aZ7 z0)IgL8+*~+=+w8dpbP(z7x~a@RI#APh`jl44!U(9-37x7^ z5jdu48t;a01Pc?1CAB4l`;%r%cwDhpp=I(4YoKH%=ac@>UqKBR+_Fz2x?5 zpG|+sBa`)GQE!;{VJ?J43Pjt2@lufYNFo{^EE-}jLO+Zyk=2Yy^!^-5W!QYlWm2CV z!-+nucQVV+mclC+2Vh6_Ve~4tgKCC0Cqf2bloCvZUHYwnmX)er!^+u2byTmCibWiD z4F`kps~Zh%coAz#^@aCMf+9}MX4R=#GEPq6IEYv5va$*y?|Z-bUr51DhTlsKmXaH~ zHfO9~%N_-vRx;P%NNe%7?C~f_E4I}z>(8vaLDDTKD|2PN- zFc|2L#J`6pR6BQ?9o6SLjx=yTmCPRF4&iJ_u7z22D3!GA&2-$;9u4M`oZ;+*&Y`wd zkHMa@IF#0Y(CdE{PCb!m{H>x_*^YdiEJ7OC(;mENxB8yfG5Ykar~2Xt|gW|3@Upr3mYE>b(_6@#d_ynh2WbD?Q!gmT9Y!hNoM-{xF8;)KHm zT(r;<>@L>#z$7NcbGx=@(awiVfO-jvvj#C)>~U6Or~-C~lmS$ER)8%i(C>ym4X6tW zpvK9nc$uLR421xT*i57>-zCC5Q=W~ zv7J~5k~3ui_V4qDI6us#${ijks?0u9>Sbo>L zn!9odJEgE`7>6kdzN9%k?9%1(0}o`%Y9`B|p18AZz&0g)eroHxv5OHw(SGhh z1`Anj1@4cW?5f52>q1stkp)>(*lUZ~N}M0{Div-DAo~ZFLG=Yb-8G6lFZjrL_YabE zqgFi&n|*}bs6AdmyC+12gBZ?=TW4jHohR3-2F;dKhZK5|)lyj4wLl6QIm_c3D(Wxq zeqdB-wER`?ccO9lqTnc)<`P8tvtlfVqoXFf%5G%lJ<7cPfN8DBCOX{uX4jc1V><0+0)+YS&$1Zqg z6d314;WJ}{m#9yZGd+ZVaxDrP-7B>rb!-^+Ce(Ox8MrI6dHQ9z+hOoTt4Y=8ld%zo z`xZoHJ>VPpGjk$1xfXuU=w9-DhUap873n%-f5N>8RMPxsT;YL);YqNW`$JJtN*5iD z7=_UAd=+*;Dx}?B2q#cTqHjboq@uNS-0P}Dy{Sa?=^+;l^ppBZIEJ0C`4%(N4xTBh zS&I`m#H8G)5gboeem7;+MVoIU2YsQLe7jXAq^pHRD%VQS1FZD1RnWea1vRgdi_H1v zeTsb>HScjpR&FaR9+1rH5;Lptb2_Rkg{GI%fiw*{kDm87DoC;j1Wl@uwdP^H3AeUj zghgbd%q}b#C4CD@B^PrawnpeC>N_k)Cgb28zUI^zsKUuv;nuV)98FT<;0&0C;ks9! zCXp@F&n}T!DYhlMsoFVR`~e53w`2E1Pavuf_B_}yX|zv}K*JR@Ejz6V{?-`NM$(-~ zs<1pZmYPpQtO99?Pplt{JE}u#S~e8+pAe?bJMRYz7ntQ(!odZGPLG0_lmrWkdGR+& z4`P=QswVfIK1Lf7evGDQZTyHBG!C57kYoxud4~2BAbWW)G#{J-8ZbD+ zhv-5MPwZ{~31H$@CH3b5FdK_EM1W%)PJoT=;QFJae$W*dpjE89symhse+GCI_NGVC z8r(EU%U09PMJW!kwQYP=IMdR&(G8jbFQcpXOHcO9UDF%o|N5_S&!gdCKqDn3FO;^;dNMsZjV$p`fTKg*sR zfP-7cskU#1sWB;yS|64NMR!?4lse-*lll@7p z*0++be|Yrl)8xvFH$K5&<)Mz1Q**-mR_bR@Q3EFumn!LqiKVk1V%-aWrFKCxXMiFZ z$fbD*1Fdy(iL0NkP~=0DxH~dL0#ln>orYaODyzi>kDtQN7{d>zB>!U7lYQhaveM8< zJOpY$|1FMKO&)KDYdb&Zfu8i^LQlHf)l7~k>{WO%W8E<~TUF+IQkA(rbv(_Ptq3|| zdQJPG!qoAoxS3ZOyvk8$SE@ z78SVNpi{5{NT*9RFmGfm;9g1C)WdykI~QlT6~n{P8oThpiNA#qj5G)}4++Uw!jOx3 z5T2ti7=GH=&S6;?>&l(Lg|(U`^vnJNS)OR(?`9|Qmk!~8<6r`#lD$Roj{cKYg|rX| z-o##HI?jVKvT}lxaNLlQjpQkrys*ch)hITMsWCrLQ2s|8X)*pTR{$PUy`f}IlH04 z**S*yO#BVh0iNX+r^lnjuBP*BeirPYk;&et6|l`ojTSgCVJNu1XDoPe{`&W&>|^#S z9k-+66Ak;w)?b+R5kIuves~2I=VM!xC-?fHOJTAIb<~t=_cPq1z_0w(&2hLd zW@6=Be!%;qeQ~_uk|W+qqu8Be8#oKf>Q(NK-Q%8ztE)xWO%FYELe^>$Mex3XQy*+P zu(ntCYt>_2R1Etwbv#Tra7~53+8uYoW6iky3|}prGlLN_dxfrx@_S|-0qv>0He?al za-stdJ|Kbxg#@>A`XV~vZJ=vs4aT;F=o+HyG56)wSzv2HSubWzQd6yyYs^>JopOn; zrbH!3G`W>{U3WfaKw)kge>jfDlACt~#SN4n-rzA}#lJ-90+dawQ5d6bx4tck{>BW~ z3V*wDebXZFL}rEuA4Ujd=5E7;!kw+IB&mY?lbm?j5BtEy@O-hRrew_c-;tg=?YL6( zNnF8`X9t2$Vaa&heG8$%!o)tzTIHuVUV?cZUQlBsI3!W2<`fw^ir}IcZp*?tQhg(K zeVPH=4*=N-EO{~SPEN!snoG$(B;I7ptd0~ zaB?PtGZz_0^$s73@wQ7wh8N5$^b|!2zlm)s^?*WqmVACXD{FVU{90>)tCvK9YJ?2n zA%O->=`%zap+?&F^`nEyDI?yP)YbJ8qm?f9*3q2E0lUZ;4f8a1r zi3}bO%Wz{HN~J_G`nNME|2w%CJ@TIt^7KekVpjs+hO)`6ePM@EfqNsZ1u3yh0WX;1 zjl72T`PqBQeDv|A>q*@hH?Uy`O5-z@<-;_a(j}Dg)&e(8O()=4|4}NrPfc}1glqX{ z@gr1`^UN8Um0^6`A3w^wkEFE(S2Hh5^bw7IBt_ZQC z0Cvu}b%AA7bwM+Ud6zVvCc@f+pnmQE=EvsbG+=l~j-%eNb2t7L_#2$Um%8Aiu|~!x z6yQb@E|VV2q_?sd?#ErYxO%HNFi^i`Kh_nf2(3$ku|FXVuW7NS%H^RUp?8?0A#u`Wb{AorclBKIn!& z@vYRa#O#F~wN~GTu?gh7rv^`nL*&vKvN5P?VD2;DeE zPR-0+u&^9v5{zq}3`=sz28lx}Z4+B)LI~>reZc6c)h29DGp!T0^zLdwH zUF8(qW1(zGa;Ah*ds1Aym#`Wya2o?Ne$isJ9)8s5pUAz~xAJfmwGS4QsaHeVF#->g zMq&F)PsN78B63=TUFIcx_`zS^=WTxy7z~B}qL<|GvDDzze%DLbK*>c%VRg)5|G?7Z zQ@Vt}owK3Hg8X_Xyi@jDJxMFOhEJ68RV8 zOcDtZ$kwl*1qxCJR38=zn{TrO>|WbMOiG-)a)XJq-O7(wQ=zsPSSe#+j^J(Z5^_$} z_~6Cq;3dXl`hQRPp{GXX#g#%OmP<2M!c4+ern#wljmrG|Rx-!vWzQNFMwGyo1GF4G zzonwp;}G9Xh4n_$cr3HOEM>3IBANzlMi3(xD_mk1j_+#?RY-I$-&)bCj&@hc`Gs~L zc~rv$Halpbxj8Y02j85;kFq${+_)D|?fN$^89KIK4d{(4X$v+hxha6FCCW!%!1|+O zGtzZptmIpQ{a=%xU7mTk<=WVB0qrq z$=kAX;OTm811(hZS#kT3;I#7CrYR%0PDV0{&i9XLa{0>}-sHK^F0LqM?Vc#7ddkTc zLU%why&n%yCm)x7!=)HvL4{*nRI53ga)meOm zjVXAk#cIw>Z~HjdRZ-JeCZ0SWS-ZEBs`B^tm+^s66FK8W15sW|G5p1s*lFhkv=ce_rN2IuWYHNWiqy=nIeKVN}`ielGeiZrv?j%9`E!ZNCKZsUv(h;XDYsK*0_V{ZNK6P>xCZU2vQSW2NPdylPUEC9xDD zjQIFK4<)Gt07k!~mgpa1VTF$7Jg$#KF{wnpPhF?dK8F(1v3ebhkg|&Jf}mpixGW$e z7>8JlRs)oiJ`OI(NJO*0k(c7?Cm!Pl83e?%yO92M(~U}|cXb+luKx_pJ)a7fXOOR1 z=Nf$yZZq&UkqFcn^W}Bw%wpn4WC)Yx`Hn=dVAa95We{)G6Zcp`uifG*KfEdDyy+-B zoR5!I4UYa?FR@R*@hy~jJdEA31XYv+ zyF_~MR@~PrsJjVgXE4%Egrj0H@r@4Pm$*K6y{=D#aZOI0gzXSMhJbq#YPySyA6PRJ z1WpNE;r(=6Ow7usuic<|p(o|k%jm9Ek2_C_&!DQ%`8~HToksTh-=I;f7GjXXuTRPF z4S}gt*?jJCKx|aGGV;M87l)fL+UdXT!}umsDjD!zrX}5eJ@X(i!xR;o%hOYNGP#5& zmdpOG8%Y<-4L|2=pCL5)SRc7>MA$%4OmPA+Zluf;B!_Qse^%Dj<~sfEhe zaWYfR!Jx#~%jV<+$8Z^khfC}lM8UWW_+drE-MnB9I7zqswI}Jk8P3%iq#sC*b4eVq z?Qeo1m5+f+0xB5_!z8YU;0=Oh|Iax{y^38bJbW{ISuai>HM2f3{k1{%~Y}Ee~ zwV=Z5Nqu1gq&03+@T**m=+v^&;3M){#Hx#Ffy)99OQWzfXBb=p zr11W9IeY;BeUu8(TeQtR4e9c{k?$dlDqnM*T7bjMN&E&$iIQ4kv?$dBgII7pPTy$_ z`$r7R_hl*3fic*z(EQ@lkL)3#Gg{A`kK<{)5HcrLjf(nN58aLPw$ouVsa`7BQmrbSWwQ0Z zzK#21ewxk!jPDX*0~UT8&5E z_N@exQ&)CmVXHX`z&Qe*x6`H%0Dk41ux^XG0u_z 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 P%X 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 AiU0rr literal 0 HcmV?d00001 diff --git a/tools/ido/linux/5.3/as0 b/tools/ido/linux/5.3/as0 new file mode 100755 index 0000000000000000000000000000000000000000..95d53d8055a0e05203c622a1abeb2d84412ed4a5 GIT binary patch literal 186584 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

    1_=U@@A)emJPLCTtVJyCKMv!D~lS9aba`D~XY( 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 z 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 R`G20x-yXk(ET`uP{|zBdXG;J8 literal 0 HcmV?d00001 diff --git a/tools/ido/linux/5.3/as1 b/tools/ido/linux/5.3/as1 index 17ff2aa7c1dd9f6f158c6205b3736de9ebc63cfb..c337e343e6ca15c8fb68c88278b99c377fee67b4 100755 GIT binary patch literal 923864 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 !dO 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

    -^9SE-Mv_(z`~#v4fEMLXE8py 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ĥUV;&! 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�{6dM`l(fu5FKlV!*+U&O%#)Z4~?qVnZ9Ma?0q)8 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 Ckfuif literal 2570888 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

    `8cD%om7_IclJl?V^g#~ievfghI&d3>MA=m3 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 z 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∾UHt}M0ZgNElX?`D<1 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 z�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

    c&-}3|3M>_fF-@rNKYpS{a$#cF1 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

    a|PNh8jR8MM-j4;g8S*QSX#S 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≈Y%=`|a&icoJ%06v9(e1T@v? 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%0DmTdKIi_;gJ8I?A7)e}eU6nST3}_x+1)^P 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≠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%0AaeV2D^bn#U1#0%h3?eyARx$<{1`!hT>2m6 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 diff --git a/tools/ido/linux/5.3/c++filt b/tools/ido/linux/5.3/c++filt new file mode 100755 index 0000000000000000000000000000000000000000..65c63d5b08897c0fdeb294022cb8a679b596233e GIT binary patch literal 84184 zcmeFaeP9&T)jvL)Y{&u&6Cgmepi!feRx}aNM1y8vHcoKCATLti00RihOA5QZw1}ab zXl|CVwraKS^v%+zPc5yAkSZntlRy;%Dk8oGRG4)|LeLOU*x%>eJF}TgnYKQ^exL96 zk4D*@d+zHw_uO;OIrrSz`vbv}6pu%;{!*puBuZ5j2}rS-F+=GtQ!Euo{iI^)JZZSp z3;ACBv&uQY_oW~cf7Z88B&Ae*Q@t#DILr4i0hX+9t9SaQdTxK4b48BzEoF!_)k~wt zJdt*O|MJfQZhhP9@&4M)dXDePfPh=y_IgB{_Az4Q?SY=(IekREwkyqc&2bXBs9x5! zqI}kkJ-;QBp4PWTPZ}frD=_Kl{LV%m{bln{NpjYkVb*hgt7duYoBE)?DIbOA{7?ET zGwZ4S1YUploi5r}&2Ou}$*4zk`B(o;a!NOw{khFUhB*(`w-}WqU9oV%U0031V&R;T z3l}U7uN=9u;Hr^VjlO)@lFP+}(YUA&;;9=ZO{3|kCzwe_J{Os0n({YqIXHgPwr$%V zxT*D9O;@E%`s2Abea~ux`lK@SNA;~Kw$k6k1C=5CQ}ne+3`-^0?f7>m{*4&EZdjl9 zP7K^Vch{o&r%wzl?1&D#a{GyaPygz~KxCiw&x=mZmiZGG_@yrJp&0Pl+WEdq`5Yi} zw(=1d_-z>d*~-f<<&V0+n_b%J3wSpEIseuHaJGJbbtF_-ecMZvT2+ea>NQV-5nzSX7t zeJ=3lUD~(|DDTxWxK#%aKY;l7kG(Fzq4H0 z-|YhL<$~`zm-4@KfxqPfZ*UoBhYMbdUE2AjOFI)>%HQQu{@X6)C%eGcyNvUXF6~#l zv~v~O$;LnD-*f=ZwvO6d;Lo|hPrAT6UB1 zOt_`LJp=fKykyUhHnV)Oqx?VX?eveKr5Cm zSR9(ii_BfQAOy(lWy|KG$%@&b`Q=L%&y(h^oLjzJS~fSda7p=Wj1N^8moKW2=7pAq z7njct&6So^gcdBGBdwT?`k}dtD$s*ev7lnER55qy(j`l!c}tek0Dw{Xz0}jpd9xQR zl){Ul&fY66ojZFWT9(T3aj!J{t|jOjU4)h_TqxmV$%?s4B_LC=V2*U}0>H}WFIqAu zIZV;iqI*F_8WL}V*PbISST;KpS|u%7G`m8YvtTJld*)1xXz`Mngi2_^lEu{f9CQ<| zz)-0hpd!r)S6qn>=GjP79$EmR%`2b3WW{2PZqAZ$NSap>4wXxb?&Uo%TsC*^z0x9q zN_f%iWrWzGCCh0#%R{Rw=FYr}I;Ae=E?!O)o4xdIY6;_!maU@UON+vbX{;dBVq4cJ zY7UAImeY(+NrhC7(VN5ygEGq&+>KeHF3MNTL1B*Z?9h^V5|O0Wm9-#qbfL$Gw*_?cH;e&yw3 zBXReiU)=o>dD@us|x_hW#!cNPiwY&&Ic9PYznJpdVRcg~%sZCQqkH zdO@;Ttwn(z!4 zc$Nd+R4m%bcEGK6M!3N9T;K&R@M0IZ=78U9j;G84x5hKW1wP9KKHmji;R0Xj0i7|1;N{ z{O^FTHu)#R0e{kjXF1?^oA7K0+~T(pF7P}De1zFffdg)}Q|toQ9PqJbJ7o^I)y@nT z_$(Lrd>43y3w)&m{(W;il@9nI6JFzhTjPA#1^$Es9y8~0y#pR1rxyM;xWG5Mz&E?V z>s{b2F7Q?t_&yhSn+x12`UAKyH z);Qq#&M1zzj|*IeLb4!A|n z87}Zy4!AX*`3|_%PK676r2}rYQ|W+P?bNuyA9jI1;R0Xp0^i_(TjSa20^jU_TjQ*E zfwwr|R{L!ZczQ^zYr_G*$b`4Mz`I=F(uAJ;Y_;QafoHhDvs~cWF7Od9@H`iIfeXCY z1+KZk%Us|yT;Q`D@WCdX=R4pQ-6~w*D_!7~F7O%`_`@#nCtTp`UEmvB;2T}wn_b}b zF7Or?c&iJ1p96k!nc(v_2i&5w;ef}@^6d_|RldswE}7@qmOX2g_qo6`9PoF|etix< zpOtRCNvtnAEAna94!8W2 z1gEoF>(BC25`3lw#JA-)CAg_-@LbD3N^ny}=5WhDN^ny(f_`dKzOjmi3(Z-ZMrL3tH6I2L%Hn`;rqU;Se_yAk^jW)R5pTF4# zA7m?EZ-Zyr;4L=zU>m&E1|MRB@3X;&+Td+Ac$N)r*x={b;O#c}xi)y04gNJ7T$W&3RK;kNP_Hu!lqc$N)*z73vjgJ;{|BW&;sZ16lA{6ZVNzy`m_1~0b3b8K+U z2EW(_FSEffvB789;3I7CSvI&CqQrCO+u&cfm9MbDFSEf{+TbH?@Jbu}avQwH2EW1v zf7k}kv%#OR!SikK^)~pGHuwe`e3T8o(FPxFgKxIM$JpTYHaMM)S${1y_|+B=->o)y zfepUT1~0V1+idV_Y;eN{zt#qCx50~S@GcvCtPL)i`vS?f>uhkJ4Q{$Tcy5LbUTiC$ zWrHg=c(x5b&ITW0gO9ht^K5X{1~0I|12%ZE4PIh{Yc}`|Hh7s0uG!!-Z17SWe3lJ9 z!3LjigWqU_SJ>b|8+@e=KG6oRw81CY;59b*O*Z($Hh7s0{)7#Fvkku92A^VsZ?M6q z+Ta^)a1q%hGB?}cbk=MA)!X2vY0a}*Z15RY;s1R9hXVhhz<((49}4`30{=fLa9lp` zlot8Kr$y6tpYM^h>iSShqE(A*_if`XC&ru_=8-xQ7k_~-`Fx4W&!?P@*nvbM@i0%5 z>faIDolKKq*%50$w2IgO-`oCFzkpa$ut>+9kKjmnj8Ziu?v!EG7LLn1CnVn2s>h)WSR`Yj@Yp? z7QSQv0{>*13_swXOq0O}{F7-i^niadO$HwDPo~MR1OCZ08FauunI=OH_$Sk3zybec znhZDKpG=d%2K+{F7-isDOVmeJM|WE14$43iv0}WKaSBWSR^q;GayB zV+Z&r(_~Nq|74mBDd3+>lK}<%lW8)Xfd7{k{$wy={*!4klz@LSO$HM1Po~K*0{+P~ z8AQN8nI=OB_$Sk300IAGnhYPze=$#(`3*9|74mB z8Q`BxlK}(#lW8(sfd3a3{>40fAekmZ1^6e^WS{{5WSR^U;GayBK?3}fX);8Be=98Zc$dR7wNZ;W|PjjRvI?@40daNTo#*rTBNMGzo4|k*oJJS6e=`=_BG~%%B z^!?nCKH^A!98Zc z$dR7wNZ;W|PjjRvI?@40daNTo#*rTBNMGzo4|k*oJJS6e=`=_B^kB#QJJLrS>5m-g zcOB_B9O+ja>6aYo7aZwl9qB(h(!X`2f96O(=1A*~bhRUWpCcW1q!&5Ta~0yH) z8g-0y*n5m|*l@OxQj@h*+5@o3()QF z6VM#PC0e8_5gr2AqktLLK&^U_hGVS9Q)KMPOe8dY1I|?1L+7KhQfh1^2adTeJq$WKfx|FE>-!_*)L zH%(|(FX{pUXys^-b*Su9<0nuNkOKXT&+f)!WP6s%+HSi;xm~$Kxl@_BO+LShYViFo z|41p@eW%6_YLO4y%cchPw5Hz>3Hsf{zs8ORT@r(@8RU^Zdl*#v79KP`?H>9n>YKDC|lkj5!!$Q`*HS=eYxQll@cu z*a~DSx9AVFVaAl{LEW1k)K{l_S%WeysE5*hL49GmUzu9UwolX8=_&fpCD59^NBqei zP0#j9Qgc;$4!-D5VOa_rsx*^PBq`0pX&Yo}j?WnJD@h7Q@dVPV?7&uU?z3_o4n{MS zW{IAa=5(H7=UMfPCBGE2gBn|bnAAN*vD@xP`&d4zzG*WJ982hPWvaqnpT=I9qOmV% zc!BBeuzQ}8o0i;B(m*lD%)E33Q4y7%X8fZ_gEJ`g3 z%XKd&o5)7_y4GZJ09B6;Rawj&U?mJfm3=H4I=%H^KrsvrkaF3YHWrDGC@~IE@baF^HW@^H$oqu4I*f4bxu}v zHQMqR1lHtDlKzX&;t(mu_(<0%`N7+XarMFH_VP%HoJL~Iam`gDt1zI^=pr^5*>+$N z0gD_!m4KHzfI$M%vanY#Bj9OFmmP@PHgfa&sC&!0p=@Xu= zJlT7Buc|$vKJkH?{OesygYiDpr&d`|5*kJr)NMffSmF9c;s?XCP?9RIl|sYhO{vkT z=(THF==?+@YXuw0o76N3!-^}bKa^XYlN~u#7D|ttx;cDNe1wKd839(PvSW461NY{1 z`c&AtD$9=1&G^Wvi70o4y<9ynN1tZ7WxU*Yxw-}`B=!SyJo8OPg22R{IW=b%7%CIU zjt;V5PB8?^Xg%}0gnX1H8@zV{Bw`1Qdto#NqbPzgsq753k`crt&Z^svF3}i<+br>C zWX%t-3l;Vb%QE`?ltkVsY%1)iQM&*{L3XyhDI-QVJP83LWVW;NWLfCk$jRw)bw7-o zh^F6?0-mc}JyQo0y>ES+g@1Xz4$(iA_x_vYfXbL9j zntQ#>sWGsQzFAiMCTi?vxq1zH_y-NPCmZ~PH<+A@=JYnRLHcG`j@Z?qYrJDz`V$+L zznO1hSy=#ddebz3c~WBOd_okt`V8hm@Y?E}88qOm=+J0zjF+f^xew*c(EZ;}G^)`# z{iMkC9yWyS51doa34lpaB5ht}ZM`3S2+5tp5pGV$9D~ls>M{YQspushQou3sg^^Pu zLN`WE-4-g*FolA>>aedvVw_RIq{Yo1vwjJiGm_V*ZJ(xa2^-Wk&`#eRY3^O%2N~N>IM{}h4l{^IorX=5VU9w9G++ViXQfZ40*)P*`O+C zV;bIkc~b}s_Cq^^$<=?xv?%$jG zwvq888xiz*TwoQGBtd6+iFz*fAV)CRyy`u2^=`=d*b02en|5w~7#&ug8X;GI4fKkQ z!3PboESi^JUwJB9eze}RkHkxLXE=THRFsWhNJLu)7ncT!UKSmst0@WeP`MhH!ou%t zo`EuyQ-DS5pP;WE30V~!>7AtCKGIL}DP!%&Uig!vqb302BVm=LvDpA}WphE>7X+A~he*B$NBXfxLQp9^B$YQjT#1|< z85$a31$FDuVRJftvR(`}(y{n3F*Spb+noLcWelm~UzAI-g8rFHtL}$lFa=m&giao` zzm?tEUo2-1F{~Gj#HK)T>zT`SLul3;&!$-`Wu#ULz4{&KoTl2k1xgAefeyhPIgtvU z(md}&_gyYmuLl`mUqzs^$<>b_5e=ng=@UKrv=lv%THP5cQT38+1y#nO!rbuHk=3KJ zq;OvJX$flu`yc3rOog>84Mvt)lg>^w9L*@MDeB9P)m%2HxMp-}?2pv!(_XWDJFoJR z7gZvkr@Gdvjr2u@8t*sa-)c%HTOhQ+RQ?ri^D2>qXU!!>t;PTRGujeOEq){lkV4Kak~AgJ9RJOX?zz}DjSQB_)qC#$nqJbT z!Q9H$SQDEj)h&c|WX$S-HaJa+Mq2wx85>eVJ{nM>KK_}fkv&4NTW`B#8!9TWP3NR% zLwSFR+Jo57QkuOvAdFOJpdr>|3`SE*G&4tGnK>MnI?6UylLZ*{=debN?TQxljWlIP zI#XHEpyJx1QF;X>KA$y)v27ME4a!T1taI%2DL?ERM z{VB|!Q@tnDySv|?@_xCocc>kdk3eC|fEe!Ty(X*fneNOTw#?|$`!ElBW;I8d*GS9j z4@hkr;At_+cOWBvxf}lApxdK>n-sp4G z32lr%q3Ke|+r=Z-L$O{+%l4)#tRc-3ncj47=zP7zV`f?KT5md(j3UoDJ0cA!0eMqZ z4h>AvE6sXJr`PM1t5UHk>E3*98z_}UnUm$}c901Z2bwGLrp(N>jpkm88kwlE8`+Wi z6m*C3-kEZBJpf9yDu;-nmnA@?zDkqmPKpmqGzDtbiN4u0IfS6X9_3}LcZBZ8s%|r;fPorw{bLOhW0U62H~Tu8=-2>!l4e{z4n69l&!x6_vCh<>=a5>{t9pn0 zJ#vmD7d8-jl(U|yD~U*BilYC8cp<=c6RUQ5N2dp{B&dzh8ZwC@u@rsuP~-(_{G$Vq z5i62SS&UoQDtvTcFLS9sL`{;GfVI=<^{2~Kw_q=f-NrXWOPI7Ln!2$SKnvU0bSfD+ z1(km#Rh$DfmFT}xaXyOc-g9r#7Zz2pPvP(;an}U?rd_ZOI<{nd#ElT1$-Fs69Xz?T z&8gALa>g_DG9S3V|M+J0GOP(uIEIfKb)=w%kSxyT6X)t$ zikYYg_tUjhGZ6~;6}WQ>8$(d9NRuU5J~K2l9%B3X5RG#& zzVXa^S?oCwK`%=qoAENMV0a>HyipGp1qH4h(9U630pUy-+00|S3tY+U%qIKsvS>av zq?hy}qR5;4-lYDHS@L?rgOui~91JOgcq_j?_89e8k{*fW@ofgIlbNaLKd{S=a4#iN zpB}$fFY)Pq#u^npIH47zLs>t{TK)oBFkW8P7ne~Gm3r$Xy-~WfHFDCk<^k3OX7dsY zRu+w(sXu-ia!amWh}q<(8tqt;Ty;C8cc{?NXljj>G?V=4(SeY{An3Kow`41{;>#$B zEdf&rdwtcVAYC@e#ky7~9B4t`I3N8O(~Rz7$j;XNkAVO%I^bQ^|IBrb2GTW@C~a#d z8%AmK5UWkEC9Nc}lV;l7w5UgGPhsiAPO#X7>EMeLNa6HoQ4TAJ%VgMO;5iBgUG4Rg z(BL3ephSo0<8T<&3)boP#=!$ba9>n7FCyCuY>KXMIg^|IGocIqyo(&4de!+paC|9y zm%E&~f}#=B4=C~S3@{;gKNnh1=2IDN3wK39t~D1WcB;__i+~z?k7aOEMrDo3^^p<3J^-5C2I! z`by-yM&yq^)>DD#-Bc|U$Md7ll9*;E5>2qgifdPol^BN<*YH*oI~lJUTMB0=Z)tT- zj-Dw)3Fv^L5ATL(IzB+mGJItMz^<#_gMAY!YO<%tcu#La53+jV5VI%tEDbT%$F-jq zD8KqFEeiFlxHdFKVrGla5_a;Y$LLGdZ%By!04tG~Qdu>%Ra|)pYEK?IjC`C&yFhZR z7YM3A*b8x9QVUmrpo?0=@sT(2E+R)$RQ&6D852Z{_mIq+4?QhrRJ1^PTcuEKR<$qnwJ->jQe#^Pk{M6AFn9s~5zU zd@|9jU|E;c2Kz~j!_*p`NX46g3j-dcUD4~sjF7)0OTWbfm+~w&Bz8}#$p@S*xZkRJ z54-LwO?6OTH+(%`U(XM(!TN$Rrm%F;9nM@8)|-6Cvy4aj(J3IFsGB?`Dl5?e5FHSS z-@zy!G(3~_6*9EbE^Ic|!>hQk#rpMNw6L$G^%7eqO`Dy%ip zNLqv79}Y9wOw%9b6bfSb6U7p{aNasRkEPg%bv++CPD-cd%%{`SS;p63x@+)(&8H*O zS*(eVE}DXqLnR7pe6W;AukMtqe}SDamTzix@i1TAI$vZvy2m)&q+ugyC=P5GCt(d= zTjml=?9ji<85GADv{HC08?d-uLl+tbfm0%yw(XSk7?F?jS%zG*2`Mpe)%7sdDbjSIVhA4013s8uqq|Q&id-PXMEpX1%D_WuR*jPd5?Y@dhvRHvb9C8kH zd5GR5OWv~?(Lvazs$?^%MU4EyRC!$jTb}Oy3#blW#bL*n#veX~I#-XQSQ?)-RY6@a zHwp>eJ7t`hz`oaaG6{(f9)xH}-Ji#Q;KGuyu~BT-{Ha z8LptsU7vJXpE?wzw~3npu!;ot%*19*6;&Y=1F(~mLg}AR5U6erQV=qdSS(lf0pWz) zOzhOZ+K#8_RXJ7I)y&q!A@@k`Ux_^pER%XtCnN^QItVBKg87NKXVWGA750Vq#EpGT z-h##c)wx$70jc@WLZIYn4Cv2rA{Hz47=ap}9p@Z1%D0RFdsQK)#tCfL(3df@e1c7dd6yVgVPn__ zMIv?tR3-n$LmQ!@DU}82?n!#mN2g*Gm8-`{fZ&7)I}Re!f>8VO63yM)zEG6--mXTk zV>o?UOL1xM_b z&|-=e{ZXziQP==9GuB`f?#GysgM$+g02*%2JD=0RNocsg4sZR(5<^@Hd|A!va4)5i z#Q0FbcXMs6HHPtnJCMP6(0Fpag6GbAfI00Kznb-_&# zv~S=;RBt#)d_&c@eq>dr3Bk!{J(y^)7j3A_6D1Agp`W7~(Uz=-$idXmBDFBm`$Kr^1>R>;+MkzcNewMThLK*&j zI&F{kuEF6b0pQVz_GZDsK1vkuN5nQFK7l{Nx(R||qxk_W>V6jU2GwWElJv{21@qp4oBF9=#o zH1ykOxKm9XXs4l-wrFUjeW`r}4TJsstdP@CO}!E)(pb#+<2=Jp;E1yHPtYTto~Y+{ zJ^t>%SASpxv_1WyIdqzau*wH+rw53|$Sy=z2J(+6Qv>-QTBnN?UfHas^9UxDb@0PP zT9k25tPT^pcW{G(R(R%fV;f{Jq0hts;iEM+Ux+p8&9{DQJC2n8`Qk$tW;9L}ccXM8OBx6h5# zXF)#VC==a)3EETe$h~7t-fJa1!*>G*k9QFNQU~!RI-(@b(YIRby_UVItLd$9gSI4h+)nSc z-tb#AtAVQeQ2qq{zegc*12{n-yw3uX@z6mMUj7_9Tx9jSl7+#~W0|R}B{m&4%_RN# zQL}*57MLAUogZ=)^%Qos@hS`yC3-dH?kbU&De{a>$&BG!hy-=R%#5E|8FDqbw)7G& z_SxFZR65g))Srt4&N%gw6n%O+o{ZZ6-c)pLbs}^Dw*8QowZsqWD^mcjEV{Nl z+#ac?&;hCv{tz6{WY~vkugQZ#b2;;~4Q0 z41+aycQ!ncRR7Lm-y^M#c6%7i73-mII zPT-|3i`09$x@?Y7uA-pI_~6P@GsBRCW}ONgiDJ?yT&1X+kHUGNs;DwGx^1QaFX5HERM3l?5type5pkMReymZx>a`CXl*0Cil0m)ZlXDY!EheeJnwcp z1H7qC0lZ2GXC+&aA8W)%9h7}(Gc6;np)EVHQ)9eps1Mkj_Y}X$VmXu1dY?~>Mp4fI zU<7Sg(GUfreDG9_LS*cjy34>|C9G%^MA|4XC5*$%z_DW7T%r;Gn{zl612-Q#@JOo~ z9F)nhUTGPaN9wUV!SB`@j-AFPMiy}O4orA{XQ}?s?N~#K?!6j*({>1a@6}*k=oQfj z>4KynV5##d2FneKKEmB9V4YK;OTZ4{iTX+pI0P{h*A`bIJyyj5i!dyT`pyhp9#6?n z=o6qD!B{Yl_~k@>am`=JOUHO0j7JB=3NWDJ+P_{6q#dQz8a_FqG`#M`*W4$GKmfV= zeat~n&+Lmhtx`D+bz&xZzW>G9BjuS{kUv)kC;V4P6xw@V<(kvx=lq@{{gZkhi4P3lY7)uzh)&T9XoQ!$)qHr-8L#HYiv>ev!$W zNnQkxr_0r)*r>QGqZkkJrfHHrKNa=>O|pzZSgeiJwLBUn40+pJIxLFvSPKzekend+ z|ClH!X4^J*!=gN5gNYabM|g(SlaV53hulCqD5!t89S4p${k|#fSxi0Ki##Ay=Q53IUL9^719`30@{X1|_RK$czQhjtDr}f+wj?6*FxNLQo79LQIw+ z=ZQ&RP3V}s=A%amJ}RzxnzJBhK5ole5h!K_({YCg6wVeR0!1Hp#>CAYv+|E?oc_u+ zzWj?5-D{$Gp2-U$3WC#x&$&q#c@tlu`qESS z_qfAG1mko!`4DCSXZgB%1H}q_CiKry^$(;q{fAIB4xDYE9H5|72y+ zC;)#1pk8st&Qw0c@{3}ef_94i!zG0<9Kj2jy4jdLKP3UL3KAtas9p|DKyp)A5u4` zo9;(&zaM+;j`&8>o^*v&KGH)l7hf|KPegtu}`{3s~S@BLh|q6~L_dhNvo zh&w;RYxOGfiLjeVt%%W&F!2;gyV%oKigfbWZ>2#I^-1;^7}JbkGrxdM3j+fs71$eTuwikvAAU!X7LZla=5A-VcP z>ZOt5DWDK~5WnB%jgN?&nIl*4M2@{AA5V{xX_5L~v0tMYLTFcGXkMycpAmZ)pv|PD zllMD?2`R7GYP1Q;1iPH{}7wbB%W~GNKE{ zvPh~v66zPhFdkS%I{NHI)cy&Crs z>qCQ~QExR4@=lCvnsCa7YfF+a6+s0Am3A!%`6FF(aM7vjuJD-nN;F2jV3h5swuS1} zNj|8j%@2NpXa2~ZBe23A{0v|5Z!6KMS7RxM)@;f8fcM0EH2(GyVZ&Ra8K6Al`*4_; zu)1Mr6&c2TfW^n1tzUn4zx>hcx0&~Q7r2M2Uw1d;#~}!>t!D4Wxd{778;b76(#P^V zgpxPF90k69Idbwk#2=q53i}c}%ct|ZP$%3ahNuWCKhHb2NUJXz`^TUcj7mF)f5TymDb&tV)+Mwr+e+%=izs z!G+J-Z_*LJ7rh)_9$JWCMXdRQAfKWK$lf<0t$+w6_Y<^%%?Q*Lmx(VCqq~F7Tz%uC zQ`6yt4&8)o*eF{*L|?o^BTGy;vB?&51ls1$&=wU5us=PIuR2OA>^aIWWe+}sFJtvw zFu>iw54%hTd|!~T2!9+xlY1KP&jB%q(3Bt~?g*7o5-%xHT$PT$nS?~2qfV6w7FjqA zRpW5WPfhp6`=C+E!QB9A?PphZb01NRS|#`w9L^V-5?P&|A%$+WCPFnQVqbTW9$ZfS zWEj`%O0qiVb87TSTW6Zt$`1e&+{HUH*C8fkeE3qU$Dmnu9?B9PTw1VQ)a1LMMu7cp z7UV-6$&jtj^yW)Q+e{B6bg)Y2;0rT}0IvtBjL}?9Mx;+he$r4%s6J$^}dA0G~X zGs0eMdY%kRpyT(cWeOWB(J%WgH78{IpD5TwA2T})BYqD;AN3c?5Hq*M!161FhI9P4 z$ovqV17x61#+Ir0JpNmi{kB+m@bLs02aosbYX;&43wwjCK}$4tJauBXXIGpKC5$uZ z0dEe-?_|yF1r@dE@_>#56ZQgjB^e%brSP*gW0?0j))0*LQCN$TTYp1srU!;DohczI zr)FwDSlfNZSK`WY_-!rGq(vHi@KrTY`~A?q68X}zCM&WH(VIsUe%HP9MYetA))e|VG8xvE@e71?(lHj&#(^9#z;j$F zJZiiJ4+70xe!Xog#uXUd+pE@}qT$5OJXfvp%T+tVhgDX;jiwemaz-?52Xt?^hVyr9 zZBINSW7Wc)*U;wAZPLn{S-(FZSG%_*3vW`W`3#SqmZ+978P164N?!uCqsYe`57NZhk>!TaJL88Plus_<`Zuq2{Li&H5f3}&s5i|Y;=x1={1x_ z9dwk1Vl$N)8uH;|ffr=WC@>f*mhnbp^)+fiv`>TyXEwot8=)EZB5O+g{>2=9-LM`2~M7=_CADAQ@|bp2E{dr)pw zZlgX_F{)ML5X@AjdftQ+ODWvHY*f5~O8P|$gfrXE2TaZ*8%kgjY5_ipRT)t3z#e6} zqjL)1TG0?6WVKkhKb*<@IqYw^*i*PabQKNdO_jYyM^2en;zkIt;rF^U&&R+2wCJt4mwKxfjNV)pj84EI@VHr8bi#ZsI<7*C4piCw*eh4y2x|#Ees>RJOLEvy zHZxCUGjSX6mLiqiRIIWa@TIXEg0^8oe>>v|^@^NH3Hi6N9dJ%Z{W9x=NB*sA-blTV z9w&IWOcFgG(T~7{vpS@dlZjjZ2?K6=*uW$gLf} z0R}E?(jBNvar8&Gk_X)QHJTkuqg#V(&12tqg*Jo(TujrBGq{v``d+f9F!hA_+%`>H z`w7+8BK{mYsLI%K3~k7_pw5_as51w<;Kd_o__)eIA<)#?>YSmtqn48{4^VT`kN+3O zVBCO}P`NrM9f$699%_$$8qcreE#t^XAA9E8=zpfbV`YvumU2Kx)a-+Sn^l@n@H_9K z;FBP^hU-++;T&z07(pn_SVIl0-A*CNcl^Vl{~X<&b?6v1AHQwr>%b<~m@$C;FJk}~ zyA0s;Uu*-gv;eUT9E8j|OZTPhbSc}Vu{XsFf<7;0uLs#7ydem?99|Nne>0(#zpb(T z#@;{E>7-muemjMq20cJiK!nHC@F~K3E{^{f#{$szfp=;Y>O&*F)anc5+FkXfeWX-|ygJ+==c<++?Xhcxp zUNRVH&bEE6!3EazsxKe0SFO2=e)i4gK=aKM@}cgOZh55X;^RvJ;r>KLS;pePh=gVhs2b?4bO5 zx=!(6_NC9t+}{K(FcH3ZGZ$#AF<9QFH5~Nfn#j=O(Ep@R9wZxH&ow7}Fpk?SUzV>S z!Rm{EBj1N(1L%ASB^ZmW0^=}>p%Ow%&G7_S+g~K5q0P(EUT&cQqE-HK2vRB|AEcJ* z>(c2FC+CqbJjL>(OThXJcJj+Eer&laykEKQZvR-}rB+wQP9wWAHea(Nl1^i1$NDd8GJ$ zVd%)-OlK#+@+x3lyDl%|iwW%-t}GKxI#O%=gS4^7aH&1xm%m=b(C+Aen2}2hH?QPiiBL;TEF!+$Z;WyxO0;Gm-wru z$Za9%Lg`X~iHMkwKb6z-xu-Q(Ofsw1Frb+FfQXMW5sYK|Iphlk~Z~pQ3MqQ7ElF z#K+tYefBsO?TKUPVFemldywF{ui-w-J~j8a=1Kb&phg11SiiB0H6ozK3)1O$9fPKa z279A20)=*jhXrswN-1nzah00ep?KZp0%BUdl!3hFSXgZi-aQWzN&2HzKCIv2vW5N zfE%bbT{JKn4U`!_LJNc&3?PJ3iQDfXFD~A-bDQP__>Ju)YldDBn12M<=RLHIHGGgt zHVvHH#^V?*LU8bYHl^_Bns1is2x!9&MDc~t9K9P5J*PrV_8N~ti%|6nSdJ%*yQmVh zVK0Re`to;_GVdpd?edit?g|Znvsa;;H+ZvxPfIk!4{3>);=d|wR)=*FhGcL-iZ~WD z=J+FPPx`wp$+iszTJr00FP*)nuvd%}3`t{$DP*lILu>fhO9D@0yS23kh=H}-S2cE0 zD||ULFuBRC%juFahTT-MrnB=`Uk8$dj?|1j+R9HJGevuhTpY&gMCtl(|G?lB_Qfnd#k`H}lL; z>O^*iy%#x@D%XABTb3HxRg8z;%X+QdMZfNi=RV84#g)4%@zj??A!I8*@P()V_8jgI zqFv%aa0GS<vbOv8AdfzGAA}1elz4BUSS5H9UMtPTRC>t) zDV=uW8|XkM1LfaHbhKqBI?h{b{6kHWe+=$3rg4n6W8dp%oWrqV5fdlFj?-!60VmjT zZNTYY#O6iBuKcfJll}*qA7B&eXWaNZnxnI0bH&-P0c-!Gsp&w}aw$9LTn}%W=1plX zoP%#_g!D3dO%c|Eh)q#yiZZPAKZWckGL5CJw z+I5(JDjJqT_4z+Yx4#z+w_*YDQA0GG`E~cGL75(+;UF+_vO(+!h(dcO-(mBho7XLY zAjJ;***)|%cI+bBVXwBAItA6ZZkZ^xOOzVQOARnf#SDyy8jZ=|JbIvw%_&B^z+)wF zjFz$k&b4aoU8T7@f>;D!W$!ZAs@S{eY^TO=EmbU=X5%!ih3I`?Ulc|7gIEVW0Zn9q{wNq5%hJz)3GdR&v1L#ui%1II-pGjly1^0yWmLW6^ScyOY?G zlez+G!lzIZ4na-m(1f0=$C>_gA-@$B}CVLIJMOFcQGCw__6^|`bK(zc%52LDA`{ps`n zr)YH!u>hylava$9q}9JhkHhQFMh{{fenxZ#JArWZo7~f5Gk~&b{OmKL$iGv`Bz@;S zo08cdE7j6?46q5!wq#uX3z+zvlj@<|H4}_9O^pRMi~Ry@Wt>B^9i6zDu6l&<+NB=~ z#VA})jN%XGB6gEA%CJkc=p8NKlVR4%e-+JxPxd+0zpp@<2;SNDe}giaKmQjf^FHDC zKcdXDX#O8i#wl*H?Aik{%)*X;H(AIku`vwp=-bSa!%2?$@~26Yarm@}@nAbf-uJ1SiRbdqaJTt2(*$`EkBDtV0Q$ zfKjjkuC97Rqb-DUKqV|c^F~uo-CZm1m~2cz0ZVy5@kF;8+(UW)C${6JBWG3bx^2gkLH6pu z&vw+xkC9ILd)vsz+D7hF;4c8tK!P5&J!|jX(z|s-YIrcts#y#CHl8!^rUhAJ>@KiK zVaM{z@$N5Aqo*mqUP0UwUI3cgfY^${hEOJ5=cUk!L_Mwzq?goq<@h_>DEh#Ux3_qE zxfE&RtOhotR}iti#P1}suuF#_PPS(dJKh=Vhs(AKT<2X;KhCq@Xyl$>HG1W1ZIM`N z5Nid2vcIU@CiolMAqp5zf=q?&O9$aR zD7PK1*+Xw}PcyqRKEn7xjGTFRc{VK}_-S!p&e#n)F*11V{K>Hje1Of%gbO@A z$JyTKAmit#5=~V-ZJ-i==Q$Wj^;|?QyJQXEkAMVY8E?JK%m9f!?YSNL=oGcE9`D+Q zCy*ihAKSy#MD1}k*d}&`+i;gf><<)o!F`mw_^ygwO9+xFN||v6c=BJ|z=B1f%S*=T z$7$_imbB`(S7jLee`s4r@vmux`$9u%gK1K!p6NBc`U+hGjekVvQ5)gDyp`>9cpb?- z+L_$YU&h-m55py3M9?*Qgr~7^`*Qr4NhZ9dv{^vUufdye(0cr%AVqb2s=^sM1_Qyk za0tArzp)biklRh{uITt`0J{4XvI?vSam53WY+^Ei?FWH&a@Bco?Xley_6R;%u>fpv zOdQbMc01>jZ-X0*U!Yfb$29hV@dakxX-9UuU*Oq)?<=}r_Ds|>GfIJSNp0rPKuzWV zyT|7PBZ~g8jk6}xQf>G2tg4GX7Lmd9rYZq4HwsiA#9gnkEMiB9p50wP1f z?ZS>Gwp>IGrp5YW@gRt$6U!eP)D%r0b~To3R_Ay*B@|SnJQ+$Ey zBWo^~H!bV0dLWJwy0seNOK+a0hVg{S?Ol0e|7^ZXDV`=J_oetwtO=+$Q@rHTHuY#e z!DNSexbsxBau44BIK} zZy0tDyM(r~G=r$|@3c!k{JX6TYG$T6_lL1Rsce_=5C;D5?Y0eZQfvp7ZSUkN!~E0H z0qJCi>G<<#kOf+dUqaTf{XzJ@zzy2kkLer;XX12P(QwLZ3$lsw<{@Ysh5iT_@pu!J`!WWCe71a0w(4%Jv(c=$O2oZ@$9Z$F2(VR9JEzw_6 z*b|cECB!R_cN(`~xR$OFMUAsL3T=wm%hT8!VmZ`~$EyhNBL12w@&>#^bRBxYD-rL% zHS!&w6q>rh8^)pPC^|)?CBcIv@;i;+f1gB6J+4(=uIARq)0m;=eqQ+8oJbS3}UDN$=+r0ulGMa3vTVzkvAh`LmZ1oWnIkow!b_`K9j=kxN` zH$mz%APy!6JJp=;+4h8ZD(=DG21eq#t8%AU@YsD3e!2scDr4^%o5ARnbB4?BTSu3s zW?kMfh3&-F_z0TDj)Op@envWPTsO|D_9c(M zIX_G`zC_oY72tiXe8`0r_&JjBF|V_gFLN!=HIct_MJNtpDobJwCj5ujT z!cKM>>`90|^Wf)f7G!Deo*)7nT|As;HIgBeEh8B^fK499@@YG!onXt`G~S*z;VO_{ zjF+{t4(K_(cUIz!Azsh1cz?X-VTb0y&k4MF{J-KEg~vjE*1@AVYrI3_(CmduI0f%5 zKd#AtdW$q`h~~m=JZ_+U7FO93p$$)+!dKakvDl0!&>;zI+N>Xaj|PM%nq&4BYs%kq zTdV@YncUhvl>2i@8&#m)lK!75mlR~ChuXNB4)v0+$R5Qnq@q*>h0|d$$bo{!rFg45 zzLxJxR>Pv=Rb!*qi7v(Y%4Fk1Od{3^U#>HvXJ048hVEys=ipZQzjM>CKOc>Omte}hj>HA5_v$jb@idmvIXKiB1# z{2nCHbK(2{n`pnwy3zhKp54%X3?y-)Z5^deHZBEGETMR>trf_eWH3-}2Y*w3tv?-M z*ezOFY~S1jZbg5Ayf^9?T_C?25h5~NPT`Nta&RXis7-<4p~3<$z@A0BjV>2Zd*PWr}n+@PC9P>gY4Y3aF_=!@?N{Oj4%dG zfzSY(iUu9TafG_XL_ON)Vgf3hD*EEW&n_k~)A{vH-m3*8nYePzD9?r^?j%4n0&+g% zC%^%LT<}kXW#iK-8wNQ3;kc5vM2~nA+88fAWZ?mJDc%N-2fP{!t=ToE-(zUlP4ny; zQ<5m*h&_5`8~js1J! z_uPX8sTIB!8URl;F&hle;+jxDDGn-6<%(RUl1A2p0Swt$!beeA7B|`Ka`NwgCLt}Bxa~dd5KMJ2ffLn-o z172qcj`5?$v^Syn&y`Ookwfj|RlJI>K$4N6+yeEdKO{4ZziAWbYwUrE*dc#}PO-+Q z?hoHU-H9??Dp?yR%M~G!ALG)R%I5kS;(lW#Pd+7>b@pA zX)ooS6b2~mCP^@d%)fA7_^4=W8i>hRdxQoLqm6tq05%+<;LdDd67_E|n&Ko()(l5J zOT`_o-Iz4~Gb(r!zZbLS#qWJ(qDx$XZOMqIMq0AbBVG5fZ)kA8;SRQMRaz{F-I8Wr zyoQAzQn517$=tc%o}@cr_?gptz@Oah%ekE|LcA;QJq2sD)blC%j;;}RrD~?;$Ob%> ziCR3+k0B4J+QU!a6i8!LR@>s|C^fwj+ag_ka0-`rIT^zyOuO#BP5FsbBL*a|a-^Y%YuKk3&FJ62dGNIv1qTxI6 zI*f~Y*R#~@~xGzce16TGyoVn0u$RNf^Y-DWAnTpzrJ?iBDH;tftiyoSx`(P|;*Bsz;!vfC(O+~-M z1F{5aN2e>5XD*hj=~^=827vRCm%@Qnqq$tiaZSS52-gs%m<2Y`P zqJ?tR7F3A+7$4$hXXMPt@P+)m2whFvXnX^MU`-f?T=f(RY0+sL>7{$voN?ciMo|tY z@wAOJ5?^S<#Cwn6#l3kHNKoEc>iHZE8L=-hYO1!;L)bKhcf>Q`Bq0p@z!O1=$Su*p z^8xu!pGE@DdlP}p&^Gb=DVO0C`Q6wy6afO~69RN?782@dobN$GErN6~PTWr|bP{)Q znyp4>=mnZeK~v~Om=rDc{iYD5qk+v(ubqJjV)1ba`bFfg#M;vRmzXzO-#6$Dw%GN0 zLnA5tC_E`XJrOlfBoX1V59sB9aBCE=Xt z4G0m)!N|4J{TJazAQ$wnpW@@~ujuOKkSr%YS8|)tr+oX85qo@0SCpMifOP*U&!&-C!ye@I-Bz^Q1upf??zGV7c zW(0U=A!sBYy8TEcvIbK45}Z?(3h`^yw3663jq4+mn8S!S)ejVMt(- zg*n55g$r{sLX&aJG7I5}suJy0h!wo;Q$tNxVh8KGMHhjTeC@uM8q@Gl-X=oI<{#;f7>{3oO)U&(Dej{kHVR)Ma=paQ z<31(8&5a~80_1G>T3Xra?~o*z+eV_aM@%`_2=Wutpc5ExQkU!{(oqK(6VR)zOCJ~r z@AbTF7^2cG0CeVF;RhZE`eOwea|XzyM0N;m$lo78O$#-K>MC(`EG#zEDIupjxjr`mfPe(neV z(s*C7zpN5mr6Ej3{!^3S2t5BtJ8{NJAS&bp_Rm%;jcX*Ywb>J0R)Ux8k#JNqcxH#3 z(eL|U-+A&C4a<6UX!2$C+dAai8~BqZ*L7Vlit!BMdHIU81t`C)7yM@^dtAOf?VCvR zRCjqR6Ibc06Dz6g*PFKivB+VMw%gEpcM+uixI9DXKq8--=f%;vqc}n8JFMa&pNd1< zHD1RwKsEg}=A1xWe;fj3v91=%A2y0wdI^9&b_Et@nemEAWR4Xt`nMZV^!uXdOi^?J zFZwI9C@)n_rG6+%6^c@ec&XL)Qa4bkAB$3hM5%jtspKbd~kR1Qh8>n zX(EgQ=ZRRLe|Lh*m*oe>JueF_#(pWq3Z&3-zrb10R|=%~NcieR5WZ4dRHW3<%`0&$ z<#6O=TKF4=v;voo$c2ObLPUPyfWW8&lzy@zluJMOMzMkX$YKyQi@K)-mgxe^AB}_5 zx^X2f>WQ?dlhHQ6Llaok)(IM)Sq;8QK>>%^M@QJk!oSf9|MwkCqAk0#(h)sxJQ*g* zwFf`W2}u?jLDuC_isI^c3UUhZP4HBIr-ecZ@WzzGc(nuG^!?ZiglEqX@fVkKJlj?H zJ|MhAl#RKXMF1DDcB0#beL@&$>ot&cyCCT^a8ZD(*C^22blMGW-TCi!&mVBQ=Mjg- zk4s}pq^lSAnD?g0^LtsZiX6>pD@;-84~nR_OQRq3Sk3* zpEnsB5ueHrc8&L&xFaOLo_s76zk&BVQ2Yit)r60QF3&=UT!*1@?j3#u`gvO*R(dTb z^_7H}jt-p%YbF|8PP~GBzmESliaut5s5b=l%8aR~m=sTsQ>mC}J$?;uJ%g9J+$^=3 zE}n83McY};GGd#teiXqk(NExurQaxO<1^95??fA)LF5>55Fy#o87RqhCq<#}ib6+G zsLXiDUaEykoe`yO7o`sIQok@uSrb);5K49;ax$^n7cAdFKQ@;h)cftMgC3IT7s`z! zuvAtKOWfmp0n24ueJAH`*HT!Lzo<(QgOvmIXY#@ zy$EEnb)CKUm=OoOq{{!(!@){<`B$ z8G?J#rfP}xBZ=uB*Vm{oKqblPPe3y^Tgy^$J=s$uVJ5V{PgQ)EBxH<){rX=tlj6P9-#zS=FaV0ekyA?RcdWHJqVj1 zp)y_6U$UFm2=d|HMI=PMNZ@Bqy`5^U`EB^@~C3$&z~LYUa)i%{;C(^RoF69R+<<($+oZ*I$s4KaG@!lm2an zoX@f+bqt%!H|g@(`J?dRY=+~CrGBB9^4a-&46vlyKTIV{?f$H2m!f$kt=+5dCyI=9 zy3b#sw0odWyJaz+&Zc@KwLxwCg^^36x*0-4H;gi{^b$r z9o5Hs-f_VH;&+nIk;2SHVj#3+=4hPtjp+`UR@m2AU4`0wnVLf5&#u#hD zWf!S)<(9~ya%HRqE@!#$FqU6l26g_F^}ku{7Jf|Z0ab?c)=2SWCix?Y@o@3o^^w z9clVtI^w$~ch0M=PiOtSoS(I_%H}+me2|wdM|c%+9KYs1=SQpWW*u%1zm@SuPQkCr z`A)j??ShwhsLJ~Foaf^&ly&~GfOjr`rRY4l9*zQ*|Y!Ixc)-7!UJY%bQfI`wjcN9uDT zb;Omr+LbC+QoUZOb4BW?D|L}8m9M0}q@`FW?wU34T2?vVk)`P5M>+U!ObgGQ&s_J8 z90c0R@8>>w>EXMO=f~_+W#n@n8C;EdlHm^8qVUN&B>i^v2swvzK$F=OL{`$fSk6+zZJe?w*8Fjj^hES#J3Vt!K5aga|l zel|qSnB;y=C{s1{IbrTGYtE@>UL#?Iwxg5aEOc`GXi>(jd(Re_cZ?Hm$8MNKM^Mo* z@2;zfZ|r*c$$;{%n_ip1J19B)`ZS)|P)X-q*?A~6m5!O@N!9hX>?hObY5bvreV{{} zr!h#&R#msMyM*2Kt}aS9m6)2Fs_Hs5LZVndlkwP`XRe9zu5Rpx8%gJfOotRh=u^t2!^+RMB~LPeo_zHgH#}t)BFEUCj$n2wh8hs=5$x zp4iY^)wQC%m3NV2cC4dkdmyWl{Z^ZaPHk|=$C^B7yQ)hTDAhe*M0MI7l<~-+s;)_U z@Wmot=SvL!Qd!h8`Wtk5A!Mtwd|TJB%Ou#&8xEq@u3@v?hePV&T=yZxLn||a8$|Q? zvdX^2X-JRp{j7QkOujaqd)e->TN)`3&hni|3t%15-?ic%TG#Kd5;eX4hi_iceagp_ zD#}C?yQS~9tl=Gz(oh!T*VdlYWn=}VppX^qq75a` zI*vE5@;>zze^!drOVVVX{1)%P$~)gUvYoToKc?QdmG>|R>ydY8o0haw;dU+Rn#t)* zZ>8Rq@mc3@{5LLX|A$o?HWL^Bm?3sW_sp@LSLf-kNZl+xFG(Sxsq5=_rAPd-gh48| zOP<(lLW)DXj`-wn)tr`1{0agpso?!_Wyj+q5BD%iM7PDgOUUA!$F9l4*Y>V)*OzsU zYiAXMj}kHlou>rwP`-^(edfzywe0j9P3^%?yH%+8ELDZ>p--(&CGnSDcKcV6y3mz6 z-j%vtNiEey*@fuhbnP6?LT=U8yxn>MpNTi%2D1sWMk8s-)I?rOpwlwXW33u2iFv zy4)-E_B5ofai#t=N#(ItNzL|3Jtk5euGCYm)P+jw1h3Qvk=o=+echF+Qc|zgcr>wC zq`FxC4*zJED}MOAZ@V{xPM$NjhW+_+$5F2Z)2~-~iaeo;v-7R4+;ceF zpKr(y+7-t!C*~_nUbFExJ!mxRGaUcS(xh}+*S)q<%y;L*+o-Uz2G{uosk;1%??XUl zXBHu`|Jaeoo!g0~Zw068VR@GG$@*>E{_P{O(30AV_SBusm%qx*#y;d6rKZ!C-Z}k>S*8Q-AR;KpNA6e<|e4Af(-UNkN z1lsi%9IoiPUld%?wLvuA*)4~_I{Uj6`fpUSbM_{`>Sh3zb9fcuuP!V(qqT;YV$L4Y za*4n5VevgH^I->`nV~*rro= z?WrY`l4T_m$8PDB=f&4fDe;fJ=`RF(_+AJdsbI-TV{h2OEn}@eGG1a|0Q)1augKaz z-#J*aGFf!^2AE~Lm6m1Ui3KQz0AnsdR*lzEzoazF+^OfSh<0^L^{eRqf)tiIRQ;vY z+OMK7RV_J#G%LwRx9?>q12Qq=he|dy;7fXlZb^HE8;8FuH%HG+QtOD|@K1P+)1`tC z2|ZGLh2OfCXtZB{*Jz49RVDIY>XUZ^E?Y*B)rUVX^g)vN{GBocePZVb-t^0_cuG3w z^iOA(s*@Z%{!(huyKYKVI(B90_|Z-3smobV4yZkMFQrcFFV;V`B7K`kv#&-4`UabY z(wWubILwlcHxoZx;BV@$}Z#sy>6)m#b{4FXy2~C-qbvNvA#fx{pWUz zp;=c@)?G%LU&%KXETgx}s) zb&_njY%QLa`UX-Y=1BZP&Ea=x-J%wG)xLBP%1i2MSAOLsM@lQYy0?=^CP4Xd)nfNC zQqT!V{f?B=F#lx=9oUnqLC^Z(zlhYlhmcAQzgUK*ub0m`Ja)?$$py4aS4=R=0EZnG0*A?GSDe?me92zh3{F!GX>FHe6Quz~n=qD50)KUo{bCvvE zNooIJhe*Y+M@YpeZz|YyMV(&3f%ucI-X>*@3fQC0@hF{7srJCEL*8b0K9Ty}3Zh}X z^gWb-G5;v_Kz*-^VK{+%PJpKg?V>S2m~NPmzM@DcT`Dr&vn~dTd)*IxJ6z6%E+_2a zG`pN;NJ>+o+3j?i`$H@jRdvtH3DJ{WSm~bp`X|{r$JKaqv-Df$jC-k~@93)C>(p*dJ$LgJ=XWwBV%DXR;}}WmDagW((YRM;vENsq+xmnJgiGSq;WpuVaJS-i z;CA8oIqzoLxN*2saQV0*TnWyPtH!Ow)#JjrHMn-%X53cX zcHBMnzRe@ z6O9s1CVg!z8nmo}{7iaNqBSP;c&IJ9IvQ@U8=`hFkW56H?JHo}u$nUcuPF(EVhV5y{z0@u_$sLTvSt&l;>od z(8F~@p`;-cTboRV5_UY=V9%dQnyp|W5(xx@b}|}>2b$ucWY7*>*(`FBzt&i!S%Myr ze)Jq^j>q!DL5Z8U>2pQLglCm#oIjKwDS~98IV`%g3JVMCo1<;`k;}$S`D^~fkC7+2 zl#^w}qfH4QX(c1gjgctfT9zRHZMh9lR$#KOHOlIg)Q)JFTbtWDiC^g@5vY?aQPR9Yb;3?ICnBx&p@`6I3gm3unX3G_j|R`SDZ~ggNso=QqQNr<&_tf# z&Xy9FQZ=$7&s93 zsOq0r?y^f)NBYaH4n;^8wY0uJJ&ew+P%_jI?@za^`BTF!nKbL{mI1V>Q=__F^rds% zy7~cf)}-cvw5f@K@y-urq}{USot|tQke2zO0knDZ;{(!StqTm$*_mf12gG5W9&_cw zefgL-xy7ZmdT3{BTD^xhDelT8(zJQ==SN*yJWaFat!oJm$j6knj548^riBNTy)`)z z&h%SS^0`nZZQi`(06D89G=Mg*q~1-Rr+!&y#s`FFT^=2n=4-SLnmu`&s>5sZ(58h4 z=%u7Ymxot>XNCsq>hhM%x^XsjazI)J_7^qUMn+m2lGu@;vD@i%(FSX<1!DNobx`i> zF!~{kzC4RfP3m~ksLLp+5jpmTS+rHFz_j@!eNxa4(vL)<$zW^TjzpV-Bm!{z3HbH! z(c_T92XzMgIZm81Y)*bA3{gbWQamUVogE5>IWrwE@emK(r-rTH|)eIR6wYK+9b zaNg0svZHW~IW3dTVOADqTA9E6oudTsvl;M7;z$%Y3t(a?(MU@ulC;|b@#a8X zIAl*s*v$zQ8JMGl8y% zs9>-vXq;{>m?X%l^9i;g8s~PD6|b{aTdV7=fEB2-;*d1f|Ti>!YoborZWQ zG}kU#Gil8zs}Ai@S~Enma$jQ4D6*7tDXaYA6?RF9&alv;@|ud#gnf7O1a}+owyST3RC%gw+_1)&;^fs5Mc@pP58fA=JNs{H7WC6vhGToo_53e?)ykKC`m9hsU9jZ#Y ztH9+=)TAJ)uoF$u)^NRD7qVL;RNG*a)R75RB(&Pq9sX1QZjM}G zuWn8@sqpPU!bX9uQXr$;5}c2kPYNKnJ`JO2_%{O4dFEw zNHztd5j7(6R$A5gl1-FEEEHtQ6|~Qau+(tY1WRl}*jrh}L^NVAq&zE-yUK2fp<#?gvL$9MUsCO_T!x*T7L3M{HOWv*tY)RU ztazv~w8kcAWwpdUx-|-VaIi$Ax%kS6*VK^Y>OlC4p_na+wUOYE%quY21DTT&bM0W0 zoxUbDk0LK~CDoxoi`!Brtu!fbh_$i?qZ(_lHIZbJ@5)KPG9bmu4pP%HOi9o}Pw;9Q z;?Wj{u&M)Vh_*)RwR)667!aDPoVG*^Z6*ga0;3;lWb=?Mh#ZBb6%9d26MWfli=Ck3sR=7btw zxJGiWeb%JJS*DC5(a2O!pJ;1^yP^{;zt*oJ)9KrZ)?hG{NHnyD!)rMkVd!h=vyLO~ z4UfC)|G6~5OeeBl+Meg!XD?muSH}afSSVhTQ2FhPKTX$qGMqFW-3rY-OF0-BFI^X3 zTFx!(K7Xoac*0TD$n$KfoeA5-r|PO9dgM(VH!LGB?LuhgxiOTaCG|b4#_8c_KDUSk z@bHzn@H{Kq;(1o)tN$}*t1mvRA7&5%eVKG=Bb!dAYoq)8DT9t5Bd@H#=UGgO>O4%q z8R6?*C+*+#Qbyc_D?OW`2^u;bhTAiGnI69BXbs!=Q@yiCu159cMyfCTn!aH`AJgk^ zz<|OPOUEPrJ@QhHvVfZA*Cgm*fArT5m#cF2#q^6-c z9MU10@EW4A5Q`&y^1(K>R%7@yn|{xFaBbC4Fk-7s0*$;oK=XvhI9_B7U)l==lzwIq zBai84nJLM0#@xqEzo)Y?@oKq@+Q30CA!=H5ZOtHFjMx5{?j-Z&N(iH} zU#G6DK`vL|dUa(FatYt=pPGO2)4_!#K&`!-gvh%?u4~P6rT+qZR^beW6L#&SL@h&w zK$6j^JBe)$^AL?pvHfaJ8we+CJtZ1teJ0u(4>Glrt0|d`CFV|>*2u`ZwXTr)@3ea3 zV_I{4bgCQbR5#R7R$Fmlv2~$4xl$p>uxonJ^cho&r%x?D$DTf8ZgJ7vndjImmM@%K z#APjLZD#&b&(L@--PtH>@xq1noWhxfMb<(l+cXEJ)3)M}v8zg z_fzs6=T@);yboMA)p7Dpv#d?vwv*sba~$3uS|=4b&OY#`;JA^Nb=-8vsRbvMIL_nX zE%WeqoMk-^&IVV{X9qZV6uedF=Q+-^;JOOOvFT|)dI{%SfZqZ4fzR+|^7!K|>vj&Z zs0S~Pksk1Ba4+~gcnC~#;L^I$mbD$+37(vEoY%m`pf!er^TF|8xYcn=!L!;NrwQB% z_JDg=JI+zC<4X8G%en(x1v=mwaOPExvmH#XBV6#i;JC50SI!(Q0&fAUz`MX&aQQW) z1N`N+;8WmU@K4|&@MKO$w?1N7 z6TxxdR4^ZW4y*uw1+D@&ZbT2@w{IYR@Q0g-AAFIYt*}n8tha7-oGIYQ&5pAYJR1yy zOTc!psGEF(AKAj$yWm#vO>q59r29n6x*zm|H}sHh&;i$hPkr8T9s;v&W*0vA2{3n@ zWt|U>2Y&+Af~B`m?%*9;2_HQD3+M$5fa9rGKlmbg0f+x9=>q=?JOrM;&2dJ5)UuZS z8~Fv}U<|wi+y=f6-Um+klH!CLSzm;|F=Bi-P8;4yH@PU1NQeck0aC1B3ogb&^c z?gF>mgB-X69DS-~y$R-n)!(4pz~XNr54M0?!42R}@D1=G@EveJIQ(An1)c~V1J3|Q z^TkaOXoK^>nc(?g1$YU#3Ty;p;1+N_xDDI}{s6oO+za-CuY=Eme+Ex@$>46V415-R z?z`j*Y}`#bOdwz1BOLI|2dPis%adc??{ESFAmvG$(jIMYPJKLTrxK5;W~wI`#`Vchug z7Wu}XKlb?5BipU>J~8*~851cj*Z(STlTA8>pf8CpiED>mD*pB52RGx&@*U>^p)K&` z-IQJ78^0xIiO=rNt@7n>9_IHIZ5;0R&F&ac<*Uwa^3AUF6_xq&7x?T2zVUci;2T+i z*Jp9}63%?`;f4cyOHQSPQ=SfIp@g&8SDkZWmTz|1fPnB?i?a#iwgSpdX45K7DlDSx z&aITNs?up%P81SDI5kRC=Xs_7lcc zGaY9k_g0xNZ)0|uZ+u6N-)CRx8_#nYKiomFTgQ<5B67EhT)8iAb2i1eQRF&uv$rTw zwCR?$d}(_8EXP?Zvgn{Y8y#%UDf8JIbN#;j4k?%HkS`wsk-6m{bz~L(s_^%+_#+PO zk8;?UyGZ<%Ra}uCZO_+db^o$ULqWuaoV71rIv0SUM}_aGrroKH^-QOyh+8Y=w4N#e$;B|k+63(z&@L7N&A!cNUn2EyE064fv|fex@06vR7iAYJ z2GK8hp~9~$_tjqETe-kj{TX$?(zmhxFh6wB6iGd(VErH*zAk?BBFr zg5Dx@%1oz?Hk7^6v~H1OU#B&($#K3f_sU)@_Vw76zU_AQPS;wvHlO{T)_0M+ZlGMm z$cepYAE=erOdalDSNiH*Up^Q6b`#NlJ3H<>U|0JN;tpUyAk+`0acl|U?;`yDg#Z0? zUFfsNs$LHaKj)Tg-)u}&Mo;0^J8Ohxof{^-k}qsjN4BbVs!pB)?>u;tFPE2nq0~vy z+iZB(!kZ;LrC()dF@eoSy{aA7BDWd2(zHGnr`w_Gix#K*k1}lgNq^0@v#-@^Z}Hl8 z>QIN+nJdz^UE0#K$bA_()sJSEQYn&>Y?Y^@@Mc9E=S)dA`K3R&)JNr#`ZXG%^WZUk zP?w*-HnauM?h=Z!BjxFOtJ1IZt@_fXG_kdVX*wUTO@y<9a5_Z~#Je$j;h5nU-;}c@ zw|m&;;T0q zrQ8!BC*=Oi+tlElfqT+06O;NUN_T!gm+-f_rh@+7QYcqe+o5}K?_jP%fC9G8Oj z9^vogKCS=k|4{i8KO-66Y{>8tq(bx|Yd1UBI?e>{@y;+Q_u!(w5g^1Ke zSx4H2pQGZ(v?ZhW>|d#{Mear9YS(c_hRF5VD8^s?>um05=JCiqEpjS6(@wGP3g0^1>gulfd7cP>tW7aB1d6Hg!eD>|0M^(qEET}xC7A6hSn|w(smQQzv*u)(ql-~-!AZ# zW-lLX$TAzRHfw8jgwv+O*&^X|OTUeU@a1omv2Vw4`UM&N(iOR*U)PSU!tbs44W{cG z?W4RSCuf=4E@X_{j?6Evb)0J?{0l^fjKjNSoVGca4y$8W1*yvjUFy|t{GHxTzasu9 zvyN{kU=C50kktwc8UG1kl^ex-laPpk1xU%ycyW5!CxpP!}Q z8?1{~dD%f&+1ESH3~#(0GM}qS*AgkKeaMYLu2{#Z>Z7-;7?om`PRR1*)4uu&OY}98 zHO}mgzHz`tnR|9f-j=91WZoolvS#{@#35->ZKYDruU4hy#AdHVE{E_g6}iPyKG~lU z-AEWocnjba3eV`VBZqd=*DgiwR^%#>Q}wz}u3w)s1-ZwOt48i~-thEXZV^+gl|Gw+ z0)sn>QtHl|$bTOBog#1Shwcl6KaNKA@%5~ur1=%twA+wIv544M*Nmz0TZ3na~pe
    i~ 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­57X`30=zWa-lFR6H!M6duC$Qtt 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%0D2(-D)w>hxb`r` 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

    *Bi+tP%C^J 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 literal 806832 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%0D5+zi^&uljBSPvW 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%0Du7dcty^&FG3cYwbqrqMN~<1ET}ZX# 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�CJR&#CQm+$8N90>qqCI|a05ba4MU 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 z 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

    V1GA0(|A?J;xw-jMkXiphl! z&U(}H%;S-_5WZP=mcNiqe9`Cb3O4J+dxSysye40lbQHeGk4r9AZLUksP8R%S_g|HM z5B9}9lXFS%PVHm|6k%&T!U zNXlv3i^x5%1CC%+yRu7=Wg5T1v*BS=f51l`+;V!Je(B1)tl(S0i~M*08_p;SJdjV* zd^jsO-bc<$k3*M&Z_5Xcp40do73lewIv?vx*u(zCGC#djr9F{(Gx);xC2CLoFs|U= zWZe{bHNl^su3_h9UcFu=vI8U@@W!;DQr&> z7Kw534>WJ`_m+1HA7#iYF<%i*5)!Ik5P;X#*O;hiaunIV-AJhDyxAZ*zljH$)v>Fe*c%8AkPvc^eB{M6UryuDd%&f6&hk`uCrbV$D^>ol|8H|`5w{3Kl$ z`RN|=VS;Ztv!0&1?h$f{&k)PjvwYGb;GxdS@_8sn4`!U5JX^pI9~)nN?q_LzG#P0u zuQ%d!(GUFWb>FAG#pY_whkTo!bM}npj~gKTk9jIc=HIBdvcAqZ3v{+Vr0!nxn>(&f zU5f2K66(57-c48PO$2ZGB*r@ZjfMG%^pg0Nyrt#YGUK7G`Ijm(`?KW10#4>H{v{rmw<0?-FY`5^h~+$-NE2b`j=>?Tk?IPD{;!e19fDMTU3s>B8M#}D1T5t>=G1xs8@{kY{Iu4w$4u!WPFqN z#K(9Ck~`Q-?w9{Kk6oIwNnV`Oj@P!B6Iok~c(b>G{(2VtnF4@{4*e(TOaX z<#?5O%ti9a;Qe{XYs;y%`7aJt(mXgUDf!ZJ1o#5K%**yGZmRHuK^XU^^Q_+@%&PY@ z4#B)r?s``@d29RS><(6ct2})`{K$8Hhz|ti;pxz>%y>&4z zn!=)tlFpb4m0sy0`*bUov{OzT@*Udrask|k^qqmeA;xS7DMpD0dAKmd%hZCQu=EfELqK; z!?QIH63vE-jFsN+d`e!8#Us2CO3-}TbQv-QiKx@kfVJ$3vh^_D=X@C9g;0cDi+O%M z2zcW;j)dt=t}FT_)h~Qdf+4)KbOjgtXMM$D7hUGWT!J1emr4=HF#oi6(O|(8@p+0` zZWW~RU9Ko42ofDEA(;+{0JAVD7|m~yryWzns(JUh1+cXXih-XdfL$#_g;fhF$!u?v zrT11T=$t0MPw#8kS{Uu%6XUIS=^6ZLQP$d2LP2WY%v1Djs2~q|GC!LLNJh~&w;1wK z9q}C|l|(#rO?qdDekzv@myGZ7#rRQd5O_q=37_X>tmUz98yuyAEikak+84eBxf(a*epbM=wQ`=r4{(#+!Xc8su6tyPVotuCp{;{ zsD9C?x?<_aa}EemKj2fUjM4$)g;b~J2V5GL%x%CyC9&5f84>jloN6~%)zzG?s{Z*Z zr|8LV(W^?6mE|ALIoM3}sIlndIgwk19w?!+$R{PKc>}M;;aF0Qk16i{)72S#5CU>R z^uomVIsc^wV;b%{kD97XC< zcp#P|KANRV7$@Gu_#BiLS4s%X_k%<4u&L!e_w`=m5;#f$g*W)x`jE)B=uAnT`dOxn z)n>`lG><;Wlq2WLn4X|7-eZ0m2YD)fU~71W4%2013!V6B^cE~iPb9BM=}8_$Ml{Cd z97EwFDrAK>#*h2(z4#D3TkcOYCD7#ogZUK_vB|pQvl#s{eySg4_)#R9!TO->ws34&!iA_pRIm^ zZ*G@@LJqwT9?kceQltdMdYe?E;8>eK8qBcx%~yhrpR(nTnjy6tvQ!rJ8*mc=HXoN1 zBo%o92j;8!8F<|;LtE=SVt@q@?P|_H75@xAxU?bV==U>aMCwuP$lVJrQjLORmRq?p z137r9k}&{K>@Ld2&1CQFM;$`Nu!dm_kQ-+Z-B?=!yWNbWkW zg!a51J0A?lM`FFMd&?!D5TDXq<5OB?{S6$#2cPfNyogn*|5a`UtMZiLnGfuNuf*S! zRG7|`O6$F4Zuwf}7KxeV6|b9b7MWUV9rB{oL3{(gEw>Si0SAtoTtS@dVh85X?8t!$?NujkKM z9BSXY#0@K6^T+D9d|2B4CqyBB#VX8@lvCmHF--MKDp6N{YrdS28t^eM^T&{`I_wnf zD8UiGQEFm-WlN;^i|6rvd~_|^!Ed(5XSPpqGrSIllviZL)gB)<+CvYGTW`{zn>%HN z`Dr_XGasV;lvJqRYtnyX$Ef(T_ZCC=#`=My8O$$PI=MC^Ffw%U?e8NQ_OF<|xd1_BexbZ578aGXnl=a z(LZ4T@za#Zrr_o4e&xR4Tx2SNS{{uvNAm>U5IgZ3YdH0kOWh)qrFKnzMTaf*!UyKN z-Xk@mYkV$2{rIadtk;w~nfj!nO79INW#oPcP^LfT5*gNm*LT^H$aBHf=N7_wzMoqT zp`-A?2@1MaeC$PAi~fKTn_E=g_jKvGWZ@H|jko=>J0_=-!k zkMpWT$CZz;0A9&MGB%crd>u2M!_MX-Qk`nQ$gORJmJ$!vTd|-6F2XH>hr_=$Us9c- zJ1Ix~CKDn$0H4~G)aTjPBz zM*q;s@N+-jCk&;9L2Vy+x;Q#MzkYstcpguHNEjhmkuwoR*u`v9k>Y*z+?U;jS=E`@ zQmRDES^UnK+Vtq`8c}6oQ8n5{MkJcDq%k#a>#PEla;Pn{sZ^bM#uT*+V`Ud2*;!#` z?J8b4!6s^x9~9znA;AmHG#`$?(feh$As_D6Z#;ToW|6x*I-hochw1FtGS9lq-G&uK zd+L`gX@bG;d%^yt16;UX-pra_vyi-Iw8x}$6XotmUj_h-{&zRY1jw^_M z;Xs=N9EK-+4e9b?Y3hBlpSrHnRUUnoK8JeQWSQp&n2j*wX+FRse6hPQ#-$p;CNPJH z1bh(*)^oNy=}LAsuB-_2Bc7JvUb@;2PtPs}o1H|LWu7vy$?86`xbZ$`ABrE?!(}>> zJ@xpRMarso@Gbl>U#;ATuxmWJ75>PU>NhJtuJE@_ExuqLzboF?{dt~lLlstx!=`*o zSdy&qn-9@>WiRbwKo^HB*wm8nYQ?fy!IElp_7{E=98@zHZwvDY)i+kDb7zO(JF7Mh z+ZVhX{ww&gku^TM8Z{1C(72DQ=XFxDqiyagD!UKKLaH6vP+b>Rxr7+Jj)^?RI7Fts zeiq(s2K@ew#isG=tUjKbUR2?D9-I~={PBGp^+P0Da57%PY1g8)ivzrtY^yxogjjpD z1OFNN$z5R-lM7zT=rleyTl9;3wj^C;HDzWq;Sb>>o(rDdyMw4EwuwB;-9U4neaUxV zEzd}^MSE%|ML$BR!Y|Ny-H)!)M3HG-R)809!2ez!>_XK0gR`*|x7cM~xXO;mgf&=Z zFG&(Q1kVRpgddI!jw|@KW^D7U`_Zm1^RfxUmy}{$TvN4=@5%Z7te#_;2(HelBqDFd z8wy15u`5x}*I7LWobj7bnO)dC>p2cpQ@d53PSJYT8GI|a;TzLso}seJE(=u)majyx zMK_L#DdP!Fb_2z4zWXiwfJeK2M7#n%BBj>2e1KE%Qp}_K^ZZZ}rvR$o9-B}7WOk7c zN2)!$|KbY1tT8i0N9f3|J8Db);eo~#I=i1X`DT;Z!K_BcL9pphOi27kJH4M-L^fqu z4y^Nx@vN4GE)Jn_oJzb$6^bn`BAj@SzfWb zPw?Op7%uO6h|sR!V|Sz46QMGF%r`ZW81>7hN#TCO9vxjgo*r&eJzK4jwJ$`SmU4{Ttvl}sECy5{Te$?X-Vq$f_sFvg|kPUNQ+ zD8-K>5fqnNO|Bh*fIUra;1IlI>V%g~IqWBo4$sV71jO~cwTI53Q4)vXOXHFc6ul5u zf)g`X%Lg%Me8jf^0w04n2eQS)Vu8p>^a~%^5gMEkXU{~6dlyNe#w1S2KwDi7-Yghr z`}qA7N8A^jOPiBK?2#s{f3nbJm9XDH%QBN&YasfJ?v0 z)M>ucbVN($uFX&10EW&)XNJL1dS?AR6YlMzv@qo4=;X>*ayg@PM0#C`ZD z`6b2GW?}OSYe{s>%>tb9Cpf`-M%waF!q)BzpZu{p*yJV~4xjcseRMs0Q#C*MT6{^Z zs?;wP2I3dAqUeHHb)ccPc|pcfYMe?2n^BzQAv|yLP!keJfj25#EN@nJ6EHtTU!=6? z2HXD><&5ttvH(^`vzi0X^|2Y$Cdl0TUh(&q?Q0KaP~uGrJqrn49*d zK4gzCnMlo3fnv44%FM+&kD%|7Lllq!K{-fy$JW+sO}{LL2jd zAFMCK7~hVh3s&>F-^LAQ_&xpP9oEkvM6TDQz$tQr+FXM_nnQ>!NjLiYq zMfBjqlA;3vOO1p1ul8(4)_pQ^>W4T>Tw^a(T;Vs(i|=UqeFBzhpP4zp$aS0UMcn^U7?%*~N~UY@ASljVz95 zeh;6=@C|t;-OM$Q>ZH(Y!#H`hz_BO>joP=QjV?X{3JG+9!5H3R@kL7>o9Vg$-XxoM9!3 zZllEuAMDb6NF;li1CQa(vmts%DS%hY5?|HJo`hL}Bigfi_IrdQ3Sk%?Hy&v+HUyY z>xQ6Azzf@o4&-mWoL8kV%Y`-I%i;;?Ew~sjuJEtmBGD1zV$Te96cRd^?y#ZovdX9> zi88^J2{h<$aUDhef+x>{=+fI5>^*{ai6!{nbmaTx;-A)M)jbCYsom1YfxX==PN z&!!`x7x33>7YJ4)vNUd&36M;v5!OB&8h9mb{ZNKPZ@y__3U+2Oh*vV!w+D7j&zWcLWfZUGKk$}_l z-U)wvZJQbS?EtAoXCwi~V zy*aUzGe<79>C?(FHnrop4rYfkRh5 zK@;yoKh2MV2S=F)Ctmq5rOiW*auXl37dYO-x{@9xR;(*uz_FW=c`nQao0lA2B7FBw ztTR8G6S=n!yqeCL&q98sT+K5CSq_4eN?GHBuqoq{?zWlDry7Jm@@Q&@7pmU`i$uRX zJC+kw^_(N!ZH9mrwI{Eo{`%ZogLR|#hjasJujhz2_nYp-%KU-cusbo!y)^`Zqdjyp z9n-wy$Y#3%nP}xmM9Brzrp=|Yr*G;#BIK*AhsONI#@g;9TY^n@tar_i;RN5{umozy z`le*3s1Oj|sM87f!LQ|Rn`csyJreynDkktj0gC%wxR8tBob8|DX3z55KV++-KbD{5 zDNeTeo5TGz&cbITk{30-Q5}eLRL%j&pmhNx_ky#+jh8&@dulg?e5c?>%KFOD zQ^u1E@jz>V!|P+31zMy-G{4bq73))QRQ%Tcl{X+X`0WXw&Gbc{m5n9<2l&Qx zV{fncwRP4i%nQ-0obkk-Lp>)*ulKS4G_P5Hv2~e+c$_^gI`o;s zygoAPMIFEKNTrVF=d&H4zun6*3-`!UssFBIoAQh>vQlv$z7`))<|KG=Beed}d$ubY zpK(`#&X^Ac>ekm}qcoq01L?l$MbgQ3+uHUwg>&K;>_zK^vbV2w)`4l*?Z>PTzS4iF z*isXCtASH^U6#WA3^TF?D8_~FL>Kr&d`I@xe7VdsI;d9=pHT0n{z^6qcPf4}Z?Cub zs`y_ZsGRgj`Iu)xkj+xNAq$?S8{5Nd z8P$B-EY!kYRXffA(Y15I3!_-i15eNaxGiTml0xt2UOnLVea=D=9Ci97ozE7jGb})| z%lf2bwYbK-I5F97`{*yL!rzR0ct~MDy--~Mn@;`aI=@NBu5x3@Z;+3*gfF`kNjHgO z`I<^VTGL(_L;wjwAQ8u9UJFc1V}eoLkMzCXC%>kdljqWmIbKTrkXMR+;*hGiAMv7S zS8-~Kp7Rm&cn*gM4)X7UpY)44k{vthk33X?OXDCZ^@?(%CY zOP5OVaSUsU*b~D0VApuWL5+D~A6cSqQgYC5w8H{W|KP_JMdbezF16?ME_=+e=O*A{ z9QDtxIJF~x7QdmpRu1_J(~F%JF)p86c7N>BEA4bYcMZp3aq4I3z#sUth9l1RS2Qrk0Rh1lccx%z1>f%zzo11n<&aESwY9^PUE9;_)^Yij%k zOQy8SDIoOvnEI42_}7|{Zy^eQOP@-OMm9b>Tm0~aG$eUr z(GkyD`~!XDLGsm=)aVWvQ|aS%Hg&+6N=;kTnfKzfZ}Bq{-1EU<^*XR;2>y)c+yX~J zzyY!`Pd7)vW_!;EM^SiWE1B@s*#d^|%^$_nTjVJYY=Mh*@lg%Y8-*+WC(k83karXR zaqNcrjbjgkUuIc?oe8gs(=c_PLpB6Yms>P)OB?kYUXMfaO>SA^D=_x-%2&)NAdC0G zuhs*Bef0-kE#c?RgTk%Gcbg@Tj2CbMmnHH#=}HDb{dL}IM!a8^1?$%HZ1a@shLBL; z0kNm~l4#R9;8aP?n*|?N_{b3hmTk00gBcEv$54C7tnv7`u-Xshv^dunHD#;EV9mfG zRn~~?Oi=q}mgXBjh+8LRa~9@qT0^e+AB z)LTcuujxvlPVi3i^siN+yDQGfk2+w?u5#gbC|{GzEgqaQD0oPO1sqsj<|lS!sXfQI z>WbqY&&iA1vYY$c&*X2+PnAplp^xS2B2Pu!Bwvvk)B6>hZ=xU6hUQJ6IexPP!=4xx zVvI-LT=OT-=tu-x)bt(;n)&WUY?z_o^6uw2tSZ`7s}e!Xyn2^kNg&araXTld5I6Sd z$g}AF!U1Fs6;4mV30exP&HuAZC^X(W#^`A=Iq*)Mi1h>QqCe^^M89b!yjU;hw?*m~ zPO}reqj1S^Ydw))S3g*|exKjbAM4cmBla@#8$ZN!n)$1glyKX#W9Oy%TW17g?$ZdF zukbm=tPtMW;--EnNDVmPFRwQYSv@Zau}pwLC&^jnWjVpuG2(p^!s>^4S`OhkYF=zz zi|6c-mptOI5+^REPM}ebV>w4zo#q4i18(eZ>$6pUm8470XP%ZQU)9jKtEJ@zpU2W~ zw(rNdtQ+fr%BMKR;ec_!#*vNwnTPm!E8`J6b1;NB&gy! zc-C+9g7q)$<31Y$1PA=@^+HHh@1bUNMNA40%ZxO#gIV+H@-%L~?y31L^K>z`M8$7D zLT335y7Yd8G~zyh#Bb(h`;Y*u+T$RqAGQjLkJhF)e53YMA`1_gmtNm&NmIKS$2`#= zP}weJ>zT&mBT(@i{xO~NbbsUoMh^ZY2^)O@IX7G0M4RoYD^yf}_g^dM1YJURly;r`OMNJV=(8*k-c{h4mu7yioE z1gSI;ybDLr30#Y=RCG%|0JqmimvwcpqwtP+GJgCOKmtOJ7_dc7_@Zo5@VEIDAoldf z{eVOB<O$03n$`!jcIA1)iuuP;u?3s0cia>jOlMfa^mI zs~h@@fte9 zQmruVX6aXEX6QQ#@(x#GH%G5D>d2%pV?+ARmZM>OEVZ3MStaP1<=8Pniq9 zzA5b;){RB_6%9F_(M+47iA z(UWa(I3LK3oTNYH*Jr$cc^^9QFZ=Ig{gtnLhVz*G3S3e@-XW9Uv`_kbhW_f#QoW-p zH^!3u^s8qw-je>7`IxNJei|k1qF*_abtcRw(M#e_3;SugTF`yHeqc(z3g`2dtiw7a zpI7l^(GKk~N3VEgbkKiLh2d7{6LA?tI}&;Da%NnHOU?y8sQFADn(dFXC3-sChdlK)k`EHQ{fAIS$^>&4_42i>7u2#|>@l$TJ<_Vw01jEG zxxj3whJ~UM6*m`nt=Tq!X%*+j2~~ucs|nDc71zkOVk5Rp%Qr{%U2e$X>t&ivm%Gq` zsZy6)=cpC|Js0`q2bZ0XC#sRjMm(+ZK|?Bs~J+MlM3`= zJseWuu%yBPIx4b{Q|T7s|2Bra<^Qc0eJ}XeWNocuR7!^fPf=>L498V&Qk!zaRBOzc zbb{oDi|=oOP)S+m@|LZTQ2N(bF101AF4x-zr~VqTKd+X$>O?=#3Or^NsRMtj)M$6U z)Ou2z@}Eq#7SFDVD_N!DFg_*X&}q`#vA^=ncWkUC75S%1X-44lN`=z}rEbeQ*SLuz zm-pB#^4M(WJ?1*P%wxUCW4*v*Ni&k;->udSAX)iZHwrxF*4&EwvwFd_sI@Cn74!%t zYdR3q5H(ag{hKwW<}yTpS>t+cgcci@^hp{spkm{aArc#h^0tlD1pGp!j4WkM$yt^#YG2BMgr}v&uApWEJ|FQd;YR5%!RJLAlFK zDePzT2qhy7h-vuH7T8?QqlzOeOWkEaSMPiRVt)O z>Dg2f*u4?k7VuJ|7Pt{#r1TR@sR{h0Q8nN-nUtDsO7F9jnm|(Xxi{OC$WG2rKoSj# zBc)2Fdkib(yAAvRWC{_Kior_4{Q6-IHTMJ8wN*HI$hKB8`h6$ z1ASU$(Iz%ib+x2+{$v7vY6F!YWI#~)iW{Vw#1jgbhA!N}ba!i;rfIxQ(|DIvg~?7H0rw-1u)56$=@2mWv6q^)ln98Kxjj3zzUw=uL- zm%GS;*D4pR)2ar<-rc#lXMGRQug_|)M;8*%|Iov^3keR;laYPg64Bv;T)QM+=em=B zj?TK?I;*!0KFY?-eBfNAy4|IfHieI*dO-R%(W6rj*49o)@=m*;w@nw&+-18VpMS-X z<_9(Pm$*ya)C0m*kxb_RCargqCTV_$Se|v@bftE2tNlgAN;k26gi=&lmJ2F+t{y6l z8dbva4RQI`j}=FD%+DDkMe&iqs;nCnyhc-Zz}$d%5Jx+(x#AxX~bcQ zdZ^2FxubNhELSV?Z5ONh*$B44A#VnWVKU^Au(EV8e- zzBmOrVdO1k@F)MV82sEuYHu6-gmU8ZO08*-GZxW~%0O~DEE-~d>+D~x_0>eOo0JU}aJ3%dehcMw%F9|nudr^5b>c1a zM*_*ed>GrmUSaMQce$A*FkR-yMn9>g{eiKM)L6H*KNjCyX zG$`itOBphKY& znx^SDqEr^|Bki((q+b7^(vK+)BPaw9yZ=j?tD9`awOM+p%(hc8TochKLTw$x5za$13Mv z+T}cJm)_@ZYm~q_?Zi(V|s@<+I|5zFISSiCml%ZbE;p z3Qwz)VGn#xsa@PKo6wy!BWfbr9?PNy{E1Ss3B7BW0#Y`i zz(-TP+lODT$<$T)O(>YwEo;Dv!zFDarxajX@kZ=##7*c6?vER_8n;?Y)PP@7icKhG z8ZX_1{-68AZ$e2Gw{mX5AI&<#CKT)UYO=nSKdJcBDw9npg)~ef4pY=ae(QFb_A2wk z>y6WC@j|ADABkOVv}Q97=`KlkNsuqLlx62dfjW-MT0mZ4?pCJmAXy}3Uv<-P$F?k9 znLB(l_n)-koL{4v`?GZUV~ZeXO<Q|EQ8ow_Ox6d{m{h z60qC)un#y|sq%(%4v#-Kk4@mOjcNh29*bKOe^^Krfm!2xvn4I>p46C6S?n5cC#&E9 z5RU~5d2lCvtB!6ohb`c@jOqt|TdB}ul)jfL;5cg9}sswNKqqxT21aV z(-CgzSJzdOT*jGl3wWwg1Hgt-p?;KxOtA%AXVgGvRkI~xKcP9u(gUoS{d^$Nq_coT z6GLDccz!liiXYQpzg6i!q5(cdqjt$nxY(iR;upKuywBb?KA+b(J+Tej ztr2(29+gi@z`sb3cUs4Ja3(lYV_l?D+68#IQvOVEzTD5Ee6^|8mS`+$UUVjqNCdgw zEL(ZYl0_d|vhu4rIQ3VL{S__xl1XKPX1tF|xp(twg)@xG4SwHRl>*!O*uK_m>r*0k zyGS3dbdy%g?b%!>n9DSFZt!dZ>x8^yrab3w^gHn77NQUMYNbNI zQ@T7=OnjC8A=oc1SQGerqiVpzGr^i|N+(;eCUBrbkW z10Xf_4(e@6xEDoWHd5Ix!nt2*rKz$1=ppzvjou}13=oJm@LXJZ&lSHmswXPp?~s7^ z)kgAnSK{19xG$u4C_bm2?^Y=z7WkM^^MOwrRR{iEDcN@pw<(Oaj;o)qaE(zlAT2Dn zn&N76qLSM^>YuDK2~IMX^Qkz|#3hhuVh9`|unRZf70FdU8yEMaX3N*-A zIc@e_>Ly(xCr>!q#h(?Dv)Y5*14z`RyX- zDmmF-T5z^v>yjVny=?~iKXnpB_r;*Qv;}jw-8is|Dn#~iWk_YCsxt%pSs(n74p)4n zv<>~Sj#M}-`zQ`DXG1C|)n+cK>=3$AR1fS2nbE~zPBt-N$Y!8#Y$+3#MQ%ZITg z{yKBlmv@&t5qBs4V|Ts*Njvq|i2W7quE=+1ZP=Hol!X+yzf%4qq5fmAln*l1TD%g9 zHI6%F9LA?aoN4B-5&J94e1bM!uQg%|I7g{)p6tvblrTQXjGMr$anY5Ra~MxD<2o>F zTzul$w5FP*utlYu@qu?JRh~A+pElzrFl$_#HpU+_<2o>FJaXC}Hsb~`Yuw1qHecC= zYP7+OTfnQ8Dz7uf>&&2i|dT>IcD4dW{r#M+@nT^m~jg@PpR@c z=Z%}Ov0Mfv<0$&GeW)6kG^|s&%fAeZ@!!;mtcbv@adA^`QKM~U+yeessqzYA{2eoH z0<*>=N50#P>%gpWaVHb`D`wmPW{rzGd4n2lHscoX(@K@s8RPexaTAy|F0M1i?>6H) zFl$^~=b9R=G~*Ur+KwHm%|jl4Pi<+-xb;fh6H0)h(rcEK(hqjZ{3G z0{uph`O7dWgwLW&Gd8$IUVGbk{i=G6wy4l|>*3s&syOhYVtW!iQQIMM zU)1ZK+h4uSRw-LI;IT@v@uPf_sn-6gaD3YM#ew25en&@~rul2c{>nCfKFFr?t4XYH zsg$_{eE+I&NKTNzwo+l%P}-gJgYtt8CIZH$@GpwZCryzCn-qDFXhWahEt!BGSlH zDIck~O{7!RYjoiW-O$6i3s(-%ijh67^Z$z77j@Nzs!9*Y)gjf~s)vM%ExAqd`P@)$ zGL#?GLtKVZ{;`ev+ASJ@fJOK7lgrS27@IMVnY+HcyS_N@a2XoA^OKddQ-6)vU)h{q zs3~l)R9e8RmGXnP_?=yh*O_q>m^Cgw-(bATjO)Oxaq(=x_#88C0JFx$JCa^Cs+n;M zI8UkaI%9mI88?Ah4T_SEN3GNWaY+GyPR<%3Dpf0lY`4o!v@TJ@SBk+YsN? z1O6`fn4VW9$KcYm8~LId$v z)JWsg$0hv37OM&TlTm#@0(!5_Hl;l+d>=3yzIgF^M7{5@C^h^&mr_a7l>FJUqM95z z*wkCVON|-;UanMV5K8}%DgwW3R0~KWRb1}<{5Us~`no13doJLS=6F8vETd{<^g*NM z18+8}2E4_n`9SiQ?Ie)=3*Lw$Z}R=4}a_caK zB-xIjkkp{V(x;q#`Kr)dWGkZxI8|G#-~+i8vrCowvaUV$?iqe3n6JJ!DNILXZoT!E zl>*xuwhPQ%V{zn8--s;y*o?VMW9Oz>w0I#e&E}b3QGf} zkEe>j&vYmjh0X_V5;$vIv?MN8=O4AWC6|R~s=^g2cXk*2`TmFg$F<|k?LeIWF8*?9 ze=)kW- zJiZEucCQ1jKvwVK}p5*`QAuX)Sdyb4$K*pjcmTnDHA8nM5!tNPG~wX>@U_>f9T2>2SS z_X6O-N`PSUBj8mL@?ixbIJUb)>8dIGV#M` zt|d!ISu%h`uekmwpcdb(&2o?h83Yn!Hyg|J>t-a zCG#!mcU*l|(@us8g=cK&^#T8?)M(j-T_T?$qWt$%HO}2nEIfYQ)M~)gGIxp(o;ICT zO~5@WWkCQQZtnVl$0`*Tgy5m`Z{A-Me@B|X!fBbetYb;oWL$T~qlERHR*wd7ipEV^ zp8_s@O^R;`${QQGwwX&t|7LX=0A@WFzjNtx{SWo|I&;tmq>)Fv3#9iawJ8%|XJL~e z4MD_s$kQfS+2y{Tt4)L2{K^__!Jic#W%=bk3+LVbOx1p2mNnqtj4GLE&TT%kn&ftu zN*Q#(Rc74}T%%MNbd;`46%${bfBdI1EAnKDf>2FD{mr5e0QWVgE#RP01HiW^HCmQn z-%<565#^t1P?E~`hh1Z6%;AWO%>A&iV#_S-co1+e{0kNAbEt*N$CU&wg5;TGU9;!sTPnd zgS(>iJV%POmUJudK}&HykW{5#f!Q$S_fH6am-_sj`R)VKIlIc_)SDI;$cTidJ^bRV zhm*w{{wQmKJ|Mlw34rpks=BjZ{{4ajL2Je_;HhiL=hLWUkUJJu6VS6LNEwpAg&^X_T%`6@mZWp-Abyrq}|0*{A{FT^+WRzHf@TE2mHs{^o1cq(-kcAALYl3*(Q{ zb*9(^e%z=&AgKjgN@=3Gi$hY(%5L?0mig}o(&~P!>4S*6R<+1%wXURO35v%q}kdK@7Dui9*^vIzWHqeuQaL; znDtn6-_2qyt|sshm69#+T%!ho=Nr`mzT2ol;B`ukR2%1c)ZFgF{uqprIJKk*-QPCsBCY5_>q$g5SO9_%=S$FdP`=C-YAKi$6sC(2`RS+ zfX8WG{^=uNvJf>OSrlEY%LX;PB!f75W@ONq^4<;*?_t%aM6AqsxlFSZTVS?5if2h& zMcF-_rhb;0zuc`)UzKgTR6M6rW)|>&lq#PfdE;i0adFN*`j0ilpDlU~_>5BH?HwZj zq(4}~NJW998=o|MoX*!D)HTiuFI?p9SKZ`nS1C;c{EbrOO@r}|&A1878W%SW#t)cr z9hfyP-jZ%oqb+9K0^XridD<9%+KijPtZ{MLzLh7a;WTs50$yO$eBe5zLPC_@nJRX6 z93_GrW{OSVDMs}Hap!~lZxXMQ_*(P107$CdXT42{NF}$nNgKbikt{_;zn)LWOl zq6VIelVdE;0bot3(Q@-)mmT}IDG#NpKq|4HZ>I5&ANa)=O)T07p+?4qm%*Wm~yG~PEM zHk-dD5X%wAoZNW&l$zdRE^5GU8Px~;sZn*{FO^Ep$P`9d-nlo<((l@SUM=r5r~N?U z$wR(|+Z2eHd}(&Io8&KG;Rx&>kSpJ{^@pIIQTJK1q+>e%5IM~}cee67WYow>mVY3r zjPPzY5qB)8CUAn)yahbQsD9wFN`;|8>BLkKw^>Puy-ckM#B!vev5%TfGV>bnXrub_ zx%6doNbwe}@LeipE&zXFR3GqhrF1T&ZVch?UNde2v&LnM?YGrzo0->uj~O)p#G~}J zB@lrP^Q#H-J(W^F;8o_ZA9$@&p?;KZO%)^WRwT^NEld;m?`Ay!#Bu0nN@1{I$*C$T zY3?QCOg_D$VUM$nYQRlK4FW%8R1KKM7)+ZbMaQVcNhIeQ!sgO9O zv6f^%a1Wzez&(`;wv=c%iAzewGM{LZME`1u&Igj357ul`+Rd_>4U;XBbu70}h2Rn_?6Auu*4>*8~o* zM9xSeMt|0-#T8~*2Y$w=Mr0%p^mHyCvrhOlX3o-|tjB0dq`0fQ*kxK3`jx6ChlewV z<6M%t@5$r=Oj}N`CJNtGDGdvJNU3hOw$i5XxarOPlfvgx3iy0#I^3qPpS922NeT~5 zsU(Z&56S)3BGiEdFPXG5?J!O=ZU8Zshy4!chO%Fu@6doWMW$6|Sjq*%Ev)UmYJI$= z-30b2l{{vc!V=SKtW&r-rJ^>`A~7(K6Wlx0<~p;j199g+hq*R+mp}IEGoP)7BrCNB ze%gE%)LQNi&Z{O4?^7w3z(Ze{XWR36p*_}nrq!e|F|ruv<7Qkj~wv7t_qjtWM;XX5@IjSqha~X1D>JOPHv6NfJqcL zrkcero!d`U4mZ^rke=DoIxBN(q(zr@My7aP>aIBQ!nxJtzzUUel>@xis6OEJO8NDy zRXDlvH)O_5VAi-C)HHl+8d-23M&gS*wKe=;Wc5aTX% zaipTJd=YnNwR@2zS_4ioY5+*Jqhc$@XY{NH=)ddX+_NS) zK>Z_os)r1FAm6f@P3JX{Y|`vA?pbSjkoEw1?HL1?)Ad4>(P!@-@P_7pu-I%)ADiYSaJ_kEPRm zbAL5y(J!i$mIgkQQa@Gr>y)A&BAJXsoZe>Yb>J4Id==|$N`xHe*<>@)oY;m$`fJc; zPuQwVvZG|#VH)S#aWKl5Pn{&6Kq2!RE%OGDT$2+fg)}!gugm+DvW=3@h`=I!_@+PV zcMFgt?%&l6y zAGG$X0ZC&**l%V|#ANiV)CkCc%NynMb#9?LSZ$7)z;~xqk)?1laytF+qXG z8s{%D{c_|#3=2uKjgzIr4nop=W973Gaxv>|tx30O^bW67n~KS`IWSwt{IxlY4&DE- z)olQXZ|NN%9VdGuAYlsn(8s`%tag!V>-$|$zt_G=ewFg@{#83D9Yl^&1zCyY|Y#P4k;C8Fr{l!Mc}m^ zidpYjoR8Ejiqvf9BQ=X6m0bqO#MC;y&Qh%d@g16;67HqjfY~|~zboL}Vd@{}{;Bxj z)q2cd5yU==t`gY6=Y96J@p-EH3_EarYkFcEx}k@24_@Q|%^lfiJIP~a;Fq--x2crY z0Y0P@PgbP-6H~2i&}^uD(QO}zM3BeLvX!@N#VLl(I<{oxcj4gFUnBN6!e-rV?yDxT zPEXSTu2d>a2TIqZiok0-6ywy>GO=cwizaZ6Q8gd|efVaZ5;0|U0cOLO&5 z7kr)`OGd6@e2z47^FHM{hiZSS%IMk=x}k@2*Pa|$P;8&JWk5D^wHJS&Qd$T2pi*3W zQvR{2*4An;8dR)vf&9o-i^t5emA5P#xoSgJen^5-fA!ekNF%pLT^^gJ1H8zne&D4_ zg~3ee`cyHlF=fJ>V5&{vI-~l4I1YoBQW_?A6;7B_)K{PRtN|}EY5;hJQ8i#1V*sC> za(kni5WiFDPoWC;G`+?()Y5@;1s-NnW$$Yh&RGV7)44Q39R7}=HAQcOWl&G618q~akA{E%vvTXvX zKu|2qT`z>l{}0-IGDU#YL%usg@^h`7=L4yP|DcV0H>gedfmD^oC#w-2Qsz@7r5%=1 z132594gg8bSG8fS{OeQ^NEShnQkqlADo5izso6|5&wW4!b>`#e{xi$aWEg+^9R5eC zM<9bZ@(4}xu}Ao{QhlVKm8WUI%PsH%#!_mzAZw9e88K`R!m(GWJyO;R;FQ!g(HI!g z`#^@e7=A|$(qU5rKAHLgQc*D^^H9A)NBVAH5RVAf;)3>F&uBsIgve??n9FW;t2cF|CQCPX|`iW?-bRUPUpYy!4` z*BI3Y+@w@!7D``F6@lOAP^9#|RIw;0ayi-5nm{al;C$Tml>IO(XG7ae47n%yi z4G4d0>JdnVBahJ3JoX4ry$W{C;nMPK4Y|=m_g}B@W|e-Q3%)y5>ueP7t;=oD!&jMF z?JEk&DET^Y&Q^@c1Rws(khB6$JomzEdkbvy4-59wg19R*(J^jlx9clop5M0(bD`BH zcL5;|GO1%A`xPLyk?)n>s&1%E(en&^LR}ZDVrpB%_6wFu4Vb#iopmY>JCus9S&Fps z&Fpf%it7I2PH{lFuX8fhu~TjX(Pwo$a z@WQY*#vy!5;r(#SdH_h)1$)|VSL7>ck%B*)-xwO}ODbjT03R@_ANZhBp|L3aDpf3q z;PN4wgurs-b?-Lyf4{})1Cm%~ee(MiXflk~CwStQj-^na9UAzMQ$u4(BLQza? zvuyy$PPBm8MDuTDkfN9G)%55d|9d0gF&fL?T?2o>xJw;L(}`Vju@d*5w~e#%dS$P} z)IWXGC6_sE-sd~Hw@oL1Mh8H2 z3l#eEdN_9rlmmAb+miy4RPy~R?;~hCo~AN-9{{>f59i)T;J~6{ds09$1YV+urj4yaYB?OAY_>_qAxcO_u{zl5YdU7@KebXsH%GnTj zr&4}JZM7*qmns_6Gip!_sh0gE-h&!fIvx0PqiVo!XHsakDgD$^XaaxNp-9ORbWMYq zT+1)c$a0-Ussm|a1KTus1JDrIE^4j&Q@$+swhS11+MKuYruMX?3^kx~7?yfSy$@2Vnbm;#^rJpq5{j4(w zNNSWO<<-DxCk@0Yc{PR?ITd^YKD;4Ba|~)&yE$`%2F1G_h+W%(xW@i`5jcWO(I7rU zFo9*`N=WMF)xe}7YHRbcPFn{^?z@+8LdS6qk0Vf;P zmvm9)51XYpt{IZ&EsW6HteI`}x@SQ0T=Jlr91b)z{1wb78FwHilG)!TC_-Oesb;4Y0VfuhL_F?J; zVRD@pDwGe>AV{AD832;C4^lh?ojY00PBZfw@cl;3CtW;_@b)>umz#AB_&%csaCoCp zHDDT}>{e=Ju3F*Pk6`e{daQE{!VcTfm6`Dkd$}In&8?I#=cnU8Gnx`uv1X&Th3n~v zt(#iTe4?^h~JmpDQwWBwg8Zvt^6Pm%;?J(exHc)ZU%)`7T@ zjV3Vbv3SwN9~SZfbYRxFY;gCU5ZdPmmC`=IrAGAu&r)inCd1>AX5IuIZ&VAI^;q0w z_`^cB(7>#5aqGzV(wKb~y9PYdr~x1z3*LOn4v_6{2(5Pb@j*(f0iQ5x0Qd)`LaR~w zYpMtwZwa-4uQ94@s!Lv^bEUa#0{`8p8ju8hI?XmE0?Ob65<4hn>mOqhc$r131D`Z% zK9G>!Z`~505oF;6?rfE>1Iej$dEKb-sIC9VFZkDb%-^z!D>>3_oV?H8Ha^?xGrElf z{c$~?o>t}q96;GISd0Ld!MF-k-#I2X$sW9sE< z^OkEb-y^7zy^J9smgN=cIk=iM%0Vinp@AP%Dzs|0>A)B-Hsd-lYn(q5gm*e(H|5Vsz`P6}9 zjH+e2AO{y78!CC1O6hdqCW|v4_+F*L6sB}bstCNxs21?+M&&m9X;!4Ot0^~utBqO! zB!RFTQ6ix97m(QH>sCmC@E^9;r~|LD@O?lk>%G?7l>XBc>p;Sf@KK#HYBfQn-_?NM zZrp_q{7&O8ad9n+b~?U({c1x)Roo&>x9TCG(#{BoTPFDod)s8#qvqq~qLHW4PHe*- zphx{Br5%-9Ch#)~t>Zk{AYG$+5_+Ei=w5*07mAQ9w?X4%SH=9b5B z8p4*W{9*-8{ncZCMH?jAV8_wb1fG0MkTOewueJ>PfRmL9vy@UjRZM)9{vp_83)Teg zWooJ)0RFd8 zbs!b>c{bXVsD)g@0<+=EuF;+Qh(`FNNn#mx6l9K!*8D?c>f~Hg-5$Lgk^Fdfb za7XrjZ2+hKnz6qTmyn~XNxrup9i(Ikyj!WTUQl{eSy2T3qC?S@zIJG=x0#D3@M@!K zz`K1oV!e&;oMIo@YnU2pCGZ%qDjN3&-;`g;#OZDQ5oGGfc}^s z&fOj0z?Ncr7rkVNC9iQuR}=XPmC`!E{gvY6NBJOAt!-0CgVddyFv*yl(SEALa@!%$!ARYnsFdZQlBO)L()r`SHzm)15W+bV}C^xtKzQI1m0_j6izJPLYuTf zK4lHF2zZlHqutZp&+OjYru?N;75I%vHSPw=HPw4_>H_$d4i^WtDX&XafmcVWc+bin z)v20!3wWYZ<%0U!Bac)ZQbo4_v_)dFTc z7M~c%5DU5T0cMShn^u1NNn_q^v1`DGjT!*rafCPTdS4&L=;bP9F91B&9QFZEQY!QT zrE60~CS6_<=qDDa3H+H+HQ+g!K+QI#Yb;O`NbK^#98w|tn=Muy_y+Sj0K7O8zTT!p zOzATq;S1hB$Tq>l8kOpG$-PYQUK-0kY8G5I?m|Z^_ZzpyfoT}OX^2xQ+DK$`+DHBM zsFXnhJi(~>K(Y|6)Ai_L)2acV0jqIrqO&J}|wv@;0d-^pTgGY8Qz}0%l?|c07vnj7rUYagHl5+RMC6N3h40ACv zEmNv5?=JTlpzfq1xFc1+%K@kU8nM5k%@7S!J))YxH7X@T-~;~_4$0*@@DZiL!a?bk z)-t)g2@@p2eqzCzz+V|v13r-n)@)Pyhh^0Sj@S5M@t`!(vT6cJbmUcrEHAT2bs#nN z4(e@6xR(V5n2l6+5^(NkT4`$RzZ3%gq(=Aa34v$>&&8GZT=DAy^+YB77eK(@w$*OzyfTLHq#6}$6G5^1OY8nM5TR<7qYjXkx2W%dDIrWD^i zq5Miyt;N$vtmB3V7 zo+Z$iEKn18hfy^kuEXj`=}-&Q1QL7XWi*?>2^Osm{JBwcfrJdJE2Vubfw@2ukxm0< zb1GkOKdV8hvfsdg$-*zB;L#e}FNJZWk(S3_YMdvnk~QFXtIhzBn#%l)gN(2|=Ihei zrY_&txY6 zO7-R4m8?m)BUL|T!KuGS>~Ex*y?stKX`^Yc3sN!!{=}$0;Lnu`Gn-PyS|*ow+WrK3 zn|W;luQsX%#C4dkl%6xira_JUuV*$1>|;*qz}t+P3nXNi*_5706@iwBe8ZNbnViaJ z_GPL~mHo^HlZBtz;73&7&*C`JNHhC$YIi5uxf<|MqXvM~R7QCmWQ3WWuZz6#qRu~} zGMbstAJfCRnau&}AK9lPDYVS@l9^2yCQD}Cq*Pzt zU2cYi-3IPR)lXS)>aP*|8);^*oE>KLCsay?z)$IY_lgxSwj zn?SsTxk>51R1rv+ktZ>cR-1!55Z__8Qo_BQbb;AOEQ* z#`~FZ1DG`~o55kkZChSVz+P_-QaT>^$G1Q&06wi$XbwvMOcjA+S76%$o?_I3Bx1oI zlKHhJC4(LKdy6q2NO+%2vrQ=tGru5$QH0vv>RktpwouIvEBt&)5r>*ej=-I)hIJs7 zA7Me0&jDz4zht>IfHzp+K63a?N|8$%r2$NvAvZ-?T0&bq7Y%^%?$XS!Y%msR^YrL? zS#e+)9+~IS`NPnp89$E>p7!f>4oi*Fqkgf2rJm_gAKAJ&2QJb!zEY)pY2>Qm(UhLh zw)JNz@KeeKO-kfG%3b@{^`ql#iq3Lrv(veEY7Tzc1JmK%?t%{ue_lfqG$ARFLASg1 zn&CKsgp4cCt+==ie0*AxE}SN#j~SwBM$!7LhCpW*03XQuqaBaeshk+c`HzYS^8bID z|E|(D{Ir*hM(8~($H4;?&NQk9Y$_!`UQ@|9A=|H}7Qp+8EvU-NZB?oPU!znMBdV4> zTDDhRw^YhA7rs>X%!RzR4A)J=u~R8m2G!l!Dig&EwD4AyvSll$ zmqqUOcHK+geQe_K`cd*LZ5OzS`)|wtjC-0~nn&(@)m;+?Q-8SJDK>x@<%CEH9RAVXStRxPB#DBty8&2H{YP zuz(1uyWEG7!mNqi`LzevslR&c&#R>klt&AvRTJ{RR7#e>M`ngYvfl^(T&b{)p>+Q& zQw09ZsFp$7Z4D$5qd$I??|jTUseRH?YXUz$orv@9RQMH@-EMWIP2p>%*LT*8V6sM~ zT(<43wb|P$+IU9cVV3_q;3B1xa|wkHrg}h{Akm{>jZl7l=G!A*TODdly8>-AF(X!2CX*+ec%`VBE^qeuQY(~u-2Xnyw0c=@G$Fu(}Bk-B~5n2FokWY z9`ILLJqlM^!<>GV!aGumR-t1n?sOm>E6X5|2J!cig6d_OvAhg^d+j78UDZnd#uY2(a`8z(WQKF?`=5;9Ip zmbmch*pEQQdHO|&MAIqR_%E%__f^X33Vhh82Jjb3$q&O<+7uW;6*mva1ed(88K%Gp z5*M>3WQ@M+^ikyf1Y*NO=8a` z&)DS%Yx^E@k4!YCOw8yoco+$JFC6)ujis7FZK<8)t10q1o7vhR$EsACVxQ8ou>!79 zYLAfn{#}{OI7W-^A&<eeX?s#>@xwdd$TQRj$Rb5t* zMr660zb3TJ>%!cIsN0;Rv2xo|S%_t^dw{{DBgijp3?CK;&w=Ua!ry{$`>U5;mC|Z= zl($-}Ef?0C^IshEd2$XtQT+zZJ}t2oDr(RQN=sB(_DQ+kHvg%o{GP7Tp9@!yJ;@TM zN*l_H~hvsDf)DVx~&@?A?3RL#mX^zRTUKO82WA`7$roF6}?Z z-sVa58#JHR5+|#|{&NnsZd*4RyD7xd|J<&ud;U@`KN~6*9`%Ad{=O&wqWR!mW*!jB zF8TfBxYPZPCcHN39+Ew-H~@ZL4~-5>f1C0h%8M%7GuzTS+ud?*l07i7kbc8L+vqLEI9wqs4tMD`FE_Zm zN1=o)&hCA>jDAw3jP5Pvt5d99xTgQ7y1Gwg(GZr)K-9i!YW2G#%YVJ5<0OrhTghlP zWY5%U0vjsjY8beyjg`5;1C$C^!<2ecMc@%ewSY%;*isra#koMPw?YsS%}Y}MPfNWC zyxXW6kYv5rW}6bp$vq8VHhl40F{DBQyI39SK>Yh?^@3=1qR|dPkJI(DZBkJ|;XBi=1nZ zOjap%yJ46Do!e;wOS2><6lkMPlcW`Lf2ekkc8Nbz#Myc-_FZ&FsU+V0-?iGZ3=O~5 zff*Un>R+&7a&J0JZXAAC3$&J0?#AIbfrQLeM~Liw7-GIh^VwCN5yTA)={M+`^{{OJ znZMsIwt!CO@&K*%Ivdmj4C<#+3iwi+eNEs2N=b5dcSVvbs#`g?S@TV+QhP|LN3C`> z;L}P;AKX6tPc5W%s!^vC({8zGxTb|Zt5qF%w&|VU+kT4{E-<|saHCQ6w<)BpWE}=( z`u!&B_eMH7ZW^Aag|n?SYru<)ssmZ^WXRl3Xe4cWhkD!8Gtw-ZW zP{ChZXkE~iU0pWy7)(A3n&nAtG0%Z%s^YsYX$<_)hu#PHP1Y$3fJ>Fy$*pu#4ro(M zyKh0h`|Jcmv-=on1_9~hlxtHmVu<+~kWm_EfH+$%$pKaZMufKn6T9%|O#Nn{lH@^f z0%n`zbc@uC>+K_v&>g872@$-g;xxovYW80$caoct@?JB=?`LTF5DP_4oV)q6S+qIv$WkO1ZsYcP?CVYQhIHbVDd{hGrX<*^&Km zaW&DA?F;Z}rTo{9{0Dg`|IJiuoE+H%i9;Y=B@PqEnLqx138{?IDJ$D)oTZi}mjT$4 zs2>I3)L%XJH_~89v)iT*Gd}jjYC=k4z_%DR09>h5*ymFkHpLcjLx&=z52T8~wowDX zJB(@pziL$OR!mxzfT++f?J3Po;1u)H51egO4Y=H>ejpVMR}+-hq>4Z)8Wbs|+4slU z=F8;&H_N{cq+{e-1xPMFV7*O=UXbw#B$uE_={l=I6G$%vMM|Gb6@k<$D8>~@=iwi; zA~d;d4c4|P(CFQ6<=Qp{nmy5^K;7hd884~_F!^Qe1KJ!UgE4N(s&09Z>;bvfl*=e`qM3xE zaj3sg*|bvJ(8T)F1cB!nwE)PVDs`uh`>P3~B7Z^1FyjZEw zyOb_B#TIa%Ufc};4>PI-JkF?pak3-JlPyvcIAl~mki7f@1i)9DS`$cO@;gvK5|i@| zFwHS{N=sM%d$kpxQ@w_N}NvNRy;&MSj|?O$3BAKMFvW~ zGPxU9{;~pRWW2jub?MXtG9T%j)W$h!7pNrTspQY$n&xs#w+6&>a)PAr&QuS0i&FlV zq`$BDB{q<1`Ksn-0R6^5Cz$m5Z`9#2W`Xt_H_ z5;Uw(z>$VV(Od3G+rL|Da+}Igu6o1)ZAx2|mD2%`C z0OB8ZU{yE(@lQQ4PTt&>`))f%eep#TbN2*%K2=pbPo=Enzz-@F>Qj_F#;eS@3CtQ7 zoId?EUncr|b5I9fVN@URtxE0Ux+h#8J}(YMxWdz0NPWYB)dYN0rPLJov{3`VJr4@n zq4JatQnuvd3f@0q-eW$Sz&*@*J`l$~OtVcX4U@ZJkW|5u<+B!~2Ap6)27tIN*u`}v z9q~nVGgfW=r7;*|e+vdoe&v_YkEqArr3nIevjqF`_j02OR$c1)S9Mhsv|=rSmYkkL zQ>A~q+!gBLQ!3?`CoB11p3LjX#}XE93ttjB_Rm^j{`X1I}Y0{n=19B3=VW5FD#xLB!p?I_kOOHbYo)061l zQ>sbAGIfEkP$~qXR7(|s7b+z?rMcPW%wpo)m!7nN`U^pN=?BhK>SgX?J=L8rXTCAB4_N8{9Gsl{=Nee#VqB^pZN_BR_c*p3=Ppja3K{$8IQT-mNnhdP zaO;A;7iQVYTjuUlCZ6<^=iH;(@xQkLFc0{&QoG0pde^#%{yRfZ$gy&uM-HsZ92=!c z?;^Km#mpaq+S%$;15U_mL(wsr_;D-va$JLP_LGxxPl&qUOD>5=@{y{&kd_SJR3iRw zwYhecTJ!FrWB^SjyGpZU4nwDrn?(tF?$;XN8S5%*#c|q-JIPK~-bbLAI<4ggM(*t9 zW1OLm7NiUBKKO3bs!yGaGlMeCsHdQsq8M(DY}3s zwVkb^bs*X9Efu|f)U=6_Wj14v{l*_}jHwqqyeei&NBUt{K9Z{X9kiB8xmE`bDCIxb zwpJEQ%1cbO23)Sxm}GgCFNx$%ZoX2-sultKJ{61y`68HagQC~U6RHV)vr1_b;1;FA zl%w>GR1tVzhhk9_;gTyaqFrrHn!tA$H2`cYHC7rx?!?ROMfu*ja-UE+PCBCABPS+* ztDYRcX1&A!4+z!|mnBO(~c zR;LY1a{lvidh_2Oh9;c!8om9&G-{CfeJx#Bsp^8MZ(vZM!Em|E&B4K5q z^t359fu!d@86jK2Hf3`3yx)^kCe1OTEeoccPhfV@#FNETT*>n2IF&MYftMP!0JvT$-z2RzrFW%@z)c;Bls;sNE#QYc z6tkISaX!l?S>oHL)NE72z0@C=ja0r1@=*`boG!3*`+zh==A*U#^F7eCNc_=S_^VQn zKw2#F2u+1zkJ;Ao*q^kfsCSyi@2bFSEOOy((m8rKRqH3`tIaZZm(T~TIBW?ew-bRU zo9#e77oqSSNi6%#vUYaPvSg)N*r-ZE&b?WsjAh_^jp_%!PpL4L6T{peJf36bP2gIi zTEMKwvJr;Im1bTC;zq_SFzd1Stc^b`WWNB+8W-&sF3}X;YN^!X2B^5p^x!*HhH3V~ z^zs=O`zuN=j$3e#+9$DjZZ*ket4e7*;6IIOBr5SAyT_FGQOCzU>cihG8gdi;k3c{n z$I5{oIWuLCJ&-XIUM$;C4_j6>;Lr2gP`}O`()e*TWCx{6X@yHKobFK7Z>W^5Dp~wk zDZNKS@mHxP$^0dy^2x|kQ_id=^jlQQCKPy`QhpHS2ZwX9o|wiF_|b3V;)6r9H7YMu z$&Z4^_V?yiMg3D*0$ZY|s12OZ2_fUcKAJ8`ZJ?2Gx5wlE2XM<0}7KWo-Xt z_0MfQB)2$`+)L}xTNT_UFZ0Ju;#mIR{}_+BalEgqKjPs3;gUEnw0{48D7eV zTP4q`n62el|6R)8q>?8t@L&QY4+KE+wRhz8Geg|%D*vjIZ+P>3n|~F5lzz*dr!U0v zHF}(9IK=*V76X#}d3M6inin#*=V=AV^%{?QBY99kZ2t+>=jj8n{I(wF83wUE&mut5 zzGeB+&OE*Y**~iqyH3jgqxB!7$9Gk^x5|ksU#XHOja0Q9JB24MvMl~u^~3kqky}dq z!}IlWvqSy2&IyvoD#!W1NRRKKl4mN<)^e=>I_3XOB~Q}6K+8PdmuLCL z_B^nhhm-HnXQ=bg_*nm9J-%KgPmKSRmScT>>VTg$=+Pgc;O8b{{af^z`?sm&wDS4sH=(yd1Y|NIbYtbc|cU!am-faM2CWBqYQ2Y=I4Zd3WF zN*BE@R(`$8%T)49!jXFJce|^{RudI|p*z;U;h1pzgDUw!^lxi9*1tymeNp9>c})g}64j}LiF zSLwJ-s4~vy64e`4xl!d!*hdE3@kDa>mb;6Qy5k!Ze2D&FyRQ?dXldG|6Qa(fZD^%_{CFnh;GB(<#dJn36MCG$8V}1Dj z)!%lN#EJE}$HI-04SI88qsl8(Ua2y+KS6nJhj5<*f3f~cPOT=?u`0Kn7RryRjP*CE z-gPS9tMYc0u|E9cdVH(;B~GmWH$9FVQw#Y_R~hT`F*4-a4h;HlSNTqreD3c9TK=fY zkE!HiXtDqJ<9K{bj*s2N`oC9yJ5)ZclF!1$`e$pskSnyjLFE>eUr`y`f4Q%kP>-qH z&jq;k8; zU#X1aEqYV1f4j=6-aI%(Wvu_8>OG?J$10y!8SCGuez+ZjiMU_IycvyV?T4hb;n<9CZmSg+RpC95qrgF=wP`*oL ztbd5|lT}Vp`KA*6{Z|KnO_gpal*g-#{V%&99KTNG!nL8iLS?M~|5WdnDu1PN=L>^f ztPej;kJr>Mabo>#di;?{K3s6k8Q78|ojQ#&i^|q^gOy!so{RztNsj^4q zt0Or>%W=F}7l(Y7s{F~Nq5Nx=vHrqK!tuG0UYY)Rsy|lsU!fBF*gyK8SG&6+iTzCV z^ZH1}{w~wwA5}SSeaL@Tm9c(J`G(4t$}3bpds(pW-WX(T|F+@4Z{85(qbj$n{FvG! zWBcpX{wUR-tFp{rnf-(6=QokW-?{2{LnLE=R`7a&PrByF?zLd{d>1UXw4cCd^!w@46zC->WiG zcQ>lur&Qjo@&_toefVef_*LqcII;ebdi-dW$EiF^Wvt(Ga5bUGm#<)zT`z4`KYM)Q zn8a?SUN5az8T;R=`rlT0{98l3->E$9-Jv|BGPeI*q<`MO(Es1&7stz$yX6xN`*epS zvj@B7nO(CB`EED2kRRnPDdcx@n+y5T?%Rd@&Tj75qI|}<$Hy1(ySSCR7V%@cD| zwi4a$Wv*JtPt2+r?soeb&Vp|D@@&y?w|j-*Ea-MU*`ncY_e#TA&|UJdw{Ew8RxQC5 z`8&$}>G}A;i-f31|8DQbJzf}3^ion;DUkCr@!0%B1?^1sA#ev_f{Ehg(DDYQF*}v|P z|9w6i)^+mVSH7y_3jdEQ-?K94Z&Uw&Q{Jr#{1)YR6Y2d|FYWZdzw+DHcJi~8XFT_c zU;jE)`JO2MCHPVQ2L^TL+uO%osO^BCcL?9*(s{j`>c3C;qJICl>T~kBSoJ@n{AN8V z-Jtz)hwv4d7aR1Kt~N>8zwSx+-Q5je3gcvKpxvXY&o5(*QvNCB`35xnKh)2{{|tWk zC{RV>`|(**-j7%R+E;jA-&$`qDW919b?&vw^WDK8Du1;4=}|wsDu0IZF7iL5{0^JII*LH+Nc z`ma@fVZ^^d`3aGqLFKorKKZOwzNS3m>RRP{mG|p~f8C6K<@XA-yGQxIe({)up&uVr z{t4yr|BUk6l$SG5^4d)Xj2{nMl&8M0QT_(yY5%J7S1C{2dCISh{I61eq4KoD+m)|I z`Zp@yt33ICMfskHe?<8Sk^es`|JN^cw$B(@cZ=rlp28>d{h+G0Ob~l3zd7O$RDOHJ zzg~DhuTR)`Y~nzsVe)!o!spM+L+WROt`Dm2HYED_^LttT?L>c1cj##$E`Gc$s_%b@ zzH@u!_6c82{N(oo-%|Z}zwwiV&+l7)pZLk|6S_w`+2y>*ZC_RO3Amk;zrrbB8>}V_ z%ZWSt|n#L=co8z5%>w3 z|C0%ysCNAMr|S2-A?P2hM|YEi8N*qFNeM6Ge@)OA^W-&C`5l`7LCPP4zUEK8>dNy> znvbdeBIQ@=JbI7v=PAGKglfY4LHXf?*Fr|Tr-Z*r{Wu-x(tXM6juQRv2|q#lcebvF zgm|b#|4H>=>JLiBbDFW zr+gA!_LB*(g^XB)pJ*LhsreM!Tk8Mi%5T#* zQ!bJHmVZr7_<*y2tE#_6Z;BtJ2kRyJOH`jX;SN^))ynVC{HH4aHszhRf4}nYNq8+} z#H}U#*Gu>Z)PHqlHSt2+UzOR0t9{v6HcM&)~S z9ebtfe@^*L+HUmwR^>Nqf4xEVe~|F`xW82Wn)<&&Ri06P$Hr>H?5TXWoCx+%oE3W~ z{EM8^H-pIMAmumBt0wBbYBXE<&AOf(r~L6H{^ynOYt_$==)7=^^1Ua7xa?;>qWm`P zNA@$fD8FG!(Eotub344YGyCfAD!)+UQr{mbzkN>d!#Mo4^3@{({|oKkXA)k6WyH8$ z!+7qE;_j#XR^@k6o5{la^F@3g>2THGtoyg=s(-xlZgDkXu2a6H{DcbvPra5YU(@w@ zj_R+%zwXoiTlr!1qjl*T;d@jkD?XU$XPJO+E8*`Je)q0@U2k-L{6V5G=e3R1#KE-S z#ywi%=Z_`)PSVkSeV%Y}@Y5yNf&R6p@;%xPv`-KGdDTQu+$OK-!tXBsao zZ(CGN^j;g(<%ijd=hvAf{95(1A!_H-b}9CAWr?2~)z8Z1As^QH&z0zZL-i*t4EpOe z|A$NTpHzKr%CG7P4f;prw`;q}@}9gZvXuDtuj=*1?mAy4DBq*kHLU+V@KdXaeO2`j zQ+|`KOEu-I2_Ir*|29>>s^k9{J^wCMzBWJjKUj^1l;8e_z#p&vFH?SVGw^>>{Y}dE z=zeKP`421abe+6h`Tt0GEo8(!s^6>iVjSKf3&I3{-&ptmm^|S1yI$lL9#l;z){Q6C z4_|hkt_IU(0Q>guRsF-1|GVmM)AfhAd&`C=nJ>EUf`66r+cs7c4=+N^w@ggeZ6|4eC}8MUcD|`r~2EK->UPA_IyhD&3e5vli0Gv z`1aqS^KTE5T=_$U_j%5a@|>yqo971o1*(5s!fPQTPFMX+ zx=zl}V`rD>UsS@sqlEvc`mgG`A;UF!eO~zfx>xyy(R_KJ#Q(4H|JrKe_l)4) z{j)@Wk3B;BZ;JK;&wdH7#u+hN^|u`t^pDYF$1C5f zanDx1AOE_}U#x`xv%m^ z6O`Ye=f^{}{SQ#Swj#tG)cmI;ycRNIUw?k-l1*_>(C5%GCHnp9e{(D7_o>0M68#HR ze_K@Fx8Y}5@N>KRd7ttNb={k;{3jA#3mI{53I8+UeZTX5uH2SMUVkdlAHTP6=lrWD z;a}u7Y^){+rKQ4a^;?#$ST=Otxr0lVOkUzvowsz+(4xsRdS^{@py}?E)fX-wT5|T3 z-rn9>GtZnodCv4HQ##10i9kIE=9J#abEeMdtkaBX zvnA6xotnL~dL{gnS)Gw)&X!2CIxD(Jnr=$(^xoMWs#BKrPM+C2y|engGbH_)Q#->? zne8h&d%8Pw&AHME=dD=kRxDqY?+_8BBcn&Kz8{ zbm=N#R}HRSyy`7($nRxM)ymHa1p~=0)4rcdGD>*QIPRW5;(~A$xnOf{>RXv}&C@bJe1AmJKdlbIv*I#3WN1 zOs02Mb#U+vjicUp+~9Gi9y>TF${h+z-QfRMy48eQQe5E@gTw@sEFvR>a3LcMf>)i% z;=yd*yqR(4!RUl!#1Vv|Z{O;B+t+_~SHJt7Br@PK5!@vU7rKbq1y_lSELQ>hqm*>eQ)Ir@FhYy!hOuXAdvOcMvdojjC(U zJuk0bcO0%?`L&SOZrnV$bVJ^J=9%AIy(Mp5I=FFFicOz&9U8krLz-h>M8oqVa53Q{ zA4by-lug)>x*ZJ&MEm>KZX6z5mgnaeJh&Q^I`XCE*q!$Ui0M{+=gU%#RVDjjT^8C` z_9|QY0?Z0|MCPl;25fRM>atcr{`ooi#L#qo+2}&%>!Wb*!W{9nR|z$@z0hjPo!EL= zKtY*o(e^s9v!YbrH?4#XGF`S!e79PvlP<1eX_DfqLLZGyRW=hPiEA^~CO!{dfkF2T zB>3`JXG1V9dZ?217;FP_^iC*~r8Y}Z4w=@c+Z6%?alOY>1L$%)4cN${%Vj?FUK5oc z2enLt#h~=qg*nHQ=8;Wd(h6o1WZHX8u<1*^qoYh~m*ue_H!2fVrJ`w0beUe~ZBuM- zN6~hw5yrc>6TpL1ZQP6d3vHr4#;nUV@Cn0)%NRd>i@Eh)e`E?U)F;7MnQlwZ&9=oC zoxe{U68%y^X?xnPHFSKr4x@@#W-B$6uLh-!?Rr(y7|~gNL<2+?Sy=^+zw}B(-Bs8T zCF(lc;nH>2w_4>|&{z-r$f4N+E@b$!9rzg7g|C8*$tw!oBNNI}A6S-sgUA_khrGCg z#d-F~rYIV1r!tukLy*X+fnvQKo{4RyZKEcz@x87D#olFEklN_XQ>me}^Gb=jGWoVcTfz{-3qAR-{5F=upHOqe9A;+h&*=x-9Cd|hwn)sZk4V{KoCcRX&Nbt!gx=F-;nsP>olw6jL90wH)Pi@Zyc`S?^3!wgsYglAGHm>PPuiHUW|HKn_2uVdZ z!nkC_9ibi0bd046T6qE^CgYM8SH5j-08YHhPQ`%we1~!^4{!mH)#fQi*g&woZO#;) zhi&o`PSQ~Hk;;5W>Sa$1Q#fvRLG(rIE;5~TzJY#w?`&1 zGc64RoPr_x1&&WCZQMTA%lNCH&W-QW1Utl4cK(U$n2nvzDD&YO2)9`WS4cEsDQqed zGokQe)(#~tU+7UlpCN-r*uHl{Wo|{@OyZ~+|1L?llUXdmSTnBjjH0!`B5yH$n6SK^ zd_fjvtjPp@DHsH?B0a{* z!q9SyF64rYx61=xgiCWc_H`!wQd$#hVB8_DVx}0A82y4~qwNGxiwKw=2Cs%`AKC08 zEILg9r3F`DM^A_Bnskxgz$Aqc5=iZ$&2>XO%h2-Brdu&NYetQ%I($zxoYwTvZH{iX z=QUrM_}PhhgG6|~YQ{NIVhl!oI;mQWWwm^wT)L`D2ZvASY$Xi&IvdtvzC3Lp!k*zt z=FYL|2dpong2X+9`HTSWs;jh^n^|j)%lV*kG1m%% z-fda`x1IdA6ZsD~iK+e>>VJ%X#`8YI4;}tZ2c$OMhkwSO!8IKv{)v?FydUwl`;g=J ze1nK_5Rd8c3JP~8`t!cUPu+`+KR9C6pV{&GHQfJZg6I8>oqHjC$Kkn;SbtY7=zSX5 zl=<;K$S)lJx+7%yjOX_M(cupq-QGj{=4ub$wa`J|+tWd(NAaKH-$5POg!%jTUNcnU zApf2oY5%{4n^XL3wr|L1GjkG8B>;Yp$LGI*Y>MZ7n!h@0@w0Eizn9>7KWBH&;vf5+ zb0k~DHy`owHx#GxdEe)s{%mos8$2jcNBqO#x&Qb(EAgJifAG48nu}Rn6#qn-bg z%GBd||LRxY5&vIcsr@XU_XUdEPJW{Q47AhZK7h%08PEG+f7n?3C&U~FjXyeAZ}x*9 z;r>)U@0w)->@Cz5)`pH1q?R&?;0-m~+yy<>l0a`Nv?D{-CDUfhBI*x_f7 z#|BLC^u1eJM1q7r^Xun%J-XovX6tG~t1(ggK|`LyY{cJV3qbI6T<@i|MeWj;*{<)_?_{i*h!+p1(|nrolx>v%c=UMUr&D|<|2XSEMSlHh_6z9!@UvIPnNJxn|6KU; z;MH;)>oH}g3=)5w^`HCd^XvV3XRGnR&*KkNJD5*X-!ieE9GCyoKl-p+7wG!faj@&- zU_SNius*SF?Nukw|HQhh=dN43VJI>;;yHQl$@5RRZsQ3j)|(*PCF_uL>g@AY$itDB zriZb9EN1Ak{Qi+opSgJJz{#0wC)@in$9?eN?h}6zGdX0PGDiN9`{GIO}xNuKm)`<_kd*Gcvcvp|62!cNy zqLP30<+q6+P5fZd;D43p%Ot*AbmU*f4->ykwEJJhcaiuvi0>kKRCzed{mILZGt;;)nZ7ZZP#_^~Aa(W0GB@elqPCGkHJf&Xg0y-d7^ zJ5_oPY|C( z`g+Uo`fHZ4E*taTeV z3@l%D)w%&|<;rW;Z``o*y1`YO23M|Bq5m@Qx=(K!Tw}?f*1D?)B4L?-wa<nt{R4 z#_I+*tXe;?a&_ohku?&&X603@t{aeKT{pOCb@($v!<*J_7+g~i8HlVM6te2N>jp&1 z@T$Sk>Wv%LSObxP)z@3s4GgZ^xO$anpV)Q7>h)o3&ETe?4XalT4p_0fLJ}hdm!fV3=R(N33rj47dH5)g{28bT5zE;+>a?Pr>>#U&-;&Jv`Ytz80bt1F1 zTKu@yT6NV%QMagKaO1jlmiV#phJj6%=uCL+)z-CZg{=;)-*|PSnJU%#YsDzaCe?G) z_rBU%d)=zR!OvLh*RKj&SFhbv@Ak@-qD31vu9RIFT)T0Dto>?H%}`i0RaPUqVqHBH zK2cP#rfFza53Uu1wq|u`;|&``>#p87G-#~}4-Kxi)?Zt%dEIpb1J_#XRab`Auewfl zZ2iXT<>6dC_?hs)%By6hvWkHX*UJ%Gwdop}Nwmkh?lZFa*7~6hvaMpEHZ)Z&LUp6+ zjjfMa{g8yM)uQ!!u!h9QT(|Zbag<~gt8chk1lN1KYH;HkOZ-?X2l%=HYfv4Yjp2a} zmK=q3^_~sYf65=%$@=S)Lrs?&6diB6{*U3)R zdn5K1$71D5IUV&hUcYMX2J41RYsF-d$MTv@Vas&VTC-_DCXR^dA*bIOwQ+X;(#2=3 zJn@7RPgr1??UNc?^BY?yoiJaX#1q8-+Uq~%R)^kFE~WK<6QSJtttsK&6B~I|gsN{} zt!6*`lo9fcSox%;cA7}p1NmMh|EJ#NoZ@rn(6!=4zr&gg9>nS-L!Uh}^&3I#-ufz6p(dW*xx1fBUbHwOdwAuMZfvYquU$@5#nj zyr8yh;Qy)JPTWDl)z0p%itz|1>D3}iPykQ z`>lss=efyaBW?%(PdyF}@RxLdo!}ynLlapx8;kf_>%#*exN){JV!iFyg1pW){WpLBZ z3h^rO8gXk^>pVC4ZQ$S6?XiQKcnA2+I^GHXS-CJP{2>y(Y4}rg=Jq-S)_6Yd9+N0ndy51Q00os$`rkyG9!*zTb{5b6y zaFZts{v{os1NUgpga1%_0sNcVi{Oj3m%uO9UIzc=f2tRO3izjfp}b1GM%*g2&VQ4~ z2L81lsr+{EpmqoN8tqQ-L$$lWFa4>??*=#R@eucdfAABP#|J*)$IAWSf7k5^fSYj+ zg8yoRIxj-tv(5YmH}Mg06CVXXSm%j>n>yWMO1wtg`hDyCH}%?x+lf1fJHhYM{dIwxdfnirUmkE1?*%vUKH`4j z0pda8A>v_h)6NLEX=jvp4BX^Nf}1=ka1);fH}M&86Q2b)@i}l4p9eSb1#lBz1UK;| za1&n!H|J4>cop2_sezk3*284}gPZf+PTT=*@;iyUz<;RE3pcpQ;{iAEUhoGlmFsMl zpXu>&j%a$yV~vGCf-5Z32ySZh`Wh%T?zNbCIk z!_&%b;D7(8ayz)^Ps$zOCf*7Dg3j*(KkzA)#|{34=ahShd%@3qLB;!s`@u~+1K_4# zLE<5BlP3(m=x)`X2>4r%E02P|{Ws+?@J)IglEhQQ)8N({Du0G}mUs^QjNhp|dGH}U z9}3`G9#-*1aMQ06xM^n@+{9OiSBclapVZ@TJ=!||O@143JGg151Ki|s5_f@{JZ^B4 z#{+KSz2GL^2X5m1;3hr*ZsunY+{A~#P5v;riI0Gr_$atJk7C4=;Ah{X=2Z&ZrV#!tQ{&(7W~Ye%5&f*f1Y>&e9v$7{0BFAO5m4oSMg==QwG#JK!tdfc#XLASnK>Z z`EA7Q#2v()#9hSQ#685l#C^p5!~?{G;B)o(hlq!XN5IWEN5M`07`TZ~5>J7fJZW%~ zCqq0-JV!iFyg1V4MCau@hFw7bFodyZ@PPIx_?6mY;2X84!9V*;bzCywr)HFAiRXyti5G|$iI<3%iC2hM ziPwl*#n$<3#=%D1PTWD&=0` z@>5lB9=uz}7r-4le-V6!ZchpPQ0--Kr}hfC8Mi9#4E(B#B0Q@-L3QA^vg!vPTWDT#=qpY$s=&eoHy^WU`73I5zs>fgL@fvdg_)6E6@i5-)-G z>-LnvO?xWfCcX-8;%ne0-g>Haz8SX>w-a{|cM^Ajn|8XvO?y1Vy~KUsm+0~I6Aus% z5)Tm%6ORy&5|0s25>J7faZ7`namWzQ63-FO6E6@i5-$-i6R!}j60Z@r{@6PI&G^`e z+lf1fJBho9yNP>ytA9VD0RAKGMexKIRD22iXWGl)%eJcc3i#{VtKj#>RD2D*q}_VDb>1%d zqKdbHe^Yc$;z;_b#t0XOZ>f`3lu$$_7u+n)!2 zUB?%|-_>3OKSFy6+_bYy+aUHs9sI14ig$n)|Ek;xKH*vAF7O{duiQ=C zL);7g*q>D%AGpcy2VY!P@d5DnbvuLLCO$+wOgsYq$aAXRD7YE781W?W6u9Yc8oa%z z>dg?(f}8n}1OMkUDo-9fsq+`Whn`aLMdBsmW$@4LR(UGmCVv(Dr9Z0p8hGCm%B@oC z{5SD7;&$Q=@P$vR{7!H)ZZ6_(;vR6*UoZHS$5g#O;(qXLkE-|p_??d{4}u@7^M}B% z)E*`tAsz+K{z26n12_4T;K%58rohk9?MZ{1_zdwZ@f`Tmx}AA&Gj0XqMdBrJ)88_< z$zK6C{j#2IozHW1J8i`6;D3HtjlTnYt)3@N@bBsTF7S7?yNP>#H~NI&S#U~M%)hmH9c<~#GS-l#NEU_#J%8V+tv|QU zXEV+=;&$Q=;!ff&;%?#|;$GrD;(p=*a5E2s;AVV6#KXiR#G}Mx#FNBR#M8tx#IwY6 z#Ph@p#EZmB#LM93xKzN+aj6oo5x1Ueo&P4k4g6Yt{jr0acn7#?kCV6y+~o0sKXa@8 z_aednpxqCCzxDulReKQJsXYXKx%M#lwb~=#H)xN7pP@YlKCC?ne!KP*_$Rcd!N09N z1O5~3S@1ix=fKa^o(DfbdjZ^xXOVab{BJr>8T`0o)p}F~{6_6n;x*#dUs~t0$zvmK zC++~hShvRsZt}Z`yTSW)9uK(5;{`ui$NRudydT`D;{)I(K1e)7JPh8W^GCo<{wVlW zIzA14|1Z>gK?Z#Ezm;dfZ}_qD9Qa2+Q=SKZ_P>-Dz@OCh7QwI0sQ5DYwC(EpQvtvB zZsk?*`?c4=XWygZt>;_k=RrE&25#c*#2w%d>2^B7O&%9fA z%Bk@QfnU8%c^Lc-?Gf;Yv`4|0Xpe!L_$2WZxJ&0rgPS}V;#uN3;(6i);zjV+^mvxR zAO5u(&kFG>@fvuqna?k@&gWP3_}GZsi93ipiMzl}d)&l5;HI5k;y&Vj;sN48aMR8Z z@i6fSxM_bB+~kjeoA@;NU2m)FUIzT?ca&#|=ZNQt7l;>$m%zJqd&=OZofYC$;x*z{ z8RoMd9~-!-*AD(;9q#})@lN6{;%?#|;$H9*^|%GWFU_mt8zLSCcj@>Dcu{+lcntjO zIzCA}MLZ2|>dg?(63-FOgWsv!Ss-2{UIzcsUHW=Uyb6Avj<10)(${V4#n$n)~2LG?`sQHi~o(1pF z@j39%eOKklgWvjXi>>i72NfK>TeC) ztyfy-|K885 zd13=M{k0Q!5O)%H5qA^!fX}^IwbKi3+UX!~GCE{h`74VNoRllm>C+O>*^=j)p|7lv!bK-XJWnWYA4)D$2 zSMCHq;SS|4a1-wa|H`*jya)W+?JFD@nP`i zbvq;Azxk$$kAk0hoAMa(B)Bn7Jq|VS-|BW+mDc&cJfZT~h}*#{UsUl9aC2Oo z;MeQ?F7TJNyTQk_d%&O6?gjs`b|1LO?+1TV#|OZ_syzs9;zQtjb$l57Iqebfy!I%# z8MhemB=Hou>2Dg`+>QH{>QjFz6Ih%@XzV^61b_i4Bn&XPX&BfdlmdP?KSWL z?bc}Pe7;b-4cz3ngMU-UJHXG;?gTgSF7P{ayc>M2b`SXF+P&ar+-5 zKLmb{Zch~a1bx4Y5l@28((@_>zCqt-)8Los`I8}@C7vUmCte_41pl2LhZ6BJ@e1)O z@fvaK@2&IMjGK+Powx(sjI$Hm$G~?FsP-qpO*>P>)5J5xv&3`6^WeTu>FYDNX=jmm3B05JU$3{UGPuc80sqN0 zs@^KNiLZedb$)BCbv~PT8*w{v2l&F(sy$9{livmYq8>Ld_yyOgJU-%n@SW>bd;t8? z&ngdsAFkUOA|56lAs!_jBc3FlBAzCmA)Y0kBc2C0<5nPEBwhkH<6H(e`77Wi-ug%D z{5gM#18(B8;3hr?ZsPOcCcZ$tNW27Y@|VF){tCE>w_a(4gu6X)u6 zY~l{$PVoIsQh8k9BlDHJ!4J~y@eubC_YwDln|=j|2Z@Kk$4*i04-=1on|h<*roS<8 z6Q3lWBAx~}`7^|`#B;>+;7{v$QUEvg7QxMNFM*r*GPoIs3h^rO8n~H<*6XeF-{iLu zw}YE@I>1dHC-`2sp8wz`j~m>Kj|beud%;b-58TB2!A&~@#Dn0b{ULCZKMZd2N5D;d z6x^IgG2%(^a~G)bOo88}&&M>l$)5o?^C3$-2X6A@i5G|$iI>3d)$K2XUtZIH&yaYP zc#XLAM(g}H`EA7Q#2v();5+nxr`rYo2kma~Nmr`>-ysiiFL59EA9a2|xXB+N9wZ(j z9wr_k9wi_%iscxAc4_UL{^5 zZdF_7v&nBGZYS;_?gW4JpQ`;X@E5ha!Ebn1#e0Z*iTl7!em}U$A0Qqi9wHtl9w8nj z9s@V+PlB8Fr--MCXTVMVEV#*^12^$`a1&nuH}OSq6JG+K{I)voW$@FNsQ1ST_=!Q~ zRpK?`)|;*K-{i3ow-a{|cM^AjALCQ)cY~j=`|ANW@m}ISaMLe8@c{84@euJa@d)uK z@fh(W@f7hi@eJ`S@f`6y@dEK8@e=VexH;|>@bfR$^B;VZo>w(+Gasxyt@Hogl`4-7 z{6`lkw}an%p>hX!-%{mH@H0QD+(q0CJ`hmx9`G6GD))k${628sc`Duy{-sNl2f*j~ zl?TCl^>~JehlxjsM~TOXCyA$sr-^5XXTg{2iN}a1iKmFCiD!ssiRZx0{LF)!`B?xr@kQ`cF4FTK+#IhmxXE7uH}O^CHR9G= zWd0Mk6L%1I5_b`I6Za7J6891J6Aus%5)Tm%6ORy&5|0s25>F9N6VDLO63>B~`J4xD zU!kx6;3mFEybRuV;KcfW7pww)dWZ5V@fvaK?bdm2^4N&m!SB)Sae$jVPVl0RcY#lu zuG;SgU$5N*{vX=C;5qF+@V(mo;0Mf5^#;H%)E)%?y!H^d>2DbPmpVQIZsMchQ)a66 z#K2G0o&;a3Jq3QV_B8lW2dVrS@DEoG<6Yoc?QZaww0pqc z*X{+sA_|w`8;HKUp_OFrS=r~m$awB@6(*;t=s`_+T#R&QpdZ%<43AIZt!1g_kcgD-3$Jbb|3h0N2&aN@J-qS;E!n! zg4>Q(c|zdxwTHoj+9Tk%X^(>Ew8y|-)1CxB!ll}i0>4;$8vHix8Sow2v*7P&&w(Fz zjH)*e9@Jg{ze9Tw{88;C@QKH&{AF;z_6qnr+Np3Q^!}p?F&?%D!5B~4Sb_^Yj5lPAJuLH|J=zcza9K1+8y9e zYIlO0e!0NMb-Wuqeu}Es1OAzX%Dvz}*6stp!2j72@@&I`IY087(?`jW$zjL~Z z4}%Y$p*#YAHv(8oZI>G;2y9@k)^HjVW{Il9U z;B(Gb@m}y#wEMts((VWUy7mD0U$h6o&3p)fzp3NH;D`HFJ0sxBv`4|eq&)`yi1sA7 zwM^wtfzQ{T2LF`y4EWErXTjgpo&!Jm0#$Dwe6#if_zvww@XiZWo)Y+Z+RNZy*IofX ze!0q11rKPif#0g#`mlBW->KaO{*rb(xP67H*8zT>b|?53wY$LI*6s#3^UXut3m&{k zwZ{jZ)b0oWh4ujWd)kBGCtj@bhrlxd|3`Zb+{9ZS zwa#1PHsW@0livYu@;HgR!0*!Sbc35b9^zi&K5&yi2!8qF>hA%Dz%SGu2ES^zijRO_ zuRRJrNqY?3jBc2Ce_=M_j0o>#-5-)+jt@D(@=jrxWz+Kv_ z;HKUhacjJFK7UQ;v4NXBcH$0j$CGLtoZu#pi@2M(hq#xxkGP+BfOwF2ho?M3jS_7Zqadl}sHw?e!Me!m{K z8o0@0SySuxEA?;TSe9`c_*puS9lT$=6MTDKje`sPciP>=J;c4leZ>951H^;iU()Ri zft&V+iARV>iN}a1iKmFCiD!ssiRXyti5G|$iI<3%iC2hMiPwl*ZLRa%97h{*J8=j2 zC3>DX!GB@qKe(ya4gNzN?*TXQUgAFRA)Ut$Zt?_(2f>GRo)Ean6DA%Z9tHoV&L0Ce z`IE#`;MeFpY48^xQP-ag@htHi@jUSY`0MwpdW+zuJtg90;uYdm;x*#dgx2|Q+G8Vb zC+;BbB<>>aChj5bCGG=%?_M?je(=Hjln21gI0V6`>f;y!4{HyDn>-QXQQ|S;N#ZHu zY2q2;S@03vuN=7PSDttQe5aZJ;1l$DS^~f50d-u;;3L{A;I^GA-fC~1&sXU4-3D&j zZzt{`?j-Ia?k4Ub?j`Oc?k64qAKInHCkSrFAw)b(JOX}DLFJEvoBT2GM|69V;3hsr zJWV`9JWD(W{!@K@$b*~q6u>v={uaSae2I9Oc!hWsJfZ8Yftz}*j@J2a+(z6E{I4{+PYm3| zCyA$sr-^5XXNl*)&wg0-D-V8%K2Hna88iREO}|RS%fu_-BfnGase+%W+fxI-P9GO* zV(a|>h8}+#_#3+YPVlt;|0QsN|5Uph{0{T~V*tKGyBGWz?LP4N+Wp|CYY%|?v)_Y)5g4-yZ7oA!i>N5D-xqr_vxlf+ZR z)8M9^8RA*uIdIedJh;hU05|bPa1&nwKVBc-GWb;?{rgSuJ3pno3U1F03b zMdBsmW#Sd$Rq(fTduqh3{aWY0iMJ8A6L%1Ig3r7_jgO1Co4AL#m$(ny^eYH{nI4}I z@i6fS@hI^a@g(sS@ig%a@htHi@jUSY@gngO@iOrW@hbRcz}42c!+qIc!YSAc#L?Gc#3$Mcn17f zeO$7{bHww+3&e}WOT^2>E5xhBYs9Uot@GcEgN?YIxC4B?9#1E67jZXn4{-;zK)<)b; z+(Fz)+(q0?+ym~@=a(1U++Td)=DhZUoBjrf2Z@KkO}%08pP#Spvk`C;9|bS!`)L~d z&m)u6-x~-2(wCKIiRXyti5G|$iI>37*X=2Tn|4-+SHZ&x)vp@3$z$!`I&Y2Jh}(%f zh&ze9h`Wh;CJXeR#)phA6ugG+lbqVJBT}pyNJ8Nk3L(q$3xsp z+(+C`JU~1MZpJM{JPiJ8J;b_a~7-kB=|I4Zwh>k&YuRqM8{{q|Drt$ z{wrN?4*Wr{YEK@#U-!2F{tunM2)Ym?Gie3dEy1) zMdBsmW#Sd$RpK?`)`6|_-yB~XaXWDbaVK#XaW`=faW8QnaX;|@@gVUK@i6fS@hJG+ z`uvK4ck1WNB)GX=rNGT`OcT!#&w?-4*ZCZHo4Njj|61Qq3*b9+`-|W|*3V-l;$`rk z=;yr(xXDume@fqvYT$p-ZcT5U|0a(U{Efxx{lW#_d6sfF_#EvX@bCAkcrS4uaX;|@ z_?WIY2yW^P5f2lO5RVd%5l@1jqT87QH|2L7scJNO6M9pLA?R30aB7jZXn4{s1Qe zrV#UK0%Ft7W~4=%5&f*f1Y>&{E-**{0BFAO5o)eReTxz&Nce)@e;2RuYoVn zd8~t5=l?a@ZN%-w9mJi)UEpWwdfnik)9wNPzIHEhA8|kN0P!IB(YoFc@i6!Y1L}B1 zz|A;E!4J{-W8nK~Pl7+BJq2#+O@r^hLH&DV8St&^m1n`%Y*d~DzenfEgWssV4F2g? z^t=WCoAxU48ga|fI&V!L8*w}MCAwY*_yX-t@N>1hz)ihw;vV8&@VL(J12_5o;5|A% z0B+)g#6!fx#3RI`#AC#h#8br6#52UR#B<;Sdff8h$7nBr->AI^euwrlxc?co?p+~X zC0+yHtn*lhw9fPMODew&e5;PPgPV8x6@BNKs-o1L_AD9 zLOe=5Mm$M8MLbPBLp)17M?6owK)gu2M7&JALcB`6M%+5Ibw1y$=Z_8i&_AkqWd}F& z%0b*o+y!pxb%UGy9^zi&KH`4j0pda8A@Esx+@jzkx2gMVjChiGig=oMhIp2Ej(DDU zfp{5wh3;6KdS7!&>L(KegMyO@2FZ2l&~#Jx=iBw7bAfem8LsaW8Qn zaX;|@@gR7YZhr{ev_DKdLOcq-Q0I?t=X;f*5t7f zw-a{|cM^9IcN6yz_Y(IJ_Y)5g4-yX%4-=1on|TriFD_EYF$O+#n(`$0-?XQ|&2dbF zoBSE#S@2Kj{5f!wCr`XUyhyx6yiB|TZu(mVH|?x}KdZ;tI=prM8@Ca+6L%1I5_b`I z6Za7J68C|daqxqiaSMQ(_#n864}qKbF!3n(S3ardIruj1N$|t^ReTCOp*;=$*>hEV z2K=Ymv*2%Q&w;NvPvyyj|5|$i{C(|3@T<;Oc}n2_t-TCB&9CAs;3sRZg0I(J1OJhB zYfkGt|BH4T_{?RhUORZ7b_e+F+MVDf?Jn>uFHrg2;MZvPfd5&$7yJY5K5);4D!(6m zjrIU|LVFPWcI_eX`?QC_AJiTJFKCZ~k84kZCsXRVHv|5L_AL0CZ>snl_-5^S@FTvZ zpR2*YrQ?g>k7_T2-~WL6eM$xV)m_S~#B0PYXY2eld2Gb(#2v()#9hSQ;GTz6zdYck zonGQT;(p=*;z8me;$h+u;!)x;;z{Bu;%VX;;#uN3;(6i);zi;m;$`9$;#KfV^!ZW) zU!&)h^)WL4iQ9=gz)ihQ@H_N*>H>c`ujaWM+{|+iaWD9FJ5(MYxXI%u9svKM9=9O) z*Z-i_Geh9*k17unj}VU%j}cE2PZ3WO&k)ZN&k@fPFAy&hFA*;juMn>iuMxM7Xr2G& zINFHYi93ip!B2Ta%@Y^6sn<>1L)=T;2X5;1gPVE-#Dl~`#KXiR#G}Mx;KO>{lHjKO zDdK738RA*uIpTTZ1>!~GCE{h`72;L!>3ZC(kGIbAtG}zRlQ!_l-%xHR?jY_Y?jr6c z?ji0a?j!C8zv0`eUjcB_-yrc2@i6fS@hI^a@g(sS@ig%a@htHi@jUSY@gngO@iOrW z@hb5eajUy^{+r`&BW?#jR-YFR@b|u^=9Lrtrzzzwa8s|FxCh+S>jm%B=dTakiSs$H}O^CHE=VZt)s~N2RHF{;tt|Y;x6KD;vV8&;y&Vj;sN48 z;vwQ;;t}Fe;xXb$;wj>3;u+#u;yL1Z;sxSG;wA9I^nJVx{<;0tdt!xnm3R$&!2v3d zb#&|epQ-cPh}(%fh&ze9h`Ygkx;-A^UgAFDe&PY*L2xr}A>v{1E4$PiuMxLgt@GK8gN?YIxP!QpxQn=( zxCi_LeZ0Kjue_&@qYr%H`^x>`Km1U60Nm0Z1W&)C;zQuKPEqqV3_hpU^=7j&K^_{e0HCk39Lq&y8ie?R3J@bh)OS@4;3VC#tz%l}zlpaIw-a{|cM^9IcN6yz_Y(IJ_Y)5g z4}u>uRgHg$c$j#Ec$9dIc#?REc$#>Ic$RpMc%FEHc#(LCc$s*Gc$IjKxOHsn{5Qwf zM%+%^LEK5)Mchr?L)=T;N8C?5Ks-o1L_AD9LOco{*XLIZ{G@5>yi0s1Qe9LF^A z4Dl>@P+#YB;P-r_?t^)7pY{Uy>$?3#@Q8jMD-kb)A9JT}`fzlyY~ItH0r++|%S8 zit0bTO|Dij)R(>{SN|rma(|P{Hkm(xCO7}Bdihc zJlf>@H+ihdyP7=N^Fx)0;foS>;XOlac{9{e- zZ1N+T+|}eCZ*q5&cQ?7G$&YMuZ<8O@jz zenOK+n*0+@9&K`WlgFBTUXv%A{KO_tHTg+Ro^JB_O`d7;1x=o9@{^l9*W{-(dA`X# zO;@>83<)Z~kryxiocHF>4UPjB*Slb_M#wI)Ba$t`^!k=H_RliQlSr^)S2 zzPQO9O@3CBJDa?>$z4s}*W~UdU()2BCO^B$y-n_Ga$l1#ZE}B;pVQ=lCjVrU2b;XV z$wN(kZj*g2l{yhT!9)W+4!2h2|;GbQG@AVD;!{$p&-0{MG zmTyabaKd=eH~gS&XMI@47ySLX{j5FXM~;b)t~r*B56N%#jJ`NNKAx(I*;Z zxj?pObVs8s7smFC{<2Y)3u1dl|D#cs3t@XkzuYLx1+YD%w=~M~WpB^uryFIt;I(IT zRii8yy7r7NYn0^z*PhXyMp-Uw?HQfdD9a_3J)<9Ml;r}~p3wsuWx24mXSA(RmJ3>Y zM&JC%^j9uqiT*drasf;9zfqP8SEB!ovRtqd{cn`zLY3%$qbwJwME@IQxiBUA-zduk zDbfE%SuRA0{x`~U0ZR10QI-o&qW_JuTyPToZLYd%LO9Q|3+CZ42k|X%177B zpKg@p0+Hx{qbwJOME@IQxgaF^-zdukYSI5jSuPBT{x`~UK}ht!QI-oqqW_JuTmTaN z|G@NLF8qk&-zdukAJP9tSuXU5{x`~Ufk*VeQI-okqW_JuT+k8yZwSF0_dLH_CE>MfAT>mJ2JQ|BbR-P!aual;uK-=zpUu7f?k1 z8)dn0BKqGb%LNnB|3+CZl!*Q}%5s53^uJM-3nQZcjj~)25&dtJu<@*U5#mPeqx1$E?LitE2&xZ0$C{Kg(L@0mwbnAG%4dvIM{4$jP z0_8tK`B5nU4$AjJ`PWeXIh20{C*L~wVE4#(*t|$KBmi*AmmE>EU*61l>pUUCi=(H+Ni67hK zL(RP1^TzKJpU%E{zwa3?j8}dxs`ZUb`=9$KTiZuv6(b9t|K()yaeBX~_P@r(ljG15 z-*9bw=pbPkVU<(GW7Yk#IhC~78b19J(KWF{#dAVI%ik!$7`YkBFh{7@jboq*DHOoPFWJ;SNXzk#pdvXj^23rvMYKn@42Gq z%AS=wyXM>~_o(0R=DoHw{=}8O_+Nd)FID}^`$r~TB*t6x{DptYkJIOiaT%X^?34Rh zZzVE$1xxI;#J>{ z*U$9rsI~jr9`Zf$(clb`;4iyX0^4|bP5nM>_Lp-gdiuFyUu)>N6=Jxzi%8M6mj|c% z5~n{c3YCSm@$t&lqKOYpJW|B9T_N^u)GzlRy+M4L*y>t6!QQ^LTl^e3uNvRoo4DQn z!UTJ7V(Sd?G1vLGHha9ct7BxzTfOoAE?ciCOifJfj88o{(cjq-??1RB(c5W@_a1E9 z8Gk2U99i~#U)#I!uHn5iuW#Ea2J5OX?`Ms7KOrm3$rq%Z^)2~oq_*Tsj@l9(&|C6F zN11$OQd{!nNbb5bzS|csCYB%EG5+xI-sxRi?-5^!diMUfQBPuPS~R`B+vx3jx5U=4 zvBcJO`!+NCHt*WE8QQmb^}fyEzRlde&A`6R%lB>maNp)V`!6Z8A3Go?PyG4-%0|q~@04fCWj&Yg8~owFw-4`~cEcHB zYGdy7aOuc8ZR~i=xFRe0D#pKHilRhHDFM=pOIh zA+zo4b$whNVq9g^SV?{<_U*a2FTShiqW+NuuWb?+<`umo8wx$kd*Y9*kPYuywqCD6X`tt+1SDz(f+vRK?exO6_G4ym_d|V9AA~`&&>4Bz8wYb{M zI3=-lR(XPbIDgb|b;6qXj81WkdM*-o)#ZKSsKg)bjqh06_Q8cqkLt=sC_a+KH{zR?m}v&2?>cYP}OMmA6H=uLEr33$+8m-snzaPqvo z_&m7lYx$mdN4MM~+cwmh=$$@wM`eyUb>e;2@Iq<(DLZ_)+}10+H{Pbw-z)l}>-?42 zOq@A9K7Htt#PaDj*`n_Yia#^Fc~Qsoq3J5o0g2v4BDqX7Hc^bx*b%atdNx(H{8m?; zSiVT48M;?Yy;~0xhi&YF;c>^%xwqyAmx|_eixZ+}_;t6ugVvicbdqe-(A=K*@8k`% zejMLiEDou-!M-4__T5t}KNkmPv6#)`ejtkCq2rU&H&aR!y)U2J@F}(MR!Or2m-GfWV&WQi1ew>Ck&vaOWYsKkU?ukDq zk~%~ujuaO^ajv{kxl0U$xv~xK>{vX!`N&z;(9>fJ=jDg@4h)?*W=mW?+Yv8~eK*lN zTV55NiRBZ;6=rzvL8^7KW^p?kv`ITyTp~s5)pkT_iWfRkuU6e(%)5`KpeIL(Z{dM1uFO7&=6XfB1E8 z?iQK0d&F+{x#hl##J*#P_uSJVcI~WUH{#Q`r^Qy~)>5aH zm@fB^@0RoFV~6D5Ee_`=jfLtBuJ5;7?)S6Ces{_J`v3KQwlTNdPfmtu4yTyW!}+OW zvn6el&)?e%V&D7nDpkcMa?De6{$lZzSxt+Z%SF8-*T>|AtUf~VCzr)biQb7eajKp- zvUzStU*c#n{4)lR?-}Xset)<&<@zJ)$?p)uyxrv!$sOW{oc=$3rqdEhzb%rA`7LJ4 zvBR}RU0bgdf#PnImwS!gBCdIIqbJchT$wUlo7nY*F-?i(v&D(@j?A=DoJiyO(Us;K zan_8k5hV9)3iAjO#aZGZd-UdgiN(;*o|TxQ^84ZsC;F$^ZkUtkohF`oI&L~hCK;~n z*Y%}MVwd6CjILYPiVgYomi$d~)VJ+jUs_)O_Mom?KWV}i%Z(?T*R+;$>U0XW@grU1yg^=joJ912acn^US_Ohb5M){caI; z9#j0xl%9J;Ppr|J__=tYXx!qiCE}+X#g_%uTUEbK4R4;Dd7aKN(r+A1T<#)tQ|-E8YkI7gR=*o0?zyzTlo6a8Ygh-o%Ub>==X2-f0w z{{qjFc<+MK#4UYt@4|<=w$2cH^o&2)_D=7@zut6D&%zHjy)^b~xu3XT&YpG7$mRte zQO7wW%NLy18}E$o*S95q^Cg29C+?87C*1PEzpd*_agluZqqeRuM8!tpOjTu046-=B z`JNrMIXw$&Hy^OD(Dj8MiU3jQ+VX9=Au7(xiu-#PzH-A;V|^`YZ#r3|ynbFIo$SHB zbektHEZlI3NHw%vr+MZ2i6Ym{&-KLL8uOatF?zmuDV2q7$BN6~_RHn@xLi-h!=CD_ zkF5L}|GBjFWpw=EW#Ycmwe<(04dTr*@NIc@ufHtRE83b8qcQpu@ukU=*!mqwU(+<^ zkY9`)SpPY-X}j*?ElC8A)gQkTTjj`(T`6M{TQhR|0=1o$+e_5;&*b*0YWps^eS+G~ z$!&H0kxkwH!35FYx5SUi2~Wx^n~akGT)J~)@wj}BuN{2DhGpV8d`Z1W^=I#jeBKD4*C9_eaG0SZ`wa6x))n-%f4siP!q$ z#q&m%Pw!Z=sK32q@aCSxgr4E|CJaszPgT>#T#37H6+4LMz_A;KH%}4w{e#5EENie! z(9nL16Pw#@qxD%?>lj=#vZS<4{#R}9^S>ZY8Sxa~E$*`IuK11OHT{M9y*41es7%={ z@3kG>3F+c}qunMRNbZh`dd7N&H@A1p96D9BSw7wlpVmHMXs&Ohe~}~pbfV2SGI-K_ z@yxNm*k^uxQlc%synX)Ip}w~F6YcRy@dM)1$ENw(UJ&ofUGaVqaj<-9*%|+RUwnr+ z)w&$LQ+m5*^~VcK5|?*%4A~O5KPBs&l(@YlK6~QDCGrWSXZZbrp+m*Rvdghp#*4VE zI&Nz{Zg}s)A=@Ig@6?{*y(@;MEUIT1Ix1e+DV{Vg-1cR0w%>R84dQkrUq!_Y_iC|S znf`>hD7Rm>GrmK<*bWTVXKAAThPXH`R}_jn#mm~rMdAf^`N7WN_aJ@d@$YiwB?utK=#2aQ(19G-3Fi30=SKIAup=YW-DqSW5dB zJ5CupP6f1&sgq)sERH`UzU=yq4DV3k?@U;e=r~1wR}U|D?G#U>V%8Qf+0VLAzC);2 zNO?cKVRQ2Ff3P^v?)2Pk>|HGK)IPw|!Ymwe7yM#hK?7KPq=UZq7XQz`j$x7WKrRT5+L# z)3{L#qIk59KiN0$wZ3^TiFev<7po@({TSw}U!&FQs;s7G_>s=hlLYF*q*3|KBn#XA zE;hE;_7hcC#gEa)#Hpu)CXBZ2+oNOjt$p829DQ|Pp?&mE`wI5aM|D9hA&82nj&9%g z{r;mr-&g2rJlct{X`^4=_sxN$U)WdJZ)|hDrH9EuvP}^!wZxCHqa}*lj;lBR*Wri7 zvw!4*uI=T+HyyIATLwC0pk4fsPd}?46VJ6Li&`eDN4s25q#v6hGvu6dv%X%F^NP*h z_-N1Y@7kX%_e_3pOk7o-l0o&VE*CEtf9~3Hhq$g?Ca(4RHLCH_T7T9Xxw3R$$1%U| z60cEn#Jg1goa6gPHqYtk9~qou6SL0M6F;zjWZj&p{UaT7dg7B4Tm8e9J^t+W8Q*HN z_w2Idu06Xt>!tXlo?Y^nmX_5YU*7HL7q4{o{&;Vw+fC`&p`#V+;}Gu0(_yH89RYu}6h=m*=y74qWVc)?8J zNB$q<w0?x|ud#Dzg0 zlkN8U*qOG#oXNd((xT-jxi=rO{j|7PX09)79Vm87 z49fr+F79np)dg&%BUXRuzEC_sh{jir78kH8g4LkjW2^ojMY3Gkcs7e{aWV$57YU$8UMDDsuKt-Vxh>>`-w>f2X6p zYv_PmUX>c(EAos@n7lW3kXYmrSA^b?i%LBgiI=^D#ntKQo)zcD|0q|r9$e8U)^x?1 zNN@ZPOWXb-?)Gw~_rwoQOqa7&tk3s%cgLr8S32v*Y<{<#l;Sa6Xn*|8rERZ^r|X&G ziFQ(=UEX;dve+@=Z<7VPEQn>|9{J0s)4FA8s(42b_X)9FTz?3z%;>qLCVyKrc)^k4 zX-hn~oFXSo_$%_n+2Iqjqdt#Ci)Aa^670Jy`L!=0=ef8vc8N(^IYKNF)Y~K{lxv#| z7~9;FlbQ9ZjZeI<$kfZ_zVbIV9o^&Y@;OOXDH|mkDKd!0H7eEh_1yBJY+AhuyR7>D zs%{x6#>ZCqp?Ke}S6pwxHW?yc59Ml+-0OHb>0Po1l?TLgybKal|5mnE4rP7(#Hhum zSH3Sp;-g~U?YD|V&`{C9dPC(Xs)p_xn0ht4EV-8+okj~M)LSS*>+PzyRaCG|hE`6{ zZ4$#NYn2slzfF8G-tH3@A%`9#IYjZ3q}X@0%ddTjS>16FqQ*d+Q=X{rAhL46T> z(A@O-w{z!;{1{UJN`PU?Sc4L z#R9wr=+h>T2?pSA^dK;9N^xk-0ucONQ(-UH) zYh*)7-j{m(34K>8sGE{YJ{gOfc&E6NU)?DlfX)>cFtJuC8(aCZxKQ+ob@9H$RB=W; zEGDA()j{NFQGetJHAQ>HyWG?pXC?;QJKCO(zv+t?5>u!2F6y1)-t382dgH&Z-*`m+ zcA39joZKS!Tf_2z^;s49*YOfxl_M-`k!M$X@AM9NUlPl}i$^-5^}EvlC(kEUGvU?7 z|7OBJAl|$GuT1#0A~BipAGAz(S!zu9lf+(R!q54oOt|%D>nyvtiTg%+#T%ksTsy?? z{D!8C?^yUmeKlh|A6Ktu^G~_uA@9rbiRH~6al>95J*~?cdhwQzHVPX$Titb|r=4=_ z(8VL+3B!4Dr*Fg^J2*359e=1O{bBTj z`C|76zTYW+pV@Wmk3@80ME=feY5X~{wrp899h=xZ&Aw$^%=W=)Gv@8y@=jz`V)?X= zk&f$klqZbL*nUh^tTb99Gd@4IRQ$b=d{5$Bv4S~M+|=KwKa-0aMaM3&Fg$C4cmfj- z`{I{!@#V8^+w0}t*;B=L>YYOW?rn69d~ugm82gwdnmHeNR3z&lQV8 ziQmrmS@vBb>-;C=MSMqmerJ67MB8>*6fFNjgjKP`!iIP&6%%2mSiT>e+0i3v5UT?- z#bfdQ@%DvR#c6XAF~)wZ_w#kO{)opEM-{`Hw!gu91u4>bmQr4*;n2U4d&hqG!~1w@LyHx@`C<8!LqDji5=+)h?j8U51; z0kKbt(x8BZ?^{c`D??u-JaWoDI6u z5{SSsn^LE;_dw#Ve$*Rx^_BIf&(FL!oH{T3lw`U%Qf=agQ~m8skE<~!L5QWBLrt{g z=`N={yQhaGJMqI4@@SpQlMLF#4?hT@R46VWW!^0}KuTkLRp*o|YxZ8s2n?{u#W6Pp z&9URl*dW34bk0=}w2JBOJ`-xO|6EXcGRGYH_TBA zETn+VAyg|WdnPgin~I}yCrfy#ZDKB+HYOqUb%;Xyx4wvbeoHs0!^aX=gu@_VIr6Y`@`bmw*vB* zu`xoUvkRh*nKnMv{Q^@dP(&tE%+P8wuNzqJ9^Q3=_dCq;;&bw=cFI7qK+<8Os{*+6H=$zAi;%Yn>V8_KR>{ zGuA1%E*@LwRGK=h<@xWx2tKRWX?%CkVG)8mO{WyA4qsUr4y+M<8RVE(W=d`rL zGGx{w@v;$?%9J$Q%Em)XJ3DOFt&8}+*M1fb8Dd=uc~gZrtim6e&!SO5!$3iQuI>G3 z5oepE_4-Opxh|N6Q4rJ@CR*k(iF6?lNY`g;dq*ajK>~!LUh|*F3_!nn=&fAt|m^uP#CSs}_b<|F`wPAjD`Rwj?_mbI+O*0QDO5fFuPK0R~OqzZ+ zg_#I-!PY7j0mfE;LPchG|0I&CtfS?sZU5bx6e^$@QGfJ|7{fK;nO0Ztfur~)%+hC@ z0mpowIOfdoQ$DlwmSZjHbGtUU<9*UUi952pFSi_VMqc-OpZZ)O*C_!{TuII%PIy{= zytZ?(J?!i9u4HH+?4)MYFF_mE&|&{!36f9K=#<3-XU1&Ho@ytg=#oImp$Lj94b1c` zUsLsLr_ByrV@LzYM)&a~HTpbJBg2WKG}xf6DI1ptqpo5*F}}<X;7ejkcuLZ;kRVod6cY`^ zO4jg^wHpbh-o0p({iKnWB$-GF`8JG2l9Oeh;QjkQi7qEVi@L_A*go8Ret6Jb`W|*( z2hk}$x9-9@>GyHyvQMW^k<6jLWrNV4IdrYrUm(U{+VI(Q$#za3CNw@}4>n5csho(U zXAJiz-S~x2A=${5XhDLaGEICcle5ZMWa#v~-%&SzhBd znPWC9^LQEO=*h&w=i$?t*78uAEp_eK(~VAd!B4&%7_|&qS6=F_p4VV?UFxo!*L0=* zs{%`Q?q2gPc6I~NI)-ehaB^V}4R7^Z9J5UZZG$f4h`_zG?T;MBzQOLTGL-0<3U}#uGe=4i8}8@BVyEiY!)C{q@fz~+%%RRi z&j9J16IqfO-yV^_@Dmmi~c7x`s{Uw_Xwp;5_@y6@MGR&C!Tw@@Mes_)EVZRvFzGf zcr#XC4;J3Ud2|0-cw?I!%6+}?cB@j{KDLR6jH$(@ zTgaI?a$)MD_RyK%<=MB4u!o>QNBGdX=J%(f!&~#OZ`a8ppN9b2LTD#G5!V&Dt`%WCnUnU^NAY7(hz5fV#eL$xs?I8na*1l0li?`+~iy$Rz zO%%4MPGfRbU(4Lg?oi`UqKAcOn5uK0CjOBE_#=QXFMv<0ux(gx2ZA&fjGw(D?wC+jqbCnpXjdbaSa;f8HPIBkq{?C2IV5$A&#f%Lx!liKcVs8!XE)$yxI z+%a*$`@ubkh~)^7;z}+3iSPEcCBC~Ig%!`Y|A?+@>p76<{SO{mt_&sa?#tc7qp_#@ zsWu)oH*ssfl&hdtVXZ&H*L8`W4?tV%;BR{m+<3zJ_xz-4k`6w*iQikkVI4fuvM+H@ zAC|{sdVDQ_Opm8$syE6T`{o)F&Amf3o46}|CZi=evv0UBZ!CgE6m(U7t?9Di?GOvp zeRY7ZGn4r}V(q1F>YRGS$am~#Gk=aqaztEg#7BfPE3Z%fK5}-@A&mW++@Z`?t8oVh zXPG@0CLXF>|9l^k(!`;S5sZe2u}NEVMBloeJdNoX02gv zbkMG1XQ=vhKoERVa#tiex`Aj7B%Q);8dshUw`v~KWnPpc?8c7pz+!fyF`MJQusva$ zv*AuwHLb*3g*56*%u1lcd`yNCJ^xOc`tvMMewpf{OvCc1bAjDi zIotUl;%WCMu;^=zWZwH^D!ysC6|TsYCyf&JW?OkWLpd*?^e zp4r`%>`kAOs;-$bK&#*Yx~USCQ9P>@ukR7)@uRz_SJXM1!D$;TSbirnv*)jjL=(N& zkgO(eqd{MPm{Y)LOl`UqrV;oN=+HIkuDZ``W6kEc4-u~fA-mLBUJ~v7U8(}Z+|CkY zpxjMOxdoJTek@QLL+p?W1hxJq_wO(Yn=*cWtL5j3JLH{a?_T%lAEg|$?B}pn(0O4^ zqDS*nX6V$jaFyY7!i(z@c8##onEL!K9%}lv0$>bl((P0U2QyFFoh4P;c6XN; zBLqIzf;!fv-6fRaP;-C^ls`#wnRmrce4~#tr}xh9GA@3n`Yk);zp9iPlIVRG5~w7N zE077DQ` ze>G`GV@~OS^zI=$yp617cG!P4MqQike=WoitGQv48~t&O#$Gf=B@X)??Dgx(4;QG$ zPQN-@lRA%D?%4F~gbH7|-&tLgs&i7+@&o9e7Y#E5lhsUuRAPQ-tj1?h;XXMTVNQ8% zNMEL8`r3@?UOZMYU=oGcz=nJItS42SoF}J)gxv?LX6MIC`p@=|xP_MGnp6UIk~vb9 zo`YKyrn>KE-7jNKoOBRJJU|T5LNxri;_WjTYtkj?Lt=Cv&QAL>!_jms^IjCYgc&Ud zQxQd2X-k<^KN;pdR=gOErLY%|7{+t$Mj+d^!d@IR{H1*Vj~c-yAc{u>s~sp~d% z6<#K!R&DAmyhKwU*_0~0RHQluDb%*<9+I-%{N(3ty50ZWhW)_Vo0bK6QH$4Zx+{38 z4W%l56#RlKNlzrVZrijc$N&Oen|2poCZsOjG*ozrrq16qSa>O;hQ7i}1vNZacxm%% z2(8<6A4%C)_`z&+oBf75eIeRM-%R)lv;fsuJzxikePpNoBsO_)YsMIDLupJGW_1G9L8zg6ke7y6xvWn~w= z$v9qE=+2Hr@|pYu`wd{!v@B25q!W0ofLNmE^KdJA^`qNl&B_Qk#kpG+yjav!Xcp{x zZJz(^(B-ZGSazm4apW$(l28skk$ zxcGzGjm{l1QFba4KZK*;4TGsbtR}qSu5Y3w)9?&XnLZAc$p#gJT5LQ9R5%8UcA9$@ zs2mpqV={g`4BT7qgy~=y{8Xp={a6a_edQGv8YGxY=H-gakK`C)PR~jpXJBN%;@hJJ!D{nV+UPP388>-ryHF-7~Hn zvQH=Y$#67c)_v!WwwC~Z(L3zqP^2cxGUtcZo+d>A3)F<+LClQxxVEx?Pc*`w%HEnU z8wf2V%0FVl>vN z%=oL7ur9&d;AL>Cq0Heasrt;}Po|^fZU*#p4iJHMDm;smcM{@3Lh5xbWSq>`AfH=q zTbQMHEqb87)Dk?zyGVo|?m9$EJ~bFmhIh`$=->FrCxcl~8bTqkqr9HaQUGI7_|GByO6LoKOVcj*>3BG*sO z9Qt7TWV2Y-8#ot`1) zUbZBZNK#^ni`NX`up34G@^Z`rL?c9x z2R$>>$9}YDN{f01!&}ocUnuSwd%r{pR#G$3S-fjflliSmPxpnAsrpnV0eVC%S)6F^ z)6%O2|C8w{neA<64~nVmDknZKvp4a}J=^#+2TR|~p%v-bRDkvv(dH=xNw~(;^vQY! zetcbej#6sUG2YIKrfZqe(f>1l;h{`bk|d#aQT7ox$oO+QOne2CGnz1&ozZ}L zzH5p7dw<)u{+0XGe|B|;+3S=k8^(9orecw*msVV&lS*LDV8@N08WWFLgC@tbh%Hqy z@4t4Vu_Go2nb6bmd7;x3^ZqVad5oc@F#_jo-YLJ7*&M==XgY!;08w~Pr`F}u`9#goSqZbe3ieI~(wp9=tO!a?}GB9^U_!Mgzn~ zEzV_w-r!K(^69f-cV(PN+5OnTS^c?F`d>a32c{E~Zqrw(C}g=`Z0n^ataMV-ExSB( zP0&!rgOfw#hk|*qV>OgiV13QT4KYW&_069`_J%^@ec~Xq>5The8&K@X?p+LU7wsaP+<7uHM z+NRXPX~=*);6me@_z{{YJ8!>r)@BtnZOmhiacdl-U7A|L=}md=NAQfyk&{vU@c?42 z0={J>KyzOwMGZ42eAyLz*xbp_0$Ee%KcFw|9L@C(0UU?0$z`K?*D3GnLS920XI>(? zi#Dly?32_rc4h8Cc0;43?p3MV3#IbLB}zlPEYloHeLBgmmbII+!7e!@-|ZZy?6QSe zOat>~2#Awp?=oNu#q|~xH&jsZ+(Eda3~C!#FL41tg&pqqPQiCEU}l?DY39((^gp-@ z!{)`-DQtRKyX`S+Op37tdfofX&(wQ+v-g==-;>^lL-y6ag8=vx@X+_8nvwfALVW3q zQ%OaX1UOab{NhCs*{d+nUlOX=PApi7`!p4F*DXT}4(=r(_v%f2z*?}YZjFs%wQh|* zuQjJxo~Ygtbiq=+7-Twb3vHy;=*wHrRD3Ctolx#{BsY##3Mlvp)PohP)NMcYeHWL4 zN4-#RDphyCSG9ot45cRwZzZFTI}i-|-jzY2Wp+&CcPXVP<5cTqEkK3>CiZiy|5aq@ zcLgbRsnEgr5B1Dm^q)-0^=RA^%xFStu|gE6sZU2y^IQMwvxer)`iwArxjG_R1Tuh@ zeUR_tK`QMikR2l+_1WP_VC^Jj>PS2k%D3ulOtzOnuR$E2Uf1jty;60{lD4|89{*j_ zcsseEqfi?1XAVujp(`62I;plJ@h@9Hhh@OzG^bm@93|xl%u-ry%Lbvu|b8SaxZ!+Vtm1nA$$5tM(R#R#d zk8M1zVe<}m&>&mmf4R6Y27Bt(fs>!uKAI?zKuE4x<%Cw*J#}~Tjtdw3dR68Kr^>ef zu7ME$is`PTbARt33x-N*O&uK$%AnLSJmU86`@><)W_=!8%PKUd=?_56Hc1UI984x& z6f=OYz3wd$t?9pd#t#i8SBK-bf^Ns5*sLj_*aM2JDZ&Xfg8?-%_p=oS?ZS}N+fg`r z{~{cH*qfEZui!6Y_d|8tIPAg^~5FE$7QezQJ1q0u`2B97(9 zz_F)JUH(6!V9gi=^>!43|N7591qFMva{MgBiydV~1p?eS4jj*U_P=j7K58A9IsV$IrT1IsAHB|H7Eu%;tU^ z&cU47C%0I{n8d@3&3IvKx?u4a#%3**b_Q)7MOLXtA)7SF`ju@~j-aN$H~=Ocg|6VT z(8wb@sP}UpR~ie{-fSIU{rPhn6u!{8r}uF-Hu_w&gesH4&aTlPBMAH(TX6$rbWy8F z^hy_zzi=FTzTL1GpF?kYJmAn~HKHfPeMZ=HEcZ!_I0beE7W*YDWT1+=O$My}FITNU zVivs^ruq^Xb#O?>NIo(wKsaaHglaK|G6{UDEy6vI7szoydj_;HxE854eNxawt=Tls z0a=3`E9wffjN(4ZqS-HHlvyv=zipP&*~%r}lwEBIT;N4|)2AYA@^jRXk^G%w^6PC} ze!sW8_tOSncYYX^8)^pd!Ois^wwn zHd2%3Kdf*p>52IhgNT&#AJ&15pKu>4)NS)0*6{=hXZevYNVrc$&sdtRh#;-YB4goENr@qZ`Ys|83|>n`h#$m1e5I|b`SQSnRh;!D&zN5;GUtR=KL&Pr=+HC{!ccx z**6KCvE>y-&$t7i`N_&sD@gi}@W*+$F{LL^NI{XhXT(O&Xk>gF`VYu?PKM&IVSvc6 z#~Egq@mN}cove3BpZxLyJ8f)8)>imlbWDrn{I1G)w<*30Z|3Ztjj$Hn?`nNdANi5Q zgVMflX0ZL*8Ds5Y-~E*o*BPKvf)@~h5{>g ztbavZ)-EfU7ozc5mU*qS!;aRWFNk~3$^j)=w=BDYY;^S54=DR~+IOwDm2V_@pMG_C zc(cT%Mtn*L)$z!51u{ZfMS!kVhVOimj3mnn&txQ<9ScA{Qn!wx%63DLO{K|!giD!e z29(n)<(2@78*uI(_kKn0Y{fSi!z66?7W|!GN1Xh|Op&}bX!W9YEI*e;K5mR$_z376 zWSFju6!rIKGE~V{0nEDuerw8;MU=9#D&w%Z9k4PlVa2hIV|tbMk5jZy;6*4i*KRqf z@P*L5>;-;_T0$u`d?v+*CDE?UuU3>jdkr5+TA_?}Je$o%2cO!6HV0E+X<`r(MIq@J zj@>beb<+N=_jhauJKcMxZ=|$BOVrx~PHF*L)593VIi2TmCV&xfRb4N3Sv8=P>0VIB zc5kwH7dur*k1BTd9OKdOWX&h>&{0HJyGa6P8`)wfX)xiHBJz)g28o4EeFq z3w2LlX0}Xz4vFn+lZr0c&2EV;SCex>B*BbeJGQg~QLy0>3`WW_7YsWS6FnaW0>(cj z^%e<=XpF^#Ch3uR%b~YL9N*%UnDwzk!7^39{8SM`Bi_s*bmnU@olHZBdaqk+}oL#t898u|G1Y zqQNohp0&gMnOIZH;Pq_KNwgEWPcU25yawASh$zX2l^EkBmD;9kwaDkd$DP$|x!dd* z#+e*MD8m|UUQ;(%m_Qx;gO&MHBz2XN5u$Qi_Mu0i&5*`06m=x@@OG_1K52O(HH{X< z+vz3SGvv&+`RvR4)mC5Uq)FOtzns|`$vpp#plYLV*YpMe**(*n_|xGK5=*jQSt9da z<{jZfD3dc>jhidcb-zG5WtWL1i1VP%1QEO*uKj%ny(BIn9#gM8R_3hyuN@Lamr*?M!aJF7sml@knpBk;KfAKJVBjmV%Kz_YXFd{RL z7;1)6CkRoqD<4=AZhPcj{V*=`>8sUbf~|D(a|ek`Cr`HR3| zqZ>4Uxi3BWAn2QeCPVYm@a@w(Xp`t(+Opl(zt!7ixj*<~j^Fe$dO^9y^n%V@i+Z8< zzuyb@Q}VC$!f$YX>l1=Do(f^v=Ng)S0CdjXC%DUrE>v}4VN zi%Hik5I57T*u>w$(NDYcF@!V2qhJ{Ra66>=a2c+pqdoCKjiyH^=XZpj#&<-+NJq?; z2+;EdFlG`M%`WU+a+uHioMr-Cd^w9Ch%jk}zI^ZwdAWZ)c2_i{{g_Zq<0pe4j6gMW z>ZgzR-7q>4L?a}g4w@~bp}BgZ)J%tlk&b8&(G$z~uAXQQ6;FuY1rx$FUR|MVW4dBF z38P(c-?~K4v!nzakupmQrsG;#v_2Gf#9h4q)sEQyhBh8|P5-(wJ0C3c37XgQ4L4Fh zgx?EzQas>D9LduK>-{e9&zF<(SugGdb-NMIO)sbi{{A11-2?IC^#CZ1>w(2TIc^U; z5;UPy9LetiGdK)GGCi;Yct`iZ^Fa@Y0Bp7X2a?0x*B(c5SQ$tT-^w0Ka$qGFCY+yQ zmZg9B3ft`U{bgt+-$whJsaKxJ%pgrYUg5afYH5~TYmyKxB6!m#C)X2Qv%;PS(0ITD zbL#<(jXuc_PG3##q*I~A{L=zdLokdw1~*-%?qTaPRw#Pp@BQ_h#i-BU-f8Wq4?5}t zg{g91uxL8DUID8(DY)U`?Ib{8l#zGNH+0v{%+;x~?X>-M%K zdWzWVm{~oZz4n3JU!B$aUOS4tK2ABGz3OQ^du<+JuT915b+#ESV<+~p+3Rg=@kjaM zsJzj9yvcnudtLqTaVPhK(}naH_G)Cn(aF7*??+GW0(&)$7kgERQgwe5c9|3%P zDL(hl8aY2Unhk&CB+r}1$SLzj&N_-=a#I*N?8EtT*YqBelTLmAUZStOnz|;KYUkAi zE-!38;4q5$lxxTTmECr&clk<9HJ-){plPX-{YmC+mK_TN#|$8^;~~)~&LWQvXr~jp zuOiX&J7H>cFzm`(L%4z|Az1>27)kgp@LI^BWKu-@piGcbc2tUl!5~kB8)ANjGrufv@Cb*I5QqZ2(+aFB#M6lsQW*6``p%k;@`wmMWDuO}Y+ z>X(^un^yo%`&e{h>t9oVefCZ=!5v7R7pja<>9ruX3Z+#jSgb&C%O^N@KeQrMTfoa~ z2mxxD0IJysrHk6a9Sx>JgBsda>FP!ms=2p5gz;Zu%d0p{V_RUY`}w+!D;I>48|S$H zG$GR;K}(R_m^u%)Q8`SR>pzm*gky}qd=s*yz0KEI&OyJa0LaAIu!oGZwozQ-rah{; zyz@UbF7VgBGKA(HueQ`|X+`bblmbC1`0KPovUhn;zpMb&*pq6E=z5H*e1jrT*iQyN zEV<-w1Z+vDrT-=fH>D~(m_K1OBDQ8rp`FHx)v)8M6cfv3Zx9VZmf+tY zi?5=UL-1L+R`nk$Md4a8f}ny@-i+@%3atz4(PCXV+xT){h%fgN`yGrl#)TDSgxgJ! z>I4N+gE*Dhdp4L;8}Dq@6?nxZ-DS*IPk!a|yUJ_3FXpMn+N7zPB!a9WqSW#Xib;D~ zomcm$S~3l=gpLtQp|z2k0C5wE*Brc5PP>#q*>yzjL~o2xOMjnerauxhpk$H4`3tdA zZ$)O&&KLWn@EGzXt~f zX22W72;Yw{@NXA~e?t_8lUJ>;n;SYrz_Px{T<=0?f%Sh>Fb2DOE?!U<@CR?in?n6B zO-N3B&f3^wzpjW3{V$cQe@THDEI%wma^f#m+2>=EJ~zIuF7mo_E+$v=n;Z9;GmFN3 znRidJC#25JygTKF@=aFg^biIC-setFJccjpivgQ^&O6Uzc=i!C$B%IUptnbT{-zx} zx`8e^+8RXXa6dE1y)ND7G&57qX*JFdugVE7>HM20k3}VFbhz*d1PMr=nSF=e9SI%? zX)nG{UG*=flQi~{tkJ}@B4j`tF`?R82rAV5A;KJ=H5 zW=aSx2z^!)I$4DN?z0-~3F#Sz$0E@^FI7L&QV#-ZGAdgNBJ^9!uSWYk%U4-{*7E z{-c=`tPvskv&Qrn|CQAArhyFx3<(3t8ER|Dy92qI?C>N40Rx+m(3?!jr@Y%avUDC5 zWXD~@uMsq`uue{&?Zyv_izTNw5O3>Eh=V?bBjc!ZE;^J$4p#_Ge#bcpxC+U`YTY?K zTHq47CpjtQi#dicxb4U;{Q^whgROqFu`ghZ@-Fb>HSN&Z5-}f*SuYk9)vZWPYmp9z z@a?&ImWj2tE8EH$5#4~#cBB@||D+CyUiyK?7jCVlPvrB8e=s7|5TX8)EC7u=)N=Tz zbn|7NOIJy9W!?)ryALJ0F6hC!S8UE&o|`YJNs)Jl@C-1qcTv?n>Dv-NO;3!3s<7+? zmLAn?0$wGA2qxEDP;pC6Q7JI>t!^M-@4$w7NQ%B1k`qx{58lFUS}nv~?XT4F)&9zC zemm?Z4kROq+SF;Nvm_pUNx%BMp*ZBrV`Zkmd5_T56pp5^tSf9*g(V9g323x`C{EFcAV6yfj`vP13! zQ%McsL=IJ^R_41*C0KRW! zhaJ;VK9ElM$bc!NVU6R4!V!6^8HCPPMBkuw%TcoeRou#Np5XiCH1T|hl=ia=#%8Il z1>I``7?Qb4s60c1uC8V2ye8@VXb*l@ER=pZ=PR3dP0|>RkuM-XNx(9n_v?64BgLCI zCK=z~AbtOjgyN?;x1(ZvE6(hd#Q(137KSq!eVY}tKf8_tVvRQN+puhK8Am^DW#F(kDjqbUkt?O z=PVOB*oy!{3?NMbb8FJ;6x^&kk+OHuXr{^RFTIO0IuM7~hCVvxxUS&g8o>4wsEqm5LMiWv=oto}DkQqA- z+mm2-EZ)oZ#PHtm7}oo{2mEptoT@PIn2(0_euH3)RIg*<=c#9{kvu-@6Tt7Y;t?=! zeBYnSFM6CB6)y}i{hwprWGpmAID?3GiT+GQJc-Kzg~rG58~tMmc1u*a=bJJMjJ z-lKwsOOF#=1~!OKl93Ri8E*E$o0wSGv3Pp=!G03^GxYY1-{8=#1+W`U&{2~Xuq~_AUT)g<^+}xI}j^gv-&+e zjh>A#8S~W_Lv}y9dw)6ERbK6R|0CxF&t-K|fM!AKw4n5nSv!slwPh zg0LQ2mHElN^47&kX>Pq7dO|`zkLMW`dsfNBmN zAbUR^i15WlIDOBppjp0bX`s-2@23i$V#LkyP5#=S`C?NbB+uz2{PLBZ_N%(pr=E}xW@T;YV0);qOYssz zaHz5pkD-)@B1-JS1FU5i>*d{kZq|U;k_;=e`L6MrVNTjy;3$tC`P`-1#%Y{X<;!7lYWt(9+cWB0Cw$U$B z4Lt9euMH2oOW)2M3Eyxn5$yDt*q`#@pJ>@8cm9%~DoyD{2a@M3YLj1HT@}?EZ3s4T&v+~w;{zc?#jGY zkKVxE>ANOMxl?3PcTS+Ok@*lhJcShW?^N|Qo#oz}Ul-qJ8|{=ECEt2hArw@T@vH0K ztH}2^R_Et)kp_w81j%?KV|SXrj+UHWIDY6XQ9OLCH^V<=ONGHh_kz&;t_4-y=PA16 zkWq52EK$uRb&3YN!yG_GxueCq4g~x|0HNU!;A^tER2cnN)QuY_!&$qytHqEyP#(!p z56^5aynj!7DFyxPW1l^vO;;Q>n>n|^Y(wwXHdI1-&G4XGwbeGM+&tdSzB^uR$78sg zvY{p(w{yC+o^hH8C3;?FOrr;z(PTf13V{%!QrvmE7-5OK{IpgWI|GRTm3)1^(>|z^ z%?j_%SB8fPu6f#QWhT083IjHcp;XX=R99TrW9A-Kg z9>XjuhzQ_zmX@s2(mtXBPKfBfO{)ddcc}OIh)T zA4e|>dVVy_bWi53$R?q+e_CDzzh%Ejq zz$D#;<;mMxV?@DZU7B0g@GVWGd_cXir)4%Q&dDe{G$1U^{O?z)(C2=auSPbF3K65Ty8S}M z@=QNHQaxNKsJmc1i<0?GRX^)3>a%~%edCa*_tl$kX7_~n5?Sarm8NDeFYKNF(D!#p z;Fy`c0mZ8-!$U3m)43$(ULXF4L4C3J5u62T@SQ8KrewN`MIeC6d`5{f8aO z9Y7(PtN$Jz^x*^cVE%s8oWmDx-p|JP8wU?NnHMmYCdxIMOh(NohJV3S<}5&fZ)=_J z-c+5uZFVI(9u7UWFPy)6ZdIyWJt)$@nxE^gsUf%zdC#9+nSLokm#DMVf4>!_p4WK# z#07>@J50wH?h-gkc5p9xKvN;<{$tb+Jcq@K^g{1mVgK3Qu8VnDOb9^dOl1f}y?;e& z_5&q*J5DkB#^J%W*9GxSQBj;7bz1A(xCzl~@3bOQxmA`EwZ+(W>J7dTCk#}oE*j~a z!o~-E9NLSW-enTTwTMZb-#2?fXeu6cKer+$kcD&Akhi>0*>JROezfkUZxAc;Y$U_i zy@h;n7xh^#c3%qWm302M<^n#@I%7L4ljj8Ib?#}mpCz|(O2pC0dk{_-Snr1cAf?xC z%k8Oqg~>nAD*!ymf+UJ8sAFC4wOJL%!wOqyTpy3gVwFX zjuTMt3z*BJGh{DghXX8cZev;{o$gpXKs7T^V{pZj;W=;Fe1ogGWD?WYWPmOB2wUd! zefg(4!hc8xc%I^9?hDeTxIZ+EGK$?m8}oahU3A7|_O%u8BR}M=BzCB(Fe2zGK!1?Q=k*nlK;Gvoc*iJ~#7ZN5K(YX2C z@6yKe+=&8WZ#AD%lQJ(y!@IZ$I=ss?Qg_+xnUQSiPkq*Mt3uYS{#iSb|F&j4 zW?!oMUFnezGp4HF;$c5gzvz(V)tE(eRsV^usoqPeaFXC%T)_2A(q3K7%>pZ{r|@v1 zy}TO1Z+Z2^Bo`Z$prx-SF-ggv{JYyN34T=2uj1L+3=KE{mEHdxuxi%~%gCLh^LwG)HE%^0FYu5@+;0u*p8M3?N9oBB4sl8D(x4UlS=q~%r_Rvy zo^^;RbG43+kC?^PEb^NryRo3;FJNSw9PEk5vSNI7AZM*%FS7NG8-;rNH zlG{$C)mLvmXQA6AT|Y!2a#pR|9?m?WD~foT)beurMRT`oyZw%js-j3ep<>qyMSCw9 zjVxk9?GE?biYlIeH92cQ^sNsZQ3hS06^D>FS^&&#gXMK#cbsBR62lt!w>3)+`tj*%Kfz`3*z$?cri)>h* zVr<8=7mC*Q#}K?N*wK5Z`#qp(q$wlfo95`MiFMc?Uzq59P9+e&!a*D@3^6j^%*-Kz zbv(|e4tGJeQCI&Cm^ruU4AS!d;6Hy<&mZ%jm+Sd*|M_EjZug%*uICp2`SW@{+kfuX z^GyHwCOsRKw6*DGJ)5A&bZNdlIqN<5qW6+5Z>P>=kj(UlfLTH{O0;Zycc2(H;-FUU zFw1AEZi2fkObacf^^LSgwHV510eyL9ER=icJ;@JK;hH!S5@Gc16#MHXq42Kcti!!K zZm!lqQ!U=P058fo>+SF_6_?YBd@Mvv-0j4oIjX0+vggnS34e$$mwWe6AEH&%r~MDg zSopRK?(waxawp+{^f)hO_`YuUdrjvlcRI=zWbKxxgKS%s?PtZ=CYx-j-)z|vWcjYL z{JuEL%S{LhcAvT8TS~%NTV4tBUZ=b-6zAPS-prx!$$gnUgl4-&OSrQ^Lhxn@#*I%6 z^u&zlOuL+im7eQw06Mxtf7i(v>~Jd4P=vj_p73ENi31NE~ zFAOzrnK}@Kg-TiL9($HRt;EGrmRr9?J@zimenLnQL&<4i+ZUT{SGr9Tqn{)g)1y6$h!H_}+ZlNb_lcvObU#~@KglAXr-Iy0Z0D$}rro_3`7xfb{A;4v z+r_G~%P1(rsdjsH3>mjGMg$)TyWKH%s_0jmVwNK5DVsNd@tDKa-yqf`Z}etbK>T@b zmLSC1;ZxI>P+zQ``YbEcIxm!-ls%P(t2sI*q_0vov_U5LBRgW=Y7Vlb;G(t_Jzsb=J_Cn2fa!}c z04Y*S5S9n^3|$+7`n?^P^5nilDv-G_*?jHETzO$5Ffdg`!zRg6=SI@^4)cbTqvdH}*oJlJVJ z>%E5qp|14kNNU$!YSvAYS(|@_@p#q`$3RIhOga*M!cgavx}5q`}$Np2n?| zr?fkF7{i&CL8P(7lA%s}a8XNFqV<+WMep5_U305ZRx%`GbsR&)Y6Igb?>}!-TTk$> zpfn0Y4ajDiLuR{u*zCr7n|`;akm&9kW^vAUIq9na#_97 ziu3T1@E?4sK|!_JQ7&eNZy|`!m_Na(rvWzgAgocqcIYV5Hk=Yhej@yWAY0b_qLX(lsmFA6sHs~*i|7SN-_^U>z_~W(gO)$B{ltm*Y2EU&^+YYz9(LK-ks&DoZ z+pIj)YQ~1O`DAL*vYPo)0ZO50uPNYO`exEGkFtSA_}~si=K|#PA)5_6mYrOw>>Jj& zSBGtb#sV`I&(LDd{@OR2nJBXvE4V08imKdKIMtIFp#Rr2_Kl_12&sm56cY=|q-XdB zLZQ@DUp=S+Zw4ibU`}?<;0{N#MMuY}$^4>kG^8f3K|gN{gAA=<0>*X#QtIQUeqCt4 zb9^c`kENo4uIV{S#@0IvVE%t1VSnmzU zxUrx+z$I*P_z<^m%1THPrBN5#it#;hAX*KXLissXW_~C&4NXsHBFZXxl28|0Lcya0 z)4}|UO!c_^6anznVt-Ol z_|Xx5MhJAX6iUDE+jY^~oNF#%)FYjmYe9(yh#qzzq|6kS(Q6rUeF=*yoIpo*id=fl z#}rko2c0V_0n%^z7-wS(&_@_6tG(IXK~>9~kb%l6t_k>$xEoXu^RwVS>q9I9qF|H} zd(14yk_!JG?5?;g5|7-VoBJY?9Dz+B|bD$2W=S$DJ?+K1Rpb4d;hsy zhV{5)8)R7>hx_LD3j6LK<`%)HM?mf|c)wl*bs(g)0HmNbcpn3r05yOFm72muC9T{duyk;Pz z@_J{JnXFsQ(Wya=Z`T?(Y480X_4{BAYL2?KW;Bb4tLc_&B}a5$RNgf?v^djWws`&F zHJmvodKFQzz2%pwr3Q`m#$O^NHbC+0ND`vmh2$;i=YgIln?+2TF_izDTPtyEe94vTcAk)QH@YJ378@Irb;so{Yg}+S5wM2 z?kn|9rzDN8_jgpB{V%9O69&QLYF-a1nmJm9Tawb|-OBDxsMKn(hh7grX=p4%4Aq!0 zVea^>hyx@O2gJ;s29+xFkx*|angYdTlBLP}?T`3o{y^bK`pD|UhM!Cmrx;RyAff^d ziwJi??YV@(bkF+;8*IF61~zHD`5`gYc*yHFdZfMCIF$^P>UX5k#@-Fl(W|FY6*C9p z!L*g2VaQgaf)V`&>>yVTMxuLA6Kti>96|sUDp1=h24Z>#i2^6tvaC>3Fg=APEek5m zHmI^v{T5^CZ3v3h7CP0ha0JIz6^rOM=*-;Tvw=Duj-3VY0giev!ts>9g5xq(R;u4I zIR5c!ziA^l8iqScnU#eC12H`Y6(Ul5{~naAE3~fAd)YO9MjyyPsa{9wRLRd$QfmY* zqnKG6hHQqH24#0~SyPI$kOlPvA$=&~nHAnFpqNfLif3kTFVr{?(qn;V9=wWm*TGVo zo3qB43elsR*3wtI@Q z={d+|nh9mStBMc|YC`87Q#{US{z3yQdq3s;7W+t=!UG{C2jI;3@Fo?(G5`vYN(zu3 zIW{CEkAc*8zcJ46Z4AA^t5#z6UBMNkBw@5Xr}0Cpb(fYQbQ zXaRufI#bNAO#Sr&83#i84YKEE)*OEpdE_%B3uckti)PW&U4MC|zp2Vf^=p6>7{s@O zV#k|Bp?yICTpD>Snnjb;1h>w}swXF4W=&8npk;fzccEO(HYDAf@3;EX=6I$ zs{qjYGW$4fy_Nz4rTQJy){h6pSY>@_x2RLHsY337m>!EL`~ILg#gXIPCswN|}`C~1lv@wI_+MwEF$}js&o%&UsbU^MyL7m5ul-?mL z+q!{LJ&fssP@$f}Fd4VRNB0K>24Z>)=&6NzJKmdWV(l@SSmkFO(?q2eHL=F)1%U9y zF?LLc)MV=lm6{IGTTzEx8WbBpjcT$DWMt=;LYSA7?AMOyRe%-{%Zmd+9bY`5YO<|` zY`&dmLJ_$F5HWoVny%sg(@P5gKs?*QN6pC^Ls+sELfVW12%9`UFA;#-0HCI0ZaPk) z@A7LZ;I7w^{u0%f1|>(P^|=08Q7AAF(_>M8O{JvztN9rHwYs?0U`Q%$On?1qiH~&a zQT?^HP^sxJy%qJ>cPPewOG$k8v@v$YL%apEzYTK(2$dnh0^)19%rtFa8&s%oL=J!2FIE_6dL5y^s~T@jQ0=ralQS3~p*KdDksgcss)b@^kZEL@VaCif zb!4`(VP&$98*3GmNBhQa(NO*KC4QSRd!@v6&1@y}#&*??3^Dcell-)y6^8JY0|vAcZu zX1?oLGw27vJYEOiUyP66n2^%Obnr?5XbRRJYdCHq_drCyg$}-$Q;U(VD$s7+Ab#AG z(r!FWo-vh; zS)E54IOyjMh_1Jy1}+Xtjxh4kb=@ykXyDVlj%i>bC|R@t9)sZgB=|OU5qi-6yJXkM`$fG?;MCrl2&Sio^0(Jk5QqxQ+{T52ShLO%lOA2)r&yU$;hEPFQ>8+@% zzO!%~>llY+tEo@Fh5Bwjc74GJ?({43p$wGjbxa4(8DHNxCbzs$U?8T)q7Hu38pi|1 zVY-^^0}=feFnt>9oFd93dV0}+iZZo|6wy7oRRIQk@tS&A#!Ae_OXt2wSVk}-C~jxT zQq$jrP6=8S>Nb@S&_E9e<2v-I@U8$sbhJ8J^LJdhc>;5qe3+Zcx{+PzPY{Q_iIg?*EE%s#%e28A@cnB5#mGOA|fsKqzdk z)0b-;8OE7?8u*aQ3^U8d&>6K~K)HcZeH@u$+8O>7FAg&ZF+{@Ao4o?`Qpa8V&mh5i7Cd=l!9+*9Qlk3k| z;R$|Ks^t~6TL*B4=j*L76YnS*`~|%n1>O`|A^iqC-#4^1bFjdK&8!@$!+=NXGq4$l z{zGZLaRi-0xp5Szc}o<~uW&+;A~cu`9cZVa!>EBwZU~PMf!nO$0NL3T*;2<3IdzC# z=6!#*HWEDL&r`O-e-6a+=(!Ms8vFb(9B%h{ow=W3wXJUHUCBdkC4CdrY`i#&9Ls!f zVhorF*CRJ7JR3QIJtvB(#EfQ4bFevG76g&>k7~=@sN8r%XTCEW3H9fyI^3R^_v>&) zYNEM}?h8o6z73#^D<7AecA{q=v&K5G;rqN{;`qGY+>dR{);>ie2Oln2jLm4EzMw8| z*F^D-u5;ozVkCNQqe9DF@<_Yez6no8jJ3}F183@k=~TOe}$-XgFG((Px>m+Y0K3qU=eu=u0n8nB9-VUBO>K!|VFKy-%CGPq%wIwPtN*sjiq zdq2b(2J5kN%CI*`S7CB@PLy#=A*aIo8?4dtvonV#q$gpjU~K$w?$)(SdS&g!qZieH zpWi!|^CI(JAc1!UZC1Y;s1zyWc4Qa>j70j2IabGOX1k?Lm@ zzI)36pKUI#@FG$~48p3&gs}|o@HD2zm<9&)+mBHt)IKtn+D9VkvyVmX$2m$GOYJ{_ z3cyu|z#5xUV-8DI47pAIkb8$AcPOZF3pL8R^4om!jV;xPX{Hh0*8rDoEp9;%DL!iXk^BeAi3EUS>^n4j)MV-tZZhzvj$` zy;blg?~_DNDNlvc?e33PFkZY*J#T1iWe2x~D=u?a&s*Vc)I=es!aTwqq^jfAtepzS zC_1&-4RGiiW1Du6dDfr^^dWcoyk)x%(IPu?F>XJzJB$PP=^2GUG8dUUr($XIsXom7 zkz>MxG9(66nW;d^rIzOO``YK5i_p{4?L*e^;D?AhaxJ&R$1I8!6`}4e2&f_Rz1{h) z?oR)PbK$}FkacS8BWJPvG#+Rfx+!WuGiy5nF$P&J+fobKoxAHli8tMRzTa|AyZg=1 zI_z-fvnF@XY^MesZps)|u{Z(I65ml7EAj0B{7C$i?&C(iKiM1 zfAsjcVOb^C_GtAS_j3901dsCJ3Lc|{M?Bbq$6EJtLYDLcgTPZPL#-eePAwHdTHBos zZM=${$cJ^l$-KTSvk7yteBM%fZqg<);u2!hc?;eyg%+LjTAjJWeR!xt;6%?77Ugo2g0Ya2N6r@y`Ir|F48!~HzN++8@V!s}XNpm`R=v4@7Y2H+;;BsLr2(h&MG zH#M&_=m%`E{m8L|(v@s$$J8^0F7TGK3P_x-apwBu$DcIO^HbVwa_d5MJP}&o1n$BS3b+dk1eoJ4JTgLy72Hn)f%7qI zW2AMGe_$Jt>?$on3g+@KDU!d}m8F3liPD|*`@TONnt zov;?apK9HOVTS#@;1w+7IcIv%T^JdCjE+8*1dkLg6-R1wDrdc+d3f_>dS!>8y#Q_i zv-+)BeU{rq%-aYvuWBA!rAetN_I9qkJP_$5tULE7rV`sr&qik1uSzkzK5KjFM9N@n zehY5;!R-3@h(n!Ucl9J;XqdYgC2SHN31>dLzzMx;|6o|4zl{1m5@PGsQTI-9LhtmF{PD zD+a{neu#m?#4d7vr0?=9e&RabGJfs|0n~p7m~F;Z*~I=xy8q8wdQIVCU%B!_?)`Im z7>QRT9{#PwWM{)ZE`GnnedHX8_`0l}@%$n8kvVtrn)E$RU@_fux@G5lv3>iTyEKl; z)v#*)k(J>a%Iz5D(^D8c`9`=7`N9ZQ;uZOsZuHwrk-e->MN1=A!kct+6>;adr3oE`HM}GJe(S)k>J!%650V6sb${SC!%S-_E=zSL)2&f>yo9WE zTMpnH7GmXyrmp#r+hfqSoQImImJT7zhC^$5=BRN_Xp!ACXOZ1Cry{#t9R(-sKSb9j z7TL?^lr6H8bBLBz7hN=voD)?BrNq5g&XM%@HIdhhg@fJ?&`N*Ey?xF)LkWiJ`nOlY zE3ThphiOc%3RYYA>{fld`wGPH#$h`Q8zB&~kvf{0J%hN3s7(&-^eCSA;_t+Pl6A9{ zaVhhl-d|j`=+0T5*%rs7xSlG_npxsLbA$KfztJpZ9#JyXg7MHey_LmL3vdAKnNk;HqC1*_}RdCAkN)>!3Fc zs`_%~t&eCJ!$xb(M*%4lLp|ud_?uFg5xYc|yx9t`;#`1l)>NAHHI)fqbz&nePim_r zIW_*d^SuWsRj9@U6*d(h*_D<#IR1B?61FQmhfD#OgF{v%IkhZ5)4P5&(eG)Ot8)K_ zt(j#Hbo6_*!dD80j;v?}LfFGwPNVl*7F=~l+c4C3LVjOFOXu@;^CWJPnjOtus?97} zh=HUQ!BP>O%n~uR-6r@95~`xf2+KHb*3xs8@>{B4?nVe?XqY-^gGteKle6?xlW87K zq1*VP2B`Iz&l3=*;wLaI5gfXw#`DvIfx8u#Le-qFx16RA+Jms|6N!)YWc&Q?55{lG zTXuY^??^>0a%Qg*4v{pWb{<+`#E*mCpC)NXzl5dz@Pu@W5THA@gftzwqW>e)9^RrZHJV>8pGsWlv4?t6P<*Mtg7K z#iRwn-$EUNhU;G4V?i3;a#{8GGjymb<)ex56FGhG)_=$-T&^-UBa} zh7i{lEB+aahoxa$hC(3e+~L9Ohzyl3wKne=Vj*DbS~r3_P4#_OvLPDbT}~56A^}x= zRGN-$ig$%~mfX?A_}Pp)kF~v|t22`G@d=5~@37edGKeQ~kJ#W%B?OGiw`5*x<8OF} z0!mFp1vVd*$jV5qWw&zHwpDAz`_wW=F-!ZBcCtL`B+HQ|clPgzMuKg@chU;@-*{u&?1zotMx-A_v*~oB^Dn3FGRrAz8SHL$qZ0{I*iTRd zBD(D}Sb>R&;6|`F3 z&Y6Rg&<2-m;nz%IgIKEy*YSN-Vou-ZPsmLEXFj)WrfY7=w^7|ReUBPY6_fujZSNl+ zRdwh8PcoBaAOkm;kc<)_mZ1a*LP`W;qGVu#!Ny88TDPTLw^G(^Y1hgO(*2|gP9j`y zNA04uyB~MkZo94B?QZSXA7oTWf+T^p7OAzgbrq@FJB&Zjwt&=<@AGx;%@3^A?)Urn z{*lc6aqju?KJW8B@89Q!Uxz8TU}(cZ-W2MM!qjJWTA$!tK zxjk0&A^vYlk*n9Tf6NS}_YUWXM9|nD<;@O@T?)9I2VDMDpWnsjy!!{P{jsD?g=Oq- zZ&+)F)>*ZEZX=Hdi(a2FelUNnuRp?zk-_|w*W(6rk=`%y>YDU#FO3__e7%`&zFbiB zRo z!e?vwko#R$ulckhwo@;(ReB%Uq4JG|Bz<(0RCzzS`hy=>ZYP@}!HJx-*%aRV@F_8G z$z{u(NRyqICuWwD8hHbjuuppl5twFGNrvj&s3OKuWH}12#6eOk`s$imGax;k-XJ;64ze>Sq zqWI(-h`A4Z9`H8yCZ}==qI)klq#jeQiznO%SqwbXE=^NblOY9 zTiQ#-b%r)S{2a4YxbahtwCN_GusKMcfMjGxL!1-~BxbG3!+@4Y^AU2Q*1&#{`?NHQ zg@fHhVeakaW!~h%2-=^sld4dsLMBtiw8C=ki&!u`9L#~TWMPFjOwhW);CvEB5{ zJhv;nq*A8`W|~BYNhLa5Plf;jo0ayE$oxv@?mLhxNFy(&8~0h68=PgWQzEsdMFVz9qp^P|5KvRYj|0K=(dlW(`5+lb{VmpA z1DS^3xq395oMWFP)@~{pf7+*pvt{ffgb*grB4T=Yw{=&4rsAgop24UC?PPgK2XnTUM?kgG5c60D;tlhhT#8JrUErq!^k-+4{Rg&hj5R}G-%L)o z=$zRM7$IzJ&i8k~y?U}ySZ`aHBuPJI7)hj^&3yxw&%EG<#2}P*8cIkLetxU-fW9SB zxYf0QC6$wW8h5%?#2o!@u25MP>8Xms_3ncd3}n9tX=%rJHxC_beDkA5l8oD?O!847 zU);INRC9vNILMN(o!J|A9?*oKWS$yOnqh(bKB_5tiht;z0l9#m)w4J=5OM#5oh(Q4 z4fHL?)Y!6P#n@e2Jl!$;{&Z&g`Roa=D;jc*9+KF^3`-A`uVFfi#Zy*KH({*OR8Pks zct7LOo2aSDXt$?_1_P?jeC3tUWyHI5&pEF4gUJuacbbpk;HB@TYuOjn=|MAoU>MK| zj0E>5r$@{%&0B`VvS64H+;MpYa+felz$>wA73Wq!In%wt^r5#nSHyW#?Ep%>^z-ha z?`=#>ja>i!cmb=!|Ijaq7Xvb2QP?j!cPNi70b|u`?o%g(f2N)hag4^aPP=~#xBdT1 zn^*toHcyx~IolR>*wObM>#WnqdY1ppPfrnr;Q zWv1dk^qJTZ=*0u-4S*CN3ZC?_hc(388l^>hT38m6)`M6wl8E5b$Bix*dhRDnfpEfJ z=uZ5d!4E8+hCG^XlI-uuP212)ZaKM*C6**ewp*Rc?NpgTbNwl8XQa7rGIv(ySEg@> zy8Z%nD$z`x)pw|n=?&hcZpMS%UZ+`0`ROv1%^Z1co(Ii{%~Fdy>xo2vpX_F5`(?~X zsY#$1Efbpi(>(f!^`xC}I;J=1C=#>i&cP-%+-r4BroWO|!*o|DhoLQ)A38*hA9O_&{Pl;6H60AfKRgHF8kq#zT

    ?1BBx6S?r6h`#Yfk*UUdg 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 z

    p^4&q$&BO(Kk}N}Bw5DW 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 WR`*wKsy96NGo1ZzQ6Qa0y8Z*Q%*~kq literal 2640688 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�r{OKu%%oIGTwp% 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

    3Du(etD4%65mRdwk{v#d*$>NmDJi( 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

    YZ6+&OmPMscWP&v;<($+sDBlIVa-`sZZKnI3BO1 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