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
前へ
次へ
ホームページトップへ戻る