公開日:2021/02/20
title.png

15th Season


#15-3 マイコンを作るよ(付録)

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

 本文へ戻る


Moscovium Instruction Set Manual

Moscovium CPUコア概要

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

Moscoviumシリーズ

 Moscoviumシリーズは、オリジナル16ビットCPUコアMoscoviumを起点とする、スケーラブルなCPUコアシリーズです。
 16ビットMoscoviumから、上位側にオリジナル32ビットCPUコアNihonium、下位側にオリジナル8ビットCPUコアTennessineがスケーラブルに展開されています。Moscovium,Nihonium,Tennessineの各CPUコアをまとめてMoscoviumシリーズと呼びます。

  各種マニュアルへのリンク:


 Moscoviumシリーズは、基本的に16ビット固定長の共通した命令コードを持ち、ハンドリングするデータのビット幅が、8ビット以下である場合、全く同じオブジェクトコードレベルのプログラムを、全てのCPUコアで共通して動作させることができます。

※ただし、ほとんどのプログラムでは、最低でも16ビット長のデータハンドリングが必要となるため、8ビットCPUであるTennessineコアだけは、別プログラムが必要となることが多いです。

 以下表にMoscoviumシリーズの特徴を示します。

機能\CPUコア Moscovium Nihonium Tennessine
演算器ビット幅 16ビット 32ビット 8ビット
命令コード 16ビット固定長 16ビット固定長
一部多ワード長命令
16ビット固定長
命令数 99個 121個 72個
汎用レジスタ数 8個×4バンク 8個×2バンク 8個×2(表/裏)
メモリバス幅 16ビット 32ビット 16ビット
メモリバス空間 32ビット(4Gバイト) 32ビット(4Gバイト) 16ビット(64Kバイト)
フェッチバス幅 16ビット 16ビット 16ビット
フェッチバス空間 16ビット(64Kバイト) 16ビット(64Kバイト) 16ビット(64Kバイト)
論理規模 約3,000LUT 約6,000LUT 約1,500LUT
乗算命令 16ビットコプロセッサ
(1サイクル)
32ビット内蔵
(2サイクル)
8ビット内蔵
(1サイクル)
除算命令 32ビットコプロセッサ
(14サイクル)
32ビット内蔵
(10サイクル)
浮動小数点 16ビット半精度
 コプロセッサ
16ビット半精度
32ビット単精度
 コプロセッサ

 8〜32ビットまで、スケーラブルに展開されているので、マクロアセンブラレベルで同じプログラムを使用して処理が可能です。データビット幅等による処理能力の違いや、FPGAボードの集積論理規模(LUT数)等に従った柔軟なCPU選択を提供します。

CPUコア名の由来

 CPUコア名のMoscovium/Nihonium/Tennessineは、原子の名前に由来しています。

 いずれの原子も質量数100を超える重たい原子であり、その様な原子は不安定で、安定して自然界に存在できません。皆、数ミリ秒オーダの半減期で崩壊して、より軽い原子へ変化して行く放射性物質です。ミリ秒オーダでしか存在できない原子のため、存在は予想できても確認することができず、古い周期表などでは名前が明記されていない物も見かけます。

 とある同位体は、

 することが知られています。これをビット幅の小さい8ビットCPUから順に割り当てました。

プログラマモデル

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

a153_prgmdl.png

 汎用レジスタ8本(r0〜r7)と、状態レジスタsr、プログラムカウンタpc、スタックポインタsp、割り込みベクタiv、一時レジスタtrの構成です。すべてのレジスタはリセット解除後、0x0000に初期化されています。汎用レジスタ8本には4つのバンクが有って、srレジスタの{BK1,BK0}フィールドにて、切り替えて使用することが可能です。

