ESR-H用クロスアセンブラ "TNKASM Ver2.0" 仕様書




          ESR-H CPU用クロスアセンブラ

             TNKASM Ver 2.0




1.はじめに。

 TNKASMはPC-1360のバイナリファイルを生成するアセンブラです。
  TNKBのプログラムを実行するために作成しましたが、単独でも使用できます。

  1.2 特徴
  INCLUDE疑似命令をサポートしています。
  MACRO疑似命令をサポートしています。
  バイナリ転送においてRev氏作成のBINRSを用いることができます。

 開発フロー

2.使用方法

 2.1 アセンブル

   コマンドラインに以下のように入力します。

    TNKASM   <ファイル名> [ .拡張子 ]

   【注意】パス名の指定はできません。(拒否されます)
      例   \TNK\SOURCE\SAMPLE

    拡張子を省略すると .ASC が仮定されます。

  TNKASMは、<ファイル名>で示されるソーステキストをアセンブルし、"<ファイル名>.OSC"というバイナリファイルを作成します。
バイナリファイルはBINRSを用いてSIOポート経由でPC-1360に転送します。
転送した後はCALL命令で起動できます。



 2.2 エラーメッセージについて。

  構文違反などの要因でアセンブル不可能となった場合、以下のメッセージを出力
 して終了します。出力されたメッセージは、エディタのタグとして活用できます。

   メッセージ    意味
   Syntax error.     構文違反
   Duplicate label.  ラベルの二重定義
   Undefined label.  未定義ラベル
   Jump too far.     相対ジャンプ距離が遠すぎる
   Bad expression.   式の構文違反
   Operand overflow. オぺランド値が大きすぎる


3.文の構成

 TNKASMの文は、行の集まりにより構成されます。

 3.1 行の構成

  行の構成は以下の構文図のとおりです。


  <行>         :=   ; <コメント>
                |    <INCLUDE疑似命令>
                |    <マクロヘッダ行>    
                |    <命令記述行>
                |    <マクロフッタ行>


<マクロヘッダ行>  :=  <マクロ名> MACRO  '(' [仮パラメタ列] ')'

<仮パラメタ列>    :=    <仮パラメタ> {, <仮パラメタ>}

<仮パラメタ>    :=    '$' <仮パラメタ序数>

<仮パラメタ序数> := <10進数>

<マクロフッタ行>  :=   ENDM


<命令記述行>     :=   [ <ラベル> [:] ] <オペレーション> [ ; <コメント> ]

  <オペレーション>     :=   <オペコード> [ オペランド ]

  <オペランド>      :=   <項> { * <項>   }

           |   <文字列>

           |   <16進 パターン>


  <項>          :=   <因子> { + <因子> }


  <因子>         :=   <ラベル>

                 |    <数値>

                 |    HIGH( <オペランド> )

                 |    LOW ( <オペランド> )

            |    ロケーションカウンタ



 3.2 構文の要素

   構文の要素を説明します。

 ・ラベル

   英字から始まる8文字までの英数字です。オペコードと同じ綴りのラベルは
    許されません。同じ名前のラベルを2個以上定義することはできません。



 ・オペコード

   SC61860機械語命令、定義済みマクロ命令と各種疑似命令を追加したもの。

   【注意】現在CASE命令には対応していません。
     

    ・定義済みマクロ命令
    
        _LIBA <式>

            BAペアレジスタに<式>の値を格納します。

        _FILD(DEST,CHR[,CNT])
        
            DESTで示された記憶装置の番地に、CNTバイト分、CHRで示すキャラクタコードを埋め込みます。
            CNTは省略可能
            
        _MVWD(DEST,REGADR[,CNT])
        
            DESTで示された記憶装置の番地から、CNTバイト分、REGADRで示す内部RAMに転送します。
            CNTは省略可能

        _EXWD(DEST,REGADR[,CNT])
        
            DESTで示された記憶装置の番地から、CNTバイト分、REGADRで示す内部RAMと交換します。
            CNTは省略可能
        
  ・疑似命令

        DM   " <文字列> "

     文字列をメモリに展開します。


        DH   " <16進パターン> "

            16進数をメモリに展開します。主にドットパターンを格納するために使用します。


        EQU  <式>

            ラベルに式の値を代入します。そのため、この命令には必ずラベルが必要です。


        DB  <式>

            式の値を1バイトでメモリに格納します。
            255を越える時は下位1バイトのみが格納されます。


        DS   <式>

            ロケーションカウンタでしめす記憶装置の領域を、式の値で示すバイト数分00Hにします。


        DW  <式>

            式の値を2バイトで上位バイト、下位バイトの順にメモリに格納します。


    INCLUDE "ファイル名"

            "ファイル名"で示すソースプログラムを続けてアセンブルします。
            そのあとでまた今アセンブル中のソースプログラムのアセンブルを再開します。
            (これを「ファイルインクルード機能」といいます。)
            "ファイル名"で示すソースプログラム中に INCLUDE 疑似命令を見つけた場合、TNKASMでは ERROR としています。



  ・オペランド

        数値データとロケーションカウンタからなる式。または文字列、16進パターンです。

  ・数値データ
    10進数、16進数いずれかの数です。

    ・10進数
        0..9で始まり、0..9で終わる数。

       例 90

     16進数
        0..9で始まり、Hで終わる数。

       例 0C0H


    ・HIGH() オペランドの値の上位1バイトを取り出す関数です。


    ・LOW() オペランドの値の下位1バイトを取り出す関数です。


    ・ロケーションカウンタ

        現在アセンブル中の命令語が記憶装置のどこにあるかを番地で保持する変数です。
        初期値はORG疑似命令により与えられ、次にORG疑似命令によって値を設定されるまで、アセンブラによって自動的に更新されます。

        【注意】
            現在ORG擬似命令はプログラム先頭の宣言しか有効ではありません。
            プログラム先頭でORG擬似命令を省略するとORG 9000Hを仮定してアセンブルを開始します。

  ・文字列
     英大文字、英小文字、カタカナ、特殊記号からなる文字の集まりです。

  ・16進パターン
         ダブルコーテーションで囲まれた0..9 , A..F からなる文字列です。
        GPRINTのデータ確保が目的なので文字列の長さは強制的に偶数にされます。

  ・コメント

   セミコロンから行末までの文字列です。コメントはプログラムを読みやすく
  するためのメモです。


