

Novaは、アメリカのデータ・ゼネラル社が発売した16ビットミニコンピュータのシリーズである。Novaシリーズは1970年代に非常に人気があり、最終的に数万台を売り上げた。
最初のモデルは単に「Nova」として知られ、1969年に発売されました。[ 1 ] Novaは3Uラックマウントケース1つに収められており、ほとんどの簡単なタスクを処理するのに十分な計算能力を備えていました。Novaは世界中の科学研究所で人気を博しました。翌年にはSuperNOVAが発売され、約4倍の速度で動作し、数年間最速のミニコンピュータとなりました。
集積回路(または「マイクロチップ」)設計が急速に進歩していた時期に登場したこのシリーズは、その後5年間で何度か改良され、800と1200、Nova 2、Nova 3、そして最終的にはNova 4が登場しました。1977年にはシングルチップ実装のmicroNOVAも登場しましたが、市場が新しいマイクロプロセッサ設計に移行したため、広く普及することはありませんでした。フェアチャイルド・セミコンダクターも1977年にNovaのマイクロプロセッサ版であるFairchild 9440を発表しましたが、こちらも市場での普及は限定的でした。
Novaシリーズの後継機種として登場したData General Eclipseは、多くの点でNovaと似ていたものの、仮想メモリのサポートや現代のオペレーティングシステムに必要なその他の機能が追加されていた。Eclipseの32ビット版は、1980年代に登場したEclipse MVシリーズである。
エドソン・デ・カストロは、最初の真のミニコンピュータとして広く知られる12ビットコンピュータである、先駆的なデジタル・イクイップメント・コーポレーション(DEC)PDP-8のプロダクトマネージャーでした。 [ 2 ]彼はまた、個々のトランジスタの代わりに初期の集積回路を使用したアップグレード版PDP-8/Iの設計も主導しました。 [ 3 ]
PDP-8/I の開発中、デ・カストロは、組み立て可能な基板の複雑さを急速に向上させている回路基板メーカーを訪ねていた。デ・カストロは、8/I は大型基板上で完全自動化された組み立てによって製造できると結論付けた。これはわずか 1 年前には不可能だったことである。DEC 内の他のメンバーは、以前のマシンで使用されていた小型基板に慣れており、1 枚の基板上に多数のコンポーネントがある場合の問題の追跡を懸念していた。[ a ] 8/I では、小型基板を維持し、密度をわずかに向上させるために新しい「フリップ チップ」パッケージを使用することが決定された。[ 3 ]
PDP-8 の開発期間中、ASCIIの導入と 1967 年のメジャーアップデートにより、それまでのほとんどの設計のように 6 ビットの倍数ではなく 8 ビットの倍数のワード長を持つ新世代の設計が生まれました。これにより、DEC の現在の 12 ビットおよび 18 ビットのラインナップではなく、16 ビットのワード長で動作するミッドレンジの設計が生まれました。デ カストロは、15 インチ四方のボード 1 枚上に 16 ビットのミニコンピュータ CPU を構築することで、PDP-8 を改良できると確信していました。[ 4 ] [ 5 ]
1967年、デ・カストロは「PDP-X」として知られる新しい設計作業を開始し、いくつかの高度な機能を導入しました。その中には、8ビット、16ビット、32ビットのプラットフォームを構築するために使用できる単一の基本設計が含まれていました。[ 6 ]この作業は、いくつかの詳細なアーキテクチャ文書を作成する段階まで進みました。ケン・オルセンはこのプロジェクトを支持しておらず、12ビットのPDP-8と18ビットのPDP-9に比べて十分な利点がないと感じていました。このプロジェクトは最終的に1968年の春に中止されました。[ 4 ]
PDP-X の中止を受けて、デ・カストロは DEC を辞めて独自のシステムを構築することを検討し始めた。彼だけではなかった。1967 年後半、志を同じくするエンジニアたちがグループを結成し、そのようなマシンを検討した。グループには、部門マネージャーのパット・グリーン、別のハードウェア エンジニアのリチャード・ソッゲ、ソフトウェア エンジニアのヘンリー・バークハート III が含まれていた。[ 7 ] PDP-X とは対照的に、この新しい取り組みは、デ・カストロが PDP-X のコンセプトは小さなスタートアップ企業にはあまりにも野心的すぎると感じていたため、迅速に市場に投入できる単一のマシンに焦点を当てていた。[ 8 ]
DECの他のメンバーと話し合った結果、当初のコンセプトは実装コストの低い8ビットマシンへと発展した。[ 9 ]グループは、 DECとのつながりを通じて他のメンバーを知っていたフェアチャイルド・セミコンダクターのセールスマン、ハーバート・リッチマンと話し合いを始めた。当時、フェアチャイルドは急速に成長しているTTL市場でテキサス・インスツルメンツやシグネティクスと競合しており、より複雑な設計を可能にする新しいファブを導入していた。フェアチャイルドの最新の9300シリーズはチップあたり最大96ゲートまで可能で、これを利用してバイナリカウンタやシフトレジスタなどの4ビットチップを多数実装していた。[ 10 ]
これらの IC を使用することで、CPU の中核となる数学コンポーネントである完全な算術論理演算ユニット(ALU) を実装するために必要な IC の総数を削減し、8 ビット設計から 16 ビットへの拡張が可能になりました。これにより、CPU は 1 枚の15 x 15 インチ (38 cm × 38 cm)のプリント基板から2 枚に拡張する必要がありましたが、このような設計は、より強力で ASCII ベースでありながら、PDP-8/I よりも大幅に安価に製造できました。3 枚目の基板には入出力回路が搭載され、完全なシステムには通常、4 kB のランダムアクセス メモリを搭載した別の基板が含まれていました。完全な 4 枚のカードのシステムは、1 つのラックマウント シャーシに収まりました。[ 5 ]
基板はプリント基板バックプレーンを使用して相互に接続できるように設計されており、手動配線は最小限に抑えられ、すべての基板を自動化された方法で製造することが可能になった。これにより、バックプレーンで配線する必要のある多数の小型基板で構成され、バックプレーン自体もワイヤラップで接続されていたPDP-8/Iに比べてコストが大幅に削減された。また、大型基板構造によりNovaの信頼性が向上し、産業環境や研究室環境で特に魅力的なものとなった。[ 5 ]
新しい設計では、1980年代のRISC設計で再び登場することになるシンプルなロードストアアーキテクチャ[ 4 ]が採用されました。チップに実装されるにつれてフリップフロップの複雑さが急速に軽減されていたため、この設計では、PDPシリーズのような同様の低価格製品に見られる単一のレジスタの代わりに、 4つの汎用アキュムレータを追加することで、ロードストア設計のアドレッシングモードの欠如を補っていました。[ 4 ]
1967年後半、リッチマンはグループをニューヨークを拠点とする弁護士フレッド・アドラーに紹介し、アドラーはシードキャピタルの資金調達のために様々な資金源を探し始めた。1968年までに、アドラーはボストン地域のベンチャーキャピタルファンドのコンソーシアムと大規模な資金調達契約をまとめ、彼らは最初の40万ドルの投資と、生産拡大のための2度目の40万ドルの提供に同意した。デ・カストロ、バークハート、ソッゲはDECを辞め、1968年4月15日にデータ・ジェネラル(DG)を設立した。グリーンは、この事業はリスクが高すぎると考え、彼らに加わらず、リッチマンは同年後半に製品が稼働するまで参加しなかった。[ 5 ]
最初のシステムの開発には約9ヶ月かかり、最初の販売活動はその年の11月に開始されました。幸運なことに、その年の秋の合同コンピュータ会議は12月まで延期されたため、サンフランシスコに動作するユニットを持ち込み、そこでSpacewar!のバージョンを実行することができました。[ 11 ] DGは1969年にNovaを正式に発売し、基本価格は3,995米ドル(2025年換算で35,074ドル)で、「世界最高の小型コンピュータ」として宣伝しました。[ 12 ]基本モデルは箱から出してすぐに使えるほど便利ではなく、8 kW (16 kB )コアメモリの形での RAM は、通常、価格をUS$7,995まで押し上げた。[ 13 ]対照的に、PDP-8/I は4 kW (6 kB)の価格は12,800米ドルだった。[ 14 ]
最初の販売先はテキサスの大学で、チームは手作業で試作品を製作し、2月に出荷した。しかし、当時航空業界でストライキが起きており、機械は届かなかった。彼らは2台目の試作品を送ったが、その時点ではストライキは終了していたため、すぐに届いた。そして5月には最初の試作品もようやく納品された。[ 15 ]
このシステムは最初から成功を収め、6か月後には100台目が販売され[ 16 ]、15か月後には500台目が販売された[ 13 ] 。新バージョンが導入されるにつれて販売は加速し、1975年までに同社の年間売上高は1億ドルに達した[ 17 ]。
ケン・オルセンはDGが失敗すると公言していたが、Novaの発売により、それが起こらないことは明らかになった。この頃には、他の多くの企業も16ビット設計の導入について議論していた。オルセンは、これらが12ビットだけでなく18ビット製品ラインにも脅威を与えると判断し、新たな16ビット設計の取り組みを開始した。[ 18 ]これは1970年にPDP-11として登場したが、Novaと同様にPDP-Xとは全く異なる、はるかに複雑な設計だった。この2つの設計は市場で激しく競合した。[ 4 ]
DECの新システムに関する噂は、Novaの出荷開始直後にDGに伝わった。1970年の春、彼らは開発中のあらゆるマシンを凌駕するために、新しい設計者ラリー・セリグマンを雇った。Novaの設計以来、2つの大きな変化があった。1つは、Signeticsが加算器、XNOR、ANDを組み合わせた4ビットICである8260を発表したことで、基本ロジックを実装するために必要なチップの数が約3分の1に削減された。もう1つは、Intelが半導体ベースのメモリを積極的に宣伝し、1つのチップで1024ビットを実現し、コアメモリよりもはるかに高速で動作すると約束したことである。[ 18 ]
セリグマンの新しい設計は、これら2つの改良点を活用した。まず、新しいICにより、同じ2枚のカード上でALUを16ビット幅まで拡張できるようになり、演算と論理演算を1サイクルで実行できるようになったため、新しい設計は元の設計の4倍の速度になった。さらに、新しい小型のコアメモリを使用することで、サイクルタイムが元の1,200 nsから800 nsに改善され、さらに1/3の性能向上を実現した。コアを読み出し専用メモリに置き換えることで、性能をさらに向上させることができた。コアの読み書きサイクルがないため、300 nsでアクセスでき、劇的 な性能向上を実現できた。[ 16 ]
その結果生まれたマシンはSuperNOVAとして知られ、1970年に発売された。初期モデルはまだコアを使用していたが、設計全体はより高速な半導体メモリが利用可能になり、プラットフォームがそれをフル活用できるという前提に基づいていた。これは同年後半に半導体(SC)メモリを搭載したSuperNOVA SCとして発表された。はるかに高性能なメモリにより、メモリと同期していたCPUの速度をさらに向上させ、300 nsサイクルタイム(3.3 MHz)で動作させることができた。これにより、長年にわたり最速のミニコンピュータとなった。[ 19 ]当初、新しいメモリは非常に高価で発熱も大きかったため、広くは使用されなかった。[ 20 ]