制御レジスタ

 srは状態レジスタです。演算結果を示すフラグビット(N,C,V,Z)等、CPUの状態を示すビットを備えています。

  状態ビット:


 pcはプログラムカウンタです。pcの指し示すアドレスからプログラムコードをフェッチして実行します。フェッチすると、自動的にインクリメント(+2加算)されます。
 pcの指し示すアドレスは、フェッチすべき命令のバイトアドレスです。命令コードは16ビット固定長で、16ビットワード境界に乗っているので、pcは常に偶数となります。pcが16ビット長なので、プログラムメモリ空間は最大64Kバイトです。
 pcはリセット解除後、0x0000に初期化されているので、Moscoviumは0x0000番地から命令を実行開始します。


 spはスタックポインタです。Moscoviumのスタックは、「フル下降型」で固定です。スタックの構成方法については以下の通りとなります。


 ivは割り込みベクタです。Moscoviumが割り込みを受け付けると、プログラムカウンタpc→状態レジスタsrの順でスタックに積んだ後、pc=ivとしてivが示すアドレスにジャンプします。
 ベクタ割り込み方式についても、ご確認ください。


 trは一時レジスタです。スタックポインタ相対間接アドレッシング命令(ldwsp命令stwsp命令)が一時的に使用して、データを破壊します。対象の命令を使わない時は、ユーザリソースとして使用可能です。
 以下の如く、レジスタバンク間のデータ転送などに使用することが可能です。

  ldcl sr,0x01  // バンク1を選択
  movtc tr,r1
  ldcl sr,0x02  // バンク2を選択
  movfc r1,tr



 通常、Moscoviumのアドレス空間は16ビット(64Kバイト)ですが、これを32ビット(4Gバイト)に拡張して使うことが出来ます。
 32ビット拡張アドレスは、trレジスタを上位16ビット、汎用レジスタRnを下位16ビットとするレジスタペアで指定します。
 従来のldb命令stb命令ldw命令stw命令では、16ビットアドレス空間へのアクセスとなり、32ビット拡張アドレス空間へアクセスする命令は、ldbx命令stbx命令ldwx命令stwx命令となります。

  // 32ビット拡張バス空間へのアクセス例
  equ adr32,0x00801234
  ldc tr,adr32>>16
  ldwi r7,adr32&0xffff
  ldwi r0,0xabcd
  stwx [r7],r0
  ldbx r1,[r7]


 tr=0だった場合、通常の16ビット空間へのアクセスと同じになります。24ビットに拡張されたメモリ空間(メモリマップ)に関してはこちらをご参照ください。

 一時レジスタtrを破壊する命令や、割り込み処理中でtrを使う場合など、十分注意して使用してください。

ベクタ割り込み方式

 割り込みベクタivの最下位ビットにVEビットが割り当てられています。
 割り込みベクタは、ワードアドレスを指定するレジスタなので、最下位ビット=0として設定するのが普通です。

 VE=1と設定した時がベクタ割り込み方式の割り込みとなります。以下に割り込みベクタテーブルの作成例を示しておきます。

  // ================================
  // interrupt vector table
  vectab:
  bra setup     // 00: (reserved)
  datw lab_interr  // 01: ICR1
  datw lab_interr  // 02: ICR2
  datw lab_extint0  // 03: EIR0
  datw lab_interr  // 04: EIR1
  datw lab_interr  // 05: SRAR
  datw lab_interr  // 06: STAR
  datw lab_interr  // 07: MRAR
  datw lab_interr  // 08: MTER
  datw lab_interr  // 09: (reserved)
  datw lab_interr  // 10: CMBR0
  datw lab_interr  // 11: CMAR0
  datw lab_interr  // 12: OVFR0
  datw lab_interr  // 13: (reserved)
  datw lab_interr  // 14: CMBR1
  datw lab_interr  // 15: CMAR1
  datw lab_interr  // 16: OVFR1
  datw lab_interr  // 17: (reserved)
  datw lab_interr  // 18: (reserved)
  datw lab_interr  // 19: (reserved)
  datw lab_interr  // 20: (reserved)
  datw lab_interr  // 21: (reserved)
  datw lab_interr  // 22: LOFR
  datw lab_interr  // 23: RTCR
  datw lab_interr  // 24: CENR
  datw lab_interr  // 25: SMUR1
  datw lab_interr  // 26: SMRR1
  datw lab_interr  // 27: FTAR1
  datw lab_interr  // 28: FRAR1
  datw lab_interr  // 29: SMUR2
  datw lab_interr  // 30: SMRR2
  datw lab_interr  // 31: FTAR2
  datw lab_interr  // 32: FRAR2

  org 0x0800,align
  // interrupt error routine
  interr:
  // something to do
  rti

  // EIR0 interrupt service routine
  extint0:
  // something to do
  rti


 この(↑)ベクタテーブルでは外部端子割り込みEIR0だけに、有効なISRアドレス(extint0)が設定されているので、EIR0割り込みを受け付けると正しく割り込み処理が実行されます。必要に応じて、割り込みを受け付けたいベクタに、有効なISRアドレスを設定してください。
 また、ベクタ番号0番は存在しないため、ivレジスタで指定したアドレス+0番地のデータは不問です。上のコード例では、エラー処理に飛ばすための「bra interr」を配置しています。データは不問なので、ダミーデータでもnop命令等でも問題ありません。

 上に示したベクタテーブルを割り込みベクタivに設定するには、以下の様にします。

  ldc iv,lab_vectab+ivec_ve

 ivec_veを追加して、VEビットを立てる必要があります。ベクタテーブルアドレスを指定したにもかかわらず、VEビット=0で設定してしまった場合、ivレジスタの示すvectabアドレスをISRの先頭アドレスと見てジャンプして、そこにある「bra interr」によって、エラー処理ルーチンにジャンプすることになります。
 ivec_veは、共通インクルードファイル(mcoc115.incl)で定義されています。「equ ivec_ve,0x0001」です。