5.アセンブラの内部構造

   Pascalプログラムは宣言部から始り、手続き、関数の記述の最後にメインプログラ
 ムが示されます。

 5.1 宣言

  ストリング型の宣言

      Str8はラベルの処理に、Str80型はソーステキストのバッファ用に使用します。
   
      Str8       = String[ 8];
      Str80      = String[80];

  列挙型の宣言

   列挙型はPascalプログラマ以外にはなじみがないでしょうが、最近C言語にも
  導入されたようです。

     Optypeは機械語命令のオペランド種を示します。

      Optypeの値    オペランド
       Notype      オペランドなし
        Relative     相対アドレス
        QuickByteLoad   LP命令のオペランド
        ByteLoad     1バイトデータ
        QuickWordLoad   CAL命令のオペランド
        WordLoad     2バイトデータ
        MacroInst     マクロ命令に依存したオペランド
        DefInst      擬似命令に依存したオペランド


    SymbolKindは字句解析の結果、その字句の種類を示します。

      SymbolKindの値       字句の種類
        BadSymbol .. EndofFile    期待しない字句。
        Leftparen .. Colon     括弧や演算子
        HighByte  .. LowByte    HIGH関数,LOW関数。
        PRINT     .. TNKEND     擬似命令。
        PUSHX     .. EXBAX     マクロ命令。
        ADB       .. WAIT      機械語命令。

      Symbolset = Set of SymbolKind;


   ファイルの宣言
     InputF       : Text;
      OutputF      : BinFile;


 変数。

    PassCountは現在のアセンブルパスをあらわす変数です。
      
        := 1; ラベルテーブルを作成するためのパス。
        := 2; バイナリファイルを作成するためのパス。

  以下、アセンブルに必要な各種テーブルの宣言が続きます。

  ラベルテーブルはソース中のラベル名とその値の対応をとるためのものです。
      LabelCount   : Byte;
      LabelTable   : Array [0..Lmax] of
                     Record
                       Name  : Str8; ラベル名
                       Value : Word; ラベルの持つ値
                     end;

  IDテーブルはニモニック名からオペコードを取り出すためのものです。
      Idtable      : Array [0..256] of
                     Record
                       Name  : Str8; ニモニック
                       Value : Word  ニモニックに対応するオペコード
                     end;

  予約語テーブルは識別子の一覧表です。字句解析のつど、参照されます。
      ReservedWord : Array [0..Nrw] of
                     Record
                       Name  : Str8;     ニモニック
                       Value : Symbolkind;  ニモニックの識別子
                     end;

      SpecialSymbol: Array [char] of Symbolkind;


  識別子からオペランドのタイプを取り出すテーブル
      CodeTable    : Array [Symbolkind] of
                     Record
                       Opcode      : Byte;
                       OperandType : OpType;
                     end;

      FactorHead   : Symbolset;

      ch           : Char;
      cc,ll        : Integer;
      TnkSource    : Str80;

      Symbol       : SymbolKind;
      BackJumpOp   : Set of SymbolKind;


  字句解析に用いる変数。

      Id           : Str8;   切り出された字句が識別子の時に文字列を格納する。
      NumValue     : Word;           数値 の時に値を格納する。
      Strings      : Str80;          文字列の時にそれを格納する。

      OprStr       : Str80;          オペランド処理用ワーク。

      Hord : Array ['0'..'F'] of byte;

      Errpos       : 0..linel;  エラーの発生したカラム。
      ErrorCount   : Byte;        発生回数。


  エラーメッセージ

      ErrTable     : Array [0..80] of
                     Record
                       Cnt  : Word;  エラーの発生した行番号
                       Pos  : Word;  エラーの発生したカラム
                       Erno : Word   エラー番号
                     end;

  ファイル名称
      SourceFile,
      ObjectFile   : Str80;

  ファイルのオープン判定フラグ
      FileFail     : Boolean;


  ロケーションカウンタ
      Location     : Word;


  読み込んだソースファイル行数
      InCount      : Word;



 5.2 関数の処理内容

   Function ValueNbase(Base: Byte; S: Str8) : Word;
     Str8の文字列をBaseを基底とする数値に変換してWord型で帰す。


   Function HexStringB(Dec: Byte) : Str8;
     Decを16進文字列に変換して帰す。


   Function HexStringW( Dec: Word ) : Str8;
     Decを16進文字列に変換して帰す。


   Procedure Error(n : byte);
     文法エラーが発生したことをエラーテーブルに記録する。


   Procedure FatalError(n : byte);
     致命的なエラーが発生したため、アセンブルを中断する。


   Procedure GetSymbol;
     字句を取り出し、その型を変数Symbolに格納する。


   Procedure TableSetup;
     アセンブルに必要な各種テーブルを初期化。
       IdTable      :  識別子を登録します。
              ReservedWord : 予約語を登録します。


   Procedure FileOpen;
     入力ファイルと出力ファイルをオープンする。


   Procedure Initialize;
     アセンブルに必要な変数を初期化。


   Procedure DispLabel;
     ラベルテーブルを表示。


   Procedure RemarkSkip;
     ソースファイル中のコメントを読み飛ばす。


   Procedure Enter(Id: Str8);
     ラベルテーブルにラベル名とラベルアドレスを登録する。


   Procedure GetLabel;
     ソースファイル中のラベルを読み込み、Enter手続きに渡す。


   Procedure GetOpCode;
     ソースファイル中のオペコードを読み込み、オペランドの型
    に応じて以下の処理を行う。

     Notype:         オペコードの書き出し

          QuickByteLoad: オペランドの読みだし
             オペコードにオペランドをOR。
             オペコードの書き出し

          ByteLoad:  オペランドの読みだし
                 オペコードの書き出し
             オペランドの下位バイト書き出し

          QuickWordLoad:  オペランドの読みだし
             オペコードにオペランドをOR。
                 オペコードの書き出し
             オペランドの書き出し

          WordLoad:   オペランドの読みだし
                 オペコードの書き出し
             オペランドの上位バイト書き出し
             オペランドの下位バイト書き出し

          Relative:   オペランドの読みだし
                 相対アドレスの計算
                 オペコードの書き出し
             相対アドレスの書き出し


   Procedure OnelineAssemble;
     一行のアセンブルを行う。


   Procedure Pass(n: Byte);

      入力ファイルが End of fileとなるまでOneLineAssemble手続きを
     呼び出します。

     パス1ではラベルアドレスの決定を行いラベルテーブルに格納する。
     パス2ではラベルテーブルを索引しながらオブジェクトを書き出す。


   Procedure DispErrMsg;
     エラーテーブルにある情報をタグ形式で画面に書き出す。


      Procedure HedderWrite;

    以下の内容のファイルヘッダを出力ファイルに書き出す。
        offset|  内容
        ------+--------------
         0-4  |定数 FF30000010
         5-6  |ファイルサイズ(下位上位の順で格納)
           7   |定数 00
         8-9  |格納開始アドレス(下位上位の順で格納)
          A-F  |定数 000000000000

6.終わりに

        リトルリーグの雷夢(ライム)氏に技術提供できたようで何よりです。
        しかし氏はあろうことかC言語処理系を使うという禁忌を冒してしまわれたのであった。
        彼にカミの加護のあらんことを(冗談です念のためw)
       
7.変更来歴

        93.06.01 初版
        93.11.05 INCLUDE 疑似命令を追加
        22.07.04 全体改定