マイクロマトリックスゲートアレイ技術の威力を示すために、フェアチャイルドは1968年にシングルチップ4ビットALUである4711のプロトタイプを製作した。[ 10 ] [ 21 ]この設計は量産を目的としたものではなく、製造コストも非常に高かった。1969年にSignetics 8260が登場したことで、テキサス・インスツルメンツとフェアチャイルドはそれぞれ1970年に4ビットALUである74181と9341を発表せざるを得なくなった。8260とは対照的に、これらの新しい設計は一般的な論理機能をすべて備え、チップ数もさらに削減した。[ 10 ]
これにより、DGはこれらのより集積されたICを使用した新しいCPUの設計を検討するに至った。少なくとも、これによりCPUは基本のNovaまたはSuperNOVAのいずれかのシングルカードに縮小されることになる。CPU回路基板を交換するだけで、単一のシャーシでどちらのマシンも搭載できるという新しいコンセプトが生まれた。これにより、顧客は低価格のシステムを購入し、いつでもアップグレードできるようになる。[ 22 ]
セリグマンがスーパーノヴァの開発に取り組んでいる間、ロン・グルーナーから「御社の製品について読み、広告も読みました。御社で働きたいと思っています。1週間後に御社のオフィスに行って、その件についてお話しさせてください」という手紙が届いた。[ 22 ]彼はその場で採用された。グルーナーは低価格版の機械を担当し、セリグマンはそれに合わせた高性能版を設計した。[ 22 ]
グルーナーの低価格モデルは、1970 年にNova 1200として発売されました。1200 は、オリジナルの Nova の 1,200 ns コア メモリの使用を指しています 。これは、単一の 74181 チップに基づく 4 ビット ALU を特徴としており、したがって、基本的には再パッケージされた Nova でした。セリグマンの再パッケージされた 4 つの ALU を搭載した SuperNOVA は、1971 年にNova 800としてリリースされました。その結果、番号の小さいモデルの方が性能が高いという、やや紛らわしい命名になりました。[ 22 ]両方のモデルはさまざまなケースで提供され、1200 は 7 つのスロット、1210 は 4 つのスロット、1220 は 14 のスロットを備えていました。
この頃には、PDP-11がようやく出荷されていた。PDP-11は、Novaの意図的にシンプルなものよりもはるかに豊富な命令セットアーキテクチャを提供していた。IC設計、特にその価格性能比の継続的な改善により、当初の簡略化された命令の価値は低下していた。セリグマンは、Novaと互換性がありながら、それを求めるユーザーにより豊富な環境を提供する新しいマシンの設計を担当することになった。このコンセプトは、データゼネラルのEclipseシリーズとして出荷され、追加の回路を追加して命令セットを科学計算やデータ処理のワークロードに合わせてカスタマイズできる機能を提供した。Eclipseは、市場のハイエンドでPDP-11と競合することに成功した。[ 23 ]
ほぼ同時期に、DEC から新しい 32 ビット マシンが登場するという噂が流れ始めた。DG は同様の製品が必要だと判断し、グルーナーが後にファウンテンヘッド プロジェクトとなるものの責任者に任命された。プロジェクトの規模を考慮して、彼らはすべての作業を社外で行うことに合意し、グルーナーはノースカロライナ州のリサーチ トライアングル パークに場所を選んだ。この設計は非常に複雑になり[ 24 ]、数年後に最終的に中止された。
こうした取り組みが進められている間も、ノヴァ線の建設工事は継続されていた。
1973年に初めて発売された840には、最大17ビットのアドレスを扱える新しいページングメモリシステムも搭載されていた。インデックスによってベースアドレスがオフセットされ、より大きな128 キロワードのメモリに格納された。実際にこれだけのメモリを搭載するにはかなりのスペースが必要で、840は14スロットの大型ケースに収められて出荷された。
次のバージョンはNova 2で、最初のバージョンは1973年に出荷されました。Nova 2は基本的に以前のマシンの簡略版で、チップ密度の向上によりCPUのサイズを小さくすることができました。SuperNOVAはCPUとそのメモリを実装するために3枚の15×15インチのボードを使用していましたが、Nova 2はこれらすべてを1枚のボードに収めました。ROMはブートコードを格納し、「プログラムロード」スイッチが切り替えられるとコアにコピーされました。4スロット(「2/4」)、7スロット、10スロット(「2/10」)のバージョンが用意されていました。