半精度浮動小数点演算ユニット(Half precision FPU)

 コンパイルオプションで半精度浮動小数点演算ユニット(HFPU)を選択すると、半精度浮動小数点演算を実行する命令が使用可能となります。
 半精度浮動小数点数(IEEE 754 binary16、half-float、FP16)は、C言語で一般的に適用されているfloat型(32ビット)、double型(64ビット)に対して、16ビット長の浮動小数点数表現です。IEEE754では、「交換形式」として定義されていて、データ転送やストレージに使用される形式とされています。

 half型のバイナリデータは以下図のような形式となっています。

a165_half.png

 符号(Sx)1ビット、指数(Ex’)5ビット、仮数(Fx’)10ビットの計16ビットです(↓)。

  half型X=(−1)Sx×0x1.<Fx’>×2Ex’−15

 16ビットCPUであるMoscoviumにとって、非常に扱い易いサイズの浮動小数点数値です。Moscoviumの汎用レジスタ(16ビット)をそのまま浮動小数点レジスタに転用して、レジスタ間の演算を実行するコプロセッサがHalf precision FPU(HFPU)であり、コンパイルオプションで有り/無しを選択できるようになっています。

 half型で表現可能な数値は、−65,504〜+65,504、±INF(無限大)、±0、NaN(非数)となっていて、IEEE754に規定されている非正規化数は、全て0と見なして演算します。

 仮数Fxの有効ビット数が10ビットなので、10進数換算ではlog10(210)≒3.010と、有効数字3桁ほどです。

※尚、複数パタンの表現が可能なNaNや、未対応の非正規化数が入力された場合、各々NaN(0xfe00)とゼロへ縮退して処理します。


 非有限値との演算


 浮動小数点数値の大小比較は、hcmp命令を使います。

  例)half型汎用レジスタr0とr1の大小を比較する
  hcmp r0,r1  // hcmp命令によって、状態レジスタsrのフラグがセットされる
  beq equal  // r0=r1の時、分岐
  bne not_equal  // r0≠r1の時、分岐
  bmi less_than  // r0<r1の時、分岐
  bpl greater_or_equal  // r0≧r1の時、分岐
  bcs equal2  // r0=r1(NaN同士、INF同士のケースもイコール=と見なす)の時、分岐
  bvs exception_nan  // r0−r1=NaNの時、分岐


 hcmp命令(hcmp Rd,Rs)では、Rd−Rsの演算を実行して、演算結果に従って状態レジスタsrの演算フラグ(N,C,V,Z)をセットします。減算結果Rd−RsはレジスタRdには戻さないので、Rd,Rs共、命令実行時の値が保存されます。
 Zフラグのセットに於いては、常に0=−0として扱います。従って、Rd−Rs=−0の場合、N=1、Z=1となります(そのまま「負のゼロ」。hsub+movでは、N=1、Z=0であることに留意)。


 従来通り、減算hsub命令を使う方法も有効です(↓)。ただし、INFやNaN、−0等の例外を処理するのに手間がかかるため、hcmp命令の使用を推奨します。

  例)half型汎用レジスタr0とr1の大小を比較する
  hsub r0,r1
  mov r0,r0  // hsub命令ではsrレジスタの演算フラグが変化しないので必要
  beq equal  // r0=r1の時、分岐
  bpl greater_or_equal  //r0≧r1の時、分岐
  bmi less_than  // r0<r1の時、分岐


 mov命令でセットされるsrレジスタのフラグは、ネガティブNフラグとゼロZフラグだけなので、有効な分岐命令はbeq命令bne命令bpl命令bmi命令です。
 r0,r1が無限大(INF)やNaNなど非有限値の場合や、演算結果が−0(負号付きゼロ)だった場合の大小比較には注意して下さい。hsub命令(上のコード例)では大小比較不能なケースがあります。

 特に、負号付きゼロは「−10×0=−0」など、比較的頻繁に出現します。half型バイナリデータでは、half(−0)=0x8000であり、「mov r0,r0」によって、状態レジスタsrのネガティブNフラグが立って、同ゼロZフラグがネゲートされるため、beq命令では分岐せず、bmi命令で分岐します。

 この様な特別な値(INFやNaN等)については、以下の様にuint16値として直接比較することを推奨します。

  例)half型汎用レジスタr0がINFがどうか?
  ldwi r1,0x7c00  // 0x7c00はhalf型では+INFの表現
  cmp r0,r1  // r0が+INFか?
  beq r0_is_inf


 C言語などを使ってプログラミングしていると、この辺りの例外処理はC言語が処理してくれています。float型やdouble型だと、演算結果がオーバフロウしてINFが出力されるケースも少ないでしょう。half型では、絶対値が65,504を超えただけでINFが出力されるので、このような非有限値の例外処理を実行すべきケースが増加しています。
 しかも、Moscoviumプログラミングの基本はアセンブラなので、十分注意してプログラムする必要があります。

