|
昼寝しながらも、コツコツと作業を進めております。
「MSX テクニカル・ハンドブック」や「MSX-DOS スーパーハンドブック」を初め、「BASIC説明書」「Z80マシン語ランド」「フラッシュ・メモリー・カードの徹底研究(以下「フラ研」という)」などなど、書籍たくさん、
MMC/SDCの使いかた
浅草ギ研 A33FでMicroSDカードにアクセスしてみる
などなどWEBもたくさん、参照させていただいてます。
「フラ研」には、SDカードでは初期化コマンドにACMD41を用いないと、MMC用のCMD1ではレスポンスが返ってこないと書いてありますが(149頁)、浅草ギ研さんとこではCMD1を使っておられて、相変わらず困惑している今日この頃です。「フラ研」の別のページでは「MMC用のソフト・ハードでSDにもアクセスできた」と書いてあり(112頁)、本当のところどうなんでしょう?
とりあえず、対応予定のCMDを並べてみました。
CMD0: DEFB 40H,00H,00H,00H,00H,95H
ACMD41: DEFB 69H,00H,00H,00H,00H,95H ↑このふたつは、SDカードのリセットに使います。いまだACMD41を使うべきかCMD1にするか迷い中。実験してから決めます。 CMD16: DEFB 50H,00H,00H,02H,00H,95H
↑このコマンドで、ブロック・サイズを512Bに設定します。2G以上のSDカードでは1024Bのこともあるようです(「フラ研」151頁)。「フラ研」の筆者のひとりは「これまで512B以外は見たことがない」と書いていますが(126頁)、2006年に発行された本なので2G以上のカードがあまり普及していなかったのでしょう。スマートメディアが「最も普及しているメモリ・カード」(11頁)とされる時代でした。 CMD17: DEFB 51H,00H
CMD17H: DEFB 00H CMD17L: DEFB 00H,95H ↑このコマンドは、読み込み時、アクセスするセクタを指定します。「H」と「L」の部分には、USR関数で渡される数値が代入されます。 CMD24: DEFB 58H,00H
CMD24H: DEFB 00H CMD24L: DEFB 00H,95H ↑このコマンドは、書き込み時、アクセスするセクタを指定します。この「H」と「L」の部分も読み込み時と同様です。 CMD59: DEFB 7BH,00H,00H,00H,00H,95H
↑このコマンドは、CRCを明示的に無効にします。SPIモードでは最初のCMD0以外、CRCは無視されるはずですが、「ごくまれにCRCを無視しないカードがある」と「フラ研」に書いてありました(106頁)。CMD0以外のコマンドのCRCが全部「95H」となっていますが意味ありません。
まあ、これぐらいのコマンドに対応しておけば大丈夫でしょう、たぶんw。
で、肝心のSDカードのアクセス部分ですが、
SDINI:;---------
CALL CSH CALL CLK80 CALL CSL RET RDSD:;----------
RET WTSD:;---------- RET まだこれだけしか書けてません。というか、全然書いてないじゃんw
ときどきダミークロックを挟まないといけない(「フラ研」95頁)とか、「CMD0とCMD1の2つのコマンドを発行するあいだはCSはずっとLOWのままのように書いてありますし、SDカードの仕様が書いたドキュメント類を読むとそのようになっているようですが、実際に実験してみた結果、CMD1後にCSをHIGHにして1バイトダミーバイトを送信しないと同期が狂うことがわかりました。よって実際のプログラムではCMD1を何回も発行する前にCS=HIGHにして1バイト送信し、CS=LOWにしてからCMD1を発行しています。(この部分でかなりの時間を消費してしまった。SDカードのドキュメントわかりづらいです。) 」(浅草ギ研さん)とか、いろんな情報が錯綜して現在調査中であります。
つじかわさんの「mmc_test.com」も理解しきれてないし。
以下、現時点でのアセンブラリストとBASICのリストを掲げておきます。現時点では何事も起きず、無事「OK」となります。SDにアクセスしてないもんな。
ここのブログ、別ファイルにて掲載する機能がないし、TABコードを半角スペースに変換するし、なので少し困っています。完成時の公開をどうしようかな? 画像では困るでしょうね。
─────────────────────
■アセンブラリスト(適宜、半角スペースをTABに変換してね。)
;===================
; SDTEST.ASM XCD /B ; KIKI 2014 ;=================== JPORT EQU 6 ;Use JPORT B
CS EQU 5 ;CS =PIN8 CLK EQU 3 ;CLK=PIN7 DIN EQU 2 ;DI =PIN6 DO EQU 0 ;DO =PIN1(#14) ORG 0C000H
MAIN:;----------
CALL SDR ;USR0=0C000H CALL PSGRST RET CALL SDW ;USR1=0C007H CALL PSGRST RET BUFF: DEFS 512 ;BUFF=0C00EH
PSG0: DEFS 1 PSG1: DEFS 1 CMD0: DEFB 40H,00H,00H,00H,00H,95H ACMD41: DEFB 69H,00H,00H,00H,00H,95H CMD16: DEFB 50H,00H,00H,02H,00H,95H CMD17: DEFB 51H,00H CMD17H: DEFB 00H CMD17L: DEFB 00H,95H CMD24: DEFB 58H,00H CMD24H: DEFB 00H CMD24L: DEFB 00H,95H CMD59: DEFB 7BH,00H,00H,00H,00H,95H SDR:;-----------
DI PUSH HL CALL PSGINI CALL SDINI LD A,(BUFF) OR A RET NZ POP HL INC HL INC HL LD A,(HL) LD (CMD17L),A INC HL LD A,(HL) LD (CMD17H),A CALL RDSD EI RET SDW:;-----------
DI PUSH HL CALL PSGINI CALL SDINI LD A,(BUFF) OR A RET NZ POP HL INC HL INC HL LD A,(HL) LD (CMD24L),A INC HL LD A,(HL) LD (CMD24H),A CALL WTSD EI RET PSGINI:;---------
LD A,15 OUT (0A0H),A IN A,(0A2H) LD (PSG0),A PUSH AF LD A,15 OUT (0A0H),A POP AF SET 6,A SET CS,A SET CLK,A SET DIN,A OUT (0A1H),A LD (PSG1),A RET SDINI:;---------
CALL CSH CALL CLK80 CALL CSL RET RDSD:;----------
RET WTSD:;----------
RET ;CS H/L --------
CSH: LD A,15 OUT (0A0H),A LD A,(PSG1) SET CS,A OUT (0A1H),A LD (PSG1),A RET CSL: LD A,15
OUT (0A0H),A LD A,(PSG1) RES CS,A OUT (0A1H),A LD (PSG1),A RET ;CLK H/L --------
CLKH: LD A,15 OUT (0A0H),A LD A,(PSG1) SET CLK,A OUT (0A1H),A LD (PSG1),A RET CLKL: LD A,15
OUT (0A0H),A LD A,(PSG1) RES CLK,A OUT (0A1H),A LD (PSG1),A RET ;DIN H/L --------
DINH: LD A,15 OUT (0A0H),A LD A,(PSG1) SET DIN,A OUT (0A1H),A LD (PSG1),A RET DINL: LD A,15
OUT (0A0H),A LD A,(PSG1) RES DIN,A OUT (0A1H),A LD (PSG1),A RET ;CLOK 80 -------
CLK80: CALL CLKL LD B,80 CLK80L: CALL CLKH CALL CLKL DJNZ CLK80L CALL CLKH RET ;DUMY CLOK 8 -------
DCLK: CALL CLKL LD B,8 DCLK8L: CALL CLKH CALL CLKL DJNZ DCLK8L CALL CLKH RET PSGRST:;--------
LD A,15 OUT (0A0H),A LD A,(PSG0) OUT (0A1H),A RET END
─────────────────────
■BASICリスト(何もなくてごめんね。)
1000 '===============
1010 ' SDTEST.BAS 1020 ' KIKI 2014 1030 '=============== 1040 SAVE "SDTEST.BAS" 1050 CLEAR 100,&HC000 1060 DEFINT A-Z 1070 BLOAD "SDTEST.OBJ" 1080 DEFUSR0=&HC000 1090 DEFUSR1=&HC007 1100 A=USR0(0) 1110 END |
過去の投稿日別表示
-
詳細
2014年12月10日
全1ページ
[1]
コメント(1)
全1ページ
[1]




