HD61700クロス・アセンブラ


HD61700クロス・アセンブラ



FX-870P/VX-4 マニュアルに戻る

目次





疑似命令一覧
ORG・・・(Origin),START・・・(Start), EQU・・・(Equivalent),DB・・・(Define Byte), DW・・・(Define Word)
DS・・・(Define Size),LEVEL・・・(Level), #IF ・・・ #ELSE --- #ENDIF#INCLUDE #INCBIN・・・(INClude BINary)
#NOLIST, #LIST, #EJECT#KC, #AI, #EU





レジスタ一覧
汎用8ビットレジスタ
$0, $1, ・・・, $31・・・(Main Registers)
16ビットレジスタ
PC・・・(Program Counter)SSP・・・(Syatem Stack Pointer) USP・・・(User Stack Pointer)IX, IY, IZ・・・(Index Registers)
特定インデックスレジスタおよびフラグレジスタ
SX, SY, SZ・・・(Specific Index Registers)F・・・(Flag Registers)
ステータスレジスタ
IE・・・(Interrupt Enable Register)IA・・・(Interrupt Select and Key Output Register) UA・・・(High-Order Address Specification Register)ニモニックなし・・・(Display Driver Control Register) PE・・・(Port Data Direction Register)
PD・・・(Port Data Register)TM・・・(Timer Data Register) IB・・・(Interrupt Control and Memory Bank Range Configuration Register)KY・・・(Key Input Register)





ニモニック一覧

転送命令(8ビット)
LD・・・(Load),LDI・・・(Load Increment), LDD・・・(Load Decrement),LDC・・・(Load Check), ST・・・(Store)
STI・・・(Store Increment),STD・・・(Store Decrement), PPS・・・(Pop by System stack pointer),PPU・・・(Pop by User stack pointer), PHS・・・(Push by System stack pointer)
PHU・・・(Push by User stack pointer),GFL・・・(Get Flag), PFL・・・(Put Flag),GPO・・・(Get Port), GST・・・(Get Status)
PST・・・(Put Status),STL・・・(Store data to LCD), LDL・・・(Load data from LCD),PPO・・・(Put LCD control Port), PSR・・・(Put Specific index Register)
GSR・・・(Get Specific index Register)
 
転送命令(16ビット)
LDW・・・(Load Word),LDIW・・・(Load Increment Word), LDDW・・・(Load Decrement Word),LDCW・・・(Load Check Word), STW・・・(Store Word)
STIW・・・(Store Increment Word),STDW・・・(Store Decrement Word), PPSW・・・(Pop by System stack pointer Word),PPUW・・・(Pop by User stack pointer Word), PHSW・・・(Push by System stack pointer Word)
PHUW・・・(Push by User stack pointer Word),GRE・・・(Get Register), PRE・・・(Put Register),STLW・・・(Store Word data to LCD), LDLW・・・(Load Word data from LCD)
PPOW・・・(Put LCD control Port Word),GFLW・・・(Get Flag Word), GPOW・・・(Get Port Word),PSRW・・・(Put Specific index Register Word), GSRW・・・(Get Specific index Register Word)
 
算術命令(8ビット)
INV・・・(Invert),CMP・・・(Complement), AD・・・(Add),SB・・・(Subtract), ADB・・・(Add BCD)
SBB・・・(Subtract BCD),ADC・・・(Add Check), SBC・・・(Subtract Check),AN・・・(And), ANC・・・(And Check)
NA・・・(Nand),NAC・・・(Nand Check), OR・・・(Or),ORC・・・(Or Check), XR・・・(Exclusive Or)
XRC・・・(Exclusive Or Check)
 
算術命令(16ビット)
INVW・・・(Invert Word),CMPW・・・(Complement Word), ADW・・・(Add Word),SBW・・・(Subtract Word), ADBW・・・(Add BCD Word)
SBBW・・・(Subtract BCD Word),ADCW・・・(Add Check Word), SBCW・・・(Subtract Check Word),ANW・・・(And Word), ANCW・・・(And Check Word)
NAW・・・(Nand Word),NACW・・・(Nand Check Word), ORW・・・(Or Word),ORCW・・・(Or Check Word), XRW・・・(Exclusive Or Word)
XRCW・・・(Exclusive Or Check Word)
 
ローテートシフト命令(8ビット)
ROU・・・(Rotate Up),ROD・・・(Rotate Down), BIU・・・(Bit Up),BID・・・(Bit Down), DIU・・・(Digit Up)
DID・・・(Digit Down),BYU・・・(Byte Up), BYD・・・(Byte Down)
 
ローテートシフト命令(16ビット)
ROUW・・・(Rotate Up Word),RODW・・・(Rotate Down Word), BIUW・・・(Bit Up Word),BIDW・・・(Bit Down Word), DIUW・・・(Digit Up Word)
DIDW・・・(Digit Down Word),BYUW・・・(Byte Up Word), BYDW・・・(Byte Down Word)
 
ジャンプ/コール命令
JP・・・(Jump),JR・・・(Relative Jump), CAL・・・(Call),RTN・・・(Return)
 
ブロック転送/サーチ命令
BUP・・・(Block Up),BDN・・・(Block Down), SUP・・・(Search Up),SDN・・・(Search Down), BUPS・・・(Block Up & Search)
BDNS・・・(Block Down & Search)
 
特殊命令
NOP・・・(No Operation),CLT・・・(Clear Time), FST・・・(Fast mode),SLW・・・(Slow mode), OFF・・・(Off)
TRP・・・(Trap),CANI・・・(Cancel Interrupt), RTNI・・・(Return from Interrupt)
 
マルチバイト転送命令(2~8 byte)未公開
LDM・・・(Load Multi byte),LDIM・・・(Load Increment Multi byte), LDDM・・・(Load Decrement Multi byte),LDCM・・・(Load Check Multi byte), STM・・・(Store Multi byte memory)
STIM・・・(Store Increment Multi byte),STDM・・・(Store Decrement Multi byte), PPSM・・・(Pop by Syatem stack pointer Multi byte),PPUM・・・(Pop by User stack pointer Multi byte), PHSM・・・(Push System stack pointer Multi byte)
PHUM・・・(Push User stack pointer Multi byte),STLM・・・(Store LCD data port Multi byte), LDLM・・・(Load LCD data port Multi byte),PPOM・・・(Put LCD control port Multi byte), PSRM・・・(Put Specific index Register Multi byte)
 
マルチバイト算術命令(2~8 byte)未公開
INVM・・・(Invert Multi byte),CMPM・・・(Complement Multi byte), ADBM・・・(Add BCD Multi byte), ADBCM・・・(Add BCD Check Multi byte), SBBM・・・(Subtract BCD Multi byte)
SBBCM・・・(Subtract BCD Check Multi byte),ANM・・・(And Multi byte), ANCM・・・(And Check Multi byte),NAM・・・(Nand Multi byte), NACM・・・(Nand Check multi byte)
ORM・・・(Or Multi byte),ORCM・・・(Or Check Multi byte), XRM・・・(Exclusive Or Multi byte)XRCM・・・(Exclusive Or Check Multi byte)
 
マルチバイトシフト命令(2~8 byte)未公開
DIUM・・・(Digit Up Multi byte)DIDM・・・(Digit Down Multi byte), BYUM・・・(Byte Up Multi byte),BYDM・・・(Byte Down Multi byte)







