splat64 0.35.2__py3-none-any.whl → 0.36.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
splat/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  __package_name__ = __name__
2
2
 
3
3
  # Should be synced with pyproject.toml
4
- __version__ = "0.35.2"
4
+ __version__ = "0.36.1"
5
5
  __author__ = "ethteck"
6
6
 
7
7
  from . import util as util
@@ -7,7 +7,7 @@ from typing import Set
7
7
 
8
8
  class SpimdisasmDisassembler(disassembler.Disassembler):
9
9
  # This value should be kept in sync with the version listed on requirements.txt and pyproject.toml
10
- SPIMDISASM_MIN = (1, 36, 0)
10
+ SPIMDISASM_MIN = (1, 36, 1)
11
11
 
12
12
  def configure(self):
13
13
  # Configure spimdisasm
@@ -286,6 +286,7 @@ options:
286
286
 
287
287
  find_file_boundaries: False
288
288
  gp_value: 0x{exe.initial_gp:08X}
289
+ # ld_gp_expression: main_SCOMMON_START + 0x7FF0
289
290
 
290
291
  o_as_suffix: True
291
292
  use_legacy_include_asm: False
@@ -309,6 +310,10 @@ options:
309
310
  data_string_encoding: ASCII
310
311
  rodata_string_guesser_level: 2
311
312
  data_string_guesser_level: 2
313
+
314
+ # Uncomment this line if you need to use the maspsx reorder workaround hack
315
+ # https://github.com/mkst/maspsx?tab=readme-ov-file#include_asm-reordering-workaround-hack
316
+ # include_asm_macro_style: maspsx_hack
312
317
  """
313
318
 
314
319
  segments = f"""\
@@ -1,4 +1,5 @@
1
1
  from pathlib import Path
2
+ import re
2
3
  from typing import Optional, TextIO
3
4
 
4
5
  from ...util import log, options
@@ -75,45 +76,66 @@ class CommonSegTextbin(CommonSegment):
75
76
 
76
77
  f.write(f"{self.get_section_asm_line()}\n\n")
77
78
 
79
+ sym_name = None
80
+ sym_name_end = None
81
+ sym_size_matches = None
82
+
78
83
  # Check if there's a symbol at this address
79
- sym = None
80
84
  vram = self.rom_to_ram(self.rom_start)
81
85
  if vram is not None:
82
86
  sym = self.get_symbol(vram, in_segment=True)
83
-
84
- if sym is not None:
85
- f.write(f"{asm_label} {sym.name}\n")
86
- if asm_label == ".globl":
87
- if self.is_text():
88
- f.write(f".ent {sym.name}\n")
89
- f.write(f"{sym.name}:\n")
90
- sym.defined = True
87
+ if sym is not None:
88
+ sym.defined = True
89
+ sym_name = sym.name
90
+ sym_name_end = sym.given_name_end
91
+ if (
92
+ sym.given_size is None
93
+ or sym.given_size == self.rom_end - self.rom_start
94
+ ):
95
+ sym_size_matches = self.rom_end - self.rom_start
96
+
97
+ if sym_name is None:
98
+ # Normalize stuff like slashes and such.
99
+ n = regex_sym_name_normalizer.sub("_", self.name)
100
+ if self.is_text():
101
+ suffix = "textbin"
102
+ elif self.is_data():
103
+ suffix = "databin"
104
+ elif self.is_rodata():
105
+ suffix = "rodatabin"
106
+ else:
107
+ suffix = "incbin"
108
+ sym_name = f"__{n}_{suffix}"
109
+
110
+ if options.opts.asm_nonmatching_label_macro != "":
111
+ siz = f", 0x{sym_size_matches:X}" if sym_size_matches is not None else ""
112
+ f.write(f"{options.opts.asm_nonmatching_label_macro} {sym_name}{siz}\n\n")
113
+
114
+ f.write(f"{asm_label} {sym_name}\n")
115
+ if asm_label == ".globl":
116
+ if self.is_text():
117
+ f.write(f".ent {sym_name}\n")
118
+ f.write(f"{sym_name}:\n")
91
119
 
92
120
  f.write(f'.incbin "{binpath.as_posix()}"\n')
93
121
 
94
- if sym is not None:
95
- if options.opts.asm_emit_size_directive:
96
- f.write(f".size {sym.name}, . - {sym.name}\n")
122
+ if options.opts.asm_emit_size_directive:
123
+ f.write(f".size {sym_name}, . - {sym_name}\n")
97
124
 
98
- if self.is_text() and options.opts.asm_end_label != "":
99
- f.write(f"{options.opts.asm_end_label} {sym.name}\n")
100
- elif self.is_data() and options.opts.asm_data_end_label != "":
101
- f.write(f"{options.opts.asm_data_end_label} {sym.name}\n")
125
+ if self.is_text() and options.opts.asm_end_label != "":
126
+ f.write(f"{options.opts.asm_end_label} {sym_name}\n")
127
+ elif options.opts.asm_data_end_label != "":
128
+ f.write(f"{options.opts.asm_data_end_label} {sym_name}\n")
102
129
 
103
- if sym.given_name_end is not None:
104
- if (
105
- sym.given_size is None
106
- or sym.given_size == self.rom_end - self.rom_start
107
- ):
108
- f.write(f"{asm_label} {sym.given_name_end}\n")
109
- if asm_label == ".globl":
110
- f.write(f"{sym.given_name_end}:\n")
111
- if self.is_text() and options.opts.asm_end_label != "":
112
- f.write(f"{options.opts.asm_end_label} {sym.given_name_end}\n")
113
- elif self.is_data() and options.opts.asm_data_end_label != "":
114
- f.write(
115
- f"{options.opts.asm_data_end_label} {sym.given_name_end}\n"
116
- )
130
+ if sym_name_end is not None and sym_size_matches is not None:
131
+ f.write(f"{asm_label} {sym_name_end}\n")
132
+ if asm_label == ".globl":
133
+ f.write(f"{sym_name_end}:\n")
134
+
135
+ if self.is_text() and options.opts.asm_end_label != "":
136
+ f.write(f"{options.opts.asm_end_label} {sym_name_end}\n")
137
+ elif options.opts.asm_data_end_label != "":
138
+ f.write(f"{options.opts.asm_data_end_label} {sym_name_end}\n")
117
139
 
118
140
  def split(self, rom_bytes):
119
141
  if self.rom_end is None:
@@ -159,3 +181,6 @@ class CommonSegTextbin(CommonSegment):
159
181
  return (
160
182
  self.extract and self.should_scan()
161
183
  ) # only split if the segment was scanned first
184
+
185
+
186
+ regex_sym_name_normalizer = re.compile(r"[^0-9a-zA-Z_]")
@@ -204,8 +204,10 @@ class LinkerWriter:
204
204
  if not self.is_partial:
