ここから本文です
Dr.Kikkie (KIKI) : 不許無断天才|免責:本稿を真に受けて損害があっても知らん。

書庫全体表示

記事検索
検索

苦悶式SDカード 2

以前から不思議に思っているのですがね。
レジスタの値の特定のビットを「1」にしたり「0」にしたりするときに、なんで「AND」や「OR」が多用されるんでしょうか?
ちゃんとビット操作用の命令「SET」「RES」があるのに。
 
イメージ 1
 
例えば、PSG#15の初期状態が「11001111B」だったとしますね。いわゆるジョイスティックポートBが使用されている状態。
で、8番端子を「H」にしたいときは「OR 00100000B」とするんでしたっけ。
でも、値がレジスタAに入っているとして「SET 5,A」でもいいんでしょ?
事前に「CS EQU 5」と定義しておけば「SET CS,A」でもいいはず。
 
なんでこだわっているかと言うと、
 CS EQU 5
 CLK EQU 3
 DI EQU 2
と抽象化しておきたいのです。
16進数でANDやORするより、「SET CS,A」のほうが「CSをHにしたな」と分かりやすいでしょ? それに、気が変わって「ジョイスティックポートAを使おう」と思ったり、ピン割り当てを変えようと思ったら、
 CS EQU 4
 CLK EQU 1
 DI EQU 0
などと定義を書き換えるだけで済みます。ANDやORを使っていると、該当箇所を探し出して書き換えないといけません。
とはいえ、端子をひとつずつ制御する前提ですけどね。
「SET」や「RES」では、「OR 00101100B」のように一挙に変更することはできません。
 
実は、愛用の「MSX-DOSスーパーハンドブック」のASM.COMが2進数を扱えないという事情もありましてね。いまだに2進数をパッと16進数に置き換えられないし、ANDだっけ?ORだっけ?と混乱することもあったりして(自爆)
 
あ、そうそう。このASM.COMを愛用する理由をもうひとつ書いておきます。
M80などのアセンブラが信用ならないのです。MSX-DOS(1)版とMSX-DOS2版で挙動が若干違うし、MSX-DOS2版でCOMファイルを作るとリダイレクトやパイプの機能を勝手に付け加えて肥大化しちゃう。
ターミナルソフト「mabterm」で有名な馬淵さんから「それはライブラリの問題で、気に入らなければライブラリに手を入れればいい」と言われちゃいましたが、そんなことできるほど優秀なアタマではありません。アホをバカにしないでください(笑)。
 
それだけではありません。
MSXには「できるだけBIOSを使う」という不文律?があって直接I/Oを叩いていいのはVDPだけとなっています。でもね、PSG関連のBIOS「WRTPSG」の本体部分(1102H〜)を見ると、
 DI
 OUT (PSG.LW),A
 PUSH AF
 LD   A,E
 OUT (PSG.DW),A
 EI
 POP   AF
 RET
ほれほれ、勝手に割り込み許可してRETしてるでしょ!
M80とかMSX-Cとか使ってると、素知らぬ顔してこういうコードを吐き出してくるのです。「だって、BIOSを使うのがキマリだも〜ん。」
こういうのを見ると、MSXのBASIC-ROMを書き換えてやりたくなります。
 
なんか、今日は愚痴ばかりになりました。「私はASM.COMから進化しません!」宣言みたいな部分もw
SDカードアクセスのコーディングに向けて、肩をグルグル回している状態とご理解ください<(_ _)>ペコリ

苦悶式SDカード

クヨクヨ悩んでいても仕方がない。
暫定仕様を考えて、最小限の機能を実装するところから始めよう。
目標は、「ぼくが持っているSDにアクセスできること」。
この時点で、このブログは自分用の利己的なメモと化す(笑)
特徴は、BASICからアクセス可能なことだ。
さっそくアセンブラの数行を書く。歴史的な数行だ(大袈裟なw)。
 
イメージ 1
 
暫定仕様
 ○読むのも書くのも、BASICからのUSR関数で呼び出す。
 ○どのセクターを読み書きするかは、A=USR?(n)の n で指示する。
  n は2バイト整数。
 ○読み書きは、SDで従来から一般的な512B単位とする。
 ○読み書きするデータはBASICがBUFFにアクセスして入出力する。
 ○書き込み後、BASICはSDから読み出してベリファイを行う。
 ○エラーについては、BASICがBUFFに返されたデータを見て判断。
 ○ターゲットはSDのみとする。(MMC非対応)
 ○当面、FATには対応しない。いわばHBI-55モード(笑)。
 
