なんちゃってROM

  • 投稿日:
  • 更新日:2015/03/09
  • by
  • カテゴリ: ,

ATtiny2313を使ってROMエミュレータ

こんなものを試作してみました。

20090407-experiment.PNG

ATtiny2313をROM代わりに使おうというものです。 アドレスバスのピン数の都合で、64バイトまでしかハンドルできません。 あとは全部イメージになりますが、起動時だけなので問題ないでしょう。

やはりスピードがかなり厳しく、(初代)本体からのクロック(15.9744MHz)では間に合いませんでした。

20MHzの水晶でやってみましたが、やはり連続アクセスには難があるようです。 暴走こそしないものの、読み込みデータが抜けたりして、安定しません。

プログラム

AVRのプログラムは今のところ以下のようになっています。

.org	0x0000
	ldi	R_TMP, LOW(RAMEND)
	out	SPL, R_TMP
	eor	R_ZERO, R_ZERO
	ldi	R_FF, 0xff
	ldi	ZH, 0x02 	; data start from 0x0100
	out	DDRD, R_ZERO
	out	PORTD, R_FF
	out	PORTB, R_ZERO
_loop:
	out	DDRB, R_ZERO	;1 4-8clk until PortB output disabled
_wait1:
	;; wait for read request
	sbic	PIND, 6		;1/2
	rjmp	_wait1		;2
	in	ZL, PIND	;1 Z = 0x0200 + PIND (PIND < 0x3f)
	lpm			;3
	out	DDRB, R_FF	;1
	out	PORTB, r0  	;1  8-11clk until data appears on the bus
_wait2:
	;; wait until read request has been cleared
	sbic	PIND, 6		;1/2
	rjmp	_loop		;2
	rjmp	_wait2		;2

	.org	0x0100
	.db	0x41, 0x42, 0x04, 0x40, 0x3e, 0x40, 0xcd, 0x75, 0x10, 0xc9

割 り込みを使うとビットが連続したピンが使えなくなるため、busy loopで待ったほうが速そうなので、そうしています。 なんとかAVR側のプログラムを高速にできないか考えているのですが、これ以上は考え付きませんでした。 プログラムエリアからバイトを読むlpm命令は3クロックもかかりますが、代わりにSRAMから読むにしても2クロック、しかも入力アドレスに0x60を 加算する必要があるので速くなりません。

データバスに3-state bufferをつけてしまえば、ウェイトなしでアドレス入力から垂れ流しができるので十分高速になるとは思いますが。 しかもPD6をアドレス線に使えます。 まぁ、搭載チップがひとつ増えてしまうので、なるべく避けたいところではあります。

ちなみに、どうせCS2がイネーブルになるときはROM読み込みだろうということで、CS2を直接PD6に入れてみたりもしましたが、症状は改善しませんでした。