命令コード

 Moscoviumの命令コードは16ビット固定長で、プログラムメモリ空間の16ビットワード境界に乗っています。
 命令セットの形式(命令群)と命令コードの対応は以下表の様になっています。

ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
NO命令群 0 0 0 0 0 OPC_NO
BR命令群 0 OPC_BR dsp11
RR命令群 0 1 1 1 0/1 OPC_RR Rd Rs
R命令群 0 1 1 1 1 1 1 1 0/1 0/1 OPC_R Rn
RI命令群 1 OPC_RI Rd imm8

 汎用レジスタを指定するRd,Rs,Rn等のフィールドには、3ビット(レジスタ番号0〜7を表現するため)が割り当てられています。即値imm8とディスプレースメント値dsp11も、命令コード内に含まれています。

 OPC_BRに割り当てた4ビット(0x0〜0xfまで16個)の中で、0x0と0xe、0xfの3コードはBR命令群以外の命令に割り当たっているので、BR命令群に使える命令コード数は最大13個です。
 同様に、OPC_RRに割り当てた6ビット(0x00〜0x3fまで64個)の中で、0x3c〜0x3fの4コードはR命令群に割り当たっているので、RR命令群に使えるコード数は最大60個となります。

 Nihoniumに於いて、一部、16ビット/32ビット即値を取る命令では、16ビット命令コードの直後に16ビットまたは32ビット即値データが続き、2〜3ワード命令を形成します。

