始める電子回路 | CPUを作る | 回路がわかる本 | 始める電子工作 |
CPUを使ってみるTD4の性能出来上がったCPUを使ってみました。 作っている途中に初めて気づいたのですが、このCPUには分岐命令が1つしかない。 桁あふれのジャンプ JNCだけ。 それと、足し算ADDはあるけど 引き算がない。というか演算命令が足し算しかない。 CPUのくせに、計算があんまり得意でないCPUです(^^; かけ算は足し算で回数分足せばできるけど引き算も足し算でやるしかないです。 足し算で引き算をやる方法ですが、補数を使います。CPUとか情報処理の知識で出てくる内容です。 一応CPUはこんな方法で負数を扱っています。 2−1 なら 2+(−1) のような方法 補数を使うと足し算で引き算ができる。 2 :0010 )2 1: 0001 )2TD4には 反転命令もないので自分で補数を作るしかない。 何もかもに制約があるCPUです。そこが妙に楽しい。 0−15までなので 全桁変換表をつくって ハンド補数変換でつくるのがいかも。 それと 桁あふれのジャンプ JNC を試してみると うまくいかない! キャリーフラグのところは確認してないので、ここにもまた不具合動作があるのか と思ったらこれは 桁あふれのジャンプJNCを演算命令の直後に持ってきてないのが原因です。 理由は本の 加算器の フラグの設計 のところ 詳細 (本書P211 詳細)に 演算命令以外でも キャリーフラグ(Cフラグ)が立つ、つまりすべての命令でCフラグ変化するというようなことが書かれていて、 ”これは仕様です” ということになっています(^^; 通常、演算命令等の結果でキャリーフラグを見ますが、これだと、演算命令の直後に桁あふれのジャンプ命令JNC をもってこないと、他の命令が先に実行されるとCフラグが書き換えられる。 ここを知らないと実行結果に悩むかもしれませんが、CPUの仕様 なので知らないといけませんね。 (チップにより、変則的な仕様というものに気づいたりしますが、こうやって設計者の都合で適当に作られるのね、適当にじゃないかもしれませんが・・) それと 分岐命令が1個しかないので if regA < 3 ならば ・・ なんていう <>にあたる比較命令もない。これをやるには桁あふれのジャンプ JNCを使う。 ;if X < 3 ならば の処理 は次のように 0 MOV A 、1 ;A ← 1(:X) 1 ADD A、12 ;12(:15−3) 2 JNC 5 ;(X+12)の桁あふれあり:次の行、 桁あふれなし:指定行へジャンプ 3 OUT 1 ;X > 3 4 JMP 6 ;6行へジャンプ 5 OUT 15 ;X ≦ 3 6 ; PICとか使っている人はこんなのも、より身近かかとおもいますが、、 AVRには 大小比較 < > 直接命令がアセンブラにあります(^^) 原始的な分だけ、補数や比較、条件分岐で ROMの容量制限もあってプログラムを工夫しないといけないし、 いろいろCPUが学べるようになっています。不便なところは、そういうことにしておきましょう なおシミュレータがあり、ダウンロードできます TD4シミュレータ |
始める電子回路 | CPUを作る | 回路がわかる本 | 始める電子工作 |
メインページへ |