ATtiny2313を使ってROMエミュレータ
こんなものを試作してみました。
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に入れてみたりもしましたが、症状は改善しませんでした。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!