SDカードを6809のアセンブラを用いてSPIモードで読み書きしてみました
以前からSDカードに興味がありましたが、難しそうで手を出せずにいました。昨年ですがSPIモードでセンサを読み書きしてみたところ、I2Cよりもかなり簡単だという印象を持ちました。
「6821PIAからアセンブラによるSPI通信でセンサーを制御する(2021年11月3日)」
その経験からSPIモードでのSDカードの読み書きなら割と簡単にできるのではないかと試してみることにしました。
参考にしたのは、いつもお世話になっている中日電工の菱田さんのブログの「[新連載]マイコン独立大作戦「SDカードインターフェースの製作」第1回~第32回」です。いつも貴重な情報をありがとうございます。
ということで、回路はブログ第8回の5V-3.3V変換部をそのまま使わせてもらい、元記事は82C55でコントロールしているのですが、私は6809/6802Dualマイコンに搭載している68B21を使用しました。
実験回路の画像と接続図を示します
画像左に立ててあるのが6809/6802Dualボードで68B21からフラットケーブルで実験回路に接続しています。
 |
実験回路 |
 |
ブロック図 |
68B21のポートAは出力モードのままで入力もできる便利な機能を持っているので、ポートAのみで入出力を行なっています。クロックSCKは1ビット出力のCA2を利用しています。このCA2によるクロックの周波数は私のプログラムではおよそ30.7KHzでした。
5V-3.3Vインターフェースはインバータひとつで構成しているために信号が反転してしまいますのでプログラムの方で考慮します。
秋月電子のSDカードモジュールは5V電源から3.3Vを生成するようになっていますので、インターフェース回路にその3.3Vも供給しています。
プログラム作成
プログラム作成ですが、Windows上で行いました。
Windows上のエディタ(私はEmEditorを使っています)でソースを作成し、それをWindows上で動作する自作の6809クロスアセンブラでアセンブルして、できたmotファイルを6809/6802DualボードのモニタのLコマンドで読み込んで実行します。
その手順を画像で紹介します。
エディタでプログラムリストを作成します。
 |
エディタで作成中 |
できたプログラムをアセンブラに放り込んでアセンブルします。
 |
アセンブル中 |
実行画面でLコマンドを用いてロードします。通常、このロードプログラムの画面は最初に起動するだけで操作する必要はありませんので閉じておきます。
 |
ロードプログラム動作中 |
実行画面です。Lコマンドで読み込み、Gコマンドで実行します。
 |
