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


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

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

[第96回]



●システムサブルーチンを直接CALLしたい

久しぶりに16ビット記事に復帰です。
ここ数日間はやっとAM188版の作業にかかることができました。
その結果かなり作業が進みました。
AM188版も完成までもうあと一息です。

[第91回]に少し書いたことですが、AM188版ND80KL/86をTK80のように使おうとすると、大きな壁にぶち当たります。
セグメントの壁です。

AM188は1MBのメモリ空間をアクセスできます。
1MB(1024KB)のメモリアドレスは20ビット長です。
ところが8086は16ビットCPUなのにアドレスを指定するための仕組みは8080などの8ビットCPUとほぼ同じです。
直接プログラムがアクセスできるメモリ空間は0000〜FFFFの64KBで、8080と変わりません。
8086は8ビットと同じメモリアクセスの仕組みを使って1MBのメモリにアクセスするために4つのセグメントレジスタ(CS、DS、SS、ES)を使います。
8086はこのセグメントレジスタと16ビットのアドレスアクセスの仕組みを組み合わせることで1MBのメモリ空間にアクセスします。
1つのセグメントは64KBで、それを4個までアクセスすることができます。
このうち重要なのはCS(コードセグメント)とDS(データセグメント)です。

実行プログラムはCSで指定するメモリエリアに置きます。
そのプログラムで参照するデータメモリはDSで指定したメモリ範囲になります。
たとえば MOV AL,[1000]
という命令はCSで指定するメモリに置きますが、[1000]で示すメモリはCSではなくてDSで指定するメモリになります。

このことはCS=DSであるような小規模なシステムでは問題になりません。
しかしND80KL/86(AM188版)では、CSで指定するROMはメモリマップ上のF0000〜FFFFF(27C512の場合)に置かれるのに対して、DSで指定するRAMはそれとは対極の00000〜7FFFF(512KBRAM)に置かれています。
問題はユーザープログラムからシステムサブルーチンをコールするときです。
ND80KL/86ではユーザープログラムはRAM上に置きます。
そこはDSのエリアなので、たとえばCMコマンドやDMコマンドで書いたり読んだりできるエリアです。
そこに書かれたプログラムはDSの範囲なのでそのままでは実行できません。
どうするかと言いますと、JPコマンドでユーザプログラムにジャンプするときにCSにRAMのアドレスを入れるのです。
つまりユーザープログラムが実行されるときだけCS=DSにすることでRAM上のユーザープログラムが実行できることになります。

するとそこで上に書いた問題が発生します。
ユーザープログラムを実行するためにCS=DS=RAMエリアとしたため、ROMにあるシステムサブルーチンはユーザープログラムからはCALLできなくなってしまいます。
システムサブルーチンも当然CSで指定するエリアになければならないからです。

この問題と逆の問題について[第48回][第50回]に書きました。
はしたなくも思わず「インテルのクソヤロー」と叫んでしまった問題でした。
CSに置いたデータはそのままでは参照できない(データはDSになければならないので)という問題です。
そこではデータを参照する命令にCS:プリフィクスを付加することで、アクセスを可能にするという方法について書きました。
それはそこに書きましたようになかなかに面倒な作業だったのですが、ともかくそのようにすることによって問題は回避できました。

ところが今回の問題はそういうことではクリアできません。
今回の問題の回避策が[第82回][第83回]に書きましたINT 22でした。
これは後に読者からの指摘でINT B0に変更しました([第85回])。
これで一件落着したつもりだったのでありますが。

今回の冒頭に書きましたように、[第91回]で、INT XX方式は、8086版TK80モニタでは利用できないのではないか、ということに気が付いてしまったのでした。
利用できないことはありませんが、相当に面倒ですし、マシン語プログラムのトレーニング的なモニタプログラムなのに直接システムサブルーチンのアドレスを指定するのではなくて、INT XXナンバーを指定するというのはなんとなく間接的で面白くない感じです。
なんとかシステムサブルーチンを直接コールしたいものだと思案しました。

前置きが長くなってしまって肝心の解決策を書く前に時間がなくなってしまいました。
次回に続きます。

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

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