205
205
  self._writeln(f"__romPos = {options.opts.ld_rom_start};")
206
206
 
207
- if options.opts.gp is not None:
208
- self._writeln("_gp = " + f"0x{options.opts.gp:X};")
207
+ if options.opts.ld_gp_expression is not None:
208
+ self._writeln(f"_gp = {options.opts.ld_gp_expression};")
209
+ elif options.opts.gp is not None:
210
+ self._writeln(f"_gp = 0x{options.opts.gp:X};")
209
211
 
210
212
  # Write a series of statements which compute a symbol that represents the highest address among a list of segments' end addresses
211
213
  def write_max_vram_end_sym(self, symbol: str, overlays: List[Segment]):
splat/segtypes/n64/i1.py CHANGED
@@ -1,9 +1,9 @@
1
- import n64img.image
2
-
3
- from .img import N64SegImg
4
-
5
-
6
- class N64SegI1(N64SegImg):
7
- def __init__(self, *args, **kwargs):
8
- kwargs["img_cls"] = n64img.image.I1
9
- super().__init__(*args, **kwargs)
1
+ import n64img.image
2
+
3
+ from .img import N64SegImg
4
+
5
+
6
+ class N64SegI1(N64SegImg):
7
+ def __init__(self, *args, **kwargs):
8
+ kwargs["img_cls"] = n64img.image.I1
9
+ super().__init__(*args, **kwargs)
@@ -24,6 +24,12 @@ def write_all_files():
24
24
  def _write(filepath: str, contents: str):
25
25
  p = Path(os.path.normpath(options.opts.base_path / filepath))
26
26
  p.parent.mkdir(parents=True, exist_ok=True)
27
+
28
+ if p.exists():
29
+ with p.open("r", encoding="UTF-8") as f:
30
+ existing_contents = f.read()
31
+ if existing_contents == contents:
32
+ return
27
33
  with p.open("w", encoding="UTF-8", newline="\n") as f:
28
34
  f.write(contents)
29
35
 
@@ -33,13 +39,23 @@ def write_include_asm_h():
33
39
  # These compilers do not use the `INCLUDE_ASM` macro.
34
40
  return
35
41
 
36
- file_data = """\
37
- #ifndef INCLUDE_ASM_H
38
- #define INCLUDE_ASM_H
39
-
40
- #if !defined(M2CTX) && !defined(PERMUTER)
41
-
42
- #ifndef INCLUDE_ASM
42
+ if options.opts.include_asm_macro_style == "maspsx_hack":
43
+ include_asm_macro = """\
44
+ #define INCLUDE_ASM(FOLDER, NAME) \\
45
+ void __maspsx_include_asm_hack_##NAME() { \\
46
+ __asm__( \\
47
+ ".text # maspsx-keep \\n" \\
48
+ " .align 2 # maspsx-keep\\n" \\
49
+ " .set noat # maspsx-keep\\n" \\
50
+ " .set noreorder # maspsx-keep\\n" \\
51
+ " .include \\"" FOLDER "/" #NAME ".s\\" # maspsx-keep\\n" \\
52
+ " .set reorder # maspsx-keep\\n" \\
53
+ " .set at # maspsx-keep\\n" \\
54
+ ); \\
55
+ }
56
+ """
57
+ else: # default
58
+ include_asm_macro = """\
43
59
  #define INCLUDE_ASM(FOLDER, NAME) \\
44
60
  __asm__( \\
45
61
  ".section .text\\n" \\
@@ -49,14 +65,28 @@ def write_include_asm_h():
49
65
  " .set reorder\\n" \\
50
66
  " .set at\\n" \\
51
67
  )
52
- #endif
53
- #ifndef INCLUDE_RODATA
68
+ """
69
+
70
+ include_rodata_macro = """\
54
71
  #define INCLUDE_RODATA(FOLDER, NAME) \\
55
72
  __asm__( \\
56
73
  ".section .rodata\\n" \\
57
74
  " .include \\"" FOLDER "/" #NAME ".s\\"\\n" \\
58
75
  ".section .text" \\
59
76
  )
77
+ """
78
+
79
+ file_data = f"""\
80
+ #ifndef INCLUDE_ASM_H
81
+ #define INCLUDE_ASM_H
82
+
83
+ #if !defined(M2CTX) && !defined(PERMUTER)
84
+
85
+ #ifndef INCLUDE_ASM
86
+ {include_asm_macro}\
87
+ #endif
88
+ #ifndef INCLUDE_RODATA
89
+ {include_rodata_macro}\
60
90
  #endif
61
91
  __asm__(".include \\"include/labels.inc\\"\\n");
62
92
 
@@ -315,92 +345,99 @@ def write_gte_macros():
315
345
  # Taken directly from https://github.com/Decompollaborate/rabbitizer/blob/develop/docs/r3000gte/gte_macros.s
316
346
  # Please try to upstream any fix/update done here.
