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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第304回]


●普通のProgram Loaderのプログラムリスト

今回はE−80(仮称)ミニコン上で動作するProgram Loaderのプログラムリストをご紹介いたします。
2013/1/27  18:48  loader1j.txt
END=7F9F
              ; E-80 loader
              ;12/11/27 11/28 12/3 12/6 12/8
              ;13/1/27
              	ORG $7F80
              ;
              	LDTOP=$8000
              ;
7F80 210080   	LD HL,LDTOP
7F83 0EFC     	LD C,FC
7F85 3E04     LOOP:LD A,04;bit2=L,bit3=H data request on
7F87 D3FE     	OUT (FE),A
7F89 DBFE     LP1:IN A,(FE)
7F8B E6C0     	AND C0
7F8D 2806     	JR Z,LP12;no data
7F8F FE80     	CP 80;strobe on?
7F91 20F6     	JR NZ,LP1;no
7F93 EDA2     	INI
7F95 AF       LP12:XOR A;data request off
7F96 D3FE     	OUT (FE),A
7F98 DBFE     LP2:IN A,(FE)
7F9A E640     	AND 40;strobe off?
7F9C 28FA     	JR Z,LP2;no
7F9E 18E5     	JR LOOP
              ;
LDTOP        =8000  LOOP         =7F85  LP1          =7F89  
LP12         =7F95  LP2          =7F98  

Loaderといいましても特別のものは何もありません。
ただ単純にPIC18F14K50と交信して、PICがUSB経由でWindowsパソコンから受信したデータを受け取ってメモリに順に書き込んでいくだけです。

実はこのプログラムとほぼ同じ動作をするプログラムはND80ZV(ND80Z3.5)にも組み込まれています。
TK−80モニタプログラムやND80ZモニタプログラムでLOADキーを押してプログラムをUSB経由でロードする部分には、上記のリストに近いプログラムが使われています。

それらのプログラムに比べて、今回のプログラムローダーは極力シンプルにしてあります。
なにしろフロントパネルからスイッチパチパチでマシン語のプログラムコードを入力していくことを前提にしたプログラムですから、1バイトでも短くしたいという気持ちからです。
それでも32バイトになってしまいました。

PICとの交信に工夫をすればもっと短くすることも可能ですが、取りこぼしのない確実なデータの受け渡しをするために前回説明をしましたハンドシェーク方式を使っています。
ハンドシェーク方式はマスターとスレーブ間での実行クロックの差に左右されずに確実にデータの受け渡しができますが、その代わりにプログラムステップ数は多くなります。
E−80(仮称)ミニコンはCPUクロックを2MHz、4MHz、5MHz、10MHz、20MHzに切り換えて使うことができます([第262回][第267回]参照)。
そういうことになりますと、プログラムでデータを読み取るタイミングを計ることが困難になります。
そのような場合には、ステップ数が多少増えてもハンドシェーク方式が確実なのです。
ま、しかし、32バイトでしたら、スイッチパチパチでもそれほど難儀なことではありませんでしょう。

このプログラムは、メモリ上のどこに置いても正しく実行されます。
いわゆるリロケータブル(再配置可能)なプログラムです。
とりあえずは7F80Hという中途半端なアドレスに置いています。
これはテスト段階でND80Zモニタプログラムのロードにも使うために、そのようなアドレスに置いているのです。
ND80Zモニタプログラムも(それなりに一部を改造しましたが)ちゃんとE−80(仮称)ミニコン上で動作するのです。
ND80Zモニタでは、ユーザープログラムは8000H以後のメモリアドレスに置きます。
モニタプログラムエリアは0000H〜7FFFHということになっていますが、後ろの方は少し空いています。
そこで使われないで空いている7F80H〜7FFFHにProgram Loaderを置くことにすれば、バッテリバックアップしたシステムモニタプログラムもユーザープログラムも破損することなく使うことができます。
7F80H番地に置いているのはそういう理由からなので、目的に応じて別のアドレスに置いて使うこともできます。

プログラムの先頭でHLレジスタにロードを開始するメモリの先頭アドレスを設定しています。
ND80ZV(ND80Z3.5)のロードプログラムでは、ロードするプログラムの先頭にロード開始メモリアドレスと終了アドレスを付加したファイルをロードするという約束にしてあります。
しかしそれと同じことをここでもやろうとしますと、ロードの先頭でロード先メモリアドレス情報を読み込む部分も付け加えなくてはなりません。
このプログラムはスイッチパチパチで1バイトずつフロントパネルからRAMに書き込んでいきます。
そういうことですから、ロード先のアドレスをロードするプログラムに合わせて書き換えたとしても先頭の2バイト目と3バイト目を書き換えるだけですから、そのほうが簡単であるともいえます。

しかし、ロードする最終アドレス、またはロードするバイト数は?

そんなものはありません。
それを確認するとなると、1バイトロードするごとにロード先のアドレスかロード済みバイト数を確認しなければならないことになって、それだけプログラムが複雑になってしまいます。
とにかくこのテのローダーはシンプルであることがウリなのです。

ですのでプログラムはエンドレスです。
データがある限りロードを続けます。

それでは、いつ、どうやって止めるのか?

ご心配ご無用。
そのタイミングはパソコン側の画面を見ればわかります。

下の画像はWindowsのDOSプロンプト(コマンドプロンプト)画面です。

相変わらずWindoes98SEですねえ。
とにかくシンプルでこういう作業にはもってこいなので、なかなか手放せません。

それはともかくとしまして。
E−80(仮称)ミニコンのProgram Loaderを先にスタートさせます。
E−80のフロントパネルでプログラムをスタートさせるのは、0000H番地からとは限りません。
どこからでも任意のアドレスを設定してスタートさせることが可能です。
アドレス設定スイッチを7F80Hに設定して、READスイッチを押して、そのアドレスをCPUのプログラムカウンタに読み込ませたあと、RUNスイッチを押します。

それからWindows側の送信プログラムをスタートさせます。
送信プログラムはND80ZV(ND80Z3.5)の付属CDROMについております、HIDWR.exeです。
このプログラムはファイルの先頭にロード先の先頭アドレスと終了アドレス情報が入っていることを想定しているため、先頭の4バイトを読み込んで表示します。
ここでロードしているプログラムファイルはその情報の無い、ただのバイナリファイルですから、先頭の4バイトのマシン語コードがアドレス情報として表示されてしまっていますが、特に何か支障があるわけではありません。
画面にありますように、とても短いファイルですから送信は瞬時に終わってしまいます。
送信が完了したことを画面で確認したら、E−80(仮称)ミニコンのフロントパネルのSTOPスイッチを押してProgram Loaderの実行を停止させます。

説明の途中ですが、時間が無くなってしまいました。
続きは次回にいたします。

ワンボードマイコンでCP/Mを![第304回]
2013.1.29upload

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