2017.4.12
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
CRT/VGAIF+KEYIF+SDCARDIFボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
昔はそれが普通のことだったのですが、安価なCRTディスプレイが生産中止となって久しい今日ではそれ
は叶わぬことと諦めていたのですが…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[総合第46回]


●SDカードを再フォーマット

前回まででとりあえずND80Z3.5(ND80ZV)用の独立型プログラムについては大体問題無いところまでできたと思います。
残るはZB3DOS(CP/M互換DOS)です。
独立型のZB3DOS(CP/M互換DOS)についてはMBASICが起動できてSTARTREKが実行できたことを確認しましたが、やはりキー入力や232Cについては問題が残っているのではないかと思われます。
そこでZB3DOS(CP/M互換DOS)を起動して、そのあたりについて確認してみようとしたのですが…。

いつの間にか仮想Aドライブがとんでもないことになってしまっていました。

ひょっとしたら、とちょっと心配していたことがあったのですが、やっぱり心配が的中してしまいました。
実は先日いろいろテストをしている過程で、SDカードのファイルをセーブする部分にバグがみつかりました。
ファイルをセーブするクラスタ番号を計算するところで誤ったクラスタ番号を算出してしまう可能性があることがわかりました。
もちろんその部分は修正したのですが、それ以前にセーブした沢山のファイルは正しい位置にセーブされているだろうか、とちょっと心配していました。
どうやらやっぱりとんでもないところにセーブしてしまっていたようです。

何がおきたのか、セクタリードプログラムで確認してみました。
ZB3DOS(CP/M互換DOS)用のSDカードフォーマットについては[総合第29回]で簡単に説明をしました。
仮想Aドライブはクラスタ#40〜#7Fに割り当ててあります。
その先頭の8セクタが仮想Aドライブのディレクトリです。
クラスタ#とセクタbフ関係は個々のSDカードによって異なりますが、このSDカードの場合クラスタ#40の先頭セクタbヘ1287であることを計算によって確かめてあります。
そこでセクタbP287を読み出してみました。

>/ld sctrd.bin,8000
loading SCTRD.BIN ...0017(23)bytes loaded,from 8000 to 8016
>cm 8003
8003 00-
8004 00-12
8005 00-87
8006 2A-
>jp 8000
>dm 8200,83ff
8200  3B 20 42 44 4F 53 20 54-45 53 54 36 20 43 4F 4D  ; BDOS TEST6 COM
8210  50 41 52 45 0D 0A 3B 32-30 31 32 2F 33 2F 37 20  PARE..;2012/3/7 
8220  38 2F 32 31 0D 0A 3B 0D-0A 09 4F 52 47 20 24 30  8/21..;...ORG $0
8230  31 30 30 0D 0A 09 46 43-41 4C 4C 3D 24 30 30 30  100...FCALL=$000
8240  35 0D 0A 09 46 43 42 57-4B 3D 24 30 30 33 42 0D  5...FCBWK=$003B.
8250  0A 09 52 45 43 4E 4F 32-3D 24 30 30 35 42 0D 0A  ..RECNO2=$005B..
8260  09 46 43 42 3D 24 30 30-35 43 0D 0A 09 46 43 42  .FCB=$005C...FCB
8270  32 3D 24 30 30 36 43 0D-0A 09 52 45 43 4E 4F 3D  2=$006C...RECNO=
8280  24 30 30 37 43 0D 0A 09-44 4D 41 31 3D 24 30 30  $007C...DMA1=$00
8290  38 30 0D 0A 09 44 4D 41-32 3D 24 30 33 30 30 0D  80...DMA2=$0300.
82A0  0A 09 42 59 54 45 43 4E-54 52 3D 24 30 33 38 30  ..BYTECNTR=$0380
82B0  0D 0A 09 41 57 4B 3D 24-30 33 38 32 0D 0A 3B 0D  ...AWK=$0382..;.
82C0  0A 09 4C 44 20 48 4C 2C-46 43 42 32 0D 0A 09 4C  ..LD HL,FCB2...L
82D0  44 20 44 45 2C 46 43 42-57 4B 0D 0A 09 4C 44 20  D DE,FCBWK...LD 
82E0  42 2C 31 31 3B 3D 31 37-0D 0A 4C 4F 4F 50 31 3A  B,11;=17..LOOP1:
82F0  4C 44 20 41 2C 28 48 4C-29 0D 0A 09 4C 44 20 28  LD A,(HL)...LD (
8300  44 45 29 2C 41 0D 0A 09-49 4E 43 20 48 4C 0D 0A  DE),A...INC HL..
8310  09 49 4E 43 20 44 45 0D-0A 09 44 45 43 20 42 0D  .INC DE...DEC B.
8320  0A 09 4A 50 20 4E 5A 2C-4C 4F 4F 50 31 0D 0A 3B  ..JP NZ,LOOP1..;
8330  0D 0A 09 4C 44 20 43 2C-30 46 3B 6F 70 65 6E 0D  ...LD C,0F;open.
8340  0A 09 4C 44 20 44 45 2C-46 43 42 0D 0A 09 43 41  ..LD DE,FCB...CA
8350  4C 4C 20 46 43 41 4C 4C-0D 0A 09 49 4E 43 20 41  LL FCALL...INC A
8360  3B 69 66 20 46 46 48 3F-0D 0A 09 4A 50 20 5A 2C  ;if FFH?...JP Z,
8370  4E 4F 46 49 4C 45 52 52-0D 0A 3B 0D 0A 09 4C 44  NOFILERR..;...LD
8380  20 43 2C 30 46 3B 6F 70-65 6E 0D 0A 09 4C 44 20   C,0F;open...LD 
8390  44 45 2C 46 43 42 57 4B-0D 0A 09 43 41 4C 4C 20  DE,FCBWK...CALL 
83A0  46 43 41 4C 4C 0D 0A 09-49 4E 43 20 41 3B 69 66  FCALL...INC A;if
83B0  20 46 46 48 3F 0D 0A 09-4A 50 20 5A 2C 4E 4F 46   FFH?...JP Z,NOF
83C0  49 4C 45 52 52 0D 0A 3B-0D 0A 09 58 4F 52 20 41  ILERR..;...XOR A
83D0  0D 0A 09 4C 44 20 28 52-45 43 4E 4F 29 2C 41 0D  ...LD (RECNO),A.
83E0  0A 09 4C 44 20 28 52 45-43 4E 4F 32 29 2C 41 0D  ..LD (RECNO2),A.
83F0  0A 09 4C 44 20 48 4C 2C-42 59 54 45 43 4E 54 52  ..LD HL,BYTECNTR