317
347
  gte_macros = """
318
- ## GTE instructions macros
319
- ## This macros are meant to be used with GAS and avoid using DMPSX
348
+ .ifndef .L_GTE_MACRO_INC
349
+ .L_GTE_MACRO_INC:
350
+
351
+ ## GTE instruction macros
352
+ ## These are meant for use with GAS and replace DMPSX
353
+
354
+ .macro cop2op pseudo, op, sf = 1, mx = 0, v = 0, cv = 0, lm = 0
355
+ cop2 \\pseudo << 20 | \\sf << 19 | \\mx << 17 | \\v << 15 | \\cv << 13 | \\lm << 10 | \\op
356
+ .endm
320
357
 
321
358
  /* RTPS 15 0x4A180001 Perspective transform */
322
359
  .macro rtps
323
- .word 0x4A180001
360
+ cop2op 0x01, 0x01
324
361
  .endm
325
362
 
326
363
  /* RTPT 23 0x4A280030 Perspective transform on 3 points */
327
364
  .macro rtpt
328
- .word 0x4A280030
365
+ cop2op 0x02, 0x30
329
366
  .endm
330
367
 
331
368
  /* DPCL 8 0x4A680029 Depth Cue Color light */
332
369
  .macro dpcl
333
- .word 0x4A680029
370
+ cop2op 0x06, 0x29
334
371
  .endm
335
372
 
336
373
  /* DPCS 8 0x4A780010 Depth Cueing */
337
374
  .macro dpcs
338
- .word 0x4A780010
375
+ cop2op 0x07, 0x10
339
376
  .endm
340
377
 
341
- /* DPCT 17 0x4AF8002A Depth cue color RGB0,RGB1,RGB2 */
378
+ /* DPCT 17 0x4A88002A Depth cue color RGB0,RGB1,RGB2 */
342
379
  .macro dpct
343
- .word 0x4AF8002A
380
+ cop2op 0x08, 0x2A
344
381
  .endm
345
382
 
346
383
  /* INTPL 8 0x4A980011 Interpolation of vector and far color */
347
384
  .macro intpl
348
- .word 0x4A980011
385
+ cop2op 0x09, 0x11
349
386
  .endm
350
387
 
351
388
  /* NCS 14 0x4AC8041E Normal color v0 */
352
389
  .macro ncs
353
- .word 0x4AC8041E
390
+ cop2op 0x0C, 0x1E, lm = 1
354
391
  .endm
355
392
 
356
393
  /* NCT 30 0x4AD80420 Normal color v0, v1, v2 */
357
394
  .macro nct
358
- .word 0x4AD80420
395
+ cop2op 0x0D, 0x20, lm = 1
359
396
  .endm
360
397
 
361
398
  /* NCDS 19 0x4AE80413 Normal color depth cuev0 */
362
399
  .macro ncds
363
- .word 0x4AE80413
400
+ cop2op 0x0E, 0x13, lm = 1
364
401
  .endm
365
402
 
366
403
  /* NCDT 44 0x4AF80416 Normal color depth cue v0, v1, v2 */
367
404
  .macro ncdt
368
- .word 0x4AF80416
405
+ cop2op 0x0F, 0x16, lm = 1
369
406
  .endm
370
407
 
371
408
  /* NCCS 17 0x4B08041B Normal color col. v0 */
372
409
  .macro nccs
373
- .word 0x4B08041B
410
+ cop2op 0x10, 0x1B, lm = 1
374
411
  .endm
375
412
 
376
413
  /* NCCT 39 0x4B18043F Normal color col.v0, v1, v2 */
377
414
  .macro ncct
378
- .word 0x4B18043F
415
+ cop2op 0x11, 0x3F, lm = 1
379
416
  .endm
380
417
 
381
418
  /* CDP 13 0x4B280414 Color Depth Queue */
382
419
  .macro cdp
383
- .word 0x4B280414
420
+ cop2op 0x12, 0x14, lm = 1
384
421
  .endm
385
422
 
386
423
  /* CC 11 0x4B38041C Color Col. */
387
424
  .macro cc
388
- .word 0x4B38041C
425
+ cop2op 0x13, 0x1C, lm = 1
389
426
  .endm
390
427
 
391
428
  /* NCLIP 8 0x4B400006 Normal clipping */
392
429
  .macro nclip
393
- .word 0x4B400006
430
+ cop2op 0x14, 0x06, sf = 0
394
431
  .endm
395
432
 
396
433
  /* AVSZ3 5 0x4B58002D Average of three Z values */
397
434
  .macro avsz3
398
- .word 0x4B58002D
435
+ cop2op 0x15, 0x2D
399
436
  .endm
400
437
 
401
438
  /* AVSZ4 6 0x4B68002E Average of four Z values */
402
439
  .macro avsz4
403
- .word 0x4B68002E
440
+ cop2op 0x16, 0x2E
404
441
  .endm
405
442
 
406
443
 
@@ -411,29 +448,29 @@ def write_gte_macros():
411
448
  # cv : arg is 2 bit wide
412
449
  # lm : arg is 1 bit wide
413
450
 
414
- /* MVMVA 8 0x4A400012 Multiply vector by matrix and vector addition. */
451
+ /* mvmva 8 0x4A4nnn12 Multiply vector by matrix and vector addition. */
415
452
  .macro mvmva sf, mx, v, cv, lm
416
- .word 0x4A400012 | (\\sf & 0x1) << 19 | (\\mx & 0x3) << 17 | (\\v & 0x3) << 15 | (\\cv & 0x3) << 13 | (\\lm & 0x1) << 10
453
+ cop2op 0x04, 0x12, sf = \\sf, mx = \\mx, v = \\v, cv = \\cv, lm = \\lm
417
454
  .endm
418
455
 
419
- /* SQR 5 0x4AA00428 Square of vector */
456
+ /* SQR 5 0x4AAn0428 Square of vector */
420
457
  .macro sqr sf
421
- .word 0x4AA00428 | (\\sf & 0x1) << 19
458
+ cop2op 0x0A, 0x28, sf = \\sf, lm = 1
422
459
  .endm
423
460
 
424
- /* OP 6 0x4B70000C Outer Product */
461
+ /* OP 6 0x4B7n000C Outer Product */
425
462
  .macro op sf
426
- .word 0x4B70000C | (\\sf & 0x1) << 19
463
+ cop2op 0x17, 0x0C, sf = \\sf
427
464
  .endm
428
465
 
429
- /* GPF 6 0x4B90003D General purpose interpolation */
466
+ /* GPF 6 0x4B9n003D General purpose interpolation */
430
467
  .macro gpf sf
431
- .word 0x4B90003D | (\\sf & 0x1) << 19
468
+ cop2op 0x19, 0x3D, sf = \\sf
432
469
  .endm
433
470
 
434
- /* GPL 5 0x4BA0003E general purpose interpolation */
471
+ /* GPL 5 0x4BAn003E general purpose interpolation */
435
472
  .macro gpl sf
436
- .word 0x4BA0003E | (\\sf & 0x1) << 19
473
+ cop2op 0x1A, 0x3E, sf = \\sf
437
474
  .endm
438
475
 
439
476
 
@@ -442,284 +479,286 @@ def write_gte_macros():
442
479
  /* rtv0 - 0x4A486012 v0 * rotmatrix */
443
480
  .macro rtv0
444
481
  # .word 0x4A486012
445
- MVMVA 1, 0, 0, 3, 0
482
+ mvmva 1, 0, 0, 3, 0
446
483
  .endm
447
484
 
448
485
  /* rtv1 - 0x4A48E012 v1 * rotmatrix */
449
486
  .macro rtv1
450
487
  # .word 0x4A48E012
451
- MVMVA 1, 0, 1, 3, 0
488
+ mvmva 1, 0, 1, 3, 0
452
489
  .endm
453
490
 
454
491
  /* rtv2 - 0x4A496012 v2 * rotmatrix */
455
492
  .macro rtv2
456
493
  # .word 0x4A496012
457
- MVMVA 1, 0, 2, 3, 0
494
+ mvmva 1, 0, 2, 3, 0
458
495
  .endm
459
496
 
460
497
  /* rtir12 - 0x4A49E012 ir * rotmatrix */
461
498
  .macro rtir12
462
499
  # .word 0x4A49E012
463
- MVMVA 1, 0, 3, 3, 0
500
+ mvmva 1, 0, 3, 3, 0
464
501
  .endm
465
502
 
466
503
  /* rtir0 - 0x4A41E012 ir * rotmatrix */
467
504
  .macro rtir0
468
505
  # .word 0x4A41E012
469
- MVMVA 0, 0, 3, 3, 0
506
+ mvmva 0, 0, 3, 3, 0
470
507
  .endm
471
508
 
472
509
  /* rtv0tr - 0x4A480012 v0 * rotmatrix + tr vector */
473
510
  .macro rtv0tr
474
511
  # .word 0x4A480012
475
- MVMVA 1, 0, 0, 0, 0
512
+ mvmva 1, 0, 0, 0, 0
476
513
  .endm
477
514
 
478
515
  /* rtv1tr - 0x4A488012 v1 * rotmatrix + tr vector */
479
516
  .macro rtv1tr
480
517
  # .word 0x4A488012
481
- MVMVA 1, 0, 1, 0, 0
518
+ mvmva 1, 0, 1, 0, 0
482
519
  .endm
483
520
 
484
521
  /* rtv2tr - 0x4A490012 v2 * rotmatrix + tr vector */
485
522
  .macro rtv2tr
486
523
  # .word 0x4A490012
487
- MVMVA 1, 0, 2, 0, 0
524
+ mvmva 1, 0, 2, 0, 0
488
525
  .endm
489
526
 
490
527
  /* rtirtr - 0x4A498012 ir * rotmatrix + tr vector */
491
528
  .macro rtirtr
492
529
  # .word 0x4A498012
493
- MVMVA 1, 0, 3, 0, 0
530
+ mvmva 1, 0, 3, 0, 0
494
531
  .endm
495
532
 
496
533
  /* rtv0bk - 0x4A482012 v0 * rotmatrix + bk vector */
497
534
  .macro rtv0bk
498
535
  # .word 0x4A482012
499
- MVMVA 1, 0, 0, 1, 0
536
+ mvmva 1, 0, 0, 1, 0
500
537
  .endm
501
538
 
502
539
  /* rtv1bk - 0x4A48A012 v1 * rotmatrix + bk vector */
503
540
  .macro rtv1bk
504
541
  # .word 0x4A48A012
505
- MVMVA 1, 0, 1, 1, 0
542
+ mvmva 1, 0, 1, 1, 0
506
543
  .endm
507
544
 
508
545
  /* rtv2bk - 0x4A492012 v2 * rotmatrix + bk vector */
509
546
  .macro rtv2bk
510
547
  # .word 0x4A492012
511
- MVMVA 1, 0, 2, 1, 0
548
+ mvmva 1, 0, 2, 1, 0
512
549
  .endm
513
550
 
514
551
  /* rtirbk - 0x4A49A012 ir * rotmatrix + bk vector */
515
552
  .macro rtirbk
516
553
  # .word 0x4A49A012
517
- MVMVA 1, 0, 3, 1, 0
554
+ mvmva 1, 0, 3, 1, 0
518
555
  .endm
519
556
 
520
557
  /* ll - 0x4A4A6412 v0 * light matrix. Lower limit result to 0 */
521
558
  .macro ll
522
559
  # .word 0x4A4A6412
523
- MVMVA 1, 1, 0, 3, 1
560
+ mvmva 1, 1, 0, 3, 1
524
561
  .endm
525
562
 
526
563
  /* llv0 - 0x4A4A6012 v0 * light matrix */
527
564
  .macro llv0
528
565
  # .word 0x4A4A6012
529
- MVMVA 1, 1, 0, 3, 0
566
+ mvmva 1, 1, 0, 3, 0
530
567
  .endm
531
568
 
532
569
  /* llv1 - 0x4A4AE012 v1 * light matrix */
533
570
  .macro llv1
534
571
  # .word 0x4A4AE012
535
- MVMVA 1, 1, 1, 3, 0
572
+ mvmva 1, 1, 1, 3, 0
536
573
  .endm
537
574
 
538
575
  /* llv2 - 0x4A4B6012 v2 * light matrix */
539
576
  .macro llv2
540
577
  # .word 0x4A4B6012
541
- MVMVA 1, 1, 2, 3, 0
578
+ mvmva 1, 1, 2, 3, 0
542
579
  .endm
543
580
 
544
581
  /* llvir - 0x4A4BE012 ir * light matrix */
545
582
  .macro llvir
546
583
  # .word 0x4A4BE012
547
- MVMVA 1, 1, 3, 3, 0
584
+ mvmva 1, 1, 3, 3, 0
548
585
  .endm
549
586
 
550
587
  /* llv0tr - 0x4A4A0012 v0 * light matrix + tr vector */
551
588
  .macro llv0tr
552
589
  # .word 0x4A4A0012
553
- MVMVA 1, 1, 0, 0, 0
590
+ mvmva 1, 1, 0, 0, 0
554
591
  .endm
555
592
 
556
593
  /* llv1tr - 0x4A4A8012 v1 * light matrix + tr vector */
557
594
  .macro llv1tr
558
595
  # .word 0x4A4A8012
559
- MVMVA 1, 1, 1, 0, 0
596
+ mvmva 1, 1, 1, 0, 0
560
597
  .endm
561
598
 
562
599
  /* llv2tr - 0x4A4B0012 v2 * light matrix + tr vector */
563
600
  .macro llv2tr
564
601
  # .word 0x4A4B0012
565
- MVMVA 1, 1, 2, 0, 0
602
+ mvmva 1, 1, 2, 0, 0
566
603
  .endm
567
604
 
568
605
  /* llirtr - 0x4A4B8012 ir * light matrix + tr vector */
569
606
  .macro llirtr
570
607
  # .word 0x4A4B8012
571
- MVMVA 1, 1, 3, 0, 0
608
+ mvmva 1, 1, 3, 0, 0
572
609
  .endm
573
610
 
574
611
  /* llv0bk - 0x4A4A2012 v0 * light matrix + bk vector */
575
612
  .macro llv0bk
576
613
  # .word 0x4A4A2012
577
- MVMVA 1, 1, 0, 1, 0
614
+ mvmva 1, 1, 0, 1, 0
578
615
  .endm
579
616
 
580
617
  /* llv1bk - 0x4A4AA012 v1 * light matrix + bk vector */
581
618
  .macro llv1bk
582
619
  # .word 0x4A4AA012
583
- MVMVA 1, 1, 1, 1, 0
620
+ mvmva 1, 1, 1, 1, 0
584
621
  .endm
585
622
 
586
623
  /* llv2bk - 0x4A4B2012 v2 * light matrix + bk vector */
587
624
  .macro llv2bk
588
625
  # .word 0x4A4B2012
589
- MVMVA 1, 1, 2, 1, 0
626
+ mvmva 1, 1, 2, 1, 0
590
627
  .endm
591
628
 
592
629
  /* llirbk - 0x4A4BA012 ir * light matrix + bk vector */
593
630
  .macro llirbk
594
631
  # .word 0x4A4BA012
595
- MVMVA 1, 1, 3, 1, 0
632
+ mvmva 1, 1, 3, 1, 0
596
633
  .endm
597
634
 
598
635
  /* lc - 0x4A4DA412 v0 * color matrix, Lower limit clamped to 0 */
599
636
  .macro lc
600
637
  # .word 0x4A4DA412
601
- MVMVA 1, 2, 3, 1, 1
638
+ mvmva 1, 2, 3, 1, 1
602
639
  .endm
603
640
 
604
641
  /* lcv0 - 0x4A4C6012 v0 * color matrix */
605
642
  .macro lcv0
606
643
  # .word 0x4A4C6012
607
- MVMVA 1, 2, 0, 3, 0
644
+ mvmva 1, 2, 0, 3, 0
608
645
  .endm
609
646
 
610
647
  /* lcv1 - 0x4A4CE012 v1 * color matrix */
611
648
  .macro lcv1
612
649
  # .word 0x4A4CE012
613
- MVMVA 1, 2, 1, 3, 0
650
+ mvmva 1, 2, 1, 3, 0
614
651
  .endm
615
652
 
616
653
  /* lcv2 - 0x4A4D6012 v2 * color matrix */
617
654
  .macro lcv2
618
655
  # .word 0x4A4D6012
619
- MVMVA 1, 2, 2, 3, 0
656
+ mvmva 1, 2, 2, 3, 0
620
657
  .endm
621
658
 
622
659
  /* lcvir - 0x4A4DE012 ir * color matrix */
623
660
  .macro lcvir
624
661
  # .word 0x4A4DE012
625
- MVMVA 1, 2, 3, 3, 0
662
+ mvmva 1, 2, 3, 3, 0
626
663
  .endm
627
664
 
628
665
  /* lcv0tr - 0x4A4C0012 v0 * color matrix + tr vector */
629
666
  .macro lcv0tr
630
667
  # .word 0x4A4C0012
631
- MVMVA 1, 2, 0, 0, 0
668
+ mvmva 1, 2, 0, 0, 0
632
669
  .endm
633
670
 
634
671
  /* lcv1tr - 0x4A4C8012 v1 * color matrix + tr vector */
635
672
  .macro lcv1tr
636
673
  # .word 0x4A4C8012
637
- MVMVA 1, 2, 1, 0, 0
674
+ mvmva 1, 2, 1, 0, 0
638
675
  .endm
639
676
 
640
677
  /* lcv2tr - 0x4A4D0012 v2 * color matrix + tr vector */
641
678
  .macro lcv2tr
642
679
  # .word 0x4A4D0012
643
- MVMVA 1, 2, 2, 0, 0
680
+ mvmva 1, 2, 2, 0, 0
644
681
  .endm
645
682
 
646
683
  /* lcirtr - 0x4A4D8012 ir * color matrix + tr vector */
647
684
  .macro lcirtr
648
685
  # .word 0x4A4D8012
649
- MVMVA 1, 2, 3, 0, 0
686
+ mvmva 1, 2, 3, 0, 0
650
687
  .endm
651
688
 
652
689
  /* lev0bk - 0x4A4C2012 v0 * color matrix + bk vector */
653
690
  .macro lev0bk
654
691
  # .word 0x4A4C2012
655
- MVMVA 1, 2, 0, 1, 0
692
+ mvmva 1, 2, 0, 1, 0
656
693
  .endm
657
694
 
658
695
  /* lev1bk - 0x4A4CA012 v1 * color matrix + bk vector */
659
696
  .macro lev1bk
660
697
  # .word 0x4A4CA012
661
- MVMVA 1, 2, 1, 1, 0
698
+ mvmva 1, 2, 1, 1, 0
662
699
  .endm
663
700
 
664
701
  /* lev2bk - 0x4A4D2012 v2 * color matrix + bk vector */
665
702
  .macro lev2bk
666
703
  # .word 0x4A4D2012
667
- MVMVA 1, 2, 2, 1, 0
704
+ mvmva 1, 2, 2, 1, 0
668
705
  .endm
669
706
 
670
707
  /* leirbk - 0x4A4DA012 ir * color matrix + bk vector */
671
708
  .macro leirbk
672
709
  # .word 0x4A4DA012
673
- MVMVA 1, 2, 3, 1, 0
710
+ mvmva 1, 2, 3, 1, 0
674
711
  .endm
675
712
 
676
713
  /* sqr12 - 0x4AA80428 square of ir 1,19,12 */
677
714
  # .macro sqr12
678
715
  # # .word 0x4AA80428
679
- # SQR 1
716
+ # sqr 1
680
717
  # .endm
681
718
 
682
- /* sqr0 - 0x4AA80428 square of ir 1,31, 0 */
719
+ /* sqr0 - 0x4AA00428 square of ir 1,31, 0 */
683
720
  # .macro sqr0
684
- # # .word 0x4AA80428
685
- # SQR 1
721
+ # # .word 0x4AA00428
722
+ # sqr 0
686
723
  # .endm
687
724
 
688
725
  /* op12 - 0x4B78000C outer product 1,19,12 */
689
726
  .macro op12
690
727
  # .word 0x4B78000C
691
- OP 1
728
+ op 1
692
729
  .endm
693
730
 
694
731
  /* op0 - 0x4B70000C outer product 1,31, 0 */
695
732
  .macro op0
696
733
  # .word 0x4B70000C
697
- OP 0
734
+ op 0
698
735
  .endm
699
736
 
700
737
  /* gpf12 - 0x4B98003D general purpose interpolation 1,19,12 */
701
738
  .macro gpf12
702
739
  # .word 0x4B98003D
703
- GPF 1
740
+ gpf 1
704
741
  .endm
705
742
 
706
743
  /* gpf0 - 0x4B90003D general purpose interpolation 1,31, 0 */
707
744
  .macro gpf0
708
745
  # .word 0x4B90003D
709
- GPF 0
746
+ gpf 0
710
747
  .endm
711
748
 
712
749
  /* gpl12 - 0x4BA8003E general purpose interpolation 1,19,12 */
713
750
  .macro gpl12
714
751
  # .word 0x4BA8003E
715
- GPL 1
752
+ gpl 1
716
753
  .endm
717
754
 
718
755
  /* gpl0 - 0x4BA0003E general purpose interpolation 1,31, 0 */
719
756
  .macro gpl0
720
757
  # .word 0x4BA0003E
721
- GPL 0
758
+ gpl 0
722
759
  .endm
760
+
761
+ .endif
723
762
  """