ロードして実行中 |
プログラムに修正の必要があれば、上記の手順を繰り返します。
実際にSDカードを読み書きできるようになるまでには結構はまってしまう個所もあり、中日電工さんのブログの他に、「えるむ by ChaN」さん、「SDカード」さんや「SDカードの操作」さんのブログなども参考にさせていただきました。ありがとうございます。
とりあえず完成したプログラムですが、SDカードとSDHCカードの両方が読み書きできるものとSDカードのみを読み書きするものの2本立てとしました。
目的としている6809/6802DualボードのFlex9に組み込むためには少しでも短いほうが良いので、SD専用とする予定ですが、折角ですのでSDHCカードも読み書きできることを確かめたという事です。
ここではSD、SDHCカード両用のプログラムのリストを紹介します。SDカード専用版との違いは初期化ルーチンとRead/Writeルーチンのセクタ番号の指定方法の違いのみで、特に初期化ルーチンはSD専用版に比べてかなり複雑です。
- 0001 *
- 0002 * SDHC-RW.TXT
- 0003 *
- 0004 * SD Read/Write on SBC
- 0005 *
- 0006 * 6821(PIA) Port A <--> SD
- 0007 *
- 0008 * SBC SD
- 0009 * CA2 2 --> 16 SCK
- 0010 * PA0 3 --> 15 CS
- 0011 * PA1 4 <-- 7 MISO
- 0012 * PA7 10 --> 20 MOSI
- 0013 * GND 31 -- 10 GND
- 0014 * VCC 33 -- 9 VCC
- 0015 *
- 0016 * cf. all data line is inverted
- 0017 *
- 0018 * PA output mode
- 0019 * CA2 1bit output
- 0020 *
- 0021 * READ/WRITE BUFFER $6600 - 67FF
- 0022 *
- 0023 * Original version '2022.06.11
- 0024 * Copyright by Y.Yamamoto
- 0025 *
- 0026 F800 MON EQU $F800
- 0027 F000 INCHA EQU $F000
- 0028 F002 OUTCHA EQU $F002
- 0029 FAA4 PSTRNG EQU $FAA4
- 0030
- 0031 6600 RWBUF EQU $6600
- 0032
- 0033 F0DC PADAT EQU $F0DC
- 0034 F0DD PACTL EQU PADAT+1
- 0035
- 0036 6000 ORG $6000
- 0037
- 0038 6000 20 07 START BRA MAIN
- 0039 6002 01 VN FCB 1
- 0040 6003 00 SCTN0 FCB 0 top adrs of sct
- 0041 6004 00 SCTN1 FCB 0
- 0042 6005 00 SCTN2 FCB 0
- 0043 6006 00 SCTN3 FCB 0
- 0044 6007 00 RESDAT FCB 0 response data
- 0045 6008 00 SDHC FCB 0 sd:0,sdhc:1
- 0046
- 0047 6009 MAIN EQU *
- 0048 *=====reset pia=====
- 0049 *portA:output
- 0050 6009 86 30 LDA #$30
- 0051 600B B7 F0DD STA PACTL select ddra, ca2:0
- 0052 600E 86 FF LDA #$FF
- 0053 6010 B7 F0DC STA PADAT set output mode
- 0054 6013 86 34 LDA #$34
- 0055 6015 B7 F0DD STA PACTL select peripheral,ca2:0
- 0056
- 0057 *for pia exist check
- 0058 6018 86 55 LDA #$55 test data
- 0059 601A B7 F0DC STA PADAT
- 0060 601D B6 F0DC LDA PADAT
- 0061 6020 81 55 CMPA #$55
- 0062 6022 27 09 BEQ INIT
- 0063 6024 8E 64A0 LDX #MERR
- 0064 6027 BD FAA4 JSR PSTRNG
- 0065 602A 7E F800 JMP MON
- 0066
- 0067 602D INIT EQU *
- 0068 602D 8D 3A BSR SDINIT
- 0069
- 0070 602F MENU EQU *
- 0071 602F BD 6384 JSR CRLF
- 0072 6032 8E 643F LDX #MSMENU
- 0073 6035 BD FAA4 JSR PSTRNG
- 0074
- 0075 6038 BD F000 JSR INCHA
- 0076 603B 81 31 CMPA #'1
- 0077 603D 26 05 BNE MEN2
- 0078 603F 17 0199 LBSR SDRD
- 0079 6042 20 EB BRA MENU
- 0080 6044 81 32 MEN2 CMPA #'2
- 0081 6046 26 05 BNE MEN3
- 0082 6048 17 0208 LBSR SDWRT
- 0083 604B 20 E2 BRA MENU
- 0084 604D 81 33 MEN3 CMPA #'3
- 0085 604F 26 05 BNE MEN4
- 0086 6051 17 0149 LBSR GETSD
- 0087 6054 20 D9 BRA MENU
- 0088 6056 81 34 MEN4 CMPA #'4
- 0089 6058 26 05 BNE MEN5
- 0090 605A 17 000C LBSR SDINIT
- 0091 605D 20 D0 BRA MENU
- 0092 605F 81 39 MEN5 CMPA #'9
- 0093 6061 26 CC BNE MENU
- 0094 6063 BD 6384 JSR CRLF
- 0095 6066 7E F800 JMP MON
- 0096 *
- 0097
- 0098 6069 SDINIT EQU *
- 0099 *---------- start ----------
- 0100 * cs:1,di:1,sck>74ms
- 0101 6069 86 FF LDA #$FF mosi:b7=H,miso:b1=H(for PIA),cs:b0=H
- 0102 606B 43 COMA
- 0103 606C B7 F0DC STA PADAT
- 0104 606F C6 50 LDB #80 80times
- 0105 6071 17 02D5 ISTT LBSR SETCKL
- 0106 6074 17 02DB LBSR SETCKH
- 0107 6077 5A DECB
- 0108 6078 26 F7 BNE ISTT
- 0109 *
- 0110 *---------- cmd 0 ----------
- 0111 607A SCMD0
- 0112 607A 17 02CC LBSR SETCKL
- 0113 607D C6 06 LDB #6
- 0114 607F 8E 6409 LDX #CMD0
- 0115 6082 A6 80 SC01 LDA ,X+
- 0116 6084 43 COMA
- 0117 6085 17 0250 LBSR SNDDAT
- 0118 6088 5A DECB
- 0119 6089 26 F7 BNE SC01
- 0120 *get response
- 0121 608B 5F CLRB
- 0122 608C GR00
- 0123 608C 5A DECB
- 0124 608D 1027 0141 LBEQ SDERR
- 0125 6091 17 0260 LBSR GETDAT
- 0126 6094 B6 6007 LDA RESDAT
- 0127 6097 43 COMA
- 0128 6098 17 02C0 LBSR DSPBIN disp response
- 0129 609B 81 01 CMPA #$01
- 0130 609D 26 ED BNE GR00
- 0131
- 0132 609F BD 6384 JSR CRLF
- 0133 *
- 0134 *---------- cmd 8 ----------
- 0135 60A2 SCMD8
- 0136 60A2 17 02A4 LBSR SETCKL
- 0137 60A5 C6 06 LDB #6
- 0138 60A7 8E 6421 LDX #CMD8
- 0139 60AA A6 80 SC80 LDA ,X+
- 0140 60AC 43 COMA
- 0141 60AD 17 0228 LBSR SNDDAT
- 0142 60B0 5A DECB
- 0143 60B1 26 F7 BNE SC80
- 0144 *get response
- 0145 60B3 GR80
- 0146 60B3 17 023E LBSR GETDAT
- 0147 60B6 B6 6007 LDA RESDAT
- 0148 60B9 43 COMA
- 0149 60BA 17 029E LBSR DSPBIN disp response
- 0150 60BD 81 01 CMPA #$01
- 0151 60BF 26 F2 BNE GR80
- 0152 60C1 C6 04 GR81 LDB #4
- 0153 60C3 17 022E GR82 LBSR GETDAT
- 0154 60C6 B6 6007 LDA RESDAT
- 0155 60C9 43 COMA
- 0156 60CA 17 028E LBSR DSPBIN disp response
- 0157 60CD 5A DECB
- 0158 60CE 26 F3 BNE GR82
- 0159
- 0160 60D0 BD 6384 JSR CRLF
- 0161 *
- 0162 *---------- cmd 58 ----------
- 0163 60D3 SCMD58
- 0164 60D3 17 0273 LBSR SETCKL
- 0165 60D6 C6 06 LDB #6
- 0166 60D8 8E 6427 LDX #CMD58
- 0167 60DB A6 80 SC581 LDA ,X+
- 0168 60DD 43 COMA
- 0169 60DE 17 01F7 LBSR SNDDAT
- 0170 60E1 5A DECB
- 0171 60E2 26 F7 BNE SC581
- 0172 *get response
- 0173 60E4 GR580
- 0174 60E4 17 020D LBSR GETDAT
- 0175 60E7 B6 6007 LDA RESDAT
- 0176 60EA 43 COMA
- 0177 60EB 17 026D LBSR DSPBIN disp response
- 0178 60EE 81 01 CMPA #$01
- 0179 60F0 26 F2 BNE GR580
- 0180 60F2 C6 04 GR581 LDB #4
- 0181 60F4 17 01FD GR582 LBSR GETDAT
- 0182 60F7 B6 6007 LDA RESDAT
- 0183 60FA 43 COMA
- 0184 60FB 17 025D LBSR DSPBIN disp response
- 0185 60FE 5A DECB
- 0186 60FF 26 F3 BNE GR582
- 0187
- 0188 6101 RPT41
- 0189 *---------- cmd 55 ----------
- 0190 6101 SCMD55
- 0191 6101 17 0245 LBSR SETCKL
- 0192 6104 C6 06 LDB #6
- 0193 6106 8E 642D LDX #CMD55
- 0194 6109 A6 80 SC551 LDA ,X+
- 0195 610B 43 COMA
- 0196 610C 17 01C9 LBSR SNDDAT
- 0197 610F 5A DECB
- 0198 6110 26 F7 BNE SC551
- 0199 *get response
- 0200 * CLRB
- 0201 6112 GR550
- 0202 * DECB
- 0203 * BEQ SDERR
- 0204 6112 17 01DF LBSR GETDAT
- 0205 6115 B6 6007 LDA RESDAT
- 0206 6118 43 COMA
- 0207 6119 17 023F LBSR DSPBIN disp response
- 0208 611C 81 01 CMPA #$01
- 0209 611E 26 F2 BNE GR550
- 0210
- 0211 6120 BD 6384 JSR CRLF
- 0212 *---------- acmd 41 ----------
- 0213 6123 ASCMD41
- 0214 6123 17 0223 LBSR SETCKL
- 0215 6126 C6 06 LDB #6
- 0216 6128 8E 6433 LDX #ACMD41
- 0217 612B A6 80 ASC411 LDA ,X+
- 0218 612D 43 COMA
- 0219 612E 17 01A7 LBSR SNDDAT
- 0220 6131 5A DECB
- 0221 6132 26 F7 BNE ASC411
- 0222 *get response
- 0223 6134 GR410
- 0224 6134 17 01BD LBSR GETDAT
- 0225 6137 B6 6007 LDA RESDAT
- 0226 613A 43 COMA
- 0227 613B 17 021D LBSR DSPBIN disp response
- 0228 613E 17 01B3 LBSR GETDAT
- 0229 6141 B6 6007 LDA RESDAT
- 0230 6144 43 COMA
- 0231 6145 17 0213 LBSR DSPBIN disp response
- 0232 6148 81 00 CMPA #$00
- 0233 614A 26 B5 BNE RPT41
- 0234
- 0235 614C BD 6384 JSR CRLF
- 0236
- 0237 *---------- second cmd 58 ----------
- 0238 614F SCMD258
- 0239 614F 17 01F7 LBSR SETCKL
- 0240 6152 C6 06 LDB #6
- 0241 6154 8E 6427 LDX #CMD58
- 0242 6157 A6 80 SC2581 LDA ,X+
- 0243 6159 43 COMA
- 0244 615A 17 017B LBSR SNDDAT
- 0245 615D 5A DECB
- 0246 615E 26 F7 BNE SC2581
- 0247 *get response
- 0248 6160 GR2580
- 0249 6160 17 0191 LBSR GETDAT
- 0250 6163 B6 6007 LDA RESDAT
- 0251 6166 43 COMA
- 0252 6167 17 01F1 LBSR DSPBIN disp response
- 0253 616A 81 00 CMPA #$00
- 0254 616C 26 F2 BNE GR2580
- 0255 616E 17 0183 LBSR GETDAT
- 0256 6171 B6 6007 LDA RESDAT
- 0257 6174 43 COMA
- 0258 6175 17 01E3 LBSR DSPBIN disp response
- 0259 6178 48 LSLA
- 0260 6179 48 LSLA
- 0261 617A 24 03 BCC GR2581
- 0262 617C 7C 6008 INC SDHC if sdhc then 1
- 0263 617F C6 03 GR2581 LDB #3
- 0264 6181 17 0170 GR2582 LBSR GETDAT
- 0265 6184 B6 6007 LDA RESDAT
- 0266 6187 43 COMA
- 0267 6188 17 01D0 LBSR DSPBIN disp response
- 0268 618B 5A DECB
- 0269 618C 26 F3 BNE GR2582
- 0270
- 0271 618E 8E 648E LDX #MSSD0
- 0272 6191 B6 6008 LDA SDHC
- 0273 6194 27 03 BEQ SD1
- 0274 6196 8E 6496 LDX #MSSD1
- 0275 6199 BD FAA4 SD1 JSR PSTRNG
- 0276
- 0277 619C 39 RTS
- 0278
- 0279 ****************************************
- 0280 * GET SD DATA ROUTINE
- 0281 * use CMD9
- 0282 ****************************************
- 0283 619D GETSD EQU *
- 0284 619D 17 01A9 LBSR SETCKL
- 0285 61A0 C6 06 LDB #6
- 0286 61A2 8E 6439 LDX #CMD9
- 0287 61A5 A6 80 SC91 LDA ,X+
- 0288 61A7 43 COMA
- 0289 61A8 17 012D LBSR SNDDAT
- 0290 61AB 5A DECB
- 0291 61AC 26 F7 BNE SC91
- 0292 61AE BD 6384 JSR CRLF
- 0293 *get response
- 0294 61B1 GR90
- 0295 61B1 17 0140 LBSR GETDAT
- 0296 61B4 B6 6007 LDA RESDAT
- 0297 61B7 43 COMA
- 0298 61B8 17 01A0 LBSR DSPBIN disp response
- 0299 61BB 81 00 CMPA #$00
- 0300 61BD 26 F2 BNE GR90
- 0301
- 0302 61BF BD 6384 JSR CRLF
- 0303 61C2 C6 14 LDB #16+1+2+1 fe,crcH,crcL,ff
- 0304 61C4 17 012D GR91 LBSR GETDAT
- 0305 61C7 B6 6007 LDA RESDAT
- 0306 61CA 43 COMA
- 0307 61CB 17 018D LBSR DSPBIN disp response
- 0308 61CE 5A DECB
- 0309 61CF 26 F3 BNE GR91
- 0310 61D1 39 RTS
- 0311
- 0312 *
- 0313 61D2 SDERR EQU *
- 0314 61D2 8E 64A0 LDX #MERR
- 0315 61D5 BD FAA4 JSR PSTRNG
- 0316 61D8 OKEND
- 0317 61D8 7E F800 JMP MON
- 0318 *
- 0319 ****************************************
- 0320 * READ ROUTINE
- 0321 * use CMD17
- 0322 * set sctno to $6005,6006
- 0323 * read data set to $6800-69FF
- 0324 ****************************************
- 0325 61DB SDRD EQU *
- 0326 61DB BD 6384 JSR CRLF
- 0327 61DE 17 012D LBSR INSCT
- 0328 *copy sct no to cmd param
- 0329 61E1 8E 6003 LDX #SCTN0
- 0330 61E4 108E 6416 LDY #CMD17+1
- 0331 61E8 C6 04 LDB #4
- 0332 61EA A6 80 CPY1 LDA ,X+
- 0333 61EC A7 A0 STA ,Y+
- 0334 61EE 5A DECB
- 0335 61EF 26 F9 BNE CPY1
- 0336 *send cmd
- 0337 61F1 17 0155 LBSR SETCKL
- 0338 61F4 C6 06 LDB #6
- 0339 61F6 8E 6415 LDX #CMD17
- 0340 61F9 A6 80 SDR1 LDA ,X+
- 0341 61FB 17 015D LBSR DSPBIN disp response
- 0342 61FE 43 COMA
- 0343 61FF 17 00D6 LBSR SNDDAT
- 0344 6202 5A DECB
- 0345 6203 26 F4 BNE SDR1
- 0346 *get response
- 0347 6205 SDR2
- 0348 6205 17 00EC LBSR GETDAT
- 0349 6208 B6 6007 LDA RESDAT
- 0350 620B 43 COMA
- 0351 620C 17 014C LBSR DSPBIN disp response
- 0352 620F 81 FE CMPA #$FE token?
- 0353 6211 26 F2 BNE SDR2
- 0354
- 0355 *get data
- 0356 6213 BD 6384 JSR CRLF
- 0357 6216 8E 6600 LDX #RWBUF <-temp buf
- 0358 6219 108E 0200 LDY #512
- 0359 621D C6 20 DSPDAT LDB #32
- 0360 621F 31 3F DSPD1 LEAY -1,Y
- 0361 6221 17 00D0 LBSR GETDAT
- 0362 6224 B6 6007 LDA RESDAT
- 0363 6227 43 COMA
- 0364 6228 A7 80 STA ,X+ save buf
- 0365 622A 17 012E LBSR DSPBIN disp data
- 0366 622D 108C 0000 CMPY #0
- 0367 6231 27 08 BEQ DSPD2
- 0368 6233 5A DECB
- 0369 6234 26 E9 BNE DSPD1
- 0370 6236 BD 6384 JSR CRLF
- 0371 6239 20 E2 BRA DSPDAT
- 0372
- 0373 623B BD 6384 DSPD2 JSR CRLF
- 0374 623E 17 00B3 LBSR GETDAT
- 0375 6241 B6 6007 LDA RESDAT
- 0376 6244 43 COMA
- 0377 6245 17 0113 LBSR DSPBIN crcH
- 0378 6248 17 00A9 LBSR GETDAT
- 0379 624B B6 6007 LDA RESDAT
- 0380 624E 43 COMA
- 0381 624F 17 0109 LBSR DSPBIN crcL
- 0382 6252 39 RTS
- 0383
- 0384 ****************************************
- 0385 * WRITE ROUTINE
- 0386 * use CMD24
- 0387 * set sctno to $6005,6006
- 0388 * write data from $6A00-6BFF
- 0389 ****************************************
- 0390 6253 SDWRT EQU *
- 0391 6253 8E 6482 LDX #MSWROK
- 0392 6256 BD FAA4 JSR PSTRNG
- 0393 6259 BD F000 JSR INCHA
- 0394 625C 84 DF ANDA #$DF
- 0395 625E 81 59 CMPA #'Y
- 0396 6260 27 01 BEQ SDWR1
- 0397 6262 39 RTS
- 0398 6263 BD 6384 SDWR1 JSR CRLF
- 0399 6266 17 00A5 LBSR INSCT
- 0400 *copy sct no to cmd param
- 0401 6269 8E 6003 LDX #SCTN0
- 0402 626C 108E 641C LDY #CMD24+1
- 0403 6270 C6 04 LDB #4
- 0404 6272 A6 80 CPY2 LDA ,X+
- 0405 6274 A7 A0 STA ,Y+
- 0406 6276 5A DECB
- 0407 6277 26 F9 BNE CPY2
- 0408 *send cmd
- 0409 6279 17 00CD LBSR SETCKL
- 0410 627C C6 06 LDB #6
- 0411 627E 8E 641B LDX #CMD24
- 0412 6281 A6 80 SDW1 LDA ,X+
- 0413 6283 17 00D5 LBSR DSPBIN disp response
- 0414 6286 43 COMA
- 0415 6287 8D 4F BSR SNDDAT
- 0416 6289 5A DECB
- 0417 628A 26 F5 BNE SDW1
- 0418 *get cmd response
- 0419 628C SDW2
- 0420 628C 8D 66 BSR GETDAT
- 0421 628E B6 6007 LDA RESDAT
- 0422 6291 43 COMA
- 0423 6292 17 00C6 LBSR DSPBIN disp response
- 0424 6295 81 00 CMPA #$00
- 0425 6297 26 F3 BNE SDW2
- 0426 *1byte skip
- 0427 6299 86 FF LDA #$FF
- 0428 629B 43 COMA
- 0429 629C 8D 3A BSR SNDDAT 1byte skip
- 0430 629E BD 6384 JSR CRLF
- 0431
- 0432 *send data packet
- 0433 62A1 8E 6600 LDX #RWBUF <-temp buf
- 0434 62A4 108E 0200 LDY #512
- 0435 *send data token
- 0436 62A8 86 FE LDA #$FE
- 0437 62AA 43 COMA
- 0438 62AB 8D 2B BSR SNDDAT data token
- 0439 62AD A6 80 SNDDT1 LDA ,X+
- 0440 62AF 43 COMA
- 0441 62B0 8D 26 BSR SNDDAT
- 0442 62B2 31 3F LEAY -1,Y
- 0443 62B4 26 F7 BNE SNDDT1
- 0444
- 0445 62B6 86 FF LDA #$FF
- 0446 62B8 43 COMA
- 0447 62B9 8D 1D BSR SNDDAT crcH
- 0448 62BB 8D 1B BSR SNDDAT crcL
- 0449 *get data response
- 0450 62BD CKRS
- 0451 62BD 8D 35 BSR GETDAT
- 0452 62BF B6 6007 LDA RESDAT
- 0453 62C2 43 COMA
- 0454 62C3 17 0095 LBSR DSPBIN disp response
- 0455 62C6 81 E5 CMPA #$E5 data response?
- 0456 62C8 26 F3 BNE CKRS
- 0457 *wait until busy
- 0458 62CA BUSY
- 0459 62CA 8D 28 BSR GETDAT
- 0460 62CC B6 6007 LDA RESDAT
- 0461 62CF 43 COMA
- 0462 62D0 17 0088 LBSR DSPBIN disp response
- 0463 62D3 81 FF CMPA #$FF
- 0464 62D5 26 F3 BNE BUSY
- 0465 62D7 39 RTS
- 0466 **************************************************
- 0467 *========== sub routine ==========
- 0468 *send data
- 0469 62D8 SNDDAT EQU *
- 0470 62D8 34 06 PSHS A,B
- 0471 62DA 7F 6007 CLR RESDAT
- 0472 62DD C6 08 LDB #8
- 0473 62DF 34 02 SNDD1 PSHS A
- 0474 62E1 84 FC ANDA #$FC
- 0475 62E3 8A 03 ORA #$03 miso:b1=H(for PIA),cs:b0=L
- 0476 62E5 B7 F0DC STA PADAT send data
- 0477 62E8 8D 5F BSR SETCKL
- 0478 62EA 35 02 PULS A
- 0479 62EC 48 LSLA
- 0480 62ED 8D 63 BSR SETCKH
- 0481 62EF 5A DECB
- 0482 62F0 26 ED BNE SNDD1
- 0483 62F2 35 86 PULS A,B,PC
- 0484
- 0485 *get data
- 0486 62F4 GETDAT EQU *
- 0487 62F4 34 06 PSHS A,B
- 0488 62F6 C6 08 LDB #8
- 0489 62F8 8D 4F GETD1 BSR SETCKL
- 0490 62FA 12 NOP
- 0491 62FB 12 NOP
- 0492 62FC 12 NOP
- 0493 62FD 8D 53 BSR SETCKH
- 0494 62FF B6 F0DC LDA PADAT get response
- 0495 6302 44 LSRA
- 0496 6303 44 LSRA b1->C
- 0497 6304 79 6007 ROL RESDAT C->b0
- 0498 6307 5A DECB
- 0499 6308 26 EE BNE GETD1
- 0500 630A 8D 3D BSR SETCKL
- 0501 630C 35 86 PULS A,B,PC
- 0502 *
- 0503
- 0504 *input SCT No
- 0505 630E INSCT EQU *
- 0506 630E 8E 647A LDX #MSSCT
- 0507 6311 BD FAA4 JSR PSTRNG
- 0508 6314 8D 79 BSR GET8CH get 8chr, convert 4bin
- 0509
- 0510 6316 7D 6008 TST SDHC
- 0511 6319 26 1D BNE CALCHC
- 0512 *SD card
- 0513 631B C6 03 LDB #3
- 0514 631D 8E 6004 LDX #SCTN1
- 0515 6320 108E 6003 LDY #SCTN0
- 0516 6324 A6 80 SFT1 LDA ,X+
- 0517 6326 A7 A0 STA ,Y+
- 0518 6328 5A DECB
- 0519 6329 26 F9 BNE SFT1
- 0520 632B 7F 6006 CLR SCTN3
- 0521 *calc top adrs of sct
- 0522 632E CALCSD EQU *
- 0523 632E 78 6006 LSL SCTN3
- 0524 6331 79 6005 ROL SCTN2
- 0525 6334 79 6004 ROL SCTN1
- 0526 6337 39 RTS
- 0527
- 0528 *SDHC card
- 0529 *calc top adrs of sct
- 0530 6338 CALCHC EQU *
- 0531 6338 8E 6003 LDX #SCTN0
- 0532 633B 108E 6416 LDY #CMD17+1
- 0533 633F C6 04 LDB #4
- 0534 6341 A6 80 CALCH1 LDA ,X+
- 0535 6343 A7 A0 STA ,Y+
- 0536 6345 5A DECB
- 0537 6346 26 F9 BNE CALCH1
- 0538 6348 39 RTS
- 0539
- 0540 *
- 0541 *set sck:L
- 0542 6349 SETCKL EQU *
- 0543 6349 34 02 PSHS A
- 0544 634B 86 3C LDA #$3C ca2=L
- 0545 634D B7 F0DD STA PACTL
- 0546 6350 35 82 PULS A,PC
- 0547
- 0548 *set sck:H
- 0549 6352 SETCKH EQU *
- 0550 6352 34 02 PSHS A
- 0551 6354 86 34 LDA #$34 ca2=H
- 0552 6356 B7 F0DD STA PACTL
- 0553 6359 35 82 PULS A,PC
- 0554
- 0555 *binary(A)->ascii(A)(B)
- 0556 635B DSPBIN EQU *
- 0557 635B 34 06 PSHS A,B
- 0558 635D 1F 89 TFR A,B
- 0559 635F 44 LSRA
- 0560 6360 44 LSRA
- 0561 6361 44 LSRA
- 0562 6362 44 LSRA
- 0563 6363 8A 30 ORA #$30
- 0564 6365 C4 0F ANDB #$0F
- 0565 6367 CA 30 ORB #$30
- 0566 6369 81 39 CMPA #$39
- 0567 636B 23 02 BLS BI21
- 0568 636D 8B 07 ADDA #$07
- 0569 636F C1 39 BI21 CMPB #$39
- 0570 6371 23 02 BLS BI22
- 0571 6373 CB 07 ADDB #$07
- 0572 6375 BD F002 BI22 JSR OUTCHA
- 0573 6378 1F 98 TFR B,A
- 0574 637A BD F002 JSR OUTCHA
- 0575 637D 86 20 LDA #$20
- 0576 637F BD F002 JSR OUTCHA
- 0577 6382 35 86 PULS A,B,PC
- 0578
- 0579 *crlf
- 0580 6384 CRLF EQU *
- 0581 6384 86 0D LDA #$0D
- 0582 6386 BD F002 JSR OUTCHA
- 0583 6389 86 0A LDA #$0A
- 0584 638B BD F002 JSR OUTCHA
- 0585 638E 39 RTS
- 0586
- 0587 *
- 0588 638F GET8CH EQU *
- 0589 *input chr
- 0590 638F 8E 64C6 LDX #INPBUF
- 0591 6392 5F CLRB
- 0592 6393 BD F000 CLOP JSR INCHA
- 0593 6396 81 0D CMPA #$0D
- 0594 6398 27 07 BEQ INEND
- 0595 639A A7 85 STA B,X
- 0596 639C 5C INCB
- 0597 639D C1 08 CMPB #8
- 0598 639F 25 F2 BLO CLOP
- 0599
- 0600 63A1 INEND
- 0601 *shift
- 0602 63A1 5D TSTB
- 0603 63A2 27 11 BEQ CL1
- 0604 63A4 8E 64C6 LDX #INPBUF
- 0605 63A7 3A ABX
- 0606 63A8 108E 64CE LDY #INPBUF+8
- 0607 63AC 34 04 PSHS B
- 0608 63AE A6 82 SFLOP LDA ,-X
- 0609 63B0 A7 A2 STA ,-Y
- 0610 63B2 5A DECB
- 0611 63B3 26 F9 BNE SFLOP
- 0612 *clr
- 0613 63B5 C6 08 CL1 LDB #8
- 0614 63B7 E0 E0 SUBB ,S+
- 0615 63B9 27 0A BEQ CLEND
- 0616 63BB 8E 64C6 LDX #INPBUF
- 0617 63BE 86 30 LDA #'0
- 0618 63C0 A7 80 CLLOP STA ,X+
- 0619 63C2 5A DECB
- 0620 63C3 26 FB BNE CLLOP
- 0621 63C5 CLEND
- 0622
- 0623 *convert to bin
- 0624 63C5 C6 04 LDB #4
- 0625 63C7 8E 64C6 LDX #INPBUF
- 0626 63CA 108E 6003 LDY #SCTN0
- 0627 63CE CVT1
- 0628 63CE A6 80 LDA ,X+
- 0629 63D0 8D 1F BSR CVBIN
- 0630 63D2 25 16 BCS EREND1
- 0631 63D4 48 LSLA
- 0632 63D5 48 LSLA
- 0633 63D6 48 LSLA
- 0634 63D7 48 LSLA
- 0635 63D8 34 02 PSHS A
- 0636 63DA A6 80 LDA ,X+
- 0637 63DC 8D 13 BSR CVBIN
- 0638 63DE 25 08 BCS EREND0
- 0639 63E0 AB E0 ADDA ,S+
- 0640 63E2 A7 A0 STA ,Y+
- 0641 63E4 5A DECB
- 0642 63E5 26 E7 BNE CVT1
- 0643 63E7 39 RTS
- 0644
- 0645 63E8 35 02 EREND0 PULS A
- 0646 63EA 8E 64B7 EREND1 LDX #MSERR
- 0647 63ED BD FAA4 JSR PSTRNG
- 0648 63F0 39 EEND RTS
- 0649
- 0650 *--------------------
- 0651 *ascii -> bin
- 0652 63F1 CVBIN EQU *
- 0653 63F1 80 30 SUBA #'0
- 0654 63F3 2B 11 BMI CVERR
- 0655 63F5 81 09 CMPA #9
- 0656 63F7 23 0A BLS CVBEND
- 0657 63F9 81 11 CMPA #$11
- 0658 63FB 25 09 BLO CVERR
- 0659 63FD 81 16 CMPA #$16
- 0660 63FF 22 05 BHI CVERR
- 0661 6401 80 07 SUBA #7
- 0662 6403 CVBEND
- 0663 6403 1C FE ANDCC #$FE reset C
- 0664 6405 39 RTS
- 0665 6406 1A 01 CVERR ORCC #$01 set C
- 0666 6408 39 RTS
- 0667 **************************************************
- 0668 *
- 0669 *========== parameter ==========
- 0670 6409 40 CMD0 FCB $40,$00,$00,$00,$00,$95 '@
- 0671 640F 41 CMD1 FCB $41,$00,$00,$00,$00,$FF 'A
- 0672 6415 51 CMD17 FCB $51,$00,$00,$00,$00,$FF 'Q
- 0673 641B 58 CMD24 FCB $58,$00,$00,$00,$00,$FF 'X
- 0674 6421 48 CMD8 FCB $48,$00,$00,$01,$AA,$87 'H
- 0675 6427 7A CMD58 FCB $7A,$00,$00,$00,$00,$FF 'z
- 0676 642D 77 CMD55 FCB $77,$00,$00,$00,$00,$FF 'w
- 0677 6433 69 ACMD41 FCB $69,$40,$FF,$80,$00,$FF 'i
- 0678 6439 49 CMD9 FCB $49,$00,$00,$00,$00,$FF 'I
- 0679
- 0680 *
- 0681 643F 31 MSMENU FCC /1:Read Sct, 2:Write Sct, 3:Get SD data, 4:SD Init, 9:End: /
- 0682 6479 04 FCB 4
- 0683 647A 53 MSSCT FCC /SctNo: /
- 0684 6481 04 FCB 4
- 0685 6482 57 MSWROK FCC /Write OK?: /
- 0686 648D 04 FCB 4
- 0687 648E 53 MSSD0 FCC /SD Card/
- 0688 6495 04 FCB 4
- 0689 6496 53 MSSD1 FCC /SDHC Card/
- 0690 649F 04 FCB 4
- 0691 64A0 53 MERR FCC /SD Initialize error!/,$0D,$0A
- 0692 64B6 04 FCB 4
- 0693 64B7 49 MSERR FCC /Input error!/,$0D,$0A
- 0694 64C5 04 FCB 4
- 0695 ***************************************
- 0696 64C6 FF INPBUF RMB 8
- 0697
- 0698 END START
-
- 0 error(s), 0 warning(s) is detected.
-
- Label address
- ACMD41 6433 ASC411 612B ASCMD41 6123 BI21 636F BI22 6375
- BUSY 62CA CALCH1 6341 CALCHC 6338 CALCSD 632E CKRS 62BD
- CL1 63B5 CLEND 63C5 CLLOP 63C0 CLOP 6393 CMD0 6409
- CMD1 640F CMD17 6415 CMD24 641B CMD55 642D CMD58 6427
- CMD8 6421 CMD9 6439 CPY1 61EA CPY2 6272 CRLF 6384
- CVBEND 6403 CVBIN 63F1 CVERR 6406 CVT1 63CE DSPBIN 635B
- DSPD1 621F DSPD2 623B DSPDAT 621D EEND 63F0 EREND0 63E8
- EREND1 63EA GET8CH 638F GETD1 62F8 GETDAT 62F4 GETSD 619D
- GR00 608C GR2580 6160 GR2581 617F GR2582 6181 GR410 6134
- GR550 6112 GR580 60E4 GR581 60F2 GR582 60F4 GR80 60B3
- GR81 60C1 GR82 60C3 GR90 61B1 GR91 61C4 INCHA F000
- INEND 63A1 INIT 602D INPBUF 64C6 INSCT 630E ISTT 6071
- MAIN 6009 MEN2 6044 MEN3 604D MEN4 6056 MEN5 605F
- MENU 602F MERR 64A0 MON F800 MSERR 64B7 MSMENU 643F
- MSSCT 647A MSSD0 648E MSSD1 6496 MSWROK 6482 OKEND 61D8
- OUTCHA F002 PACTL F0DD PADAT F0DC PSTRNG FAA4 RESDAT 6007
- RPT41 6101 RWBUF 6600 SC01 6082 SC2581 6157 SC551 6109
- SC581 60DB SC80 60AA SC91 61A5 SCMD0 607A SCMD258 614F
- SCMD55 6101 SCMD58 60D3 SCMD8 60A2 SCTN0 6003 SCTN1 6004
- SCTN2 6005 SCTN3 6006 SD1 6199 SDERR 61D2 SDHC 6008
- SDINIT 6069 SDR1 61F9 SDR2 6205 SDRD 61DB SDW1 6281
- SDW2 628C SDWR1 6263 SDWRT 6253 SETCKH 6352 SETCKL 6349
- SFLOP 63AE SFT1 6324 SNDD1 62DF SNDDAT 62D8 SNDDT1 62AD
- START 6000 VN 6002
プログラムのメニュー部です。
1:Read Sct, 2:Write Sct, 3:Get SD data, 4:SD Init, 9:End:
メニューの1や2を選択するとセクタ番号を聞いてくるので、入力するとそのセクタの内容が読み込まれたり、そのセクタにバッファの内容が書き込まれます。
3でSDの情報を表示したりすることもできます。
モニタ中のサブルーチンとして INCHA, OUTCHA, PSTRNG を使用していますが、それ以外は特別なものはないので、6809機で6821さえあればSDカードが読み書きできることになります。