
2026/07/28 22:56
メモ1:ミニテルをターミナルとして使用する、ゼロから組み立てられた6502コンピュータ
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
メモ-1 は、32KB の RAM と 16KB の ROM を備えた 1MHz で動作する 65C02 CPU を中心としたシンプルなコンピュータです。システムには 65C22 VIA と 6551 ACIA が搭載されており、後者は本物の Minitel ターミナルとの互換性に不可欠です(W65C51 バリ언トは互換性がありません)。システムのメモリアドレス配列は以下の通りです:0x0000–0x7FFF で RAM(実質 8KB 使用可能)、0x8000–0x9FFF で VIA と ACIA、0xA000–0xBFFF で 32 ピンコネクター(J4)を介して接続された外部スロット(完全な CPU バスを暴露)、0xC000–0xFFFF で ROM。$8000 の VIA は 2 つのアタリ CX40 ジョイスティックポート(ポート A とポート B)を提供し、各ポートのビット 0–4 がそれぞれ Up、Down、Left、Right、Fire を定義します。ソフトウェアは JOY() 関数を通じてこれらの入力を制御します(JOY(0) はポート A、JOY(1) はポート B)。ポート B ビット 7 の VIA タイマーは、提供された周波数-値テーブルを使用して音階を生成します(例:DO が 1911、LA が 1136)。起動時にシステムは src/startup.s を実行し、ACIA と VIA を初期化し、Minitel 1b ターミナルのボーレートを設定し、ブートメニューを表示します。このメニューからユーザーは WOZMON(スティーブ・ウォズニアックによるもの)を起動したり、MS-BASIC のインタプリタを使用して実行したり、スロットから読み込まれた外部 ROM コードを実行したり、システム情報を表示したりできます。外部 ROM の検出には $A000 における最初のオペコードを確認し、$A0 の値は空のスロットを示し、有効な ROM は $A008 から以降のアドレスで実行を許可します。開発者は ca65 および ld65 などのツールを使用してアセンブリコードをコンパイルし、memo.cfg を介して msbasic.s から memo.bin などのファームウェアを生成するための特定のコマンドシーケンスに従う必要があります。このプロジェクトは Benoit Aveline(Memoire Morte)によって CC BY-NC-SA ライセンス(2025 年)の下で公開されており、クレジットを残しつつ変更を歓迎しています。主要な依存関係には WOZMON、BASIC-M6502、Michael Steil の逆アセンブリが含まれます。
本文
メモワール・モルト:65C02 ベースのコンピュータ「メモー 1」
Benno Aveline(別名「メモワール・モルト」) が作成した、娯楽と学習を目的としたシンプルな 65C02 搭載コンピュータです。 プロジェクトページには BOM(材料リスト)、組み立て手順、ROM ファイルなどが公開されています。
技術仕様
- CPU: 65C02(動作クロック速度:1MHz)
- RAM: 32KB
- ROM: 16KB
- 周辺 IC:
- VIA:W65C22
- ACIA: W65C51(※注:Minitel 互換性の問題から W65C51 を使用)
- 拡張機能: 8KB の ROM スロット
- ターミナル接続: Minitel 1b
メモリーマップ
| アドレス範囲 (十六進法) | 機能 |
|---|---|
- | RAM |
- | RAM |
- | RAM |
- | RAM |
- | RAM |
- | RAM |
- | RAM |
- | RAM |
- | VIA |
- | ACIA |
- | 外部スロット (拡張用) |
- | ROM |
注意: 65C02 は応答しないアドレスで高位ニブルを読み取るため、
に$A000が読み取られる場合、外部スロットに ROM が存在しないと判断されます。$A0
外部スロット (拡張スロット)
32 ピンのコネクタ (J4) で構成され、CPU バスを完全にオーバーレイしています。 コードを実行するためには、
$A000 ~ $BFFF の間にコンパイルされた実行可能コードが必要です。
ピン配置
| ピン | シグナル | ピン | シグナル |
|---|---|---|---|
| 1 | A0 | 2 | D0 |
| 3 | A1 | 4 | D1 |
| 5 | A2 | 6 | D2 |
| 7 | A3 | 8 | D3 |
| 9 | A4 | 10 | D4 |
| 11 | A5 | 12 | D5 |
| 13 | A6 | 14 | D6 |
| 15 | A7 | 16 | GND |
| 17 | A8 | 18 | GND |
| 19 | A9 | 20 | |
| 21 | A10 | 22 | CLK |
| 23 | A11 | 24 | |
| 25 | A12 | 26 | |
| 27 | A13 | 28 | |
| 29 | A14 | 30 | R/W |
| 31 | A15 | 32 | +5V |
- オッドピン (奇数): アドレスバス (
~A0
)A15 - イブンスロット (偶数): データバス (
~D0
)、制御信号などD7
: CPU が/Ext select
~$A000
をアクセスする際にローレベルで有効化されます。$BFFF
拡張機能
- 外部 ROM 実行: カスタム名を読み取り、
からコードを実行します。$A008 - KCS (カセットテープ拡張): BASIC コードやメモリダンプの保存・読み込みに対応します。
VIA (W65C22)
VIA は
$8000 ~ $8FFF の範囲でアクセス可能ですが、割り込みトリガ機能はありません。
2 つのアタリ CX40 ジョイスティックポート を提供しています。
アドレスマップ
- $8000: ポート B (読み書き可)
- $8001: ポート A (読み書き可)
- $8002: データディレクションレジスタ B
- $8003: データディレクションレジスタ A
- $8004: タイマー 1 の低バイト
- $8005: タイマー 1 の高バイト
- $800B: サポート制御レジスタ
ジョイスティック割り当て
- ジョイスティック 0: VIA ポート A ビット
[0~4] - ジョイスティック 1: VIA ポート B ビット
[0~4]
| ボタン | アクション | ビット番号 |
|---|---|---|
| Up (上) | - | 0 |
| Down (下) | - | 1 |
| Left (左) | - | 2 |
| Right (右) | - | 3 |
| Fire (発射) | - | 4 |
BASIC の
関数
JOY()
$8000(ポート B)と $8001(ポート A)のステータス値を返します。
上位ビット [5~7] は将来拡張用として用意されています。
サンプルコード:ジョイスティック動作確認
10 A = JOY(0) 20 IF A = 31 THEN GOTO 10 30 IF A = 30 THEN PRINT "UP" 40 IF A = 29 THEN PRINT "DOWN" 50 IF A = 27 THEN PRINT "LEFT" 60 IF A = 23 THEN PRINT "RIGHT" 70 IF A = 15 THEN PRINT "FIRE" 80 GOTO 10 RUN
TONE ルーチン (サウンド)
ポート B ビット 7 にスクエア波トーンを再生します(クロック:1MHz)。
| 音階 | 周波数 (Hz) | バイナリ値 |
|---|---|---|
| DO# | 277.18 | 1808 |
| RE# | 311.13 | 1607 |
| MI | 329.63 | 1517 |
| FA# | 369.99 | 1350 |
| SOL# | 415.30 | 1203 |
| SI | 493.88 | 1010 |
| DO | 261.63 | 1911 |
| RE | 293.66 | 1702 |
| FA | 349.23 | 1432 |
| SOL | 392.00 | 1275 |
| LA | 440.00 | 1136 |
| LA# | 466.16 | 1073 |
サンプルコード:「ラ」の音を鳴らす
10 TONE 1136 20 K = 40 30 FOR I=0 TO K STEP 1 40 PRINT I 50 NEXT I 60 TONE 0 70 END RUN
ACIA (W65C51)
Minitel ドライバに使用される UART チップです。 (注:W65C51 は Minitel とのハードウェア互換性の問題により、ACIA-6521/6551 同等品として動作 assumed)
| レジスタ名 | アドレス |
|---|---|
| データレジスタ | |
| ステータスレジスタ | |
| コマンドレジスタ | |
| 制御レジスタ | |
メニュー画面
起動時 (
src/startup.s) に表示されるブートメニューです。
システム初期化(ACIA/VIA、ボーレート変更、ローカルエコー無効化)後、以下の選択肢が可能です。
| キー操作 | 動作説明 |
|---|---|
| 1 | WOZMON: スティーブ・ウォズニアック氏開発のメモリ検査・編集モニタ |
| 2 | MS-BASIC: Microsoft BASIC インタープリタを起動 |
| 3 | 外部 ROM 実行: に ROM が検出された場合のみ表示されます |
| A | About: システム情報、ライセンス、クレジットを表示 |
自動検知機能: メニューは外部 ROM の有無を自動的に検知し、対応するオプションを動的に調整します。
環境とターミナル
ターミナル (Minitel 1b)
- プロジェクトでは Minitel 1b を想定しています。
- 実装:
(簡易的な Minitel ドライバ)src/minitel.s - 使用チップ:ACIA-6551
注記: Minitel プリンタへの対応は現在開発中です。
コードの組み立て環境
アセンブラ・リンカとして ca65 と ld65 を使用します。
src ディレクトリと出力用 out ディレクトリを前提としています。
基本的なビルドコマンド
cd src ca65 -D memo msbasic.s -o ../out/memo.o ld65 -C memo.cfg ../out/memo.o -o ../out/memo.bin -Ln ../out/memo.lbl
エラー対処: asminc
の不足
asminclongbranch.mac が含まれていない場合、アセンブラの include パスに /usr/local/cc65/share/cc65/asminc を追加してください。
ca65 -I /usr/local/cc65/share/cc65/asminc -D memo msbasic.s -o ../out/memo.o
ライセンスとクレジット
著作権者: Benno Aveline (別名「メモワール・モルト」)
ライセンス: Creative Commons BY-NC-SA (© 2025)
目的: 娯楽および学習を目的としたプロジェクト
特別感謝
- Ben Eater: 6502 ベースのコンピュータ設計とチュートリアル(CC-B ライセンス)
- Ian Ward: 2004 LCD と 555 タイマに関する YouTube 動画(ライセンス未明)
パッチコード元ネタ
| ソフトウェア | 著者・会社 | 著作権情報 |
|---|---|---|
| WOZMON | Steve Wozniak | © 1976 Apple (知的財産権発生前のコード) |
| BASIC-M6502 | Weiland & Gates | Microsoft / MIT ライセンス |
| MS-BASIC (逆アセンブル版) | Michael Steil | BSD 2-Clause ライセンス |