724
763
 
725
764
  _write("include/gte_macros.inc", gte_macros)
splat/util/options.py CHANGED
@@ -37,7 +37,12 @@ class SplatOpts:
37
37
  generated_s_preamble: str
38
38
  # Determines any extra content to be added in the generated macro.inc file
39
39
  generated_macro_inc_content: Optional[str]
40
+ # Determines if files related to assembly macros should be regenerated by splat
40
41
  generate_asm_macros_files: bool
42
+ # Changes the definition of the generated `INCLUDE_ASM`.
43
+ # default: The default one.
44
+ # maspsx_hack: Use the maspsx hack workaround definition https://github.com/mkst/maspsx?tab=readme-ov-file#include_asm-reordering-workaround-hack
45
+ include_asm_macro_style: Literal["default", "maspsx_hack"]
41
46
  # Determines whether to use .o as the suffix for all binary files?... TODO document
42
47
  use_o_as_suffix: bool
43
48
  # the value of the $gp register to correctly calculate offset to %gp_rel relocs
@@ -150,6 +155,8 @@ class SplatOpts:
150
155
  ld_generate_symbol_per_data_segment: bool
151
156
  # Sets the default option for the `bss_contains_common` attribute of all segments.
152
157
  ld_bss_contains_common: bool
158
+ # Specify an expression to be used for the `_gp` symbol in the generated linker script instead of a hardcoded value.
159
+ ld_gp_expression: Optional[str]
153
160
 
