なんちゃってROM(その4)

| | コメント(24) | トラックバック(0)

AVR Tiny2313をROMとして動作させられるかどうか、ここのところ試行しているわけですが。

どうも、20MHz動作でも必ずアクセスが成功するというわけではないようです。 ごく稀にですが、誤動作することがあります。

プログラムは以下のようになっています。

_loop:
	in	ZL, PIND	;1  7bit
	lpm			;3
	out	PORTB, r0  	;1
	rjmp	_loop		;2

ここからアクセス時間が最長になってしまう状況を考えると、こうなります。 すなわち、in命令で得られたデータはまだアドレス確定前で、その直後にアドレス確定、次のinでようやく正しいアドレスが取得できる状況です。 すると、正しいデータが出るまでの最長のクロック数は、以下のようになります。

3(lpm)+1(out)+2(rjmp)+ 1(in)+3(lpm)+1(out) = 11 (clk)

これを20MHzで考えると、1clkあたり50nsなので、550nsということになります。 これは最悪の場合で、通常はここまでかからないのですが。 ただ、プログラムを読んでいるので、一回でも読み間違えれば当然のように誤動作します。

PC-6001で使われているROMのアクセスタイムは、以下のようになっています。

  • BIOS(BASIC) ROM: uPD2364 Max. 450ns (2364-45)
  • Character ROM: uPD2332 Max. 450ns (2332-45)
  • UV-EPROM: uPD2732 Max. 450ns (互換品のHN462732のデータ)

やはりこの時代の製品は450nsあたりが最大のようで、550nsでは間に合わないことがあるようです。

上記のプログラムではrjmpが無駄にクロックを消費しています。 rjmpがなければ最悪でも9clk = 450nsで動作してくれます。 そのため、in~outをたくさん並べれば誤動作の可能性は低くなります。 でもメモリは有限ですからいつかはrjmpで元に戻る必要があるため、絶対誤動作しないとは言い切れません。

誤動作といっても、ごく稀のことなのでこのまま行くか、信頼性を上げるために別の手を考えるか、悩ましいところです。


トラックバック(0)

このブログ記事を参照しているブログ一覧: なんちゃってROM(その4)

このブログ記事に対するトラックバックURL: http://www.markn.org/cgi-bin/mt/mt-tb.cgi/142

コメント(24)

横やりですみません、tiny2313(-20)であれば24MHz程度まで動くのでオーバークロックにて動作させてみるというのはいかがでしょうか。
また数日前の記事にEXT-clockは16MHzまでということが記載されていましたが、2313Vの資料には確かにそうありますが-20のものであれば特に問題はないと思います。
あと、確率の問題に近くなりますがいっそ命令を許容範囲限界まで並べて最後にrjmpという手で逃げる?のはどうでしょうか。

と、ここまで書いてみて思いついたのですがlpmで最初にRAMにコピーしてしまってからループに入ればいいような気がします。lpmがサイクル数長いですし。

釈迦に説法でしたらすみません

なるほど、色々な方法があるのですね〜。
生産という面でみると、規格外の使い方には心配が残りますが。。。
RAM にコピーで速度が稼げれば、それが良いようですね。

と、レス頂いた訳ですが…自分の書いたものを冷静に見直すと穴だらけでしたね。
失礼しました。
元記事にも命令連打は言及されてますし、RAMの開始アドレスが0でないため加算で余分なサイクルがかかるという穴がありました。
大変失礼しましたorz

RAMが0番地(または$80なら)スタートならば使えた手だったんですけど、ちょっとうかつ過ぎでした。
2313以外でRAMが多いモデルを使えるのであれば、有効かもしれません程度に覚えておいてもらえれば幸いです。

コメントありがとうございます。
SRAM領域ではアドレス加算の関係で結局実行時間が同じになってしまうのはわかっていたのでlpmを使っています。
0x80スタートで使えますか? 2313のPIND7は常に0な気がするのですが。
2313を使っているのは安い(100円)からなので変更は難しいと思いますが、EXTCLKで20MHzを入れるのは実験予定です。クリスタルの分のコストが浮きますからね。

