回路レベルで実装したPDP‑11/34エミュレーター

2026/03/29 1:23

回路レベルで実装したPDP‑11/34エミュレーター

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

要点をすべて組み合わせたもの:

要約

PDP‑11/34A(1976)の回路レベルエミュレーターが、図面・マイクロコード・論理キャプチャを逆解析しCコードに落とし込むことで構築されました。エミュレーターはすべてのハードウェア要素を実装しています。

  • CPU コア
    ucode_rom.h
    は Bitsavers Verilog と物理ダンプから派生した 512×48 ビットバイポーラ PROM 配列を保持し、
    combo_roms.h
    には命令デコード、ALU 関数選択、トラップ/サービス優先度、条件コードロジック用の ROM が含まれます。データパスエンジン(
    kd11ea.c
    )は C 演算子を使用して各サイクルごとに 1 マイクロワードをステップし、74S181 ビットスライス ALU(4 スライス、16 ビット)を完全にモデル化します。
  • メモリ
    mmu.c
    はカーネル/ユーザーアドレス空間、3 つの 74S283 アダーによる 18 ビットリロケーション、16 の PAR/PDR ペア、および SR0/SR2 abort レジスタとフリーズロジックを実装します。
  • クロック
    clockgen.c
    は E106 ディレイライン(TAP 30/90/120 フィードバック、TRAN INH バス待ち)をモデル化し、短周期 180 ns と長周期 240 ns を生成します。
    clock.c
    はシミュレーション時間を実際のウォールクロックと同期させます。
  • 割り込み
    int.c
    は BR4–BR7 優先度キューを扱う仲裁機構を提供し、UNIBUS のデイジーチェーン授与順序を近似します。
  • バス – すべてのデバイスは UNIBUS バックプレーンに接続され、アドレスデコード、タイミング、およびバスサイクルを処理します。

周辺機器として、M9301 ブートカード、DL11 シリアルカード、KW11 ラインクロック、プログラマコンソール(フロントパネルスイッチ/インジケーター)、RK05/RL01/RL02 ディスクドライブ(ハイレベル)、テープリーダー、および stdio/TCP/PTTY モードを備えた VT100 ターミナルがエミュレートされています。

このエミュレーターは元の図面と PROM ダンプに対して検証されました。コンソールインタフェース(

Ctrl‑E
)によるマイクロコード・命令レベルデバッグ、WebAssembly で実装されたフォトリアリスティックなプログラマコンソール GUI(
Ctrl‑P
)、および実時間クロック周波数(5 555 556 Hz)で 102 の CPU 信号をトレースするロジックアナライザ(
Ctrl‑L
)といったデバッグツールが、ROM とタイミングのバグ検出・修正に不可欠でした。

今後の計画としては、WebAssembly を介してウェブ上でエミュレーターを公開し、プログラマコンソールへのフォトリアリスティック GUI 要素を追加し、リアルタイムメモリ検査やブレークポイントサポートなどのデバッグ機能を拡張することが挙げられます。結果として得られた正確なソフトウェアモデルは、研究者・教育者・ホビイストが 1970 年代の CPU アーキテクチャを学習し、レガシーシステムを保存し、ハードウェア‐イン‐ザ‐ループ テスティングや逆解析ツールに影響を与える可能性があります。

本文

ll/34 – PDP‑11/34A用回路レベルエミュレーター(1976)

ll/34 は、PDP‑11/34A の実機の回路図・マイクロコード・論理キャプチャを逆解析して作成した仮想CPUを走らせる回路レベルエミュレーターです。もともとは、実際のCPUのデジタル複製として信号レベルでのトラブルシューティングを支援するために設計されました。

仮想 KD11‑EA CPU は基本的に回路図を C に翻訳し、ROM テーブルへの参照で構成されています。すべての組合せ論理 ROM は逆解析済みで、クロックジェネレータは正確にモデリングされています。ゲートレベル Verilog よりも回路レベル(ROM 真理値表+組合せ論理)を選択した理由は、ハードウェアのバグを再現しつつプログラム実行が十分高速であるためです。