154
161
  ################################################################################
155
162
  # C file options
@@ -400,6 +407,21 @@ def _parse_yaml(
400
407
  else:
401
408
  raise ValueError(f"Invalid endianness: {endianness}")
402
409
 
410
+ def parse_include_asm_macro_style() -> Literal["default", "maspsx_hack"]:
411
+ include_asm_macro_style = p.parse_opt_within(
412
+ "include_asm_macro_style",
413
+ str,
414
+ ["default", "maspsx_hack"],
415
+ "default",
416
+ )
417
+
418
+ if include_asm_macro_style == "default":
419
+ return "default"
420
+ elif include_asm_macro_style == "maspsx_hack":
421
+ return "maspsx_hack"
422
+ else:
423
+ raise ValueError(f"Invalid endianness: {include_asm_macro_style}")
424
+
403
425
  default_ld_bss_is_noload = True
404
426
  if platform == "psx":
405
427
  default_ld_bss_is_noload = False
@@ -431,6 +453,7 @@ def _parse_yaml(
431
453
  "generated_macro_inc_content", str
432
454
  ),
433
455
  generate_asm_macros_files=p.parse_opt("generate_asm_macros_files", bool, True),
456
+ include_asm_macro_style=parse_include_asm_macro_style(),
434
457
  use_o_as_suffix=p.parse_opt("o_as_suffix", bool, False),
435
458
  gp=p.parse_optional_opt("gp_value", int),
436
459
  check_consecutive_segment_types=p.parse_opt(
@@ -507,6 +530,9 @@ def _parse_yaml(
507
530
  "ld_generate_symbol_per_data_segment", bool, False
508
531
  ),
509
532
  ld_bss_contains_common=p.parse_opt("ld_bss_contains_common", bool, False),
533
+ ld_gp_expression=p.parse_optional_opt_with_default(
534
+ "ld_gp_expression", str, None
535
+ ),
510
536
  create_c_files=p.parse_opt("create_c_files", bool, True),
511
537
  auto_decompile_empty_functions=p.parse_opt(
512
538
  "auto_decompile_empty_functions", bool, True
splat/util/symbols.py CHANGED
@@ -192,6 +192,28 @@ def handle_sym_addrs(
192
192
  if attr_name == "function_owner":
193
193
  sym.function_owner = attr_val
194
194
  continue
195
+ if attr_name == "align":
196
+ align = int(attr_val, 0)
197
+
198
+ if align < 0:
199
+ log.parsing_error_preamble(path, line_num, line)
200
+ log.error(
201
+ f"The given alignment for '{sym.name}' (0x{sym.vram_start:08X}) is negative."
202
+ )
203
+ align_shift = (align & (-align)).bit_length() - 1
204
+ if (1 << align_shift) != align:
205
+ log.parsing_error_preamble(path, line_num, line)
206
+ log.error(
207
+ f"The given alignment '0x{align:X}' for symbol '{sym.name}' (0x{sym.vram_start:08X}) is not a power of two."
208
+ )
209
+ if sym.vram_start % align != 0:
210
+ log.parsing_error_preamble(path, line_num, line)
211
+ log.error(
212
+ f"The symbol '{sym.name}' (0x{sym.vram_start:08X}) is not aligned already to the given alignment '0x{align:X}'."
213
+ )
214
+
215
+ sym.given_align = align
216
+ continue
195
217
  except:
196
218
  log.parsing_error_preamble(path, line_num, line)
197
219
  log.write(
@@ -520,6 +542,8 @@ def add_symbol_to_spim_segment(
520
542
  context_sym.nameEnd = sym.given_name_end
521
543
  if sym.given_visibility:
522
544
  context_sym.visibility = sym.given_visibility
545
+ if sym.given_align:
546
+ context_sym.setAlignment(sym.given_align)
523
547
 
524
548
  return context_sym
525
549
 
@@ -568,6 +592,8 @@ def add_symbol_to_spim_section(
568
592
  context_sym.nameEnd = sym.given_name_end
569
593
  if sym.given_visibility:
570
594
  context_sym.visibility = sym.given_visibility
595
+ if sym.given_align:
596
+ context_sym.setAlignment(sym.given_align)
571
597
 
572
598
  return context_sym
573
599
 
@@ -667,6 +693,8 @@ class Symbol:
667
693
  given_filename: Optional[str] = None
668
694
  given_visibility: Optional[str] = None
669
695
 
696
+ given_align: Optional[int] = None
697
+
670
698
  _generated_default_name: Optional[str] = None
671
699
  _last_type: Optional[str] = None
672
700
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splat64
3
- Version: 0.35.2
3
+ Version: 0.36.1
4
4
  Summary: A binary splitting tool to assist with decompilation and modding projects
5
5
  Project-URL: Repository, https://github.com/ethteck/splat
6
6
  Project-URL: Issues, https://github.com/ethteck/splat/issues
@@ -42,7 +42,7 @@ Requires-Dist: mypy; extra == 'dev'
42
42
  Requires-Dist: n64img>=0.3.3; extra == 'dev'
43
43
  Requires-Dist: pygfxd; extra == 'dev'
44
44
  Requires-Dist: rabbitizer<2.0.0,>=1.12.0; extra == 'dev'
45
- Requires-Dist: spimdisasm<2.0.0,>=1.36.0; extra == 'dev'
45
+ Requires-Dist: spimdisasm<2.0.0,>=1.36.1; extra == 'dev'
46
46
  Requires-Dist: types-colorama; extra == 'dev'
47
47
  Requires-Dist: types-pyyaml; extra == 'dev'
48
48
  Provides-Extra: mips
@@ -50,7 +50,7 @@ Requires-Dist: crunch64<1.0.0,>=0.5.1; extra == 'mips'
50
50
  Requires-Dist: n64img>=0.3.3; extra == 'mips'
51
51
  Requires-Dist: pygfxd; extra == 'mips'
52
52
  Requires-Dist: rabbitizer<2.0.0,>=1.12.0; extra == 'mips'
53
- Requires-Dist: spimdisasm<2.0.0,>=1.36.0; extra == 'mips'
53
+ Requires-Dist: spimdisasm<2.0.0,>=1.36.1; extra == 'mips'
54
54
  Description-Content-Type: text/markdown
55
55
 
56
56
  # splat
@@ -76,7 +76,7 @@ The brackets corresponds to the optional dependencies to install while installin
76
76
  If you use a `requirements.txt` file in your repository, then you can add this library with the following line:
77
77
 
78
78
  ```txt
79
- splat64[mips]>=0.35.2,<1.0.0
79
+ splat64[mips]>=0.36.1,<1.0.0
80
80
  ```
81
81
 
82
82
  ### Optional dependencies
@@ -1,4 +1,4 @@
1
- splat/__init__.py,sha256=plXxTGxbR0ohNAzhonKhmbJtAvjkwe9BvuQc78b0vbI,291
1
+ splat/__init__.py,sha256=DNgsNxB7n0GQjvlsa29pMAyW2yISvkOzadiTCjitUhg,291
2
2
  splat/__main__.py,sha256=T333dHDgr-2HYYhtARnYMEjdECnYiNIKfcXDD99o22A,732
3
3
  splat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  splat/disassembler/__init__.py,sha256=IubLMnm_F5cZ7WUPBfk1VJ7vdj6i1if5GG6RBvEoBEA,226
@@ -6,7 +6,7 @@ splat/disassembler/disassembler.py,sha256=2ynehZRz1P6UnaBk6DWRy4c3ynRnnWApMhf0K9
6
6
  splat/disassembler/disassembler_instance.py,sha256=09GW7QYoNolgE2wnO7ALngw_CxgF-mfyLiXBsyv22jA,916
7
7
  splat/disassembler/disassembler_section.py,sha256=J9jtplQVDVeGBmyEOcMpC3Hv3DyecqaNjlYc7zqEqDI,7459
8
8
  splat/disassembler/null_disassembler.py,sha256=jYuDMtfPiBifwz0H-ZHLMWtpGa19X_iLgy4K-dQhPYY,328
9
- splat/disassembler/spimdisasm_disassembler.py,sha256=raJaya8QVw90mhtISf-atp0fLnc-IkciRbLIVRqdPx4,5920
9
+ splat/disassembler/spimdisasm_disassembler.py,sha256=BPeWrTIla14DtkDl3apHxoMkd26mhkJPJndwSX-MpF0,5920
10
10
  splat/platforms/__init__.py,sha256=qjqKi63k5N3DUdILNfuk6qpJJkVeAWpjAs36L97vvP4,100
11
11
  splat/platforms/n64.py,sha256=kgWr6nesGC0X-qVydmu8tSq48NbqVf9mF6EyqvUuoUM,421
12
12
  splat/platforms/ps2.py,sha256=QI_8Ve43LZeNqpuk8_CFxIqsNJpMTacRHXdZVh3iY6c,336
@@ -14,10 +14,10 @@ splat/platforms/psp.py,sha256=rCr_uf1SuHNaMUXjIC0GyoA_463OQZv0se2KMarWry0,125
14
14
  splat/platforms/psx.py,sha256=YxQERdOBr4p3ab9Wk80FNhVYi-uvmh7p_jeykSFp23M,40
15
15
  splat/scripts/__init__.py,sha256=OY0nHg6a7JB437Sb96qLbZ_7ByVsal1gStj35wJAI_Y,101
16
16
  splat/scripts/capy.py,sha256=svbOfLO34-QN3xLiBy9vk2RGs_To8TWMWEKBw6yx2xQ,3674
17
- splat/scripts/create_config.py,sha256=nWLqbvjZW7LCQsJvvsxEWgnCfN-A_WDwxpV7VlRE-4I,11520
17
+ splat/scripts/create_config.py,sha256=ZQrqdewjR2poVhlvoa0CVZMfr9vnupYGouaAn2MLph4,11783
18
18
  splat/scripts/split.py,sha256=081pZYN34iriEhMmDBDxxLrDkSKkAksHJydzQ0VAEGk,21933
19
19
  splat/segtypes/__init__.py,sha256=-upUw_4JGQtvyp6IfTMzOq_CK3xvVaT_0K0_EipHyOo,208
20
- splat/segtypes/linker_entry.py,sha256=vr8OSC0cnsaNIsePgBMqcHlCLtr2mdZz0jflYT3t3UY,24780
20
+ splat/segtypes/linker_entry.py,sha256=oTpt9Iw9ybrmwrkacyH5RYzj01wGTT7vjeE3xE1Og38,24908
21
21
  splat/segtypes/segment.py,sha256=-wc5xpWMN8AO8S3rrtibJgw0MMk2Dm1lZSI8dQj-H20,30625
22
22
  splat/segtypes/common/__init__.py,sha256=mnq0acScilSCCo6q2PvkDk0Or3V8qitA7I8QMVw8haI,631
23
23
  splat/segtypes/common/asm.py,sha256=k3p4vgbQJP40iyTgQkIci1j3CpKkWksqoWBx2Pb2oh8,703
@@ -44,7 +44,7 @@ splat/segtypes/common/rodatabin.py,sha256=uqp60QuwHwvlMwHq0nZrU3y3yYcHbv2twT0PID
44
44
  splat/segtypes/common/sbss.py,sha256=blIEuVYie4qNEOYMmlSdltn5f4MvgJu3AV8vqVD8Nh4,131
45
45
  splat/segtypes/common/sdata.py,sha256=dnLzNSNtSyclLZiNUmFTv0e0BWN8glxB1km1MSRq6xY,136
46
46
  splat/segtypes/common/segment.py,sha256=vVFyFjs-gS5qIWO8Pd0pMJYxboP-iBRKvxcDV8YxdYM,94
47
- splat/segtypes/common/textbin.py,sha256=kC0m9RDxavpQt2WAYnXQVUzLlIZUvd9hqC3KEz7CUKs,5239
47
+ splat/segtypes/common/textbin.py,sha256=PXEb1JQB2NEqVDLg5KW2vI0NLSqrROJvCOifxB0NUms,5994
48
48
  splat/segtypes/n64/__init__.py,sha256=tf2yWlijeKmOp1OhEEL-aW88mU-mWQRC2lSjQ5Ww1eI,569
49
49
  splat/segtypes/n64/ci.py,sha256=An7wIHcoZ89KiGCKpCRbM7IrmDNYBidXT-6kjKn2vH0,2400
50
50
  splat/segtypes/n64/ci4.py,sha256=ZP8e12CpV8U7r8oLnb9uHc-MkmBbxjXBbJxROFvOjiM,184
@@ -52,7 +52,7 @@ splat/segtypes/n64/ci8.py,sha256=tS4USmp0LuJnP-UlgaOYoxvYxBKgE67wYCz-KeRLlFk,184
52
52
  splat/segtypes/n64/decompressor.py,sha256=YuKo-PS_S2-Ow1Zw8QTO70NWlSYTY79JZN0kUQB7T0U,1779
53
53
  splat/segtypes/n64/gfx.py,sha256=f22_P8aXjQ0PiWf3iLztfERfmvRfDBcA00CBIwKutvw,8395
54
54
  splat/segtypes/n64/header.py,sha256=7Ubmvs49FTK1h4GX58XHOa922bbmjpOJCY3QXvd9078,2018
55
- splat/segtypes/n64/i1.py,sha256=tnYXJxyM802jJ6OFBLJK9FGfWLaMg0UqTqZeascnAxw,213
55
+ splat/segtypes/n64/i1.py,sha256=Mr7YRdKpvuTGu7P5QZPo6PF1XOcVy4W6_zthcRkLKps,204
56
56
  splat/segtypes/n64/i4.py,sha256=wPYCGNa4dQHKf8lbDijSD80_yOt9kQIgOQO6ZOB_pGA,204
57
57
  splat/segtypes/n64/i8.py,sha256=5zqYmpmuXprEzwidVQTknSKqMuu0C1Izk4t5ILoTPf4,204
58
58
  splat/segtypes/n64/ia16.py,sha256=y1uLVuh72HTmyAEK90R67vftp-X4LDgRxgJyU8EAnH0,208
@@ -80,14 +80,14 @@ splat/util/cache_handler.py,sha256=N0SggmvYwh0k-0fngHXoHG1CosC2rCsnlCTDsG8z5aE,1
80
80
  splat/util/color.py,sha256=FSmy0dAQJ9FzRBc99Yt4kBEyB62MC_YiVkqoWgPMsRU,371
81
81
  splat/util/compiler.py,sha256=uXShMm49380ENecSFlsi75LWI45yakWkExZX8NT5pOU,1778
82
82
  splat/util/conf.py,sha256=aM6O2QikosjL95pCxI2FcCxrwDsLP8T8sRf2Uev_Pac,3236
83
- splat/util/file_presets.py,sha256=i7kqRCNJ_LjIY1xnc9pyAh690SAA4-cZPotJL_LnpvM,17425
83
+ splat/util/file_presets.py,sha256=ufSZdeYi3uXos363FmzLfzNMNiTgJq_yMTZAcgRdjw8,18540
84
84
  splat/util/log.py,sha256=aJA1rg8IirJu1wGzjNuATHvepYvD3k5CtEyMasyJWxI,1193
85
- splat/util/options.py,sha256=KqNjeB2mSwuB09H3uylfZ9PU7GlCZDYhkhfCLAGYSQE,30005
85
+ splat/util/options.py,sha256=bXFruGE-tcqsdM0nYNqf_IQIiqxFCxn7NWEo_igOZIc,31252
86
86
  splat/util/palettes.py,sha256=d3KoZnwt-zunI9eNwb3txysXg4DY3xnF0O5aQRxM4so,2920
87
87
  splat/util/progress_bar.py,sha256=41VehpIFK1cphENaXV_Aq6_3mFx25eQ8V7Z51SKFPeM,166
88
88
  splat/util/relocs.py,sha256=rVkPGUXzGZUyY_z7oaCTUxaZH1-lPxxiZwSJvLA0JB0,4156
89
89
  splat/util/statistics.py,sha256=8C88vLW8q4Xd4i1Crz8X24NLoraLyKd0lw3ebbeonSo,1906
90
- splat/util/symbols.py,sha256=CMYn6dQDJJEx6bd6IHai8jnqkRwC3EkLdtvMJWz4AlM,29688
90
+ splat/util/symbols.py,sha256=VNTTTLKQFMx6y1XfmK95cwUzKuAtFPTh-MjxfXbV-aw,31270
91
91
  splat/util/utils.py,sha256=EtuU2f7S3vI8kH9C9KaIpjANsUCUkoFz4VBNLWK9lQY,187
92
92
  splat/util/vram_classes.py,sha256=UH4rkugEwoec_-alJ4smNOcnU51G-V5OG7Pfsj47eaM,3491
93
93
  splat/util/n64/__init__.py,sha256=hsBkPh6NUz-bW7HVspcNZ0mCxBhdfcPC07_7gbga95o,84
@@ -95,8 +95,8 @@ splat/util/n64/find_code_length.py,sha256=uUoPoUORAjsAvH8oGqwnGvw6j8I_NnSrZtA-x9
95
95
  splat/util/n64/rominfo.py,sha256=s13r4pDPH9Mc43ZGpomPnLZPWchhbv0kIjDoM0B3Ong,16963
96
96
  splat/util/psx/__init__.py,sha256=kCCaR-KB1mNlIcXB4OuuSQ2zVLbWg_SnIZIUeyjeBBI,39
97
97
  splat/util/psx/psxexeinfo.py,sha256=MrxY28nes0uzpFmCz0o9JFbF8s1eQRQNOpC_82wsMVI,5725
98
- splat64-0.35.2.dist-info/METADATA,sha256=lsfohLB5MYUUzM3LB-hLB06byuE64aJkO1hCIJ6snw4,3830
99
- splat64-0.35.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
100
- splat64-0.35.2.dist-info/entry_points.txt,sha256=O7Xy-qNOHcI87-OQrWJ-OhRDws74SuwVb_4rtnp0eLo,52
101
- splat64-0.35.2.dist-info/licenses/LICENSE,sha256=97VMVzjG8yQvsf8NG2M9IFSbh7R8cifJnc6QK1cZqj8,1070
102
- splat64-0.35.2.dist-info/RECORD,,
98
+ splat64-0.36.1.dist-info/METADATA,sha256=KinjZck6hH8X_-gX2ZlaaFPquW5GdObwaPS2ltPMNdc,3830
99
+ splat64-0.36.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
100
+ splat64-0.36.1.dist-info/entry_points.txt,sha256=O7Xy-qNOHcI87-OQrWJ-OhRDws74SuwVb_4rtnp0eLo,52
101
+ splat64-0.36.1.dist-info/licenses/LICENSE,sha256=97VMVzjG8yQvsf8NG2M9IFSbh7R8cifJnc6QK1cZqj8,1070
102
+ splat64-0.36.1.dist-info/RECORD,,