思った通り、本来はディレクトリであるべきセクタにファイルデータ(アセンブラのソースプログラム)が書き込まれています。
ここはデータ領域ではありませんから、データが書き込まれることはないはずなのですが、やはりファイルセーブプログラムのバグが原因でこんなことになってしまったようです。
それはそうとして、アセンブラのソースプログラムがなぜこんなところに?
そこが疑問だったので調べてみましたら、ZB3DOS(CP/M互換DOS)のテストを行なうために、テストプログラムを一括してZディレクトリにコピーしたのですが、その中にソースプログラムが含まれていたようです。
詳しい経緯は省きますが、そのコピー作業を行なう以前にSDカードに溜まっていた古いファイルをかなり沢山削除したのですが、その削除した古いファイルがバグによって間違った領域にセーブされていたようです。
それを削除したためそこが空きクラスタとなってしまい、あとからのコピー作業でその空きクラスタにテストプログラムが割り当てられてしまったようです。
上のデータ内容から判断して、おそらくあとからZディレクトリにコピーしたテストプログラムらしいと見当がつきましたので、今度はZディレクトリを確認してみました。
Zディレクトリはクラスタ#2に割り当ててあります。
このSDカードの場合クラスタ#2の先頭のセクタbヘ0307です。
そこでセクタbO307を読み出してみました。

