Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*.pyc
*.bin
*.txt
*.log
tetris.lst
tetris.lbl
tetris.map
Expand Down
110 changes: 110 additions & 0 deletions gentas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import argparse
import logging
import pathlib
import sys

logger = logging.getLogger(__name__)
OFFSET=2
INPUT_LETTERS = "RLDUTSBA"
INPUT_VALUES = dict(
right=0x80,
left=0x40,
down=0x20,
up=0x10,
start=0x08,
select=0x04,
b=0x02,
a=0x01,
)


# TASLINE = "|0|........|||"
def get_tas_line(input_byte: int):
result = []
result.extend("|0|")
binary = f"{input_byte & 0xFF:08b}"
for i, char in enumerate(binary):
result.append(INPUT_LETTERS[i] if char == "1" else ".")
result.extend("|||")
return "".join(result)

def main():
parser = argparse.ArgumentParser()
parser.add_argument("frames", type=int, help="length of tas")
parser.add_argument("-f", "--file", type=pathlib.Path, help="output file (stdout otherwise)")
parser.add_argument(
"-R",
"--right",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-L",
"--left",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-D",
"--down",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-U",
"--up",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-T",
"--start",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-S",
"--select",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-B",
"--b",
type=int,
nargs="+",
default=[],
)
parser.add_argument(
"-A",
"--a",
type=int,
nargs="+",
default=[],
)
args = parser.parse_args()

output = bytearray(args.frames)
for label, value in INPUT_VALUES.items():
for frame in vars(args)[label]:
# if frame < OFFSET:
# raise RuntimeError(f"{frame} needs to be less than {OFFSET}")
output[frame+OFFSET] |= value


output = ('\n'.join(get_tas_line(f) for f in output))
if args.file:
with open(args.file, 'w+') as file:
print(output, file=file)
else:
print(output)


if __name__ == "__main__":
main()
25 changes: 25 additions & 0 deletions maketas.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/usr/bin/env bash

mkdir -p tases

for i in {100..2000..100}; do
python gentas.py $i -f tases/no-start-$(printf '%04d' $i).fm2
done

python gentas.py 300 -T 265 -f tases/earliest-start.fm2
python gentas.py 1800 -T 1794 -f tases/latest-start.fm2
python gentas.py 300 -T 265 270 274 286 -f tases/fastest-999999-start.fm2

python gentas.py 500 -T 400 420 440 460 -f tases/start-pattern-a.fm2
python gentas.py 800 -T 700 720 740 -f tases/start-pattern-b.fm2
python gentas.py 1000 -T 900 920 940 -f tases/start-pattern-c.fm2


while read -r -d '' tas; do
clean="${tas%.*}"-clean.log
if ! test -f "$clean"; then
echo $clean not found, running test
time cargo run --release --manifest-path tests/Cargo.toml -- \
parity "$tas" -w
fi
done < <(find tases/ -name "*.fm2" -print0)
14 changes: 14 additions & 0 deletions src/boot.asm
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
lda #$A
sta paceModifier

inc hzFlag
inc inputDisplayFlag
; inc darkModifier

lda #$10
sta dasModifier

Expand Down Expand Up @@ -80,9 +84,19 @@
jsr disableNmi
jsr drawBlackBGPalette
; instead of clearing vram like the original, blank out the palette
; align with vanilla at frame 0004
ldx #$0
ldy #$20
@wait:
dex
bne @wait
dey
bne @wait

lda #$EF
ldx #$04
ldy #$04 ; used to be 5, but we dont need to clear 2p playfield

jsr memset_page
jsr waitForVBlankAndEnableNmi
jsr updateAudioWaitForNmiAndResetOamStaging
Expand Down
Loading