通常モードからの実行:ループ実行
バッチモードからの実行:現在実行中のアドレスをスタックに退避する
通常モードからの実行:ループ実行
バッチモードからの実行:現在実行中のアドレスをスタックに退避しない
(スタックが空の場合ループするバッチをこれから実行するバッチに変更)
通常モードからの実行: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; }