公開日:2023/07/01
title.png

26th Season


#26-3 Moscoviumのスケールダウン

 このページは、本HPで作成したオリジナル8ビットCPUコアTennessineのインストラクションセットマニュアルです。
 詳細については、以下リンクから本文を参照してください。

 本文へ戻る


Tennessine Instruction Set Manual

Tennessine CPUコア概要

 Tennessineは、シンプルな8ビットCPUコアです。ハーバードアーキテクチャを採用しており、命令コードを16ビットフェッチバスから読み込んで実行します。同じく16ビットのメモリバスを通して、CPU外部のRAMやI/Oユニット(メモリマップドI/O)などのリソースにアクセスすることが出来ます。
 フェッチバス、メモリバス共、16ビットアドレスバスを持っており、従ってメモリ空間は最大64Kバイトです。
 命令コードは16ビット固定長で、フェッチバス上の16ビットワード境界に乗っていることを前提とします。言い換えると、常に偶数バイトアドレスから16ビット命令コードが配置されています。
 プログラムカウンタpcはリセット信号で0x0000に初期化されるので、Tennessineリセット解除後、常に0x0000番地の命令から実行を開始します。

Moscoviumシリーズ

 Moscoviumシリーズは、オリジナル16ビットCPUコアであるMoscoviumを起点とする、スケーラブルなCPUコアシリーズです。詳しくは、こちらをご参照ください。

プログラマモデル

 Tennessineのプログラマモデルは以下図の通りです。

a263_prgmdl.png

 汎用レジスタ8本(r0〜r7)と、状態レジスタsr、プログラムカウンタpc、スタックポインタsp、割り込みベクタivの構成です。すべてのレジスタはリセット解除後、0x0000に初期化されています。汎用レジスタ8本(r0〜r7)には裏レジスタ(q0〜q7)が有って、cendw命令によって、表と裏の記憶データをレジスタ毎に入れ替えて使用することが可能です。
 主にメモリアクセス命令では、暗黙的に裏レジスタとのレジスタペアQn:Rnを使って、16ビットアドレスや16ビットデータを指定します。その他の演算命令では、8ビット演算を実行するため、演算対象は表のRnレジスタ8ビットです。裏レジスタQnを演算対象に指定することはできません。

制御レジスタ

 srは状態レジスタです。Moscovimからのサブセットとなっています。同じ名前のビットはMoscoviumと同じなので、こちらの説明をご覧ください。

 pcはプログラムカウンタです。Moscoviumと同じなので、こちらの説明をご覧ください。

 spはスタックポインタです。Moscoviumと同じなので、こちらの説明をご覧ください。

 ivは割り込みベクタです。Moscoviumと同じなので、こちらの説明をご覧ください。

 trはTennessineには存在しません。書き込みは無効、読み出すと常に0x0000が読み出されます。

ベクタ割り込み方式

 Moscoviumと同じなので、こちらの説明をご覧ください。

命令コード

 Moscoviumと同じなので、こちらの説明をご覧ください。

命令セット一覧

 以下に命令セットの形式順で命令セット一覧表を示します。

No. Inst Opr1 Opr2 Type Memo O15
(1b)
RiBr
(4b)
RR
(5b)
R
(3b)
NO
(11b)
1 nop NO no operation 0 0 0
2 pause NO pause until interrupt request coming 0 0 1
3 rtnw NO return from jalw 0 0 2
4 rti NO return from interrupt 0 0 3
5 brn NO branch never 0 0 10
6 bra dsp11 (always) BR branch always 0 1
7 bne dsp11 (Z=0) BR branch if not equal 0 2
8 beq dsp11 (Z=1) BR branch if equal 0 3
9 bcc dsp11 (C=0) BR branch if carry clear 0 4
10 blo dsp11 (C=0) BR branch if lower (unsigned) 0 4
11 bcs dsp11 (C=1) BR branch if carry set 0 5
12 bhs dsp11 (C=1) BR branch if higher or same (unsigned) 0 5
13 bpl dsp11 (N=0) BR branch if plus or zero 0 6
14 bmi dsp11 (N=1) BR branch if minus 0 7
15 bvc dsp11 (V=0) BR branch if overflow clear 0 8
16 bvs dsp11 (V=1) BR branch if overflow set 0 9
17 bge dsp11 (N^V=0) BR branch if greater or equal (signed) 0 10
18 blt dsp11 (N^V=1) BR branch if less than (signed) 0 11
19 mulur Rd Rs RR multiply unsigned reversal 0 14 16
20 mulsr Rd Rs RR multiply signed reversal 0 14 17
21 csft Rd Rs RR rotate shift with c flag 0 14 23
22 or Rd Rs RR bitwise or 0 15 0
23 and Rd Rs RR bitwise and 0 15 1
24 eor Rd Rs RR bitwise exclusive or 0 15 2
25 mov Rd Rs RR move 0 15 3
26 movtc Rc Rs RR move to control register 0 15 4
27 movfc Rd Rc RR move from control register 0 15 5
28 add Rd Rs RR add 0 15 6
29 adc Rd Rs RR add with carry 0 15 7
30 sub Rd Rs RR subtract 0 15 8
31 sbb Rd Rs RR subtract with borrow 0 15 9
32 cmp Rd Rs RR compare 0 15 10
33 cmb Rd Rs RR compare with borrow 0 15 11
34 ldb Rd Rs RR load data byte 0 15 12
35 stb Rd Rs RR store data byte 0 15 13
36 ldw Rd Rs RR load data word 0 15 14
37 stw Rd Rs RR store data word 0 15 15
38 lsft Rd Rn RR logical shift 0 15 16
39 asft Rd Rn RR arithmetical shift 0 15 17
40 mulu Rd Rs RR multiply unsigned 0 15 20
41 muls Rd Rs RR multiply signed 0 15 21
42 sbbz Rd R subtract zero with borrow 0 15 28 0
43 cmbz Rd R compare zero with borrow 0 15 28 1
44 adcz Rd R add zero with carry 0 15 29 6
45 jmp Rn R jump 0 15 30 0
46 jalw Rn R jump and link word stack 0 15 30 1
47 sesrl imm3 R set sr low byte 0 15 30 2
48 sesrh imm3 R set sr high byte 0 15 30 3
49 clsrl imm3 R clear sr low byte 0 15 30 4
50 clsrh imm3 R clear sr high byte 0 15 30 5
51 neg Rd R negate sign 0 15 31 0
52 not Rd R bitwise not 0 15 31 1
53 cendw Rd R convert endian word 0 15 31 2
54 exsgw Rd R extend sign bit word 0 15 31 3
55 pushw Rs R push register word on stack 0 15 31 4
56 popw Rd R pop register word from stack 0 15 31 5
57 pushcw Rc R push control register word on stack 0 15 31 6
58 popcw Rc R pop control register word from stack 0 15 31 7
59 ori Rd imm8 RI bitwise or immediate 1 0
60 andi Rd imm8 RI bitwise and immediate 1 1
61 eori Rd imm8 RI bitwise exclusive or immediate 1 2
62 addi Rd imm8 RI add immediate 1 3
63 subi Rd imm8 RI subtract immediate 1 4
64 cmpi Rd imm8 RI compare immediate 1 5
65 ldbiu Rd imm8 RI load data immediate unsigned byte 1 6
66 ldbil Rd imm8 RI load data immediate low byte 1 7
67 ldbih Rd imm8 RI load data immediate high byte 1 8
68 ldcl Rc imm8 RI load data immediate control register low byte 1 9
69 ldch Rc imm8 RI load data immediate control register high byte 1 10
70 lsfti Rd imm8 RI logical shift immediate 1 11
71 asfti Rd imm8 RI arithmetical shift immediate 1 12
72 csfti Rd imm8 RI rotate shift with c flag immediate 1 13