1975年に登場したNova 3は、内蔵スタックへのアクセスを制御するためのレジスタを2つ追加した。プロセッサもTTLコンポーネントを使用して再実装され、システムのパフォーマンスがさらに向上した。Nova 3は、4スロット版(Nova 3/4)と12スロット版(Nova 3/12)が提供された。
データ・ゼネラル社は当初、Nova 3を自社製品ラインの最終機種とし、Novaを後継のEclipseマシンに置き換える計画だったようだ。しかし、需要が続いたため、 1978年にNova 4が発売された。今回は4つのAMD Am2901ビットスライスALUを搭載していた。このマシンは当初からNova 4とEclipse S/140の両方の機能を持つように設計されており、それぞれに異なるマイクロコードが使用されていた。浮動小数点コプロセッサも用意されており、別のスロットを占有していた。オプションとしてメモリマッピング機能も提供され、バンク切り替えによって最大128kワードのメモリにプログラムがアクセスできた。以前の機種とは異なり、Nova 4にはフロントパネルコンソールは搭載されておらず、代わりに必要に応じて端末がコンソールをエミュレートできるマシンコードを含むROMが搭載されていた。[ 25 ]: 87
Nova 4には、Nova 4/C、Nova 4/S、Nova 4/Xの3つの異なるバージョンがありました。Nova 4/Cは、すべてのメモリ(16または32 キロワード)を含むシングルボード実装でした。Nova 4/Sと4/Xは、別々のメモリボードを使用していました。Nova 4/Xは、オンボードのメモリ管理ユニット(MMU)が有効になっており、最大128 キロワードのメモリを使用できました。MMUはNova 4/Sにも搭載されていましたが、ファームウェアによって無効化されていました。4/Sと4/Xの両方には、必要になる前に最大11個の命令をメモリからフェッチすることでパフォーマンスを向上させる「プリフェッチャ」が搭載されていました。[ 25 ] : 5