エミュレート対象機器

  • UNIBUS バックプレーン – タイミング・信号ともに正確
  • KD11‑EA CPU – 回路レベル
  • M9301 ブートカード – 元のブート&診断 ROM
  • DL11 シリアルカード – タイミング正確
  • KW11 ラインクロック – 50/60 Hz
  • プログラマコンソール – CPU トラブルシューティング用メンテナンスモード付き
  • RK05 ドライブ – RK11 コントローラの高レベルエミュレーション
  • RL01 / RL02 ドライブ – RL11 コントローラの高レベルエミュレーション
  • テープリーダー
  • VT100 ターミナル – stdio、TCP ポートまたは PTY モード

アーキテクチャ

すべてのデバイスは UNIBUS バックプレーン(

unibus.c
)に接続され、アドレスデコード・タイミング・バスサイクルを担当します。内部的には CPU は次のような構成です。

ファイル説明
ucode_rom.h
512×48‑bit のマイクロコードストア(ビポーラ PROM)。Bitsavers Verilog とダンプに基づく。各マイクロワードは ALU、スクラッチパッド、バスインタフェース、分岐を一サイクルで制御します。
combo_roms.h
組合せ論理 ROM(E51–E83, E107)、IR デコード(E59/E60/E63/E69/E70/E71/E74)、ALU ファンクション選択(E61/E82/E83)、トラップ/サービス優先度(E52/E53)と条件コードロジック(E68/E107)。すべて回路図・論理キャプチャから再構成。オープンコレクタ ROM は MPC バスへワイヤーOR で接続されます。
kd11ea.c
データパスエンジン。マイクロコードを一ワードずつ実行し、基本的な 74xx ゲートは C の論理演算子(
!
,
&&
,
>>
等)でシミュレート。74S181 ビットスライス ALU は完全にモデリング(4 スライス、16‑ビット)。
mmu.c
メモリ管理:カーネル/ユーザーアドレス空間、18‑bit リロケーション(3×74S283 アダー)、16 PAR/PDR ペア、SR0/SR2 abort レジスタとフリーズロジック。
clockgen.c
E106 ディレイラインをモデリングしたクロックジェネレータ(TAP 30/90/120 フィードバック、TRAN INH バス待ち)。短周期:180 ns;長周期:240 ns;バストランスファーは SSYN が戻るまで伸びます。
clock.c
実時間ペース調整。シミュレータ時間を実際のウォールクロックと同期させます。
int.c
割り込み仲裁器。BR4–BR7 の優先度キューで UNIBUS のデイジーチェーン授与順序を近似します。

インタフェース

プログラマコンソール(Ctrl‑P)

PDP‑11/34A のフロントパネルスイッチとインジケータをエミュレート。CPU が停止している時(電源投入、HALT 命令、Ctrl‑P)にアクティブになり、以下が可能です。

  • バス初期化
  • CPU ブート
  • コードの単ステップ
  • 任意アドレスでデータの閲覧/書き込み
  • エミュレーター終了

フロントエンドはエンジンから切り離されており、WebAssembly 版ではフォトリアリスティックなパネル GUI も利用できます。

デバッグコンソール(Ctrl‑E)

マイクロコードレベルと命令レベルの両方で対話型デバッガ。

コマンド動作
s [n]
n 個のマイクロインストラクションを単ステップし、完全状態ダンプ(MPC, ALU, バス, レジスタ)を表示
b addr
PC ブレークポイント設定(八進数)。
bl
でリスト。
bd n
で削除
g
実行再開
u [addr] [n]
命令逆アセンブル
c [addr] [n]
メモリダンプ(八進数)
mmu
MMU 状態表示(カーネル+ユーザー PAR/PDR、現在モードをマーク)
r
レジスタダンプ

ロジックアナライザ(Ctrl‑L)

