パスワードを忘れた? アカウント作成
341176 journal

chocopaの日記: 「ロボットの起源」CPUの設計案

日記 by chocopa

「論理回路の最小単位」までは旧版のリライトだから特に問題は無いでしょう。

その次には、「基本的な論理回路」

さらにその次は、CPUになります。
CPUの機能次第では、「基本的な論理回路」で教えることが異なってくる可能性があります。

この2,3日はCPUのスペックと運用方法をあれこれ悩んでいました。
仕様の幅が色んな意味で広い。
考えがまとまらん。

そうだ!完成したCPUで何をするか決めればいいじゃないか!
手段は目的ではない!

と言う事で、約10年前の第1回ROBO-ONEに出場したバルキーに搭載するCPUを作る事にしました。
「トランジスタから始まり2足歩行ロボットを終点とした解説文」のゴールをオリジナルCPUでアップデートしたバルキーにするのです。
来年はROBO-ONE 10周年だし、いいじゃないか!

バルキーの機体構造はめちゃくちゃ簡単なので、2足歩行ロボットとしても最小構成で都合がいいですね。
CPU→コンパイラ→ロボットではなく、ロボット→コンパイラ→CPUと考えると設計方法としても道がスッキリしています。

解説文としては下から上ですが仕様としては上から下ですね。

と、言う事で、ロボットの仕様は決定。
機体も残っているので手間も少ないです。

次はコンパイラの仕様。
大昔にコンパイラを作ったことがあり、ロボットに丁度良い仕様なので流用することにしました。

それは、1989年2月に発売されたハイパーメディアパソコンFM-TOWNS用に作ったBASICコンパイラ「townesh compiler」です。

当時、FM-TOWNSのi80386ネイティブモードのパワーを体験するには事実上インタプリタであるF-BASIC386しかない状態で、386ASMやHigh-Cはかなり高価で買える人は殆ど居ませんでした。
そこで、フリーウエアのBASICコンパイラとして作ったのが「townesh compiler」です。

yaccやbisonなどのコンパイラ・コンパイラを使ったシフトリデュースパーサーではなく今はさっぱり見かけない再帰下降パーサーの言語です。(概ね中身の話ね。)

最終バージョンは1990/03/19ですね。21年も前かぁ。21歳の俺の作品(笑)

言語の規模は同程度でC#で作り直すことにします。
「townesh compiler」程度のコンパイラの吐くコードは、一般的なCPUの命令の一部しか使ってないので、その範囲でCPUを設計すればいいですね。
さらに、意識的に命令の種類を削減することが出来ます。
そして、コンパイラとCPUがお互いに何処を譲ればより良くなるかも検討できるのでコンパイラから設計するのは大変都合がよいです。
コンパイラから見て贅肉0%のCPUを目指すことが出来ます。

「townesh compiler」のドキュメントを下記に転載します。
最適化が無いみたいなことが書いてありますが、定数畳み込み最適化(コンパイル時に出来る計算はしてから出力に埋め込む)、演算強度低下最適化(÷2や×4などをシフト命令などの速い命令に置き換える)くらいはしてあった筈です。

TOWNESH.DOC 1990/03/19
--------------------------------
☆ タイトル:townesh compiler『試験版』 ver 0.1 ☆
        programed by K.OKAMOTO :free wear

        (要:F-BASIC386 386|ASM 386|LINK)

ファイル名、 townesh.bas TOWNESH 画面出力バージョン
                towneshf.bas TOWNESH ファイル出力バージョン
                test1.tow TOWNESH サンプルプログラム(ソース)
                test1.exp TOWNESH サンプルプログラム(実行形式)
                test2.tow TOWNESH サンプルプログラム(ソース)
                test2.exp TOWNESH サンプルプログラム(実行形式)
                test3.tow TOWNESH サンプルプログラム(ソース)
                test3.exp TOWNESH サンプルプログラム(実行形式)
                test4.tow TOWNESH サンプルプログラム(ソース)
                test4.exp TOWNESH サンプルプログラム(実行形式)
おまけ、 qsiki.bas 簡単な式解析サブルーチン

みなさんTOWNSライフいかがお過ごしでしょうか?
現在TOWNSの能力をフルに使える言語と言えば TOLLKIT
や HI-C となる訳ですが、割安とはいえ高くて手が出ない、
買ってもつかいこなす自信がない と言う方は多いのではないでしょうか?
そこでTOWNSの機能をできるだけ多くの方に使えるようコンパイラを
作っていきたいと思います。
まずは『試験版』としてTOWNESH ver0.1 を F-BASIC386
で組みましたので発表します。ただし現在のバージョンは『試験版』
であり後の『実用版』を組む前のアルゴリズムのテスト版であるため
入力したソースに対するアッセンブリ言語のソースを出力するだけです
ほとんどソースをそのまま対応するアッセンブリ言語へ変換するため
(最適化をしていないともいう)これからアッセンブリ言語を学ぼうと
思ってる方にはいい教材になるのではと思います。
(かなり汚いコードをはきますが・・)

【使い方】
F-BASICでTOWNESH.BASを実行するとファイル名を
聞いてきますのでソースファイルの名前を拡張子なしで入力してください
既に同ファイル名のASMのファイルがある場合は削除してください
基本的には行番号の無いBASICと思ってください現在の命令セットは
まだ暫定的なものなので次のバージョンで変わってしまうものもあります
ソースファイルは必ず 拡張子が、TOWのファイルでなければなりません
PUTCH・GETCH命令は MS-DOS 又は CONSOLE.EXE
上でのみ動作します。
サンプルプログラムはMS-DOS 又は CONSOLE.EXE上で使えます。

