Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
3268ea3
thanks hydrantdude
zohassadar Aug 29, 2025
07b1275
menu
zohassadar Jan 5, 2026
d8bb69a
Merge branch 'master' into menu
zohassadar Jan 24, 2026
d20ff7c
update menu
zohassadar Jan 24, 2026
9e34230
das meter
zohassadar Apr 22, 2026
c7ebab9
Merge remote-tracking branch 'origin/trt' into dasmeter
zohassadar Apr 22, 2026
33bbee0
todo: remove meter after topout
zohassadar Apr 24, 2026
cd135bc
Merge remote-tracking branch 'origin/menu' into combomenu
zohassadar May 20, 2026
6217df1
formatting
zohassadar May 31, 2026
9cb061e
pace & hz
zohassadar May 31, 2026
e50966b
input display & dark mode & flash
zohassadar May 31, 2026
d86bbea
add pride & white palettes
zohassadar May 31, 2026
5999e68
seed works mostly
zohassadar May 31, 2026
dbeac60
broken hard drop features
zohassadar May 31, 2026
c6f182e
Revert "broken hard drop features"
zohassadar Jun 1, 2026
236baae
ghost piece toggle
zohassadar Jun 1, 2026
7e09324
really broken hard drop & ghost
zohassadar Jun 1, 2026
64a7b97
Revert "really broken hard drop & ghost"
zohassadar Jun 1, 2026
15f66d2
invisible
zohassadar Jun 1, 2026
1da7db3
linecap mostly
zohassadar Jun 1, 2026
f4999d5
practiseType populated
zohassadar Jun 2, 2026
a070518
setups
zohassadar Jun 2, 2026
c66f9aa
most things work
zohassadar Jun 2, 2026
bedee1f
Merge remote-tracking branch 'upstream/master' into combomenu
zohassadar Jun 2, 2026
e8ed04c
gamemodestatefix
kirjavascript Jun 3, 2026
7c6f5bf
gamemodestatefix
kirjavascript Jun 3, 2026
af89a93
another mode
zohassadar Jun 3, 2026
9a2ab7a
Merge remote-tracking branch 'upstream/gamemodestatefix' into combomenu
zohassadar Jun 3, 2026
6c5bd34
mirror vert & horiz
zohassadar Jun 3, 2026
b03a92d
no scrolltris
zohassadar Jun 3, 2026
5636edf
tmp fix for strings
zohassadar Jun 3, 2026
645cc25
ghost & harddrop flags work
zohassadar Jun 10, 2026
2491f36
Merge remote-tracking branch 'upstream/master' into combomenu
zohassadar Jun 10, 2026
66e44d7
restore correct harddrop button
zohassadar Jun 10, 2026
d6a7081
mods
zohassadar Jun 10, 2026
d8f7ade
add anydas build flag
zohassadar Jun 10, 2026
9f30e80
anydas is option
zohassadar Jun 10, 2026
1c16f35
add anydas flag
zohassadar Jun 10, 2026
41176bb
Merge remote-tracking branch 'origin/trt' into combomenu
zohassadar Jun 10, 2026
3117674
trt controlled by flag
zohassadar Jun 10, 2026
f6136cc
das meter
zohassadar Jun 10, 2026
8f8c486
das meter flag
zohassadar Jun 10, 2026
7fedc4b
linecap renders good
zohassadar Jun 10, 2026
7dc586a
restore SXTOKL
zohassadar Jun 11, 2026
abf28fd
add todo
zohassadar Jun 11, 2026
4c6be83
shell script to highlight unused variables
zohassadar Jun 11, 2026
ec69a02
Merge branch 'unused_vars' into combomenu
zohassadar Jun 11, 2026
ecab6f5
entry delay should be entry charge
zohassadar Jun 12, 2026
9986fba
fix abss bug
zohassadar Jun 12, 2026
3100d15
instant harddrop
zohassadar Jun 12, 2026
a7c51a8
simpler, faster, supports spaces in filenames
zohassadar Jun 12, 2026
45388de
Merge branch 'unused_vars' into combomenu
zohassadar Jun 12, 2026
11d9fc2
even faster
zohassadar Jun 12, 2026
52b75d3
Merge branch 'unused_vars' into combomenu
zohassadar Jun 12, 2026
b8413c5
rearrange menu, add das options
zohassadar Jun 13, 2026
a95cd3b
embed latest git tag in rom
zohassadar Jun 13, 2026
fdc9a74
crunch separated; rename things; make killx2 & speedtest playable
zohassadar Jun 13, 2026
606080a
remove unnecessary ppuctrl writes
zohassadar Jun 13, 2026
52ba785
Merge remote-tracking branch 'origin/speed_test_bugfix' into combomenu
zohassadar Jun 13, 2026
cf14b3d
hide ghost during entry delay
zohassadar Jun 13, 2026
cef6a94
killx2 starts at level 39
zohassadar Jun 13, 2026
3e827fc
update TODO
zohassadar Jun 13, 2026
31eb5b0
use menu das settings for pal
zohassadar Jun 13, 2026
cc881e6
anydas does not overwrite mode name
zohassadar Jun 13, 2026
dafb493
half completed variables in sram
zohassadar Jun 14, 2026
174df61
update todo
zohassadar Jun 14, 2026
8815dbe
save settings in sram
zohassadar Jun 14, 2026
77f3b79
properly restore tetriminoY
zohassadar Jun 14, 2026
05ef06e
restore no line clear for tap quantity
zohassadar Jun 14, 2026
19d6201
seed affects drought mode
zohassadar Jun 14, 2026
86ff1e6
enabled seed affects checkerboard
zohassadar Jun 14, 2026
4bb7d84
seeded b type
zohassadar Jun 14, 2026
659ad26
Merge remote-tracking branch 'upstream/master' into combomenu
zohassadar Jun 14, 2026
10ce112
fix speedtest exit glitch
zohassadar Jun 14, 2026
b16c41e
custom subroutine, use for goofy toggle
zohassadar Jun 14, 2026
15548a0
update todo
zohassadar Jun 14, 2026
94dfa90
wedge in vars reset into qual mode
zohassadar Jun 14, 2026
34dcb87
zero out menu memory at bootup
zohassadar Jun 14, 2026
9526bd5
nullify r/l inputs for goofy toggle
zohassadar Jun 14, 2026
c117649
don't patch anydas text with b seed
zohassadar Jun 14, 2026
c1c35da
move aligned table to start of rom
zohassadar Jun 14, 2026
a80551b
fix ghost again and save some bytes
zohassadar Jun 15, 2026
4836652
use latest commit for magic numbers
zohassadar Jun 15, 2026
a76c686
better js
zohassadar Jun 15, 2026
5653559
even better
zohassadar Jun 15, 2026
b92c133
arr can be greater than das, das meter adjustments
zohassadar Jun 15, 2026
7bcb29c
adjust js
zohassadar Jun 15, 2026
ef31d5c
original das mechanics work better
zohassadar Jun 16, 2026
815032c
make linter happier
zohassadar Jun 16, 2026
31289d7
simplify menu.js
zohassadar Jun 16, 2026
f234b83
vits scoring
zohassadar Jun 16, 2026
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 @@ -10,6 +10,7 @@ tetris.lst
tetris.lbl
tetris.map
tetris.dbg
src/magicnumbers.asm
release/*
target
.env
15 changes: 15 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Pending
* lowstack should be option instead of mode
* pressing b on multi page should go to top of page
* rework tests to fit multi mode
* add animation to cursor arrows
* multiple scoreboards
* clear scoreboard individually
* decimal display
* height 6-8 logic can be rearranged to be closer to vanilla

# Bugs
* lowstack & crunch do not work together
* garbage + crunch or floor does not work well
* lowstack line doesn't respond to vert mirror flag
* lowstack nope gets mirrored with horiz mirror flag
26 changes: 26 additions & 0 deletions build.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const { writeFileSync } = require("fs");

console.log('TetrisGYM buildscript');
console.time('build');
Expand All @@ -23,6 +24,7 @@ if (args.includes('-h')) {

-m mapper
-a faster aeppoz + press select to end game
-A build anydas
-s disable highscores/SRAM
-k Famicom Keyboard support
-w force WASM compiler
Expand Down Expand Up @@ -97,6 +99,13 @@ if (args.includes('--')) {

console.log();

// build menu
if (!args.includes('-M')) {
console.time('menu');
require('./src/gamemode/gametypemenu/menu');
console.timeEnd('menu');
}

// build / compress nametables

console.time('nametables');
Expand Down Expand Up @@ -158,6 +167,23 @@ const flags = compileFlags.join(' ');

console.time('assemble');

// embed latest commit id as magic number
const magicNumbers = spawnSync("git", ["log", "-1", "--pretty='%H'"])
.stdout.toString()
.trim()
.slice(1, 9)
.toUpperCase()
.match(/../g)
.map((b, i) => `HIGH_SCORE_MAGIC${i} = $${b}`);

const magicNumbersAsm = `; generated by build.js

${magicNumbers.join("\n")}
`;

writeFileSync("src/magicnumbers.asm", magicNumbersAsm);


exec(`${ca65bin} ${flags} -g src/header.asm -o header.o`);
exec(`${ca65bin} ${flags} -l tetris.lst -g src/main.asm -o main.o`);

Expand Down
15 changes: 1 addition & 14 deletions src/boot.asm
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,14 @@
; cpx #0 ; dex sets z flag
bne @loop

; default pace to A
lda #$A
sta paceModifier

lda #$10
sta dasModifier

lda #INITIAL_LINECAP_LEVEL
sta linecapLevel
lda #INITIAL_LINECAP_LINES
sta linecapLines
lda #INITIAL_LINECAP_LINES_1
sta linecapLines+1

jsr resetScores

.if SAVE_HIGHSCORES
jsr detectSRAM
beq @noSRAM
jsr checkSavedInit
jsr copyScoresFromSRAM
jsr copyVarsFromSRAM
@noSRAM:
.endif

Expand Down
Binary file modified src/chr/game_tileset.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
193 changes: 82 additions & 111 deletions src/constants.asm
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.include "magicnumbers.asm"

.ifndef INES_MAPPER ; is set via ca65 flags
INES_MAPPER := 1000 ; 0 (NROM), 1 (MMC1), 3 (CNROM), 4 (MMC3), 5 (MMC5), and 1000 (autodetect 1/3)
.endif
Expand Down Expand Up @@ -31,8 +33,12 @@ SWAP_DUTY_CYCLES := 0 ; counters the duty cycle swap present in some clone conso

INITIAL_CUSTOM_LEVEL := 29
INITIAL_LINECAP_LEVEL := 39
INITIAL_LINECAP_LINES := $30 ; bcd
INITIAL_LINECAP_LINES_1 := 3 ; hex (lol)

; these bytes are currently 2 byte bcd in the menu
; they are swapped and will not work
INITIAL_LINECAP_LINES_LO := $30 ; bcd
INITIAL_LINECAP_LINES_HI := $03 ; bcd (tbd)

BTYPE_START_LINES := $25 ; bcd
MENU_HIGHLIGHT_COLOR := $12 ; $12 in gym, $16 in original
BLOCK_TILES := $7B
Expand All @@ -56,152 +62,117 @@ BUTTON_SELECT := $20
BUTTON_START := $10
BUTTON_DPAD := BUTTON_UP | BUTTON_DOWN | BUTTON_LEFT | BUTTON_RIGHT

RENDER_LINES = $01
RENDER_LEVEL = $02
RENDER_SCORE = $04
RENDER_DEBUG = $08
RENDER_HZ = $10
RENDER_STATS = $40
RENDER_HIGH_SCORE_LETTER = $80
RENDER_LINES := $01
RENDER_LEVEL := $02
RENDER_SCORE := $04
RENDER_DEBUG := $08
RENDER_HZ := $10
RENDER_STATS := $40
RENDER_HIGH_SCORE_LETTER := $80

.enum
MODE_DEFAULT
MODE_TETRIS
MODE_TSPINS
MODE_SEED
MODE_PARITY
MODE_PACE
MODE_PRESETS
MODE_STACKING
MODE_TYPEB
MODE_FLOOR
MODE_CRUNCH
MODE_TAP
MODE_TAPQTY
MODE_TRANSITION
MODE_MARATHON
MODE_TAPQTY
MODE_DROUGHT
MODE_CHECKERBOARD
MODE_GARBAGE
MODE_DROUGHT
MODE_DAS
MODE_LOWSTACK
MODE_KILLX2
MODE_INVISIBLE
MODE_HARDDROP
MODE_ANYDAS
MODE_SPEED_TEST
MODE_SCORE_DISPLAY
MODE_CRASH
MODE_STRICT
MODE_HZ_DISPLAY
MODE_INPUT_DISPLAY
MODE_DISABLE_FLASH
MODE_DISABLE_PAUSE
MODE_DARK
MODE_GOOFY
MODE_DEBUG
MODE_LINECAP
MODE_DASONLY
MODE_QUAL
MODE_PAL
.if KEYBOARD = 1
MODE_KEYBOARD
.endif
.endenum

.if KEYBOARD = 1
MODE_QUANTITY = MODE_KEYBOARD + 1
.else
MODE_QUANTITY = MODE_PAL + 1
.endif
; .endum
; MODE_FLOOR
; MODE_CRUNCH
; MODE_DAS
; MODE_KILLX2
; MODE_INVISIBLE
; MODE_HARDDROP
; MODE_SCORE_DISPLAY
; MODE_CRASH
; MODE_STRICT
; MODE_HZ_DISPLAY
; MODE_INPUT_DISPLAY
; MODE_DISABLE_FLASH
; MODE_DISABLE_PAUSE
; MODE_DARK
; MODE_GOOFY
; MODE_DEBUG
; MODE_LINECAP
; MODE_DASONLY
; MODE_QUAL
; MODE_PAL
; .if KEYBOARD = 1
; MODE_KEYBOARD
; .endif
; .endenum

MODE_GAME_QUANTITY = MODE_HARDDROP + 1
.enum
SCORING_CLASSIC
SCORING_LETTERS
SCORING_SEVENDIGIT
SCORING_FLOAT
SCORING_SCORECAP
SCORING_HIDDEN
.endenum

SCORING_CLASSIC := 0 ; for scoringModifier
SCORING_LETTERS := 1
SCORING_SEVENDIGIT := 2
SCORING_FLOAT := 3
SCORING_SCORECAP := 4
SCORING_HIDDEN := 5
.enum
LINECAP_INACTIVE
LINECAP_KILLX2
LINECAP_FLOOR
LINECAP_INVISIBLE
LINECAP_HALT
.endenum

LINECAP_KILLX2 := 1
LINECAP_FLOOR := 2
LINECAP_INVISIBLE := 3
LINECAP_HALT := 4
.enum
LINECAP_OFF
LINECAP_LEVEL
LINECAP_LINES
.endenum

CRASH_OFF := 0
CRASH_SHOW := 1
CRASH_TOPOUT := 2
CRASH_CRASH := 3
.enum
CRASH_OFF
CRASH_SHOW
CRASH_TOPOUT
CRASH_CRASH
.endenum

LINECAP_WHEN_STRING_OFFSET := $10
LINECAP_HOW_STRING_OFFSET := $12
LINECAP_WHEN_STRING_OFFSET := $FF
LINECAP_HOW_STRING_OFFSET := $2

MENU_SPRITE_Y_BASE := $46
MENU_MAX_Y_SCROLL := $A0
MENU_TOP_MARGIN_SCROLL := 7 ; in blocks

; menuConfigSizeLookup
; menu ram is defined at menuRAM in ./ram.asm
.macro MENUSIZES
.byte $0 ; MODE_TETRIS
.byte $0 ; MODE_TSPINS
.byte $0 ; MODE_SEED
.byte $0 ; MODE_PARITY
.byte $F ; MODE_PACE
.byte $7 ; MODE_PRESETS
.byte $8 ; MODE_TYPEB
.byte $C ; MODE_FLOOR
.byte $F ; MODE_CRUNCH
.byte $20 ; MODE_TAP
.byte $10 ; MODE_TRANSITION
.byte $4 ; MODE_MARATHON
.byte $1F ; MODE_TAPQTY
.byte $8 ; MODE_CHECKERBOARD
.byte $4 ; MODE_GARBAGE
.byte $12 ; MODE_DROUGHT
.byte $10 ; MODE_DAS
.byte $12 ; MODE_LOWSTACK
.byte $0 ; MODE_KILLX2
.byte $0 ; MODE_INVISIBLE
.byte $0 ; MODE_HARDDROP
.byte $0 ; MODE_SPEED_TEST
.byte $5 ; MODE_SCORE_DISPLAY
.byte $3 ; MODE_CRASH
.byte $1 ; MODE_STRICT
.byte $1 ; MODE_HZ_DISPLAY
.byte $1 ; MODE_INPUT_DISPLAY
.byte $1 ; MODE_DISABLE_FLASH
.byte $1 ; MODE_DISABLE_PAUSE
.byte $5 ; MODE_DARK
.byte $1 ; MODE_GOOFY
.byte $1 ; MODE_DEBUG
.byte $1 ; MODE_LINECAP
.byte $1 ; MODE_DASONLY
.byte $1 ; MODE_QUAL
.byte $1 ; MODE_PAL
.if KEYBOARD = 1
.byte $1 ; MODE_KEYBOARD
.endif
.endmacro
NTSC_DAS = 16
NTSC_ARR = 6

PAL_DAS = 12
PAL_ARR = 4

.macro MODENAMES
.byte "TETRIS"
.byte "TSPINS"
.byte " SEED "
.byte "STACKN"
.byte " PACE "
.byte "SETUPS"
.byte "STACKN"
.byte "B-TYPE"
.byte "FLOOR "
.byte "CRUNCH"
.byte "QCKTAP"
.byte "TAPQTY"
.byte "TRNSTN"
.byte "MARTHN"
.byte "TAPQTY"
.byte "LOBARS"
.byte "CKRBRD"
.byte "GARBGE"
.byte "LOBARS"
.byte "DASDLY"
.byte "LOWSTK"
.byte "KILLX2"
.byte "INVZBL"
.byte "HRDDRP"
.byte "ANYDAS"
.endmacro
3 changes: 2 additions & 1 deletion src/gamemode/bootscreen.asm
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ gameMode_bootScreen: ; boot
; reset cursors
lda #$0
sta practiseType
sta menuSeedCursorIndex

; levelMenu stuff
sta levelControlMode
Expand Down Expand Up @@ -33,6 +32,8 @@ gameMode_bootScreen: ; boot
sta gameMode
lda #1
sta qualFlag
jsr resetMenuVars
jsr resetSavedVars
jmp gameMode_waitScreen

@nonQualBoot:
Expand Down
2 changes: 2 additions & 0 deletions src/gamemode/gametypemenu/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
menudata.asm
menuram.asm
Loading