はじめに
これは、「コンピュータシステムの理論と実装」(以下「Nand2Tetris」という)の第4章 機械語のプロジェクトに対するレポートである。
Qiitaでは、画像の利用に制約があるため、フローチャートなど掲載することは省いている。
プロジェクトに対するレポート
目標
- 機械語によるプログラミングを行いHackを知ること。
材料
- Nand2Tetrisで定義している機械語
- CPUエミュレータ
実装
乗算プログラム
Hackでは加算器しかないため、乗数分、被乗数を加算することで乗算を行う。
LOOPから抜け出す分岐は、ループの最初に入れている。そして分岐予測できるようにしている。
Mult.asm
// Put your code here:
@R2
M=0
(LOOP)
@R1
D=M
@END
D;JLE
@R0
D=M
@R2
M=D+M
@R1
M=M-1
@LOOP
0;JMP
(END)
@END
0;JMP
入出力操作プログラム
キーボード入力部とスクリーンペイント部に大きく分かれる。
ペイント部では、最初1ビットずつ変更しようとしたが、メモリはワード単位であることに気づきワード単位で置き換えるように変更している。
レジスタの使い方は以下の通りである。
| レジスタ | 内容 |
|---|---|
| R0 | 色 黒:−1、白:0 |
| R1 | ピクセルアドレス |
Fill.asm
// Put your code here:
@R0
M=0
@R1
M=0
(LOOP)
@KBD
D=M
@COLORBLACK
D;JEQ
@R0 //color
M=0
@PAINT
0;JMP
(COLORBLACK)
@R0 //color
M=-1
@PAINT
0;JMP
(PAINT)
@SCREEN
D=A
@8191
D=D+A
@R1 // Address
M=D
(FILL)
@R0 // color
D=M
@R1
A=M
M=D
@R1
MD=M-1
@SCREEN
D=D-A
@FILL
D;JGE
@LOOP
0;JMP
(END)
@END
0;JMP