命令セット

 各命令をアルファベット昇順で説明します。
 Tennessineの命令セットは、Moscoviumのサブセットとなっています。以下、Tennessineで使用可能な命令についてのみ、記載しています。Tennessineで定義されていない命令を実行すると、nop命令と同じ動作となります。

 Moscoviumで定義されていてTennessineでは未定義な命令を、以下にまとめておきます。

 他にも、汎用レジスタの表/裏構成や「裏:表」形式の16ビットレジスタペアを暗黙に使う命令等、Moscoviumとは動作の異なる命令が有ります、以下仕様で確認してください。

adc (add with carry)

adcz (add zero with carry)

add (add)

addi (add immediate)

and (bitwise and)

andi (bitwise and immediate)

asft (arithmetical shift)

asfti (arithmetical shift immediate)

bcc (branch if carry clear)

bcs (branch if carry set)

beq (branch if equal)

bge (branch if greater or equal;signed)

bhs (branch if higher or same;unsigned)

blo (branch if lower;unsigned)

blt (branch if less than;signed)

bmi (branch if minus)

bne (branch if not equal)

bpl (branch if plus or zero)

bra (branch always)

brn (branch never)

bvc (branch if overflow clear)

bvs (branch if overflow set)

cendw (convert endian word)

clsrh (clear sr high byte's bit)

clsrl (clear sr low byte's bit)

cmb (compare with borrow)

cmbz (compare zero with borrow)

cmp (compare)

cmpi (compare immediate)

csft (rotate shift with c flag)

csfti (rotate shift with c flag immediate)

eor (bitwise exclusive or)

eori (bitwise exclusive or immediate)

exsgw (extend sign bit word)

jalw (jump and link word stack)

jmp (jump)

ldb (load data byte)

ldbih (load data immediate high byte)

ldbil (load data immediate low byte)

ldbiu (load data immediate unsigned byte)

ldch (load data immediate control register high byte)

ldcl (load data immediate control register low byte)

ldw (load data word)

lsft (logical shift)

lsfti (logical shift immediate)

mov (move)

movfc (move from control register)

movtc (move to control register)

muls (multiply signed)

mulsr (multiply signed reversal)

mulu (multiply unsigned)

mulur (multiply unsigned reversal)

neg (negate sign)

nop (no operation)

not (bitwise not)

or (bitwise or)

ori (bitwise or immediate)

pause (pause until interrupt request coming)

popcw (pop control register word from stack)

popw (pop register word from stack)

pushcw (push control register word on stack)

pushw (push register word on stack)

rti (return from interrupt)

rtnw (return from jalw)

sbb (subtract with borrow)

sbbz (subtract zero with borrow)

sesrh (set sr high byte's bit)

sesrl (set sr low byte's bit)

stb (store data byte)

stw (store data word)

sub (subtract)

subi (subtract immediate)

アセンブラ

 アセンブラの入手方法、文法などについて記載されたマニュアルはこちらをご参照ください。

改訂履歴

日付 項目 備考
2024/03/16 プログラマモデル更新 状態レジスタsrにIDフィールドを追加。
2023/07/01 Tennessine命令セットマニュアル 作成。

btn_arduino.png btn_moscovium.png

home