「ほっ」と。キャンペーン

GMC-4 のビット操作

GMC-4 の演算は2進加算、減算、ビット反転(NOT)、右ビットシフトしかない。したがって、ビットマスクなどのビット演算がやりにくい。それでも、無理にビット演算をやらせてみた。

例1 データニブルのビット1の値を取り出す

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 A F (TIY F) #メモリ5F番地をYレジスタで指定する。
09 4 (AM) Aレジスタの値を5F番地のメモリにコピー。
0A E 6 (CAL SIFT) #Aレジスタの値を右シフト
0C A E (TIY E) #メモリ5E番地をYレジスタで指定。
0E 4 (AM) #Aレジスタの値を5E番地にコピー。
0F 6 (M+) #A = A+<5E>。つまりAレジスタの値を2倍にする。
10 A F (TIY F) #メモリ5F番地をYレジスタで指定する。
12 7 (M-) #A = <5F> - A
13 1 (AO) #Aレジスタの値を表示
14 F 0 0 (JUMP 0 0) #ループの先頭へ戻る。

例2 データニブルのビット4の値を取り出す。

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 A F (TIY F) #メモリ5F番地をYレジスタで指定する。
09 4 (AM) Aレジスタの値を5F番地のメモリにコピー。
0A 6 (M+) #A = A+<5F>。つまりAレジスタの値を2倍にする。
0B 3 3 (CY CY) #AレジスタとYレジスタの値の交換を2回するので何もしない。実行フラグを1にするため。
0D E 6 (CALL SIFT) #Aレジスタを右シフト。Aレジスタのビット4が0になる。
0F 7 (M-) #A = <5F> - A
10 1 (AO) #Aレジスタの値を表示
11 F 0 0 (JUMP 0 0) #ループの先頭へ戻る。

例3 データニブルのビット1の値のチェック

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 E 6 (CAL SIFT) #Aレジスタの値を右シフト
09 E 9 (CAL SHTS) #ビット1が0の時ベルを鳴らす。
0A F 0 0 (JUMP 0 0)

例4 データニブルのビット4の値のチェック

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 6 8 (M+ 8) #A = A+8
09 E 9 (CAL SHTS) #ビット4が1の時ベルを鳴らす。
0A F 0 0 (JUMP 0 0)

注意!! GMC-4 のCAL命令(E)は実行フラグが1のときだけ実行される。また、右シフトではビット1の値が0の時、実効ビットが1になる。GMCの仕様はやはりちょっと変な気がする。しかし、命令数が少ないのですぐに使えるようになる。GMC-4のようなマイコンに見せかけたエミュレータは便利だ。教育用の最少インストラクションで構成されたマイコンを同じような感じで作れば有用なような気がする。
[PR]
by tnomura9 | 2009-07-15 13:23 | 話のネタ | Comments(0)
<< GMC-4 1ビットORプログラム GMC-4 4ビット足し算器 >>