WD16

ウエスタンデジタル WD16
S-100バスに接続するアルファマイクロシステムズAM-100 CPUボードに搭載された5つの40ピンパッケージに入ったWD16マイクロプロセッサ
一般情報
発売1976年、49年前 (1976年
共通メーカー
パフォーマンス
最大CPU クロックレート3.3MHzまで
データ幅16
アドレス幅16
アーキテクチャと分類
命令セットPDP-11に類似
命令数119
物理的仕様
パッケージ
歴史
後継者なし

WD16、1976年10月にWestern Digital社が発表した16ビットマイクロプロセッサです。MCP-1600チップセットをベースにしており、この汎用設計はDEC LSI-11ローエンドミニコンピュータPascal MicroEngineプロセッサの実装にも使用されました。3つのシステムは主にマイクロコードが異なり、それぞれ独自の命令セットアーキテクチャ(ISA)を採用していました。

WD16はPDP-11命令セットアーキテクチャの拡張を実装していますが、PDP-11とマシンコード互換性はありません。 [1]命令セットとマイクロコードはDick WilcoxとRich Notariによって開発されました。[2] WD16は直交 CISCアーキテクチャの一例です。ほとんどの2オペランド命令は、任意のアドレッシングモードでメモリ間操作を実行でき、一部の命令は最大10回のメモリアクセスを引き起こす可能性があります。

WD16は5つの40ピンDIPパッケージで実装されています。最大クロック速度は3.3MHzです。[3]メモリとのインターフェースは、16ビットの多重化データ/アドレスバスを介して行われます。[4]

WD16は、Alpha Microsystems社のAM-100およびAM-100/Tプロセッサボードに搭載されたことで最もよく知られています。[5]プロトタイプは1977年に実演されました。[6] 1981年時点で、WD16を搭載したAlpha Microコンピュータは少なくとも5,000台存在しました。[7] 1982年になっても、WD16を搭載したAlpha Microは依然として「スーパーマイクロ」と呼ばれていました。[8] WD16は1982年6月にMotorola 68000に置き換えられました。[9]

CPUレジスタ

WD16レジスタ
1 51 41 31 21 11 00 90 80 70 60 50 40 30 20 10 0(ビット位置)
メインレジスタ
R0レジスタ0 / カウント
R1レジスタ1
R2レジ2
R3レジ3
R4レジ4
R5レジ5
スタックポインタ
R6レジスタ6 /スタックポインタ
プログラムカウンタ
R7レジスタ7 /プログラムカウンタ
ステータスフラグ
外部ステータスALUNZVC プロセッサステータスワード

CPUには、R0からR7までの8つの汎用16ビットレジスタが搭載されています。これらのレジスタは、以下の例外を除き、任意の用途に使用できます。レジスタR7はプログラムカウンタ(PC)です。どのレジスタもスタックポインタとして使用できますが、R6はハードウェア割り込みやトラップに使用されるスタックポインタ(SP)です。R0はブロック転送命令のカウントです。[10]

メモリ

データ形式

アドレス指定および書き込み可能なメモリの最小単位は8ビットのバイトです。バイトはレジスタR0からR5の下位半分にも保持できます。[10]

16ビットワードは、最下位バイトが下位アドレスに位置するリトルエンディアン方式で格納されます。ワードは常に偶数メモリアドレスに揃えられます。ワードはレジスタR0からR7に保持できます。

32 ビットのダブルワードは、下位ワードが下位番号のレジスタに格納されるレジスタペアにのみ格納できます。32 ビットの値は、MUL、DIV、および一部の回転および算術シフト命令で使用されます。

浮動小数点値は48ビット長で、メモリにのみ格納できます。この形式は、単精度浮動小数点形式と倍精度浮動小数点形式の中間です。これらは、「PDPエンディアン」と呼ばれる特殊なミドルエンディアン形式で格納されます。浮動小数点値は常に偶数アドレスに揃えられます。最初のワードには、符号、指数、および仮数部の上位バイトが含まれます。次の上位アドレスには仮数部の中間2バイトが含まれ、次の上位アドレスには仮数部の下位2バイトが含まれます。完全な形式は次のとおりです。

1. 数値全体を表す 1 ビットの符号。正の場合は 0 です。

2. 8ビットの2進数指数で、+127から-128までの範囲で128を越える表記法です。指数が-128の有効な数は真のゼロ(すべてゼロ)のみです。

3. MSB が暗黙的に含まれた 40 ビットの仮数。

1514760
住所+0S指数仮数(上位)
15870
番地+2仮数(中間)
15870
アドレス+4仮数(下位)

メモリ管理

WD16の16ビットアドレスは、64KBのメモリに直接アクセスできます 。WD16には、固有のメモリ管理や保護機能は用意されていません。AM-100アプリケーションでは、最後の256のメモリ位置がポート空間にマッピングされます。[11]ほとんどのAM-100コンピュータはマルチユーザーコンピュータとして使用されていたため、メモリは通常、バンクスイッチングによって64KBを超えて拡張されました。AM-100は最大22ユーザーと512KBのRAMを構成できましたが、[7] 9ユーザーのAM-100の典型的なメモリ構成は352KB程度でした。[12] 1981年には、AM-100/T用にオプションのAM-700メモリ管理ユニットが提供され、 256バイト単位でメモリをセグメント化できるようになりました。[13]

アドレッシングモード

ほとんどの命令は、各オペランドを指定するために6ビットを割り当てます。3ビットで8つのアドレッシングモードのいずれかを選択し、3ビットで汎用レジスタを選択します。6ビットオペランドのアドレッシングモードのエンコードは次のとおりです。[10]

5320
モードレジスタ


以下のセクションでは、各項目に、オペランドをアセンブリ言語で記述する例を示します。Rnは、R0からR7まで記述される8つのレジスタのいずれかを表します。

汎用レジスタアドレッシングモード

以下の8つのモードは、任意の汎用レジスタに適用できます。R6(スタックポインタ、SP)とR7(プログラムカウンタ、PC)に適用した場合の効果については、以下のセクションで個別に説明します。

コード名称説明
オンレジスタRnオペランドはRnにあります
1nレジスタは延期されます(Rn)Rnにはオペランドのアドレスが格納されます
2n自動インクリメント(Rn)+Rnにはオペランドのアドレスが格納されています。Rnをインクリメントします。
3n自動インクリメント遅延@(Rn)+Rnにはオペランドのアドレスが格納され、Rnを2だけインクリメントします
4n自動デクリメント−(Rn)Rnをデクリメントし、その結果をオペランドのアドレスとして使用します
5n自動デクリメント遅延@−(Rn)Rnを2減分し、その結果をオペランドのアドレスとして使用します
6nインデックスX(Rn)Rn+Xはオペランドのアドレスです
7nインデックス遅延@X(Rn)Rn+Xはオペランドのアドレスのアドレスです

インデックスモードおよびインデックス遅延モードでは、Xは命令の2番目のワードから取得される16ビット値です。ダブルオペランド命令では、両方のオペランドでこれらのモードを使用できます。このような命令は3ワード長です。

レジスタの自動インクリメントおよび自動デクリメント操作は、バイト命令では 1 ずつ、ワード命令では 2 ずつ、遅延モードが使用される場合は常に 2 ずつ行われます。これは、レジスタがアドレス指定する量が (ワード) ポインタであるためです。

プログラムカウンタのアドレッシングモード

R7 (プログラム カウンタ) が指定されると、次の 4 つのアドレッシング モードが自然に便利な効果をもたらします。

コード名称説明
27即値#nオペランドは命令の次のワードです
37絶対@#aオペランドのアドレスは命令の次のワードである
67相対aオペランドのアドレスは、PCに加算される命令の次のワードです
77相対遅延@aオペランドのアドレスは、PCに加算される命令の次のワードです

絶対モードには一般的な用途が 2 つあり、その構文は即時モードと遅延モードを組み合わせたものです。1 つ目は、0000 ~ 003F の予約済みプロセッサ位置にアクセスすることです。もう 1 つは、各デバイスのレジスタが特定のメモリ アドレスを持っているため、ポート空間で入出力レジスタを指定することです。相対モードは構文が単純で、プログラム変数やジャンプ先の参照によく使用されます。相対モード (および相対遅延モード) を内部参照専用に使用するプログラムは位置に依存しません。つまり、自身の位置に関する前提がないため、任意のメモリ位置にロードしたり、移動したりすることができ、その位置を反映するようにアドレスを調整する必要がありません。現在の位置を基準としたこのようなアドレスを計算する際、プロセッサはオンザフライで再配置を実行します。

即値モードと絶対モードは、それぞれPCに適用される自動インクリメントモードと自動インクリメント遅延モードです。命令内に補助ワードがある場合、次の命令のPCは自動的に補助ワードを超えてインクリメントされます。PCは常にワードを指すため、自動インクリメント操作は常に2ストライドで実行されます。

スタック・アドレッシング・モード

R6(SPとも表記)は、トラップと割り込み用のハードウェア・スタックとして使用されます。WD16が提供するアドレッシング・モードのセットによって強制される規則は、アイテムがスタックにプッシュされるにつれて、スタックは下向き(下位アドレスに向かって)に拡張されるというものです。SP、またはプログラマがソフトウェア・スタックとして使用することを選択した任意のレジスタにモードが適用されると、アドレッシング・モードは次の効果を持ちます

コード名称説明
16遅延(SP)オペランドはスタックの一番上にあります
26自動インクリメント(SP)+オペランドがスタックの一番上にある場合は、それをポップします
36自動インクリメント遅延@(SP)+オペランドへのポインタがスタックの先頭にある。ポインタをポップする
46自動デクリメント−(SP)値をスタックにプッシュする
66インデックスX(SP)オペランドはスタックの先頭からXの距離にある
76インデックス付き遅延@X(SP)オペランドへのポインタはスタックの先頭からXの距離にあります

ソフトウェアスタックにはバイト単位のメモリを格納できますが、SPは常にワード単位のスタックを指します。SPに対する自動インクリメントおよび自動デクリメント操作は、常に2ストライドで実行されます。

命令セット

WD16命令のほとんどは、バイトとワードを操作します。バイトは、レジスタ番号(レジスタの下位バイトを識別する)またはメモリ位置で指定されます。ワードは、レジスタ番号または下位バイトのメモリ位置(偶数でなければなりません)で指定されます。すべてのオペコードとアドレスは16進数で表されます。[10]

ダブルオペランド命令

上位4ビットは実行する演算を指定します。6ビットの2つのグループは、上記で定義したソースオペランドアドレッシングモードとデスティネーションオペランドアドレッシングモードを指定します。この命令グループは、利用可能なオペコードの75%を占めます

1512119865320
オペコードソースレジスタ宛先レジスタ
オペコードニーモニック操作
1000追加追加:Dest ← Dest + Src
2000サブ引き算:Dest ← Dest - Src
3000と:Dest ← Dest ∧ Src
4000BICビットクリア:Dest ← Dest ∧ (-1 - Src)
5000BISビットセット:Dest ← Dest ∨ Src
6000XOR排他的論理和Dest ← Dest ⊻ Src
9000CMP比較:Src − Dest
A000ビットビットテスト:Dest ∧ Src
B000MOV移動:Dest ← Src
C000CMPBバイト比較:Src − Dest
D000MOVBバイト移動: Dest ← Src(レジスタdestはビット8~15に符号拡張されます)
E000BISBビットセットバイト:Dest ← Dest ∨ Src

2オペランド命令の中には、1つのオペランドにアドレッシングモードを使用し、2番目のオペランドにレジスタを使用するものがあります

159865320
オペコードレジスタソース/デスティネーションレジスタ

上位7ビットは実行する演算を指定し、6ビットはオペランドのアドレッシングモードを指定し、3ビ​​ットはレジスタまたはレジスタペアを指定します。レジスタペアを使用する場合(以下、「レジスタ+1:レジスタ」と表記)、レジスタにはオペランドの下位部分が含まれます。次に大きい番号のレジスタには、オペランドの上位部分(または剰余)が含まれます

オペコードニーモニック操作
7200LEA実効アドレスをロード:Reg ← ea(Dest)
73C0JMPジャンプ: PC ← ea(Dest)(これは と同じでありLEA PC,Dest、同じオペコードを共有します。)
7400ASH算術シフト:if Src < 0 then Reg ← Shift-right(Reg, -Src) else Reg ← Shift-left(Reg, Src)
7800XCH交換:Reg ↔ Src
7A00ASHC算術シフト複合(32ビット):if Src < 0 then (Reg+1:Reg) ← Shift-right((Reg+1:Reg), -Src) else (Reg+1:Reg) ← Shift-left((Reg+1:Reg), Src)
7C00乗算符号なし乗算:(Reg+1:Reg) ← Reg × Src
7E00除算符号なし除算:Compute (Reg+1:Reg) ÷ Src; Reg ← quotient; Reg+1 ← remainder

単一オペランド命令

上位10ビットは実行する演算を指定し、ビット15は通常、バイトアドレス指定とワードアドレス指定を選択します。6ビットの1つのグループで、上記の定義に従ってオペランドを指定します

1565320
オペコードソース/デスティネーションレジスタ
オペコードニーモニック操作
0BC0SWABワードのバイトをスワップ:Dest0-7 ↔ Dest8-15
8BC0SWADバイトの桁を入れ替える:Dest0-3 ↔ Dest4-7
0840クリアクリアDest ← 0
8840クリア
0C00COM補数:Dest ← (-1 - Dest)
8C00COMB
0C80INC増分:Dest ← Dest + 1
8C80INCB
0CC010進減分:Dest ← Dest − 1
8CC012進
0C40否定否定:Dest ← -Dest
8C40否定GB
0B00セットセット:Dest ← -1
8B00セットB
0A80TSTテスト:Src ∧ Src
8A80TSTB
0A00ROR右に回転:C ← S0; S0-14 ← S1-15; S15 ← C
8A00RORBバイトを右に回転:C ← S0; S0-6 ← S1-7; S7 ← C
0A40ロール左に回転:C ← S15; S1-15 ← S0-14; S0 ← C
8A40ロールバック左にバイトを回転:C ← S7; S1-7 ← S0-6; S0 ← C
0B80ASR算術右シフト:Dest ← Dest ÷ 2, sign preserved
8B80ASRB
0AC0ASL算術左シフト:Dest ← Dest × 2
8AC0ASLB
8D80ADCキャリーを追加:Dest ← Dest + Cflag
8DC0SBC繰り上がり減算:Dest ← Dest - Cflag
0D00IW2ワードを2増やす:Dest ← Dest + 2
0DC0TJMPテーブルジャンプ:PC ← PC + (Dest), PC ← PC + @PC
0D80TCALLテーブルコール:-(SP) ← PC, PC ← PC + (Dest), PC ← PC + @PC
0D40SXTサイン延長:Dest ← 0 - N flag
8D00LSTSプロセッサステータスのロード:PSW ← Dest
8D40SSTSプロセッサステータスの保存:Dest ← PSW

単一オペランドの短い即値命令

上位7ビットとビット5およびビット4は、実行する演算を指定します。3ビットの1つのグループでレジスタを指定します。4ビットのカウントフィールドには、小さな即値またはカウントが格納されます。いずれの場合も、このフィールドに1が加算され、範囲は1から16になります。

159865430
オペコードレジスタオペカウント
オペコードニーモニック操作
0800ADDI即時加算:Reg ← Reg + Count + 1
0810SUBI即時減算:Reg ← Reg - Count - 1
0820BICIビットクリア即時:Reg ← Reg ∧ (-1 - (Count+1))
0830MOVI即時移動:Reg ← Count + 1
8800SSRR右回転(複数):Reg:C-flag ← Rotate-right(Reg:C-flag, Count+1)
8810SSLR左回転(倍数)C-flag:Reg ← Rotate-left(C-flag:Reg, Count+1)
8820SSRA右算術シフト倍数:Reg:C-flag ← Arithmetic-shift-right(Reg, Count+1)
8830SSLA左算術シフト倍数:C-flag:Reg ← Arithmetic-shift-left(Reg, Count+1)
8E00SDRR二重右回転倍数(33ビット)Reg+1:Reg:C-flag ← Rotate-right(Reg+1:Reg:C-flag, Count+1)
8E10SDLR二重左回転倍数 (33 ビット):C-flag:Reg+1:Reg ← Rotate-left(C-flag:Reg+1:Reg, Count+1)
8E20SDRA右倍精度算術シフト倍数(32ビット)Reg:Reg+1:C-flag ← Arithmetic-shift-right(Reg:Reg+1, Count+1)
8E30SDLA左倍精度算術シフト倍数(32ビット)C-flag:Reg:Reg+1 ← Arithmetic-shift-left(Reg:Reg+1, Count+1)

浮動小数点命令

上位8ビットは実行する演算を指定します。4ビットずつの2つのグループは、ソースとデスティネーションのアドレッシングモードとレジスタを指定します。フィールドI = 0の場合、指定されたレジスタにはオペランドのアドレス(アドレッシングモードRnに相当)が格納されます。フィールドI = 1の場合、指定されたレジスタにはオペランドのアドレス(アドレッシングモード@0(Rn)に相当)が格納されます。

158764320
オペコードSRegDReg
オペコードニーモニック操作
F000FADD浮動小数点加算:Dest ← Dest + Src
F100FSUB浮動小数点減算:Dest ← Dest - Src
F200FMUL浮動小数点乗算:Dest ← Dest × Src
F300FDIV浮動小数点分割:Dest ← Dest ÷ Src
F400FCMP浮動小数点比較:Dest - Src

オペコードF500からFFFFは、さらに11個の浮動小数点命令を実装するために4番目のマイクロプロセッサにマッピングされました。この4番目のマイクロプロセッサが実際に製造されたという証拠はありません。標準的なWD16プロセッサがオペコードF500からFFFFを実行すると、予約済みのオペコードトラップが呼び出され、PCが001Aからロードされます。

ブロック転送命令

上位10ビットは実行する操作を指定します。3ビットずつの2つのグループは、転送元レジスタと転送先レジスタを指定します。いずれの場合も、転送元レジスタには移動するメモリの最初のワードまたはバイトのアドレスが含まれ、転送先レジスタには移動するデータを受け取るメモリの最初のワードまたはバイトのアドレスが含まれます。転送されるワード数またはバイト数は、符号なし整数としてR0に格納されます。カウントの範囲は1~65536です。これらの命令は完全に割り込み可能です

1565320
オペコードSRegDReg
オペコードニーモニック操作
0E00MBWU単語のブロックを上に移動:(DReg) ← (SReg), SReg ← SReg + 2, DReg ← DReg + 2, R0 ← R0 - 1, until R0 = 0
0E40MBWD単語のブロックを下に移動します:(DReg) ← (SReg), SReg ← SReg - 2, DReg ← DReg - 2, R0 ← R0 - 1, until R0 = 0
0E80MBBUバイトブロックを上に移動:(DReg) ← (SReg), SReg ← SReg + 1, DReg ← DReg + 1, R0 ← R0 - 1, until R0 = 0
0EC0MBBDバイトブロックを下に移動します:(DReg) ← (SReg), SReg ← SReg - 1, DReg ← DReg - 1, R0 ← R0 - 1, until R0 = 0
0F00MBWA単語のブロックをアドレスに移動:(DReg) ← (SReg), SReg ← SReg + 2, R0 ← R0 - 1, until R0 = 0
0F40MBBAバイトブロックをアドレスに移動:(DReg) ← (SReg), SReg ← SReg + 1, R0 ← R0 - 1, until R0 = 0
0F80MABWアドレスを単語ブロックに移動します:(DReg) ← (SReg), DReg ← DReg + 2, R0 ← R0 - 1, until R0 = 0
0FC0MABBアドレスをバイトブロックに転送:(DReg) ← (SReg), DReg ← DReg + 1, R0 ← R0 - 1, until R0 = 0

分岐命令

命令の上位バイトは演算を指定します。下位バイトは、プログラムカウンタの現在位置からの相対的な符号付きワードオフセットです。これにより、コード内で前方および後方への分岐が可能になります。最大分岐範囲は、分岐オペコードから+128、-127ワードです。

ほとんどの分岐命令では、分岐が行われるかどうかは条件コードの状態に基づいて決定されます。分岐命令の前には、通常、2オペランドのCMP(比較)命令、BIT(ビットテスト)命令、または1オペランドのTST(テスト)命令が置かれます。算術命令と論理演算命令も条件コードを設定します。x86アーキテクチャのIntelプロセッサとは異なり、MOV命令も条件コードを設定するため、分岐命令を使用して、移動された値がゼロか負かによって分岐することができます。

15870
オペコードオフセット
オペコードニーモニック条件または操作
0100BR常に分岐PC ← PC + (2 × Sign-extend(Offset))
0200BNE等しくない場合に分岐Z = 0
0300BEQ等しい場合分岐Z = 1
0400BGEより大きいか等しい場合に分岐(N ⊻ V) = 0
5:00BLT未満の場合は分岐(N ⊻ V) = 1
6:00BGTより大きい場合は分岐(Z ∨ (N ⊻ V)) = 0
0700BLE以下の場合は分岐(Z ∨ (N ⊻ V)) = 1
8000BPLプラスの場合分岐N = 0
8100BMIマイナスの場合分岐N = 1
8200BHI上位の場合は支店(C ∨ Z) = 0
8300BLOS下位または同じ場合は分岐(C ∨ Z) = 1
8400BVCオーバーフロークリアの場合分岐V = 0
8500BVSオーバーフローセットの場合に分岐V = 1
8600BCCまたはBHISキャリーがクリアの場合は分岐、またはそれより大きいか同じ場合は分岐C = 0
8700BCS または BLOキャリーセットなら分岐、または 下なら分岐C = 1

分岐命令の範囲が限られているため、コードが長くなると、一部の分岐のターゲットアドレスが到達不能になる可能性があります。プログラマーは1ワードのBccを2ワードのJMP命令に変更します。JMPには条件付き形式がないため、プログラマーはJMPを迂回して分岐するためにBccを逆方向に変更します

1598650
オペコードレジスタオフセット
オペコードニーモニック操作
7600SOBSubtract One and Branch: Reg ← Reg - 1; if Reg ≠ 0 then PC ← PC - (2 × Offset)

SOB(Subtract One and Branch)は、条件分岐命令の1つです。指定されたレジスタの値が1減算され、結果が0でない場合、6ビットワードオフセットに基づいて逆方向の分岐が行われます

サブルーチン命令

159865320
オペコードレジスタソースレジスタ
オペコードニーモニック操作
7000JSRサブルーチンへのジャンプ:-(SP) ← Reg; Reg ← PC; PC ← Src

JSRはサブルーチンを呼び出します。6ビットのグループがアドレッシングモードを指定します。JSR命令は任意のレジスタをスタックに保存できます。この機能を必要としないプログラムでは、PCをレジスタ(JSR PC, address)として指定し、サブルーチンはを使用して戻りますRTN PC。例えば、ルーチンがで呼び出された場合JSR R4, address、R4の古い値はスタックの先頭に保存され、戻りアドレス(JSRの直後)はR4にあります。これにより、ルーチンは(R4)+を指定することでインラインでコード化された値にアクセスしたり、@(R4)+を指定することでインラインポインタにアクセスしたりできます。自動インクリメントはこれらのデータを過ぎて、呼び出し元のコードが再開されるポイントまで移動します。このようなルーチンは、RTN R4呼び出し元に戻ることを 指定します

この形式はコルーチンのJSR PC,@(SP)+実装に使用できます。まず、コルーチンのエントリアドレスがスタックに配置され、そこから呼び出し文と戻り文の両方でこの命令が使用されます。このJSR命令の結果、PCの内容とスタックの最上位要素が交換され、2つのルーチンは制御を交換し、前回の交換によってそれぞれ終了した場所から処理を再開できるようになります。JSR PC,@(SP)+

15320
オペコードレジスタ
オペコードニーモニック操作
0018RTNサブルーチンからの戻り:PC ← Reg; Reg ← (SP)+
0028PRTNスタックをポップして戻る:SP ← SP + (2 × @SP), PC ← Reg; Reg ← (SP)+

PRTN は、スタックからいくつかのパラメータを削除して戻ります。PRTN は、PDP-11 の複雑な MARK 命令に対する WD16 の回答です。MARK とは異なり、PRTN はプログラム空間で実行され、任意のレジスタをリンケージ レジスタとして使用できます。この説明では、R5 をリンケージとして使用します。最初に、呼び出し元は R5 をスタックにプッシュします。次に、任意の数のワード引数をスタックに置くことができます。呼び出し元は、引数ワード数 + 1 を R5 に書き込みます。呼び出し元は、JSR R5,address引数ワード数 + 1 をスタックにプッシュする命令を実行し、戻りアドレスを R5 に置いて、サブルーチンにジャンプします。コードの実行後、サブルーチンは で終了します。PRTN は、スタックの先頭の数値を 2 倍にして SP に追加し、パラメータを削除します。次に、PRTN は と同等のものを呼び出し元に返し、R5 を PC にロードして R5 をポップすることPRTN R5で続行します。RTN R5

シングルレジスタ命令

これらの命令は13ビットのオペコードと3ビットのレジスタ引数を持ちます

15320
オペコードレジスタ
オペコードニーモニック操作
0010IAK割り込み確認:Interrupt acknowledge state code, Reg ← Bus read
0020MSKOマスクアウト:(002E) ← Reg, Mask out state code

暗黙のパラメータ命令

150
オペコード
オペコードニーモニック操作
0000NOP何もしない:Do nothing
0001リセットリセット:Transmit reset pulse to I/O devices
0002IEN割り込み許可:I2 ← 1
0003IDS割り込み禁止:I2 ← 0
0004停止停止:Executes the selected halt option
0005XCT単一命令を実行します。PC ← (SP)+, PS ← (SP)+, set trace flag, execute opcode, -(SP) ← PS, -(SP) ← PC, trace flag reset, If no error PC ← (0020) else PC ← (001E)
0006BPTブレークポイントトラップ:-(SP) ← PS, -(SP) ← PC, PC ← (002C)
0007WFI割り込みを待つ:Enable interrupts (I2 ← 1). Bus activity ceases.
0008RSVCスーパーバイザーからの応答(BまたはC):REST[a], SP ← SP + 2, RTT[b]
0009RRTTトラップから復帰して戻る:REST[a], RTT[b]
000A保存保存レジスタ:-(SP) ← R5, -(SP) ← R4, -(SP) ← R3, -(SP) ← R2, -(SP) ← R1, -(SP) ← R0
000BSAVS保存状態:SAVE[c], -(SP) ← (002E), (002E) ← (002E) ∨ Mask, MSKO, IEN. Note Mask is stored in the second word of instruction.
000CRESTレジスタの復元:R0 ← (SP)+, R1 ← (SP)+, R2 ← (SP)+, R3 ← (SP)+, R4 ← (SP)+, R5 ← (SP)+
000DRRTN復元して復帰:REST[a], PC ← (SP)+
000ERSTS復元ステータス:(002E) ← (SP)+, MSKO, REST[a], RTT[b]
000FRTT罠からの帰還:PC ← (SP)+, PS ← (SP)+
  1. ^ abcd 残り: R0 ← (SP)+, R1 ← (SP)+, R2 ← (SP)+, R3 ← (SP)+, R4 ← (SP)+, R5 ← (SP)+
  2. ^ abc RTT: PC ← (SP)+、PS ← (SP)+
  3. ^ セーブ: -(SP) ← R5, -(SP) ← R4, -(SP) ← R3, -(SP) ← R2, -(SP) ← R1, -(SP) ← R0

スーパーバイザコール

これらの命令は、オペレーティングシステム(スーパーバイザ)コールを実装するために使用されます。すべて6ビットのレジスタ引数を持ちます。SVCBとSVCCは、オペレーティングシステムへの引数がネイティブ命令セットでサポートされているほとんどのアドレッシングモードを使用できるように設計されています

15650
オペコードアーグ
オペコードニーモニック操作
0040SVCAスーパーバイザーコールA:-(SP) ← PS ,-(SP) ← PC, PC ← (0022) + Arg × 2, PC ← (PC)
0080SVCBスーパーバイザーコールB:TMPA ← SP, -(SP) ← PS, -(SP) ← PC, TMPB ← SP, -(SP) ← TMPA, SAVE[a], R1 ← TMPB, R5 ← Arg × 2, PC ← (0024)
00C0SVCCスーパーバイザーコールC:TMPA ← SP, -(SP) ← PS, -(SP) ← PC, TMPB ← SP, -(SP) ← TMPA, SAVE[a], R1 ← TMPB, R5 ← Arg × 2, PC ← (0026)
  1. ^ ab 保存: -(SP) ← R5, -(SP) ← R4, -(SP) ← R3, -(SP) ← R2, -(SP) ← R1, -(SP) ← R0

条件コード演算

1543210
オペコードNZVC
オペコードニーモニック操作
0030LCC荷重条件コード:Load according to N, Z, V, C bits

プロセッサステータスワード(PSW)の4つの条件コードは

割り込み

WD16には、非ベクター割り込み、ベクター割り込み、およびHALT割り込みの3種類の割り込みがあります。非ベクター割り込みとベクター割り込みは、命令IENIDS命令によって有効化または無効化されます。HALT割り込みは無効化できません

非ベクター割り込み(NVI)はベクター割り込みよりも優先されます。NVIは、電源障害とラインクロックの2つの目的にのみ使用されます。(ラインクロックは通常、タイムスライスタイムキーピングに使用される50Hzまたは60Hzの入力です。)NVIを受信すると、PSとPCがプッシュされます。電源障害の状態がチェックされます。電源障害の場合、WD16は0014に格納されているアドレスにジャンプします。電源障害でない場合は、ラインクロックティックとみなされ、WD16は002Aに格納されているアドレスにジャンプします。

16 個の割り込みベクターがサポートされています。ベクター割り込みが受信されると、PS と PC がプッシュされます。割り込み確認中に、WD16 は割り込みデバイスから提供された 4 ビットの割り込み番号を受け入れます。割り込みベクター テーブルアドレスは 0028 からフェッチされ、割り込み番号が加算されて、テーブル内の 16 ワードの 1 つを指します。ワード オフセットがテーブルからフェッチされ、それ自身のテーブル アドレスに加算されます。結果が PC にロードされ、割り込みサービス ルーチンにジャンプします。どの同時割り込みが行われるかは、主に外部ハードウェアで実装される 16 ビットの割り込み優先度マスクによって決まります。WD16 は、マスクをハードウェアに直接送信しながら、現在の優先度マスクを 002E に格納します。マスクはMSKO、、、SAVSおよびRSTS命令で操作されます。16 個を超えるベクター割り込みが必要な場合は、NVI を介して開始し、命令でディスパッチできますIAK

Haltはノンマスカブル割り込みであり、ジャンパーの設定次第でプログラマのスイッチやその他の用途に使用できます。haltは実行アドレスを変更でき、割り込みイネーブルによってマスクされませんが、 PCがプッシュされないためノンマスカブル割り込みとして使用することはできません。ジャンパーの設定によっては、haltラインが停止しない場合もあります。命令HALTが実行された場合、これもジャンパーの設定次第で、haltラインによってクリアされる可能性があります。

予約済みの低位メモリ位置

0000から003Fまでのメモリ位置は、プロセッサによって定義された固定機能を持ちます。以下のアドレスはすべてワードアドレスです。[10]

ベクトル条件
0000-0010電源投入/停止オプション用のR0~R5、SP、PC、PS
0012バスエラーPC
0014非ベクトル割り込み電源障害PC
0016PCの電源投入/停止オプション、電源復旧
0018PCのパリティエラー
001A予約済みオペコード PC
001C不正なオペコード形式 PC
001EXCTエラーPC
0020XCTトレースPC
0022SVCAテーブルアドレス
0024SVCB PC
0026SVCC PC
0028ベクター割り込み(I0)テーブルアドレス
002A非ベクトル割り込み(I1)PC
002CBPT PC
002EI/O優先度割り込みマスク
0030-003C浮動小数点スクラッチパッド
003E浮動小数点エラー PC

パフォーマンス

WD16プロセッサの速度は、クロック速度、メモリ構成、オペコード、およびアドレッシングモードによって異なります。命令タイミングは、命令自体のフェッチ/実行時間と、ソースおよびデスティネーションへのアクセス時間という最大3つの要素で構成されます。最後の2つの要素はアドレッシングモードに依存します。例えば、3.3MHzの場合、ADD  x (R m ), y (R n )という形式の命令のフェッチ/実行時間は3.3マイクロ秒、ソース時間2.7マイクロ秒、デスティネーション時間3.0マイクロ秒で、合計命令時間は9.0マイクロ秒です。レジスタ間ADD R m ,R nは3.3マイクロ秒で実行されます。浮動小数点演算は大幅に遅くなります。単精度浮動小数点(48ビット)の加算命令は、通常54~126マイクロ秒です。WD16の精度は、従来の単精度浮動小数点と倍精度浮動小数点の中間の精度です。[10]

対照的に、当時最速のPDP-11コンピュータはPDP-11/70でした。ADD  x (R m ), y (R n )命令のフェッチ/実行時間は1.35マイクロ秒で、これにソースとデスティネーションの処理時間がそれぞれ0.6マイクロ秒ずつ加算され、合計命令時間は2.55マイクロ秒でした。アドレス指定されたメモリがキャッシュに存在しない場合は、さらに1.02マイクロ秒が追加されます。レジスタ間ADD R m ,R n命令は、キャッシュから0.3マイクロ秒で実行できます。[14] FP11-Cコプロセッサによって実行される単精度浮動小数点加算命令は、0.9~2.5マイクロ秒の範囲で実行され、これにオペランドのフェッチ時間(最大4.2マイクロ秒)が加算されます。[15]

WD16ブロック転送命令は、転送速度とブロックI/O速度を約2倍に向上させます。 MOV (R1)+,(R2)+, SOB R0,loop命令による1ワードの移動には、1回の反復で9.6マイクロ秒かかります。MBWU R1,R2同等の速度では、1回の反復で4.8マイクロ秒かかります。

コンピュータユーザー協会(AUC)は、AM-100Tベースの35,680ドル(2024年には136,163ドル相当)のシステムで一連のベンチマークテストを実施しました。その結果、CPU依存のベンチマークテストでは、AM-100Tでは31.4秒で実行されたのに対し、15,000ドルから25,000ドルの価格帯の平均的なシングルユーザーシステムでは218秒でした。[16] 25,000ドルから50,000ドルの価格帯のマルチユーザーコンピュータのグループでは、AM-100Tの速度は「上位3分の1」にランクされました。[17]

1984年5月のクリエイティブ・コンピューティング・ベンチマークでは、WD16(AM-100Tアプリケーション)はテスト対象183台中34位にランクされました。所要時間は10秒で、IBM PCの24秒を大きく上回りました。[18]

エミュレータ

Virtual Alpha MicroはオープンソースのWD16エミュレータです。C言語で記述されており、WD16プロセッサとAlpha Micro AM-100ハードウェア環境をエミュレートします。作者はLinux(Raspberry Piを含む)、Windows、Macintoshデスクトップで動作すると主張していますが、バイナリは提供されていません。Alpha Microオペレーティングシステム(AMOS)と関連プログラムをすべて実行できます。2002年、Alpha Microは趣味用途に限り、マニュアルを含むAMOS 4.xまたは5.0のバイナリを限定的に配布する許可を与えました。[19]

参照

参考文献

  1. ^ ダニエル・フライストラ(1977年4月)「新しいホビイストシステムがタイムシェアリングをサポート」(PDF)Byte . 2 (4): 142–144 . 2022年11月21閲覧
  2. ^ Wilcox, Dick (1977年1月). 「S-100バス用のPDP-11ライクな16ビットマイクロプロセッサ」. Dr. Dobbs's Journal of Computer Calisthenics and Orthodontia . 2 (1): 3–7 . 2022年6月14日閲覧
  3. ^ 「16ビットプロセッサセット、NMOS、MCP-1600/WD-16」(PDF) . Electronic Design . 25 (21): 174. 1977年10月11日. 2025年5月6日閲覧
  4. ^ MCP-1600マイクロプロセッサ ユーザーズマニュアル(PDF) . Western Digital. 1975年. 2022年4月28日閲覧
  5. ^ Stan, Viet (1983年5月). 「ディスクオペレーティングシステムの戦い」(PDF) . Computers & Electronics . 21 (5): 19. 2023年6月8日閲覧
  6. ^ Craig, John (1977年4月). 「Around the Industry」(PDF) . Kilobaud: The Small Computer Magazine (4): 10. 2022年11月23日閲覧
  7. ^ ab Kee, Hank (1981年8月). 「Alpha Micro System Revisited」(PDF) . Microsystems . 2 (4): 26. 2022年3月1日閲覧
  8. ^ Fox, Tom (1982年1月). 「Business Systems for '82」. Interface Age . 7 (1): 75. 2022年11月3日閲覧
  9. ^ 「アルファ・マイクロシステムズ 売上高記録を更新」InfoWorld 4 (44): 11. 1982年11月8日. 2022年11月3日閲覧
  10. ^ abcdef Wilcox, Dick (1976年10月4日). WD16 マイクロコンピュータプログラマーズリファレンスマニュアル(PDF) . Western Digital . 2025年8月21日閲覧
  11. ^ 「AM-100の技術マニュアル」(PDF) . Alpha Microsystems . 2021年12月19日閲覧
  12. ^ “Alpha Micro AM100”. Obsolete Computer Museum . 2021年12月19日閲覧
  13. ^ メモリパーティションコントローラによるメモリ管理(PDF) (A01版). Alpha Micro. 1981年10月. pp.  139– 155. 2022年6月14日閲覧
  14. ^ PDP-11/70プロセッサハンドブック(PDF) 1976年12月 付録C「命令タイミング」
  15. ^ DEC PDP-11プロセッサハンドブック、1975年、379-391ページ、FP11-C命令タイミング
  16. ^ 「Alpha Micro AM-100T」.コンピュータユーザー協会ベンチマークレポート. 3.2 (6): 9. 1980年11月. 2022年11月3日閲覧
  17. ^ 「12号概要」.コンピュータユーザー協会: ベンチマークレポート. 3.2 (14): 4. 1982年6月. 2022年11月3日閲覧
  18. ^ Ahl, David H. (1984年5月). 「クリエイティブ・コンピューティング・ベンチマーク」. Creative Computing Magazine . 10 (5): 6. 2022年11月2日閲覧
  19. ^ ノエル、マイク. 「VAM Virtual Alpha Micro」 . 2022年7月13日閲覧
  • AM-100とAM-100Tの写真
「https://en.wikipedia.org/w/index.php?title=WD16&oldid=1321635325」より取得