命令セット一覧

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

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 divlu NO divide long unsigned 0 0 4
6 divls NO divide long signed 0 0 5
7 divlq NO load quotient and remainder 0 0 6
8 divlr NO restore quotient and remainder 0 0 7
9 brn NO branch never 0 0 10
10 divlqr NO load quotient and remainder reversal 0 0 12
11 divlrr NO restore quotient and remainder reversal 0 0 13
12 bra dsp11 (always) BR branch always 0 1
13 bne dsp11 (Z=0) BR branch if not equal 0 2
14 beq dsp11 (Z=1) BR branch if equal 0 3
15 bcc dsp11 (C=0) BR branch if carry clear 0 4
16 blo dsp11 (C=0) BR branch if lower (unsigned) 0 4
17 bcs dsp11 (C=1) BR branch if carry set 0 5
18 bhs dsp11 (C=1) BR branch if higher or same (unsigned) 0 5
19 bpl dsp11 (N=0) BR branch if plus or zero 0 6
20 bmi dsp11 (N=1) BR branch if minus 0 7
21 bvc dsp11 (V=0) BR branch if overflow clear 0 8
22 bvs dsp11 (V=1) BR branch if overflow set 0 9
23 bge dsp11 (N^V=0) BR branch if greater or equal (signed) 0 10
24 blt dsp11 (N^V=1) BR branch if less than (signed) 0 11
25 hadd Rd Rs RR half add 0 14 0
26 hsub Rd Rs RR half subtract 0 14 1
27 hmul Rd Rs RR half multiply 0 14 2
28 hdiv Rd Rs RR half divide 0 14 3
29 hneg Rd Rs RR half negate sign 0 14 4
30 hhalf Rd Rs RR cast uint16 to half 0 14 5
31 huint Rd Rs RR cast half to uint16 0 14 6
32 hfrac Rd Rs RR half obtain fraction 0 14 7
33 hmvsg Rd Rs RR half move sign bit 0 14 8
34 hsat Rd Rs RR half saturate infinite number 0 14 9
35 hcmp Rd Rs RR half compare 0 14 10
36 mulur Rd Rs RR multiply unsigned reversal 0 14 16
37 mulsr Rd Rs RR multiply signed reversal 0 14 17
38 divur Rd Rs RR divide unsigned reversal 0 14 18
39 divsr Rd Rs RR divide signed reversal 0 14 19
40 csft Rd Rs RR rotate shift with c flag 0 14 23
41 ldbx Rd Rs RR load data byte extended address 0 14 28 - -
42 stbx Rd Rs RR store data byte extended address 0 14 29 - -
43 ldwx Rd Rs RR load data word extended address 0 14 30 - -
44 stwx Rd Rs RR store data word extended address 0 14 31 - -
45 or Rd Rs RR bitwise or 0 15 0
46 and Rd Rs RR bitwise and 0 15 1
47 eor Rd Rs RR bitwise exclusive or 0 15 2
48 mov Rd Rs RR move 0 15 3
49 movtc Rc Rs RR move to control register 0 15 4
50 movfc Rd Rc RR move from control register 0 15 5
51 add Rd Rs RR add 0 15 6
52 adc Rd Rs RR add with carry 0 15 7
53 sub Rd Rs RR subtract 0 15 8
54 sbb Rd Rs RR subtract with borrow 0 15 9
55 cmp Rd Rs RR compare 0 15 10
56 cmb Rd Rs RR compare with borrow 0 15 11
57 ldb Rd Rs RR load data byte 0 15 12
58 stb Rd Rs RR store data byte 0 15 13
59 ldw Rd Rs RR load data word 0 15 14
60 stw Rd Rs RR store data word 0 15 15
61 lsft Rd Rn RR logical shift 0 15 16
62 asft Rd Rn RR arithmetical shift 0 15 17
63 ldwsp Rd Rn RR load data word sp relative 0 15 18
64 stwsp Rn Rd RR store data word sp relative 0 15 19
65 mulu Rd Rs RR multiply unsigned 0 15 20
66 muls Rd Rs RR multiply signed 0 15 21
67 divu Rd Rs RR divide unsigned 0 15 22
68 divs Rd Rs RR divide signed 0 15 23
69 sbbz Rd R subtract zero with borrow 0 15 28 0
70 cmbz Rd R compare zero with borrow 0 15 28 1
71 adcz Rd R add zero with carry 0 15 29 6
72 jmp Rn R jump 0 15 30 0
73 jalw Rn R jump and link word stack 0 15 30 1
74 sesrl imm3 R set sr low byte 0 15 30 2
75 sesrh imm3 R set sr high byte 0 15 30 3
76 clsrl imm3 R clear sr low byte 0 15 30 4
77 clsrh imm3 R clear sr high byte 0 15 30 5
78 neg Rd R negate sign 0 15 31 0
79 not Rd R bitwise not 0 15 31 1
80 cendw Rd R convert endian word 0 15 31 2
81 exsgw Rd R extend sign bit word 0 15 31 3
82 pushw Rs R push register word on stack 0 15 31 4
83 popw Rd R pop register word from stack 0 15 31 5
84 pushcw Rc R push control register word on stack 0 15 31 6
85 popcw Rc R pop control register word from stack 0 15 31 7
86 ori Rd imm8 RI bitwise or immediate 1 0
87 andi Rd imm8 RI bitwise and immediate 1 1
88 eori Rd imm8 RI bitwise exclusive or immediate 1 2
89 addi Rd imm8 RI add immediate 1 3
90 subi Rd imm8 RI subtract immediate 1 4
91 cmpi Rd imm8 RI compare immediate 1 5
92 ldbiu Rd imm8 RI load data immediate unsigned byte 1 6
93 ldbil Rd imm8 RI load data immediate low byte 1 7
94 ldbih Rd imm8 RI load data immediate high byte 1 8
95 ldcl Rc imm8 RI load data immediate control register low byte 1 9
96 ldch Rc imm8 RI load data immediate control register high byte 1 10
97 lsfti Rd imm8 RI logical shift immediate 1 11
98 asfti Rd imm8 RI arithmetical shift immediate 1 12
99 csfti Rd imm8 RI rotate shift with c flag immediate 1 13