開発時に信号をトレースしデータパスを調査するための実装。仮想・実機両方でトラブルシューティングに有効です。

  • プローブ:主要 CPU 信号 102 ポイントが物理チップピン(
    KD1:Exx:pin
    )へマッピングされ、DEC スキーマ K1‑5 から K2‑9 と一致。論理エイリアス(MPC, ALU_OUT, IR, PSW 等)が提供されます。
  • サンプルレート:実時間 CPU クロック(5 555 556 Hz)で 180 ns 解像度。設定可能なディバイダーにより長いキャプチャウィンドウを確保。
  • キャプチャバッファ:最大 64 K サンプルのリングバッファ。任意信号でトリガ、プリ/ポスト比率調整、CSV エクスポート機能付き。

ロジックキャプチャは、複雑なマルチプレクシングパスを図示・デバッグするためにプロジェクト全体で広く利用されました。


サンプルプログラム

ll/34 にはいくつかのプログラムとシステムが付属しています。

  • ゲームオブライフ
  • V6 UNIX
  • RT‑11 V4(元のテトリス付き)
  • ATTN/11 – 自己注意機構を備えた小型トレーニング可能 Transformer

ビルド方法

make

C11 コンパイラが必要で、他に依存関係はありません。以下環境で警告なしでコンパイル確認済みです。

  • Linux(x86_64 & aarch64) → musl と glibc
  • macOS(aarch64)
  • NetBSD 10(aarch64)

フォトリアリスティック GUI を備えたスタンドアロン WebAssembly バージョンは https://dbrll.github.io/ll‑34 にて公開されています。

同じ日のほかのニュース

一覧に戻る →

2026/03/29 2:39

GitLab の創業者は、会社を立ち上げることでがんと闘う

## Japanese Translation: **概要** 著者は、上部脊柱のT5椎骨に位置する腫瘍性骨肉腫との個人的な闘いを語ります。標準治療オプションを試みたものの適切な臨床試験が見つからない中で、著者は自身の状態に合わせた新しい診断手法と並行治療プロトコルを開発しました。また、「癌ジャーニーデッキ」と埋め込み型OpenAIフォーラムプレゼンテーションを作成し、この経験を記録しています。著者のアプローチはevenone.venturesに掲載されている企業によって支援され、さらにエリオット・ハーシュバーグによる著者の旅路についての包括的な記事や、ルクサンドラ氏が執筆した「The bureaucracy blocking the chance(機会を阻む官僚主義)」という患者優先医療実践を批判する作品も広い文脈に含まれます。治療データと詳細なタイムラインは、https://osteosarc.com/ で公開されており、データ概要ドキュメントや25 TBの読み取り可能なGoogle Cloudバケットが含まれています。著者は読者にメールリストへの登録を促し、更新情報を受け取れるよう案内しています。また、`cancer@sytse.com` で連絡を取ることもできます。

2026/03/29 5:39

CSSは終焉を迎える運命にあります。

