CMU-800 の仕様

CMU-800 は 1982 年 AMDEK (アムデック株式会社) という会社から発売されました。AMDEK は 1983 年に
RolandDG (ローランド ディー.ジー.株式会社) に社名を変更しました。今ではプロッタープリンタや大型インクジェットプリンタなどを販売しています。



仕様
・6 ボイス (メロディ 1 音、ベース 1 音、コード 4 音 ) の内蔵音源。 (DCO 音源)
・7 音色のリズム
・8 台分のアナログシンセ用 CV/GATE 出力

CMU-800 には 8253 という IC が 2 つ、8255 という IC が 1 つ使用されています。8253 は、内蔵音源の音階の高さを設定できます。ひとつの 8253 が内蔵音源 3 ボイス分、それが 2 つで 6 ボイス分設定できます。8255 は、リズムや設定した音階の発音などを制御します。

それぞれの IC の I/O アドレスは以下のように定義されています。
以下は MZ-2200 での調査結果ですが、MZ-80K、MZ-700、PC-8001でも同じになっているようです。
IC 8253 (1)
90h 出力 チャンネル 1、メロディの音階設定
91h 出力 チャンネル 2、ベースの音階設定
92h 出力 チャンネル 3、コード 1 の音階設定
93h 出力 IC 8253 (1) の設定
IC 8253 (2)
94h 出力 チャンネル 4、コード 2 の音階設定
95h 出力 チャンネル 5、コード 3 の音階設定
96h 出力 チャンネル 6、コード 4 の音階設定
97h 出力 IC 8253 (2) の設定
IC 8255
98h 出力 CV-OUT、TUNE-GATE、KEY ON/OFF の設定
99h 出力 内蔵リズムの設定
9Ah 出力 チャンネルセレクト、設定完了の設定 (下位 4 ビット)
9Ah 入力 タイミング (上位 4 ビット)
9Bh 出力 IC 8255 の設定
※ CMU-800 のシーケンサーソフトでは、チャンネル 7,8 の設定時に音階を 9Ch に書き込みます。しかし、実際は何も起きません。この I/O ポートには、なにも接続されていないようです。