命令セット

 各命令をアルファベット昇順で説明します。

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)

divlq (load quotient and remainder)

divlqr (load quotient and remainder reversal)

divlr (restore quotient and remainder)

divlrr (restore quotient and remainder reversal)

divls (divide long signed)

divlu (divide long unsigned)

divs (divide signed)

divsr (divide signed reversal)

divu (divide unsigned)

divur (divide unsigned reversal)

eor (bitwise exclusive or)

eori (bitwise exclusive or immediate)

exsgw (extend sign bit word)

hadd (half add)

hcmp (half compare)

hdiv (half divide)

hfrac (half obtain fraction)

hhalf (cast uint16 to half)

hmul (half multiply)

hmvsg (half move sign bit)

hneg (half negate sign)

hsat (half saturate infinite number)

hsub (half subtract)

huint (cast half to uint16)

jalw (jump and link word stack)

jmp (jump)

ldb (load data byte)

ldbx (load data byte extended address)

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)

ldwsp (load data word sp relative)

ldwx (load data word extended address)

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)

stbx (store data byte extended address)

stw (store data word)

stwsp (store data word sp relative)

stwx (store data word extended address)

sub (subtract)

subi (subtract immediate)

アセンブラ

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

改訂履歴

日付 項目 備考
2023/09/23 マニュアル分割 アセンブラマニュアルを別ページに移動した。
2023/08/19 アセンブラの拡張 asm疑似命令の動作を拡張した。
2023/07/01 新規命令
アセンブラの拡張
adcz命令sbbz命令cmbz命令を追加した。
組み込みマクロ命令を追加した。
 lsli命令、lsri命令、asli命令、asri命令、csli命令、csri命令
2023/05/20 新規命令 新規命令を追加した。
 divlqr命令divlrr命令divur命令divsr命令
 mulur命令mulsr命令
2023/03/18 命令の名称変更 jalw命令rtnw命令pushcw命令popcw命令
2023/02/11 アセンブラの拡張 equf疑似命令、datf疑似命令を追加した。
fldi組み込みマクロ命令を追加した。
2022/10/22 割り込み機能の強化 割り込み許可レベルSr[IE1,IE0]を拡張した。
割り込みベクタivのVEビットを追加した。
組み込みマクロ命令:srie命令、srbk命令を追加した。
2022/06/11 スーパスケイラ版Moscovium-SS 追記。
2022/06/04 新規命令 回転シフト演算命令(csft命令csfti命令)を追加した。
2022/04/09 Nihoniumに対応 アセンブラ節を追加した。
2022/02/12 32ビット拡張アドレスに対応 ldbx命令stbx命令ldwx命令stwx命令を追加した。
2021/08/14 アセンブラの拡張 macro疑似命令を追加した。
rept疑似命令を追加した。
文字列マクロ機能(def疑似命令)を追加した。
dats疑似命令でS-JIS文字列を使用可能とした。
2021/07/31 プログラマモデルの拡張 状態レジスタsrにCPU IDフィールドを追加した。
2021/07/10 命令の拡張と変更 hcmp命令を追加した。
cmb命令を追加した。
adc命令sbb命令のZフラグ条件を変更した。
dats疑似命令で'\xhh"を追加した。
2021/06/12 半精度浮動小数点演算命令の拡張 hadd命令hsub命令hmul命令hdiv命令hneg命令hhalf命令huint命令hfrac命令hmvsg命令hsat命令を追加した。
アセンブラ疑似命令equh、dathを追加した。
組み込みマクロ命令:hldi命令を追加した
2021/05/15 乗除算命令の拡張 muls命令mulu命令divs命令divu命令divls命令divlu命令divlq命令divlr命令を追加した。
2021/04/24 割り込み関連命令等の拡張
アセンブラ疑似・マクロ命令の拡張
pause命令rti命令sesrh命令sesrl命令clsrh命令clsrl命令ldwsp命令stwsp命令を追加した。
組み込みマクロ命令:sesr命令、clsr命令、seie命令、clie命令、等。
2021/03/20 アセンブラ アセンブラ節を追加した。
2021/03/05 シフト演算命令の状態フラグを変更 asft命令asfti命令lsft命令lsfti命令のCフラグ値を変更した。
2021/02/27 sbb命令を追加 sbb命令を追加して、一部オペコードを再編した。
2021/02/20 Moscovium命令セットマニュアル 作成。

btn_arduino.png btn_moscovium.png

home