データゼネラル社は、 Novaプロセッサのシングルチップ実装であるmicroNOVAシリーズも製造した。40ピンのデュアルインラインパッケージ(DIP)チップに収まるようにするため、アドレスバスとデータバスは16ピンを共有した。そのため、メモリへの読み書きには2サイクルを要し、結果としてマシンはオリジナルのNovaの約半分の速度で動作した。[ 26 ]
シリーズ最初のチップは、1977年のmN601でした。これは、他のユーザー向けのCPU、コンピュータを実装したい人向けの完全なチップセット、4kB のRAMを搭載したシングルボード上の完全なコンピュータ、およびNovaの完全なローエンドモデルとして販売されました。[ 26 ] 1979年のmN602は、この設計のアップグレード版で、チップセット全体を単一のVLSIに縮小しました。これは、 microNOVA MP/100と、より大型のmicroNOVA MP/200の2つのマシンで提供されました。
microNOVAは後に、モニターと2枚のフロッピーディスクを搭載したPCスタイルのケースに再パッケージ化され、 Enterpriseとして発売された。Enterpriseは1981年にRDOSを搭載して出荷されたが、同年IBM PCが登場したことで、他のほとんどのマシンは人々の目から消えていった。 [ 27 ]
Novaは、Xerox Alto(1973年)[ 28 ]とApple I(1976年)[ 29 ]の両方のコンピュータの設計に影響を与え、そのアーキテクチャはComputervision CGP(Computervision Graphics Processor)シリーズの基礎となった。Nova 2の外観デザインは、MITS Altair(1975年)マイクロコンピュータのフロントパネルのインスピレーションとなったと、その設計者の1人であるエド・ロバーツは述べている。
データ・ゼネラルは、初代Novaの成功を受けて、より高速な設計のシリーズを展開しました。後に拡張された上位互換性のある命令セットを備えたEclipseファミリーのシステムが導入され、MVシリーズはEclipseをさらに拡張して32ビットアーキテクチャを採用し、DEC VAXに対抗しました。MVシリーズの開発については、トレーシー・キダーの1981年の人気書籍『The Soul of a New Machine 』に詳しく記されています。データ・ゼネラル自身も後にインテル製プロセッサを搭載したサーバーおよびストレージアレイのベンダーへと発展し、最終的にはEMCに買収されました。
世界中には、オリジナルの16ビットData Generalシステムを復元および保存する、多様だが熱心な人々がいる。[ 30 ] [ 31 ]
NovaはPDP-8とは異なり、ロードストア方式を採用していた。16ビットのアキュムレータレジスタが4つあり、そのうち2つ(2と3)はインデックスレジスタとして使用できた。15ビットのプログラムカウンタと1ビットのキャリーレジスタも備えていた。PDP-8と同様に、現在のページとゼロページのアドレス指定が中心だった。スタックレジスタはなかったが、後のEclipseの設計では、この機能のために専用のハードウェアメモリアドレスが使用されるようになった。
オリジナルの Nova は、単一の Texas Instruments 7483加算器とその他の演算を実行するための追加回路を使用して、4 ビット パケットでシリアルに演算を処理しました。[ 32 ]発売から 1 年後、SuperNova には 4 つの Signetics 8260 IC を使用した完全な 16 ビットビット スライス並列加算器が搭載されました。Nova 1200 も単一の74181 ALUを使用して 4 ビット パケットでシリアルに演算を処理しました。Nova 800 は SuperNova を再パッケージしたものです。
Novaの将来のバージョンでは、スタックユニットとハードウェアによる乗算/除算機能が追加されました。
Nova 4 / Eclipse S/140は、読み出し専用メモリにマイクロコードを持つ4つのAMD 2901ビットスライスALUをベースとしており、磁気コアメモリの機能は備えておらず、DRAMメインメモリのみ用に設計された最初のNovaでした。
アドレス指定および書き込みが可能なメモリの最小単位は16ビットワードであり、バイト単位のアドレス指定はサポートされていません。初期モデルでは、8Kワードの磁気コアメモリがオプションとして用意されていましたが、これは事実上すべてのユーザーが購入せざるを得ないオプションであり、システム価格は7,995ドルにまで上昇しました。
このコアメモリボードは、4つのバンクからなる4つのグループとして平面的に構成されており、各バンクは64×64のマトリックスで2セットのコアを搭載していました。したがって、1セットあたり64×64=4096ビット、2セットで8192ビット、4バンクで32768ビット、4グループで合計131072ビットとなり、これをマシンワードサイズである16ビットで割ると8192ワードのメモリが得られました。
この 8K ワードのメモリボードのコアは、中央に配置された「ボード オン ボード」構造で、幅 5.25 インチ、高さ 6.125 インチであり、保護プレートで覆われていました。コアは、必要なサポートドライバの読み書き書き換え回路で囲まれていました。コアと対応するサポートエレクトロニクスはすべて、1 枚の標準的な 15 x 15 インチ (380 mm) のボードに収まりました。このようなコアRAM は、1 つの外部拡張ボックスで最大 32K までサポートできました。当時すでに半導体ROMが利用可能になっており、RAM レス システム (つまり ROM のみ) が多くの産業環境で普及しました。オリジナルの Nova マシンは、約 200 kHzで動作していましたが、SuperNova は、特殊な半導体メインメモリを使用すると最大 3 MHz で動作するように設計されていました。
標準化されたバックプレーンとI/O信号により、シンプルで効率的なI/O設計が実現し、競合機種と比較して、プログラム可能なI/OデバイスやデータチャネルデバイスをNovaに接続するのが容易になりました。Novaのバックプレーンは、専用のI/Oバス構造に加え、非標準コネクタやその他の特殊な用途に使用できるワイヤラッピングピンを備えていました。
命令フォーマットは、大きく分けて次の3つの機能に分類できます。1 ) レジスタ間操作、2) メモリ参照、3)入出力。各命令は1ワードに収まります。レジスタ間操作は、ビット効率の点でほぼRISCに似ており、レジスタデータを操作する命令は、テスト、シフト、さらには結果を破棄することもできました。ハードウェアオプションには、整数乗算および除算ユニット、浮動小数点ユニット(単精度および倍精度)、およびメモリ管理が含まれていました。