<<<  TOWNESH 文法  >>>

具体的な使い方についてはサンプルプログラムを見てください
以下に述べる説明に使われている言葉でわからないものが有る場合
F-BASIC386のマニュアルにたいがいのっているので
そちらで勉強してください
サンプルプログラムとあわせてごらん下さい。

演算子 :+,-,*,/,&,|,=,==,<>,<=,>=,(,)
                以上をC言語と同じ意味で使えます
                但し比較演算子は真で-1偽りで0を返します
                <注意>  =は代入の=  ==は比較の=

定数 :符号なし整数しか使えません(32bitの整数の範囲で)
                末尾にHを付けると16進数としてあつかいます

変数 :32bitの整数のみです 7文字以内で半角のアルファベット
                で大文字と小文字の区別は有りません 使う前に宣言する
                必要はありません また386ASMで予約されている名前は
                使用できません

FOR文 :BASICとの相違点は終値は定数しか使えません

IF文 :ブロックIF文となっています。書式は、
                IF 式 THEN 文・・ ELSE 文・・ ENDIF
                又は
                IF 式 THEN 文・・ ENDIF
                です。

WHILE文 :WHILE (式) 文・・ WEND です。

DIM文 :DIM 変数名(最大要素数)(注)同時に複数の宣言はできない

END文 :プログラムの一番最後に必ず付けて下さい 必ず一番最後ですよ

GOTO文 :GOTO *ラベル名  ラベル名へ飛びます

GOSUB文 :GOSUB *ラベル名  ラベル名のサブルーチンを呼びます

RETURN文 :RETURN サブルーチンから復帰します

PUTCH文 :PUTCH 数値 数値の下位8ビットをアスキーコードと
                見なして画面へ出力します。

GETCH文 :GETCH 変数   キーボードよりの入力データを変数に
                格納します。 BASICのINKEY$と同じです。
                入力が無い場合は0を返します。

ラベル :*ラベル名 ラベルを付けます ”L数字”というラベルは
                コンパイラが使用しているので使用しないでください。

;文 :;コメント  REM文です。ここより行末まで書かれている
                ことは無視されます。

[注意] ";"文以降以外はTABコードや全角文字は使用しないで下さい。

<構文>

演算子 +,-,*,/,&,|,=,==,<>,<=,>=,(,)

FOR 変数=式 TO 定数
 文
NEXT

IF 式 THEN
 文
ELSE
 文
ENDIF

IF 式 THEN
 文
ENDIF

WHILE 式
 文
WEND

DIM 変数名(最大要素数)

GOTO *ラベル名

GOSUB *ラベル名

RETURN

END

PUTCH 式

GETCH 変数

こんなものつかいものにならない!と言われてもかえす言葉もない
脆弱なコンパイラですが アッセンブラの下書きとか コンパイラ
そのものの勉強に使うなど 利用していただければ幸いです。
もともとC言語にBASICの甘さを入れてと考えていた訳ですが
どうも言語の強さと甘さはトレードオフの関係でただの構造化BASIC
になっていきそうです。
コンパイラはだいたいどう作っていけばいいのか分かってきた(つもりな)
ので、あと型の種類や命令の数を増やすのはそう困難なことではない
とおもっています。(量的な問題はある)
なお 次回ぐらいには TBIOS対応(特にグラフィック)と実行ファイルの
生成が可能なバージョンをおくれるかも知れません 実際TOOLKITの必要な
現バージョンは冒頭で述べただれでもつかえるということにはならない
ので 実行ファイルの生成は早急に解決しなければならない問題です
そしてHI-Cで書き直すつもりです。

<サンプルプログラム>

--------------------------------
;
; TEST1.TOW
; サンプルプログラム
;
;
for a=41h to 5ah
      putch a
      putch a | 20h
next
end

テストプログラムのひとつめはAからZまでの大文字と小文字を表示
するプログラムのつもりなのですが おおっと! FOR文 のバグ
でYまでしか表示しないではないか!
と言うことでFOR文のループ変数が終値を越えたらでは無く終値に
達したらループから抜けます。
--------------------------------

;
; TEST2.TOW
; サンプルプログラム
;
;
a=(b+c/(e-f))+(g-h*3)
end

これは計算するだけで、何にもしません 何のためにあるかといいますと
式をどのように料理しているか見ていただくためです。コンパイルした
オブジェクトと、このソースプログラムをLOOKで見比べて下さい。
--------------------------------
;
; TEST3.TOW
; サンプルプログラム
;
;
*lbl
getch a
if a==0 then goto *lbl endif
putch a
if a40h then goto *lbl endif
end

コンソール(キーボード)よりの入力そのまま出力(画面)します
@を入力すると終わります。(@はSHIFTを押しながら0を押します。)
--------------------------------
;
; TEST4.TOW
; サンプルプログラム
;
;
*lbl
getch a
if a==0 then goto *lbl endif
putch a
    if a>40h then
          goto *lbl
    else
          gosub *xxx
    endif
goto *owari

*xxx
putch a+1
putch a+2
putch 13
return

*owari
end

サブルーチンのつかいかたのサンプルです。どういう動作をするか考えて
下さい。特に意味のないことですが・・
--------------------------------

この議論は、chocopa (14067)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...