機械語命令

本付録では、OpenFrame ASMでサポートする機械語命令について説明します。

1. OFATOE

OFATOEの使用方法は以下のとおりです。

    OFATOE D1(L1,B1),D2(B2)

以下は、OFATOEについての詳しい説明です。

概要

  • 形式: SS

  • 命令コード(Opcode): 0xF6

  • 長さ: 6バイト

説明

最初のオペランドが指す領域はASCII文字列をロードしていると仮定します。
その文字列をproperties.confファイルのUSE_CODE_CONVERSIONに定義されているASCII_TO_EBCDICに指定されたcpmファイルを使用して、ASCII文字列からEBCDIC文字列に変換して上書きします。

条件コード

  • 0: 成功

  • 1: 定義されていない

  • 2: 定義されていない

  • 3: コード変換失敗

2. OFETOA

OFETOAの使用方法は以下のとおりです。

    OFETOA D1(L1,B1),D2(B2)

以下は、OFETOAについての詳しい説明です。

概要

  • 形式: SS

  • 命令コード(Opcode): 0xF7

  • 長さ: 6バイト

説明

最初のオペランドが指す領域はEBCDIC文字列をロードしていると仮定します。
その文字列をproperties.confファイルのUSE_CODE_CONVERSIONに定義されているEBCDIC_TO_ASCIIに指定されたcpmファイルを使用して、EBCDIC文字列からASCII文字列に変換して上書きします。

条件コード

  • 0: 成功

  • 1: 定義されていない

  • 2: 定義されていない

  • 3: コード変換失敗

3. OFADBGREG

OFADBGREGの使用方法は以下のとおりです。

    OFADBGREG I1

以下は、OFADBGREGについての詳しい説明です。

概要

  • 形式: I

  • 命令コード(Opcode): 0xFE

  • 長さ: 2バイト

説明

最初のオペランドに渡される数値によって機能が異なります。 詳細な機能については以下を参照してください。

  • 0~15: 各番号に対応するレジスタにロードされている値と、現在のCC値をstdoutで出力します。形式は以下のとおりです。

    Reg=[<整数値>], Hex=[<8バイト 16進値>], CC=[<整数値>]
  • 16: すべてのレジスタ値を出力します。

  • 100~115: 最後の2桁の数に対応するレジスタに対してウォッチ機能を有効にします。レジスタの値が変更するたびに、stdoutで古い値と新しい値を出力します。命令が初めて実行されると、以下の形式を持ちます。

    OFASM: OFADBGREG[<オペランド値>], ADD WATCH REGISTER [<レジスタ値>]
    OFASM: WATCHING REGISTER = <レジスタ値>

    以降、レジスタ値が変更されるたびに以下のようなメッセージを出力します。

    REG=[<レジスタ値>]
    OLD=[<8バイトの16進値>]
    NEW=[<8バイトの16進値>]
  • 180~189: 内部のSTOPWATCHを初期化して新しく起動します。末尾の数字(0〜9)のIDを持つSTOPWATCHがアクティブになります。

  • 190~199: 最後に使用された18Xから経過した時間を出力します。末尾の数字(0〜9)のIDを持つSTOPWATCHが中断されます。複数回使用することもできます。

    OFADBGREG 180   // 0番目のSTOPWATCHを初期化します。
    OFADBGREG 181   // 1番目のSTOPWATCHを初期化します。
    OFADBGREG 190   // 0番目のSTOPWATCHの使用からの経過時間を出力します。
    OFADBGREG 191   // 1番目のSTOPWATCHの使用からの経過時間を出力します。

    19X命令の場合、以下のように複数回使用することができます。

    OFADBGREG 182   // 2番目のSTOPWATCHを初期化
    OFADBGREG 192   // 1回目の時間経過を出力
    OFADBGREG 192   // 2回目の時間経過を出力
    OFADBGREG 192   // 3回目の時間経過を出力
    OFADBGREG 192   // 4回目の時間経過を出力

    この場合、最後に使用された18X命令から経過した時間を順番に出力します。

    出力されるメッセージは次のとおりです。19X命令を使用した時点で出力されます。

    OFASM STOPWATCH IDX[X]: 28.954337ms // [X]は ID番号
  • 200~209: デバッグ・バイナリのみ該当します。最後の1桁の数に対応する値に従ってログ・レベルを有効にします。ただし、properties.confのOFASM_LOG_AFTER値が0の場合は出力されません。命令が実行されると、以下の形式を持ちます。

    OFASM: OFADBGREG[<オペランド値>], SET OFASM_LOG_LEVEL[<ログレベル>]

条件コード

  • 変更されない

4. OFADBGMEM

OFADBGMEMの使用方法は以下のとおりです。

    OFADBGMEM D1(L1,B1),D2(B2)

以下は、OFADBGMEMについての詳しい説明です。

概要

  • 形式: SS

  • 命令コード(Opcode): 0xFF

  • 長さ: 6バイト

説明

最初のオペランドが指す領域に対してメモリダンプを実行します。2番目のオペランドに渡される形式に応じて、以下の機能を提供します。

  • 0: 以下の形式でメモリダンプを行います。

    Length=[<長さ値>], Hex=[<16進値>]
  • 1: 以下の形式でメモリダンプを行います。

    Addr=[<メモリアドレス値>], Length=[<長さ値>], Hex=[<16進値>]
  • 2: 以下の形式でメモリダンプを行います。

    Addr=[<メモリアドレス値>], Length=[<長さ値>], Hex=[<16進値>], Char=[<文字に変換した値>]
  • 3: 以下の形式でメモリダンプを行います。

    Program=[<プログラム名>], Symbol=[<シンボル名>], Length=[<長さ値>], Hex=[<16進値>]
  • 4/5: 以下の形式でメモリダンプを行います。最初のオペランドが指す領域にHFP(Hexadecimal Floating Point)値がロードされていると仮定します。該当する領域の値をBFP(Binary Floating Point)値に変更して出力します。4はShort BFP、5はLong BFP形式で出力します。

    Addr=[<メモリアドレス値>], Length=[<長さ値>], Hex=[<16進値>], BFP=[<変換されたBFP値>]
  • リテラル: リテラル値として指定した長さの分だけメモリ・ウォッチ機能を有効にします。最初のオペランドが指す領域が更新されると、古い値と新しい値が出力されます。

    Addr=[<メモリアドレス値>], Length=[<長さ値>], Hex=[<16進値>]
    OFASM: WATCHING LOCATION:LENGTH = <メモリアドレス値>:<長さ値>

    以降、メモリ値が変更されるたびに以下のような形式で出力します。

    Addr = [<メモリアドレス値>], SIZE = [長さ値]
    OLD=[<16進値>]
    NEW=[<16進値>]

条件コード

  • 変更されない

5. OFNUMCHK

OFNUMCHKの使用方法は以下のとおりです。

    OFNUMCHK D2(B2)

以下は、OFNUMCHKについての詳しい説明です。

概要

  • 形式: S

  • 命令コード(Opcode): 0x0203

  • 長さ: 4バイト

説明

オペランドは1バイトのメモリ・アドレスを指します。
対応するメモリ・アドレスにロードされている値が 0x30から0x39の範囲(ASCII文字の数字)内の値であるかどうかを確認します。

条件コード

  • 0 : 0x30~0x39の範囲内の値ではない

  • 1 : 0x30の値

  • 2 : 0x31から0x39の範囲内の値

  • 3 : 定義されていない