ARGUSは、Automatic Routine Generating and Updating Systemの略称で、[1] 1950年代後半にHoneywell社がHoneywell 800および1800コンピュータ 用に考案したアセンブリ言語です。 [2]
他のアセンブリ言語と同様に、ARGUS の各行は 1 枚のカードにコピーされ、メモリ内の 1 つのワードに関連付けられます。ただし、1 つの ARGUS コマンドである RESERVE は、指定された位置に指定された数のワードを予約できます。RESERVE コマンドは、予約ワードの初期データを規定しないという点でも例外的です。いくつかの例外を除き、マシン言語のワードは ARGUS 行と同じ順序でコード化されました。[引用が必要]
ハネウェル 800 メモリ
Honeywell 800 と 1800 には、フェライト コアを使用したメイン メモリと制御メモリがありました。メイン メモリには、顧客の要件に応じて 4 ~ 16 のバンクがありました。各バンクには、それぞれ 48 ビットの 2048 ワードが含まれていました。個々のインストールにおける実際のバンクの数は、4 の倍数でなければなりませんでした。[引用が必要]
制御メモリには、それぞれ 16 ビットのレジスタが 256 個ありました。理論上、マシンはいつでも 1 つのオペレーティング システムと 7 つのアプリケーション プログラムを実行でき、それぞれが 32 個のレジスタを排他的に使用できます。[引用が必要]
2048 ワード以上 (データと命令を合わせた) を必要とするプログラムは、2048 ワード以下のセグメントに分割する必要がありました。各セグメントは、メイン メモリの 1 つのバンクを排他的に使用します。セグメント間で制御を渡すための特別な命令がありました。
ARGUS コマンドのレイアウト
ARGUS コマンドの各行には、次の 6 つのフィールドがありました。
位置は、メモリ内のそのワードに割り当てられるオプションの ARGUS 名です。各ワードのアドレスがメモリ内に割り当てられると、その行の ARGUS 名が対応するワードの位置にリンクされます。ARGUS の他の行はその名前を参照でき、そのワードには正しいメモリ アドレスが割り当てられます。プログラム内では、それぞれの名前は一意である必要があります。
このフィールドは R で始まる場合があります。その場合、カードの残りの部分はコメントのみになります。
このフィールドは、X, または X,addressname で始まる場合があります。その場合、この行とその他の X, 行は、マークされていない行から離して配置されます。その後、X,+n またはアドレス フィールドの addressname でアドレス指定できます。[引用が必要]
このフィールドはM,masknameで始まる場合があります。その場合、行はマスクを定義します。
操作:マシン言語コマンドまたは ARGUS 専用コマンドの ARGUS 名。必要に応じて、マスクのアドレスが続く場合があります。いくつかのコマンドには追加情報があります。
A、B、C アドレス:マシン コードに変換されます (下記参照)。A アドレスと B アドレスは通常、2 つの入力ワードであり、C アドレスは宛先です。
ID:通常はカードパンチマシンによってカードにパンチされたシリアル番号です。落としたカードを整理するために使用されます。
機械語コマンドのレイアウト
各マシン言語コマンドは 48 ビットの 1 ワードを使用します。これは、それぞれ 12 ビットの 4 つのセクションに分割されます。最初の 12 ビットは操作を指定し、コマンドのマスクのオフセット アドレスなどの補助情報が含まれます。他の 3 つのセクションは、A、B、C のアドレスです。
マスクが指定された場合、コマンドの最終結果は宛先に到達する前にそのマスクを通過します。たとえば、マスクのビット 17 が 1 の場合、結果は宛先のビット 17 に送られます。マスクのビット 17 が 0 の場合、宛先のビット 17 には別の何かが送られます。コマンドによっては、0 の場合もあれば、入力ワードの変更されていないビット 17 の場合もあります。
セグメントには最大 16 個のマスクが許可され、最後の 4 ビットがすべて 0 であるアドレスから始まる連続したワードでなければなりません。それらすべてに ARGUS ロケーション名が付けられました。マスク レジスタと呼ばれる特別なレジスタにベース アドレスが保持されました。コマンド フィールドには、名前付きマスクのオフセット アドレスを保持するための 4 ビットがありました。
メモリのアドレス指定モード
ほとんどのコマンドでは、A、B、C アドレス セクションを使用してメモリ内の実際の位置を示します。アドレス指定モードは 6 つありました。そのうち 2 つはめったに使用されませんでした。残りは、直接、直接特殊レジスタ、間接アドレス指定、インデックス指定です。
直接アドレス指定
メイン メモリ アドレスはコマンドによって直接指定されます。マシン言語では、12 ビットのうち 1 つは直接モードを示し、他の 11 ビットは正確なアドレスを指定します。11 ビットは 0 から 2047 までの数字を表すことができますが、それより大きい数字を表すことはできません。ただし、これは最も効率的なアドレス指定のタイプです。このジレンマが、バンクが 2048 ワードしかなく、セグメントが 1 つのバンクだけに限定される理由です。
ARGUS コードの行にこれを記述する方法は 2 つあります。1. 位置列で以前に定義された名前。これに数値 (10 進数) を追加できます (例: BUFFER0+59)。2. 現在の行から数行 (ワード) 先の位置。例: C,2 は、この行の 2 行先を意味します。
間接アドレッシング
12 ビットで、アドレッシング モードと制御メモリ内のレジスタのアドレスが識別されます。また、0 から 32 までの増分も指定されます。メイン メモリ アドレスは、制御メモリ内のレジスタにあります。プロセッサは、最初にレジスタからメイン メモリ アドレスを取得し、次にそのメイン メモリ アドレスのワードを呼び出します。最後に、指定された量だけレジスタ値を増加 (増分) します。レジスタからの 16 ビット アドレスには、5 ビットを使用して 0 から 31 までのバンク アドレスと、11 ビットを使用してそのバンク内のワードが含まれます。増分は、アドレス A と B に対してのみ推奨されます。
ARGUS の場合: N,R0,3 はレジスタ R0 を使用し、それを 3 増やすことを意味します。
直接特別登録
レジスタは、メインメモリ内のワードと同じ方法で直接アドレス指定されます。
ARGUS の場合: Z,R0,3 は、レジスタ R0 から直接読み取るか、レジスタ R0 に書き込んでから、その値を 3 増やすことを意味します。書き込み時に増加することは推奨されません。
インデックスアドレス指定
これは、インデックス レジスタと呼ばれる 8 つのレジスタにのみ適用されます。インデックス レジスタを指定するには 3 ビット、0 ~ 127 のオフセットを指定するにはさらに 7 ビットが必要です。したがって、オフセットはフルレングスのメイン メモリ アドレスに追加されます。これは強力なツールです。複数ワードのテキストまたはレコードを処理するのに役立ちます。テープ バッファは通常、この方法でアドレス指定されます。
ARGUS の場合: X0,35 または 0,35 は、インデックス レジスタ 0 を使用し、その数値を 35 (10 進数) 増やして、メイン メモリ内のその場所から読み取ったり、その場所に書き込んだりすることを意味します。X0 の値を変更しないでください。
非アクティブなアドレス
ARGUS では、アドレス フィールドはダッシュ (-) でした。これは、フィールドがプロセッサによって無視され、コマンドの通常のアクションの一部が無効になることを意味していました。
レジスター
前述のように、プログラムは 32 個のレジスタにアクセスできました。8 個は特殊機能、16 個 (R0 から R15) は汎用、8 個 (X0 から X7) はインデックス レジスタでした。[要出典]
インデックス アドレッシングはインデックス レジスタに対してのみ可能でした。
直接アドレス指定と間接アドレス指定は、汎用レジスタとインデックス レジスタの両方に適用できます。おそらく他のレジスタでも機能しますが、それは悪い習慣です。
特別なレジスタは次のとおりです。
SC(シーケンスカウンター) SH (シーケンス履歴) CSC (コシーケンスカウンター) CSH (共列履歴) MSK (マスクレジスタ) AU1とAU2
それらはコンピュータがプログラムを実行するために使用されました。
動作中、シーケンス カウンターには常に実行中のコマンドの完全なアドレスが含まれていました。通常、コマンドは位置順に実行されました。シーケンス履歴には、シーケンス カウンターの最後の値が含まれていました。この値は、サブルーチンにジャンプするとすぐに保存する必要がありました。そうしないと、戻ることが不可能になります。コシーケンス カウンターと履歴は、ARGUS 位置の先頭に X があるすべてのコマンドに対して同じ機能を実行しました。
MSK レジスタには、最初のマスクの完全な位置が保持されます (下記参照)。
AU1 と AU2 は、一部のコマンド、特に TN によって内部的に使用されていました。プログラムでも使用できましたが、内部操作が干渉するリスクがあったため、賢明な選択ではありませんでした。
コマンド
各 ARGUS 行はメモリ内のワードを定義します。通常の操作では、プロセッサは各コマンドをアドレス順に実行します。一部のコマンドは、別のアドレスへのジャンプを指示できます (同じバンクへの直接アドレス指定による)。
算術
コマンド WA、BA、DA はそれぞれ異なる方法で、アドレス A と B から数値を取得し、それらを合計して結果をアドレス C に格納します。
コマンド BS と DS はどちらも、アドレス B の数値をアドレス A の数値から減算し、その結果をアドレス C に格納します。
WA (Word Add) は、2 つの入力数値を符号なしの 2 進数として扱います。これは、既知のアドレスに増分を追加するためによく使用されます。
BA と BS (バイナリ加算とバイナリ減算) は、2 つの入力数値を符号付きバイナリとして扱います。
DA と DS (10 進数の加算と 10 進数の減算) は、2 つの入力数値を符号付き 10 進数として扱います。
左端の 4 ビットは符号を定義します。すべてゼロの場合、符号は正です。それ以外の場合は負です。
DM コマンドは、アドレス B の数値をアドレス A の数値で乗算し、結果の左半分をアドレス C に配置します。残りの下位桁は、低出力レジスタ (LOP) に残されます。TX コマンドまたは TS コマンドによって、そこからメイン メモリ アドレスに転送できます。DM は、浮動小数点アダプタによって完全にサポートされています。DM がない場合は、シミュレーションが必要です。
データ転送とプログラム制御
アドレスAからアドレスCへのTX転送。アドレスBは非アクティブである必要があります(アドレス指定モードを参照)
TS アドレス A からアドレス B に転送し、アドレス C のコマンドに順序どおりにジャンプしません。C は直接アドレスである必要があります。オプションで A と B を非アクティブにすると、コマンドは純粋なジャンプになります。これは、このマシンが GOTO コマンドに最も近いものです。
MT アドレス A からアドレス C へ複数回転送します。回数は、アドレス フィールド B に 10 進数で指定します。この数値は実際のアドレスではありません。2 進数に変換され、マシン言語コマンドの操作セクションに配置されます。したがって、値を大きくすることはできません。[要出典]アドレス C は、1 以上の増分を持つ間接アドレスでなければならず、これにより、個々の転送が異なるワードで動作します。このコマンドは、アプリケーション プログラミングの経験ではほとんど使用されませんでした。ただし、オペレーティング システムやコンパイラではより便利になる場合があります。
TN アドレス A からアドレス C に転送します。次に、A+1 から C+1 に転送します。これをアドレス B で指定された回数だけ繰り返します。MT は 10 進数で、マシン コマンドの操作セクションで 2 進数に変換されます。[要出典]このコマンドは、アプリケーションで、特にテキストの領域を「空白にする」場合に頻繁に使用されていました。このコマンドは、レジスタ AU1 と AU2 を使用してアドレスの増分を管理していました。
NA アドレス A と B を比較します。等しい場合は通常どおり続行します。等しくない場合はアドレス C にジャンプします。[引用が必要]
LA アドレス A と B を比較します。A (符号なしバイナリ) が B 以下の場合は通常どおり続行します。それ以外の場合は C にジャンプします。[引用が必要]カウンター付きのループの場合、LA は NA よりも安全です。ロジックが誤った場合、NA ループは暴走する可能性があります。
PR 続行。これは「何もしない」コマンドですが、それでも時間がかかります。3 つのアドレスはすべて非アクティブになります。ループで使用して、オペレータが何らかのアクションを実行するまで待機してから、オペレータに通知することもできます。
定数と初期値の定義
これらは、メモリ内のアドレスのバイナリ初期値に変換される ARGUS コマンドでした。実際の値はアドレス A に入り、必要に応じてアドレス B と C に続きます。これらの行のほとんどは定数として使用され、アクティブなコマンドが参照するための場所コードがあります。
OCT パンチされた文字または数字は 3 ビットの 8進コードに変換されます。つまり、0 は 000、1 は 001、2 は 010、… 7 は 111 になります。
HEX パンチされた文字または数字は、4 ビットの16 進コードに変換されます。0 は 0000、1 は 0001、... 9 は 1001 になります。B から G は 10 進数の 10 から 15 を示し、2 進数では 1010 から 1111 になります。Honeywell の 16 進コードでは B から G が使用され、IBM では A から F が使用されました。
DEC パンチされた文字または数字は 4 ビットの10 進コードに変換されます。これは 0 から 9 のみが有効である点を除いて 16 進数に似ています。
ALF パンチされた文字または数字は、英数字、文字、記号の Honeywell 独自のバイナリ コードに従って変換されます。
M,x,text に加えて、各アドレス フィールドに x,text の個別のエントリ。ここで、x は O、H、D、または A のいずれかであり、ワードの各 12 ビット セクションを上記のいずれかの方法を使用してエンコードできます。
OCT、HEX、DEC の場合、左端の 4 ビットは数値の符号を表すために使用されます。
マスクとスイッチコマンド
マスクは、M,maskname という位置エントリを持つ定数でした。ARGUS ではすべてのマスクをまとめるのが良い習慣でした。いずれにしても、ARGUS はそれらを連続したワードにまとめます。マスクの最大数は 15 でした。
マスクは、ワードの値を変更できるコマンドのアクションを変更するために使用できます。たとえば、TX,maskname は、マスク「maskname」を TX コマンドに適用します。マスクは Switch Word コマンドには不可欠ですが、他のコマンドにはあまり役立ちません。一部のインストールでは、Switch Word にのみマスクを使用するという標準がありました。最初のマスクの完全なアドレスは MSK レジスタに配置され、個々のマスクのオフセットは、指定されたマシン言語コマンドのコマンド セクションに配置されます。その結果、プログラムに必要なマスクは 1 セットのみで、どのセグメントからでも使用できました。
Switch Word コマンドは、ワード内の一部のビットを他のビット位置に移動するために使用されました。2 つの Switch Word コマンドがあり、非常によく似ています。Switch Word と Extract には、SWE、maskname という ARGUS コマンドがあり、A アドレスはソース、C アドレスは宛先です。B アドレス フィールドは、スイッチの量、x、n、d 用です。x は、2 進数、10 進数、英数字 (つまり、それぞれ 1、4、6 ビット単位) を表す B、D、または A です。d は、左または右を表す L または R です。
運用中:
ワードはアドレス A から取得され、ビットは指定された単位の数とサイズだけ左または右に移動され、端から「落ちた」ビットは反対側に戻されます。シフトされたワードはビットごとにマスクを通過します。マスク ビットが 1 の場合、シフトされたビットがコピーされます。それ以外の場合は 0 ビットが渡されます。変更されたワードはアドレス C に配置されます。
他の Switch Word コマンドは、同じ構文を持つ Switch Word and Superimpose (SWS) です。マスク ステージでの動作が異なります。マスク ビットが 0 の場合、シフトされたビットではなくシフトされていないビットが出力ワードに配置されます。マスク ビットが 1 の場合、動作は SWE の場合と同じです。
例: アドレス A には、それぞれ 6 ビットの 8 つの文字が含まれます。ABCDEFGH マスク ONECHAR には、右端の 6 ビットに 1 が含まれ、その他の部分には 0 が含まれま す。
コマンドはSWE,ONECHAR AA,4,RCです。アドレスCには0000000Dが含まれます。
コマンドがSWS,ONECHAR AA,4,RCの場合、アドレスCにはABCDEFGDが含まれます。
機械語では、すべてのシフトはバイナリ右として表現されます。x、n、d 形式の ARGUS コードはすべてバイナリ右に縮小できます。
マクロとサブルーチン
マクロは次のように呼び出されます: L$,macroname これは、その時点でマクロ「macroname」の ARGUS テキストを挿入するようにアセンブラに要求します。これは、ARGUS がマシン コードに変換される前のアセンブリの初期段階で行われました。標準ライブラリ (独自のテープ上に保持) には多数のマクロがあり、顧客はさらに追加できます。マクロ GET および PUT は、入力テープ バッファーから項目を取得するか、出力テープ バッファーに項目を配置して、必要に応じてレコードの読み取りまたは書き込みを行います。
サブルーチンには 2 つのタイプがあります。1 つは完全に ARGUS で記述されています。次に、サブルーチン SUBA を使用した例を示します。
もう一方のタイプのサブルーチンは、マクロ ラッパーを使用してマシン言語で配信されました。これは通常、Honeywell のスタッフによって作成されました。マクロは、サブルーチンを呼び出すためにコマンド GOSUB を使用しました。
浮動小数点コマンド
Honeywell 1800 には、科学計算用のオプションの浮動小数点アダプタがありました。そのためのコマンド セットがありました。ハードウェアにアダプタが含まれていない場合、これらのコマンドはシミュレーション形式でも使用できますが、これは通常の使用には推奨されません。ARGUS 浮動小数点コマンドは、アダプタの有無に関係なく同じでした。アダプタがない場合、ARGUS は真の浮動小数点演算のマシン言語シミュレーションを提供します。
周辺機器入出力制御
マシン レベルでの入力および出力デバイス アドレスは、0 ~ 7 の 2 つの 8 進数字でした。ARGUS レベルでは、2 つの文字 (AG) でした。最初の数字はコントローラを識別し、2 番目の数字はそのコントローラ上のデバイス番号を識別しました。
テープ処理の場合、テープ上の 1 つのデータ単位は、Honeywell のマニュアルではレコードと呼ばれていました。IBMではこれをブロックと呼んでおり、現在でもその呼び方のままです。レコードの区分はアイテムと呼ばれていました。IBM ではこれをレコードと呼んでいました。IBM の用語は米国の標準となりました。
コマンド:
コマンド RW,AA は、テープ ユニット AA (8 進数 00) のテープを巻き戻します。
コマンド RF,AA は、テープ ユニット AA の次のレコード (8 進数 00) を読み取ります。
コマンド RB,AA は、データを送信せずに、テープ ユニット AA (8 進数 00) の前のレコードを読み戻します。既存のテープを修正するには、RF を使用して不要な最初のレコードを見つけ、次に RB を使用してその前のスペースに到達し、次に WF を使用してそのレコードを上書きして先に進みます。
コマンド WF,AB は、次のレコードをテープ ユニット AB (8 進数 01) に書き込みます。
コマンド RF,GA は、カード リーダー (デバイス GA、8 進数 70) 上の次のカードを読み取ります。
A アドレスは、その読み取りまたは書き込み操作のバッファの最初のワードになります。読み取りまたは書き込みを処理と並行して実行できるように、デバイスごとに 2 つのバッファを使用するのが一般的でした。これはダブルバッファリングと呼ばれます。コア メモリが限られていたため、バッファ サイズは「レコード」(ブロック) のサイズを制限する要因でした。
テープにレコードを書き込む準備をするとき、各項目は規定のコードを持つ項目終了ワードで終了しました。各レコードはエラー チェック用の Ortho ワードで終了し、その後にレコード終了ワードが続きます。出力バッファが項目でいっぱいになると、Compute Ortho (CC) コマンドを使用して Ortho ワードを計算し、レコード終了ワードを提供します。Compute Ortho コマンドでは、アドレス A と B が最初のワード位置と最後のワード位置を示します。次に、WF コマンドでレコードが書き込まれます。最後に、制御がメイン プログラムに戻ります。
通常のアプリケーション作業では、RW を除くすべての周辺コマンドがサブルーチン内に配置されます。
プログラム管理コマンド
プログラムの管理を扱うための ARGUS コマンドがありました。プログラムを組み立てるには、次のものが必要でした: [引用が必要]
- 必要なすべての変更のための ARGUS コードを含むカード デッキ。
- インストール時のすべての ARGUS プログラムを含む入力テープ。
- すべての新しい ARGUS プログラムと古いプログラムのすべてのリビジョンを格納する出力スクラッチ テープ。
- インストール時のすべてのマシン言語プログラムを含む入力テープ。
- すべてのマシン言語プログラム(変更されていないもの、新しいもの、または再アセンブルされたもの)を格納する入力テープ。
- マクロのライブラリを含む入力テープ。これらのマクロは、アセンブリ中およびマシン コードへの変換前に ARGUS コードに追加されます。
- カード画像を分類するための 1 つ以上のスクラッチ テープ。
作成または変更するプログラムごとに、ごく少数の管理コマンドが必要でした。
U,NEWPROG progname 後続のカードは、progname という完全な新しいプログラム用です。 U,REASSMB progname 後続のカードは、既存のプログラム progname に対するリビジョンです。 U,NEWSEG progname segname 後続のカードは、progname という (新しいまたは既存の) プログラムの segname という完全な新しいセグメントです。 U,SEGMENT progname segname 後続のカードは、プログラム progname のセグメント segname に対するリビジョンです。 U,ENDSEG これは、セグメント (またはそのリビジョン) の終了です。 U,ENDPROG これは、プログラム (またはそのリビジョン) の終了です。
参照
参考文献
- ^ 「Honeywell 1800 の会社販売マニュアル」(PDF)。
- ^ ARGUS - 自動ルーチン生成および更新システム、アセンブリ言語マニュアル。Honeywell Inc. 1959 年。
外部リンク
- Ascher Opler と Myra Gray (1961)、「マルチプログラム代数コンパイラの設計」(サブスクリプションのみ)
- 自動ルーチン生成および更新システム。HOPL より: プログラミング言語のインタラクティブなリスト。
