next up previous contents
: バッチの停止プログラム : バッチ処理 : バッチの消去プログラム   目次


バッチの実行プログラム

バッチの実行は、通常モードから実行する場合と、バッチモードから実行する場合の2種類があり、さらに実行コマンドは3種類用意されている。それは以下のようなものである。
  1. Call (0x91XX)

    通常モードからの実行:ループ実行

    バッチモードからの実行:現在実行中のアドレスをスタックに退避する

  2. Exec$_{(1)}$ (0x92XX)

    通常モードからの実行:ループ実行

    バッチモードからの実行:現在実行中のアドレスをスタックに退避しない

    (スタックが空の場合ループするバッチをこれから実行するバッチに変更)

  3. Exec$_{(2)}$ (0x93XX)

    通常モードからの実行:1度だけ実行

    バッチモードからの実行:現在実行中のアドレスをスタックに退避しない

プログラム中では次のようにしている。まず、通常モードからの実行時に、ループしない場合はフラグを立て、ループする場合はそのバッチ番号を大域変数に保持しておく。そしてバッチを実行し、バッチの末尾(ターミネータかリターン)読み取ったらスタックを参照し、スタックが空ならばループのフラグを参照して、ループするかバッチ処理を終了するかを決定する。スタックが空でなければスタックのアドレスをポップして、呼び出し元のバッチ処理を再開する。プログラムで示すと次のようになる。

doCommand(fetch(_currentAddr)); // 現在のアドレスからコマンドをフェッチ、実行
_currentAddr++;                 // 現在のアドレスをインクリメント
if (_batFinished){              // TerminatorまたはReturnを読み取った
    if (empty()){                   // スタックが空である
        if (_batPaused){                // ループしないフラグが立っている
            // ここにレスクロを止める処理が入る
            _batFlag = BAT_NORMAL;          // 通常モードに移行
            _batPaused = FALSE;             // フラグを戻す
        }
        else{                           // ループする
            _batFlag = BAT_NORMAL;          // 一度通常モードに戻る
            startBat(_repeatBatNum, FALSE); // もう一度実行
        }
    }
    else{                           // スタックが空でない
        _currentAddr = pop();       // push時に既にインクリメントしてある
    }
_batFinished = FALSE;
}



Deguchi Lab. 平成20年3月5日