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


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

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

[第8回]


●最初のJMP命令(2)

前回は納得したつもりだったのですが…。
いや、やっぱりおかしいです。
まだ解決したわけではありませんでした。
前回のIntelのドキュメントに書いてあることは、それはその通りかもしれませんが、それは問題の解決ではありませんでした。

前回書きましたように、FFFF0番地に置いたF000へのJMP命令の飛び先はアドレスカウンタがオーバーフローして、その結果0EFF0になるはずです。
するとそのアドレスはCS端子がアクティブになる条件である、F0000〜FFFFFの範囲のアドレスではありませんから、その時点ではこちらが意図するFF000にジャンプするのではなくて、やっぱり0EFF0にジャンプするのだとしか考えられません。
0EFF0はRAMのエリアですから何が書かれているかわかりません。
おそらく暴走した結果、たまたまROMプログラムのエントリアドレスに来ただけだと考えられます。

そのあたりのことを確認するために、前回のリストにあったCSにF000を設定するところ([00080][00081]の行)を削除してみました。
結果は正しく起動しなくなりました。
が、キー入力を繰り返しているうちに、ぽんと正常動作になりました。
しかし、リセットするとまた異常な動作になってしまいます。

いや、新年早々からまことにお恥ずかしいお話で、間違ったことを書いてしまいました。
やっぱり当初考えた通り、今までお見せしたプログラムは間違っておりました。
ここに謹んで訂正して、お詫び申し上げます。

それではどう書くと良いのかと言いますと。
下のリストにありますように、JMPF命令を使います。

[00005]                         ORG=F000

[00054] F000  BAA0FF        START0:MOV DX,FFA0;umcs
[00055] F003  B83FE0            MOV AX,E03F;128k,noready

[00412]                         ORG=FFF0
[00413] FFF0  EA00F000F0        JMPF F000:START0

JMPF(far jump)はセグメント間ジャンプ命令です。
32ビットのオペラント部に、CSレジスタに指定したい16ビットの値と、16ビットのジャンプ先アドレスを置きます。
上のリストのJMPFを実行すると、CSレジスタにF000が入り、F0000をベースアドレスとしたときのF000番地、つまりFF000番地へのジャンプが行なわれます。

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

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