16 KB in page 1, 0x4000–0x7FFF. The AB header declares only INIT, and puts it at 0x409B — the first ten bytes are 41 42 9B 40 00 00 00 00 00 00.
It hooks the interrupt before anything else: it writes a 0xC3 into H.KEYI (0xFD9A) and the address 0x4010 behind it, so the whole game hangs off the interrupt and a static trace cannot reach it on its own. That is why 0x4010 is declared in src/tennis.entries.
Then it clears 0xE000–0xE3FE with an overlapping ldir, leaves the stack just above it, silences the PSG, and loads the VDP's eight registers from the table at 0x45C9.
SCREEN 2, with those eight registers: 02 E2 0E 7F 07 76 03 E1.
R2 = 0x0E name table ............. 0x3800
R3 = 0x7F colours ................ 0x0000
R4 = 0x07 patterns ............... 0x2000
R5 = 0x76 sprite attributes ...... 0x3B00
R6 = 0x03 sprite patterns ........ 0x1800
R3 and R4 are the ones worth care: in SCREEN 2 the TMS9918 reads them as a base bit and a mask, not as an address, so this cartridge ends up with the colour table underneath the pattern table — the reverse of the usual layout.
0x4000 cartridge header
0x4010 interrupt handler
0x409B INIT
0x430F four-bit direction table
0x45C9 the VDP's eight registers
0x45D1 the title screen's tile lists
0x4686 the title screen script
0x489D 35 eight-byte patterns, asked for by index
0x49B5 the court script
0x4FF1 the court's tile list
0x5528 the ball's five sizes
0x5961 58 pose entries, 37 descriptions, 189 patterns
0x6AA7 the shot's effect table
0x6E61 three difficulty curves
0x715D the umpire's three faces
0x763A the match messages and the scores
0x776C the ball boy's five groups
0x7C5D the twelve semitones and 25 tunes
0x7FE9 23 bytes of 0xFF filler
Konami hid its catalogue number and the title in katakana at the end of many of its cartridges — a find by Manuel Pazos (@ManuelPazosMSX). This one does not carry it. All 16,384 positions were scanned with tools/busca_marca_konami.py, a finder first validated against cartridges of the same family that do carry it.