CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

シフトゼロ

おかしいのはset_7219()関数の中で16回目のループ;i=15の時です。
このときの入力データのビット状態を見るマスク:
   msk=(1<<(15-i));
 
が怪しいということになります。
 
 1<<0=???
 
1のゼロ回左シフトっていくつなんでしょうか。
そこで左シフト<<の挙動をみるプログラムをささっと書いてみます。
 
イメージ 3
文字列入出力やsprintf系関数は既にこっそりライブラリ化してあってここら辺は楽になってます。
 
それはさておき、このプログラムをコンパイル、DLL、実行させると
 
イメージ 2
あー、やっちまってます
 
 1<<0=0
 
ですと。普通はやっぱり
 
 1<<0=1
 
でしょう。これの中間アセンブラファイルを見てみると理由がわかりました。
左シフト<<はマシンコードでSLA(Shift Left Arithmetic)に展開されているのですが
マニュアルにはSLAの動作はこう書かれています。
 
イメージ 1
 
シフト量をWR0で与えるときその値が1~15であればその数シフトしますが、WR=0に限っては16回シフトであると。
 
左シフト<<演算子としてはバグですけど、このコンパイラとしては仕様ということでOKにしておきます。