## Japanese Translation: この記事は、CSSのみでレンダリングを行い、ロジックには最小限のJavaScriptしか使用しない完全にプレイ可能なDOOM風ゲームをウェブブラウザ上で動かす方法を紹介しています。壁・床・天井・スプライト・弾道などを表現するために数千もの `<div>` 要素が生成され、各要素はカスタムプロパティとして生のDoom座標を保持し、CSS が `hypot()`(距離)や `atan2()`(角度)といった関数で幾何学を計算します。ワールドはプレイヤーの動きに逆行するように `translate3d` と `rotateY` で移動されますが、CSS にはカメラオブジェクトがないためです。 床は `rotateX(90deg)` で回転し、`clip-path`(または新しい `shape()` 関数)を使って任意の多角形や穴に切り取られます。テクスチャタイルはセクター全体にわたって背景位置をワールド座標に合わせて (`background-position: calc(var(--min-x)*-1px) …`) 配置されます。ドア、リフト、その他の動的要素はカスタムプロパティ上で CSS トランジションによってアニメーションし、JavaScript が状態属性を更新します。スプライトは `rotateY` でカメラに向き、`scaleX` で鏡像化したビルボードです。スプライトのアニメーションは CSS の `steps()` キーフレームで行い、攻撃・死亡フレーム用のデータ状態は JavaScript が供給します。弾道は CSS アニメーションで移動し、衝突検出はまだ JavaScript で処理されます。 照明はセクターごとに `filter: brightness(var(--light))` を使って全体的に適用され、ちらつくライトは `@property --light` を通じてアニメーションします。プロジェクトではアンカー位置決め、`@property`、および「ハッキー」な CSS‑のみのカリング手法(オフスクリーン要素を隠すために負の遅延でアニメーションを一時停止)といった実験的機能が採用されています。 数千もの 3D 転送された要素によるパフォーマンスは課題となり、著者は JavaScript で手動フラスタムカリングを実装し、条件付き `if()` のサポートが登場すれば将来的に純粋 CSS ソリューションへ移行する計画です。記事では Safari のビュー遷移による 3D フラット化、background‑image 再ラスター化の問題、コンポジタ不安定性などブラウザバグも文書化し、インラインスタイルやバグ報告といった回避策を紹介しています。 著者はより多くのロジックを純粋 CSS に移すことで JavaScript を完全に排除できる可能性があり、パフォーマンスをさらに向上させることを想定しています。成功すれば、このアプローチは軽量なブラウザベースゲームを刺激し、高度な CSS グラフィックス機能のサポートを促進し、重いエンジンを必要としない効率的なレンダリングが求められる開発者に利益をもたらすでしょう。

2026/03/27 23:39

オープンブースト・オン・モトローラ 88000プロセッサー

## Japanese Translation: (欠落している詳細を補完しつつ明瞭さを保つ)** ``` モトローラ 68000 ファミリーは、1990年代中頃のワークステーション(Apple、Amiga、Atari ST、Sun、HP、NeXT)や多くの産業用ボードで普及していました。 その RISC 後継機種である 88000(m88k)は、68k と PowerPC の間に導入されましたが、約 1994 年頃に期待された性能を提供できず廃止されました。m88k は二世代存在しました: • 88100 – 第1世代 CPU で、オプションの外部 88200 CMMU チップを搭載し、MVME180(20 MHz、2 本の CMMU)と MVME181 に使用されました。 • 88110 – 第2世代 CPU で、統合キャッシュ/MMU を備え、50 MHz を想定していましたが実際には約 40 MHz で販売されました。MVME187(25 MHz、デュアル CMMU、最大 64 MB)、MVME188(SMP、最大 4 CPU と 8 CMMU)、および MVME197 系列(セカンダリキャッシュ)に搭載されました。 VME バスは 32‑bit アドレス/データラインを備えたパッシブバックプレーンであり、複数ボードサポート、割り込みベクタ、オプションのスレーブマッピング、および終端要件があります。 OpenBSD のポートは 1995 年に MVME187 上で開始されました。Nivas Madhur、Steve Murphree、Marc Espie らの貢献は CVS マージ競合、アカウント停止(Theo de Raadt の関与)、GCC‑2.95 互換性問題、カーネルパニック(「align & align‑1」アサーション)および MVME188 上の不完全な SMP サポートに直面しました。ポートは 3.1‑beta スナップショットまで達成しましたが、ハードウェアエラー(VME バスロックアップ、DCAM2 コンフリクト、I²C フェイル)が未解決のまま残っています。 m88k アーキテクチャに関するドキュメントは、モトローラ AT&T System III/V、Data General DG/UX、Omron UniOS などのプロプライエタリ Unix バリアントと無料 CMU Mach コードから取得されました。メンテナー間の個人メール交換は協力、衝突解決、およびニッチなポートの保守課題を示しています。 MVME VME ボードおよび他の m88k システムのユーザーは、この OpenBSD ポートに安全性と安定性を依存しています。継続的なサポートがない場合、利用可能な OS を失うリスクがあり、新しいアーキテクチャへの移行が必要になるかもしれません。 ``` *改善された要約はすべての主要ポイントを反映し、不適切な推測を回避し、主旨を明確に提示し、曖昧または混乱を招く表現を排除しています。

回路レベルで実装したPDP‑11/34エミュレーター | そっか~ニュース