16命令アセンブラ
yacc構文解析とlex字句解析で、アセンブラから機械語に変換するツールを作った $ sudo apt install bison flex libbison-dev m4
~/mycom/prg$ make
全部相対アドレッシング、変わりに即値領域を作る
アセンブラ
ラベルは遅延評価
即値領域をメモリ最適化
スタックとローカル領域
integer廃止したい
ピンアサインと回路図
75Ω 同期信号
33Ω 輝度信号
内部ブロック図
VRAM
CROM
PPU
CPU
Stack
Program
Divider
greg
データ型の定義
bool: 論理型 (1ビット)
char: 文字型 (8ビット)
int: 整数、アドレス型 (16ビット)
☆ins: 命令型 (20ビット)
CPU のアドレス空間は割りきって 16 ビット。
ALU (演算回路) は20ビットにする。
ins という機械語命令専用のデータ型はオリジナル要素。
命令型 (ins 型) 20 ビットの内訳
上位 4 ビット: 命令ニーモニックコード
下位 16 ビット: オペランド (int 型、char 型、bool 型)
あいかわらず、命令は 16個 (4ビット分) しか作ってません。 直接アドレッシング命令のオペランドを書き換えて、
そのプログラムを RAM 上に配置しないといけない。
命令セットを16個しか用意しなかったぶんマクロアセンブラでゴリ押ししてるな。
・nop(何もしない命令)を「0を加算する命令」で代用
・goto命令は「pc(プログラムカウンタ)に値を書き込む」ことで実現
https://pbs.twimg.com/media/FyCA5cdaAAAyvPS.jpg
C 言語のプログラムと、人力で変換したアセンブリプログラム。
マジックナンバーだらけなので補足ですが、
ORG_BOOT は プログラム ROM の先頭アドレス、
1024~2047 はテキストVRAM、
128, 129, 130, 131, 132 は汎用レジスタ、
0 はプログラムカウンタがマッピングされてます。
https://pbs.twimg.com/media/DZjy6-hVAAAA6ZP.jpg
https://pbs.twimg.com/media/DZjzAI0U0AAD7dM.jpg
FPGA で CPU をハードウェア設計して、yaccとlexでアセンブラ作ってます。 機械語命令 16 個だけしか用意してないので、文字列を表示するだけで大変なコード量になってます。
https://pbs.twimg.com/media/DZ8cIxRU0AAttQr.jpg
https://pbs.twimg.com/media/DZ8cRW5UQAA7djT.jpg
yacc で C コンパイラ作成中……
とりあえず 変数定義・代入・加算・等価比較・while 文は実装できた。
次は、ポインタの実装だな。
C ソースコードと、生成アセンブリコード。
https://pbs.twimg.com/media/DaRV_0DVMAAkFnP.jpg
https://pbs.twimg.com/media/DaRWRoFUQAE6Q7w.jpg
とってもシンプルなプログラムになったでしょう?
https://pbs.twimg.com/media/DamKrUFVwAAwF2y.jpg
アスタリスク✳を表示するプログラム。
https://pbs.twimg.com/media/DamS6DTU8AAOfJv.jpg
https://pbs.twimg.com/media/DamS7cOU8AAk6Wi.jpg