この記事には複数の問題があります。改善にご協力いただくか、トークページでこれらの問題について議論してください。(これらのメッセージを削除する方法とタイミングについてはこちらをご覧ください)
|
ARGUSはAutomatic Routine Generating and Updating Systemの略称で、[1] 1950年代後半にHoneywell社がHoneywell 800および1800コンピュータ 用に考案したアセンブリ言語である[2] 。
他のアセンブリ言語と同様に、ARGUSの各行は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,がマークされていない行から離して配置されます。これらの行は、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の各行はメモリ内の1ワードを定義します。通常の動作では、プロセッサは各コマンドをアドレス順に実行します。一部のコマンドは、別のアドレスへのジャンプ(同一バンクへの直接アドレス指定)を指示できます。
算術
コマンド WA、BA、DA はすべて異なる方法でアドレス A と B から数値を取得し、それらを合計して結果をアドレス C に格納します。
コマンド BS と DS はどちらも、アドレス A の数値からアドレス B の数値を減算し、その結果をアドレス C に格納します。
WA(ワード加算)は、2つの入力値を符号なしの2進数として扱います。これは、既知のアドレスに増分を加算するためによく使用されました。
BA と BS (バイナリ加算とバイナリ減算) は、2 つの入力数値を符号付きバイナリとして扱います。
DA と DS (10 進加算と 10 進減算) は、2 つの入力数値を符号付き 10 進数として扱います。
左端の4ビットは符号を定義します。すべてゼロの場合、符号は正、それ以外の場合は負です。
DMコマンドは、アドレスBの数値とアドレスAの数値を乗算し、結果の左半分をアドレスCに格納します。残りの下位桁はLOP(Low Output Register)に保持されます。これらの桁は、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 が使用されました。
10進数 パンチされた文字または数字は4ビットの10進コードに変換されます。16進数に似ていますが、有効なのは0から9までです。
ALF パンチされた文字または数字は、英数字、文字、記号の Honeywell 独自のバイナリ コードに従って変換されます。
M,x,text に加え、各アドレスフィールドに x,text の個別のエントリが含まれます。ここで、x は O、H、D、または A のいずれかであり、ワードの各12ビットセクションを上記のいずれかの方法でエンコードできます。
OCT、HEX、DEC の場合、左端の 4 ビットは数値の符号を示すために使用されます。
マスクとスイッチコマンド
マスクは、M,マスク名という位置エントリを持つ定数でした。ARGUSでは、すべてのマスクをまとめて格納するのが良い習慣でした。いずれにせよ、ARGUSはそれらを連続したワードにまとめて格納しました。マスクの最大数は15でした。
マスクは、ワードの値を変更できるコマンドの動作を変更するために使用できます。例えば、TX,maskname は、マスク「maskname」をTXコマンドに適用します。マスクはスイッチワードコマンドには不可欠ですが、他のコマンドではあまり意味がありません。一部のシステムでは、スイッチワードにのみマスクを使用するという標準がありました。最初のマスクの完全なアドレスはMSKレジスタに格納され、個々のマスクのオフセットは、指定されたマシン語コマンドのコマンドセクションに格納されます。したがって、プログラムに必要なマスクは1セットのみで、どのセグメントからでも使用できます。
スイッチワードコマンドは、ワード内の一部のビットを他のビット位置に移動するために使用されました。スイッチワードコマンドは2種類あり、非常によく似ています。スイッチワードコマンドと抽出コマンドは、SWE,masknameというARGUSコマンドを使用します。Aアドレスはソースアドレス、Cアドレスはデスティネーションアドレスです。Bアドレスフィールドは、スイッチの量(x,n,d)を指定します。xはB、D、Aのいずれかで、それぞれ1ビット、4ビット、6ビット単位の2進数、10進数、英数字を表します。dはLまたはRで、左または右を表します。
運用中:
ワードはアドレスAから取得され、指定された単位の数とサイズだけビットが左または右に移動された。端から「落ちた」ビットは反対側の端に戻された。シフトされたワードはビットごとにマスクを通過した。マスクビットが1の場合、シフトされたビットがそのままコピーされ、それ以外の場合は0のビットが渡された。変更されたワードはアドレスCに配置された。
もう一つのスイッチワードコマンドは、同じ構文を持つスイッチワード・スーパーインポーズ(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サブルーチンを使った例です。
| 位置 | 指示 | 住所A | 住所B | 住所C |
|---|---|---|---|---|
| U、NEWPROG | マイプログ | |||
| R、 | ||||
| R、メインプログラム開始 | ||||
| R、R カンマは、その行をコメント行として定義します。 | ||||
| R、 | ||||
| ……。 | ||||
| ……。 | ||||
| R、TS コマンドはサブルーチン SUBA にジャンプします。次の位置はレジスタ SH に格納されます。 | ||||
| TS | - | - | スバ | |
| R、サブルーチンはここに戻ります。 | ||||
| ワシントン州 | …… | |||
| .... | ||||
| .... | ||||
| R、メインプログラムはここで終了します。サブルーチンを開始できます。 | ||||
| R、 | ||||
| R、サブルーチン SUBA | ||||
| R、 | ||||
| R、サブルーチンはシーケンス履歴レジスタ (SH) の内容を保存することによって開始する必要があります。 | ||||
| R、そうしないと、別の TS、NA、または LA コマンドによって失われる可能性があります。 | ||||
| R、 | ||||
| スバ | テキサス州 | Z、SH | – | Z,R0 |
| R、サブルーチンプロセス開始 | ||||
| ......... | ||||
| R、サブルーチン プロセスが完了したので、保存された場所に移動してメイン プログラムを続行します。 | ||||
| TS | - | - | N,R0 | |
| R、SUBAの終わり | ||||
もう一方のタイプのサブルーチンは、マクロラッパーを使用して機械語で提供されました。これは通常、Honeywellのスタッフによって作成されました。マクロはGOSUBコマンドを使用してサブルーチンを呼び出しました。
浮動小数点コマンド
Honeywell 1800には、科学計算用のオプションの浮動小数点アダプタが搭載されていました。そのためのコマンドセットが用意されていました。ハードウェアにアダプタが搭載されていない場合は、これらのコマンドをシミュレーション形式でも利用できましたが、通常の使用には推奨されませんでした。ARGUSの浮動小数点コマンドは、アダプタの有無に関わらず同じでした。アダプタが搭載されていない場合は、ARGUSは真の浮動小数点演算を機械語でシミュレーションします。
周辺機器の入出力制御
マシンレベルでの入出力デバイスアドレスは、0~7の2桁の8進数でした。ARGUSレベルでは、2桁の文字(AG)でした。最初の桁はコントローラを識別し、2桁目はそのコントローラ上のデバイス番号を識別しました。
テープ処理において、テープ上のデータの単位は、ハネウェル社のマニュアルではレコードと呼ばれていました。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つのバッファを使用するのが一般的でした。これはダブルバッファリングと呼ばれます。コアメモリが限られていたため、バッファサイズは「レコード」(ブロック)のサイズを制限する要因でした。
レコードをテープに書き込む準備段階では、各項目は規定のコードを持つ項目終了ワードで終了する。各レコードは、エラーチェック用の直交ワードとそれに続くレコード終了ワードで終了する。出力バッファに項目が書き込まれた後、Compute Ortho (CC) コマンドを使用して直交ワードを計算し、レコード終了ワードを生成する。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より:インタラクティブなプログラミング言語一覧。