マシン語側の暫定仕様
 ○使用コマンドは、CMD0、ACMD41、CMD17、CMD24、CMD16。
 ○念のため、CMD16によりセクター長を512Bとする。(省略するかも。)
 ○/CSはプログラム側で負論理とする(74HC14を不要とする)。
  不具合があれば、正論理に変更する(74HC14を加える)。
 ○エラーハンドリングは、CMDレスポンスのフォーマットR1のみ。
  CMDレスポンス時のエラーは、1バイトをBUFFに書き込んでRETする。
  書き込み実行時のエラーレスポンスは関知しない。(BASIC任せ)
 ○CMD17の読み込み前にBUFFを初期化する(例えば「00」で埋める)。
  CMD24の書き込み時はBUFFの初期化を行わない。
  BASICは、書き込みエラーをベリファイ時に知ることになる。
 ○SDの容量は関知しない。人間がSDカードの表示を見ろ。
 ○読み書きのセクタ・アドレスは、USR関数の引数の範囲となる。(注)
 
(注)CMD17及びCMD24の引数は4バイトある。
  ただし1セクタ512Bなので、セクタごとの引数は次のようになる。
    引数バイト 3  2  1  0
    セクタ0:00 00 00 00
    セクタ1:00 00 02 00
    セクタ2:00 00 04 00
  つまり引数バイト0は常に「00」である。
  一方、USR関数で与えられる引数は2バイト整数である。
  下位1バイトをセクタ引数1に、上位1バイトをセクタ引数2に割り当てる。
  すると、引数バイト3も常に「00」である。
  従って「00 FF FE 00」が、このプログラムにおける最大引数となる。
  512Bを掛けると、アクセス可能な最大容量となる。いくらになるのかな?
  考え違いしてたらごめんね。このへん、よく間違うの。
  
本質的なところは出来たも同然だ(爆)
あとはこれを実現する実質的な部分をコツコツと書くことになる。
その前に、PSGの初期化、SDカードの初期化、/CSの上げ下げやCLKの上げ下げ、CMDの発行とレスポンスの受け取り、読み取りデータの受け取り、不要CRCの読み捨て、ビジー待ち、ダミーCLKの挿入・・・などなど、細かな段取りをリストアップする必要がある。
PSGの8ピンを「H」にしたり「L」にしたり、なんていうシモジモの原始的ルーチンは、さらにその先にある。
ルーチンを積み上げて積み上げて積み上げてルーチンを作る。
どこかでルーチンがコケたら、「みなコケた〜」。
 
「MSXによるSDカードの読み書きをアセンブラで書く」。ささやかな機能しか実現しないくせに、予想外の大プロジェクトになりそうだなあ〜。
大丈夫か?>自分
 
※上記暫定仕様は、いつの間にか変更されているかも知れません。ご了承されたし。
「成功しました!」と言いつつ、ホンマに成功したんかいな? という疑問がふつふつと。
 
■疑問点(その1)
つじかわさんは、なんでわざわざ/CSの信号をプログラムで反転せず、74HC14で反転したのか?
元の記事を読むと、汎用ポート直結ではうまく動作せず、バッファを入れるとあっさり動いたとのこと。つまり、汎用ポート直結の段階ではプログラムで反転していたと読める。74HC14を入れるために、わざわざプログラムを書き換えたのか?
しかし、74HC14のピンはもうワンセット余っている。プログラムを書き換えなくても、他の信号と同じように2段反転で整形すれば済むのではないか?
余った入力ピンをGNDに落とす手間と余り変わらないように思うのだが?
 
余談ながら、気になる記述を再度引用。
それと今回実験に使用したMSX本体(FS-A1GT)のジョイスティックポートで、妙な挙動を発見しました。
MSXは、PSGレジスタR#15のbit2/3でジョイスティックポートBのトリガA/B出力を設定出来ます。
bit2/3を同時に変化させれば、トリガA/Bが同時に変化する事が期待されます。
ところが実際には、トリガAの方がBよりも必ず600ns程度先に変化するのです。
MSXエンジン(T9769)を使用したMSXで共通なのかも知れません。
 
実は、CQ出版の「フラッシュ・メモリー・カードの徹底研究」(2006年12月)を片手につじかわさんの「mmc_test.com」のアセンブラリストを読んでいるところです。
SPIでは、送信はクロックの立下りで出力、受信はクロックの立上がりで入力するらしい。しかし、同書に掲載されているプログラムを見ると、クロックの立下りと同時にDI出力しています(ええかいな?)。これと同じ調子で、MSXのトリガA/Bで同時にクロック立下りとDI出力すると、トリガBの変化が遅れて誤動作するかもしれません。クロックのこまめな制御が必要となるというお話でした。
 
つじかわさんが選択した汎用ポートのピンへの割り当ては、ふか〜い意味があるのかもしれない。
 
イメージ 1
 
■疑問点(その2)
こっちのほうがより深刻な疑問点かもしれない。
同書によれば、SDカードの初期化に当たっては「CMD0」に続いて、MMCカード用の「CMD1」ではなく、SDカード専用コマンド「ACMD41」を発行しなければならないらしい。SDカードは「CMD1」に対してはレスポンスを返さないと書いてあるよ!
Σ(・□・;)
 
