復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第29回]
●メモリ増設基板裏のICソケット
メモリ増設基板裏には細ピンヘッダーを取り付けてありますから、その先にさらにICソケットを取り付けて、そのICソケットをND80ZVのROM用ソケットに挿すというのは、無駄なことのように思われるかもしれません。
ですのでここは説明が必要かと思います。
最初は私も細ピンヘッダーを直接ND80ZVのROM用ICソケットに挿そうと考えました。
しかし複数の理由から、細ピンヘッダーの先にさらにICソケットを取り付ける、という案に落ち着きました。
その1番目の理由は、ND80ZVのROM用ICソケットの近くにあるRAMとZ80CPUの背の高さの問題です。
下の写真を見てください。
メモリ増設基板をND80ZVに取り付けたところを、横から撮った写真です(少し前に撮った写真なので、まだ電解コンデンサがついていません)。
細ピンヘッダーに取り付けたICソケットがゲタになっていて、増設基板が左右のZ80CPUとRAMから少し離れています。
このICソケットのゲタをはかせないと、この位置では細ピンヘッダーの長さが少し足りなくて、左右のZ80CPUとRAMに邪魔をされて、しっかりとROM用ICソケットに挿すところまでいかないのです。
第2の理由は、作業のし易さです。
メモリ増設基板裏側のICソケットは、pin20とpin22を切り取らなければいけません。
ICソケットのピンは薄くて柔らかいので、簡単に折り取ることができますが、細ピンヘッダーは細いとは言え、とても折るわけにはいきません。
ニッパーが必要になりますが、抵抗などのリード線よりも太くて固いので、ニッパーの刃先をいためてしまうかもしれません。
それにひょっとして、うっかり間違えて、別のピンを折ってしまうかもしれません。
また、ND80ZVのROM用のICソケットに挿すときに、ピンの先を曲げてしまうかもしれません。
そんなときでも、普通のICソケットですから、安価に入手して交換することができます。
第3の理由は、ROM用ICソケットに直接細ピンヘッダーを挿すと、ICソケットをいためてしまうかもしれないという懸念があったからです。
丸ピンソケットならばICピンのコンタクト部分も堅牢ですが、ND80ZVのROM、RAM用のICソケットは、ごく普通のバネによってICピンを支える形のものですから、ICピンよりも太い、幅の有る端子を挿し込むと、ピンのバネが変形して接触不良になってしまう可能性があります。
メモリ増設基板の裏側の細ピンヘッダーの先にICソケットを取り付けるようにしたのは、そういう理由からです。
●またしてもお恥ずかしいミス
お恥ずかしいミスにつきましては前回にも書いたばかりなのですが、またまたお恥ずかしい初歩的なミスのために、およそ1日を空費してしまいましたというお話です。
前回のミスは間違っている回路図や写真をUPしてしまったあとで気が付いたのでありますから、これはもう黙っているわけにはいきません。
あ。いや。そ知らぬ顔で黙って差換えてしまうことだってできないことはありませんけれど、お読みいただいております方の中には、毎回コピーしてノートパソコンに移した上で出先などで時間をみつけてお読みいただいておりますとか、全部プリントアウトしてファイリングしていただいておりますとか、もう冥利に尽きるといいますか、まことに有り難いお話などもお聞きしておりますので、とてもとても黙って差換えてそ知らぬ顔などはできませんです。
しかし。
今回は、別に何かを発表したわけでもありません。
私だけが黙っておれば誰も知らぬことでありますから、黙っておればよいのでありますけれど。
だいたいにおいて、うまくいった話、他人の成功談など、読んでいても面白いものではありませぬ。
そこへいきますと、他人が失敗したりヘマをやったような話は面白い。
他人の不幸は蜜の味であります。
昔から対岸の火事は大きいほどよい、と相場は決まっております。
毎回毎回退屈な話ばかり読んでいただいておりますのもまことに申し訳無いことでありますので、たまには犠牲的精神を発揮いたしまして、おばかな失敗談を書くのもよろしいかと…。
そういう次第で。恥なお話です。
昨日は、とうとう更新するゆとりもありませんでした。
ことの次第と申しますのは。
やっとメモリ増設基板についての説明も一段落しましたので、ずっと棚上げにしておりました、CP/MソースファイルのBIOSパラメータの設定についての説明にとりかかることにいたしました。
このところメモリ増設基板の説明ばかりが続いておりましたが、もちろん楽屋裏では、着々とCP/Mの実装に向けて作業を進めておりまして、当初はまったくわからなかったところもかなり理解できるようになってきました。
オリジナルのCP/Mソースファイルに対する変更箇所は、当初は[第20回]あたりで説明しております通りでしたが、その後にそこからさらに手直ししたところなどが出て来ています。
気が付いたところなどは、時間をみつけてちょいちょいと手直ししたりもしていたのですが、それをアセンブルして、できたマシン語のプログラムをND80ZVに組み込んで、みなさま方のお手もとのND80ZVでも同じ動作テストをやっていただくことができますように、念の為に、もう一度テストをしておくことにいたしました(この段階ではまだ増設メモリボードは使いません。標準のND80ZV機能のみでテストを行なえます)。
そこで、昨日は朝から、あらためての動作テストに取りかかったのでありますが。
なんと。
突然に、今まで出たことのない、怪しげなエラーメッセージが表示されてしまいました。
t1520 t1520−2.txt[Enter]と入力した途端にエラーメッセージが表示されてしまったのですが…。
しかし、これはすでにテスト済みのプログラムです([第15回])。
今まで何回も同じテストをしていても、こんなエラーメッセージは出たことがありません。
思うに、ここ1週間ほどの間に行なったプログラム修正が原因であることにほぼ間違いはありませんでしょう。
まあ。確かに。
当初わけもわからずいい加減に書いていたBIOSのパラメータとかプログラム部分も、ある程度は理解が進んできましたので、そのためにあちこち書き直したことも事実です。
しかし。
わけもわからずに適当に書いたときにはうまくいっていて、わけがわかってきて書き直したら、途端にエラーメッセージが出てしまった、というのも不条理なものでありますが、まあ、世の中といいますのは、大体においてそのようなものであります。
一体どこを直したのが原因だったのか、と思って、こちらが修正前、こちらが修正後、なんて調子で調べ始めたのですけれど、なにしろメモも取らずに思いつくままに直していたものですから、どの段階までがよくて、どこからがおかしくなったのか、ということを追求するだけでも一苦労でありました。
が。
やっと、わかりました。
たった、1行の手直しがその原因らしいということまでは、わかりました。
この部分です。
ORG CPMTOP ; ORG (MEM-7)*1024 REBOOT: CBASE: JP COMMAND ;execute command processor (ccp). JP CLEARBUF ;entry to empty input buffer before starting ccp. |
ORG CPMTOP ; ORG (MEM-7)*1024 REBOOT: JP COMMAND CBASE: JP COMMAND ;execute command processor (ccp). JP CLEARBUF ;entry to empty input buffer before starting ccp. |
記事を書く段階で、JP COMMANDがダブっていることに気が付いたので、上のようにしたのですが、そのように直したものでは実際にテストはしていなかったのです。
それでは記事で紹介したプログラムと、私がテストしたプログラムとが異なってしまいますから、そこを合わせておこうと考えて、上のように直したものでテストをしたのです。
このように書きますと、いとも簡単に原因個所が見つかったように思われるかもしれませんが、変更箇所はここだけではなくて、ほかにもいろいろ直していますから、その中から、ここにたどりつくまでには一苦労でありました。
とにかく、上のように直したプログラムを実行すると、さきほどのエラーになります。
直さないでJP命令がダブっているプログラムではエラーは発生しません。
しかし。
一体、この変更のどこがいかんのか?
プログラムの先頭のJP命令を削ったため、以後の命令やジャンプ先アドレスはすべて3バイトずれてきますが、それでエラーが出るというのも奇怪な話です。
sectorREADにともなうエラーかとも思いましたが、DIRコマンドは正しく実行されています。
そのあとでt1520.comを実行した直後にエラーが発生しているように見えます。
しかし、上でも書きましたように、このプログラムはテスト済みのものです。
むむ。
面妖な…。
しかし、このままにしておくわけにはいきませぬ。
覚悟を決めて原因を追求することにいたしました。
ほんとうにきつい人生であります。
さきほど説明をしましたように、先頭のJP命令を削除したCP/Mでは、t1520.comを実行すると必ずエラーメッセージが出ることがわかりましたから(実は他のプログラムを実行しても出ることもわかりました)、まずはこのエラーメッセージの正体から追求してみることにいたしました。
追求がし易いように、アセンブルリストをもとに調べていくことにしました。
まずは「Bdos Err」をキーワードに検索してみました。
表示するのに使ったテーブルはここに間違いないようです。
すると次は、ラベルBDOSERR:を使っているルーチンを捜すことになります。
BDOSERRを使っているのはここだけしかありません。
すると次はPRTERRの検索です。
PRTERRはERROR1とERROR5で使われていることがわかりました。
でもよく見ますと、ERROR5はERROR2〜ERROR4でも使われていますから、結局ERROR1〜ERROR5の全てが対象になります。
しかし。全て?
さらにさらによく見てみますと、HLに第2テーブルを入れています。
さきほどのメーセージでは、最後の’Select’がそれのようです。
さきほどのキーワード検索で見ますとSelectにはBADSELラベルがついています。
ということは、ERROR2がCALLされたということになります。
しかし?
ここで疑問が。
ERROR2には’Bad drive selected’というコメントがついています。
しかし、しかし。
もう一度さきほどのメーセージを見ますと、’Bdos Err On A: Select’になっています。
なんで、Aドライブが、Bad driveなのか?
なんとなく、嫌な予感がいたします。
ERRO2で検索しましたら、ここだけであることがわかりました。
BADSLCTです。
確かに、bad disk selectと書いてあります。
今度はBADSLCTの検索です。
ここだけで使われています。
なんだか疲れてしまいますねえ。
SLCTERRで検索しました。
ここ1箇所だけで使われています。
むむ。
LOGINDRVかあ…。
しかし、なぜここでBAD DRIVEになってしまうのか…。
見たところ、ちゃんとAドライブをアクセスしているようですし、そもそも今はテストなのでAドライブしかありません。
プログラムを眺めていただけでは解決がつかないときは、実際に実行しながら追求してみるしかありません。
そう、デバッグです。
ND80ZVのZB3BASICには、簡単なものではありますが、デバッグのための機能が備わっています。
それを使って追求をしていくことにいたしました。
ここで、またもや、納得のいかない摩訶不思議な現象に遭遇するのであります。
以下はそのときの様子を記録した、実際のログファイルです。
番号は説明のために後から書き加えたものです。
>/ld cpm_1o4.bin,bc00 loading CPM_1O4.BIN ...16e8(5864)bytes loaded,from BC00 to D2E7 >bp d035(1) >jp bc00(2) A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC FFAC 8000 D223 0000 0044 0000 0000 0000 D035 C73F 0044 F1A1 FF 10101100 >bp d038(3) >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC FFAC 8000 D223 0000 0044 0000 0000 0000 D038 C73F 0044 F1A1 FF 10101100 >bp d035(4) >rt a>dir(5) A: FILLE5 COM : ABC COM : CPMTST9 COM : TST012 COM A: TST6 COM : TEST1520 TXT : T1520 COM : T1520-2 TXT a>t1520 t1520-2.txt(6) Bdos Err On A: Select A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC FFAC 8000 D223 0000 0044 0000 0000 0000 D035 C73F 0044 F1A1 FF 10101100 >0000 00C3 - リモート接続を終了しました logfile closed at Wed Feb 08 23:24:44 2012 |
ここで何をやっているかを説明いたします。
何が起きているのかを探るために、エラーメッセージが表示される直前でブレークさせて、そのときのレジスタの内容を確認してみることにしました。
BP D035 はアドレスD035にブレークポイントを設定するコマンドです(1)。
ここはまだZB3BASICです。
そうしておいて、JP BC00 で、CP/Mにジャンプします(2)。
すぐにブレークしてレジスタダンプが表示されます。
PC=D035ですから、ちゃんとブレークは機能しています。
アドレスD035の命令を実行する直前にブレークしています。
レジスタを調べますと、右のほうにありますフラグレジスタの中のZフラグは0になっていますから、Zフラグが立っていないことがわかります。
さきほどのプログラムリストを見ますと、アドレスD035の命令は、CALL Z,SLCTERRですから、Zフラグが立っていないときは、エラーメッセージは表示されません。
どうやら、このルーチンはくり返し実行されるようです。
そういうときは、一旦先に進んだところにブレークポイントを設定して、そこでブレークしてから、またここに戻ってブレークするようにします(D035でブレークしたまま、次のD035でのブレークを設定することはできません)。
BP D038[Enter]
RT[Enter]
で、D038にブレークポイントを設定して、実行を再開します(3)。
RTはブレークしたところに戻って実行を再開するためのコマンドです(RT=return)。
すぐにブレークしますが、ここは再度D035でブレークさせるためのダミーとしてブレークさせたものですから、レジスタの確認は不要です。
もう一度、
BP D035[Enter]
RT[Enter]
で、D035にブレークポイントを設定して、実行を再開します(4)。
すると、
a>と表示されましたから、DIR[Enter]と入力しました(5)。
ディレクトリが表示されたあと、またa>と表示されました。
いよいよ、です。
t1520 t1520−2.txt[Enter]と入力しました(6)。
すると、ここで信じられないことが起きてしまいました。
なんと、Bdos Err …のエラーメッセージが表示されてしまったのです。
(4)で設定したブレークポイントをすり抜けて…!
エラーメッセージの表示後にブレークしているのは、[Ctrl][E]を入力してCP/Mを強制終了するときに、D035が実行されたためだと思われます(Zフラグは立っていません)。
しかし。
D035を通過することなしに、このエラーメッセージが表示されるはずはないのです…。
説明が長くなってしまいましたので、この続きは次回にすることにいたします(疲れました)。
ワンボードマイコンでCP/Mを![第29回]
2012.2.9upload
前へ
次へ
ホームページトップへ戻る