初期のNovaには、パンチテープにBASICインタープリタが付属していました。製品の成長に伴い、データ・ゼネラル社は、さまざまな一貫したオペレーティングシステム上で動作するNovaコンピュータ向けに多くの言語を開発しました。データ・ゼネラル社からは、FORTRAN IV、ALGOL、Extended BASIC、Data General Business Basic、Interactive COBOL 、およびいくつかのアセンブラが提供されていました。サードパーティベンダーとユーザーコミュニティは、 Forth、Lisp、BCPL、C、ALGOL 、およびCOBOLとBASICの独自バージョンを追加することで、提供範囲を拡大しました。
以下に実装されているマシン命令は、Novaシリーズのプロセッサすべてに共通して実装されている命令セットです。特定のモデルでは追加の命令が実装されている場合が多く、一部の命令はオプションのハードウェアによって提供されていました。
すべての算術命令はアキュムレータ間で演算されました。2つのオペランドを必要とする演算では、1つはソースアキュムレータから、もう1つはデスティネーションアキュムレータから取得され、結果はデスティネーションアキュムレータに格納されました。1つのオペランドを必要とする演算では、オペランドはソースレジスタから取得され、結果がデスティネーションレジスタに置き換えられました。すべての1オペランド命令コードにおいて、ソースアキュムレータとデスティネーションアキュムレータが同じであっても、演算は期待どおりに機能しました。
すべての算術命令には「ノーロード」ビットが含まれており、このビットが設定されると、結果が宛先レジスタに転送されなくなります。これは、テストオプションと組み合わせて使用することで、宛先レジスタの既存の内容を失うことなくテストを実行できます。アセンブリ言語では、オペコードに「#」を追加することでノーロードビットが設定されました。
CPUには、算術演算後に最上位ビットの桁上がり値を格納するキャリービットと呼ばれる1ビットレジスタが含まれていました。キャリービットは、命令内の2ビットフィールドを使用して、演算を実行する前に任意の値に設定できました。命令を実行する前に、ビットを設定、クリア、または反転することができました。アセンブリ言語では、これらのオプションはオペコードに文字を追加することで指定されました。「O」はキャリービットを設定する、「Z」はキャリービットをクリアする、「C」はキャリービットを反転する、何も指定しない場合はキャリービットをそのままにします。ノーロードビットも指定されている場合、指定されたキャリー値が計算に使用されますが、実際のキャリーレジスタは変更されません。
すべての算術命令には、シフトオプションを指定するために使用できる 2 ビットのフィールドが含まれており、これは結果が宛先レジスタにロードされる前に結果に適用されます。1 ビットの左シフトまたは右シフトを指定するか、結果の 2 バイトを交換することができました。シフトは 17 ビットの循環シフトで、キャリー ビットは最上位ビットの「左」に位置します。つまり、左シフトを実行すると、結果の最上位ビットがキャリー ビットにシフトされ、キャリー ビットの以前の内容が結果の最下位ビットにシフトされます。バイト交換はキャリー ビットに影響を与えません。アセンブリ言語では、これらのオプションはオペコードに文字を追加することで指定されます。「L」 - 左シフト、「R」 - 右シフト、「S」 - バイト交換、何も指定しない - シフトも交換も実行しません。
すべての算術命令には、演算結果に適用されるテストを指定できる3ビットのフィールドが含まれていました。テストが真と評価された場合、次の命令はスキップされました。アセンブリ言語では、テストオプションは命令の3番目のオペランドとして指定されました。使用可能なテストは次のとおりです。
実際の算術演算命令は以下のとおりでした。
すべてのオプションを使用した算術演算命令の例を以下に示します。
ADDZR # 0、2 、SNCこれは次のようにデコードされます。キャリービットをクリアする。AC2(アキュムレータ2)の内容をAC0に加算する。結果を1ビット右に循環シフトする。結果をテストしてキャリービットがセットされているかどうかを確認し、セットされている場合は次の命令をスキップする。テストを実行した後、結果を破棄する。実質的には、2つの数値を加算し、結果が奇数か偶数かをテストしていることになります。
Novaの命令セットには、メモリの内容をアキュムレータに転送する命令と、その逆を行う命令がそれぞれ1組、制御を転送する命令が2組、メモリ位置の内容をテストする命令が2組含まれていました。すべてのメモリ参照命令には、8ビットのアドレスフィールドと、メモリのアドレッシングモードを指定する2ビットのフィールドが含まれていました。アドレッシングモードは次の4つです。
明らかに、モード 0 は 8 ビットのアドレス フィールドのため、最初の 256 メモリ ワードしかアドレス指定できませんでした。このメモリ領域は「ページ ゼロ」と呼ばれていました。ページ ゼロのメモリ ワードは、利用可能な数が少ないため、Nova アセンブリ言語プログラマにとって貴重なものでした。インデックス アドレス指定に頼らずにプログラムのどこからでもアドレス指定できるのはページ ゼロのアドレスのみで、インデックス レジスタとしてアキュムレータ 2 または 3 を使用する必要がありました。アセンブリ言語では、ディレクティブによって、.ZRELアセンブラはそれに続く命令とデータ ワードをページ ゼロに配置し、ディレクティブによって、それに.NREL続く命令とデータ ワードを「通常の」メモリに配置しました。後の Nova モデルでは、拡張アドレス指定フィールドを持つ命令が追加され、この問題は (パフォーマンスの低下を伴いますが) 解決されました。
アセンブラはモード1の相対オフセットを自動的に計算したが、ソースコードに明示的に記述することも可能だった。メモリ参照命令が.NREL空間内のメモリアドレスを参照しているがモード指定子がない場合、モード1が想定され、アセンブラは現在の命令と参照先の位置との間のオフセットを計算し、その結果の値が8ビットのフィールドに収まる場合に限り、命令のアドレスフィールドに格納した。
2つのロードおよび保存手順は以下のとおりです。
LDA— メモリ位置の内容を、指定されたアキュムレータにロードします。STA指定されたアキュムレータの内容をメモリ位置に格納する。これらの命令はいずれも「間接」ビットを含んでいました。このビットが設定されている場合(アセンブリ言語では@オペコードに を追加することで設定)、ターゲットアドレスの内容はメモリアドレスそのものであるとみなされ、そのアドレスが参照されてロードまたはストアが実行されます。
制御権移転に関する2つの指示は以下のとおりです。
JMP— 指定されたメモリ位置に制御を移しますJSR(「ジャンプサブルーチン」)— 命令と同じ動作をしますJMPが、ジャンプする前に戻りアドレス(JSRインラインで命令の次の命令)をアキュムレータ3にロードします。ロード命令やストア命令と同様に、ジャンプ命令にも間接ビットが含まれており、これもアセンブリ言語では@文字を使用して指定されていました。間接ジャンプの場合、プロセッサはターゲット位置の内容を取得し、その値をジャンプ先のメモリ アドレスとして使用しました。ただし、ロード命令やストア命令とは異なり、間接アドレスの最上位ビットがセットされている場合は、さらに間接参照が繰り返されました。Nova 3 より前の Nova シリーズ プロセッサでは、間接参照の回数に制限はありませんでした。自身を参照する間接アドレスは、無限の間接アドレッシング ループを引き起こし、命令は決して完了しませんでした。(この状態では、フロント パネルの STOP スイッチを押しても何も起こらなかったため、ユーザーにとっては不安な状況でした。ループを解消するには、マシンをリセットする必要がありました。)
2つの記憶力テストの指示は以下のとおりです。
ISZメモリ位置をインクリメントし、結果がゼロの場合は次の命令をスキップする。DSZメモリ位置をデクリメントし、結果がゼロの場合は次の命令をスキップする。ロード命令とストア命令の場合と同様に、間接アドレッシングを1レベル実行する間接ビットがありました。これらの命令は、磁気コアメモリを搭載したNovaでは、メモリボード自体で実行されるという点で特殊でした。当時一般的だったように、メモリボードには、磁気コアメモリに固有の破壊読み出し問題を解決するための「ライトバック」回路が含まれていました。しかし、ライトバック機構には、プロセッサがいくつかの目的で使用したミニ演算ユニットも含まれていました。命令の場合ISZ、DSZインクリメントまたはデクリメントは、読み取られるメモリ位置とライトバックの間で発生し、CPUは結果がゼロかゼロでないかを通知されるのを待つだけでした。これらの命令は、アキュムレータを占有することなくメモリ位置をループカウンタとして使用できるため便利でしたが、同等の算術命令を実行するよりも低速でした。
メモリ参照命令の例をいくつか挙げます。
LDA 1 、カウントラベル1のメモリ位置の内容をCOUNTアキュムレータ1に転送します。 がCOUNT.NREL空間にあると仮定すると、この命令は以下と同等です。
LDA 1 , 1 ,( COUNT - ( . + 1 ))ここで「.」はLDA命令の位置を表します。
JSR @ 0、17ページゼロ領域内の位置17の内容で指定されたメモリアドレスに間接ジャンプし、戻りアドレスをアキュムレータ3に格納します。これは、初期のNovaモデルでRDOSシステムコールを実行する標準的な方法でした。アセンブリ言語のニーモニックは、.SYSTMこの動作に相当します。
JMP 0、3アキュムレータ3に格納されているアドレスのメモリ位置にジャンプします。JSR命令は戻りアドレスをアキュムレータ3に残すため、これは関数またはサブルーチン呼び出しから戻る一般的な方法でした。
STA 0、3 、-1アキュムレータ0の内容を、アキュムレータ3に格納されているアドレスより1つ小さいアドレスに格納する。
DSZカウントラベル のアドレスにある値をデクリメントしCOUNT、結果がゼロの場合は次の命令をスキップします。上記の場合と同様に、 がCOUNT.NREL 空間にあると仮定すると、これは以下と同等です。
DSZ 1 、( COUNT - ( . + 1 ))Novaシリーズは、I/Oデバイスとのインターフェースにチャネル化モデルを採用していました。このモデルでは、各I/Oデバイスは「Busy」と「Done」と呼ばれる2つのフラグと、A、B、Cと呼ばれる3つのデータおよび制御レジスタを備えていることが想定されていました。I/O命令は、レジスタの読み書き、および「start」、「clear」、「pulse」と呼ばれる3つの信号のいずれかをデバイスに送信するために使用できました。一般的に、start信号を送信すると、A/B/Cレジスタに値をロードして設定されたI/O操作が開始されました。clear信号はI/O操作を停止し、発生した割り込みをクリアしました。pulse信号は、ディスクドライブのシーク操作など、複雑なサブシステムの補助操作を開始するために使用されました。ポーリングデバイスは通常、デバイスとAレジスタ間でデータを直接転送しました。DMAデバイスは通常、Aレジスタを使用してメモリアドレスを指定し、Bレジスタを使用して転送するワード数を指定し、Cレジスタを使用して制御フラグを指定しました。チャンネル63はCPU自体を指し、様々な特殊機能に使用されていた。
各I/O命令には、6ビットのチャネル番号フィールド、読み書きするレジスタを指定する4ビットフィールド、および送信する信号を指定する2ビットフィールドが含まれていました。アセンブリ言語では、信号はオペコードに文字を追加することで指定されました。「S」は開始、「C」はクリア、「P」はパルス、何も追加しない場合は信号なしです。オペコードは次のとおりです。
DIAデバイスのAレジスタの内容を指定されたアキュムレータに移動するDOA指定されたアキュムレータの内容を、指定されたチャネル上のデバイスのAレジスタに送信する。DIBデバイスのBレジスタの内容を指定されたアキュムレータに移動するDOB指定されたアキュムレータの内容を、指定されたチャネル上のデバイスのBレジスタに送信する。DICデバイスのCレジスタの内容を指定されたアキュムレータに移動するDOC指定されたアキュムレータの内容を、指定されたチャネル上のデバイスのCレジスタに送信する。NIO—「I/Oなし」という名称は誤称である。この命令は、レジスタ転送を行わずにデバイスに信号を送信するために使用された。さらに、デバイスの状態をテストするための手順が4つ用意されていました。
SKPBNデバイスのビジーフラグが設定されている場合は、次の命令をスキップする。SKPBZデバイスのビジーフラグがクリアされている場合は、次の命令をスキップする。SKPDNデバイスの完了フラグが設定されている場合は、次の命令をスキップする。SKPDZデバイスの完了フラグがクリアされている場合は、次の命令をスキップする。デバイスの起動により、ビジーフラグが設定されます。要求された操作が完了すると、通常、デバイスはビジーフラグをクリアし、完了フラグを設定します。ほとんどのデバイスでは、割り込み要求メカニズムが完了フラグに接続されているため、完了フラグを設定すると割り込みが発生します(割り込みが有効で、デバイスがマスクされていない場合)。
これらの命令は、様々なCPU制御機能とステータス機能を実行した。実際には、それらはすべて、CPUの自己参照型I/Oチャネルであるチャネル63上のI/O命令の略記ニーモニックであった。
INTA— 割り込み応答。割り込み発生デバイスのチャネル番号を指定されたアキュムレータに転送しました。INTDS— すべての割り込みを無効にしますINTEN— すべての割り込みを有効にするIORST— I/Oリセット。I/Oバスにリセット信号を送信し、すべてのI/Oを停止し、割り込みを無効にし、保留中の割り込みをすべてクリアしました。MSKO— マスク出力。指定されたアキュムレータの内容を使用して割り込みマスクを設定します。マスクの解釈方法は、各I/Oデバイスの実装に依存します。一部のデバイスではマスクが使用できませんでした。READS前面パネルの16個のデータスイッチの内容を、指定されたアキュムレータに転送した。HALT―CPUが停止した。一度停止したCPUは、前面パネルからの手動操作によってのみ再起動できた。ハードウェアの観点から見ると、割り込みメカニズムは比較的単純でしたが、現在のCPUアーキテクチャに比べて柔軟性に欠けていました。バックプレーンは単一の割り込み要求ラインをサポートしており、割り込み可能なすべてのデバイスがこれに接続されていました。デバイスが割り込みを要求する必要があるときは、このラインを上昇させました。CPUは、現在の命令の処理が完了するとすぐに割り込みを受け付けました。前述のように、デバイスは割り込みを要求する際に「完了」I/Oフラグを上昇させることが期待されており、慣例として、CPUがデバイスのチャネル番号に対してI/Oクリア命令を実行すると、デバイスは割り込み要求をクリアすることになっていました。
CPUは、オペレーティングシステムが割り込みサービスルーチンのアドレスをメモリアドレス1に配置することを想定していました。デバイスが割り込みを発生させると、CPUはアドレス1を経由して間接ジャンプを行い、戻りアドレスをメモリアドレス0に配置し、それ以上の割り込みを無効にしました。その後、割り込みハンドラは、INTA割り込みを発生させたデバイスのチャネル番号を検出する命令を実行しました。これは、バックプレーン上で「確認」信号を発生させることで実現されました。確認信号はバックプレーン全体にデイジーチェーン形式で配線され、バス上の各ボードをループするように構成されていました。割り込みを要求するデバイスは、バス上での確認信号のさらなる伝播をブロックすることが想定されていたため、2つ以上のデバイスが同時に保留中の割り込みを抱えている場合、最初のデバイスのみが確認信号を受け取りました。そのデバイスは、バス上のデータラインにチャネル番号を配置することで応答しました。つまり、同時割り込み要求が発生した場合、優先順位はカードケージ内でCPUに物理的に最も近いデバイスによって決定されました。
オペレーティングシステムの割り込みサービスルーチンは、通常、受信したチャネル番号を使用してインデックス付きジャンプを実行し、デバイス固有の割り込み処理ルーチンにジャンプします。CPUの電源障害検出回路など、命令に応答しないデバイスがいくつかありましたINTA。結果がゼロを返した場合、割り込みサービスルーチンは/INTA命令を使用して、INTA に応答しないすべてのデバイスをポーリングし、どのデバイスが割り込みを発生させたかを確認する必要がありました。SKPDZSKPDN
割り込みが処理され、サービスルーチンがデバイスに I/O クリアを送信した後、割り込みを有効にしてメモリ アドレス 0 を経由する間接ジャンプで戻ることで、通常の処理を再開しましたJMP@ 0。保留中の割り込みが戻りジャンプの直前に割り込むこと(戻りアドレスが上書きされる原因となる)を防ぐため、このINTEN命令には 1 命令サイクルの遅延がありました。INTENが実行されると、次の命令が実行されるまで割り込みは有効になりません。その次の命令は 命令であると想定されていましたJMP@ 0。
オペレーティングシステムは、命令を使用して割り込みマスクを設定することで、割り込みの順序をある程度管理することができましたMSKO。これは、オペレーティングシステムが特定の時間にどのデバイスが割り込みを許可されるかを決定できるようにすることを目的としていました。この命令が発行されると、16ビットの割り込みマスクがバックプレーン上のすべてのデバイスに送信されました。マスクが実際にデバイスにとって何を意味するかは、デバイス自身が決定する必要がありました。慣例として、マスクされたデバイスは割り込みラインを上げないことになっていましたが、CPUにはこれを強制する手段はありませんでした。マスク可能なほとんどのデバイスでは、ボード上のジャンパーを介してマスクビットを選択できました。マスクを完全に無視するデバイスもありました。
磁気コアメモリ(電源が供給されていなくても内容を保持するメモリ)を搭載したシステムでは、停電からの復旧が可能でした。CPU内の停電検出回路は、コンピュータへの主電源の喪失を検出すると割り込みを発行しました。この時点から、電源装置のコンデンサが放電してCPUへの電源供給が停止するまでの短い時間がありました。この時間内に、進行中のI/O処理を停止しIORST、4つのアキュムレータの内容とキャリービットをメモリに保存することができました。電源が復旧すると、CPUのフロントパネルのキースイッチがLOCKの位置にある場合、CPUは起動し、メモリアドレス2への間接ジャンプを実行しました。これは、アキュムレータとキャリービットを再ロードし、通常の処理を再開するオペレーティングシステムのサービスルーチンのアドレスであると想定されていました。停電によって中断されたI/O操作を再開する方法は、このサービスルーチンが判断する必要がありました。

