| 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) | |
HD61700 クロスアセンブラHD61 は,あお氏によって開発された。
PB-1000内蔵のアセンブラとほぼ同一(上位互換)だが,相違点は以下の通り。
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 |
| > |
省略可能であるが,アセンブル時に以下のオプションが指定できます。
| オプション | 機能 |
|---|---|
| /p | PBF形式で出力する。(デフォルトはBASIC DATA文形式で出力) |
| /q | QL(クイックローダ)形式で出力する。 |
| /n | セカンドオペレーション指定による最適化をOFFにする(デフォルトはON) |
| /w | 16bitアドレッシング対応のアセンブルを行う。(最適化は LEVEL 0 固定) 内蔵ROM用の16Bitアドレスに対応したアセンブルコードを出力します。 |
| /tab | リストファイルをTAB=8で出力する。 |
| /r | リロケート情報ファイル(*.roc)を出力する。 FBF/VX-MENUにて利用するリロケート形式ファイル作成用の情報ファイルを出力する。 RR形式や*.o/*.o2形式ファイルを作成する際に利用する。 |
| /o [filename] | PBF/BAS形式ファイルヘッダに出力するファイル名を指定する。デフォルトは未指定(自動生成)。>/TD> |
| (/set) [シンボルラベル名]=[値/ラベル名] | 任意のシンボルラベルを定義する。/setは省略可。 |
| /eu | EU形式(Europe形式)のニモニックをアセンブルする様設定します。 ソース内で疑似命令#EUを指定しても同等動作となる。 |
| オプション設定 | ニモニック | 出力コード | 備考 |
|---|---|---|---|
| /n オプション無し(デフォルト) | LD $2,$30 | 02 42 | セカンドオペレーション指定ON時 =2バイト命令 を出力 |
| /n オプション付き | LD $2,$30 | 02 62 30 | セカンドオペレーション指定OFF時 =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(実行アドレス)で機械語ルーチンがコールされる。 |
| (1) | HD61にて /pオプション付きでアセンブル。pbfファイルを作成。 |
| (2) | BAS形式と同様な方法で,ポケコン上でマシン語エリアを確保。 |
| (3) | HD61に添付のTransVX.basをポケコン上で実行。実行すると,RS232C受信状態で待機する。 |
| (4) | (1)で作製したPBFファイルをRS232C経由でポケコンへ転送する。 |
| (5) | 自動的にバイナリ変換され,メモリーに機械語コードが配置される。処理完了後,"Completed!"と表示する。 |
| (6) | MODE110(実行アドレス)で機械語ルーチンがコールされる。 |
| (1) | HD61にて /pオプション付きでアセンブル。pbfファイルを作成。 |
| (2) | ポケコン上でマシン語実行領域を確保。 |
| (3) | JUN AMANO氏のPbfTOBin.basを実行しファイル名を"COM0:7"とする。(9600bps時) |
| (4) | (1)で作製したPBFファイルをRS232C経由でポケコンへ転送する。 |
| (5) | 実行完了すると自動的にEXE(またはBIN)ファイルが生成される。 |
| (1) | HD61にて /qオプション付きでアセンブル。qlファイルを作成。QL形式のフォーマットについては巻末資料参照。 |
| (2) | 出力されたqlファイルに巻末の『QL形式』記載のクイックローダーに張り付ける。 適宜,コードを追加・修正する。 |
| (3) | 作成したプログラム・ファイルをF.COMでポケコンにロードする。 |
| (4) | システム未使用領域にロードするなら何もする必要がないが,そうでなければ,FX-870P,VX-4の場合, 拡張CLEAR等でマシン語エリアを確保する。 |
| (5) | ロードしたプログラムを実行すると,メモリに機械語コードが配置される。 |
| (6) | MODE110(実行アドレス)で機械語ルーチンがコールされる。 |
アセンブル中に表示するエラーメッセージは以下の通りです。
| エラーメッセージ | エラー内容 |
|---|---|
| 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.概要
2-1. 特徴
| MSB | LSB | ||||||
| Z | C | LZ | UZ | SW | APO | * | * |
| Bit7 | ----- | /INT1 端子からの割り込み許可(1で許可) |
| Bit6 | ----- | KEY、パルス 割り込み許可(1で許可) |
| Bit5 | ----- | /INT2 端子からの割り込み許可(1で許可) |
| Bit4 | ----- | 1分タイマーの割り込み許可(1で許可) |
| Bit3 | ----- | /ON 端子からの割り込み許可(1で許可) |
| Bit2 | ----- | Power Onスイッチからの割り込み許可(1で許可) |
| Bit1 | ----- | /INT1 端子の割り込みエッジ指定(0:立ち下がり、1立ち上がり) |
| Bit0 | ----- | /INT2 端子の割り込みレベル指定(0:Lowレベル、1:Highレベル) |
| Bit7 ------- | KEY割り込み(1)、パルス割り込み(0) |
| Bit6 ------- | パルス割り込み時の信号(0:256Hz、1:32Hz) |
| Bit5~Bit4 - | KEY入力時のPIN指定(0:指定PINなし、1:ONE PIN指定、2:TWO PIN指定、3:ALL PIN指定) |
| Bit3~Bit0 - | KEY出力の指定(0~12:ONE KEYの出力、13:ALL KEYの出力、14,15:未定義) |
| Bit7, 6 ---- | IZレジスタ上位アドレス指定(0~3) |
| Bit5, 4 ---- | IXレジスタ/メインレジスタ上位アドレス指定(0~3) |
| Bit3, 2 ---- | SSP,USP上位アドレス指定(0~3) |
| Bit1, 0 ---- | PC上位アドレス指定(0~3)※ |
| Bit7 ----- | VDD2 |
| Bit6 ----- | φ1,φ2のCLOCK ON(1)、OFF(0) |
| Bit5 ----- | なし(未定義) |
| Bit4 ----- | CE4 | Bit3 ----- | CE3 |
| Bit2 ----- | CE2 |
| Bit1 ----- | CE1 |
| Bit0 ----- | OP |
| Bit7 ----- | Port7(1:出力,0:入力) |
| Bit6 ----- | Port6(1:出力,0:入力) |
| Bit5 ----- | Port5(1:出力,0:入力) |
| Bit4 ----- | Port4(1:出力,0:入力) |
| Bit3 ----- | Port3(1:出力,0:入力) |
| Bit2 ----- | Port2(1:出力,0:入力) |
| Bit1 ----- | Port1(1:出力,0:入力) |
| Bit0 ----- | Port0(1:出力,0:入力) |
| Bit7 ----- | Port7データ |
| Bit6 ----- | Port6データ |
| Bit5 ----- | Port5データ |
| Bit4 ----- | Port4データ |
| Bit3 ----- | Port3データ |
| Bit2 ----- | Port2データ |
| Bit1 ----- | Port1データ |
| Bit0 ----- | Port0データ |
| Bit7、6 ---- | 4分間のカウント値(0~3) |
| Bit0~5 ---- | 60秒間のカウント値(0~59。60秒で0に戻る。1分タイマー割り込みは、60秒目(59→0に変化する時)をトリガとして動作する) |
| Bit7、6 -- | UAによるバンク切り替え先頭アドレス(上位2ビット)を指定。
|
| Bit5 ----- | 1分タイマーによる電源ON制御 1:許可(ON) / 0:禁止(OFF) 本ビットをONすることにより、電源OFF中に1分タイマーによる電源ON機能を許可する。 本機能を利用することで電源OFF中でも時刻の更新を行える。 |
| Bit4 ----- | IRQ1 割り込み状態フラグ (readのみ 1:割り込み発生中、0:RTNI) |
| Bit3 ----- | パルス/キー割り込み状態フラグ (readのみ 1:割り込み発生中、0:RTNI) |
| Bit2 ----- | IRQ2 割り込み状態フラグ (readのみ 1:割り込み発生中、0:RTNI) |
| Bit1 ----- | 1分タイマー割り込み状態フラグ (readのみ 1:割り込み発生中、0:RTNI) |
| Bit0 ----- | /ON 端子からの割り込み状態フラグ(readのみ 1:割り込み発生中、0:RTNI) |
| 56 40 80 | PST | IB,&H80 | ;Bit5をOFF(1分タイマーによる電源ONを禁止), ;バンク範囲を&H8000~&hFFFFに固定。 |
| <タイマー制御系のワークエリアを設定> | |||
| 57 20 10 | PST | IE,&H10 | ;1分タイマー割込みを許可 |
| 56 40 A0 | PST | IB,&HA0 | ;Bit5をON(1分タイマー許可による電源ONを許可), ;バンク範囲を&H8000~&hFFFFに固定。 |
| Bit15 ------- | キーボードポートPin入力 (KI04) |
| Bit14 ------- | キーボードポートPin入力 (KI03) |
| Bit13 ------- | キーボードポートPin入力 (KI02) |
| Bit12 ------- | キーボードポートPin入力 (KI01) |
| Bit11 ------- | IRQ1入力レベル (未公開) |
| Bit10 ------- | IRQ2入力レベル (未公開) |
| Bit9 ------- | /ON 端子からの割り込み入力レベル (未公開) |
| Bit8 ------- | 用途不明 |
| Bit7 ------- | キーボードポートPin入力 (KI12) |
| Bit6 ------- | キーボードポートPin入力 (KI11) |
| Bit5 ------- | キーボードポートPin入力 (KI10) |
| Bit4 ------- | キーボードポートPin入力 (KI09) |
| Bit3 ------- | キーボードポートPin入力 (KI08) |
| Bit2 ------- | キーボードポートPin入力 (KI07) |
| Bit1 ------- | キーボードポートPin入力 (KI06) |
| Bit0 ------- | キーボードポートPin入力 (KI05) |
| 優先順位 | 演算の種類 | 演算子 |
|---|---|---|
↑ ↓ 低 | 単項演算子 | .H(または.U)上位8ビット指定、.L(または.D)下位8ビット指定、.N ビット反転 |
| 評価の反転 | ! | |
| 括弧内演算 | () | |
| 四則演算 | * 乗算, / 除算, % 剰余(MOD) | |
| 四則演算 | + 加算, - 減算 | |
| 論理演算 | & AND(#でも良い), | OR, ^ XOR | |
| 関係(比較)演算 | = 等号(等しい), > < >= <= 大小比較, <> 不等号 | |
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'を指定することで、ワーニングは表示されなくなる。 |
・$30, $31, $0による最適化の利用
CASIOポケコン(HD61700)システムでは、$31=0、$30=1が常に設定されており、原則的にはこれらの設定を変更しない。
これらの設定を利用すると、様々なメリットが得られる。
例えば$2をゼロクリアする場合、通常では以下のようにする。
| LD | $2, 0 |
| または、 | |
| XR | $2, $2 |
| LD | $2, $31 | ;0(=$31)を代入 |
| 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)と同等動作 |
この節で、各ニモニック形式の簡単な説明を行う。
詳細に興味がある場合、HD61700.Sをアセンブルして出力されたlstファイルを参考のこと。
KC形式ニモニック
未公開命令の書式例に、「KC形式」と表記されたものがある。
KC形式は、こたちゃん氏の「KC-Disasemmbler」(参考文献(3))において発表されたニモニック形式である。
「AI-アセンブラ形式」(参考文献(4))同様、ほぼ全ての未公開命令に対応している。
「AI-アセンブラ」形式と「KC形式」違いは、以下の通り。
| 命令 | AI-アセンブラ形式 | KC形式 | 備考 |
|---|---|---|---|
| デクリメント系命令 | LDD* | LDM* | |
| STD* | STM* | ||
| マルチバイト系命令 | **M | **W | AI-アセンブラ形式では、マルチバイト数を", IM3 "と記述するのに対して, KC形式では"(IM3)"と括弧でくくって記述する。 |
| 項番 | 相違点 | AI/KC形式 | EU形式 | コメント |
|---|---|---|---|---|
| (1) | 特定インデックスレジスタ:SIR (Specific Index Register) |
SX, $SX SY, $SY SZ, $SZ | #0 #1 #2 |
EU形式では,ショートレジスタ:SR(Short Registers)と呼ばれている。 |
| (2) | レジスタ名称 | IB | CS | AI形式で, IBと表記する未公開レジスタは,EU形式でCSと表記される。 |
| (3) | 未公開命令のニモニック | PSR | PRA | PRA (Put Ram Address) |
| GSR | GRA | GRA (Get Ram Address) | ||
| STL | OCB | OCB (Output Casio Bus) | ||
| LDL | ICB | ICB (Input Casio Bus) | ||
| PPO | PCB | PCB (Put Casio Bus) | ||
| BUPS IM8 | BUP IM8 | |||
| BDNS IM8 | BDN IM8 | |||
| JP $C5 | JPW $C5 | |||
| JP ($C5) | JPW ($C5) | |||
| (4) | マルチバイト命令 | *M | *L | EU形式では,マルチバイト命令のニモニックの末尾に"L"(long wordの意味?)が付加される。 |
| (5) | マルチバイト数 | 2~8 | L2~L8 | EU形式では,AI形式と同じ表記も可能。 |
| (6) | JUMP拡張タグ表現 | JR | J. | AI/KC/EU形式で,このタグは省略可能。EU形式では,"JR"も使用可能。 |
この章でHD61700のニモニックを説明する。ニモニックで使用するオペランドの記号およびニモニックを以下に示す。
| オペランド | 記号 | コメント |
|---|---|---|
| メインレジスタ | $C5 :$0, $1, ・・・, $31 | $&H0, $&H1, ・・・, $&H1F の16進数表現も可能。 |
| 特定インデックスレジスタ SIR | SX | 5-bit |
| SY | ||
| SZ | ||
| 特定インデックスレジスタによるメインレジスタのインダイレクト指定 | $SX | $(SX) | SXが示すメインレジスタ(デフォルト: $31) |
| $SY | $(SY) | SYが示すメインレジスタ(デフォルト: $30) | |
| $SZ | $(SZ) | SZが示すメインレジスタ(デフォルト: $0) | |
| インデックスレジスタ IR | IX | 16-bit IYレジスタは,ブロック転送/サーチ命令用の終点ポインタとしてのみ利用可能。 |
| IY | ||
| IZ | ||
| スタックポインタ | SSP | System stack pointer (16-bit) |
| USP | User stack pointer (16-bit) | |
| プログラムカウンタ | PC | Program counter (16-bit) |
| フラグ | Z | Zero flag |
| NZ | Non-zero flag | |
| C | Carry flag | |
| NC | Non-carry flag | |
| LZ | Lower-digit zero flag | |
| UZ | Upper-digit zero flag | |
| NLZ | LNZ | Non lower-digit zero flag | |
| ステータスレジスタ | KY | KEY入力レジスタ (16-bit) |
| IE | 割込み許可レジスタ (8-bit) | |
| IA | 割込み選択レジスタ (8-bit) | |
| IB | 割り込み制御及びバンク制御レジスタ (8-bit); 未公開 | |
| UA | 上位アドレス指定レジスタ(8-bit) | |
| PD | ポートデータレジスタ(8ビット) | |
| PE | ポート状態指定レジスタ(8ビット) | |
| TM | タイマーレジスタ(8ビット) | |
| 数値データ | IM3 : 2,3,・・・,8 | 3ビット直値。マルチバイト数指定に利用。 |
| IM5 : 0~31,または,&H0~&H1F | 5ビット直値。ADBM, SBBMで使用。 | |
| IM8 : 0~255,または,&H00~&HFF | 8ビット直値。 | |
| IM16 : 0~65535,または,&H0000~&HFFFF | 16ビット直値。 | |
| 転送命令(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@$C5 | 3+3+6=12 (JR: +3) |
メインレジスタ間の転送 |
| ||||||||||||||
| 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 $C5,({IX | IZ}±$C5) | opr1@$C5 ← opr2@({IX|IZ}±$C5) | 3+3+6+5=17 | 外部メモリからメインレジスタへの転送(2) インデックスレジスタ±メインレジスタ(8ビット)による指定。 jump拡張なし。 |
| ||||||||||||||
| LD $C5,({IX | IZ}±IM8) | opr1@$C5 ← opr2@({IX|IZ}±IM8) | 3+3+6+5=17 | 外部メモリからメインレジスタへの転送(3) インデックスレジスタ±8ビットイミディエット値による指定。 jump拡張なし。 |
| ||||||||||||||
| LD $C5,IM8[ ,(JR)LABEL ] | opr1@$C5 ← opr2@IM8 | 3+3+6=12 (JR: +3) |
8ビットイミディエットデータをメインレジスタへ転送 |
| ||||||||||||||
| LD $C5,$SIR[ ,(JR)LABEL ] | opr1@$C5 ← opr2@$SIR | 3+6=9 (JR: +3) |
特定インデックスレジスタSIRによるメインレジスタのインダイレクト転送(未公開命令) 通常のレジスタ指定と比較して,命令コードが1バイト短くなる。(LEVEL 0指定時) その分,実行クロックも短くなり,ROM内で多用されている。 EU形式では,SX=#0,SY=#1,SZ=#2と表記され,JRタグは省略可能で"J."と記述可能。 |
| ||||||||||||||
| 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が適用可能。 |
| ||||||||||||
| 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が適用可能。 |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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 (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 (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 (Store IM8 to Register) 未公開命令 |
ST IM8,$C5 | IM8 → $C5 | 変化しない | 3+3+11=17 | 第1オペランドの8ビットイミディエット値を第2オペランドの指定するメインレジスタに格納する。 転送方向がLD命令とは反対なのに注意必要。 LD $C5,IM8と同じ動作だが,Jump拡張はない。 |
| ||||||||||||
| 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が適用可能。 |
| ||||||||||||
| 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が適用可能。 |
| ||||||||||||
| PPS (Pop by System stack pointer) |
PPS $C5 | $C5 ← (SS) SS ← SS+1 |
変化しない | 3+6+5=14 | SSの指定する外部メモリの内容をメインレジスタ$C5に格納後,SSをインクリメント。 |
| ||||||||||||
| PPU (Pop by User stack pointer) |
PPU $C5 | $C5 ← (US) US ← US+1 |
変化しない | 3+6+5=14 | USの指定する外部メモリの内容をメインレジスタ$C5に格納後,USをインクリメント。 |
| ||||||||||||
| PHS (Push by System stack pointer) |
PHS $C5 | $C5 → (SS-1) SS ← SS-1 |
変化しない | 3+6+3=12 | メインレジスタ$C5の値をSS-1の指定する外部メモリに格納後,SSをディクリメント。 |
| ||||||||||||
| PHU (Push by User stack pointer) |
PHU $C5 | $C5 → (US-1) US ← US-1 |
変化しない | 3+6+3=12 | メインレジスタ$C5の値をUS-1の指定する外部メモリに格納後,USをディクリメント。 |
| ||||||||||||
| GFL (Get Flag) |
GFL $C5[ ,(JR)LABEL ] | $C5 ← F | 変化しない | 3+6=9 (JR: +3) |
フラグレジスタの内容を第1オペランドの指定するメインレジスタ$C5に格納する。 第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| GPO (Get Port) |
GPO $C5[ ,(JR)LABEL ] | $C5 ← Port | 変化しない | 3+6=9 (JR: +3) |
ポート端子の内容を第1オペランドの指定するメインレジスタ$C5に格納する。 第2オペランドのラベルがある場合,転送後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| 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と同じで少数派。 |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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固定で最適化されてしまい、コードが混乱するため。) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 転送命令(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@$C5 | 3+3+11=17 (JR: +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 $C5,({IX | IZ}±$C5) | opr1@$C5 ← opr2@({IX|IZ}±$C5) | 3+3+6+3+5=20 | 外部メモリからメインレジスタへの転送(2) インデックスレジスタ±メインレジスタ(8ビット)による指定。 jump拡張なし。 |
| ||||||||||||||
| LDW $C5,IM16 | $C5 ← IM16 | 3+3+3+14=23 | 8ビットイミディエットデータをメインレジスタへ転送 |
| ||||||||||||||
| LDW $C5,$SIR[ ,(JR)LABEL ] | $C5 ← $SIR | 3+11=14 (JR: +3) |
特定インデックスレジスタSIRによるメインレジスタのインダイレクト転送(未公開命令) 通常のレジスタ指定と比較して,命令コードが1バイト短くなる。(LEVEL 0指定時) その分,実行クロックも短くなり,ROM内で多用されている。 EU形式では,SX=#0,SY=#1,SZ=#2と表記され,JRタグは省略可能で"J."と記述可能。 |
| ||||||||||||||
| 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 |
| ||||||||||||
| 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(最後にアクセスした番地) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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 (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 (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)も指定可能だが,利用価値低い。) |
| ||||||||||||
| 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が適用可能。 |
| ||||||||||||
| 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(最後にアクセスした番地が入る) |
| ||||||||||||
| 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を加える。 |
| ||||||||||||
| 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を加える。 |
| ||||||||||||
| 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を引く。 |
| ||||||||||||
| 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を引く。 |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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です) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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固定で最適化されてしまい、コードが混乱するため。) |
| ||||||||||||
| 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が格納される。 |
| ||||||||||||
| 算術演算命令(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タグは省略可) |
| ||||||||||||
| CMP (Complement) |
CMP $C5[ ,(JR)LABEL ] | $C5 ← 2^8-$C5 | Z,C,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタの内容をビット反転後に1を加える(2の補数)。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 算術演算命令(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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| ローテートシフト命令(8ビット) | ||||||||||||||||||
| ニモニック | 書式 | 機能 | フラグ | クロック数 | 説明 | 書式例 | ||||||||||||
| ROU (Rotate Up) |
ROU $C5[ ,(JR)LABEL ] | 図参照 | Z,C,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタとキャリーフラグ間で左ローテートを行う。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| ROD (Rotate Down) |
ROD $C5[ ,(JR)LABEL ] | 図参照 | Z,C,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタとキャリーフラグ間で右ローテートを行う。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| BIU (Bit Up) |
BIU $C5[ ,(JR)LABEL ] | 図参照 | Z,C,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタの内容を左へ1ビットアップし,最下位ビットに0が入り,桁上がりはキャリーに格納される。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| BID (Bit Down) |
BID $C5[ ,(JR)LABEL ] | 図参照 | Z,C,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタの内容を右へ1ビットアダウンし,最上位ビットに0が入り,桁下がりはキャリーに格納される。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| DIU (Digit Up) |
DIU $C5[ ,(JR)LABEL ] | 図参照 | Z,C=0,LZ=0,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタの内容を左へ4ビットアップし,下位ビットに0が入る。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| DID (Digit Down) |
DID $C5[ ,(JR)LABEL ] | 図参照 | Z,C=0,LZ,UZ=0が変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタの内容を右へ4ビットダウンし,上位ビットに0が入る。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| BYU (Byte Up) 未公開命令 |
BYU $C5[ ,(JR)LABEL ] | 図参照 | Z=0,C=0,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタに0が格納される。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| BYD (Byte Down) 未公開命令 |
BYD $C5[ ,(JR)LABEL ] | 図参照 | Z=0,C=0,LZ,UZが変化 | 3+6=9 (JR: +3) |
第1オペランドの指定するメインレジスタに0が格納される。 第2オペランドのラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| ローテートシフト命令(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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| ジャンプ/コ-ル命令 | ||||||||||||||||||
| ニモニック | 書式 | 機能 | フラグ | クロック数 | 説明 | 書式例 | ||||||||||||
| JP (Jump) |
JP { IM16 | LABEL } | PC ← IM16 | 変化なし | 3+3+6=12 | 第1オペランドの16ビットイミディエット値をプログラムカウンタ(PC)に取り込むことで,そのアドレスにジャンプする。 |
| ||||||||||||
| JP (Jump flag) |
JP Flag , { IM16 | LABEL } | If Flag then PC ← IM16 |
変化なし | 3+3+6=12 | 第1オペランドのフラグレジスタの条件が満たされたとき,第2オペランドの16ビットイミディエット値をプログラムカウンタ(PC)に取り込み,そのアドレスにジャンプする。 |
| ||||||||||||
| JP (Jump register) 未公開命令 |
JP $C5 | PC ← $C5 | 変化なし | 3+8=11 | 第1オペランドで指定されたメインレジスタペアの値をプログラムカウンタ(PC)に取り込み,そのアドレスにジャンプする。 注 この命令(オペコードDEH)は,従来,"JP ($C5)"と表記されてきたが,Piotr Piatek氏がメインレジスタによるインダイレクトなメモリアドレス指定($C5)による ジャンプ命令(オペコードDFH)を見つけたため,現在の"JP $C5"という表記に変更された。 |
| ||||||||||||
| 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にジャンプする。 |
| ||||||||||||
| JR (Relative Jump) |
JR { ±IM7 | LABEL } | PC ← PC±IM7 | 変化なし | 3+6=9 | オペランドの7ビットイミディエット値をプログラムカウンタ(PC)に加算または減算して,相対ジャンプする。 オペランドには,数値±IM7(0~127)またはラベルを指定する。 |
| ||||||||||||
| 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)またはラベルを指定する。 |
| ||||||||||||
| 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 (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オペランドの指定するアドレスへのサブルーチンコールを行う。 |
| ||||||||||||
| RTN (Return) |
RTN | PC ← (SS) SS ← SS+2 |
変化なし | 6+3+5=14 | システムスタック(SS)の16ビットイミディエット値をプログラムカウンタ(PC)に格納して,そのアドレスに戻る。 |
| ||||||||||||
| RTN (Return flag) |
RTN Flag | If Flag then PC ← (SS) SS ← SS+2 |
変化なし | 戻らず: 6 RTN時: 6+3+5=14 |
オペランドのフラグ条件が満たされたとき,システムスタック(SS)の16ビットイミディエット値をプログラムカウンタ(PC)に格納して,そのアドレスに戻る。 |
| ||||||||||||
| ブロック転送/サーチ命令 | ||||||||||||||||||
| ニモニック | 書式 | 機能 | フラグ | クロック数 | 説明 | 書式例 | ||||||||||||
| BUP (Block Up) |
BUP | 説明参照 | 変化なし | ?不明 | IXレジスタ= 転送元開始アドレス,IYレジスタ= 転送元終了アドレス にて指定されるメモリブロックを
IZ= 転送先先頭アドレスとするエリアへ転送する。 転送はIXアドレス→IYアドレスまで昇順で行われるため,IX < IY設定にて利用する必要がある。 X86におけるCLD指定時のREP MOVSBと同等動作。 |
| ||||||||||||
| BDN (Block Down) |
BDN | 説明参照 | 変化なし | ?不明 | IXレジスタ= 転送元開始アドレス,IYレジスタ= 転送元終了アドレス にて指定されるメモリブロックを
IZ= 転送先先頭アドレスとするエリアへ転送する。 転送はIXアドレス→IYアドレスまで降順で行われるため,IX > IY設定にて利用する必要がある。 X86におけるSTD指定時のREP MOVSBと同等動作。 |
| ||||||||||||
| 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と同等動作。 |
| ||||||||||||
| 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と同等動作。 |
| ||||||||||||
| 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設定にて利用する必要がある。 |
| ||||||||||||
| 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設定にて利用する必要がある。 |
| ||||||||||||
| ブロック転送/サーチ命令 | ||||||||||||||||||
| ニモニック | 書式 | 機能 | フラグ | クロック数 | 説明 | 書式例 | ||||||||||||
| NOP (No Operation) |
NOP | PC ← PC+1 | 変化なし | 6 | プログラムカウンタ(PC)を+1するだけで,他は何もしない。 |
| ||||||||||||
| CLT (Clear Timer) |
CLT | TM ← 0 | 変化なし | 6 | タイマ(TMレジスタ)の全てのカウンタを0にする。 注意 60秒目(59→0に変化する時)の最後の1/65536秒間は,CLT命令によるリセット(0クリア)が正常に動作しない。 したがって,リセット動作を確実に行うためには,上記の期間を避けるよう遅延を入れて2回実行する必要がある。 [用例] CLT ;1回目の実行 XRCM $0,$0,8 ;遅延処理 CLT ;2回目の実行(1回目または2回目のCLTで確実にリセットできる) |
| ||||||||||||
| FST (Fast mode) |
FST | 説明参照 | 変化なし | 6 | システムクロックを分周せずに利用する。(高速動作モード) システムは通常、高速モードで動作。 |
| ||||||||||||
| SLW (Slow mode) |
SLW | 説明参照 | 変化なし | 6? | システムクロックを1/16分周して利用する。(Low Powerモード) SLW命令を実行したまま(低速状態)でシステムに戻ると暴走するので注意。 低速モード時でもLCDポートクロック周波数が変更されないため,LCDアクセス時にバスが混乱するため模様。 BASICでは,LCDアクセスが発生しない限り,低速モードを維持することが可能なようである。 PB-1000では,システム割り込み処理ルーチンが実行されると,自動的に高速モードへ再設定される。 |
| ||||||||||||
| OFF (OFF) |
OFF | 説明参照 | APOビット ← SWビット (APOビットは、電源ON時にクリア) | 6? | 内部ロジックのVDD系の電源をOFFにする。 本命令実行により、以下のレジスタの値が変化する。
|
| ||||||||||||
| TRP (TRaP) |
TRP | 説明参照 | 変化なし | 6? | TRP命令(&HFF)をフェッチするとTRP命令の書き込まれた番地をSSスタックに保存して、固定番地(PB-1000の場合は&H6FFA)からの処理を実行する。 RTN命令により、TRP命令の次の番地から実行復帰する。 |
| ||||||||||||
| CANI (CANcel Interrupt) |
CANI | 説明参照 | 変化なし | 6? | ハード割り込み要求ラッチのうち、最も優先順位の高いものをクリアする。 |
| ||||||||||||
| RTNI (ReTurN from Interrupt) |
RTNI | 説明参照 | 変化なし | 6+3+5=14? | 割り込み処理からの復帰を行う。 システムスタック(SS)の内容をプログラムカウンタ(PC)へ格納し,そのアドレスへ復帰後, システムスタック(SS)へ2を加える。 本処理を実施すると,IBレジスタ(Bit4~Bit0)の対応する割り込みステータスフラグが0クリアされる。 |
| ||||||||||||
| マルチバイト転送命令(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は,
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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は,以下の動作となる。
|
| ||||||||||||
| 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ずつ順に行われる。 |
| ||||||||||||
| 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へ出力することも可能) 読み出し手順は、およそ以下の通り。
|
| ||||||||||||
| 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ずつ順に行われる。 |
| ||||||||||||
| PSRM (Put Specific index Register Multi byte :未公開命令) |
PSRM SIR,$C5,IM3 | SIR ← $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を参照のこと。 |
| ||||||||||||
| マルチバイト算術演算命令(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を用いる場合でも,命令コード・動作クロック共に削減効果がない。 フラグ動作は以下のようになると思われますが,これで正確かどうかは不明です。
| ||||||||||||||||||
| ニモニック | 書式 | 機能 | フラグ | クロック数 | 説明 | 書式例 | ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| CMPM (CoMPlement Multi byte) |
CMPM $C5,IM3[ ,(JR)LABEL ] | $C5(IM3) ← NOT($C5(IM3))+1 | Z,C,LZ,UZ が変化 | 3+3+11+5*(IM-2)=17+5*(IM3-2) (JR: +3) |
オペランド1で指定されたメインレジスタブロック(IM3バイト)の内容をビット反転+1(2の補数)をとる。 最終オペランドにラベルがある場合,演算後,相対ジャンプする。(JRタグは省略可) |
| ||||||||||||
| 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 (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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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 (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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| 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タグは省略可) |
| ||||||||||||
| マルチバイトシフト命令(2~8 bytes)未公開 | ||||||||||||||||||
| 本命令群は,オペランド2の指定で,対象とするレジスタペアを2~8 byteまで拡大させる。 この命令1個で,最大8byte(64 bit)までのシフト命令が可能になり,DIUM, DIDM, BYUM, BYDMのみが用意されている。 ビットシフト系(BIUM, BIDM)とローテート系(ROUM, RODM)は用意されず, それらが割り当てられるべきだったインストラクションコードにBUPとBDNが割り当てられている。 | ||||||||||||||||||
| ニモニック | 書式 | 機能 | フラグ | クロック数 | 説明 | 書式例 | ||||||||||||
| 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が入る。 |
| ||||||||||||
| 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が入る。 |
| ||||||||||||
| 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が入る。 |
| ||||||||||||
| 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が入る。 |
| ||||||||||||
HD61クロスアセンブラが,デフォルト(オプションなし), /p, /qでそれぞれ出力するBAS形式,PBF形式,QL形式とそのローダーについて
解説する。
説明は,理解しやすいように表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 | |||||
| 999 DATA QUICK-LOADER.EXE,&H153C,&H154C,&H153C |
| 1000 DATA D6403C12D6003C15,8B |
| 1001 DATA D6205315D8566054,40 |
| 1002 DATA F7,F7 |
| 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 |
| QUICK-LOADER.EXE,5436,5452,5436 |
| D6403C12D6003C15D6205315D8566054F7,1730 |
| 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;")"; |
| 1000 DATA 5436,5452,5436 |
| 1001 DATA D6403C12D600,3C15D6205315,D8566054F700,000000000000 |
| 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 |
| 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 ' |
ROU の動作図![]() |
ROD の動作図![]() |
BIU の動作図![]() |
BID の動作図![]() |
DIU の動作図![]() |
DID の動作図![]() |
BYU の動作図![]() |
BYD の動作図![]() |
ROUW の動作図![]() |
RODW の動作図![]() |
BIUW の動作図![]() |
BIDW の動作図![]() |
DIUW の動作図![]() |
DIDW の動作図![]() |
BYUW の動作図![]() |
BYDW の動作図![]() |
DIUM の動作図![]() |
DIDM の動作図![]() |
BYUM の動作図![]() |
BYDM の動作図![]() |
| Ed.1 | : | 2011/6/12 HD61添付のマニュアルのHTML化が完成。オリジナルの記載ミス等を修正したが,自分で記入ミスしている可能性あり。 今後,記載ミス修正,情報追加を行う予定。 |