スレ汚し失礼続きですが、ご勘弁ください
やはりそうですよね、浅はかな自分が恥ずかしいです。

PORTDのbit7に1を出力しておくとbitは立ちっぱなしになってたような気がしたのですが、実機で確認しないで発言をしていたのであとで確認してみたいと思います。

tiny2313が100円っていうことは秋月での入手を想定されていると考えますけど、mega8で200円とかmega88で250円ですので千とか万という数じゃない限りはそれほど厳しい差額がないようにも思います。
ピン数が増えた分で別な利用法が生まれる可能性もあるかもしれません:)

根本的な対策として^waitをアサートできればZ80のリードサイクルをのばせるので、エラー対策にもそのほうがいいような気がしてきました。
EXT-clockを使われるのであればピンが余るので、と、書いてみていっそ内蔵OSCにしないとピン数足りないかもですね。
リードのアサートがされたことも知らないといけないので、やはり2313ではトリッキーな何かがないと完璧を目指せないのかもしれません。

手元の自作のテスト環境で確認したところPORTDbit7に1を出力しても0が読める仕様っぽいですね、何か別なチップと勘違いしていたようです。
混乱させて申し訳ないです

結局のところ^waitアサートにしてもピン数の制限があったり(^resetピンまで使うならISPのメリットを殺すようなものですし)もう少し私の思考回路の方をチェックしたほうが良いようです;(

> スレ汚し失礼続きですが、ご勘弁ください
とんでもない! いろいろコメントいただいて助かります。
> PORTDbit7に1を出力しても0が読める仕様
PORTはラッチなので、PORTに出力したものはPORTで読めますが、PINには反映しなかったと思います。
> ^waitをアサート
こちらで書きましたが、確かに初代機ではwaitのアサートが有効なのですが、mkII(以降)ではこの機能がカットされてしまっているのです(実機で確認済)。残念。

お心遣い感謝します

P6は初代しか所有してなかったので(本当に初代だったのでマスクROMじゃなくUV-EPROMだった:P)mk2以降までは全く考えてなかったです。
mk2以降で使えない物があったと思ったんですが(カタログに何か互換性表みたいなのがあったように思う)ソレが原因ですかね、当時のICの速度向上を鑑みて削ったんでしょうか。
日電HEなので本体のように厳しい縛りがなかったのかもしれませんね;

ふと、思い出したのでチェックしたら納戸にPC-6006(ROM/RAMカートリッジ)が転がってました。
もう本体も10年以上なく、チェックもしていませんがご迷惑のお詫びに差し上げてもかまいません(何かに有効活用できるかもしれません)、ご入り用でしたら最初のアドレスに受け取り可能な情報を送っていただければお送りします。

をを! PC-6006! 私はいつの間にかなくしてしまったのです。カートリッジはいっぱいある(みな自作 :-)のですが、6006はROMソケットがあるのでとても助かります。
> 最初のアドレス
これがどこだかわからないので、私のメールアドレスを晒します。
アカウント名(markn)に続きアットマーク、このサイトのドメイン名(wwwは外してください)で届きます(わかりにくい書き方ですみません)。
> UV-EPROMだった
ということは、BIOSのソケットが違うのでしょうか(8kBのマスクROMは24ピン、UV-EPROMは28ピン)。だとしたら面白いですね。

もう記憶の彼方ですが、マザーのソケットは同じでした。
(なぜか初期ロット以外のP6も分解したことがあります)
私のUV-EPROM版の方はなんとEPROM自体がピン数が多く、はみ出た部分のピンが折られておりピン自体から自らのいずれかのピンにジャンパが数本張られていたと記憶しています。
当然マスク版と入れ替えても動作していました、内容は全く同じだったと記憶しています。

拡張スロット(カートリッジ拡張)アダプタ(純正で確かFDDのIFもついてた)を電源投入したまま抜き差ししたおバカ(私じゃないよ:P)がいまして、修理のためにバラしてみたら私のものと違っていたという。
確かマザーも私のもののほうが多かった気がします(マスクの方は数本しかなかったが、数十本入ってた)。
P6のカートリッジは電源(カードエッジの)を切れるようにμスイッチが入ってますが、
結構いい加減なタイミングで保護機能としては陳腐でしたね。
本体のドライバICとかすぐ飛ばしてサービス行きが多かったんじゃないでしょうか、当時のICはラッチアップしまくりでしたし。

>確かマザーも私のもののほうが多かった気がします(マスクの方は数本しかなかったが、数十本入ってた)。

主語がぬけております、「マザーのジャンパ線」です。

なるほど。確かにジャンパ線で数本飛ばせば2364として使えますからね。
> 拡張スロット(カートリッジ拡張)アダプタ(純正で確かFDDのIFもついてた)
PC-6011ですね。すごくレアで、オークションでも高値で取引されてますね。
ところでこれって電源は入っているのですか? 本体からの電源供給ではカートリッジ3個とFDD I/Fは厳しいかもしれません。

たしか電源は入ってないです、コネクタと8255とバッファかアドレスデコーダのようなTTLだけ。
同時に使えるのは2個とか取説にあったような気がします:D
なんで3つスロットあるんだよって突っ込んだ覚えがあります。

結局カートリッジは種類がそんなに出なかったので3個同時に挿す必要性も理由も見いだせなかったですね、電源入れたまま抜いた主は3本挿してた気がしましたけど。
拡張BASICカートリッジとROM/RAMカートリッジとあと何か挿してた気がしましたけど、
なんだったかなぁ。6006の出っ張りで苦労してたのは記憶に残ってるんですが;D

シンプルなアドレスからメールが行きませんでしたか?念のため折り返しをお願いします。

あ、突然思い出しました。
音声合成カートリッジかなにかを同時に挿してました、PC-6601が出た時のデモと同じ事ができるという奴だったかと。
歌う事とかできたような気がしましたけどアレって6601mk2とかからでしたっけ?

それにしても6011が高値とか変な時代になりましたね、何個か捨てた気がします(もったいない)。
純正FDDは使わず8031(PC-8001の奴)を2Wに自力改造してたのを繋いだ覚えがありますが、
拡張BASICが使えるならAVRにROM持たせなくても8255エミュレーションっぽいことをすればboot可能なものも作れそうなんですけどね。あーwait無くなったのは本体にFDDのIFつけたからかもしれませんけど。(ってmk2とかってそうじゃなかったかな)

メール返信したんですが届いてませんか? Dynamic DNSからだと撥ねられるかな?
> 8031を2Wに自力改造してたのを繋いだ
こいつはインテリジェントタイプなので繋がるでしょうが、これも高かったですね。最初は確か30万円位したような。
mkII以降はFDD I/F標準装備です。拡張コネクタからwaitやらclkoutやらいろいろ削られたのはそのせいかもしれませんね。
> 拡張BASICが使えるなら
これ自身はただのプログラムなので問題ないのですが、ブートアップ以降はアドレス空間をRAMに開放したいのです。

あれ、もしかしてルータで海外のIPアドレスをばっさりやってるからかもしれません。
別アドレス(gmail.com)からお送りしますね、失礼しました。

なるほど、結局のところこの問題は最初に戻るって感じですね。
最初のbootだけの問題なので、失敗したらリセットってことでお茶を濁す方式で逃げるとか?:d

PC-6001でぐぐったついでにエミュレータを作ってるサイトとかで、信号解析(主に内部なので拡張バスにはそれほど強くない)してるところがありました。
M1サイクルの(Z80のクセですが)リードタイム不足を補う^waitの扱いくらいしかなかったですが、初代とmk2以降とかの信号のやりとりとか見て思うことはmk2以降はカスタムチップ化したせいでかなり初代に見切り(ソフト的な互換以外)をつけてるように感じますね。
おそらくはwait関連は特定のASICの中だけで処理したように思います、その方が設計としては合理化できたんでしょうね。
(初代で直接バスにつなげる)周辺機器が少なかったことが幸いしていたので、そこでの合理化が今まさに直面した問題のように思います;)

