DPCM / PCM decoder

decoder と書いたが言葉の意味が正しいか分からぬ。

パンクショット基板を FPGA 評価ボードにつめこむやつは、今年1月に作ったまま開発が停止していたのだが、個人的事情が改善しつつあるので再開。やはりこれぐらいの気温でないとやる気がしない。

  • 初日はなにをやっていたか思い出して ROM データを flash memory に書き込んだり、 Z80 をいれこんだモジュールをトップモジュールに作成。
  • 2日目は実機で Z80 から 053260 へ write してそこから音を出るのを確認。(プチノイズ混入)
  • 3日目は 053260 と Z80 がアクセスする ROM は本来は別だけど、1つの ROM にまとめるために共有 ROM ゲートを生成。

053260 はシミュレートではきれいな音がでるものの、実機で動かすとプチプチいう。原因はよくわからないが、 DPCM の差分演算時のオーバーフロー処理を対策したが改善せず。ただし、符号付演算や小さいバグをいくらか直せた。オーバーフローに関してはシミュレートや簡易ソフトデコーダでは対処しなくても問題なかったからよくわからん(MAME は対処している)。

jikki.wav / sim.wav / softdecode.wav

共有 ROM に関してはいろいろ問題があってやる気をなくしていたんだが、1つずつ進めて解決していく気になったのでやることにした。これも実機で動かすといいんだけど、テストプログラムを flash memory に書き込むのが面倒なのでやらない。

今後の方針は、INT 端子の調査と実装とか FM 音源コアをつないで、パンクショットのサウンドプログラムを実機で動かす予定。1発で動くと楽だけど、そんなにうまくいかないだろう。でもやらないとね。

テストプログラム

ループ機能はあるのだが、 PCM 再生と Z80 プログラムでの ROM 切り替えの確認のためにわざわざソフトで監視しているのでお間違えなく。

	org	00000h
	di
	im	1
	ld	hl,0fc28h
	ld	(hl),000h
	ld	l,02fh
	ld	(hl),10b
	ld	hl,ch1
	ld	de,0fc08h
	ld	bc,8*4
	ldir
	ld	hl,0fc2ah
	ld	(hl),030h ;7:4 pcm/dpcm 3:0 loop
	ld	l,02ch
	ld	(hl),(4<<3)|4
	ld	l,02dh
	ld	(hl),(4<<3)|4
	ld	l,028h
	ld	(hl),001h ;03: play 2ch
;	halt
readbusy:
	ld	a,(0fc29h)
	cp	0
	jr	nz,readbusy
	ld	hl,ch1
	ld	de,0fc08h
	ld	bc,8
	ldir
	ld	hl,0fc28h
	ld	(hl),0 ;ここは 0->1 にしないと今の設計では鳴らないが、
	ld	(hl),1 ;本物はどうなのか知らない
	jr	readbusy
ch1:
	db	000h,00fh,007h,018h,02fh,027h,002h,07fh
ch2:
	db	000h,00fh,005h,033h,031h,03fh,002h,05fh
	db	000h,000h,000h,000h,000h,000h,000h,000h
	db	000h,000h,000h,000h,000h,000h,000h,000h
ch_end

レジスタを初期化 -> 1ch 再生 -> 再生終了かソフトで監視 -> 再度再生
Z80 の命令はあまりしらないのでいつも適当。