Konami's Synthesizer

A synthesizer that computes every note sample by sample on the Z80 and plays it through an 8-bit DAC: fourteen waves, sixteen tones, three envelopes, a resonant filter and a 48-key keyboard. All drawn from the ROM, and the sound rebuilt byte for byte.

Konami - (c) Konami 1986 - An RC-741 32 KB cartridge with a DAC - MSX - Dump a2eea29f...

Not one capture here. Every picture is drawn from the bytes of the ROM with the cartridge's own tables: the logos, the title, the seven screens and the sixteen TONE EDITs, and the fourteen waves. Twenty-three screens are checked against openMSX byte for byte, with 0 differences. The sound comes from a rewritten engine that gives the sixteen tones identical to the cartridge's, and what reaches the DAC is checked: 22,273 bytes, 0 different. The listing and the numbers are reproducible with make, and reassembling gives back the ROM byte for byte.

The cartridge in numbers

100%of the binary explained
1,187named routines
43.6%of the listing commented
16,229bytes of code
16,539bytes of data
0bytes unidentified

What turned up when we took it apart

A synthesizer inside the Z80

The cartridge has no sound chip: it has an 8-bit DAC at 0x4000, and the program computes the note sample by sample (0x5767): oscillator, two-stage resonant filter, amplifier, three ADSR envelopes and an LFO.

Measured in openMSX: the rewritten engine gives the sixteen tones byte for byte.

The pitch is a loop of cycles

PLAY sends the sample to the DAC byte by byte and waits between them: every key has one of thirteen routines and a delay D (0x5DA9), and routine r costs 59 + r + 14 × D cycles. One key at a time.

Measured: 254.37 cycles on average at A3, 254 and 255.

The sample lives in the computer's RAM

The cartridge has no RAM: 0x4105 puts the computer's RAM at 0x8000-0xBFFF to synthesize and play, and 0x410D brings the cartridge back to draw.

Measured: A8 = 0xF4 during SYN.

The noise comes from the BIOS

Wave 16 and the LFO's sample and hold read the BIOS ROM from 0x0000 (0x5AD4): tone 14 sounds different on every computer.

From the code.

The DAC starts without a thump

The first interrupt routine (0x4118) only raises the DAC from 0 to 0x80, one step at a time, 129 times, and then hands over the hook.

From the code.

TONE, LAYOUT and SAMP

Three tape files: the sixteen tones with their sixteen waves (4,608 bytes), the note of every key (176) and the sample with its loop page (up to 16 KB).

From the code, and the tape that came with the cartridge confirms it: seven SAMPs.

The second page of the menu

SHIFT changes the menu: copy a tone with its wave, list the sixteen, print the screen and LAYOUT, where every key gets its note.

From the code; these screens are not built.

What nobody calls, and the mark

Ten pieces of code nobody calls, among them a graphics loader driven by a table that does not exist (0x49CD) and three useless ld hl in the envelopes; RC741 86 5 31 at 0xBF62, and Konami's hidden mark at the end: シンセサイザー, RC-741 (Manuel Pazos's format).

What the cartridge draws

Under each picture is where it comes from and what is on it.

The title: the logo (133 tiles from 0x9E97, painted in strokes), PUSH SPACE KEY and the (c) KONAMI 1986 from 0xBE75. Checked against openMSX: 0 differences.
The title: the logo (133 tiles from 0x9E97, painted in strokes), PUSH SPACE KEY and the (c) KONAMI 1986 from 0xBE75. Checked against openMSX: 0 differences.
TONE EDIT with tone 1, EBASS1: the 29 fields drawn from the 32 bytes at 0xA3AA, the digits, the bars and the switches. Checked: 0 differences.
TONE EDIT with tone 1, EBASS1: the 29 fields drawn from the 32 bytes at 0xA3AA, the digits, the bars and the switches. Checked: 0 differences.
The sixteen TONE EDITs, one per factory tone. All sixteen checked: 0 differences.
The sixteen TONE EDITs, one per factory tone. All sixteen checked: 0 differences.
WAVE EDIT with tone 1's user wave, the sine from 0x7200 traced column by column the way 0xB0AB traces it. Checked: 0 differences.
WAVE EDIT with tone 1's user wave, the sine from 0x7200 traced column by column the way 0xB0AB traces it. Checked: 0 differences.
SYN: the drawn keyboard (0x925A), each key's note from the LAYOUT and the synthesis cursor. Checked: 0 differences.
SYN: the drawn keyboard (0x925A), each key's note from the LAYOUT and the synthesis cursor. Checked: 0 differences.
PLAY: the same keyboard with the hand. Checked: 0 differences.
PLAY: the same keyboard with the hand. Checked: 0 differences.
FILE MODE with the factory options, TAPE, SAVE and TONE, and the arrow on OK. Checked: 0 differences.
FILE MODE with the factory options, TAPE, SAVE and TONE, and the arrow on OK. Checked: 0 differences.
The fourteen oscillator waves, 256 signed samples each, from 0x7200 to 0x8000.
The fourteen oscillator waves, 256 signed samples each, from 0x7200 to 0x8000.
The Konami logo uncovered line by line at power-on (0x45B9, 0x4585). Checked: 0 differences.
The Konami logo uncovered line by line at power-on (0x45B9, 0x4585). Checked: 0 differences.