build improvements (no binary changes)

This commit is contained in:
4am 2024-06-11 13:58:34 -04:00
parent 0b1e208b9d
commit 45eb343eba
4 changed files with 44 additions and 48 deletions

View File

@ -35,6 +35,7 @@ EXOMIZER=exomizer mem -q -P23 -lnone
BUILDDIR=build
MD=$(BUILDDIR)/make.touch
CADIUS.LOG=$(BUILDDIR)/log
DEMO.SOURCES=$(wildcard src/demo/*.a)
FX.SOURCES=$(wildcard src/fx/*.a)
PRELAUNCH.SOURCES=$(wildcard src/prelaunch/*.a)
@ -109,14 +110,14 @@ TITLE=res/TITLE
$(HDV): $(PROBOOTHD) $(LAUNCHER.SYSTEM) $(PRELAUNCH) $(X) $(TOTAL.DATA) $(TITLE.ANIMATED.SOURCES) $(ICONS) $(FINDER.DATA) $(FINDER.ROOT) $(PREFS.CONF)
cp res/blank.hdv "$@"
cp res/_FileInformation.txt "$(BUILDDIR)"/
$(CADIUS) ADDFILE "$@" "/$(VOLUME)/" "$(LAUNCHER.SYSTEM)" -C >>"$(BUILDDIR)"/log
$(CADIUS) ADDFILE "$@" "/$(VOLUME)/" "$(LAUNCHER.SYSTEM)" -C >> "$(CADIUS.LOG)"
for f in "$(TOTAL.DATA)" "$(PREFS.CONF)" "$(FINDER.DATA)" "$(FINDER.ROOT)"; do \
$(CADIUS) ADDFILE "$@" "/$(VOLUME)/" "$$f" -C >>"$(BUILDDIR)"/log; \
$(CADIUS) ADDFILE "$@" "/$(VOLUME)/" "$$f" -C >> "$(CADIUS.LOG)"; \
done
cp src/prelaunch/_FileInformation.txt "$(PRELAUNCH)"/
for f in res/TITLE.ANIMATED res/ICONS "$(PRELAUNCH)" "$(X)"; do \
rm -f "$$f"/.DS_Store; \
$(CADIUS) ADDFOLDER "$@" "/$(VOLUME)/$$(basename $$f)" "$$f" -C >>"$(BUILDDIR)"/log; \
$(CADIUS) ADDFOLDER "$@" "/$(VOLUME)/$$(basename $$f)" "$$f" -C >> "$(CADIUS.LOG)"; \
done
bin/changebootloader.sh "$@" $(PROBOOTHD)
@touch "$@"
@ -131,13 +132,13 @@ $(GAMES.CONF): $(MD)
awk '!/^$$|^#/' < res/GAMES.CONF | awk -F'/' '{ print $$1 }' > "$@"
# create a list of all game filenames, without metadata or display names, sorted by game filename
$(GAMES.SORTED): $(GAMES.CONF)
$(GAMES.SORTED): | $(MD) $(GAMES.CONF)
awk -F, '/,/ { print $$2 }' < "$(GAMES.CONF)" | awk -F= '{ print $$1 }' | sort > "$@"
# extract files from original disk images and move them to their final directories
$(X): $(GAMES.CONF)
$(X): | $(MD) $(GAMES.CONF)
mkdir -p "$@" "$(BUILDDIR)"/X.INDEXED
$(PARALLEL) '$(CADIUS) EXTRACTVOLUME {} "$@"/ >>"$(BUILDDIR)"/log' ::: res/dsk/*.po
$(PARALLEL) '$(CADIUS) EXTRACTVOLUME {} "$@"/ >> "$(CADIUS.LOG)"' ::: res/dsk/*.po
rm -f "$@"/**/.DS_Store "$@"/**/PRODOS* "$@"/**/LOADER.SYSTEM* "$@"/**/_FileInformation.txt
for f in $$(grep '^....1' "$(GAMES.CONF)" | awk '!/^$$|^#/' | awk -F, '/,/ { print $$2 }' | awk -F= '{ print $$1 }'); do mv "$@"/"$$f"/"$$f"* "$(BUILDDIR)"/X.INDEXED/; rm -rf "$@"/"$$f"; done
(cd "$(BUILDDIR)"/X.INDEXED/ && for f in *; do echo "$$f"; done) > "$(XSINGLE.LIST)"
@ -163,7 +164,7 @@ $(GAMEHELP): $(GAMEHELP.SOURCES) | $(MD)
@touch "$@"
# precompute binary data structures for slideshow configuration files
$(SS): $(SS.SOURCES) | $(MD)
$(SS): $(SS.SOURCES) | $(MD) $(GAMES.CONF)
mkdir -p "$@"
$(PARALLEL) 'bin/buildslideshow.py "{}" "$(GAMES.CONF)" < "{}" > "$@/{/}"' ::: res/SS/*
(cd "$(SS)"/ && for f in *; do echo "$$f"; done) > "$(SS.LIST)"
@ -355,7 +356,7 @@ $(TOTAL.DATA): $(FX) $(PRELAUNCH) $(DEMO) $(SS) $(X) $(ATTRACT) $(ATTRACT.IDX) $
@touch "$@"
# assemble main program
$(LAUNCHER.SYSTEM): $(LAUNCHER.SOURCES) | $(MD)
$(LAUNCHER.SYSTEM): $(LAUNCHER.SOURCES) | $(MD) $(TOTAL.DATA)
$(ACME) -DBUILDNUMBER=`git rev-list --count HEAD` src/4cade.a 2>"$(BUILDDIR)"/relbase.log
$(ACME) -r "$(BUILDDIR)"/4cade.lst -DBUILDNUMBER=`git rev-list --count HEAD` -DRELBASE=`cat "$(BUILDDIR)"/relbase.log | grep "RELBASE =" | cut -d"=" -f2 | cut -d"(" -f2 | cut -d")" -f1` src/4cade.a
@touch "$@"
@ -432,7 +433,7 @@ $(MD):
@$(PARALLEL) --version | grep -q "GNU" || (echo "GNU Parallel is not installed" && exit 1)
@$(PYTHON) --version | grep -q "Python 3" || (echo "Python 3 is not installed" && exit 1)
mkdir -p "$(BUILDDIR)"
touch "$(BUILDDIR)"/log
touch "$(CADIUS.LOG)"
@touch "$@"
clean:

View File

@ -13,7 +13,7 @@
import argparse
import os
import os.path
import struct
from struct import pack
import sys
kStandardFilename = 'STANDARD'
@ -31,7 +31,7 @@ def build(records, args):
output_file_size += standard_size
# yield OKVS header (2 x 2 bytes, unsigned int, little-endian)
yield struct.pack('<2H', len(records), 0)
yield pack('<2H', len(records), 0)
for rec in records:
filename, dummy, dummy = rec.partition('=')
@ -44,14 +44,14 @@ def build(records, args):
# yield record length (1 byte, unsigned byte)
if addr:
# if filename is in the form 'NAME#06ADDR' then create extended index record
yield struct.pack('B', key_length+9)
yield pack('B', key_length+9)
# trim '06' so we get just the starting address
addr = addr[2:]
else:
yield struct.pack('B', key_length+7)
yield pack('B', key_length+7)
# yield key (Pascal-style string)
yield struct.pack(f'{key_length+1}p', key.encode('ascii'))
yield pack(f'{key_length+1}p', key.encode('ascii'))
if os.path.exists(filename):
rec_offset = output_file_size
@ -68,10 +68,10 @@ def build(records, args):
output_file_handle.write(input_file_handle.read())
# yield record offset (3 bytes, big-endian, unsigned long)
yield struct.pack('>L', rec_offset)[1:]
yield pack('>L', rec_offset)[1:]
# yield record size (2 bytes, little-endian, unsigned short)
yield struct.pack('<H', rec_size)
yield pack('<H', rec_size)
if addr:
# for extended index record, yield load address (2 bytes, little-endian, unsigned short)

View File

@ -9,7 +9,7 @@
import argparse
import pprint
import struct
from struct import pack
import sys
gSearchIndex = 0x6000 # must match gSearchIndex in src/constants.a
@ -24,13 +24,12 @@ kHasDHGRTitle = {'0': 0, '1': 128}
kSingleLoad = {'0': 0, '1': 64}
def parse_log_file(filename):
rv = {}
if filename:
with open(filename, 'r') as f:
lines = [x.strip().split(',') for x in f.readlines()]
for title, offset, size in lines:
rv[title] = (int(offset), int(size))
return rv
if not filename:
return {}
with open(filename, 'r') as f:
lines = [x.strip().split(',') for x in f.readlines()]
lines = [(title, (int(offset), int(size))) for title, offset, size in lines]
return dict(lines)
def build(records, args):
# records is [(flags, key, value), (flags, key, value) ...]
@ -55,7 +54,7 @@ def build(records, args):
total_record_size = len("".join([x for xs in records for x in xs[1:]])) + 10*record_count
# yield OKVS header (2 x 2 bytes, unsigned int, little-endian)
yield struct.pack('<2H', record_count, total_record_size + gSearchIndex + 4)
yield pack('<2H', record_count, total_record_size + gSearchIndex + 4)
rec_key_address = gSearchIndex + 5
key_addresses = []
@ -65,35 +64,35 @@ def build(records, args):
rec_key_address += rec_length
# yield record length (1 byte)
yield struct.pack('B', rec_length)
yield pack('B', rec_length)
# yield key (Pascal-style string)
yield struct.pack(f'{len(key)+1}p', key.encode('ascii'))
yield pack(f'{len(key)+1}p', key.encode('ascii'))
# yield value (Pascal-style string)
yield struct.pack(f'{len(value)+1}p', value.encode('ascii'))
yield pack(f'{len(value)+1}p', value.encode('ascii'))
yield struct.pack('B', 1)
yield pack('B', 1)
# yield flags
has_dhgr_title = dhgr_cache and flags[iDHGRTitle] or '0'
yield struct.pack('B', kHasDHGRTitle[has_dhgr_title] + \
yield pack('B', kHasDHGRTitle[has_dhgr_title] + \
kSingleLoad[flags[iSingleLoad]] + \
int(flags[iCheatCategory]))
rec_offset, rec_size = cache_ptr[has_dhgr_title][key]
# yield record offset (3 bytes, big-endian, unsigned long)
yield struct.pack('>L', rec_offset)[1:]
yield pack('>L', rec_offset)[1:]
# yield record size (2 bytes, little-endian, unsigned short)
yield struct.pack('<H', rec_size)
yield pack('<H', rec_size)
# yield lookup table
yield struct.pack(f'<{record_count}H', *key_addresses)
yield pack(f'<{record_count}H', *key_addresses)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Build indexed OKVS structure for search cache")
parser = argparse.ArgumentParser(description="Build indexed OKVS structure for search index")
parser.add_argument("output_game_count_file")
parser.add_argument("input_hgr_log_file")
parser.add_argument("input_dhgr_log_file")

View File

@ -8,7 +8,7 @@
import argparse
import os.path
import struct
from struct import pack
import sys
# indexes into |flags| as string
@ -25,35 +25,31 @@ def build(records, args):
games_list = [x.replace('=',',').split(',')
for x in games_list
if x and x[0] not in ('#', '[')]
games_cache = {}
if os.path.basename(args.slideshow_file).startswith('ACT'):
for flags, key, displayname in games_list:
games_cache[key] = (flags, displayname)
games_cache = dict([(key, (flags, displayname)) for flags, key, displayname in games_list])
else:
for flags, key, dummy in games_list:
games_cache[key] = (flags, "")
games_cache = dict([(key, (flags, '')) for flags, key, displayname in games_list])
# yield OKVS header (2 x 2 bytes, unsigned int, little-endian)
yield struct.pack('<2H', len(records), 0)
yield pack('<2H', len(records), 0)
for key, dummy, value in records:
filename = value or key
flags, displayname = games_cache[filename]
flags, displayname = games_cache[value or key]
# yield record length (1 byte)
yield struct.pack('B', len(key) + len(value) + len(displayname) + 5)
yield pack('B', len(key) + len(value) + len(displayname) + 5)
# yield key (Pascal-style string)
yield struct.pack(f'{len(key)+1}p', key.encode('ascii'))
yield pack(f'{len(key)+1}p', key.encode('ascii'))
# yield value (Pascal-style string)
yield struct.pack(f'{len(value)+1}p', value.encode('ascii'))
yield pack(f'{len(value)+1}p', value.encode('ascii'))
# yield display name (Pascal-style string)
yield struct.pack(f'{len(displayname)+1}p', displayname.encode('ascii'))
yield pack(f'{len(displayname)+1}p', displayname.encode('ascii'))
# yield flags
yield struct.pack('B', kNeedsJoystick[flags[iNeedsJoystick]] + \
yield pack('B', kNeedsJoystick[flags[iNeedsJoystick]] + \
kNeeds128K[flags[iNeeds128K]])
if __name__ == "__main__":