1. HD61700 クロス・アセンブラ

 HD61700 クロスアセンブラHD61 は,あお氏によって開発された。 PB-1000内蔵のアセンブラとほぼ同一(上位互換)だが,相違点は以下の通り。

  1. ラベル長は16文字までで,メモリの許す限り登録可能。コードエリアは64KBまで確保できる。
  2. アドレスラベル(JR,JP,CAL命令用)だけではなく転送命令で数値ラベルも利用可能。
  3. CASIO未公開分を含む,HD61700のほぼ全ての命令をサポート。ニモニックは「AI-アセンブラ形式」と「KC形式」のどちらも利用できます。(混在も可) Rev 0.41より,EU形式(Europe表記)のニモニックにも対応し,#EU(または/eu)指定により.AI/KC形式からEU(Europe)形式に切り替え可能。
  4. セカンドオペレーション拡張($0,$30,$31,LD&JR)等がデフォルトで指定可。(/n オプション指定にてOFF)
  5. 出力形式は,BASICのDATA文形式とPBF形式(PBF形式は, /p オプションを指定)がサポートされている。
  6. 整形されたリストファイル(.lst)を出力します。
  7. PB-1000でサポートされていない疑似命令(DW, LEVEL, #if, #else, #endif, #include等)もサポートする。



1-1. アセンブル方法

 HD61はWindowsとDOS版があるが,それぞれのコマンドプロンプトで以下のコマンドを実行する。

      HD61 [ソースファイル名] ( オプション[/n] [/p] [/q] [/w] [/tab] [/r] [/o filename] [(/set) symbol=value] [/eu] )

実行すると,下記の例のようにオプション設定にしたがって指定ファイルをアセンブルします。

アセンブル例
>hd61 hd61700.s [Enter]
HD61700 ASSEMBLER Rev 0.41
Input : hd61700.s
 PASS 1 END
 PASS 2 END
ASSEMBLY COMPLETE, NO ERRORS FOUND
>

正常な場合,[ASSEMBLY COMPLETE, NO ERRORS FOUND]を表示して終了する。 この時,.basファイルと.lstファイルが生成される。 アセンブル中に何らかのエラーが発生した場合は,エラー行を表示して終了する。
Rev.0.09以降,ソースファイル名が8文字以上だった場合,ワーニングを表示する(アセンブルは正常に動作)。 これは、PB-1000/C、AI-1000等の8.3形式のファイル名をサポートした機種で利用することを考慮し, BAS(またはPBF)に出力されるファイル名がロングファイル名になる事を警告する。(ファイル名を自動的に短く直したりする 機能は実装していない)



1-2.アセンブラ・オプション

 省略可能であるが,アセンブル時に以下のオプションが指定できます。

アセンブル・オプション一覧
オプション機能
/pPBF形式で出力する。(デフォルトはBASIC DATA文形式で出力)
/qQL(クイックローダ)形式で出力する。
/nセカンドオペレーション指定による最適化をOFFにする(デフォルトはON)
/w16bitアドレッシング対応のアセンブルを行う。(最適化は LEVEL 0 固定)
内蔵ROM用の16Bitアドレスに対応したアセンブルコードを出力します。
/tabリストファイルをTAB=8で出力する。
/rリロケート情報ファイル(*.roc)を出力する。
FBF/VX-MENUにて利用するリロケート形式ファイル作成用の情報ファイルを出力する。 RR形式や*.o/*.o2形式ファイルを作成する際に利用する。
/o [filename]PBF/BAS形式ファイルヘッダに出力するファイル名を指定する。デフォルトは未指定(自動生成)。>/TD>
(/set) [シンボルラベル名]=[値/ラベル名]任意のシンボルラベルを定義する。/setは省略可。
/euEU形式(Europe形式)のニモニックをアセンブルする様設定します。
ソース内で疑似命令#EUを指定しても同等動作となる。


/pオプションについては、1-3.作成プログラムの実行の1-3-2.PBF形式 を参照のこと。

/nオプションは,$0,$30,$31を対象とした転送命令のコード最適化を禁止し,PB-1000内蔵アセンブラと互換コードを出力する。

/nオプションの有無による出力コード例
オプション設定ニモニック出力コード備考
/n オプション無し(デフォルト)LD  $2,$3002  42セカンドオペレーション指定ON時 =2バイト命令 を出力
/n オプション付きLD  $2,$3002  62  30セカンドオペレーション指定OFF時 =3バイト命令 を出力

PB-1000用のデータエリアのアドレスを決め打ちしている様なソースをアセンブルする場合や, PSR命令でSIRを変更するプログラムをアセンブルする際に利用する。 なお,最適化される命令と出力コードの詳細は,4. ニモニックあるいはHD61添付のHD61700.sファイルをアセンブルして出力されたlstファイルを参照のこと。

/set オプションは,Rev 0.23以降,起動時に任意のシンボルラベルを定義できるようになった。 これは,#if~#else~#endif疑似命令を利用して,

に,ソースファイルの修正なしにシンボルラベル値を変更することで可能にします。 バッチファイル等を利用することで,自動で各機種用の出力結果を得ることも可能。 なお,同じラベル名をソース内でEQU宣言している場合,/setにて定義した値が優先されるので, ソース内での定義はデフォルト値として機能する。
書式例)機種名と開始アドレスをコマンドラインから指定する。

     HD61 SAMPLE.S /SET MODEL=PB1000 /SET BASE=0x7000

Rev 0.28以降,/setオプションを省略して,[シンボルラベル名]=[値/ラベル名]という記述で, 任意のシンボル定義が可能となった。 以下の書式例は,動作仕様に関しては上の書式例(/setの省略なし)と全く同一です。
書式例)機種名と開始アドレスをコマンドラインから指定する。

     HD61 SAMPLE.S MODEL=PB1000 BASE=0x7000



1-3. 出力形式と機械語の実行

 HD61は,アセンブル時の指定オプションで,BAS形式, PBF形式, QL形式のファイルのいずれかを出力する。 各形式のファイルに関して,それぞれ以下の手順でポケコン上で機械語がメモリーに配置されて,機械語を実行することができる。
 以下の各節で,各形式のファイルのメモリーへのロードおよび実行について,FX-870P/VX-4を主対象にして説明する。

1-3-1.BAS形式
(1)HD61でアセンブル。basファイルを作成。BAS形式のフォーマットについては巻末資料参照。
(2)出力されたbasファイルにHD61添付のTrans.bの内容をマシン語ローダープログラムとして張り付ける。
FX-870P,VX-4では行番号 80はコメントにしておく。
(3)作成したプログラム・ファイルをF.COMでポケコンにロードする。
(4)システム未使用領域にロードするなら何もする必要がないが,そうでなければ,FX-870P,VX-4の場合, 拡張CLEAR等でマシン語エリアを確保する。
(5)ロードしたプログラムを実行すると,メモリに機械語コードが配置される。
(6)MODE110(実行アドレス)で機械語ルーチンがコールされる。
PB-1000/C,AI-1000では,Trans.bの行番号80をコメントにする必要がなく,その場合,(5)によって機械語プログラムが自動的にセーブされる。

1-3-2.PBF形式
PBF形式のフォーマットについては巻末資料参照のこと。
FX-870P, VX-4,(VX-3も同様の手順である)の場合,以下の通り。
(1)HD61にて /pオプション付きでアセンブル。pbfファイルを作成。
(2)BAS形式と同様な方法で,ポケコン上でマシン語エリアを確保。
(3)HD61に添付のTransVX.basをポケコン上で実行。実行すると,RS232C受信状態で待機する。
(4)(1)で作製したPBFファイルをRS232C経由でポケコンへ転送する。
(5)自動的にバイナリ変換され,メモリーに機械語コードが配置される。処理完了後,"Completed!"と表示する。
(6)MODE110(実行アドレス)で機械語ルーチンがコールされる。

PB-1000/C,AI-1000では以下の通り。
(1)HD61にて /pオプション付きでアセンブル。pbfファイルを作成。
(2)ポケコン上でマシン語実行領域を確保。
(3)JUN AMANO氏のPbfTOBin.basを実行しファイル名を"COM0:7"とする。(9600bps時)
(4)(1)で作製したPBFファイルをRS232C経由でポケコンへ転送する。
(5)実行完了すると自動的にEXE(またはBIN)ファイルが生成される。

1-3-3.QL形式
あお氏によって考案されたクイックローダー用のデータ形式である。
利用方法は以下の通り。
(1)HD61にて /qオプション付きでアセンブル。qlファイルを作成。QL形式のフォーマットについては巻末資料参照。
(2)出力されたqlファイルに巻末の『QL形式』記載のクイックローダーに張り付ける。
適宜,コードを追加・修正する。
(3)作成したプログラム・ファイルをF.COMでポケコンにロードする。
(4)システム未使用領域にロードするなら何もする必要がないが,そうでなければ,FX-870P,VX-4の場合, 拡張CLEAR等でマシン語エリアを確保する。
(5)ロードしたプログラムを実行すると,メモリに機械語コードが配置される。
(6)MODE110(実行アドレス)で機械語ルーチンがコールされる。



1-3.エラーメッセージ

アセンブル中に表示するエラーメッセージは以下の通りです。


エラーメッセージ一覧
エラーメッセージエラー内容
Invalid Source File Name.ソースファイルがOPENできない。
Line Length is Too Long.1行の文字数がオーバーした。
Operand Length is Too Long.オペランド文字数オーバーした。
LABEL Length is Too Long.ラベル文字数がオーバーした。
ORG Not Entry.ORG命令定義がない。
Operand Not Entry.オペランド記述なし。
EQU without Label.EQUにラベルエントリなし。
Illegal Operand.オペランド記述ミス。
START Already Defined.START文が2つ以上ある。
Illegal [,]カンマ記述がおかしい。
Illegal ['']or[(]or[)]ダブルコーテーション/括弧 異常。
LABEL Already Defined.ラベル記述が2回以上ある。
LABEL Type Mismatch.ラベルに利用できない文字。
Undefined LABEL.ラベル登録なし。
Operation Type Mismatch.該当命令なし/記述方法のミス。
Operand Range Over.オペランド値が範囲外。
Jump Address Over.相対ジャンプが範囲外 。
Output Buffer Over Flow.出力バッファオーバー。
Assemble Address Over Flow.アセンブルアドレス制限オーバー。
Execute Address Illegal.実行アドレスが先頭ORG宣言より小さい。
Could not calculate.演算異常( 0 除算等 )が発生。
Illegal [#if] - [#endif]#if~#else~#endifのネストが異常。
Invalid Include File Name.includeファイルがOPENできない。
Could Not Nest Include.includeネスト異常。
Illegal Register Number.メインレジスタ番号異常。





2. MPUアーキテクチャー

2.概要
2-1. 特徴


 実際にコーディングしてみて,個人的な感想は以下の通り。


2-2. レジスタ構成
・32個の8ビットレジスタ,6個の16ビットレジスタと複数のステータスレジスタを持つ。

   

(1)メインレジスタ(8bit)
HD61700が内蔵するRAMモジュールで、0~31番地のアドレで指定。
ニモニック上では先頭に"$"マークを付けて表現する。例えば、$0, $1,・・・$31のように表記する。 リトルエンディアン形式で最大64bitまでのアクセス・演算も可能。 また、特定インデックスレジスタSIR(5bit)を用いることで、$SIRという形式でインダイレクトなアクセスも可能。
※リトルエンディアンとは、&H12345678 をメモリに配置する場合, 下位アドレスから&H78, &H56, &H34, &H12と配列させる方法。x86系が代表的なCPU。

(2)6個の16bitレジスタ

(3)特定インデックスレジスタおよびフラグレジスタ
(4)ステータスレジスタ






3. アセンブラ

3.1 アセンブラ書式



3.2 疑似命令

HD61では以下の疑似命令をサポートしている。
基本的にはPB-1000内蔵アセンブラの疑似命令と互換になっているがが、ラベルや式が利用できる等、細かい点で違いがある。

疑似命令
  • { }内はいずれか一つを示す。ただし,{ }そのものは入力しない。
  • [ ]内は省略可能。ただし,[ ]そのものは入力しない。
項番疑似命令書式機能
(1) ORG ORG [アドレス  | LABEL  |  ] アセンブラに対し、コード配置を開始するアドレスを宣言する。
プログラム中に複数個のORGを用いてよいが、記述された場所のアセンブルアドレスより小さなORG宣言はできない。
本宣言はプログラムの先頭に記述する必要がある。(実際にはSTART,EQUの後でも良い)
オペランドにはラベルや式も使用できるが、利用時に値が決定している必要がある。
(2) START START [実行開始アドレス  | LABEL  |  ] プログラムの実行開始アドレスを与える。
プログラム中に1回だけ宣言可能。
(3) EQU LABEL : EQU [数値  | LABEL  |  ] 宣言されたラベルに対して、オペランドの数値を与える。
ラベル宣言は省略できない。
オペランド数値にはラベルや式を利用できるが、利用時に値が決定している必要がある。
また、コーテションマークで括ることで2バイトまでの文字列も指定可能。
例)
  LABEL: EQU "AB" ; &H4241を代入。(DB疑似命令と同様、左側から下位、上位となります)
(4) DB [LABEL  :] DB {数値  | "文字列" | LABEL |  } [, {数値  | "文字列" | LABEL |  } [, ・・・] ] オペランド1以降に記述された数値(および文字)列をバイト単位でメモリ上に格納する。
DB命令の左側のラベルは省略可能。
文字列を指定するときはダブルコーテーション["]か、シングルコーテーション[']で囲む。
オペランド数値は0~255の範囲内である必要があり,ラベル・式でも記述できる。
例)
  DB 1, 2, 3, "ABCDEF 0 1 2", &H20
  DB 'ABCDEF'
(5) DW [LABEL  :] DW {数値  | LABEL |  } [, {数値  | LABEL |  } [, ・・・] ] オペランド1以降に記述された数値をワード単位でメモリ上に格納する。
オペランドにはラベルや式を利用できるが、文字列は利用できない。
この疑似命令はPB-1000にはありません。
(6) DS [LABEL  :] DS {数値  | LABEL |  } オペランド1に記述された数値と等しいバイト数をコードメモリ上に確保する。
確保された領域には0が格納される。(PB-1000内蔵アセンブラでは不定データとなる)
DSの左側のラベルは省略可能。
オペランド数値にはラベルや式も利用できるが、値が確定している必要がある。
(7) LEVEL LEVEL 数値(0または、1) アセンブル時にCASIO特有のSIR設定(SX=31, SY=30, SZ=0)を対象とした転送命令の最適化を制御する。
LEVEL 1にて、最適化をONにして$31,$30,$0を対象とした転送命令を最適化する。
LEVEL 0で最適化をOFFにして、PB-1000内蔵アセンブラと互換なコードを出力する。
デフォルトはLEVEL 1。
PSR命令にてSIRを変更する場合、LEVEL 0 を指定する必要がある。(詳しくはHD61の添付ファイル HD61700.Sを参照のこと)
(8) #IF~#ELSE~#ENDIF #IF [!]
  記述1
[
#ELSE
  記述2
]
#ENDIF
#IF命令のオペランド1の値が真(=0以外)ならば、記述1を有効にして、#else~#endifまでの記述2を無効にする。
オペランド1が偽(0)ならば、記述2が有効になる。なお、(#ELSE 記述2)の部分は省略可能である。
式には、演算子![評価値を逆にする]が利用できる。
(!演算子の優先順位は単項演算子と括弧の間である。)
式にはラベルが使用可能だが、値が確定している必要がある。
#IF~#ELSE~#ENDIF文は,255レベルまでネスティング可能である。
(9) #INCLUDE #INCLUDE(ファイル名 ) オペランド1の括弧内に記述されたファイルをアセンブル時に組み込む。
アセンブラはこの文を見つけると、ソースファイルのアセンブルを中断して、#INCLUDEで指定されたファイルをアセンブルする。 指定ファイルのアセンブル完了後、元のソースファイルのアセンブルを再開する。
#INCLUDEのネスティングは256レベルまで可能。
既にOPENされたINCLUDEファイルの再帰的な呼び出しを行うと、"Invalid Include File Name"エラーとなる。
デフォルトでは、#INCLUDE処理中もリストファイルの出力は行われる。 #INCLUDE中のリスト出力を制御するには、後述の#NOLIST/#LIST疑似命令を利用する。
(10) #INCBIN #INCBIN( {ファイル名.BMP | ファイル名 } ) オペランド1の括弧内に記述されたバイナリファイルをアセンブル時に組み込む。
アセンブラはこの文を見つけると、指定されたファイルをバイナリデータとしてDBフォーマットに変換して読み込む。
変換中にアドレスが64KBを超える場合、エラー終了する。
Windowsビットマップ形式のファイル(拡張子.BMP)が指定されると、ピクセルデータをLCD表示用グラフィックデータに変換して読み込む。
読み込み可能なビットマップは、モノクロ2色形式のみである。(サイズ上限64KB以下)
それ以外のBMP形式の場合、"Illigal Bitmap File Format"を表示してエラー終了する。
他の拡張子(.bmp以外)を持つファイル名を指定した場合、連続したバイナリデータとしてDBフォーマットに変換される。
(11) #NOLIST, #LIST, #EJECT #NOLIST
#LIST
#EJECT
リスト(.lstファイル)への出力を制御する。
#NOLIST命令で、それ以降の行の.lstファイルへの出力を停止する。
#LIST命令で、出力を行う。
#EJECT命令は、LINE FEED(&h0C)を出力する。(同時にページヘッダも出力します)
(12) #KC, #AI, #EU #KC
#AI
#EU
ニモニック形式(KC形式/AI形式/EU(Europe)形式)を指定する。(デフォルトは#AI指定)
この指定により、以降の文法チェック処理がそれぞれの形式に合わせて動作する。
#EU指定時は、EU(Europe)形式ニモニックとなる。詳細は、次項の[◆EU(Europe)形式ニモニックについて]を参照下さい。
デフォルトの #AI指定では、アセンブル時にLDM/STM命令の第3オペランドを省略した場合、KC形式に解釈された事を示す以下のワーニングを表示する。

  "WARNING: 'LDM' was interpreted to 'LDD' of the KC form."

これはKC形式のLDM(LoaD Minus)とSTM(STore Minus)が、AI形式のLDM(LoaD Multi byte)及び、STM(STore Multi byte)とニモニック名称が同一になっている事に起因している。
(第3オペランドの有無でAI形式かKC形式かを判別する)
疑似命令'#KC'を指定することで、ワーニングは表示されなくなる。



3.3 プログラミング上のポイント

・$30, $31, $0による最適化の利用
 CASIOポケコン(HD61700)システムでは、$31=0、$30=1が常に設定されており、原則的にはこれらの設定を変更しない。
これらの設定を利用すると、様々なメリットが得られる。
例えば$2をゼロクリアする場合、通常では以下のようにする。
  LD $2, 0
    または、
  XR $2, $2
しかし、HD61700を用いたCASIOポケコンでは、以下の方法が一般的である。
  LD $2, $31 ;0(=$31)を代入
理由は、CASIOポケコン(HD61700)システムではSIR:特定インデックスレジスタがSX=31($31指定)、SY=30($30指定)、SZ=0($0指定)と固定されており、 これら(SX/SY/SZ)を利用した転送/演算はセカンドオペレーション指定により、命令サイズと実行クロック数を削減できるからである。
上の例では、LEVEL 1 指定でアセンブルした場合、最初の2つは3バイト命令になりますが、3番目の命令は2バイト命令となる。
慣用的な命令としては、以下の物がある。
  LD $2, $30 ;1を代入
  AD $2, $30 ;インクリメント: +1
  SB $2, $30 ;デクリメント: -1
  ADW $2, $30 ;ワードインクリメント: +1
  SBW $2, $30 ;ワードデクリメント: -1
  LD $2, (IX+$31) ;LD $2,(IX+0)と同等動作
  ST $2, (IX+$31) ;ST $2,(IX+0)と同等動作
同じ理由で、任意の演算を行う場合、$0(または、$0,$1ペア)を第2オペランドに用いると、$SZによる最適化が行われて、 命令サイズ・実行クロック数の短縮が実現される。
この$SX=$31、$SY=$30、$SZ=$0を対象とした最適化は、メインレジスタ同士の転送/演算系のほぼ全てで有効となっている。
最適化可能な命令の詳細は、4. ニモニック,HD61添付のHD61700.pdfまたは、HD61700.S(及び.lstを)を参照のこと。
HD61では、デフォルト設定はLEVEL 1指定状態であり、CASIOポケコンシステム準拠の最適化(SIR設定をSX=31、SY=30、SZ=0に固定)にてアセンブルを行う。
この$31,$30,$0に対する最適化をOFFにする場合、アセンブル時に'/n'オプションを指定するか、LEVEL擬似命令でLEVEL 0とする。
その場合、最適化が必要な命令に対しては $SX/$SY/$SZにて明示的にインダイレクト指定する必要がある。(SIRを使ったインダイレクト指定による最適化は、LEVEL 0/1 に関係なく動作します)



3.4 ニモニック形式

 この節で、各ニモニック形式の簡単な説明を行う。 詳細に興味がある場合、HD61700.Sをアセンブルして出力されたlstファイルを参考のこと。

KC形式ニモニック
 未公開命令の書式例に、「KC形式」と表記されたものがある。
KC形式は、こたちゃん氏の「KC-Disasemmbler」(参考文献(3))において発表されたニモニック形式である。
「AI-アセンブラ形式」(参考文献(4))同様、ほぼ全ての未公開命令に対応している。
「AI-アセンブラ」形式と「KC形式」違いは、以下の通り。

AI-アセンブラ形式とKC形式との相違点
命令AI-アセンブラ形式KC形式備考
デクリメント系命令LDD*LDM* 
STD*STM* 
マルチバイト系命令**M**WAI-アセンブラ形式では、マルチバイト数を", IM3 "と記述するのに対して,
KC形式では"(IM3)"と括弧でくくって記述する。

詳細は,各ニモニックを参照のこと。
日本において,KC形式がAI-アセンブラ形式よりあまり普及しなかったが,理由は以下のように考えられる。
KC形式は、「FX-870Pアセンブラ」 (参考文献 (5))で初めてその一部がサポートされ, 「X-Assembler」 (参考文献 (6), (7))においてフルサポートされた。
このように,KC形式は普及しなかったが,最後まで残った。

HD61では「AI-アセンブラ形式」と「KC形式」に加え、「X-Assembler」にて追加された未公開命令も両形式でサポートしている。(微妙に抜けがあるかもしれない)
Rev0.41以降では、DP形式(後述)もサポートしました。

EU(Europe)形式
 「EU形式」、主に欧州(ドイツ)のコミュニティ内で利用されている形式である。
HD61は,Rev0.41以降で#EU(または/euオプション)指定によって利用できる。

ドイツでは、1988年にPB-1000のROMの逆アセンブルリストが解説付きで雑誌に掲載されて、 また非公式ながら、このEU(Europe)形式ニモニックをサポートする環境(PB-2000用Pascalカード)が提供されていたので、 このニモニックに関する情報は広く知られていた。
このEurope形式ニモニックは、ドイツでの雑誌記事の発表タイミング等から、CASIOから提供された未公開の情報を含んでいる(=CASIO純正表記に近い)言われており、非常に興味深い表記である。
(CASIOに確認できたわけではないため、真実かどうかは不明)
一方,AI形式/KC形式は、日本で雑誌記事等を媒介にして、CASIOとは全く関係のない複数の解析者が独自に解析/命名したもので、その成果は非常に素晴らしいものである。
EU形式とAI形式とは、下記(1)~(6)の点で違いがある。詳細は、各命令の記述を参考のこと。

AI/KC形式とEU形式の相違点
項番相違点AI/KC形式EU形式コメント
(1)特定インデックスレジスタ:SIR
(Specific Index Register)
SX, $SX
SY, $SY
SZ, $SZ
#0
#1
#2
EU形式では,ショートレジスタ:SR(Short Registers)と呼ばれている。
(2)レジスタ名称 IBCS AI形式で, IBと表記する未公開レジスタは,EU形式でCSと表記される。
(3)未公開命令のニモニック PSRPRAPRA (Put Ram Address)
GSRGRAGRA (Get Ram Address)
STLOCBOCB (Output Casio Bus)
LDLICBICB (Input Casio Bus)
PPOPCBPCB (Put Casio Bus)
BUPS IM8BUP IM8 
BDNS IM8BDN IM8 
JP $C5JPW $C5 
JP ($C5)JPW ($C5) 
(4)マルチバイト命令 *M*L EU形式では,マルチバイト命令のニモニックの末尾に"L"(long wordの意味?)が付加される。
(5)マルチバイト数 2~8L2~L8 EU形式では,AI形式と同じ表記も可能。
(6)JUMP拡張タグ表現 JRJ. AI/KC/EU形式で,このタグは省略可能。EU形式では,"JR"も使用可能。






4. ニモニック

 この章でHD61700のニモニックを説明する。ニモニックで使用するオペランドの記号およびニモニックを以下に示す。

ニモニックで使用するオペランド記号一覧
オペランド記号コメント
メインレジスタ$C5  :$0, $1, ・・・, $31$&H0, $&H1, ・・・, $&H1F の16進数表現も可能。
特定インデックスレジスタ SIRSX5-bit
SY
SZ
特定インデックスレジスタによるメインレジスタのインダイレクト指定$SX | $(SX)SXが示すメインレジスタ(デフォルト: $31)
$SY | $(SY)SYが示すメインレジスタ(デフォルト: $30)
$SZ | $(SZ)SZが示すメインレジスタ(デフォルト: $0)
インデックスレジスタ IRIX16-bit
IYレジスタは,ブロック転送/サーチ命令用の終点ポインタとしてのみ利用可能。
IY
IZ
スタックポインタSSPSystem stack pointer (16-bit)
USPUser stack pointer (16-bit)
プログラムカウンタPCProgram counter (16-bit)
フラグZZero flag
NZNon-zero flag
CCarry flag
NCNon-carry flag
LZLower-digit zero flag
UZUpper-digit zero flag
NLZ | LNZNon lower-digit zero flag
ステータスレジスタKYKEY入力レジスタ (16-bit)
IE割込み許可レジスタ (8-bit)
IA割込み選択レジスタ (8-bit)
IB割り込み制御及びバンク制御レジスタ (8-bit); 未公開
UA上位アドレス指定レジスタ(8-bit)
PDポートデータレジスタ(8ビット)
PEポート状態指定レジスタ(8ビット)
TMタイマーレジスタ(8ビット)
数値データIM3 : 2,3,・・・,83ビット直値。マルチバイト数指定に利用。
IM5 : 0~31,または,&H0~&H1F5ビット直値。ADBM, SBBMで使用。
IM8 : 0~255,または,&H00~&HFF8ビット直値。
IM16 : 0~65535,または,&H0000~&HFFFF16ビット直値。



ニモニック表
転送命令(8ビット)
ニモニック書式機能フラグクロック数説明書式例
LD
(Load)
LD opr1,opr2[ ,(JR)LABEL ]opr1 ← opr2 変化しない opr2の内容をopr1に転送する。
未公開だが,jump拡張あり。
特定のopr1,opr2の組み合わせ時に,オペランド3にアドレスラベルを追加することで,転送実行後に相対ジャンプする。
オペランド3およびJRタグは省略可能。
LD命令で使用可能なオペランドの組み合わせは以下の6種類で,jump拡張の適用可能性については以下を参照のこと。
 
LD $C5,$C5[ ,(JR)LABEL ]opr1@$C5 ← opr2@$C53+3+6=12
(JR: +3)
メインレジスタ間の転送
  • LD $2,$0 ;$0のデータを$2に転送
LD $C5,($A)[ ,(JR)LABEL ]opr1@$C5 ← opr2@($A)$A=$SIR: 3+8+3=14
$A=$C5: 3+3+8+3=17
(JR: +3)
外部メモリからメインレジスタへの転送(1)
$Aは,$C5,$SIR。
opr2は,リトルエンディアンで2バイト。
バンクは,UAレジスタのIX用が適用。
  • LD $2,($0) ;$0(下位),$1(上位)をアドレスとする外部メモリのデータを$2に転送
  • LD $2,($SZ) ;デフォルトではSZ=0なので,LD $2,($0)と同じ動作を高速で実行
LD $C5,({IX | IZ}±$C5)opr1@$C5 ← opr2@({IX|IZ}±$C5)3+3+6+5=17 外部メモリからメインレジスタへの転送(2)
インデックスレジスタ±メインレジスタ(8ビット)による指定。
jump拡張なし。
  • LD $2,(IX+$31) ;IX+$31をアドレスとする外部メモリのデータを$2に転送
LD $C5,({IX | IZ}±IM8)opr1@$C5 ← opr2@({IX|IZ}±IM8)3+3+6+5=17 外部メモリからメインレジスタへの転送(3)
インデックスレジスタ±8ビットイミディエット値による指定。
jump拡張なし。
  • LD $2,(IX+123) ;IX+123をアドレスとする外部メモリのデータを$2に転送
LD $C5,IM8[ ,(JR)LABEL ]opr1@$C5 ← opr2@IM83+3+6=12
(JR: +3)
8ビットイミディエットデータをメインレジスタへ転送
  • LD $4,123 ;123を$4に転送
LD $C5,$SIR[ ,(JR)LABEL ]opr1@$C5 ← opr2@$SIR3+6=9
(JR: +3)
特定インデックスレジスタSIRによるメインレジスタのインダイレクト転送(未公開命令)
通常のレジスタ指定と比較して,命令コードが1バイト短くなる。(LEVEL 0指定時)
その分,実行クロックも短くなり,ROM内で多用されている。
EU形式では,SX=#0,SY=#1,SZ=#2と表記され,JRタグは省略可能で"J."と記述可能。
  • LD $4,$SX ;$SXの示すメインレジスタ値(8ビット)を$4に転送。デフォルトでは,$SX=$31=0。
EU形式
  • LD $4,#0 ;LD $4,$SX
  • LD $4,#0,J.LABEL ;
LDI
(Load Increment)
LDI $C5,(IR±A)$C5 ← (IR±A)
IR ← IR±A+1
変化しないA=SIR: 3+6+5=14
A=$C5: 3+3+6+5=17
A=IM8: 3+3+6+5=17
(IR±A)をアドレスとする外部メモリの内容を,メインレジスタ$C5に転送後,IRに転送メモリアドレスをインクリメントしたものを代入。
IRはIX,IZ。
Aは,$C5,SIR,IM8が適用可能。
  • LDI $4,(IX+$2) ;メインレジスタ指定
  • LDI $4,(IZ-$2) ;
  • LDI $4,(IX+$SX) ;SIRによるインダイレクト指定(未公開)
  • LDI $4,(IZ-$SY) ;
  • LDI $4,(IX+123) ;8ビットイミディエット指定
  • LDI $4,(IZ-123) ;
LDD
(Load Decrement)
LDD $C5,(IR±A)$C5 ← (IR±A)
IR ← IR±A
変化しないA=SIR: 3+6+3=12
A=$C5: 3+3+6+3=15
A=IM8: 3+3+6+3=15
(IR±A)をアドレスとする外部メモリの内容を,メインレジスタ$C5に転送後,IRに転送メモリアドレスを代入。
LDI命令からの連想とは異なり,実際にはディクロメントしないが,その分,実行クロックは短い。
IRはIX,IZ。
Aは,$C5,SIR,IM8が適用可能。
  • LDD $4,(IX-$2) ;メインレジスタ指定
  • LDD $4,(IZ+$2) ;
  • LDD $4,(IX-$SX) ;SIRによるインダイレクト指定(未公開)
  • LDD $4,(IZ+$SZ) ;
  • LDD $4,(IX-123) ;8ビットイミディエット指定
  • LDD $4,(IZ+123) ;
LDC
(Load Check)
LDC $C5,opr2[ ,(JR)LABEL ]何もしない(No Operation) 変化しないA=SIR: 3+6=9
A=$C5,IM8: 3+3+6=12
(JR: +3)
LD命令と同じ形式でオペランド指定可能だが,実際には何も処理せず,命令デコードのみ行う。
NOP命令と同様に,遅延処理。
ただし,第3オペランドにラベルがある場合,相対ジャンプする。(JRタグは省略可)
  • LDC $4,$2 ;メインレジスタ指定
  • LDC $4,$SX ;SIRによるインダイレクト指定
  • LDC $4,128 ;8ビットイミディエット指定
  • LDC $4,$3,ERROR;レジスタ指定+ジャンプ拡張
ST
(Store)
ST $C5,(IR±A)$C5 → (IR±A) 変化しないA=SIR: 3+6+5=14
A=$C5,IM8: 3+3+6+5=17
第1オペランド$C5の内容を(IR±A)をアドレスとする外部メモリに格納する。
転送方向がLD命令とは反対なのに注意必要。
IRは,IX,IZ。
Aは$C5,SIR,IM8が適用可能。
  • ST $4,(IX+$2) ;メインレジスタ指定
  • ST $4,(IZ-$2) ;
  • ST $4,(IX+$SX) ;SIRによるインダイレクト指定(未公開)
  • ST $4,(IZ-$SY) ;
  • ST $4,(IX+123) ;8ビットイミディエット指定
  • ST $4,(IZ-123) ;
ST
(Store $)
ST $C5,(A)[ ,(JR)LABEL ]$C5 → (A) 変化しないA=SIR: 3+8+3=14
A=$C5: 3+3+8+3=17
(JR: +3)
第1オペランド$C5の内容をAをアドレスとする外部メモリに格納する。
転送方向がLD命令とは反対なのに注意必要。
Aは$C5,SIRが適用可能。
第3オペランドにラベルがある場合、転送後、相対ジャンプする。(JRタグは省略可)
  • ST $2,($0) ;セカンドオペレーション指定(2バイト)??3バイト
  • ST $2,($SZ) ;SIRによるインダイレクト指定(2バイト)。事実上,$SZ=$0のみ使用可能。 ($SX=$31($31,$0ペア),$SY=$30($30,$31ペア=0001)も指定可能だが,利用価値低い。)
  • ST $2,($10) ;通常(3バイト)
  • ST $2,($10),LABEL ;Jump拡張(4バイト)
ST
(Store IM8)
未公開命令
ST IM8,($SIR)IM8 → ($SIR) 変化しない3+3+8+3=17 第1オペランドの8ビットイミディエット値をSIRでインダイレクト指定されるメインレジスタの示す外部メモリに格納する。
転送方向がLD命令とは反対なのに注意必要。
事実上,$SZ=$0のみ使用可能。($SX=$31($31,$0ペア),$SY=$30($30,$31ペア=0001)も指定可能だが,利用価値低い。)
  • ST 123,($SZ) ;
ST
(Store IM8 to Register)
未公開命令
ST IM8,$C5IM8 → $C5 変化しない3+3+11=17 第1オペランドの8ビットイミディエット値を第2オペランドの指定するメインレジスタに格納する。
転送方向がLD命令とは反対なのに注意必要。
LD $C5,IM8と同じ動作だが,Jump拡張はない。
  • ST 123,$0 ;
STI
(Store Increment)
STI $C5,(IR±A)$C5 → (IR±A)
IR ← IR±A+1
変化しないA=SIR: 3+6+5=14
A=$C5,IM8: 3+3+6+5=17
第1オペランド$C5の内容を(IR±A)をアドレスとする外部メモリに格納する。
IRには,転送先アドレスをインクリメントしたものを格納する。
転送方向がLD命令とは反対なのに注意必要。
IRは,IX,IZ。
Aは$C5,SIR,IM8が適用可能。
  • STI $4,(IX+$2) ;メインレジスタ指定
  • STI $4,(IZ-$2) ;
  • STI $4,(IX+$SX) ;SIRによるインダイレクト指定
  • STI $4,(IZ-$SY) ;
  • STI $4,(IX+123) ;8ビットイミディエット指定
  • STI $4,(IZ-123) ;
STD
(Store Decrement)
未公開命令
STD $C5,(IR±A)$C5 → (IR±A)
IR ← IR±A
変化しないA=SIR: 3+6+3=12
A=$C5,IM8: 3+3+6+3=15
第1オペランド$C5の内容を(IR±A)をアドレスとする外部メモリに格納する。
IRには,転送先アドレスを格納する。
LDDと同様に,名称から連想されるディクリメントは実際には行わない。
転送方向がLD命令とは反対なのに注意必要。
IRは,IX,IZ。
Aは$C5,SIR,IM8が適用可能。
  • STD $4,(IX+$2) ;メインレジスタ指定
  • STD $4,(IZ-$2) ;
  • STD $4,(IX+$SX) ;SIRによるインダイレクト指定
  • STD $4,(IZ-$SY) ;
  • STD $4,(IX+123) ;8ビットイミディエット指定
  • STD $4,(IZ-123) ;
PPS
(Pop by System stack pointer)
PPS $C5$C5 ← (SS)
SS ← SS+1
変化しない3+6+5=14 SSの指定する外部メモリの内容をメインレジスタ$C5に格納後,SSをインクリメント。
  • PPS $2 ;
PPU
(Pop by User stack pointer)
PPU $C5$C5 ← (US)
US ← US+1
変化しない3+6+5=14 USの指定する外部メモリの内容をメインレジスタ$C5に格納後,USをインクリメント。
  • PPU $2 ;
PHS
(Push by System stack pointer)
PHS $C5$C5 → (SS-1)
SS ← SS-1
変化しない3+6+3=12 メインレジスタ$C5の値をSS-1の指定する外部メモリに格納後,SSをディクリメント。
  • PHS $2 ;
PHU
(Push by User stack pointer)
PHU $C5$C5 → (US-1)
US ← US-1
変化しない3+6+3=12 メインレジスタ$C5の値をUS-1の指定する外部メモリに格納後,USをディクリメント。
  • PHU $2 ;
GFL
(Get Flag)
GFL $C5[ ,(JR)LABEL ]$C5 ← F 変化しない3+6=9
(JR: +3)
フラグレジスタの内容を第1オペランドの指定するメインレジスタ$C5に格納する。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • GFL $2 ;
  • GFL $2,LABEL ;Jump拡張
PFL
(Put Flag)
PFL A[ ,(JR)LABEL ]A → F Aの値で変化A=$C5: 3+6=9
A=IM8: 3+3+6=12
(JR: +3)
オペランド1のAの内容をフラグレジスタに格納する。(設定可能なのは上位4ビットのみ)
Aは,$C5,IM8。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • PFL $2 ;
  • PFL $2,LABEL ;Jump拡張
GPO
(Get Port)
GPO $C5[ ,(JR)LABEL ]$C5 ← Port 変化しない3+6=9
(JR: +3)
ポート端子の内容を第1オペランドの指定するメインレジスタ$C5に格納する。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • GPO $2 ;
  • GPO $2,LABEL ;Jump拡張
GST
(Get Status)
GST Sreg,$C5[ ,(JR)LABEL ]$C5 ← Sreg 変化しない3+6=9
(JR: +3)
ステータスレジスタの内容を第2オペランドの指定するメインレジスタ$C5に格納する。
Sreg=PE,PD,UA,IA,IE,TM, IB。
第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
格納方向が,STと同じで少数派。
  • GST PE,$2 ;
  • GST IB,$2 ;割り込み制御・バンク制御レジスタ(未公開命令)
  • GST TM,$2,LABEL ;Jump拡張
  • GST IB,$2,LABEL ;割り込み制御・バンク制御レジスタを$2に格納後,相対ジャンプ(未公開命令)
EU形式
  • GST CS,$2 ;割り込み制御・バンク制御レジスタ(未公開命令)
  • GST CS,$2,J.LABEL ;割り込み制御・バンク制御レジスタを$2に格納後,相対ジャンプ(未公開命令)
PST
(Put Status)
GST Sreg,A[ ,(JR)LABEL ]Sreg ← A 変化しないA=$C5: 3+6=9
A=IM8: 3+3+6=12
(JR: +3)
ステータスレジスタに第2オペランドの指定するAの値を格納する。
Sreg=PE,PD,UA,IA,IE,TM, IB。
Aは,$C5, IM8。
第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • PST PE,$2 ;メインレジスタ転送
  • PST IB,$2 ;割り込み制御・バンク制御レジスタ(未公開命令)
  • PST TM,$2,LABEL ;Jump拡張
  • PST IB,$2,LABEL ;割り込み制御・バンク制御レジスタに$2の値を格納後,相対ジャンプ(未公開命令)
  • PST UA,123 ;8ビットイミディエット値転送
  • PST IB,123 ;割り込み制御・バンク制御レジスタ(未公開命令)
EU形式
  • PST CS,$2 ;割り込み制御・バンク制御レジスタ(未公開命令)
  • PST CS,123,J.LABEL ;割り込み制御・バンク制御レジスタに123を格納後,相対ジャンプ(未公開命令)
STL
(Store data to LCD)
未公開命令
STL A[ ,(JR)LABEL ]A → LCD 変化しないJRなし: 3+15=18
JR付き: 3+3+14=20
第1オペランドの指定するAの値をLCDデータエリアに出力する。
Aは,$C5, IM8。
$C5指定時に第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • STL $2 ;メインレジスタ
  • STL $2,LABEL ;Jump拡張
  • STL 123 ;8ビットイミディエット値出力
EU形式
  • OCB $2 ;メインレジスタ
  • OCB $2,LABEL ;Jump拡張
  • OCB 123 ;8ビットイミディエット値出力
LDL
(Load data from LCD)
未公開命令
LDL $C5[ ,(JR)LABEL ]$C5 ← LCD port data 変化しないJRなし: 3+15=18
JR付き: 3+3+14=20
予めLCDCに設定した転送プロトコルに従って,LCDデータポートの値を第1オペランド$C5に格納する。
読み出しは,4ビット単位で行われるため,画面上のグラフィックデータは上位下位の4ビットが入れ替わって読み込まれる。
例えば,画面上のドットが&H4A表示なら,LDL $C5を実行すると,$C5=&HA4となる。
読み出し手順は,およそ以下の通り。
(1)LCDCへ描画モード(何でも良い)、LCD座標位置を指定。(PPO &HDF後にSTLM)
(2)LCDCへ読み出しコマンド(&HE1)をセット。(PPO&hDF 後に STL &HE1)
(3)データRAM指定でLDLを実行。(PPO &HDE後にLDL)
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • LDL $2 ;メインレジスタ
  • LDL $2,LABEL ;Jump拡張
EU形式
  • ICB $2 ;メインレジスタ
  • ICB $2,LABEL ;Jump拡張
PPO
(Put lcd control Port)
未公開命令
PPO A[ ,(JR)LABEL ]A → LCD control port 変化しないA=$C5: 3+6=9
A=IM8: 3+3+6=12
(JR: +3)
第1オペランドの指定するAの値をLCD制御ポートに出力する。
Aは,$C5, IM8。
$C5指定時に第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • PPO $2 ;メインレジスタ
  • PPO $2,LABEL ;Jump拡張
  • PPO 123 ;8ビットイミディエット値出力
EU形式
  • PCB $2 ;メインレジスタ
  • PCB $2,LABEL ;Jump拡張
  • PCB 123 ;8ビットイミディエット値出力
PSR
(Put Specific index Register)
未公開命令
PSR SIR,A[ ,(JR)LABEL ]SIR ← A 変化しない3+6=9
(JR: +3)
第1オペランドの指定する特定インデックスレジスタSIRに第2オペランドAの値を格納する。
SIR=SX,SY,SZ。
Aは,$C5, IM8。
$C5指定時に第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
本命令で,SIRの設定(通常,SX=31, SY=30, SZ=0で固定)を変更して,システム側に制御を戻すと,暴走する。
ユーザーがSIRを変更する際には以下の注意が必要。
(1)SIRを変更している間は、割り込み禁止にする。
(2)ROM内処理に戻る場合やROM内処理を呼び出す際は、SIRを元の設定に戻す。
(3)最適化スイッチをOFF(LEVEL 0)指定でコーディングする。
(LEVEL 1だと$31,$30,$0固定で最適化されてしまい、コードが混乱するため。)
  • PSR SX,$2 ;メインレジスタ
  • PSR SY,$2,LABEL ;Jump拡張
  • PSR SZ,15 ;5ビットイミディエット値(0-31)
EU形式
  • PRA #1,$2 ;メインレジスタ
  • PRA #2,$2,J.LABEL ;Jump拡張
  • PRA #0,15 ;5ビットイミディエット値(0-31)
GSR
(Get Specific index Register)
未公開命令
GSR SIR,$C5[ ,(JR)LABEL ]SIR → $C5 変化しない3+6=9
(JR: +3)
第1オペランドの指定する特定インデックスレジスタSIRの内容を第2オペランドのメインレジスタ$C5に格納する。
SIR=SX,SY,SZ。
第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • GSR SX,$2 ;
  • GSR SY,$2,LABEL ;Jump拡張
EU形式
  • GRA #2,$2 ;
  • GRA #0,$2,J.LABEL ;Jump拡張
転送命令(16ビット)
ニモニック書式機能フラグクロック数説明書式例
LDW
(Load Word)
LDW opr1,opr2[ ,(JR)LABEL ]opr1 ← opr2 変化しない opr2の内容をopr1に転送する。
未公開だが,jump拡張あり。
特定のopr1,opr2の組み合わせ時に,オペランド3にアドレスラベルを追加することで,転送実行後に相対ジャンプする。
オペランド3およびJRタグは省略可能。
LD命令で使用可能なオペランドの組み合わせは以下の5種類で,jump拡張の適用可能性については以下を参照のこと。
 
LDW $C5,$C5[ ,(JR)LABEL ]opr1@$C5 ← opr2@$C53+3+11=17
(JR: +3)
メインレジスタ間の転送
  • LDW $2,$0 ;$0,$1のデータを$2,$3に転送
LDW $C5,($A)[ ,(JR)LABEL ]opr1@$C5 ← opr2@($A)$A=$SIR: 3+8+3+3=17
$A=$C5: 3+3+8+3+3=20
(JR: +3)
外部メモリからメインレジスタへの転送(1)
opr1,opr2は,リトルエンディアンで2バイト。
$Aは,$C5,$SIR。
$バンクは,UAレジスタのIX用が適用。
  • LDW $2,($0) ;$0(下位),$1(上位)をアドレスとする外部メモリのデータを$2,$3に転送
  • LDW $2,($SZ) ;デフォルトではSZ=0なので,LDW $2,($0)と同じ動作を高速実行
LDW $C5,({IX | IZ}±$C5)opr1@$C5 ← opr2@({IX|IZ}±$C5)3+3+6+3+5=20 外部メモリからメインレジスタへの転送(2)
インデックスレジスタ±メインレジスタ(8ビット)による指定。
jump拡張なし。
  • LDW $2,(IX+$31) ;IX+$31をアドレスとする外部メモリのデータを$2,$3に転送
LDW $C5,IM16$C5 ← IM163+3+3+14=23 8ビットイミディエットデータをメインレジスタへ転送
  • LD $4,&H7012 ;$4に&H12,$5に&H70を格納
LDW $C5,$SIR[ ,(JR)LABEL ]$C5 ← $SIR3+11=14
(JR: +3)
特定インデックスレジスタSIRによるメインレジスタのインダイレクト転送(未公開命令)
通常のレジスタ指定と比較して,命令コードが1バイト短くなる。(LEVEL 0指定時)
その分,実行クロックも短くなり,ROM内で多用されている。
EU形式では,SX=#0,SY=#1,SZ=#2と表記され,JRタグは省略可能で"J."と記述可能。
  • LDW $4,$SX ;$4に$SXの示すメインレジスタ値(8ビット),$5に$SXの示すメインレジスタ+1のメインレジスタ値(8ビット)を格納。デフォルトでは,$SX=$31=0,$SX+1=$0(可変)。
  • LDW $4,$SZ ;デフォルト設定では SZ=0なので,$4=$0, $5=$1の代入を行う。
EU形式
  • LDW $4,#0 ;LD $4,$SX
  • LDW $4,#0,J.LABEL ;
LDIW
(Load Increment Word)
LDIW $C5,(IR±A)$C5,$C5+1 ← (IR±A)
IR ← IR±A+2
変化しないA=SIR: 3+6+3+5=17
A=$C5: 3+3+6+3+5=20
(IR±A)をアドレスとする外部メモリの内容を,メインレジスタ$C5,$C5+1に転送後,IRに転送メモリアドレスに2加えたものを代入。
IRはIX,IZ。
Aは,$C5,SIRが適用可能。
例えば,LDIW $2,(IX+$0)において,IX=&H7000,$0=1だとすると,
  $2 ← (&H7001のメモリ内容)
  $3 ← (&H7002のメモリ内容)
  IX ← &H7003
  • LDIW $4,(IX+$2) ;メインレジスタ指定
  • LDIW $4,(IZ-$2) ;
  • LDIW $4,(IX+$SX) ;SIRによるインダイレクト指定(未公開)
  • LDIW $4,(IZ-$SY) ;
LDDW
(Load Decrement Word)
LDDW $C5,(IR±A)$C5,$C5-1 ← (IR±A)
IR ← IR±A-1
変化しないA=SIR: 3+3+6+3=15
A=$C5: 3+3+6+3+3=18
(IR±A)をアドレスとする外部メモリの内容を,メインレジスタ$C5,$C5-1に転送後,IRに転送メモリアドレスをディクリメントしたものを代入。
IRはIX,IZ。
Aは,$C5,SIRが適用可能。
LDW,LDIWと違ってメインレジスタペアの番号が$C5,$C5-1となるので注意。
例えば,LDDW $2,(IX+$0)において,IX=&H7000,$0=1だとすると,
  $2 ← (&H7001のメモリ内容)
  $1 ← (&H7000のメモリ内容)
  IX ← &H7000(最後にアクセスした番地)
  • LDDW $4,(IX-$10) ;メインレジスタ指定
  • LDDW $4,(IZ+$10) ;
  • LDDW $4,(IX-$SX) ;SIRによるインダイレクト指定(未公開)
  • LDDW $4,(IZ+$SZ) ;
LDCW
(Load Check Word)
LDCW $C5,A[ ,(JR)LABEL ]何もしない(No Operation) 変化しないA=SIR: 3+11=14
A=$C5: 3+3+11=17
(JR: +3)
LDW命令と同じ形式でオペランド指定可能だが,実際には何も処理せず,命令デコードのみ行う。
NOP命令と同様に,遅延処理。
A=$C5,SIR。
ただし,第3オペランドにラベルがある場合,相対ジャンプする。(JRタグは省略可)
  • LDCW $4,$2 ;メインレジスタ指定
  • LDCW $4,$SX ;SIRによるインダイレクト指定
  • LDCW $4,$3,ERROR;レジスタ指定+Jump拡張
  • LDCW $4,$SZ,LABEL ;SIRによるインダイレクト指定+Jump拡張
STW
(Store Word)
ST $C5,(IR±A)$C5 → (IR±A)
$C5+1 → (IR±A+1)
変化しないA=SIR: 3+6+3+5=17
A=$C5: 3+3+6+3+5=20
第1オペランドのメインレジストペア$C5,$C5+1の内容を(IR±A)をアドレスとする外部メモリに格納する。
転送方向がLD命令とは反対なのに注意必要。
IRは,IX,IZ。
Aは$C5,SIRが適用可能。
  • STW $4,(IX+$2) ;メインレジスタ指定
  • STW $4,(IZ-$2) ;
  • STW $4,(IX+$SX) ;SIRによるインダイレクト指定(未公開)
  • STW $4,(IZ-$SY) ;
STW
(Store Word $)
STW $C5,(A)[ ,(JR)LABEL ]$C5 → (A)
$C5+1 → (A+1)
変化しないA=SIR: 3+8+3+3=17
A=$C5: 3+3+8+3+3=20
(JR: +3)
第1オペランドのメインレジタペア$C5,$C5+1の内容をA(下位),A+1(上位)をアドレスとする外部メモリに格納する。
転送方向がLD命令とは反対なのに注意必要。
Aは$C5,SIRが適用可能。
第3オペランドにラベルがある場合、転送後、相対ジャンプする。(JRタグは省略可)
  • STW $2,($0) ;セカンドオペレーション指定(2バイト)??3バイト
  • STW $2,($SZ) ;SIRによるインダイレクト指定(2バイト)。事実上,$SZ=$0のみ使用可能。 ($SX=$31($31,$0ペア),$SY=$30($30,$31ペア=0001)も指定可能だが,利用価値低い。)
  • STW $2,($10) ;通常(3バイト)
  • STW $2,($10),LABEL ;Jump拡張(4バイト)
  • STW $2,($SZ),LABEL ;SIRによるインダイレクト指定+Jump拡張(3バイト)
STW
(Store IM16)
未公開命令
STW IM16,($SIR)IM16 → ($SIR) 変化しない3+3+3+8+3+3=23 第1オペランドの16ビットイミディエット値をSIRでインダイレクト指定されるメインレジスタの示す外部メモリに格納する。
転送方向がLD命令とは反対なのに注意必要。
事実上,$SZ=$0のみ使用可能。($SX=$31($31,$0ペア),$SY=$30($30,$31ペア=0001)も指定可能だが,利用価値低い。)
  • STW &H7023,($SZ) ;SIRによるインダイレクト指定
  • STW &H7023,($0) ;LEVEL 1で可能。LEVEL 0では使用できない。
STIW
(Store Increment Word)
STIW $C5,(IR±A)$C5 → (IR±A)
$C5+1 → (IR±A+1)
IR ← IR±A+2
変化しないA=SIR: 3+6+3+5=17
A=$C5,IM8: 3+3+6+3+5=20
第1オペランドのメインレジストペア$C5,$C5+1の内容を(IR±A)をアドレスとする外部メモリに格納する。
IRには,IR±A+2を格納する。
転送方向がLD命令とは反対なのに注意必要。
IRは,IX,IZ。
Aは$C5,SIRが適用可能。
  • STI $4,(IX+$2) ;メインレジスタ指定
  • STI $4,(IZ-$2) ;
  • STI $4,(IX+$SX) ;SIRによるインダイレクト指定
  • STI $4,(IZ-$SY) ;
STDW
(Store Decrement Word)
STDW $C5,(IR±A)$C5 → (IR±A)
$C5-1 → (IR±A-1)
IR ← IR±A-1
変化しないA=SIR: 3+6+3+3=15
A=$C5,IM8: 3+3+6+3+3=18
第1オペランドのメインレジストペア$C5,$C5-1の内容を(IR±A)をアドレスとする外部メモリに格納する。
IRには,IR±A-1を格納する。
転送方向がLD命令とは反対なのに注意必要。
IRは,IX,IZ。
Aは$C5,SIRが適用可能。
STW、STIWと違ってメインレジスタペアの番号が$C5,$C5-1となるので注意。
例えば,STDW $2,(IX+$0) において,IX=&H7000,$0=1の場合,以下のように動作する。
  $2 → (&H7001番地)
  $1 → (&H7000番地)
  IX ← &H7000(最後にアクセスした番地が入る)
  • STDW $4,(IX+$2) ;メインレジスタ指定
  • STDW $4,(IZ-$2) ;
  • STDW $4,(IX+$SX) ;SIRによるインダイレクト指定
  • STDW $4,(IZ-$SY) ;
PPSW
(Pop by System stack pointer Word)
PPSW $C5$C5 ← (SS)
$C5+1 ← (SS+1)
SS ← SS+2
変化しない3+6+3+5=17 SSの指定する外部メモリの内容をメインレジスタペア$C5,$C5+1に格納後,SSに2を加える。
  • PPSW $2 ;
PPUW
(Pop by User stack pointer Word)
PPUW $C5$C5 ← (US)
$C5+1 ← (US+1)
US ← US+2
変化しない3+6+3+5=17 USの指定する外部メモリの内容をメインレジスタペア$C5,$C5+1に格納後,USに2を加える。
  • PPUW $2 ;
PHSW
(Push by System stack pointer Word)
PHSW $C5$C5 → (SS-1)
$C5-1 → (SS-2)
SS ← SS-2
変化しない3+6+3+3=15 メインレジスタペア$C5,$C5-1の値をSS-1,SS-2の指定する外部メモリに格納後,SSから2を引く。
  • PHSW $2 ;
PHUW
(Push by User stack pointer Word)
PHUW $C5$C5 → (US-1)
$C5-1 → (US-2)
US ← US-2
変化しない3+6+3+3=15 メインレジスタペア$C5,$C5-1の値をUS-1,US-2の指定する外部メモリに格納後,USから2を引く。
  • PHUW $2 ;
GRE
(Get Register)
GRE Reg,$C5[ ,(JR)LABEL ]Reg → $C5 変化しない3+11=14
(JR: +3)
ステータスレジスタの内容を第2オペランドの$C5に格納する。
Reg = IX,IY,IZ,SS,US,KY
第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • GRE IX,$2 ;
  • GRE US,$2 ;
  • GRE KY,$2,LABEL ;Jump拡張
PRE
(Put Register)
PRE Reg,A[ ,(JR)LABEL ]Reg ← A 変化しないA=$C5: 3+11=14
(JR: +3)
A=IM16: 3+3+3+11=20
ステータスレジスタに第2オペランドのAの値を格納する。
Reg = IX,IY,IZ,SS,US,KY
Aは,$C5($C5,$C5+1ペア),IM16。
第2オペランドがメインレジスタでかつ,第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • PRE IX,$2 ;
  • PRE US,$2 ;
  • PRE KY,$2,LABEL ;Jump拡張
  • PRE IZ,&H703F ;
STLW
(Store Word data to LCD)
未公開命令
STLW $C5[ ,(JR)LABEL ]$C5 → LCD
$C5+1 → LCD
変化しない3+22=25
(JR: +3)
第1オペランドのメインレジスタペア$C5,$C5+1をLCDデータエリアに出力する。
出力は8ビットすつ順に行われる。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • STLW $2 ;メインレジスタ
  • STLW $2,LABEL ;Jump拡張
EU形式
  • OCBW $2 ;メインレジスタ
  • OCBW $2,LABEL ;Jump拡張
LDLW
(Load Word data from LCD)
未公開命令
LDLW $C5[ ,(JR)LABEL ]$C5 ← LCD port data
$C5+1 ← LCD port data
変化しないJRなし: 3+23=26
JR付き: 3+3+22=28
予めLCDCに設定した転送プロトコルに従って,LCDデータポートの値を第1オペランドの指定するメインレジスタペア$C5,$C5+1に格納する。
読み出しは,4ビット単位で行われるため,画面上のグラフィックデータは上位下位の4ビットが入れ替わって読み込まれる。
読み出し手順は,およそ以下の通り。
(1)LCDCへ描画モード(何でも良い)、LCD座標位置を指定。(PPO &HDF後にSTLM)
(2)LCDCへ読み出しコマンド(&HE1)をセット。(PPO&HDF 後に STL &HE1)
(3)データRAM指定でLDLWを実行。(PPO &HDE後にLDLW)
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • LDLW $2 ;メインレジスタ
  • LDLW $2,LABEL ;Jump拡張
EU形式
  • ICBW $2 ;メインレジスタ
  • ICBW $2,LABEL ;Jump拡張
PPOW
(Put lcd control Port Word)
未公開命令
PPOW $C5[ ,(JR)LABEL ]$C5 → LCD control port
$C5+1 → LCD control port
変化しない3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア$C5,$C5+1の値をLCD制御ポートに出力する。
出力は8ビットずつ順に行われる。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
注意:本命令でアクセス可能なI/OポートはPDレジスタとは違います。(LCD系のI/Oです)
  • PPOW $2 ;メインレジスタ
  • PPOW $2,LABEL ;Jump拡張
EU形式
  • PCBW $2 ;メインレジスタ
  • PCBW $2,LABEL ;Jump拡張
GFLW
(Get Flag Word)
GFLW $C5[ ,(JR)LABEL ]$C5 ← F
$C5+1 ← F
変化しない3+11=14
(JR: +3)
フラグレジスタの内容を第1オペランドの指定するメインレジスタペア$C5,$C5+1に格納する。
このとき,$C5,$C5+1には同じデータが入れられる。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • GFLW $2 ;
  • GFLW $2,LABEL ;Jump拡張
GPOW
(Get Port Word)
未公開命令
GPOW $C5[ ,(JR)LABEL ]$C5 ← Port
$C5+1 ← Port
変化しない3+11=14
(JR: +3)
ポート端子の内容を第1オペランドの指定するメインレジスタペア$C5,$C5+1に格納する。
レジスタペア$C5,$C5+1には,同じデータが入る。
第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
  • GPOW $2 ;
  • GPOW $2,LABEL ;Jump拡張
PSRW
(Put Specific index Register Word)
未公開命令
PSRW SIR,$C5[ ,(JR)LABEL ]SIR ← $C5
SIR ← $C5+1
変化しない3+11=14
(JR: +3)
第1オペランドの指定する特定インデックスレジスタSIRに第2オペランドのメインレジスタペア$C5,$C5+1の内容を格納する。
ただし,$C5(下位5ビット)のみがSIRに格納される。
SIR=SX,SY,SZ。
第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
本命令で,SIRの設定(通常,SX=31, SY=30, SZ=0で固定)を変更して,システム側に制御を戻すと,暴走する。
ユーザーがSIRを変更する際には以下の注意が必要。
(1)SIRを変更している間は、割り込み禁止にする。
(2)ROM内処理に戻る場合やROM内処理を呼び出す際は、SIRを元の設定に戻す。
(3)最適化スイッチをOFF(LEVEL 0)指定でコーディングする。
(LEVEL 1だと$31,$30,$0固定で最適化されてしまい、コードが混乱するため。)
  • PSRW SX,$2 ;メインレジスタ
  • PSRW SY,$2,LABEL ;Jump拡張
EU形式
  • PRAW #1,$4 ;メインレジスタ
  • PRAW #2,$4,J.LABEL ;Jump拡張
GSRW
(Get Specific index Register Word)
未公開命令
GSRW SIR,$C5[ ,(JR)LABEL ]SIR → $C5
SIR+1 → $C5+1
変化しない3+11=14
(JR: +3)
第1オペランドの指定する特定インデックスレジスタSIR,SIR+1を第2オペランドのメインレジスタペア$C5,$C5+1に格納する。
SIR=SX,SY,SZ。
第3オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
例えば,GSRW SY,$2 において,SY=30の場合,$2=30,$3=31が格納される。SY=31の場合,$2=31,$3=0が格納される。
  • GSRW SX,$2 ;
  • GSRW SY,$2,LABEL ;Jump拡張
EU形式
  • GRAW #2,$2 ;
  • GRAW #0,$2,J.LABEL ;Jump拡張
算術演算命令(8ビット)
書式例に記述のないオペランド形式はサポートされていない。
正確には,INV,CMPはシフト命令群に分類されるが,算術命令とした方が分かりやすいので,ここで説明する。
ニモニック書式機能フラグクロック数説明書式例
INV
(Invert)
INV $C5[ ,(JR)LABEL ]$C5 ← &HFF - $C5 Z,C=1,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタの内容をビット反転する(1の補数)。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • INV $2 ;
  • INV $2,LABEL ;Jump拡張
CMP
(Complement)
CMP $C5[ ,(JR)LABEL ]$C5 ← 2^8-$C5 Z,C,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタの内容をビット反転後に1を加える(2の補数)。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • CMP $2 ;
  • CMP $2,LABEL ;Jump拡張
AD
(Add)
AD A ,B[ ,(JR)LABEL ]A ← A+B Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+6=9
(A,B)=($C5,$C5): 3+3+6=12
(A,B)=($C5,IM8): 3+3+6=12
(JR: +3)
A=(IR±SIR): 3+6+3+3=15
A=(IR±$C5): 3+3+6+3+3=18
A=(IR±$IM8): 3+3+6+3+3=18
第1オペランドAの値と第2オペランドBの値を加算した結果を,Aに格納する。
外部メモリとの演算以外の場合,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • AD $4,$2 ;メインレジスタ同士
  • AD $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • AD $4,$SZ ;メインレジスタ+SIRによるインダイレクト指定
  • AD $4,$SZ,LABEL ;メインレジスタ+SIRによるインダイレクト指定(Jump拡張)
  • AD $4,123 ;メインレジスタ+IM8
  • AD $4,123,LABEL ;メインレタ+IM8(Jump拡張)
  • AD (IX+$4),$2 ;外部メモリ(1)+メインレジスタ→外部メモリ
  • AD (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)+メインレジスタ→外部メモリ
  • AD (IZ+123),$2 ;外部メモリ(2)+メインレジスタ→外部メモリ
SB
(Subtract)
SB A ,B[ ,(JR)LABEL ]A ← A-B Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+6=9
(A,B)=($C5,$C5): 3+3+6=12
(A,B)=($C5,IM8): 3+3+6=12
(JR: +3)
A=(IR±SIR): 3+6+3+3=15
A=(IR±$C5): 3+3+6+3+3=18
A=(IR±$IM8): 3+3+6+3+3=18
第1オペランドAの値から第2オペランドBの値を減算した結果を,Aに格納する。
外部メモリとの演算以外の場合,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • SB $4,$2 ;メインレジスタ同士
  • SB $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • SB $4,$SZ ;メインレジスタ-SIRによるインダイレクト指定
  • SB $4,$SZ,LABEL ;メインレジスタ-SIRによるインダイレクト指定(Jump拡張)
  • SB $4,123 ;メインレジスタ-IM8
  • SB $4,123,LABEL ;メインレタ-IM8(Jump拡張)
  • SB (IX+$4),$2 ;外部メモリ(1)-メインレジスタ→外部メモリ
  • SB (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)-メインレジスタ→外部メモリ
  • SB (IZ+123),$2 ;外部メモリ(2)-メインレジスタ→外部メモリ
ADB
(Add BCD)
ADB A ,B[ ,(JR)LABEL ]A ← A+B (BCD演算) Z,C,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値をBCD加算した結果を,Aに格納する。
BCDフォーマットは,上位4ビットを10の位,下位4ビットを1の位とする10進数。
第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • ADB $4,$2 ;メインレジスタ同士
  • ADB $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ADB $4,$SZ ;メインレジスタ+SIRによるインダイレクト指定
  • ADB $4,$SZ,LABEL ;メインレジスタ+SIRによるインダイレクト指定(Jump拡張)
  • ADB $4,&H12 ;メインレジスタ+IM8。&H12(18)は,BCDで10進数の12。
  • ADB $4,&H12,LABEL ;メインレタ+IM8(Jump拡張)
SBB
(Subtract BCD)
SBB A ,B[ ,(JR)LABEL ]A ← A-B (BCD演算) Z,C,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値から第2オペランドBの値をBCD減算した結果を,Aに格納する。
BCDフォーマットは,上位4ビットを10の位,下位4ビットを1の位とする10進数。
第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • SBB $4,$2 ;メインレジスタ同士
  • SBB $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • SBB $4,$SZ ;メインレジスタ-SIRによるインダイレクト指定
  • SBB $4,$SZ,LABEL ;メインレジスタ-SIRによるインダイレクト指定(Jump拡張)
  • SBB $4,&H12 ;メインレジスタ-IM8。&H12(18)は,BCDで10進数の12。
  • SBB $4,&H12,LABEL ;メインレタ-IM8(Jump拡張)
ADC
(Add Check)
ADC A ,B[ ,(JR)LABEL ](A ← A+B) Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+6=9
(A,B)=($C5,$C5): 3+3+6=12
(A,B)=($C5,IM8): 3+3+6=12
(JR: +3)
A=(IR±SIR): 3+6+6=15
A=(IR±$C5): 3+3+6+6=18
A=(IR±$IM8): 3+3+6+3+3=18
第1オペランドAの値と第2オペランドBの値を加算するが,結果をどこにも格納せず,フラグのみが変化する。
外部メモリとの演算以外の場合,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • ADC $4,$2 ;メインレジスタ同士
  • ADC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ADC $4,$SZ ;メインレジスタ+SIRによるインダイレクト指定
  • ADC $4,$SZ,LABEL ;メインレジスタ+SIRによるインダイレクト指定(Jump拡張)
  • ADC $4,123 ;メインレジスタ+IM8
  • ADC $4,123,LABEL ;メインレタ+IM8(Jump拡張)
  • ADC (IX+$4),$2 ;外部メモリ(1)+メインレジスタ
  • ADC (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)+メインレジスタ
  • ADC (IZ+123),$2 ;外部メモリ(2)+メインレジスタ
SBC
(Subtract Check)
SBC A ,B[ ,(JR)LABEL ](A ← A-B) Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+6=9
(A,B)=($C5,$C5): 3+3+6=12
(A,B)=($C5,IM8): 3+3+6=12
(JR: +3)
A=(IR±SIR): 3+6+6=15
A=(IR±$C5): 3+3+6+6=18
A=(IR±$IM8): 3+3+6+3+3=18
第1オペランドAの値から第2オペランドBの値を減算するが,結果をどこにも格納せず,フラグのみが変化する。
外部メモリとの演算以外の場合,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • SBC $4,$2 ;メインレジスタ同士
  • SBC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • SBC $4,$SZ ;メインレジスタ-SIRによるインダイレクト指定
  • SBC $4,$SZ,LABEL ;メインレジスタ-SIRによるインダイレクト指定(Jump拡張)
  • SBC $4,123 ;メインレジスタ-IM8
  • SBC $4,123,LABEL ;メインレタ-IM8(Jump拡張)
  • SBC (IX+$4),$2 ;外部メモリ(1)-メインレジスタ
  • SBC (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)-メインレジスタ
  • SBC (IZ+123),$2 ;外部メモリ(2)-メインレジスタ
AN
(And)
AN A ,B[ ,(JR)LABEL ]A ← A and B Z,C=0,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理積(AND)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • AN $4,$2 ;メインレジスタ同士
  • AN $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • AN $4,$SZ ;メインレジスタ and SIRによるインダイレクト指定
  • AN $4,$SZ,LABEL ;メインレジスタ and SIRによるインダイレクト指定(Jump拡張)
  • AN $4,123 ;メインレジスタ and IM8
  • AN $4,123,LABEL ;メインレタ and IM8(Jump拡張)
ANC
(And Check)
ANC A ,B[ ,(JR)LABEL ](A ← A and B) Z,C=0,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理積(AND)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ANC $4,$2 ;メインレジスタ同士
  • ANC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ANC $4,$SZ ;メインレジスタ and SIRによるインダイレクト指定
  • ANC $4,$SZ,LABEL ;メインレジスタ and SIRによるインダイレクト指定(Jump拡張)
  • ANC $4,123 ;メインレジスタ and IM8
  • ANC $4,123,LABEL ;メインレタ and IM8(Jump拡張)
NA
(Nand)
NA A ,B[ ,(JR)LABEL ]A ← A nand B Z,C=1,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値のNAND(ANDのビット反転)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • NA $4,$2 ;メインレジスタ同士
  • NA $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • NA $4,$SZ ;メインレジスタ nand SIRによるインダイレクト指定
  • NA $4,$SZ,LABEL ;メインレジスタ nand SIRによるインダイレクト指定(Jump拡張)
  • NA $4,123 ;メインレジスタ nand IM8
  • NA $4,123,LABEL ;メインレタ nand IM8(Jump拡張)
NAC
(Nand Check)
NAC A ,B[ ,(JR)LABEL ](A ← A nand B) Z,C=1,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値のNAND(ANDのビット反転)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • NAC $4,$2 ;メインレジスタ同士
  • NAC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • NAC $4,$SZ ;メインレジスタ nand SIRによるインダイレクト指定
  • NAC $4,$SZ,LABEL ;メインレジスタ nand SIRによるインダイレクト指定(Jump拡張)
  • NAC $4,123 ;メインレジスタ nand IM8
  • NAC $4,123,LABEL ;メインレタ nand IM8(Jump拡張)
OR
(Or)
OR A ,B[ ,(JR)LABEL ]A ← A or B Z,C=1,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理和(OR)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • OR $4,$2 ;メインレジスタ同士
  • OR $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • OR $4,$SZ ;メインレジスタ or SIRによるインダイレクト指定
  • OR $4,$SZ,LABEL ;メインレジスタ or SIRによるインダイレクト指定(Jump拡張)
  • OR $4,123 ;メインレジスタ or IM8
  • OR $4,123,LABEL ;メインレタ or IM8(Jump拡張)
ORC
(Or Check)
ORC A ,B[ ,(JR)LABEL ](A ← A or B) Z,C=1,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理和(OR)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ORC $4,$2 ;メインレジスタ同士
  • ORC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ORC $4,$SZ ;メインレジスタ or SIRによるインダイレクト指定
  • ORC $4,$SZ,LABEL ;メインレジスタ or SIRによるインダイレクト指定(Jump拡張)
  • ORC $4,123 ;メインレジスタ or IM8
  • ORC $4,123,LABEL ;メインレタ or IM8(Jump拡張)
XR
(Exclusive Or)
XR A ,B[ ,(JR)LABEL ]A ← A xor B Z,C=0,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値の排他的論理和(OR)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • XR $4,$2 ;メインレジスタ同士
  • XR $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • XR $4,$SZ ;メインレジスタ xor SIRによるインダイレクト指定
  • XR $4,$SZ,LABEL ;メインレジスタ xor SIRによるインダイレクト指定(Jump拡張)
  • XR $4,123 ;メインレジスタ xor IM8
  • XR $4,123,LABEL ;メインレタ xor IM8(Jump拡張)
XRC
(Exclusive Or Check)
XRC A ,B[ ,(JR)LABEL ](A ← A xor B) Z,C=0,LZ,UZが変化B=SIR: 3+6=9
B=$C5,IM8: 3+3+6=12
(JR: +3)
第1オペランドAの値と第2オペランドBの値の排他的論理和(XOR)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR,IM8。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • XRC $4,$2 ;メインレジスタ同士
  • XRC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • XRC $4,$SZ ;メインレジスタ xor SIRによるインダイレクト指定
  • XRC $4,$SZ,LABEL ;メインレジスタ xor SIRによるインダイレクト指定(Jump拡張)
  • XRC $4,123 ;メインレジスタ xor IM8
  • XRC $4,123,LABEL ;メインレタ xor IM8(Jump拡張)
算術演算命令(16ビット)
書式例に記述のないオペランド形式はサポートされていない。
フラグ動作が8ビット演算と以下のように異なる。
  ・Z:演算結果16ビットが全て0の場合、0。
  ・Z:C:最上位ビット(bit15)からのキャリーまたはボローがあったとき 1。
  ・Z:LZ:上位8ビットのうち下位4ビットが0のとき 0。
  ・Z:UZ:上位8ビットのうち上位4ビットが0のとき 0。
正確には,INVW,CMPWはシフト命令群に分類されるが,算術命令とした方が分かりやすいので,ここで説明する。
ニモニック書式機能フラグクロック数説明書式例
INVW
(Invert Word)
INVW $C5[ ,(JR)LABEL ]($C5+1,$C5) ← &HFFFF - ($C5+1,$C5) Z,C=1,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペアの内容をビット反転する(1の補数)。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • INVW $2 ;
  • INVW $2,LABEL ;Jump拡張
CMPW
(Complement Word)
CMPW $C5[ ,(JR)LABEL ]($C5+1,$C5) ← 2^16-($C5+1,$C5) Z,C,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペアの内容をビット反転後に1を加える(2の補数)。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • CMPW $2 ;
  • CMPW $2,LABEL ;Jump拡張
ADW
(Add Word)
ADW A ,B[ ,(JR)LABEL ]A ← A+B Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+11=14
(A,B)=($C5,$C5): 3+3+11=17
(JR: +3)
A=(IR±SIR): 3+6+3+3+3+3=21
A=(IR±$C5): 3+3+6+3+3+3+3=24
第1オペランドAの値と第2オペランドBの値を加算した結果を,Aに格納する。
演算が16ビットにて行われる以外は、ほぼ8ビット演算と同じ。
メインレジスタ同士(SIRによるインダイレクト指定を含む)の演算の場合のみ,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • ADW $4,$2 ;メインレジスタ同士
  • ADW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ADW $4,$SZ ;メインレジスタ+SIRによるインダイレクト指定
  • ADW $4,$SZ,LABEL ;メインレジスタ+SIRによるインダイレクト指定(Jump拡張)
  • ADW (IX+$4),$2 ;外部メモリ+メインレジスタ→外部メモリ
  • ADW (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)+メインレジスタ→外部メモリ
SBW
(Subtract Word)
SBW A ,B[ ,(JR)LABEL ]A ← A-B Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+11=14
(A,B)=($C5,$C5): 3+3+11=17
(JR: +3)
A=(IR±SIR): 3+6+3+3+3+3=21
A=(IR±$C5): 3+3+6+3+3+3+3=24
第1オペランドAの値から第2オペランドBの値を減算した結果を,Aに格納する。
演算が16ビットペアレジスタにて行われる以外は、ほぼ8ビット演算と同じ。
メインレジスタ同士(SIRによるインダイレクト指定を含む)の演算の場合のみ,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • SBW $4,$2 ;メインレジスタ同士
  • SBW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • SBW $4,$SZ ;メインレジスタ-SIRによるインダイレクト指定
  • SBW $4,$SZ,LABEL ;メインレジスタ-SIRによるインダイレクト指定(Jump拡張)
  • SBW (IX+$4),$2 ;外部メモリ-メインレジスタ→外部メモリ
  • SBW (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)-メインレジスタ→外部メモリ
ADBW
(Add BCD Word)
ADBW A ,B[ ,(JR)LABEL ]A ← A+B (BCD演算) Z,C,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値をBCD加算した結果を,Aに格納する。
BCDフォーマットは,$C5+1の上位4ビットを1000の位,下位4ビットを100の位,$C5の上位4ビットを10の位,下位4ビットを1の位とする10進数。
演算が16ビットペアレジスタにて行われる以外は、ほぼ8ビット演算と同じ。
第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • ADBW $4,$2 ;メインレジスタ同士
  • ADBW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ADBW $4,$SZ ;メインレジスタ+SIRによるインダイレクト指定
  • ADBW $4,$SZ,LABEL ;メインレジスタ+SIRによるインダイレクト指定(Jump拡張)
SBBW
(Subtract BCD Word)
SBBW A ,B[ ,(JR)LABEL ]A ← A-B (BCD演算) Z,C,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値から第2オペランドBの値をBCD減算した結果を,Aに格納する。
演算が16ビットペアレジスタにて行われる以外は、ほぼ8ビット演算と同じ。
第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • SBBW $4,$2 ;メインレジスタ同士
  • SBBW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • SBBW $4,$SZ ;メインレジスタ-SIRによるインダイレクト指定
  • SBBW $4,$SZ,LABEL ;メインレジスタ-SIRによるインダイレクト指定(Jump拡張)
ADCW
(Add Check Word)
ADCW A ,B[ ,(JR)LABEL ](A ← A+B) Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+11=14
(A,B)=($C5,$C5): 3+3+11=17
(JR: +3)
A=(IR±SIR): 3+6+6+6=21
A=(IR±$C5): 3+3+6+6+6=24
第1オペランドAの値と第2オペランドBの値を加算するが,結果をどこにも格納せず,フラグのみが変化する。
演算が16ビットペアレジスタにて行われる以外は、ほぼ8ビット演算と同じ。
メインレジスタ同士(SIRによるインダイレクト指定を含む)の演算の場合のみ,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • ADCW $4,$2 ;メインレジスタ同士
  • ADCW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ADCW $4,$SZ ;メインレジスタ+SIRによるインダイレクト指定
  • ADCW $4,$SZ,LABEL ;メインレジスタ+SIRによるインダイレクト指定(Jump拡張)
  • ADCW (IX+$4),$2 ;外部メモリ+メインレジスタ
  • ADCW (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)+メインレジスタ
SBCW
(Subtract Check Word)
SBCW A ,B[ ,(JR)LABEL ](A ← A-B) Z,C,LZ,UZが変化(A,B)=($C5,SIR): 3+11=14
(A,B)=($C5,$C5): 3+3+11=17
(JR: +3)
A=(IR±SIR): 3+6+6+6=21
A=(IR±$C5): 3+3+6+6+6=24
第1オペランドAの値から第2オペランドBの値を減算するが,結果をどこにも格納せず,フラグのみが変化する。
演算が16ビットペアレジスタにて行われる以外は、ほぼ8ビット演算と同じ。
メインレジスタ同士(SIRによるインダイレクト指定を含む)の演算の場合のみ,第3オペランドのラベルの記述によって,演算後,相対ジャンプする。(JRタグは省略可)
  • SBCW $4,$2 ;メインレジスタ同士
  • SBCW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • SBCW $4,$SZ ;メインレジスタ-SIRによるインダイレクト指定
  • SBCW $4,$SZ,LABEL ;メインレジスタ-SIRによるインダイレクト指定(Jump拡張)
  • SBCW (IX+$4),$2 ;外部メモリ-メインレジスタ
  • SBCW (IX-$SZ),$2 ;外部メモリ(SIRによるインダイレクト指定)-メインレジスタ
ANW
(And Word)
ANW A ,B[ ,(JR)LABEL ]A ← A and B Z,C=0,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理積(AND)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ANW $4,$2 ;メインレジスタ同士
  • ANW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ANW $4,$SZ ;メインレジスタ and SIRによるインダイレクト指定
  • ANW $4,$SZ,LABEL ;メインレジスタ and SIRによるインダイレクト指定(Jump拡張)
  • ANW $4,123 ;メインレジスタ and IM8
  • ANW $4,123,LABEL ;メインレタ and IM8(Jump拡張)
ANCW
(And Check Word)
ANCW A ,B[ ,(JR)LABEL ](A ← A and B) Z,C=0,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理積(AND)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ANC $4,$2 ;メインレジスタ同士
  • ANC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ANC $4,$SZ ;メインレジスタ and SIRによるインダイレクト指定
  • ANC $4,$SZ,LABEL ;メインレジスタ and SIRによるインダイレクト指定(Jump拡張)
NAW
(Nand Word)
NAW A ,B[ ,(JR)LABEL ]A ← A nand B Z,C=1,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値のNAND(ANDのビット反転)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • NAW $4,$2 ;メインレジスタ同士
  • NAW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • NAW $4,$SZ ;メインレジスタ nand SIRによるインダイレクト指定
  • NAW $4,$SZ,LABEL ;メインレジスタ nand SIRによるインダイレクト指定(Jump拡張)
NACW
(Nand Check Word)
NACW A ,B[ ,(JR)LABEL ](A ← A nand B) Z,C=1,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値のNAND(ANDのビット反転)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • NACW $4,$2 ;メインレジスタ同士
  • NACW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • NACW $4,$SZ ;メインレジスタ nand SIRによるインダイレクト指定
  • NACW $4,$SZ,LABEL ;メインレジスタ nand SIRによるインダイレクト指定(Jump拡張)
ORW
(Or Word)
ORW A ,B[ ,(JR)LABEL ]A ← A or B Z,C=1,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理和(OR)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ORW $4,$2 ;メインレジスタ同士
  • ORW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ORW $4,$SZ ;メインレジスタ or SIRによるインダイレクト指定
  • ORW $4,$SZ,LABEL ;メインレジスタ or SIRによるインダイレクト指定(Jump拡張)
ORCW
(Or Check Word)
ORCW A ,B[ ,(JR)LABEL ](A ← A or B) Z,C=1,LZ,UZが変化B=SIR: 3+11=14
B=$C5,IM8: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値の論理和(OR)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ORCW $4,$2 ;メインレジスタ同士
  • ORCW $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • ORCW $4,$SZ ;メインレジスタ or SIRによるインダイレクト指定
  • ORCW $4,$SZ,LABEL ;メインレジスタ or SIRによるインダイレクト指定(Jump拡張)
XR
(Exclusive Or Word)
XRW A ,B[ ,(JR)LABEL ]A ← A xor B Z,C=0,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値の排他的論理和(OR)の結果を,Aに格納する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • XR $4,$2 ;メインレジスタ同士
  • XR $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • XR $4,$SZ ;メインレジスタ xor SIRによるインダイレクト指定
  • XR $4,$SZ,LABEL ;メインレジスタ xor SIRによるインダイレクト指定(Jump拡張)
XRCW
(Exclusive Or Check Word)
XRCW A ,B[ ,(JR)LABEL ](A ← A xor B) Z,C=0,LZ,UZが変化B=SIR: 3+11=14
B=$C5: 3+3+11=17
(JR: +3)
第1オペランドAの値と第2オペランドBの値の排他的論理和(XOR)を行うが,結果をどこにも格納せず,フラグのみが変化する。
A=$C5。B=$C5,$SIR。
第3オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • XRC $4,$2 ;メインレジスタ同士
  • XRC $4,$2,LABEL ;メインレジスタ同士(Jump拡張)
  • XRC $4,$SZ ;メインレジスタ xor SIRによるインダイレクト指定
  • XRC $4,$SZ,LABEL ;メインレジスタ xor SIRによるインダイレクト指定(Jump拡張)
ローテートシフト命令(8ビット)
ニモニック書式機能フラグクロック数説明書式例
ROU
(Rotate Up)
ROU $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタとキャリーフラグ間で左ローテートを行う。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ROU $2 ;
  • ROU $2,LABEL ;Jump拡張
ROD
(Rotate Down)
ROD $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタとキャリーフラグ間で右ローテートを行う。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ROD $2 ;
  • ROD $2,LABEL ;Jump拡張
BIU
(Bit Up)
BIU $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタの内容を左へ1ビットアップし,最下位ビットに0が入り,桁上がりはキャリーに格納される。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BIU $2 ;
  • BIU $2,LABEL ;Jump拡張
BID
(Bit Down)
BID $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタの内容を右へ1ビットアダウンし,最上位ビットに0が入り,桁下がりはキャリーに格納される。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BID $2 ;
  • BID $2,LABEL ;Jump拡張
DIU
(Digit Up)
DIU $C5[ ,(JR)LABEL ]図参照 Z,C=0,LZ=0,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタの内容を左へ4ビットアップし,下位ビットに0が入る。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • DIU $2 ;
  • DIU $2,LABEL ;Jump拡張
DID
(Digit Down)
DID $C5[ ,(JR)LABEL ]図参照 Z,C=0,LZ,UZ=0が変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタの内容を右へ4ビットダウンし,上位ビットに0が入る。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • DID $2 ;
  • DID $2,LABEL ;Jump拡張
BYU
(Byte Up)
未公開命令
BYU $C5[ ,(JR)LABEL ]図参照 Z=0,C=0,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタに0が格納される。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BYU $2 ;
  • BYU $2,LABEL ;Jump拡張
BYD
(Byte Down)
未公開命令
BYD $C5[ ,(JR)LABEL ]図参照 Z=0,C=0,LZ,UZが変化3+6=9
(JR: +3)
第1オペランドの指定するメインレジスタに0が格納される。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BYD $2 ;
  • BYD $2,LABEL ;Jump拡張
ローテートシフト命令(16ビット)
ニモニック書式機能フラグクロック数説明書式例
ROUW
(Rotate Up Word)
ROUW $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5+1,$C5)とキャリーフラグ間で16ビットの左ローテートを行う。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ROUW $2 ;
  • ROUW $2,LABEL ;Jump拡張
RODW
(Rotate Down Word)
RODW $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5,$C5-1)とキャリーフラグ間で16ビットの右ローテートを行う。
レジスタペアが$C5,$C5-1となるので注意。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • RODW $2 ;
  • RODW $2,LABEL ;Jump拡張
BIUW
(Bit Up Word)
BIUW $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5+1,$C5)の内容を左へ1ビットアップし,最下位ビットに0が入り,桁上がりはキャリーに格納される。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BIUW $2 ;レジスタペアは($3,$2)で,$2は下位バイト。
  • BIUW $2,LABEL ;Jump拡張
BIDW
(Bit Down Word)
BIDW $C5[ ,(JR)LABEL ]図参照 Z,C,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5,$C5-1)の内容を右へ1ビットアダウンし,最上位ビットに0が入り,桁下がりはキャリーに格納される。
レジスタペアが$C5,$C5-1となるので注意。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BIDW $2 ;レジスタペアは($2,$1)で,$2は上位バイト。
  • BIDW $2,LABEL ;Jump拡張
DIUW
(Digit Up Word)
DIUW $C5[ ,(JR)LABEL ]図参照 Z,C=0,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5+1,$C5)の内容を左へ4ビットアップし,下位ビットに0が入る。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • DIUW $2 ;レジストペアは($3,$2)で,$2は下位バイト。
  • DIUW $2,LABEL ;Jump拡張
DIDW
(Digit Down Word)
DIDW $C5[ ,(JR)LABEL ]図参照 Z,C=0,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5,$C5-1)の内容を右へ4ビットダウンし,上位ビットに0が入る。
レジスタペアが$C5,$C5-1となるので注意。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • DIDW $2 ;レジスタペアは($2,$1)で,$2は上位バイト。
  • DIDW $2,LABEL ;Jump拡張
BYUW
(Byte Up Word)
BYUW $C5[ ,(JR)LABEL ]図参照 Z,C=0,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5+1,$C5)の内容を左へ8ビットアップし,下位バイトには全て0が入る。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BYUW $2 ;レジストペアは($3,$2)で,$2は下位バイト。
  • BYUW $2,LABEL ;Jump拡張
BYDW
(Byte Down Word)
BYDW $C5[ ,(JR)LABEL ]図参照 Z,C=0,LZ,UZが変化3+11=14
(JR: +3)
第1オペランドの指定するメインレジスタペア($C5,$C5-1)の内容を右へ8ビットダウンし,上位バイトには全て0が入る。
レジスタペアが$C5,$C5-1となるので注意。
第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • BYDW $2 ;レジスタペアは($2,$1)で,$2は上位バイト。
  • BYDW $2,LABEL ;Jump拡張
ジャンプ/コ-ル命令
ニモニック書式機能フラグクロック数説明書式例
JP
(Jump)
JP { IM16 | LABEL }PC ← IM16 変化なし3+3+6=12 第1オペランドの16ビットイミディエット値をプログラムカウンタ(PC)に取り込むことで,そのアドレスにジャンプする。
  • JP &H703F ;無条件ジャンプ
JP
(Jump flag)
JP Flag , { IM16 | LABEL }If Flag then
PC ← IM16
変化なし3+3+6=12 第1オペランドのフラグレジスタの条件が満たされたとき,第2オペランドの16ビットイミディエット値をプログラムカウンタ(PC)に取り込み,そのアドレスにジャンプする。
  • JP Z,&H703F ;Z=0(演算結果が0)ならジャンプ
  • JP NZ,&H703F ;Z=1(演算結果が0以外)ならジャンプ
  • JP C,LABEL ;C=1(キャリー発生)ならジャンプ
  • JP NC,LABEL ;C=0(キャリーがなかった)ならジャンプ
  • JP LZ,&H703F ;下位デジットフラグが0(下位4ビットが0)の時,ジャンプ
  • JP UZ,&H703F ;上位デジットフラグが0(上位4ビットが0)の時,ジャンプ
  • JP NLZ,LABEL ;下位デジットフラグが1の時,ジャンプ(フラグ名はLNZ記述も可)
JP
(Jump register)
未公開命令
JP $C5PC ← $C5 変化なし3+8=11 第1オペランドで指定されたメインレジスタペアの値をプログラムカウンタ(PC)に取り込み,そのアドレスにジャンプする。

この命令(オペコードDEH)は,従来,"JP ($C5)"と表記されてきたが,Piotr Piatek氏がメインレジスタによるインダイレクトなメモリアドレス指定($C5)による ジャンプ命令(オペコードDFH)を見つけたため,現在の"JP $C5"という表記に変更された。
  • JP $17 ;
EU形式
  • JPW $17 ;
JP
(indirect Jump register)
未公開命令
JP ( $C5 )PC ← ($C5) 変化なし3+8=11 第1オペランドのメインレジスタペア$C5でインダイレクト指定,すなわち($C5+1,$C5)をアドレスとする外部メモリに格納されている16ビットデータをプログラムカウンタ(PC)に取り込み,そのアドレスにジャンプする。
JP ($17)において,$17=00,$18=&H70,メモリアドレス&H7000=&H34,&H7001=&H20の場合,プログラムは&H2034にジャンプする。
  • JP ($17) ;
EU形式
  • JPW ($17) ;
JR
(Relative Jump)
JR { ±IM7 | LABEL }PC ← PC±IM7 変化なし3+6=9 オペランドの7ビットイミディエット値をプログラムカウンタ(PC)に加算または減算して,相対ジャンプする。
オペランドには,数値±IM7(0~127)またはラベルを指定する。
  • JR +32 ;+IM7
  • JR -32 ;-IM7
  • JR LABEL ;LABEL指定
JR
(Relative Jump flag)
JR Flag , { ±IM7 | LABEL }If Flag then
 PC ← PC±IM7
変化なし3+6=9 第1オペランドのフラグ条件が満たされたとき,第2オペランドの7ビットイミディエット値をプログラムカウンタ(PC)に加算または減算して,相対ジャンプする。
第2オペランドには,数値±IM7(0~127)またはラベルを指定する。
  • JR Z,LABEL ;Z=0(演算結果が0)ならジャンプ
  • JR NZ,LABEL ;Z=1(演算結果が0以外)ならジャンプ
  • JR C,LABEL ;C=1(キャリー発生)ならジャンプ
  • JR NC,LABEL ;C=0(キャリーがなかった)ならジャンプ
  • JR LZ,LABEL ;下位デジットフラグが0(下位4ビットが0)の時,ジャンプ
  • JR UZ,LABEL ;上位デジットフラグが0(上位4ビットが0)の時,ジャンプ
  • JR NLZ,LABEL ;下位デジットフラグが1の時,ジャンプ(フラグ名はLNZ記述も可)
  • JR Z,+32 ;Z=0(演算結果が0)なら+IM7形式で相対ジャンプ
CAL
(Call)
CAL { IM16 | LABEL }(SS-2) ← PC+3
SS ← SS-2
PC ← IM16
変化なし3+3+6+3+3=18 次の命令のアドレスをシステムスタック(SS)にプッシュ後,第1オペランドの16ビットイミディエット値をプログラムカウンタ(PC)に格納して,そのアドレスにサブルーチンコールする。
  • CAL &H703F ;無条件コール
CAL
(Call flag)
CAL Flag , { IM16 | LABEL }If Flag then
(SS-2) ← PC+3
SS ← SS-2
PC ← IM16
変化なしCALL実行: 3+3+6+3+3=18
CALL未実行: 3+3+6=12
第1オペランドのフラグ条件が満たされたとき,第2オペランドの指定するアドレスへのサブルーチンコールを行う。
  • CAL Z,&H703F ;Z=0(演算結果が0)ならコール
  • CAL NZ,&H703F ;Z=1(演算結果が0以外)ならコール
  • CAL C,&H703F ;C=1(キャリー発生)ならコール
  • CAL NC,&H703F ;C=0(キャリーがなかった)ならコール
  • CAL LZ,&H703F ;下位デジットフラグが0(下位4ビットが0)なら,コール
  • CAL UZ,&H703F ;上位デジットフラグが0(上位4ビットが0)なら,コール
  • CAL NLZ,&H703F ;下位デジットフラグが1なら,コール(フラグ名はLNZ記述も可)
RTN
(Return)
RTNPC ← (SS)
SS ← SS+2
変化なし6+3+5=14 システムスタック(SS)の16ビットイミディエット値をプログラムカウンタ(PC)に格納して,そのアドレスに戻る。
  • RTN ;無条件
RTN
(Return flag)
RTN FlagIf Flag then
PC ← (SS)
SS ← SS+2
変化なし戻らず: 6
RTN時: 6+3+5=14
オペランドのフラグ条件が満たされたとき,システムスタック(SS)の16ビットイミディエット値をプログラムカウンタ(PC)に格納して,そのアドレスに戻る。
  • RTN Z ;Z=0(演算結果が0)ならリターン
  • RTN NZ ;Z=1(演算結果が0以外)ならリターン
  • RTN C ;C=1(キャリー発生)ならリターン
  • RTN NC ;C=0(キャリーがなかった)ならリターン
  • RTN LZ ;下位デジットフラグが0(下位4ビットが0)なら,リターン
  • RTN UZ ;上位デジットフラグが0(上位4ビットが0)なら,リターン
  • RTN NLZ ;下位デジットフラグが1なら,リターン(フラグ名はLNZ記述も可)
ブロック転送/サーチ命令
ニモニック書式機能フラグクロック数説明書式例
BUP
(Block Up)
BUP説明参照 変化なし?不明 IXレジスタ= 転送元開始アドレス,IYレジスタ= 転送元終了アドレス にて指定されるメモリブロックを IZ= 転送先先頭アドレスとするエリアへ転送する。
転送はIXアドレス→IYアドレスまで昇順で行われるため,IX < IY設定にて利用する必要がある。
X86におけるCLD指定時のREP MOVSBと同等動作。
  • BUP ;
BDN
(Block Down)
BDN説明参照 変化なし?不明 IXレジスタ= 転送元開始アドレス,IYレジスタ= 転送元終了アドレス にて指定されるメモリブロックを IZ= 転送先先頭アドレスとするエリアへ転送する。
転送はIXアドレス→IYアドレスまで降順で行われるため,IX > IY設定にて利用する必要がある。
X86におけるSTD指定時のREP MOVSBと同等動作。
  • BDN ;
SUP
(Search Up)
SUP { $C5 | IM8 }説明参照 Z,C,LZ,UZ が変化?不明 IXレジスタ= 検索開始アドレス,IYレジスタ= 検索終了アドレス にて指定されるメモリブロック範囲内で 第1オペランドで指定されるメインレジスタ値または8ビットイミディエット値を検索する。
あった場合はZ=0(Z)とし、その場で実行を終了する。
該当データがない場合、Z=1(NZ)かつIX=IYにて実行終了する。
検索はIXアドレス→IYアドレスまで昇順で行われるため、IX < IY設定にて利用する必要がある。
X86におけるCLD指定時のREPNZ SCASBと同等動作。
  • SUP $2 ;メインレジスタ指定
  • SUP 123 ;8ビットイミディエット指定
SDN
(Search Down)
SDN { $C5 | IM8 }説明参照 Z,C,LZ,UZ が変化?不明 IXレジスタ= 検索開始アドレス,IYレジスタ= 検索終了アドレス にて指定されるメモリブロック範囲内で 第1オペランドで指定されるメインレジスタ値または8ビットイミディエット値を検索する。
あった場合はZ=0(Z)とし、その場で実行を終了する。
該当データがない場合、Z=1(NZ)かつIX=IYにて実行終了する。
検索はIXアドレス→IYアドレスまで降順で行われるため、IX > IY設定にて利用する必要がある。
X86におけるSTD指定時のREPNZ SCASBと同等動作。
  • SDN $2 ;メインレジスタ指定
  • SDN 123 ;8ビットイミディエット指定
BUPS
(Block Up & Search)
(未公開命令)
BUPS IM8説明参照 Z,C,LZ,UZ が変化?不明 IXレジスタ= 転送元開始アドレス,IYレジスタ= 転送元終了アドレス にて指定されるメモリブロックをIZ= 転送先先頭アドレスとするエリアへ転送する。
転送中,転送データを検索しオペランド1のIM8と同じデータを検出すると,そのデータを転送後,Z=0(Z)にて命令実行を終了する。
該当データがない場合、Z=1(NZ)かつIX=IYにて実行終了する。
検索はIXアドレス→IYアドレスまで昇順で行われるため、IX < IY設定にて利用する必要がある。
  • BUPS &H20 ;
EU形式
  • BUP &H20 ;
BDNS
(Block Down & Search)
(未公開命令)
BDNS IM8説明参照 Z,C,LZ,UZ が変化?不明 IXレジスタ= 転送元開始アドレス,IYレジスタ= 転送元終了アドレス にて指定されるメモリブロックをIZ= 転送先先頭アドレスとするエリアへ転送する。
転送中,転送データを検索しオペランド1のIM8と同じデータを検出すると,そのデータを転送後,Z=0(Z)にて命令実行を終了する。
該当データがない場合、Z=1(NZ)かつIX=IYにて実行終了する。
検索はIXアドレス→IYアドレスまで降順で行われるため、IX > IY設定にて利用する必要がある。
  • BDNS &H20 ;
EU形式
  • BDN &H20 ;
ブロック転送/サーチ命令
ニモニック書式機能フラグクロック数説明書式例
NOP
(No Operation)
NOPPC ← PC+1 変化なし6 プログラムカウンタ(PC)を+1するだけで,他は何もしない。
  • NOP
CLT
(Clear Timer)
CLTTM ← 0 変化なし6 タイマ(TMレジスタ)の全てのカウンタを0にする。
注意
60秒目(59→0に変化する時)の最後の1/65536秒間は,CLT命令によるリセット(0クリア)が正常に動作しない。 したがって,リセット動作を確実に行うためには,上記の期間を避けるよう遅延を入れて2回実行する必要がある。
[用例]
  CLT ;1回目の実行
  XRCM $0,$0,8 ;遅延処理
  CLT ;2回目の実行(1回目または2回目のCLTで確実にリセットできる)
  • CLT
FST
(Fast mode)
FST説明参照 変化なし6 システムクロックを分周せずに利用する。(高速動作モード)
システムは通常、高速モードで動作。
  • FST
SLW
(Slow mode)
SLW説明参照 変化なし6? システムクロックを1/16分周して利用する。(Low Powerモード)
SLW命令を実行したまま(低速状態)でシステムに戻ると暴走するので注意。
低速モード時でもLCDポートクロック周波数が変更されないため,LCDアクセス時にバスが混乱するため模様。 BASICでは,LCDアクセスが発生しない限り,低速モードを維持することが可能なようである。 PB-1000では,システム割り込み処理ルーチンが実行されると,自動的に高速モードへ再設定される。
  • SLW
OFF
(OFF)
OFF説明参照 APOビット ← SWビット
(APOビットは、電源ON時にクリア)
6? 内部ロジックのVDD系の電源をOFFにする。
本命令実行により、以下のレジスタの値が変化する。
  • PC = 0
  • IX,IY,IZ = 0
  • UA = 0
  • IA = 0 ただし、KO1ピン(BRKキー入力信号)はセレクト状態となる。
  • IE = ビット0,1,5,6,7 が0クリア。
割り込みは、以下の割り込みのみ有効となる。
  • 1分タイマーによる電源ON制御(IBレジスタのビット5の状態による)
  • 電源スイッチONイベントによる電源オン。
    または,SWがON状態でのBRKキーイベントによる電源オン。
  • OFF
TRP
(TRaP)
TRP説明参照 変化なし6? TRP命令(&HFF)をフェッチするとTRP命令の書き込まれた番地をSSスタックに保存して、固定番地(PB-1000の場合は&H6FFA)からの処理を実行する。
RTN命令により、TRP命令の次の番地から実行復帰する。
  • TRP
CANI
(CANcel Interrupt)
CANI説明参照 変化なし6? ハード割り込み要求ラッチのうち、最も優先順位の高いものをクリアする。
  • CANI
RTNI
(ReTurN from Interrupt)
RTNI説明参照 変化なし6+3+5=14? 割り込み処理からの復帰を行う。
システムスタック(SS)の内容をプログラムカウンタ(PC)へ格納し,そのアドレスへ復帰後, システムスタック(SS)へ2を加える。
本処理を実施すると,IBレジスタ(Bit4~Bit0)の対応する割り込みステータスフラグが0クリアされる。
  • RTNI
マルチバイト転送命令(2~8 bytes)未公開
本命令群は,オペランド3(PHUM, PHSM, PPUM, PPSMの場合はオペランド2)の指定で,対象とするレジスタペアを2~8 byteまで拡大させる。
この命令1個で,最大8byte(64 bit)までのデータを転送することが可能になっている。
オペランド3(PHUM, PHSM, PPUM, PPSMの場合はオペランド2)に指定できる数値は1~8までだが,2より小さい値(=1)をセットした場合,実行は2となる様なので. HD61では1を指定した場合、エラーを出力する仕様になっている。
また,第2にオペランドに特定インデックスレジスタSIRを用いる場合でも,命令コード・動作クロック共に削減効果がない。
ニモニック書式機能フラグクロック数説明書式例
LDM
(LoaD Multi-byte register)
LDM $C5,$C5,IM3[ ,(JR)LABEL ]opr1@$C5(IM3) ← opr2@$C5(IM3)変化なし 3+3+11+5*(IM3-2)=17+5*(IM3-2)
(JR: +3)
オペランド2の$C5を先頭とし,かつ,オペランド3で指定するIM3 byte数分の連続するメインレジスタブロック内容を, オペランド1の$C5より始まるメインレジスタブロックに転送する。
最終オペランドにラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可)
例えば,LDM $2,$6,3は,
  • $2 ← $6
  • $3 ← $7
  • $4 ← $8
と動作する。
  • LDM $0,$8,6 ; $8~$13の内容を$0~$5へ格納する。
  • LDM $0,$8,6,JR LABEL ; $8~$13の内容を$0~$5へ格納する。(jump拡張)
  • LDM $0,$SX,6 ; SIRによるインダイレクト指定
  • LDM $0,$SX,6,JR LABEL ; SIRによるインダイレクト指定(jump拡張)
KC形式
  • LDW $0,$8(6) ; $8~$13の内容を$0~$5へ格納する。
  • LDW $0,$8(6),JR LABEL ; $8~$13の内容を$0~$5へ格納する。(jump拡張)
  • LDW $0,$SX(6) ; SIRによるインダイレクト指定
  • LDW $0,$SX(6),JR LABEL; SIRによるインダイレクト指定(jump拡張)
EU形式
  • LDL $0,$8,L6 ; $8~$13の内容を$0~$5へ格納する。
  • LDL $0,$8,L6,J.LABEL ; $8~$13の内容を$0~$5へ格納する。(jump拡張)
  • LDL $0,#0,L6 ; SRによるインダイレクト指定
  • LDL $0,#0,L6,J.LABEL ; SRによるインダイレクト指定(jump拡張)
LDM
(LoaD Multi-byte memory)
LDM $C5,(IR±$C5),IM3[ ,(JR)LABEL ]$C5(IM3) ← (IR±$C5)(IM3)変化なし 3+3+6+3+5+3*(IM3-2)=20+3*(IM3-2)
(JR: +3)
オペランド2の(IR+$C5)を先頭アドレスとする,オペランド3で指定するIM3 byte数分の連続する外部メモリデータ内容をオペランド1の$C5より始まるレジスタブロックに転送する。
例えば,IX=&H7000, $0=1 で,LDM $2,(IX+$0),3は,以下の動作となる。
  • $2 ← (&H7001番地のメモリ内容)
  • $3 ← (&H7002番地のメモリ内容)
  • $4 ← (&H7003番地のメモリ内容)
  • IX ← &H7000(変化しない)
  • LDM $0,(IX±$C5),IM3
  • LDM $0,(IZ±$C5),IM3
  • LDM $0,(IX±$SIR),IM3 ; SIRによるインダイレクト指定
  • LDM $0,(IZ±$SIR),IM3 ; SIRによるインダイレクト指定
KC形式
  • LDW $0,(IX±$C5)(IM3)
  • LDW $0,(IZ±$C5)(IM3)
  • LDW $0,(IX±$SIR)(IM3) ; SIRによるインダイレクト指定
  • LDW $0,(IZ±$SIR)(IM3) ; SIRによるインダイレクト指定
EU形式
  • LDL $0,(IX±$C5),IM3
  • LDL $0,(IZ±$C5),IM3
  • LDL $0,(IX±#0),IM3 ; SR(#0-#2)によるインダイレクト指定
  • LDL $0,(IZ±#0),IM3 ; SR(#0-#2)によるインダイレクト指定
LDIM
(LoaD Increment Multi byte)
LDIM $C5,(IR±A),IM3$C5(IM3) ← (IR±A)(IM3)
IR ← IR ± A + IM3
変化なし 3+3+6+3+5+3*(IM3-2)=20+3*(IM3-2) (IR±A)を先頭アドレスとする外部メモリ(IM3バイト)の内容を$C5から始まるメインレジスタブロックに格納後,IRに±AとIM3に加算する。
Aは、$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
例えば,IX=&H7000, $0=1 で,LDIM $2,(IX+$0),3は,以下の動作となる。
  • $2 ← (&H7001番地のメモリ内容)
  • $3 ← (&H7002番地のメモリ内容)
  • $4 ← (&H7003番地のメモリ内容)
  • IX ← &H7004(最後にアクセスした番地+1が入る)
  • LDIM $4,(IX+$2),6
  • LDIM $4,(IX-$SX),6 ; SIRによるインダイレクト指定
KC形式
  • LDIW $4,(IX+$2)(6)
  • LDIW $4,(IX-$SX)(6) ; SIRによるインダイレクト指定
EU形式
  • LDIL $4,(IX+$2),L6
  • LDIL $4,(IX-#0),L6 ; SRによるインダイレクト指定
LDDM
(LoaD Decrement Multi byte)
LDDM $C5,(IR±A),IM3$C5(-IM3) ← (IR±A)(-IM3)
IR ← IR ± A - (IM3-1)
変化なし 3+3+6+3+3+3*(IM3-2)=18+3*(IM3-2) オペランド2の(IR±A)を先頭アドレスとする外部メモリ(IM3バイト)の内容をオペランド1のメインレジスタブロック$C5~$C5-(IM3-1)に格納後, IRには,IR±A-(IM3-1)を代入する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
LDDMは,LDM,LDIMと違って,転送方向が逆方向(デクリメント方向)なので注意。
例えば,IX=&H7000, $0=1 で,LDDM $3,(IX+$0),3は,以下の動作となる。
  • $3 ← (&H7001番地のメモリ内容)
  • $2 ← (&H7000番地のメモリ内容)
  • $1 ← (&H6FFF番地のメモリ内容)
  • IX ← &H6FFF(最後にアクセスした番地が入る)
  • LDDM $7,(IX+$2),6
  • LDDM $7,(IZ-$SX),6 ; SIRによるインダイレクト指定
KC形式
  • LDMW $7,(IX+$2)(6)
  • LDMW $7,(IZ-$SX)(6) ; SIRによるインダイレクト指定
EU形式
  • LDDL $4,(IX+$2),L6
  • LDDL $4,(IZ-#0),L6 ; SRによるインダイレクト指定
LDCM
(LoaD Check Multi byte:未公開命令)
LDCM $C5,A,IM3[ ,(JR)LABEL ]No Operation
(何もしない)
変化なし 3+3+11+5*(IM3-2)=17+5*(IM3-2)
(JR: +3)
LDM命令と同じ形式でオペランドを指定するが,実際には何も処理されず,命令デコーダ動作(実行後,プログラムカウンタを進める動作)のみ行う。
フラグもレジスタ内容も変化しない。(NOP命令のように遅延処理が可能)
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合、相対ジャンプする。(JRタグは省略可)
  • LDCM $4,$2,6 ; レジスタ指定
  • LDCM $4,$SX,6 ; SIRによるインダイレクト指定
  • LDCM $2,$3,6,LABEL ; レジスタ指定 + Jump拡張
  • LDCM $4,$SX,6,LABEL ; SIRによるインダイレクト指定 + Jump拡張
KC形式
  • LDCW $4,$2(6) ; レジスタ指定
  • LDCW $4,$SX(6) ; SIRによるインダイレクト指定
  • LDCW $2,$3(6),LABEL ; レジスタ指定 + Jump拡張
  • LDCW $4,$SX(6),LABEL; SIRによるインダイレクト指定 + Jump拡張
EU形式
  • LDCL $4,$2,L6 ; レジスタ指定
  • LDCL $4,#0,L6 ; SIRによるインダイレクト指定
  • LDCL $2,$3,L6,LABEL ; レジスタ指定 + Jump拡張
  • LDCL $4,#0,L6,LABEL ; SIRによるインダイレクト指定 + Jump拡張
STM
(STore Multi byte memory)
STM $C5,(IR±A),IM3$C5(IM3) → (IR±A)(IM3)変化なし 3+3+6+3+5+3*(IM3-2)=20+3*(IM3-2) オペランド1の$C5より始まるメインレジスタブロック(IM3バイト)の内容をオペランド2で指定するアドレスの外部メモリへ格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
例えば,IX=&H7000, $0=1 で,STM $2,(IX+$0),3は,以下の動作となる。
  • $2 → (&H7001番地のメモリ)
  • $3 → (&H7002番地のメモリ)
  • $4 → (&H7003番地のメモリ)
  • IX ← &H7000(変化しない)
  • STM $4,(IX+$2),6
  • STM $4,(IZ-$SY),6 ; SIRによるインダイレクト指定
KC形式
  • STW $4,(IX+$2)(6)
  • STW $4,(IZ-$SY)(6); SIRによるインダイレクト指定
EU形式
  • STL $4,(IX+$2),L6
  • STL $4,(IZ-#1),L6 ; SRによるインダイレクト指定
STIM
(STore Increment Multi byte)
STIM $C5,(IR±A),IM3$C5(IM3) → (IR±A)(IM3)
IR ← IR±A +IM3
変化なし 3+3+6+3+5+3*(IM3-2)=20+3*(IM3-2) オペランド1の$C5より始まるメインレジスタブロック(IM3バイト)の内容をオペランド2で指定するアドレスの外部メモリへ格納する。
データ転送後,IRにIR±A +IM3を代入する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
例えば,IX=&H7000, $0=1 で,STIM $2,(IX+$0),3は,以下の動作となる。
  • $2 → (&H7001番地のメモリ)
  • $3 → (&H7002番地のメモリ)
  • $4 → (&H7003番地のメモリ)
  • IX ← &H7004(最後にアクセスした番地+1となる)
  • STIM $4,(IX+$2),6
  • STIM $4,(IZ-$SY),6 ; SIRによるインダイレクト指定
KC形式
  • STIW $4,(IX+$2)(6)
  • STIW $4,(IZ-$SY)(6); SIRによるインダイレクト指定
EU形式
  • STIL $4,(IX+$2),L6
  • STIL $4,(IZ-#1),L6 ; SRによるインダイレクト指定
STDM
(STore Decrement Multi byte)
STDM $C5,(IR±A),IM3$C5(-IM3) → (IR±A)(-IM3)
IR ← IR±A -(IM3-1)
変化なし 3+3+6+3+3+3*(IM3-2)=18+3*(IM3-2) オペランド1の$C5より始まるメインレジスタブロック(IM3バイト)の内容を(IR±A)を先頭アドレスとする外部メモリに格納後,IRにIR±A-(IM3-1)を代入する。
STDMの転送方向は,STM, STIMの逆方向(デクリメント方向)なので,注意が必要。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
例えば,IX=&H7000, $0=1 で,STDM $2,(IX+$0),3は,以下の動作となる。
  • $2 → (&H7001番地のメモリ)
  • $3 → (&H7000番地のメモリ)
  • $4 → (&H6FFF番地のメモリ)
  • IX ← &H6FFF(最後にアクセスした番地となる)
  • STDM $4,(IX+$2),6
  • STDM $4,(IZ-$SY),6 ; SIRによるインダイレクト指定
KC形式
  • STMW $4,(IX+$2)(6)
  • STMW $4,(IZ-$SY)(6); SIRによるインダイレクト指定
EU形式
  • STDL $4,(IX+$2),L6
  • STDL $4,(IZ-#1),L6 ; SRによるインダイレクト指定
PPSM
(PoP by System stack pointer Multi byte)
PPSM $C5,IM3$C5(IM3) ← (SS)(IM3)
SS ← SS + IM3
変化なし 3+3+6+3+5+3*(IM3-2)=20+3*(IM3-2) SSが先頭アドレスで,IM3 byteの外部メモリアドレスブロックの内容をオペランド1のメインレジスタ・ブロックに格納し,SSにIM3を加える。
例えば,PPSM $2,6は,以下の動作となる。
  • (SS) → $2
  • (SS+1) → $3
  • (SS+2) → $4
  • (SS+3) → $5
  • (SS+4) → $6
  • (SS+5) → $7
  • SS ← SS + 6
  • PPSM $2,6
KC形式
  • PPSW $2(6)
EU形式
  • PPSL $2,L6
PPUM
(PoP by User stack pointer Multi byte)
PPUM $C5,IM3$C5(IM3) ← (US)(IM3)
US ← US + IM3
変化なし 3+3+6+3+5+3*(IM3-2)=20+3*(IM3-2) USが先頭アドレスで,IM3 byteの外部メモリアドレスブロックの内容をオペランド1のメインレジスタ・ブロックに格納し,USにIM3を加える。
例えば,PPUM $2,6は,以下の動作となる。
  • (US) → $2
  • (US+1) → $3
  • (US+2) → $4
  • (US+3) → $5
  • (US+4) → $6
  • (US+5) → $7
  • US ← US + 6
  • PPUM $2,6
KC形式
  • PPUW $2(6)
EU形式
  • PPUL $2,L6
PHSM
(PusH System stack pointer Multi byte)
PHSM $C5,IM3$C5(-IM3) → (SS-1)(-IM3)
SS ← SS - IM3
変化なし 3+3+6+3+3+3*(IM3-2)=18+3*(IM3-2) オペランド1のメインレジスタブロックの内容を,SS-1~SS-IM3がアドレスである外部メモリに退避させる(push)。
このとき,メインレジスタ,SSの転送方向は降順(decrement)方向である。
データ退避後,SSはIM3だけ減算する。
例えば,PHSM $7,6は,以下の動作となる。
  • $7 → (SS-1)
  • $6 → (SS-2)
  • $5 → (SS-3)
  • $4 → (SS-4)
  • $3 → (SS-5)
  • $2 → (SS-6)
  • SS ← SS - 6
  • PHSM $7,6
KC形式
  • PHSW $7(6)
EU形式
  • PHSL $2,L6
PHUM
(PusH User stack pointer Multi byte)
PHUM $C5,IM3$C5(-IM3) → (US-1)(-IM3)
US ← US - IM3
変化なし 3+3+6+3+3+3*(IM3-2)=18+3*(IM3-2) オペランド1のメインレジスタブロックの内容を,US-1~US-IM3がアドレスである外部メモリに退避させる(push)。
このとき,メインレジスタ,USの転送方向は降順(decrement)方向である。
データ退避後,USはIM3だけ減算する。
例えば,PHUM $7,6は,以下の動作となる。
  • $7 → (US-1)
  • $6 → (US-2)
  • $5 → (US-3)
  • $4 → (US-4)
  • $3 → (US-5)
  • $2 → (US-6)
  • US ← US - 6
  • PHUM $7,6
KC形式
  • PHUW $7(6)
EU形式
  • PHUL $2,L6
STLM
(STore Lcd data port Multi byte:未公開命令)
STLM $C5,IM3$C5(IM3) → LCD data port変化なし 3+3+22+8*(IM3-2)=28+3*(IM3-2) オペランド1の$C5~$C5+(IM3-1)をLCDデータエリアに出力する。
出力は8bitずつ順に行われる。
  • STLM $2,6
KC形式
  • STLW $2(6)
EU形式
  • OCBL $2,6
LDLM
(LoaD Lcd data port Multi byte :未公開命令)
LDLM $C5,IM3$C5(IM3) ← LCD data port変化なし 3+3+22+8*(IM3-2)=28+3*(IM3-2) あらかじめLCDCに設定した転送プロトコルに従って,LCDデータポートの値をオペランド1の$C5~$C5+(IM3-1)に代入する。
読み出しは 4bit単位で行われるため,画面上のグラフィックデータを読むと4ビット単位で上位下位が入れ替わる。
(データ転送プロトコルの設定によっては、読み込んだ値を直接LCDへ出力することも可能)
読み出し手順は、およそ以下の通り。
(1) LCDCへ描画モード(何でも良い),LCD座標位置を指定。(PPO &HDF後にSTLM)
(2) LCDCへ読み出しコマンド(&HE1)をセット。(PPO&hDF 後に STL &HE1)
(3) データRAM指定でLDLMを実行。(PPO &HDE後にLDLM)
  • LDLM $2,6
KC形式
  • LDLW $2(6)
EU形式
  • ICBL $2,6
PPOM
(Put lcd control POrt Multi byte:未公開命令)
PPOM $C5,IM3$C5(IM3) → LCD control Port変化なし 3+3+11+8*(IM3-2)=17+8*(IM3-2)? オペランド1のメインレジスタ$C5~$C5+(IM3-1)の内容をLCD制御ポートに出力する。
出力は8bitずつ順に行われる。
  • PPOM $2,6
KC形式
  • PPOW $2(6)
EU形式
  • PCBL $2,6
PSRM
(Put Specific index Register Multi byte :未公開命令)
PSRM SIR,$C5,IM3SIR ← $C5(IM3)変化なし 3+3+11=17 オペランド2のレジスタ$C5~$C5+(IM3-1)の内容をSIR特定インデックスレジスタに格納する。
データは上書きされて, 結果的に$(C5+(IM3-1))の内容がSIRに書き込まれるので,本質的に不必要な命令。
SIR= SX,SY,SZ
例えば,$2=0、$3=1、$4=2で,PSRM SX,$2,3 を実行した場合,SXには,$(2+3-1)=$4=2が代入される。
この命令を使用する際の注意事項は,PSR, PSRWを参照のこと。
  • PSRM SX,$2,IM3
KC形式
  • PSRW SX,$2(IM3)
EU形式
  • PRAL #0,$2,IM3
マルチバイト算術演算命令(2~8 bytes)未公開
本命令群は,オペランド3(INVM, CMPMはオペランド2)の指定で,対象とするレジスタペアを2~8 byteまで拡大させる。
この命令1個で,最大8byte(64 bit)までの算術演算が可能になっている。
厳密に言えば,INVM, CMPMはシフト命令群に分類されるが,算術命令とした方が理解し易いのでこちらで説明する。
オペランド3(INVM, CMPMの場合はオペランド2)に指定できる数値は1~8までだが,2より小さい値(=1)をセットした場合,実行は2となるので. HD61では1を指定した場合、エラーを出力する仕様になっている。
また,第2にオペランドに特定インデックスレジスタSIRを用いる場合でも,命令コード・動作クロック共に削減効果がない。
フラグ動作は以下のようになると思われますが,これで正確かどうかは不明です。
 Z:演算の結果,全てbitが0の場合,0。
 C:最上位bit(MSB)からのキャリーまたはボローがあったとき 1。
 LZ:最下位8bitのうち下位4bitが0のとき 0。
 UZ:最上位8bitのうち上位4bitが0のとき 0。
ニモニック書式機能フラグクロック数説明書式例
INVM
(INVert Multi byte)
INVM $C5,IM3[ ,(JR)LABEL ]$C5(IM3) ← NOT($C5(IM3))Z,C=1,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1で指定されたメインレジスタブロック(IM3バイト)の内容をビット反転(1の補数)をとる。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • INVM $2,6
  • INVM $2,6,LABEL ; Jump拡張
KC形式
  • INVW $2(6)
  • INVW $2(6),JR LABEL ; Jump拡張
EU形式
  • INVL $2,L6
  • INVL $2,L6,LABEL ; Jump拡張
CMPM
(CoMPlement Multi byte)
CMPM $C5,IM3[ ,(JR)LABEL ]$C5(IM3) ← NOT($C5(IM3))+1Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1で指定されたメインレジスタブロック(IM3バイト)の内容をビット反転+1(2の補数)をとる。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • CMPM $2,6
  • CMPM $2,6,LABEL ; Jump拡張
KC形式
  • CMPW $2(6)
  • CMPW $2(6),JR LABEL ; Jump拡張
EU形式
  • CMPL $2,L6
  • CMPL $2,L6,LABEL ; Jump拡張
ADBM
(ADd Bcd Multi byte)
ADBM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3)+A(IM3) (BCD演算)Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1のIM3 byte長の$C5レジスタブロックとオペランド2で指定されるIM3 byte長のAレジスタブロックとをBCD加算し,その結果をAブロックに格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ADBM $8,$0,6 ; メインレジスタ同士
  • ADBM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • ADBW $8,$0(6) ; メインレジスタ同士
  • ADBW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • ADBL $8,$0,L6 ; メインレジスタ同士
  • ADBL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
ADBM
(ADd Bcd immediate Multi byte)
ADBM $C5,IM5,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3)+IM5 (BCD演算)Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5より始まるメインレジスタブロック(IM3バイト)の内容とオペランド2の5ビット値をBCD加算し,結果を$C5ブロックに格納する。
オペランド2は0~31までのBCD値を指定できる。
オペランド2で指定するBCDイミディエイト値IM5の算出法は,Bit4*&H10 + HextoBCD(Bit3~Bit0)である。
例えば,IM5 = &H1A である場合,加算される数 = 1*&H10 + &H10(←10を16進BCD表現)=&H20 となり, メインレジスタ$C5(IM3)に、&H20がBCD加算されることになる。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ADBM $4,&H1F,6 ; メインレジスタ + IM5(例の場合, 1*&H10+HextoBCD(&HF)=&H25を加算)
  • ADBM $4,15,6,LABEL ; Jump拡張
KC形式
  • ADBW $4,&H1F(6) ; メインレジスタ + IM5
  • ADBW $4,15(6),JR LABEL ; Jump拡張
EU形式
  • ADBL $4,&H1F,L6 ; メインレジスタ + IM5
  • ADBL $4,15,L6,J.LABEL ; Jump拡張
ADBCM
(ADd Bcd Check Multi byte)
ADBCM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3)+A(IM3) (BCD演算)Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1のIM3 byte長の$C5レジスタブロックとオペランド2で指定されるIM3 byte長のAレジスタブロックとをBCD加算するが,その結果をどこにも格納しない。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ADBCM $8,$0,6 ; メインレジスタ同士
  • ADBCM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • ADBCW $8,$0(6) ; メインレジスタ同士
  • ADBCW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • ADBCL $8,$0,L6 ; メインレジスタ同士
  • ADBCL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
SBBM
(SuB Bcd Multi byte)
SBBM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3)-A(IM3) (BCD演算)Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1のIM3 byte長の$C5レジスタブロックからオペランド2で指定されるIM3 byte長のAレジスタブロックをBCD減算し,その結果をAブロックに格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • SBBM $8,$0,6 ; メインレジスタ同士
  • SBBM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • SBBW $8,$0(6) ; メインレジスタ同士
  • SBBW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • SBBL $8,$0,L6 ; メインレジスタ同士
  • SBBL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
SBBM
(SuB Bcd immediate Multi byte)
SBBM $C5,IM5,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3)-IM5 (BCD演算)Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5より始まるメインレジスタブロック(IM3バイト)の内容からオペランド2の5ビット値をBCD加算し,結果を$C5ブロックに格納する。
オペランド2は0~31までのBCD値を指定できる。
オペランド2で指定するBCDイミディエイト値IM5の算出法は,Bit4*&H10 + HextoBCD(Bit3~Bit0)である。
例えば,IM5 = &H1A である場合,加算される数 = 1*&H10 + &H10(←10を16進BCD表現)=&H20 となり, メインレジスタ$C5(IM3)に、&H20がBCD加算されることになる。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • SBBM $4,&H1F,6 ; メインレジスタ + IM5(例の場合, 1*&H10+HextoBCD(&HF)=&H25を減算)
  • SBBM $4,15,6,LABEL ; Jump拡張
KC形式
  • SBBW $4,&H1F(6) ; メインレジスタ + IM5
  • SBBW $4,15(6),JR LABEL ; Jump拡張
EU形式
  • SBBL $4,&H1F,L6 ; メインレジスタ + IM5
  • SBBL $4,15,L6,J.LABEL ; Jump拡張
SBBCM
(SuB Bcd Check Multi byte)
SBBCM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3)-A(IM3) (BCD演算)Z,C,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1のIM3 byte長の$C5レジスタブロックからオペランド2で指定されるIM3 byte長のAレジスタブロックをBCD減算するが,その結果をどこにも格納しない。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • SBBCM $8,$0,6 ; メインレジスタ同士
  • SBBCM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • SBBCW $8,$0(6) ; メインレジスタ同士
  • SBBCW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • SBBCL $8,$0,L6 ; メインレジスタ同士
  • SBBCL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
ANM
(ANd Multi byte)
ANM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3) and A(IM3)Z,C=0,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容の論理積(AND)を取り,その結果を$C5ブロックに格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ANM $8,$0,6 ; メインレジスタ同士
  • ANM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • ANW $8,$0(6) ; メインレジスタ同士
  • ANW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • ANL $8,$0,L6 ; メインレジスタ同士
  • ANL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
ANCM
(ANd Check Multi byte)
ANCM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) and A(IM3)Z,C=0,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容の論理積(AND)を行うが,その結果をどこにも格納しない。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
ただし,フラグは変化する。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ANCM $8,$0,6 ; メインレジスタ同士
  • ANCM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • ANCW $8,$0(6) ; メインレジスタ同士
  • ANCW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • ANCL $8,$0,L6 ; メインレジスタ同士
  • ANCL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
NAM
(NAnd Multi byte)
NAM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3) nand A(IM3)Z,C=1,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容のNANDを行い,その結果を$C5ブロックに格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • NAM $8,$0,6 ; メインレジスタ同士
  • NAM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • NAW $8,$0(6) ; メインレジスタ同士
  • NAW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • NAL $8,$0,L6 ; メインレジスタ同士
  • NAL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
NACM
(NAnd Check Multi byte)
NACM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) nand A(IM3)Z,C=1,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容のNANDを行うが,その結果をどこにも格納しない。
ただし,フラグは変化する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • NACM $8,$0,6 ; メインレジスタ同士
  • NACM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • NACW $8,$0(6) ; メインレジスタ同士
  • NACW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • NACL $8,$0,L6 ; メインレジスタ同士
  • NACL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
ORM
(OR Multi byte)
ORM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3) or A(IM3)Z,C=1,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容の論理和(OR)を行い,その結果を$C5ブロックに格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ORM $8,$0,6 ; メインレジスタ同士
  • ORM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • ORW $8,$0(6) ; メインレジスタ同士
  • ORW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • ORL $8,$0,L6 ; メインレジスタ同士
  • ORL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
ORCM
(OR Check Multi byte)
ORCM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) or A(IM3)Z,C=1,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容の論理和(OR)を行うが,その結果をどこにも格納しない。
ただし,フラグは変化する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • ORCM $8,$0,6 ; メインレジスタ同士
  • ORCM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • ORCW $8,$0(6) ; メインレジスタ同士
  • ORCW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • ORCL $8,$0,L6 ; メインレジスタ同士
  • ORCL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
XRM
(eXclusive oR Multi byte)
XRM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) ← $C5(IM3) xor A(IM3)Z,C=0,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容の排他的論理和(XOR)を行い,その結果を$C5ブロックに格納する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • XRM $8,$0,6 ; メインレジスタ同士
  • XRM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • XRW $8,$0(6) ; メインレジスタ同士
  • XRW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • XRL $8,$0,L6 ; メインレジスタ同士
  • XRL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
XRCM
(eXclusive oR Check Multi byte)
XRCM $C5,A,IM3[ ,(JR)LABEL ]$C5(IM3) xor A(IM3)Z,C=0,LZ,UZ が変化 3+3+11+5*(IM-2)=17+5*(IM3-2)

(JR: +3)
オペランド1の$C5ブロックの内容とオペランド2のAブロック(A,B共にIM3バイト)の内容の排他的論理和(XOR)を行うが,その結果をどこにも格納しない。
ただし,フラグは変化する。
Aは,$C5(SIRによるインダイレクト指定を含む)のみ指定可能。
最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可)
  • XRCM $8,$0,6 ; メインレジスタ同士
  • XRCM $8,$SZ,6,LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
KC形式
  • XRCW $8,$0(6) ; メインレジスタ同士
  • XRCW $8,$SZ(6),LABEL ; メインレジスタ + SIRによるインダイレクト指定(Jump拡張あり)
EU形式
  • XRCL $8,$0,L6 ; メインレジスタ同士
  • XRCL $8,#2,L6,J.LABEL ; メインレジスタ + SRによるインダイレクト指定(Jump拡張あり)
マルチバイトシフト命令(2~8 bytes)未公開
本命令群は,オペランド2の指定で,対象とするレジスタペアを2~8 byteまで拡大させる。
この命令1個で,最大8byte(64 bit)までのシフト命令が可能になり,DIUM, DIDM, BYUM, BYDMのみが用意されている。
ビットシフト系(BIUM, BIDM)とローテート系(ROUM, RODM)は用意されず, それらが割り当てられるべきだったインストラクションコードにBUPBDNが割り当てられている。
ニモニック書式機能フラグクロック数説明書式例
DIUM
(Digit Up Multi byte)
DIUM $C5,IM3図参照Z,C=0,LZ=0,UZが変化 3+3+11+5*(IM-2)=17+5*(IM3-2) オペランド1で指定されたメインレジスタ番号を先頭とする$C5~$(C5+(IM3-1))のレジスタブロックの内容を左へ4bitアップし,最下位4bitに0が入る。
  • DIUM $2,6 ;レジスタブロックは$2~$7(6byte 昇順)となる。
KC形式
  • DIUW $2(6)
EU形式
  • DIUL $2,L6
DIDM
(Digit Down Multi byte)
DIDM $C5,IM3図参照Z,C=0,LZ,UZ=0が変化 3+3+11+5*(IM-2)=17+5*(IM3-2) オペランド1で指定されたメインレジスタ番号を先頭とする$C5~$(C5-(IM3-1))のレジスタブロックの内容を右へ4bitダウンし、最上位4bitには0が入る。
  • DIDM $7,6 ;レジスタブロックは$7~$2(6byte 降順)となる。
KC形式
  • DIDW $7(6)
EU形式
  • DIDL $7,L6
BYUM
(BYte Multi byte)
BYUM $C5,IM3図参照Z,C=0,LZ=0,UZが変化 3+3+11+5*(IM-2)=17+5*(IM3-2) オペランド1で指定されたメインレジスタ番号を先頭とする$C5~$(C5+(IM3-1))のレジスタブロックの内容を左へ8bitアップし,最下位byteには全て0が入る。
  • BYUM $2,6 ;レジスタブロックは$2~$7(6byte 昇順)となる。
KC形式
  • BYUW $2(6)
EU形式
  • BYUL $2,L6
BYDM
(BYte Multi byte)
BYDM $C5,IM3図参照Z,C=0,LZ,UZ=0が変化 3+3+11+5*(IM-2)=17+5*(IM3-2) オペランド1で指定されたメインレジスタ番号を先頭とする$C5~$(C5-(IM3-1))のレジスタブロックの内容を右へ8bitダウンし,最上位byteには0が入る。
  • BYDM $7,6 ;レジスタブロックは$7~$2(6byte 降順)となる。
KC形式
  • BYDW $7(6)
EU形式
  • BYDL $7,L6






5. インストラクション・セット・テーブル








6. 巻末資料

6-1. 出力フォーマットおよびローダー(BAS形式,PBF形式,QL形式)

 HD61クロスアセンブラが,デフォルト(オプションなし), /p, /qでそれぞれ出力するBAS形式,PBF形式,QL形式とそのローダーについて 解説する。
 説明は,理解しやすいように表6-1.のリストを各形式で出力したファイルで行うものとする。

表6-1. サンプルリスト
HD61700 ASSEMBLER Rev 0.41 - ASSEMBLY LIST OF [quick-loader.s]
00001:0000 ;
00002:0000 ; quick-loader.s
00003:0000 ; relocatble quick loader for FX-870P/VX-4
00004:0000 ;
00005:0000 
00006:0000 CGRAM: EQU &H153C ;address of DEFCHR$()
00007:0000 LEDTP: EQU &H123C ;address of LCD dot matrix
00008:0000 
00009:153C ORG CGRAM
00010:153C START CGRAM
00011:153C 
00012:153C D6403C12 PRE IZ,LEDTP
00013:1540 D6003C15 PRE IX,CGRAM
00014:1544 D6205315 PRE IY,CGRAM+23
00015:1548 D8 BUP ;BlockUP
00016:1549 566054 PST UA,&H54
00017:154C F7 RTN
00018:154D ;end of program
00019:154D


6-1-1. BAS形式
 表6-1 のリストのBAS形式ファイルを表6-2 に示す。表6-1と表6-2から容易に理解出るように,BAS形式は以下の通り。


表6-2. 表6-1のBAS形式ファイル
999 DATA QUICK-LOADER.EXE,&H153C,&H154C,&H153C
1000 DATA D6403C12D6003C15,8B
1001 DATA D6205315D8566054,40
1002 DATA F7,F7

 このようにDATA文のデータとして用意した機械語を,POKE文で書き込むという方法はポケコンでは一般的であり, 特にBLOADのような機械語を外部装置から読み込む方法がない場合にはこの方法が機械語をメモリーに配置させる方法の基本となる。 DATA文で格納すると1バイトのコードが16進表示でも2バイト必要となり,ポケコンのメモリーの使用効率という点では良くないが, ローダー等のプログラムの工夫でユーザビリティが一般的に良い。
 HD61クロスアセンブラには,Trans.b というローダーが添付されているので,そのリストを表6-3 に示す。

表6-3. Trans.b(BAS形式用ローダー; PB-1000/C, AI-1000用)
5 '*** ASC2BIN for PB-1000/C,AI-1000 ***
10 CLEAR:READ F$,ST,ED,EX:A=ST:ED=ED+1:L=1000
20 READ A$,S$:S=0
30 FOR I=1 TO LEN(A$) STEP2
40 D=VAL("&H"+MID$(A$,I,2)):POKE A,D
50 S=S+D:A=A+1:NEXT
60 IF RIGHT$(HEX$(S),2)<>S$ THEN BEEP:PRINT"SUM ERROR:LINE=";L:END
70 IF A<ED THEN L=L+1:GOTO 20
80 IF EX<>0 THEN BSAVE F$,ST,ED-ST,EX ELSE BSAVE F$,ST,ED-ST
90 BEEP1:PRINT"FILE CREATED":END

なお,Trans.bはPB-1000/C, AI-1000用であり,行番号80でBSAVEを使ってバイナリ・ファイルとしてセーブしているが,FX-870P/VX-4/VX-3にはBSAVE命令はない。 したがって,FX-870P/VX-4/VX-3でTrans.bを使うには,行番号80をコメントにするか・削除する必要がある。
 行番号60で各DATA文のデータが正しいデータかをチェックサム用データを用いて,チェックしている。これは,インターネットやパソコン通信が一般的でなく, 雑誌に掲載されたプログラムを自分で手入力しなければならなかった時代に,打ち間違いがプログラム実行中に発見しやすくなるのに役立っていた。 したがって,ネットワークが発達し他人の機械語コードを自ら入力する必要のなくなった現代では,チェックサムは基本的には無用のものである。

6-1-2. PBF形式
 表6-1 のリストのPBF形式ファイルを表6-4 に示す。表6-1と表6-4からは理解できない部分もあるが,PBF形式は以下の通り。

表6-4. 表6-1のPBF形式ファイル
QUICK-LOADER.EXE,5436,5452,5436
D6403C12D6003C15D6205315D8566054F7,1730

 PBF形式は,Jun Amano氏の『CASIO PB-1000 FOREVER』というホームページでソフトの配布用に用いられている機械語プログラムをテキストファイル化した形式である。 このファイルは,パーソナルコンピューターからRS-232C経由でポケコンに転送され,機械語コードとしてメモリー・ロード,さらにはポケコン側でファイル化される。 その際,ポケコン側にはPBFファイル用の受信プログラムが必要になる。
 HD61クロスアセンブラには,TransVX.b というFX-870P / VX-4 / VX-3用のローダーが添付されているので,そのリストを表6-5 に示す。

表6-5. TransVX.b(PBF形式用ローダー; FX-870P / VX-4 / VX-3用)
5 ' PbfToBinVX.BAS (c)JUN AMANO / BLUE
10 CLS:CLEAR:OPEN"COM0:" FORINPUT AS#1
20 INPUT#1,F$,ST,ED,EX:AD=ST:BEEP
30 PRINT "Converting:";F$:PRINT"Start:";HEX$(ST);"H End:";HEX$(ED);"H"
40 INPUT#1,A$,S:SUM=0
50 FOR I=1 TO LEN(A$) STEP2
60 A=VAL("&H"+MID$(A$,I,2))
70 POKE AD,A:SUM=SUM+A:AD=AD+1:NEXT
80 IF S<>SUM THEN PRINT"SUM ERROR":BEEP:CLOSE:END
90 IF ED>AD THEN GOTO 40
100 CLOSE:PRINT"Completed!":BEEP1
110 IF EX<>0 THEN PRINT"Execute MODE110(";EX;")";

なお,TransVX.bの通信パラメータにはF.COMの設定値が使われる。 設定を変更する場合,行番号10のファイルディスクリプター "COM0:"部を修正すること。 また,HD61添付のTransVX.b(FX-870P / VX-4 / VX-3用)は移植性の観点から,BASICだけで書かれているが, マシン語にて高速化されたバージョンが Jun Amano氏のHP『CASIO PB-1000 Forever!』で公開されている。 URLは,http://homepage3.nifty.com/lsigame/pb-1000/softlib/pbsoft1.htm
また,機械語データが120バイト単位で区切られているのは,A$にデータを読み込む際,最大255文字というBASICの制限のためであろう。

6-1-3. QL形式
 表6-1 のリストのQL形式ファイルを表6-6 に示す。表6-1と表6-6から理解できるように,QL形式は以下の通り。

表6-6. 表6-1のQL形式ファイル
1000 DATA 5436,5452,5436
1001 DATA D6403C12D600,3C15D6205315,D8566054F700,000000000000

 QL形式は,BAS形式で機械語をメモリーにロードするより約10倍高速である,クイックローダーで使うためのデータ形式である。
クイックローダーは,HD61の作者であるあお氏によって考案された。
HD61クロスアセンブラでは,QL形式について詳しい説明はなく,ローダーも添付されていないが,『CASIO PB-1000 FOREVER!』, 『HD61700 SPIRITS』でダウンロードできるプログラムにおいてクイックローダーが使われているので,そのリストを表6-7 に示す。

表6-7. クイックローダー例(QL形式用ローダー; FX-870P / VX-4 用)
5 ' Expanded CLEAR 0.04 for VX-4/FX-870P 2003 BLUE
10 GOSUB900:BEEP1:PRINT"MODE110(&H";HEX$(EX);")";:END
900 'Machine Code Loader(FX-870P/VX-4)
910 RESTORE1000:READ ST,ED,EX:C=INT((ED-ST)/24)
920 DEFCHR$(252)="D6403C12D600":DEFCHR$(253)="3C15D6205315"
930 DEFCHR$(254)="D8566054F700":MODE110(&H153C)
940 FOR I=0 TO C:READ A$,B$,C$,D$
950 DEFCHR$(252)=A$:DEFCHR$(253)=B$:DEFCHR$(254)=C$:DEFCHR$(255)=D$
960 POKE&H123E,(ST MOD 256):POKE&H123F,INT(ST/256)
970 IF (ED-ST)<24 THEN POKE&H1246,&H3C+(ED-ST)
980 MODE110(&H123C):ST=ST+24:NEXT:CLS:RETURN

表6-5 は,『CASIO PB-1000 FOREVER!』でダウンロードできるFX-870P / VX-4で機械語領域をメモリーに確保するための拡張CLEAR のローダー部分である。
クイックローダーは, という方法によって高速化が実現されている。
BAS形式の場合,表6-3の行番号 60のように,"D=VAL("&H"+MID$(A$,I,2))"で取り出した1バイト・データを"POKE AD,D"でメモリーに書き込むという作業は, 文字列からのバイト・データの文字列を抽出して数値化,POKE文で数値変数AD,DのBCD浮動小数点データを整数型に変換し直してからメモリーに書き込む作業を BASICシステム内部で行っており,プログラムで見た以上に複雑な作業を行っていて,非効率である。
 一方,表6-5のクイックローダーは,システムエリアをメモリ転送の中継点に使うものの,行番号 920, 930, 950のDEFCHR$文で6バイト×4=24バイトを最適化されたROMルーチンで転送した後, 転送先アドレスを行番号の960 で書き換えを行いながら,機械語の転送ルーチンで目的のアドレスに行うため,無駄な文字列操作,数値変換が最小限に抑えられて, 高速化が実現されている。
 実際,BAS形式でも"D=VAL("&H"+MID$(A$,I,2))"を行わず,DEFCHR$でシステムエリアのCGRAMに一旦格納してから,PEEK, POKEで転送する手法を用いるだけでも, 約35%高速化できることを確認している。
 また,表6-1のリストは,機械語の転送ルーチンのソース相当品であり,表6-6と表6-7の行番号 920,930を比較すれば,一致していることを確認できる。 その動作は, という動作を行う。この動作によって,自分自身のコードをシステムエリアのLEDTPに転送を行う。表6-1を見れば分かるように,絶対ジャンプ命令を使っていないので, この機械語転送ルーチンはリロケータルブルであり,転送先でも実行可能である。したがって,IZの転送先アドレスを行番号 960のようにPOKE文で書きかえることによって, CGRAMから任意のアドレスへ高速転送させるルーチンが実現されている。
 表6-7 のクイックローダーはコンパクトであるものの,初めて読む人間には難解であり,プログラムの改造も容易でない。 そこで,可読性・操作性・移植性を高めたクイックローダーを表6-8に示す。

表6-8. クイックローダー例(QL形式用ローダー; FX-870P / VX-4 用)
90 'quick-loader rewritten for readability, usability and portability
100 CLS:GOSUB 850:MODE110(EX):END
110 '
840 'Quick Loader(FX-870P/VX-4)
845 'LDAD+2,3:destination addr; LDAD+6,7:source start addr; LDAD+10,11:source end addr
850 CGRAM=&H153C:LDAD=&H1A3C:'addr of DEFCHR$() and Mac-loader(in SAVE/LOAD buffer)
855 DEFCHR$(252)="D6403C1AD600":DEFCHR$(253)="3C15D6205315":DEFCHR$(254)="D8566054F700"
860 MODE110(CGRAM):'relocatable mac-loader is transfered to LDAD by itself
865 IOBF=&H1895:IOBF=PEEK(IOBF)+PEEK(IOBF+1)*256
870 RESTORE 1000:READ ST,ED,EX:C=INT((ED-ST)/24)
875 IF ED>=IOBF THEN BEEP:PRINT"Cannot alloc memory!":PRINT"Make mac area at least";ED-ST+1;"bytes":END
880 GOSUB 980
885 P=0
890 FOR I=0 TO 23
895   IF PEEK(ST+I)=PEEK(CGRAM+I) THEN P=P+1
900 NEXT
905 IF P<>24 THEN 915 ELSE BEEP 1:PRINT"Mac codes already loaded.":PRINT"Hit any key."
910 A$=INKEY$:IF A$="" THEN 910 ELSE RETURN
915 CLS
920 ST0=ST
925 FOR I=0 TO C
930   POKE LDAD+2,(ST MOD 256):POKE LDAD+3,INT(ST/256):'change destination
935   IF (ED-ST)<23 THEN POKE LDAD+10,&H3C+(ED-ST):ST=ED-23:'change transfer size
940   MODE110(LDAD):ST=ST+24:'execute data transfer by 24 bytes, basically
945   LOCATE 0,2:PRINT"BLOAD:";ST-ST0;"bytes";
950   IF I<C THEN GOSUB 980:'data preparation for mac-loader
955 NEXT
960 PRINT" -- completed."
965 RETURN
970 '
975 '*DATPRE:'data preparation
980 READ A$,B$,C$,D$
985 DEFCHR$(252)=A$:DEFCHR$(253)=B$:DEFCHR$(254)=C$:DEFCHR$(255)=D$
990 RETURN
995 '

 行番号 850で,DEFCHR$の先頭アドレス CGRAM と機械語転送ルーチンの転送先(実行)アドレス LDAD を定義している。 行番号 845で,機械語転送ルーチンの転送先アドレス,転送元開始アドレス,転送元終了アドレスの場所を示しているので,行番号 930, 935のように POKE文で転送先アドレス等を変更すればよい。






6. 参考文献・リンク






7. 図

ROU の動作図
ROD の動作図
BIU の動作図
BID の動作図
DIU の動作図
DID の動作図
BYU の動作図
BYD の動作図
ROUW の動作図
RODW の動作図
BIUW の動作図
BIDW の動作図
DIUW の動作図
DIDW の動作図
BYUW の動作図
BYDW の動作図
DIUM の動作図
DIDM の動作図
BYUM の動作図
BYDM の動作図






9. 改版情報

Ed.1 :  2011/6/12
HD61添付のマニュアルのHTML化が完成。オリジナルの記載ミス等を修正したが,自分で記入ミスしている可能性あり。
今後,記載ミス修正,情報追加を行う予定。






123