I/O ポート詳細
90h 出力 チャンネル 1 の発音周波数を下位、上位の順番で 16bit 分書き込みます。
内蔵音源にのみ影響し外部機器には影響しません。
91h 出力 チャンネル 2 同上
92h 出力 チャンネル 3 同上
93h 出力 8253 (1) モードコントロール
カウンタモードは演奏中にモード3、停止中にモード0が設定されます。
bit7 SC1 カウンタ選択、コマンド選択 (00:チャンネル1, 01:チャンネル2, 10:チャンネル3
bit6 SC0 ↑
bit5 RW1 カウンタリードライトモード (11:下位,上位の順に読み書き, 00:カウンタラッチ)
bit4 RW0 ↑
bit3 M2 カウンタモード (000:モード0, 010:モード2, 011:モード3)
bit2 M1 ↑
bit1 M0 ↑
bit0 BCD (0:バイナリ, 1:BCDカウント選択)
94h 出力 チャンネル 4 の発音周波数を下位、上位の順番で 16bit 分書き込みます。
内蔵音源にのみ影響し外部機器には影響しません。
95h 出力 チャンネル 5 同上
96h 出力 チャンネル 6 同上
97h 出力 8253 (2) モードコントロール
カウンタモードは演奏中にモード3、停止中にモード0が設定されます。
bit7 SC1 カウンタ選択、コマンド選択 (00:チャンネル4, 01:チャンネル5, 10:チャンネル6
bit6 SC0 ↑
bit5 RW1 カウンタリードライトモード (11:下位,上位の順に読み書き, 00:カウンタラッチ)
bit4 RW0 ↑
bit3 M2 カウンタモード (000:モード0, 010:モード2, 011:モード3)
bit2 M1 ↑
bit1 M0 ↑
bit0 BCD (0:バイナリ, 1:BCDカウント選択)
98h 出力
bit7
bit6

bit0-5
GATE-DATA (0 で発音、1 で消音)
TUNE-GATE (1 だと CHORD の音が出なくなるのかもしれない・・未確認
1にして消音しておいてCHORDを全チャンネル設定して0にすると同時発音できるとか??)
CV-OUT データ (外部端子に出力される、内蔵音源に影響しない)
99h 出力 bit7 BD (バスドラム)
bit6 SD (スネアドラム)
bit5 LT (ロータム)
bit4 HT (ハイタム)
bit3 CY (シンバル)
bit2 OH (オープンハイハット)
bit1 CH (クローズハイハット)
bit0 未使用
1 → 0 になった時に発音する。発音後は 1 に戻さないといけない。
9Ah 出力
bit1-3
bit0
設定するチャンネル (0 ~ 7)
1 → 0 になった時に bit1-3 のチャンネルの設定を反映。反映後は 1 に戻さないといけない
9Ah 入力 bit4-7 CMU-800 のテンポに合わせて 0000b か 1111b に変化する。
9Bh 出力 8255 モードコントロール
通常88h(10001000b)が設定される。
b7 0:ビット単位の書き込み, 1:設定
b6 Reserved (通常0)
b5 Reserved (通常0)
b4 Aポート(98h) 0:出力, 1:入力
b3 Cポート(9Ah)上位4ビット 0:出力, 1:入力
b2 Reserved (通常0)
b1 Bポート(99h) 0:出力, 1:入力
b0 Cポート(9Ah)下位4ビット 0:出力, 1:入力
※ 8253 モードコントロール、8255 モードコントロールについての詳しい仕様はそれぞれの IC の仕様を参照してください。8253 や 8255 はコントロールワードによりいろいろな設定をすることができますが、CMU-800 では固定機能しか使っていません。

8253 に設定する内蔵音源の音階データ表
オクターブ C C+ D D+ E F F+ G G+ A A+ B
0 9741h 8EBEh 86BBh 7F2Eh 780Bh 714Eh 6AEDh 64ECh 5F41h 59E8h 54D9h 5015h
1 4B95h 4754h 4353h 3F8Dh 3BFCh 389Eh 356Eh 326Eh 2F99h 2CEDh 2A66h 2805h
2 25C5h 23A5h 21A5h 1FC3h 1DFBh 1C4Ch 1AB4h 1934h 17CAh 1674h 1531h 1401h
3 12E1h 11D1h 10D1h 0FE1h 0EFDh 0E26h 0D59h 0C99h 0BE4h 0B39h 0A98h 0A00h
4 0970h 08E8h 0868h 07F0h 077Eh 0712h 06ACh 064Ch 05F2h 059Ch 054Ch 0500h
5 04B8h 0474h 0434h 03F8h 03BFh 0389h 0356h 0326h 02F9h 02CEh 02A6h 0280h
6 025Ch 023Ah 021Ah 01FCh 01DFh 01C4h 01ABh 0193h 017Ch 0167h 0153h 0140h
7 012Eh 011Dh 010Dh 00FEh 00F0h 00E2h 00D5h 00C9h 00BEh 00B3h 00A9h 00A0h
8 0097h 008Eh 0086h 007Fh 0078h 0071h 006Ah 0064h 005Fh 0059h 0054h 0050h
9 004Bh 0047h 0043h 003Fh 003Ch

CMU-800初期化プログラム
; CMU-800初期化
; 破壊: A, C, HL
INIT_CMU800 PROC
	LD	HL, IOTBL
INIT_CMU800_LOOP:
	LD	A, (HL)
	INC	HL
	LD	C, (HL)
	INC	HL
	OUT	(C), A
	INC	A
	INC	A
	JR	NZ, INIT_CMU800_LOOP
	DEC	A
	LD	(BGM_PLAYER_DELTA_COUNT), A ; A=255
	RET
IOTBL:
	; CMU-800
	; 8255初期化
	DW	09B88h   ; 8255初期化 (PortABC下位=出力, PortC上位入力)
	; リズム初期化
	DW	099FFh   ; リズム初期化
	; 8253初期化
	DW	09330h   ; 8253(1) CH1 モード設定 バイナリ, カウンタモード0, 下位,上位の順に読み書き
	DW	09370h   ; 8253(1) CH2 モード設定 バイナリ, カウンタモード0, 下位,上位の順に読み書き
	DW	093B0h   ; 8253(1) CH3 モード設定 バイナリ, カウンタモード0, 下位,上位の順に読み書き
	DW	09730h   ; 8253(2) CH4 モード設定 バイナリ, カウンタモード0, 下位,上位の順に読み書き
	DW	09770h   ; 8253(2) CH5 モード設定 バイナリ, カウンタモード0, 下位,上位の順に読み書き
	DW	097B0h   ; 8253(2) CH6 モード設定 バイナリ, カウンタモード0, 下位,上位の順に読み書き
	; CH1消音
	DW	09880h   ; CV=0, 消音
	DW	09A01h   ; CH1選択してbit0を1にする
	DW	09A00h   ; CH1選択してbit0を0にする
	DW	09001h   ; 8253 CH1 発音周波数下位8ビット
	DW	09000h   ; 8253 CH1 発音周波数上位8ビット
	DW	09A01h   ; CH1選択してbit0を1にする
	; CH2消音
	DW	09880h   ; CV=0, 消音
	DW	09A03h   ; CH2選択してbit0を1にする
	DW	09A02h   ; CH2選択してbit0を1にする
	DW	09101h   ; 8253 CH2 発音周波数下位8ビット
	DW	09100h   ; 8253 CH2 発音周波数上位8ビット
	DW	09A03h   ; CH2選択してbit0を1にする
	; CH3消音
	DW	09880h   ; CV=0, 消音
	DW	09A05h   ; CH3選択してbit0を1にする
	DW	09A04h   ; CH3選択してbit0を0にする
	DW	09201h   ; 8253 CH3 発音周波数下位8ビット
	DW	09200h   ; 8253 CH3 発音周波数上位8ビット
	DW	09A05h   ; CH3選択してbit0を1にする
	; CH4消音
	DW	09880h   ; CV=0, 消音
	DW	09A07h   ; CH4選択してbit0を1にする
	DW	09A06h   ; CH4選択してbit0を0にする
	DW	09401h   ; 8253 CH4 発音周波数下位8ビット
	DW	09400h   ; 8253 CH4 発音周波数上位8ビット
	DW	09A07h   ; CH4選択してbit0を1にする
	; CH5消音
	DW	09880h   ; CV=0, 消音
	DW	09A09h   ; CH5選択してbit0を1にする
	DW	09A08h   ; CH5選択してbit0を0にする
	DW	09501h   ; 8253 CH5 発音周波数下位8ビット
	DW	09500h   ; 8253 CH5 発音周波数上位8ビット
	DW	09A09h   ; CH5選択してbit0を1にする
	; CH6消音
	DW	09880h   ; CV=0, 消音
	DW	09A0Bh   ; CH6選択してbit0を1にする
	DW	09A0Ah   ; CH6選択してbit0を0にする
	DW	09601h   ; 8253 CH6 発音周波数下位8ビット
	DW	09600h   ; 8253 CH7 発音周波数上位8ビット
	DW	09A0Bh   ; CH6選択してbit0を1にする
	; CH7消音
	DW	09880h   ; CV=0, 消音
	DW	09A0Dh   ; CH7選択してbit0を1にする
	DW	09A0Ch   ; CH7選択してbit0を0にする
	DW	09C01h   ; 未使用 (ダミーポートへ出力)
	DW	09C00h   ; 未使用 (ダミーポートへ出力)
	DW	09A0Dh   ; CH7選択してbit0を1にする
	; CH8消音
	DW	09880h   ; CV=0, 消音
	DW	09A0Fh   ; CH8選択してbit0を1にする
	DW	09A0Eh   ; CH8選択してbit0を0にする
	DW	09C01h   ; 未使用 (ダミーポートへ出力)
	DW	09C00h   ; 未使用 (ダミーポートへ出力)
	DW	09A0Fh   ; CH8選択してbit0を1にする
	; リズム初期化
	DW	099FEh   ; リズム消音 (bit0は未使用)
ENDP

CMU-800演奏前初期化、発音、消音のプログラム
; 演奏前に1度設定する
; SC1 SC0 = 00  → CH0(8253(1) の CH1)
; RL1 RL0 = 11  → LSB → MSB の順で書く
; MODE    = 011 → Mode 3(矩形波)
; BCD     = 0   → バイナリ
; すべてのチャンネルをMode3の矩形波に設定してLSB→MSBの16bit書き込みに設定する
; 破壊: A
SETUP_CMU800_8253 PROC
	LD	A, 036h
	OUT	(93h), A
	LD	A, 076h
	OUT	(93h), A
	LD	A, 0B6h
	OUT	(93h), A
	LD	A, 036h
	OUT	(97h), A
	LD	A, 076h
	OUT	(97h), A
	LD	A, 0B6h
	OUT	(97h), A
	RET
ENDP

; 発音
; A: 音階, E: チャンネル (0~5)
; 破壊: BC
NOTE_ON_CMU800 PROC
	PUSH	AF
	PUSH	DE
	PUSH	HL
	LD	L, A
	LD	H, 0
	ADD	HL, HL
	LD	BC, NOTE_TABLE
	ADD	HL, BC
	LD	C, (HL)
	INC	HL
	LD	B, (HL)
	; 64未満になるまで12を引く
@@:
	CP	64
	JR	C, @f
	SUB	12
	JR	@b
@@:
	OUT	(098h), A
	LD	A, E
	SLA	A
	OR	1
	OUT	(09Ah), A ; 001h + E(ch) * 2
	DEC	A
	OUT	(09Ah), A ; 000h + E(ch) * 2
	LD	A, C
	; CH毎の周波数設定
	LD	D, 0
	EX	DE, HL
	LD	DE, CMU_800_IO_TABLE
	ADD	HL, DE
	LD	C, (HL)
	OUT	(C), A
	LD	A, B
	OUT	(C), A
	LD	A, 001h
	OUT	(09Ah), A
	POP	HL
	POP	DE
	POP	AF
	RET
ENDP

; 消音
; E: チャンネル (0~5)
; 破壊: なし
NOTE_OFF_CMU800 PROC
	PUSH	AF
	PUSH	DE
	PUSH	HL
	LD	A, 080h
	OUT	(098h), A
	LD	A, E
	SLA	A
	OR	1
	OUT	(09Ah), A	; 001h + E(ch) * 2
	DEC	A
	OUT	(09Ah), A	; 000h + E(ch) * 2
	INC	A
	; CH毎の周波数(消音なので最低値)設定
	LD	D, 0
	EX	DE, HL
	LD	DE, CMU_800_IO_TABLE
	ADD	HL, DE
	LD	C, (HL)
	LD	A, 1
	OUT	(C), A		; 001h
	DEC	A
	OUT	(C), A		; 000h
	INC	A
	OUT	(09Ah), A	; 001h
	POP	HL
	POP	DE
	POP	AF
	RET
ENDP

CMU_800_IO_TABLE:
	DB 90h, 91h, 92h, 94h, 95h, 96h, 9Ch, 9Ch

NOTE_TABLE:
;	   C      C+     D      D+     E      F      F+     G      G+     A      A+     B
	DW 9741h, 8EBEh, 86BBh, 7F2Eh, 780Bh, 714Eh, 6AEDh, 64ECh, 5F41h, 59E8h, 54D9h, 5015h ; O0
	DW 4B95h, 4754h, 4353h, 3F8Dh, 3BFCh, 389Eh, 356Eh, 326Eh, 2F99h, 2CEDh, 2A66h, 2805h ; O1
	DW 25C5h, 23A5h, 21A5h, 1FC3h, 1DFBh, 1C4Ch, 1AB4h, 1934h, 17CAh, 1674h, 1531h, 1401h ; O2
	DW 12E1h, 11D1h, 10D1h, 0FE1h, 0EFDh, 0E26h, 0D59h, 0C99h, 0BE4h, 0B39h, 0A98h, 0A00h ; O3
	DW 0970h, 08E8h, 0868h, 07F0h, 077Eh, 0712h, 06ACh, 064Ch, 05F2h, 059Ch, 054Ch, 0500h ; O4
	DW 04B8h, 0474h, 0434h, 03F8h, 03BFh, 0389h, 0356h, 0326h, 02F9h, 02CEh, 02A6h, 0280h ; O5
	DW 025Ch, 023Ah, 021Ah, 01FCh, 01DFh, 01C4h, 01ABh, 0193h, 017Ch, 0167h, 0153h, 0140h ; O6
	DW 012Eh, 011Dh, 010Dh, 00FEh, 00F0h, 00E2h, 00D5h, 00C9h, 00BEh, 00B3h, 00A9h, 00A0h ; O7
	DW 0097h, 008Eh, 0086h, 007Fh, 0078h, 0071h, 006Ah, 0064h, 005Fh, 0059h, 0054h, 0050h ; O8
	DW 004Bh, 0047h, 0043h, 003Fh, 003Ch                                                  ; O9

感謝
CMU-800 の仕様を作成する際にたくさんの方に協力していただきました。
私が CMU-800 に興味を持つきっかけを与えてくれたM▲M●さん
MZ-2500 に CMU-800 を接続するためのインターフェースボードを作成してくださった Suga さん
使用されている IC、I/O ポートアドレスを教えてくださった、たかさん
CMU-800 の仕様を解明していただいた MZ-ML の皆さん。
EmuZ-2000 用の CMU-800 プラグインを作成するチャンスを下さった EmuZ-2000 さん
EmuZ-2200 CMU-800 MIDI 対応版を作成するきっかけを作って下さった ぽっぽ/目玉P さん
どうもありがとう。

戻る