>cm 8003
8003 00-
8004 12-03
8005 8C-07
8006 2A-
>jp 8000
>dm 8200,83ff
8200  2E 20 20 20 20 20 20 20-20 20 20 10 00 00 00 00  .          .....
8210  00 00 00 00 00 00 00 00-00 00 02 00 00 00 00 00  ................
8220  2E 2E 20 20 20 20 20 20-20 20 20 10 00 00 00 00  ..         .....
8230  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8240  53 54 41 52 54 52 45 4B-42 41 53 20 00 5B 49 B9  STARTREKBAS .[Iケ
8250  70 4A 70 4A 00 00 AB 89-1C 3B 44 01 15 4F 00 00  pJpJ..ォ..;D..O..
8260  41 4D 00 62 00 61 00 73-00 69 00 0F 00 DC 63 00  AM.b.a.s.i...ワc.
8270  2E 00 63 00 6F 00 6D 00-00 00 00 00 FF FF FF FF  ..c.o.m.........
8280  4D 42 41 53 49 43 20 20-43 4F 4D 20 00 8D 49 B9  MBASIC  COM ..Iケ
8290  70 4A 70 4A 00 00 2D 94-45 40 45 01 00 5F 00 00  pJpJ..-.E@E.._..
82A0  E5 30 30 32 20 20 20 20-42 49 4E 20 00 00 00 00  .002    BIN ....
82B0  00 00 00 00 00 00 00 00-00 00 6A 01 91 0D 00 00  ..........j.....
82C0  46 4E 43 30 36 54 20 20-43 4F 4D 20 00 BF 8E AD  FNC06T  COM .ソ.ュ
82D0  79 4A 79 4A 00 00 8F AD-79 4A 57 01 1B 00 00 00  yJyJ...ュyJW.....
82E0  E5 30 30 33 20 20 20 20-42 49 4E 20 00 00 00 00  .003    BIN ....
82F0  00 00 00 00 00 00 00 00-00 00 58 01 0E 00 00 00  ..........X.....
8300  56 46 54 53 54 36 20 20-54 58 54 20 18 55 7D 6E  VFTST6  TXT .U}n
8310  8B 4A 8B 4A 00 00 0D AF-15 41 40 00 EA 09 00 00  .J.J...ッ.A@.....
8320  56 46 54 53 54 36 2D 32-43 4F 4D 20 00 8D 7D 6E  VFTST6-2COM ..}n
8330  8B 4A 8B 4A 00 00 77 A8-92 42 42 00 26 01 00 00  .J.J..wィ.BB.&...
8340  56 46 54 53 54 36 2D 32-54 58 54 20 18 BF 7D 6E  VFTST6-2TXT .ソ}n
8350  8B 4A 8B 4A 00 00 71 A8-92 42 43 00 EA 09 00 00  .J.J..qィ.BC.....
8360  56 46 54 53 54 37 20 20-43 4F 4D 20 00 C2 7D 6E  VFTST7  COM .ツ}n
8370  8B 4A 8B 4A 00 00 1D 55-17 41 47 00 9C 00 00 00  .J.J...U.AG.....
8380  56 46 54 53 54 38 20 20-43 4F 4D 20 00 01 80 6E  VFTST8  COM ...n
8390  8B 4A 8B 4A 00 00 23 55-17 41 50 00 9C 00 00 00  .J.J..#U.AP.....
83A0  56 46 54 53 54 39 20 20-43 4F 4D 20 00 04 80 6E  VFTST9  COM ...n
83B0  8B 4A 8B 4A 00 00 2E 56-91 42 51 00 B5 00 00 00  .J.J...V.BQ.オ...
83C0  56 46 54 53 54 31 30 20-43 4F 4D 20 00 07 80 6E  VFTST10 COM ...n
83D0  8B 4A 8B 4A 00 00 2D 50-18 41 55 00 90 00 00 00  .J.J..-P.AU.....
83E0  56 46 54 53 54 31 31 20-43 4F 4D 20 00 08 80 6E  VFTST11 COM ...n
83F0  8B 4A 8B 4A 00 00 8D AD-1D 41 59 00 06 00 00 00  .J.J...ュ.AY.....

1ファイルあたり32バイトが割り当てられています。
その後ろから数えて5、6バイト目にクラスタ#が書かれています。
VFTST6.TXTから後ろのファイルが割り当てられているクラスタ#が間違っています。
VFTST6.TXTは問題のクラスタ#40に割り当てられています。
データ領域はクラスタ#140からになっていますから、それよりも若いクラスタ#に割り当てられているのは誤りです。

ということでこのSDカードがとんでもないことになっていることがわかりました。
このままではどうしようもありません。
ここは覚悟を決めて、再フォーマットしてやり直すしかないと判断しました。
せっかくフォーマットからやり直すのでしたら、この機会に正しくフォーマットされているかどうか、また正しく本来のクラスタ位置にファイルが割り当てられるかどうかを確かめながら作業をしていくことにしました。

というところで本日は時間がなくなってしまいました。
続きは次回にいたします。

CRT/VGAIF+KEYIF+SDCARDIFボードの製作[総合第46回]
2017.4.12upload

前へ
次へ
ホームページトップへ戻る