MikeAssembler リファレンス - CalicoCPU

アーキテクチャ名

calico

概要

CalicoCPUは「Calculator IC organized CPU」の略である。
「74シリーズのロジックICで作る、ある程度本格的な計算ができるCPU」を目指した設計。

hardware_cpu/cpus/calico_cpu at main · mikecat/hardware_cpu · GitHub

入出力

CalicoCPUは、8ビットの入出力ポートを2個持つ。
各ビットごとに、出力(HIGH/LOW)か入力(Hi-Z)かを選択できる。
ポートからの入力は、バッファなどの影響で遅れることがある。(実装依存)

レジスタ

CalicoCPUは、以下のレジスタを持つ。

命令セット

MikeAssemblerでは、以下の命令をサポートしている。
命令およびレジスタ名の大文字・小文字は区別しない。

rdrsrt : 汎用レジスタ (A or B or C or D)
width : シフト幅 (0以上8以下の整数)
imm : 即値 (整数、許される範囲は命令による)
preg : ポート用レジスタ・ポート入力

汎用レジスタは、2ビットで以下のように表す。

レジスタビット
A00
B01
C10
D11

pregとしては、以下のものを用いることができる。
xには、0 (PORT0用) または 1 (PORT1用) が入る。
「出力」は汎用レジスタからpregにデータをコピーすること、「入力」はpregから汎用レジスタにデータをコピーすることである。

preg方向説明
PxOUT出力・入力 ポートに出力する値を表す。
PxDRIVE出力 ポートの各ビットに値を出力するかを表す。(1:出力する、0:出力しない(Hi-Z))
PxIN入力 ポートから読み取った値を表す。

ネイティブ命令

CalicoCPU自体で定義されている命令である。

命令意味命令コード (ビット)動作
MOV rd, rsレジスタ代入 dd00ss00rd ← rs
ADD rd, rsレジスタ加算 dd00ss01rd ← rd + rs
NAND rd, rsレジスタビットNAND dd00ss10rd ← rd NAND rs
SHL1 rd, width左シフト dd000w11
width=2 → w=0, width=4 → w=1
rd ← rd << width
SHR1 rd, width右シフト dd001w11
width=1 → w=0, width=2 → w=1
rd ← rd >> width (論理シフト)
MOVP rd, pregポート状態入力 dd01xp00
preg=PxIN → p=0, preg=PxOUT → p=1
rd ← preg
MOVP preg, rdポート状態出力 dd01xp10
preg=PxOUT → p=0, preg=PxDRIVE → p=1
preg ← rd
JAL rd, rsサブルーチン呼び出し dd01ss01rd ← PC+1
PC ← rs
JNZ rd, rs分岐 dd01ss11if (rd != 0) PC ← rs
MOVI1 rd, imm即値代入 dd10mmmm
immは0~15が有効である。
rd ← imm (ゼロ拡張)
ADDI rd, imm即値加算 dd11mmmm
immは-8~7が有効である。
rd ← rd + imm (符号拡張)

応用命令

アセンブラがネイティブ命令を組み合わせて実現する命令である。
命令数を指定する命令で、指定された命令数で表現できない場合はエラーになる。

命令意味動作ネイティブ命令数
NOP何もしないA ← A1
NOT rdレジスタビットNOTrd ← NOT rd1
AND rd, rs
(rdとrsは別のレジスタ)
レジスタビットANDrd ← rd AND rs2
OR rd, rs
(rdとrsは別のレジスタ)
レジスタビットORrd ← rd OR rs4
OR! rd, rs
(rdとrsは別のレジスタ)
レジスタビットOR
(rsの値を保持しない)
rd ← rd OR rs
rs ← 不定
3
XOR rd, rs, rt
(rd、rs、rtは全て別のレジスタ)
レジスタビットXOR
(rtを作業用に用いる)
rd ← rd XOR rs
rt ← 不定
5
SHL rd, width左シフト
(命令数は自動)
rd ← rd << width0~3
SHLk rd, width
(k=1,2,3)
左シフト
(命令数をkに指定)
rd ← rd << widthk
SHR rd, width右シフト
(命令数は自動)
rd ← rd >> width (論理シフト)0~4
SHRk rd, width
(k=1,2,3,4)
右シフト
(命令数をkに指定)
rd ← rd >> width (論理シフト)k
IN rd, x
(x=0,1 (式使用可))
ポート入力rd ← PxIN1
OUT x, rd
(x=0,1 (式使用可))
ポート出力PxOUT ← rd1
DRIVE x, rd
(x=0,1 (式使用可))
ポート出力モード設定PxDRIVE ← rd1
MOVI rd, imm
(-128≦imm≦255)
即値代入
(命令数は自動)
rd ← imm1~3
MOVIk rd, imm
(-128≦imm≦255、k=1,2,3)
即値代入
(命令数をkに指定)
rd ← immk

ヒント

直接ジャンプ命令は存在しない。
0番地でないaddrにジャンプしたい場合は、作業用レジスタをrdとして、

MOVI3 rd, addr
JNZ rd, rd

とすればよい。
使える場合は、MOVI3のかわりにより少ない命令数のMOVIkを使ってもよい。
MOVI3のかわりに命令数を自動で決定するMOVIを用いると、ラベルが収束しなくなる可能性がある。


戻る