当時の慣例に従い、ほとんどの Nova モデルには CPU 機能を制御および監視するためのフロント パネル コンソールが備えられていました。Nova 3 より前のモデルはすべて、右側の Nova 840 パネルの写真に示すように、標準的なフロント パネル レイアウトを採用していました。このレイアウトには、キー付き電源スイッチ、アドレスおよびデータ表示ランプの 2 列、データ入力スイッチの 1 列、および押すとさまざまな CPU 機能をアクティブにする機能スイッチの 1 列が含まれていました。アドレス ランプは常にプログラム カウンタの現在の値をバイナリで表示していました。データ ランプは、その時点でアクティブになっている CPU 機能に応じてさまざまな値を表示していました。最も左のデータ ランプの左側には、キャリー ビットの現在の値を表示する追加のランプがありました。ほとんどのモデルでは、ランプはパネル ボードにはんだ付けされた白熱電球でした。切れたランプの交換は、データ ゼネラルのフィールド サービス エンジニアにとって悩みの種でした。
各データスイッチは16ビット値のうち1ビットの値を制御し、データゼネラル社の慣例に従い、左から右へ0~15の番号が振られていました。データスイッチは様々な機能のためにCPUへの入力を提供し、実行中のプログラムがREADSアセンブリ言語命令を使用して読み取ることもできました。パネルの煩雑さを軽減し、コストを削減するために、機能スイッチは双方向モーメンタリスイッチとして実装されました。機能スイッチのレバーを持ち上げると、パネル上のスイッチの上に表示されている機能が有効になり、レバーを押し下げると、スイッチの下に表示されている機能が有効になりました。スイッチレバーは放すと元の位置に戻りました。
Nova 840の写真を参照すると、左から4つのスイッチは、4つのアキュムレータに対してEXAMINE機能とDEPOSIT機能を実行していました。これらのスイッチのいずれかのEXAMINEボタンを押すと、アキュムレータの現在の値がデータランプによってバイナリ形式で表示されました。DEPOSITボタンを押すと、データスイッチの現在の設定値で表されるバイナリ値がアキュムレータに転送されました。
右に進むと、次のスイッチはRESET/STOPスイッチでした。STOPを押すと、CPUは現在の命令の実行を終えた後、停止します。RESETを押すと、CPUは即座に停止し、CPU内部レジスタの一部をクリアし、接続されているすべてのデバイスにI/Oリセット信号を送信します。その右隣のスイッチはSTART/CONTINUEスイッチでした。CONTINUEを押すと、CPUはプログラムカウンタが現在指している命令から実行を再開します。STARTを押すと、データスイッチ1~15に現在設定されている値がプログラムカウンタに転送され、そこから実行が開始されます。
次の 2 つのスイッチは、フロント パネルからメモリへの読み書きアクセスを提供しました。EXAMINE を押すと、データ スイッチ 1~15 に設定された値がプログラム カウンタに転送され、対応するメモリ位置から値が取得され、データ ランプにその値が表示されました。EXAMINE NEXT を押すと、プログラム カウンタがインクリメントされ、そのメモリ位置に対して検査操作が実行され、ユーザーは一連のメモリ位置を順に調べることができました。DEPOSIT を押すと、データ スイッチに含まれる値がプログラム カウンタが指すメモリ位置に書き込まれました。DEPOSIT NEXT を押すと、まずプログラム カウンタがインクリメントされ、次に指すメモリ位置に書き込まれました。
INST STEP関数は、CPUに現在のプログラムカウンタ位置で1つの命令を実行させた後、停止させるものでした。命令の実行中にプログラムカウンタがインクリメントされるため、ユーザーはプログラムを1ステップずつ実行できました。MEMORY STEP(誤称)は、CPUに1クロックサイクルだけ実行させた後、停止させるものでした。これはユーザーにとってほとんど役に立たず、一般的には現場のサービス担当者が診断のためにのみ使用していました。
プログラム ロードは、通常 Nova の起動に使用されるメカニズムでした。このスイッチがトリガーされると、32 ワードのブート ROM がメモリの最初の 32 ワードにマッピングされ、プログラム カウンタが 0 に設定され、CPU が起動しました。ブート ROM には、選択された I/O デバイスから 256 ワード (512 バイト) のコードをメモリに読み込み、その後、読み込まれたコードに制御を移すコードが含まれていました。データ スイッチ 8 ~ 15 は、ブート ROM にどの I/O チャネルから起動するかを指示するために使用されました。スイッチ 0 がオフの場合、ブート ROM はデバイスがポーリング デバイス (紙テープ リーダーなど) であると想定し、512 バイトが読み込まれるまでポーリング入力ループを実行します。スイッチ 0 がオンの場合、ブート ROM はデバイスが DMA 対応デバイスであると想定し、DMA データ転送を開始します。ブート ROM は、転送を開始する前にデバイスの位置を特定するほど賢くはありませんでした。これは、クラッシュ後に再起動する場合に問題となりました。ブートデバイスがディスクドライブの場合、ヘッドはランダムなシリンダーに留まっている可能性が高かった。ブートシーケンスを機能させるには、ヘッドをシリンダー0(RDOSが第1レベルのブートブロックを書き込んだ場所)に再配置する必要があった。従来は、ドライブをロードシーケンスで順番に実行することでこの処理を行っていたが、待ち時間(ドライブの機種によっては最大5分)に不満を感じたユーザーは、フロントパネルからドライブの「再調整」I/Oコードを入力し、CPUを1ステップ実行させる方法を習得した。熟練したユーザーであれば、この操作はわずか数秒で完了した。
電源スイッチは、OFF、ON、LOCKの3つの位置があるキー付きスイッチでした。OFFの位置では、CPUへの電源供給がすべて遮断されます。キーをONに回すと、CPUに電源が供給されます。ただし、現在のCPUとは異なり、電源投入時にCPUが自動的に起動することはありませんでした。ユーザーは、PROGRAM LOADなどの方法を使用してCPUを起動し、ブートシーケンスを開始する必要がありました。スイッチをLOCKに回すと、フロントパネルの機能スイッチが無効になります。スイッチをLOCKに回してキーを抜くことで、CPUを不正操作から保護することができました。磁気コアメモリを搭載したシステムでは、LOCKの位置で自動電源障害復旧機能も有効になりました。キーはOFFまたはLOCKの位置で取り外すことができました。
Nova 1200 はコアメモリアクセス命令 (LDA および STA) を 2.55 マイクロ秒 (μs) で実行しました。読み出し専用メモリの使用により 0.4 μs 短縮されました。アキュムレータ命令 (ADD、SUB、COM、NEG など) は 1.55 μs、MUL は 2.55 μs、DIV は 3.75 μs、ISZ は 3.15-4.5 μs かかりました。[ 33 ]後期の Eclipse MV/6000 では、LDA および STA は 0.44 μs、ADD などは 0.33 μs、MUL は 2.2 μs、DIV は 3.19 μs、ISZ は 1.32 μs、FAD は 5.17 μs、FMMD は 11.66 μs かかりました。[ 34 ]
これはNovaアセンブリ言語による最小限のプログラミング例です。RDOS上で動作するように設計されており、コンソールに「 Hello, world. 」という文字列を出力します。
; RDOS を実行する Nova 用の「ハローワールド」プログラム; PCHAR システムコールを使用.titl hello .nrel .ent startstart: dochar: lda 0 , @ pmsg ; ac0 に次の文字をロードmov# 0 , 0 , snr ; ac0 をテスト; ゼロ以外ならスキップ (結果をロードしない) jmp done .systm .pchar ; 最初の文字を出力jmp er ; OK ならスキップmovs 0 , 0 ; バイトをスワップ.systm .pchar ; 2 番目の文字を出力jmp er ; OK ならスキップisz pmsg ; 次の文字を指すjmp dochar ; もう一度繰り返す完了: .systm ; 正常終了.rtn er: .systm ; エラー終了.ertn haltpmsg: . + 1 ; 文字列の最初の文字へのポインタ; デフォルトではバイトは右から左にパックされます; <15><12> は CR LF ペアを示します。.txt / Hello , world. < 15 >< 12 >/ 0 ; 文字列の終了を示すフラグワード.end startNova の基本モデルには、価格競争力を維持するために、ハードウェアの乗算および除算機能が内蔵されていませんでした。次のルーチンは、2 つの 16 ビット ワードを乗算して 16 ビット ワードの結果を生成します (オーバーフローは無視されます)。これは、ALU 演算、シフト、およびテスト (スキップ) の組み合わせ使用を示しています。このルーチンが によって呼び出されるとjsr、AC3 にリターン アドレスが保持されることに注意してください。これは、リターン命令で使用されますjmp 0,3。アキュムレータをクリアする慣用的な方法は ですsub 0,0。他の単一の命令は、特定の便利な定数のセット (たとえば、-2、-1、または +1) をロードするように構成できます。
mpy: ; AC0 <- AC1 * AC2 を乗算します (Toby Thain 著)sub 0 , 0 ; 結果mbit をクリア: movzr 1 , 1 , szc ; 乗数をシフトし、最下位ビットをテストadd 2 , 0 ; 1: 被乗数を加算movzl 2 , 2 , szr ; シフトしてゼロをテストjmp mbit ; ゼロでない場合は、別のビットを実行jmp 0 , 3 ; 戻る次のルーチンは、AC1 の値を 16 桁のバイナリ数としてRDOS コンソールに出力します。このルーチンは、Nova 命令セットのさらなる癖を明らかにします。たとえば、任意の「即値」をアキュムレータにロードする命令はありません (ただし、メモリ参照命令は、そのような値をエンコードして実効アドレスを形成します)。アキュムレータは、一般的に初期化されたメモリ位置 (例: ) からロードする必要があります。PDP -11n16などの他の同時代のマシンや、事実上すべての最新のアーキテクチャでは即値ロードが可能ですが、 ARMなど多くのアーキテクチャでは、即値としてロードできる値の範囲が制限されています。
RDOS.systmコール マクロは を実装しているためjsr、AC3 は関数の戻りアドレスで上書きされます.pchar。したがって、この関数の呼び出し元の戻りアドレスを保持するために一時的な場所が必要です。再帰的または再入可能なルーチンの場合、スタック (利用可能な場合はハードウェア、利用できない場合はソフトウェア) を使用する必要があります。戻り命令は となり、jmp @ retrnNova の間接アドレッシング モードを利用して戻り PC をロードします。
末尾の定数定義は、アセンブラの 2 つの機能を示しています。アセンブラの基数はデフォルトで8 進数( 20= 16) であり、文字定数は のようにエンコードできます"0。
pbin: ; AC1を16桁のバイナリとしてコンソールに表示する(Toby Thain著)sta 3 , retrn ; 戻りアドレスを保存lda 2 , n16 ; ビットカウンタを設定loop: lda 0 , chr0 ; ASCII '0' をロードmovzl 1 , 1 , szc ; キャリーの次のビットを取得inc 0 , 0 ; '1' にバンプ.systm .pchar ; AC0-2 を保持jmp err ; エラーの場合inc 2 , 2 , szr ; カウンタをバンプjmp loop ; ゼロでない場合は再度ループlda 0 , spc ; スペースを出力.systm .pchar jmp err ; エラーの場合jmp @ retrnspc: " ;これはスペースですchr0: "0 n16: -20 retrn: 0モントリオールのカナダ放送協会(CBC)は、1980年代後半までチャンネル再生自動化システムにNova 1200を使用していた。その後、改修済みのNova 4ユニットに置き換えられ、これらは1990年代半ばまで使用された。