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


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

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

[第26回]


●CM、DM、/SV、/LD、JPコマンド

この週末はがんばって作業したおかげでかなり成果があがりました。
基本的なマシン語ツールができあがってきました。
Windows側のプログラムは、今まではND80Z3.5用をそのまま使っていましたが、基本的なところの変更が必要であることがわかりましたので、急遽8086版を作成しました(まだ完全ではありません)。
それでとりあえずはマシン語モニタプログラムが動くようになりました。

CM(チェンジメモリ)コマンドとDM(ダンプメモリ)コマンドと/SV(バイナリセーブ)コマンドと/LD(バイナリロード)コマンドとJP(ジャンプ)コマンドです。
この画面からだけでは、Z80や8080の動作と区別がつきませんが、AM188(8086)のプログラムが走っています。
ここまでくるのがちょいと大仕事でした。
そうそう。
画面をよく見ていただくとZ80や8080ではないことがわかります。
最後にJP 9000を実行しています。
おお。
これだけでも説明しなければならないところがいっぱいあります。
最初にCMコマンドで8000〜8004に簡単なマシン語コードを書いています。
8000 B055   MOV AL,55
8002 E680   OUT 80,AL
8004 CB     RETF

これをIOTEST.BINというファイル名でセーブしました。
そのあと、今セーブしたIOTEST.BINを9000にロードして、DMコマンドで確認しました。
ちゃんとセーブ、ロードできていることが確認できます。
そしてJP 9000の実行です。
これだけのプログラムですからすぐにシステムに戻って、>が表示されました。
これだけでは本当に実行したのかどうかわかりませんが、I/Oコネクタ(82C55入出力コネクタ)にLEDをつないで、ちゃんと出力されたことを確認しました。

プログラムの最後に注目してください。
ND80Z3.5やND8080では、最後にシステムに戻るために、
JP 1033
で終るようにします。
BASICの場合にはUSRコールで呼び出しますから最後はRETにします。

今回はJPコマンドですから、最後はJMP命令ではないのか?
と思われるかもしれません。
実はここが悩んだところなのです。

●RETF

そもそもRETFとはなんぞや?
というところから説明が必要です。
その前に。
[第24回]ではウソを書いてしまいました。
まずはその訂正からしなければなりません。
[第24回]で、8086ではCALL、RET命令はPC(プログラムカウンタ)だけではなくてCS(コードセグメントレジスタ)の退避も行なわれる、と書きましたが、それはCALLF(セグメント間CALL)、RETF(セグメント間RET)命令のことでした。
8086でもふつうのCALL、RETは8080やZ80と同じようにPCしか退避されません。

というところまで訂正させていただいたところで、本題に戻ります。
本日も時間がありませんので、はしょって説明を進めます。
図を描くとよいのですけれど(時間がありませんのでとりあえずパスします)。
ND80KL/86(AM188)の場合、起動後の標準のメモリマップではROMはF0000〜FFFFFに割り当てて、そしてRAMは00000〜0FFFFに割り当てています。
ROMはともかくとしてRAMは512KBのRAMですから、00000〜7FFFFの範囲をカバーできます。
しかしAM188(8086)はソフトウェアで直接アクセスできるメモリ範囲は8080、Z80と同様に16ビットで表記できる0000〜FFFFの64KBです。
その範囲を実メモリアドレスに結び付けているのがCS、DS、SS、ESの各セグメントレジスタです。
ND80KL/86(AM188)のシステムプログラムでは、起動時にCS=F000、DS=SS=ES=0000にセットしています。
この場合上に書きましたように、CSはF0000〜FFFFFに、DS、SS、ESは00000〜0FFFFの範囲になります。
CS(code segment)はCPUが命令コードを実行するためのセグメント(メモリ範囲)で、DS(data segment)はCPUがデータメモリとして扱うメモリ範囲です。

ここからが面倒なことになります。
前回まで見ていただいた、TK−80風モニタでユーザーがプログラムやデータを入力するところは、当然RAMになります。
普通は今までの慣習でアドレスとして8000番地台を使いますが、ここがRAMということで、さらにはデータとして書いたり読んだりできるということになりますから、アドレスは00000〜0FFFFの範囲のRAMに割り当てられていて、そこはデータの領域ですからDS=0000として規定しています。
それではシステムプログラムはどこにあるのでしょうか?
それはROMですから、F0000〜FFFFFの範囲のROMに書かれていることになります。
ここはプログラムとしてCPUが命令を読み込んで実行する対象ですからCS=F000で規定しています。

では。
8000(実は08000)からに書かれたユーザープログラムのマシン語コードは果たして実行可能でしょうか?
そこは上で書きましたようにDSで指定したデータ領域で(CSでは指定外)ですから、CPUは実行できません。
たとえば[8][0][0][0]、[ADRSSET]、[RUN]と操作したとしても、CPUは08000ではなくてF8000にジャンプしてしまいます。
なぜならCPUに「8000にジャンプしてそこから実行せよ」、と命令すると、CPUはCSで指定している8000(実メモリアドレスはF8000)にジャンプしてしまうからです。
それではどうするか?

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

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

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