> 信号解析
ひょっとしてiP6 for WindowsのMoriyaさんのサイトかな?
私もいろいろなサイトのお世話になっています。
> mk2以降はカスタムチップ化
そうなんですよね。一番困るのは、VDGがMC6847フル互換ではないので、一部の画面モードが使えないことですね。

6847のビデオジェネレータ(当時そう呼んでた気がしますが)ってMSXのVDPもご先祖様にあたるんですよね、mk2出た時にはMSXも2っぽくVDPの上位互換版のヤマハのになってませんでしたっけ。
今なら(PLDとかASICで)MSX/MSX2/PC6x01互換のハードとか作れそうですよね、それはそれでテーマとしては楽しそうですが(自己満足でしかない気もしますけど)。
実機で色々楽しむ方向性のこちらとは目的が違いますね、脱線失礼しました。

信号解析のところは多分そこですね、斜め読みとブックマークしかしませんでしたけれどなかなか頑張ってるところですね。

色々見て回って思うのは、当時私はP6に対する考え方は(PC-8001と8801とかFM-7シリーズとかと)ちょっと違ってほとんどブラックボックスとして楽しんでいた感じがします。
ファミコンやMSX(も同じ扱いだった覚えがします)みたいな感じで、中まで弄ったりそれほどしなかったのでちょっとうらやましい感じがします:D
その分PC-8x01やFMでは色々暴れた:X覚えがありますけど。

