Everything here comes from reading the cartridge or from measuring it in openMSX. Anything that is a guess is labelled ASSUMPTION.
0xE016 runs from 1 to 4 and 0xE015 counts twelve rounds. Photographed one by one (medidas/pruebas.txt):
1 110 HURDLERS record 12 SEC 93
2 JAVELIN THROW record 96 M 72
3 HIGH JUMP record 02 M 36
4 1500 METER record 03 min 31
Just as in the sibling cartridge, the fourth reuses the scenery (0x655A) and the scoreboard (0x67C0) of the first, and only the label on the board changes.
The first event's label does not say HURDLES but HURDLERS. It is not the capture: the label at 0x64B1 carries, behind its header byte, the glyph string 0A 01 01 00 0A 12 1E 1B 0E 16 0F 1B 1C 0A, which in the cartridge's font (0x6197) reads " 110 HURDLERS ".
MEASURED in the binary: 0x517B holds 00 12 93 / 00 96 72 / 00 02 36 / 00 03 31, which INIT copies to 0xE040. That is 12.93 s in the 110 hurdles, 96.72 m in the javelin, 2.36 m in the high jump and 3:31 in the 1500 m.
All four are genuine world records. What is not true is that they were the standing records when the cartridge came out, which is what this page used to say:
| event | the cartridge | from when | still standing in 1984? |
|---|---|---|---|
| 110 hurdles | 12.93 | Renaldo Nehemiah, Zurich, August 1981 | yes, and until 1989 |
| javelin | 96.72 | Ferenc Paragi, 1980 | no: Tom Petranoff threw 99.72 in May 1983 |
| high jump | 2.36 | the mark before Zhu Jianhua's 2.37 | no: Zhu Jianhua cleared 2.37 on 11 June 1983 |
| 1500 m | 3:31 | Steve Ovett, 3:31.36, August 1980 | no: Ovett himself took it to 3:30.77 in September 1983 |
Three of the four expired in 1983, and the one that holds is the oldest of them all. Together with what happens in the sibling cartridge, that says the record table of both was compiled before the 1983 season, even though the cartridges were sold in 1984.
The dates do not come from the cartridge but from the published record progressions: they are given as what they are, an outside cross-check. What comes from the cartridge is the figure.
Lining both ROMs up instruction by instruction —with the sixteen-bit operands zeroed, so the addresses do not get in the way— 4,195 of Hyper Olympic 1's 5,032 instructions turn up here too: 83.4 %. Counted in normalised bytes, 6,298 out of 9,872, that is 63.8 % of this cartridge.
What has NO counterpart in the sibling is 2,227 bytes of code, spread over 247 runs. The four largest: the javelin motor (0x682A, 434 bytes), the hurdle jump (0x5A1B, 172), MONTA_LA_VALLA (0x7AB3, 159) and EL_ATLETA_SE_LEVANTA (0x5AD7, 109). The high jump is NOT among them: its motor is the sibling's hammer motor, whole.
A normal actor assembles its figure at 0xE230 and uploads it in one go. The hurdle does not fit in one row: 0x7AB3 assembles the top half at 0xE230 and the bottom half at 0xE270, and uploads them separately, each to its own row of the name table. It is the only actor in the cartridge that does this.
While the athlete is jumping (pose 13, ten frames counted at 0x5A34), 0x5A5B compares his column with the column of the hurdle that is his. If when the jump ends they are less than eight columns apart, bit 4 of 0xE028 or 0xE029 gets set and the athlete falls: 0x5AA5 gives him pose 14, wipes his four speed bytes and gives him 0x14 frames of getting back up.
0x4389 uploads 26 rows of the attribute table (ld bc,01AFEh); in Hyper Olympic 1 the same routine uploaded 32. The pose table is shorter too: 18 entries against 25.
The 51 glyphs at 0x6197 are in order: 0..9, the space, and then the alphabet from A to Y skipping Q, X and Z. With A at index 0x0B, P falls at 0x1A and the next one, at 0x1B, is already R.
And yet the Q exists. It sits at the end, at index 0x2C, outside the alphabet, and the reason is the one word in the game that needs it: the scoreboard's QUALIFY, which at 0x611E is the string 2C 1E 0B 16 13 10 21.
X and Z do not turn up: no word in the cartridge uses them.
The whole sheet is in docs/imagenes/fuente.png, drawn by tools/graficos.py reading the range the listing declares.
Byte for byte, with nothing normalised: the whole font (408 bytes, the same 51 glyphs with no Q, no X and no Z), the eight VDP registers, and the twelve dead bytes at 0x4E64, which nobody reads here either.
The trick Manuel Pazos uncovered —the RC-7xx code and the title in katakana hidden behind the filler at the end of the ROM— does not show up: the last two bytes are 0xFF and in front of them there is sound player code. It was checked with tools/marca_konami.py, which in the same run DOES find it in Pippols.
The routine that counts the time (0x56D7) is the same one as the sibling cartridge's and adds 1.665 hundredths per frame. It was measured over there: on a 50 Hz MSX the game clock advances 0.8325 seconds per real second, and on a 60 Hz one 0.9990.
tools/comun_normalizado.py: it traces both ROMs with their existing disassemblies, decodes the instructions, zeroes the sixteen-bit operands —which are the ones carrying addresses— and looks for common runs. That way a routine reassembled somewhere else DOES show up. Control: Frogger against Time Pilot, already known to share a sound player, gives 667 bytes in 15 runs.
against bytes in common % of Hyper Olympic 2 longest run
------------------- --------------- -------------------- -----------
Hyper Olympic 1 6,298 63.8 % 681 B
Frogger 175 1.8 % 42 B
Super Cobra 173 1.8 % 37 B
Monkey Academy 83 0.8 % 37 B
Konami's Billiards 105 1.1 % 36 B
Athletic Land 78 0.8 % 32 B
Pippols 44 0.4 % 22 B
Time Pilot 21 0.2 % 21 B
The two Hyper Olympics are the same program: the longest run is 681 consecutive bytes (0x7B52 here, 0x7B27 there) — whole routines.
With the other Konami MSX cartridges in the series the difference is two orders of magnitude: none goes past 2 %, and their longest runs go from 21 to 42 bytes. There is no trace of Frogger and Time Pilot's sound player, nor of Athletic Land's framework. They are a THIRD framework, with two members.
Frogger's 42 bytes are the exception worth looking at, and it is noted here: it is more than coincidence gives, and the routine has not been identified.