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


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第68回]



●/LDをセグメント指定可能に

/LDはバイナリファイルをメモリにロードするコマンドです。
ロード先は当然RAMエリアになりますが、現行のシステムではDS=0000のユーザーエリア(アドレス0100〜DFFF)がロードできる範囲になります。
E000から後ろもロードできるところもありますが、システムのワークとしても利用しているエリアですから、ロードによってシステムデータが破壊されるとシステムが暴走したりハングアップしたりすることがあります。
この/LDコマンドもDS=0000以外のセグメントにもロードできるように機能拡張しました。
従来の/LDコマンドの書式は、
/LD ファイルネーム,aaaa
です。
aaaaはロード開始アドレスです。
機能拡張後の書式は、
/LD ファイルネーム,aaaa[dddd]
です。
[dddd]はセグメントベースアドレスです。
省略した場合には従来と同じDS=0000でのメモリアドレス範囲の指定となります。

下はテストを行なっているところです。

最初は現行の機能通り[dddd]を省略して実行しました。
/LDはバイナリファイルをロードするコマンドですが、TXTファイルなどほかの拡張子のファイルでもロードできます。
BASICのテキストプログラムを/LOADコマンドでロードすると実行可能な内部コードへの変換が行なわれますが、/LDコマンドの場合はなにも変換せずそのままバイナリデータとしてロードされます。
ロード後にDMコマンドで正しくロードされたことを確認しました。
その次は[1000]をつけて/LDコマンドを実行しました。
セグメントベースアドレス=1000のアドレス8000へのロードです。
その後DMコマンドで[1000]の8000〜に正しくロードされたことを確認しました。

●/SVをセグメント指定可能に

/LDをセグメント指定可能にしたからには/SVもそのようにしないと片手落ちです。
当然そのように機能拡張しました。
/SVは指定するメモリ範囲のデータをバイナリファイルとしてセーブします。
拡張子はBINにする必要はありませんが、ファイルの中身はバイナリデータのみになります。
従来の/SVコマンドの書式は、
/SV ファイルネーム,aaaa,bbbb
です。
aaaaはセーブ開始アドレスでbbbbは終了アドレスです。
機能拡張後の書式は、
/SV ファイルネーム,aaaa,bbbb[dddd]
です。
[dddd]はセグメントベースアドレスです。
省略した場合には従来と同じDS=0000でのメモリアドレス範囲の指定となります。
今回の機能拡張によってコードセグメントに置かれたシステムプログラムなどもセーブ可能になりました(通常のユーザーが使うことはないと思いますが)。

テストのための準備作業です。

上の/LDのテストでロードしたセグメントベース[1000]の8000〜のデータを/SVコマンドでセーブするテストですが、上のテストでの結果DS=0000の8000〜にも同じデータがロードされています。
このままでは、もしも[1000]が機能していなくて、DS=0000のデータがセーブされても判別できません。
そこでDS=0000の8000〜のデータの一部を書き換えました。
これで準備完了です。
さっそく/SVのテストをしたのですが。

●/SVのテストで想定外の結果が…

/SVのテストをしましたら、想定外の異常事態が発生してしまいました。

最初に
/SV SVTEST.TXT,8000,8066[1000]
を実行して、先の/LDテストで8000〜8066[1000]にロードしたバイナリファイルをSVTEST.TXTの名前でセーブしました。
/SVコマンドで作成されるファイルはバイナリファイルですが、セーブするメモリ範囲のデータがテキストデータの場合には、結果的に中身はテキストデータとなりますから、この例の場合には拡張子をTXTとしても間違いではありません。
さて。
そのようにしてセーブしたファイルを今度は/LDコマンドで全然別のセグメントベース[2000]のアドレス9000にロードしました。
その後でDMコマンドで確認してみましたところ、まさかのびっくりです。
なんじゃこりゃあ?
またしても真夏の夜の怪談かえ?
こんなことにめげてしまう私ではありませぬ。
気を取り直して、今度はセーブしたときと同じセグメントベース[1000]のアドレス9000にロードしました。
今度は問題なく正しくロードできました。
/SVの問題ではないようです。
/SVは正しく機能拡張できているようです。
すると。

むむむ。
そうか。
ひょっとすると。
そういうことか。

というところで、途中ですが、時間がなくなってしまいましたので、この続きは次回にすることにいたします。

16ビットマイコンボードの製作[第68回]
2018.8.9upload

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