> 今なら(PLDとかASICで)MSX/MSX2/PC6x01互換のハードとか
FPGAですね。1chip MSXや1chip 8001もあるので、こういうアプローチも楽しいと思います。規模の大きいゲートアレイは価格も高いのが難点ですが...。
P6erの皆さんは今でもとても活発に活動してらっしゃって、エミュレータや情報提供などとても励みになっています。最近ちょこちょこといじっているだけの私には頭が下がる思いです。
> その分PC-8x01やFMでは色々暴れた
ぜひまた大暴れしてください。;-)

0x100境界から

ldi r0, **
out PORTB, r0
in ZL, PIND
ijmp

をひたすら並べるのはどうでしょうか…と思いましたが、PD0, PD1をGNDに落とさないといけないので、容量32バイトでは使い物になりませんね(^^;

色々考えたネタの中に^CS(^OE)=^RESETっていうのもあったんですけど、これってサイクル数は逆に増えそうだったので思っただけでボツ。
AVRは割り込みと同じ扱いしてそうなので、コード実行に到る最小サイクルだけでリードサイクル終わりそうですが。
他の何かのチップだと使えるかもしれませんけど;d

youkanさんのアイディアも考えたんですが、やはりメモリーが足りなすぎる感じですよね。何かトリックっぽい事をすれば応用はできるかもしれないですけど。


ブートローダを安易に更新可能な方法としてはコストと配線数などで、この方法以上を求めようとすると厳しいですね。単にブートローダーが欲しければいくらでも他に方法ある訳ですしね。
やはりここは無理矢理OC方式かあきらめてリセット方式;dにて。

書き忘れた思いついただけでじっくり思考しなかったネタをもう一つ

ピン変化割り込みを使って(突っ込みは後で;d)やる方法なんですよね。
最初の数サイクルはおそらくまともにデータが出てこないが、実際はbootにまで到るサイクルは数百や数千のアドレスを経過するので問題なし。

;初期化があって
_loop1:
sti
_loop2:
rjmp _loop2

int:
in ZL, PIND
lpm
out PORTB, r0
rjmp _loop1

こんな風に…


PortDは変化割り込みないんですよね、思考中に気がつきボツ:(
それよりも割り込みのレイテンシ(を削るためにretiなしなので)とかスタックで
レジスタまで破壊とかめちゃくちゃですが:D

youkanさんのアイデアは面白いですね。容量はともかく、こんな方法もあるんですね~。
ピン変化割り込みはPD2及びPD3で使えますが、プログラムが実行し始めるまでに最低で4クロック、以前計測したところ5~6クロックもかかるので実用的ではないのです...。

コメントする