シティ&ギルズ・ニーモニック・コードとその関連ソフトウェアであるシティ&ギルズ・コンピュータは、アセンブラ言語とそれを実行する仮想コンピュータシステムの仕様でした。これは1964年にロンドンのシティ&ギルズ協会によって導入され、数多くのコンピュータプログラミングおよび管理コースの基礎として使用されました。コンピュータモデルは意図的に非常にシンプルに設計されており、オペレーティングシステムはICL 1900シリーズやElliot 900ファミリーなどのメインフレームコンピュータ上でインタプリタとして実装されました。1968年には改訂版がリリースされました。
シティ・アンド・ギルズ・オブ・ロンドン・インスティテュート(C&G)は、19世紀後半から多種多様な職業訓練および見習いプログラムを提供してきました。1960年代初頭、最初のコンピュータシステムが大企業で急速に普及し始め、C&Gはコンピュータの操作とプログラミングに関する一連のプログラムを導入することを決定しました。[ 1 ]
City & Guilds Mnemonic Code は、プラットフォーム間の広範な非互換性の問題に対処するため、十分な性能を持つあらゆるプラットフォーム上の仮想マシンで解釈可能な単一の新しいアセンブラ言語を導入しました。このシステムは、実行可能なマシンの数をできるだけ多くするために意図的に簡素化されました。また、標準データ形式が浮動小数点であることや、 BASICのような高水準言語で通常期待される高度な数学や文字列処理のための多くの機能など、通常アセンブラに関連付けられない多くの機能も追加されました。[ 1 ]
最初のリリースは1964年で、コンピュータ担当者向けの基礎および上級資格の2つのコースで使用されました。このシステムは1968年に改訂版ニーモニックコードとして更新され、その時点で基礎コースはコンピュータプログラミングおよび情報処理の資格となりました。[ 1 ]
仮想コンピュータは、その基本データ型が浮動小数点数であった点で異例であった。[ 2 ]実際の機械の大部分はバイナリ整数を使用しており、当時のビジネス向け機械ではバイナリ符号化十進数を使用していた。メモリからのデータ読み込みやビットシフトなど、ほとんどのアセンブラに見られる低レベルコマンドに加えて、C&Gには乗算と除算、指数や三角関数などのより高度な機能も含まれていた。メモリ位置は、代わりに1文字を保持できた。[ 2 ]
コンピュータは、1,000 ワードのメイン メモリを持つように定義されていました。最初の 10 個のアドレスはインデックス レジスタとして使用できましたが、特別な意味も持っていました。位置 0 は値 0 に永久的に設定され、1 はアキュムレータ、4 はサブルーチン呼び出し中の戻りアドレスを保持していました。改訂版では、5 は命令とともに使用されLOP、6 と 7 は命令を使用して文字から数値に変換する際のフォーマットを指定するために使用されましたCNC。[ 2 ] [ 3 ]
このマシンはアキュムレータ設計でした。ほとんどの命令は、nとmと呼ばれるメインメモリを指す2つのオペランドを受け取ります。nは通常0から999までの12ビット値であり、mは0から9までのレジスタのいずれかを選択します。そのレジスタの値はnに加算され、完全なアドレスが生成されます。たとえば、ADD命令は2つのオペランドを読み込み、選択されたレジスタmの値を定数値nに加算し、結果として得られたメモリ位置(Cと呼ばれる)にある値にアクセスします。[ 4 ]
ドキュメントでは、問題の値がメモリ位置から読み取られた場合は括弧で示されていたため、ほとんどの命令は n+(m) の形式で、レジスタ/メモリ位置 m の値が定数 n に加算されることを意味します。加算はA = A + (n+(m))、レジスタ m の値が定数 n に加算され、その結果のメモリ位置 (n+(m)) の値がアキュムレータに既にある値に加算されるという演算を実行します。[ 3 ]
このシステムはASCIIが標準化される前に作成され、当時のマシンによく見られたように、独自のカスタム文字セットを使用していた。これは、0から9の位置に0から9、10から35の位置にAからZ、そして多数の記号を格納し、合計64文字であった。[ 5 ] [ 6 ] [ a ]
システムにはコードコメントを組み込む機能がなかった。また、シンボルラベルもなかったので、プログラムが行を追加または削除した場合、プログラマは分岐の位置を手動で更新する必要があった。[ 3 ]
ニーモニックコードの命令は、基本的な数学演算と論理演算(ほとんどのアセンブリ言語とよく似ている)、追加の数学演算、および入出力演算の 3 つの大まかなカテゴリに分類できます。興味深い追加要素の 1 つは、「クエリ」を意味する「Q」で、これは任意の命令の先頭に追加できます。Q が検出されると、インタプリタは命令を実行し、デバッグ情報をプリンタに出力します。[ 3 ]
バージョンに応じて、指示は内部的に以下の形式で保存されていました。
FF [Q] nnn m
FFは「オーダー番号」であり、数値命令のオペコードでした。Qはクエリ機能を示し、nnnとmはnとmを表す3桁と1桁の値でした。数値は10進数形式で入力されました。[ 3 ]
システムは、整理の目的で、基本的な算術演算と論理演算をいくつかのグループに分割しました。特に指定がない限り、リストはElliot 903のドキュメントからのものです。[ 7 ]
グループ0、アキュムレータ/メモリ操作:
グループ 1、アキュムレータ/定数演算、単一のオペランドは整数値を保持します。元の仕様では n のみが使用されていましたが、1968 年の改訂では、m をオプションで指定して、その値を n の定数に追加することができます。[ 3 ]
グループ2、ストアバリュー:
グループ3、テストと分岐:
改訂版では、一部のコードが変更され、新しいコードが追加されました。このセクションのリストは、ICL ドキュメントからのものです: [ 8 ]
LOP命令はループを実装するために使用されます。レジスタ5に反復回数を設定することで、LOPは毎回その値をデクリメントし、ループの先頭に戻ります。[ 8 ]
グループ4は標準的な数学関数のセットです: [ 9 ]
グループ 5、6、7 は入出力命令です。既知の 2 つのバージョン、ICL と Elliot の間には大きな違いがありますが、これらの違いが Elliot バージョンが以前の仕様であることによるものか、それともマシンがテープとディスクをサポートしていないため、それらのデバイスに関連する命令が単純に削除されていることによるものかは明らかではありません。結果として、比較的限られた機能セットになっています。[ 10 ] [ 3 ]
対照的に、1968 年仕様に準拠した ICL バージョンは、はるかに柔軟性があります。そのコンピュータは、さまざまなデバイスに接続できる単一の入力チャネルと単一の出力チャネルを備えていました。定義されたデバイスは 5 つあり、10 は紙テープリーダー、30 はカードリーダー、50 は磁気テープ、60 はディスクパック、80 はプリンタでした。[ 11 ]デバイスのいずれかを使用するには、読み取りまたは書き込みそれぞれに対して、目的のデバイス番号 (n+(m)) を指定して、ARD n, mまたはAWD n, m命令を呼び出しました。[ 12 ]
一度開くと、さまざまな I/O 命令を使用してデバイスを読み書きすることができました。これには、数値と文字の個別の命令、両者を変換する命令、およびライン フィードを出力したりテープを巻き戻したりするなどの特定の操作のためのさまざまなその他の命令が含まれていました。[ 11 ]重要な機能は、「ブロック」の概念でした。これは、一度にすべて読み取られる関連データのグループです。これは通常、単一の命令で文字列を読み書きするために使用されました。ブロックは £、ブロック文字として知られる文字で終わります。[ 13 ] [ 3 ]
システムの主要な目標は、さまざまな実世界のデバイスにデータを読み書きすることであったため、コードには、読みやすいテキストを出力する作業を容易にするために、 printf フォーマット文字列に似たフォーマットシステムが含まれていました。フォーマットは、ほとんどの命令では n+(m) のメモリに値として格納され、出力位置を定義するために n+(m) を使用する CNC 命令では、位置 6 と 7 に格納されます。基本的なフォーマットは 4 つあり、すべて先頭にスペースとプラスまたはマイナスの記号で始まります。[ 14 ]
機械語命令に加えて、この言語には少数の指示も含まれていました。[ 15 ] [ 16 ] [ 3 ]
ニーモニックコードに加えて、コンピュータはBASIC言語のような基本的なオペレーティング環境も定義しました。これにはLOADとSAVE、入力または出力デバイスをリダイレクトするON、実行を開始するGOが含まれていました。[ 17 ]
PNTこの例はハーバートによるもので、円周率を計算して出力します。Elliot 903 用に書かれたこのコードは、パンチテープに出力する以前の I/O コマンドを使用しています。 [ 18 ]
(タイトル) 簡単なテスト (店舗12) LDAN 1 ARC 16 MLTN 4 PNT 1,6 日本標準時 (実行12)
GOこのプログラムを以下のコマンドで実行すると、次の出力が得られます。
簡単なテスト 3.141593