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


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

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

[第32回]



●8086プログラムの悩ましい問題

この数日は作業がなかなか進まずちょっと苦戦しています。
マシンランゲージはさらに機能を付加して、もうしっかり実用レベルになりました。
それを使って、今BASICの作成作業中です。
BASICは手をつける前から苦戦を覚悟していたのですが、想像以上でした。
[第30回]では8086のマシン語がZ80などに比べてむしろ使いやすい、ということを書きました。
しかしもともとZ80アセンブラで書いたプログラムを8086アセンブラで書き直そうとすると、意外なところで戸惑ってしまいます。

ひとつはレジスタの扱いです。
Z80の場合、主に使うレジスタはA、BC、DE、HLです。
AはALに置き換えることができますが、困るのはPUSH AF、POP AFです。
Z80では(8080も同じですが)Aレジスタは8ビットなので、それと8ビットのフラグレジスタを合わせて16ビットにして一緒にPUSH、POPします。
ところが8086でPUSH、POPする場合には、PUSH AX、POP AX、PUSHF、POPFのようにAXレジスタとフラグレジスタは別々に扱わなければなりません。
Z80でPUSH AFとした場合、それがAレジスタを保存したいのか、フラグを保存したいのか、それともその両方なのか、ということが、その部分だけでは判断がつかず、その前後のプログラムの流れを追いながら再確認する必要があります。
これはなかなかに面倒な問題です。

もうひとつはレジスタの置き換えの問題です。
Aレジスタは上で書きましたようにALに置き換えできます。
BCレジスタはBXレジスタと置き換えたくなりますが、Z80ではBCレジスタはカウンタとしても使われますので、そうするとCXに置き換えたほうがよいようにも思われます。
しかしこれはまあネームから受ける印象からなのですが、私としてはBCはCXよりもBXに置き換えるほうがしっくりくるような気がします。
問題はHLとDEです。
特にHLはメモリを示すときによく使われます。
そうするとSIに置き換えるとよいように思えますし、その考えからすればDEはDIに置き換えることになりそうです。

ところがZ80のプログラムではHLは16ビットの整数データを格納するのに使っています。
これはHLが16ビットの加減算レジスタとして使えるところからきています。
もちろん8086ではSIもDIも16ビットの加減算レジスタとして使えますからその意味では何の問題もありません。
問題はHLレジスタもDEレジスタもHとL、DとEというように上下各8ビットのレジスタとしても使える点です。
8086ではSIレジスタもDIレジスタも16ビット専用レジスタなので8ビットに分けることはできません。
これはHL、DEの代わりに使うと困るときがでてきます。
なのでそれならということで、一部の処理プログラムを、HLの代わりにDXレジスタに置き換えてしまいました。
ところがあとで気が付いたのですが、Z80の(HL)、(DE)の用法として[SI]、[DI]は使えるのですが、[DX]は使えません。
[AX]、[CX]もだめですが、[BX]は使えます。
実はHLの代わりとしてはBXが一番合っているようです。
しかしBASICシステムのベースになる基本的なサブルーチン群は最初はHLをDXに置き換えて書き始めてしまい、後からはHLをSIで置き換えてしまいました。
もう頭の中にはHL=DX or SI という数式が根を張ってしまいましたので、今更再変更は無理です。
しかしDXとSIをごちゃまぜに使ってしまったためにプログラムのあちこちで不整合なトラブルが発生しています。
仕方がないので少しずつデバッグしながら直しているところです。

もうひとつ気が付いた8086とZ80(8080)のとんでもない相違点があります。
Z80では16ビット演算のINC HL、INC BC、INC DE、DEC HL、DEC BC、DEC DEはフラグに影響を与えません。
ところが8086では8ビットのINC、DECと全く同じように、16ビットのINC、DECもキャリーフラグ以外のフラグが変化します。
Z80では
ADD A,(HL)
INC HL
JP NZ,LOOP
というプログラムが書けたのですが、8086では
ADD AL,[SI]
INC SI
JNZ LOOP
と書くと全然違った動作になってしまいます。
Z80ではごく当たり前のようにして、上のプログラムのような使い方をしてきましたので、ついつい気が付かずに同じ使い方をしてしまいます。

それやこれやでなかなか思うほどには進捗していかず、少々あせっています。
何とかこの週末ぐらいで一応のめどをつけたいと思っているのですが、さてどうなりますでしょうか。

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

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