学研マイコンGMC-4のCAL DEM+命令
備忘録代わりに書いています。
GMC-4のBCD演算命令CAL DEM+はなかなか複雑な動きをして、しかも使いように気をつけないといけないのでその辺りをメモしておきます。
CAL DEM+命令を実行すると、50+Y番地のメモリ内容にAレジスタの値を加えてから同じメモリに書き戻します。
これが基本なのですが、
- 加算した結果が0-9の範囲に入っていない場合、BCDとして有効な値になるよう補正する(+6する)
- 桁上げがあると50+(Y-1)番地の値に桁上げ分を加える
という処理を行います。つまるところ、メモリ上に複数桁にわたるBCD値が格納されているときにその下位の桁をYレジスタで指定してやるとそこにAレジスタの値を加えると共に上位桁への桁上げも適宜処理してくれるという便利な命令です。
具体的には、
- 50番地=0、51番地=9、52番地=8と格納されているとき(3桁の"098"という値を意味している)、
- Aレジスタに4を入れた状態でCAL DEM+命令を実行すると
- 50番地=1、51番地=0、52番地=2(3桁の"102"という値)になります。
98+4=102という計算をしたわけですが、8+4=10+2の桁上げだけでなく10の位の1+9=10という桁上げも計算してくれています。
これは大変便利なのですが、
- 繰り上がりのある限りこの処理(上の桁へのBCD加算)が繰り返されてしまうこと
と
- 50番地の値を計算した結果で繰上りがあると一回りして5F番地のデータに繰り上がり分が加算されてしまうということ
の2点に注意する必要があります。
例えば、2桁のデータで充分だと考えて52番地に10の位、53番地に1の位のデータを格納していたとして、この二桁の値が99の時にA=1、Y=3でCAL DEM+命令を実行してしまうと思いがけず51番地のデータが変化してしまう(+1されてしまう)ということがあります。これを避けるには、絶対に10の位での桁上げが起きないように気をつけるか、この例だとあらかじめ51番地には壊れてもかまわないデータ(0など)を入れておく必要があります。
同様に、例えば50番地に9が入っている状態でA=1、Y=0でCAL DEM+命令を実行してしまうと桁上げが発生して5F番地のデータが変化してしまいます。
この辺、BCDデータの置き場所に気をつけないといけません。
ところで、Aレジスタやメモリの値が0-9の範囲でなかったときもなかなかうまいこと計算してくれるようですが、完全ではないようです。(例えばA=0A, M(50+Y)=0Aで実行すると、M(50+Y-1)が+1される=桁上げのはいいとして、M(50+Y)=0Aのままに残ってしまいます。)なのでそういうトリッキーな使い方をするならどんな動きをするのか処理のアルゴリズムを調べておく必要があるでしょう。
なお、複数桁にわたる桁上げをしたとしてもYレジスタの値は-1されるだけです。これは「一つ上の位を指すようにする」という意味なのでしょう。例えば、M(50+Y-2)M(50+Y-1)M(50+Y)の3桁データに"23"を加えるには
- A=3(1の位)としてからCAL DEM+した後に
- (Yレジスタは-1されて10の位を指していますのでそのまま)
- A=2(10の位)でCAL DEM+
すればよいです。1の位の計算(CAL DEM+)をした際に10の位や100の位に桁上げが発生したとしても(しなかったとしても)、気にせず10の位の加算を続ければOKです。
ところで、似た命令のCAL DEM-はCAL DEM+ほど気が利いてはいなくて、
- M(50+Y)からAレジスタの値を引いてM(50+Y)に書き戻し
- 桁借りがあったらM(50+Y-1)に"1"をセット
という処理のようです。桁借りが発生したときはM(50+Y-1)のもともとの内容が何であろうと1をセットするので複数桁のBCD値について計算したい場合は自分で桁借りの処理を書かないといけません。A=3, Y=8でCAL DEM+した後に同じパラメータ(A=3, Y=8)でCAL DEM-しても元に戻るとは限らない、ということです。CAL DEM-は使いどころの難しい命令だと思います。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- SOTEC DN3030を買ってみた(2009.08.29)
- 学研マイコンGMC-4のCAL DEM+命令(2009.07.06)
- 学研マイコンGMC-4命令表(2009.07.05)
- 学研大人の科学マガジン付録マイコンGMC-4について思うこと(2009.07.05)
- 学研大人の科学マガジン付録マイコンGMC-4実行モード一覧(2009.07.05)


最近のコメント