「mmc_test.com」の実験成功!と思っていたが、これには「ACMD41」は使われていない。「CMD1」にレスポンスがないのに正常と判断したのか? たんに実験成功みたいな動作をしたに過ぎないのかもしれない。しかし、レスポンスがないならタイムオーバーエラーになるはずである。SDカードの仕様では「CMD1」にレスポンスしないことになっているが、たまたま使ったSDカードはMMCカードと同じ動作をしたのか?
 
う〜む、なんだか難産が予想されるぞ;;;;
結論から言って、成功しました! のかな?
とにかくも、つじかわさん作の「mmc_test.com」を使って、SHEMの環境下で所定の結果を出すことができました。と、思う。
「ALL DONE」が出れば成功というプログラムですから成功したのでしょう。
 
本当に書き換えられたかどうかは、SDカードをセクター単位で読むユーティリティーを使うべし、だったかな? ハードル高いなあw
 
イメージ 1
 
結局ね、使ったのはサンハヤトの「MM-TXS02 ロジックレベル変換IC付きマイクロSDカードソケットモジュール」と74HC14が一個(1回路のみ)でした。
つじかわさんは、「/CSは一回反転して、他の信号は2回反転して・・・」と書かれてましたが、今回は/CSを一回反転するだけでOKでした。
プログラムを書き換えれば、74HC14の出番はなかったかもしれません。
モジュールが5Vトレラントという安心感が大きかったです。
 
イメージ 2
 
さて、これで終わり、ではないんですよね。始まりです。
つじかわさんの「mmc_test.com」が、まだ理解しきれてないし、これを参考に自在にセクタを読み書きできるようにならないといけません。
パソコンなどで保存したファイルを読み書きするためには、FAT12やFAT16などのファイルシステムへの対応も必要でしょう。
 
当面はあまり欲を出さず、2GBのマイクロSDカードを512B単位のメモリとして、「S○NYデータカートリッジHBI-55」ぽく使ってみることを目標としてみます。もちろん、BASICベースですよ!(・∀・)b
今度は、つじかわさんのmmc_testをマネっ子。
 
参考にさせていただいたのは以前にご紹介した、
 
イメージ 1
 
いかにもアカンっぽい感じですなあ(´∀`)
 
 /CS(MMC-1pin)         : HC14で反転したSTROBE(Joy-8pin)
 DI(MMC-2pin)          : HC14×2段で整形したTrgB(Joy-7pin)
 GND(MMC-3pin)         : GND(Joy-9pin)
 VDD(MMC-4pin)         : 3端子レギュレータからの3.3V
 CLK(MMC-5pin)         : HC14×2段で整形したTrgA(Joy-6pin)
 GND(MMC-6pin)         : GND(Joy-9pin)
 DO(MMC-7pin)          : Up(Joy-1pin)
 ※TrgA/TrgBは470Ωで3.3Vへプルアップ。
 
のとおりにしたつもりじゃけんど、正しく動いているのかどうかすら分からない。
そもそも、高機能モニタ「SHEM」にCOMファイルを読み込んでから実行という環境に当惑しちまっただ。
/CSを反転せずに接続し、DOSから直接コマンドを実行すると「CMD0エラー」が返ってきた。そこまでは正常に動いているらしいw
 
で、とにかくこれではイカンと74HC14の配線を整理するところから始めました。
 
イメージ 2
 
ほれほれ、弱弱しかった6pinも元気になりました。
 
イメージ 3
 
これがそのアレでね。未使用入力ピンはジャンパで外側のGNDに接続できるようにしました。ジャンパの向きを変えて、出力→入力にすると「2段で整形」もできます。パスコンも付いているうえに、5VとGNDの電源ラインも引き出してます。
 
と自慢げに言うてますが、途中、論外な失敗やらかしてました。ICへの5Vの接続を忘れていたのです。いくらやっても6pinは弱弱しいまま。なんでだろうと、いろいろ繋ぎかえてみました。発見もありましたよ。H14って、電源なくても反転出力するんですね。2段で整形もできちゃいます。元気な5V信号突っ込んだら、本体の電源、要らんのとちゃう?
というわけで、小さな基板をウラオモテとひっくり返して見ているうちに、配線漏れを発見して事なきを得ました。
 
H14って、割と好きなICなだけに、実験のたびに未使用ピンの処理やパスコンやいちいち面倒臭いんですよね。一度作っておけば後がラクです。と言いつつ、道具箱に抛り込むと、どこかに行ってしまうのでしょうなあ。
 
あ、そうそう。汎用ポートのアダプタ。大きいピンも挿し込めるのも作りました。
これで、「らめ〜(><;)そんなおっきいの、はいらないよう〜」ということはなくなります(・∀・)v
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

過去の記事一覧

最新のコメント最新のコメント

すべて表示

kik**41010
kik**41010
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ
みんなの更新記事