suika.fam.cx:/~wakaba/archive/2005/cprocessor/

Files

仮想機械のようなものの説明

仮想機械のようなものの説明

計算機のようなものの仕様

命令ポインタ (プログラム・カウンタ) IP
16ビット。
命令レジスタ IR
8ビット。
索引レジスタ IX
16ビット。
アキュムレータ (汎用レジスタ) A, B
それぞれ8ビット。
フラグ・レジスタ
桁上がりフラグ C 1ビット
零フラグ Z 1ビット
主記憶装置
バイト番地16ビット。1バイトは8ビット。
ROM 000016〜7FFF16 番地
RAM 800016〜FFFF16 番地

エミュレータのようなものの使い方

エミュレータのようなものの使い方。

  1. ROM と RAM に初期データを入力し、読込みボタンを押す。 初期データは、1行に1番地分、番地 (16進数4桁) と初期値 (16進数2桁) をタブで区切って記入。
  2. リセットIP が0番地に設定される。
  3. 実行または次の1命令を実行

命令セット

命令名被演算子1 被演算子2説明
setixh id IP ← IP + 2, IXHid
setixl id IP ← IP + 2, IXLid
setaixh IP ← IP + 1, IXH ← A
setaixl IP ← IP + 1, IXL ← A
setbixh IP ← IP + 1, IXH ← B
setbixl IP ← IP + 1, IXL ← B
ldia id IP ← IP + 2, A ← id
ldib id IP ← IP + 2, B ← id
ldda IP ← IP + 1, A ← [IX]
lddb IP ← IP + 1, B ← [IX]
ldixha IP ← IP + 1, A ← IXH
ldixla IP ← IP + 1, A ← IXL
ldixhb IP ← IP + 1, B ← IXH
ldixlb IP ← IP + 1, B ← IXL
stda IP ← IP + 1, [IX] ← A
stdb IP ← IP + 1, [IX] ← B
adda IP ← IP + 1, A ← A + B (C, Z)
addb IP ← IP + 1, B ← A + B (C, Z)
suba IP ← IP + 1, A ← A − B (C, Z)
subb IP ← IP + 1, B ← A − B (C, Z)
anda IP ← IP + 1, A ← A & B (Z)
andb IP ← IP + 1, B ← A & B (Z)
ora IP ← IP + 1, A ← A | B (Z)
orb IP ← IP + 1, B ← A | B (Z)
nota IP ← IP + 1, A ← ¬A (Z)
notb IP ← IP + 1, B ← ¬B (Z)
inca IP ← IP + 1, A ← A + 1 (C, Z)
incb IP ← IP + 1, B ← B + 1 (C, Z)
deca IP ← IP + 1, A ← A − 1 (C, Z)
decb IP ← IP + 1, B ← B − 1 (C, Z)
cmp IP ← IP + 1, if A = B then Z = 1 else Z = 0 (Z)
jp memH memL IP ← mem
jpix IP ← IX
jpc memH memL if C = 1 then IP ← mem else IP ← IP + 3
jpz memH memL if Z = 1 then IP ← mem else IP ← IP + 3
nop IP ← IP + 1

括弧内は、フラグが更新されることを意味します。 算術演算は符号無し2進数として行います。論理演算はビット毎に行います。

アセンブリ言語の仕様

アセンブラのようなもので使われているアセンブリ言語の仕様。

命令は、1行に1つ記入します。 名札、命令名、被演算子をタブで区切ります。
名札は省略可能ですが、名札を省略する場合でもタブは必要です。 被演算子の個数は命令名に依存します。 0個の場合は命令名と被演算子の間のタブを省略できます。
命令名も省略可能です。その行は機械語命令に翻訳されません。 命令名を省略した場合の被演算子の数は0個でなければなりません。 命令名を省略した場合はその前のタブも省略できます。
行は命令ではなく、定数を定義することもできます。
名札
名札は、プログラムの簡単な説明として、 あるいは被演算子においてその行が機械語に翻訳されたものの最初の番地の意味で使うことができます。
名札は大文字・小文字を区別しません。 同じ名札を別の行に割当てることはできません。
名札が割当てられた行で命令名が省略されている場合は、 その次に命令名がある行の機械語命令の最初の番地を表します。 ただし、そのような行が存在しない場合は、最後の機械語命令の最初の番地を表します。 空のプログラムでは、先頭番地を表します。
被演算子として名札を参照する時は、 使用する場所よりも後の行で宣言されている名札も使うことができます。
命令名
命令名の大文字・小文字は区別しません。
被演算子
命令によっては被演算子が必要です。個数は命令により異なります。
被演算子を複数指定する場合は、読点 (COMMA) で区切ります。 読点の前後には間隔 (SPACE) を入れることができます。
各被演算子は、10進数、16進数、2進数、名札参照、 定数参照のいずれかの方法で指定します。
10進数
10進数字の列として記述します。ただし、 2桁以上ある時は先頭の数字が零 (DIGIT ZERO) であってはなりません。 符号無し8ビット整数でなければなりません。
16進数
文字列 0x の後、16進数字の列として記述します。 大文字・小文字は区別しません。 符号無し8ビット整数でなければなりません。
2進数
文字列 0b の後、2進数字の列として記述します。 符号無し8ビット整数でなければなりません。
定数
定数を宣言する時は、1行に定数名と値をタブで区切って記述します。
定数名は $ (DOLLAR SIGN) で始まらなければなりません。 大文字・小文字は区別しません。 同じ名前の定数が複数宣言されていてはなりません。
定数の値として指定できるのは、各被演算子と同じです。
定数参照は値として指定されたものに機械語翻訳時に置き換えられます。
定数参照よりも前に参照されている定数が宣言されていなければなりません。
注釈
; (SEMICOLON) から行末までは注釈とみなし、 機械語翻訳では無視します。この無視は各行を解釈するより前に行います。