MC6800の未定義命令について
以下の文章は Claude と共同で作成したものである。
いままで私が調べた内容との齟齬はない。
2026.10.01
MC6800 未定義の命令コード 59 個の動き
基準は M6800 Microprocessor Applications Manual (1975) である。 未定義の命令コードは、この書籍の図 1-3-1 に無い命令コードとする。 図 1-3-1 は 197 個を定義している。残りの 59 個が未定義である。
動きは visual6502 の chip-6800 の netlist (トランジスタと配線のつながりの情報) をシミュレータで動かして調べた。
netlist を、Python で書いたシミュレータと C で書いたシミュレータの 2 つで動かした。
12 命令の列を 100 周期走らせ、2010 本の配線の値が、各周期の φ1、φ2 で一致した。
これは 2 つのシミュレータが同じ値を出すことを確かめたものである。59 個の動きは、付録 1 の手法で別に検証した。
表の読み方
以下に未定義の命令コード 59 個を一覧表で示す。 この表の形式は図 1-3-1 に準ずる。記号も図 1-3-1 の凡例と同じである。 ↕ = 結果で決まる、R = 0 にする、S = 1 にする。 操作の欄の • は論理積、フラグの欄の • は変えないことを表す。 (1) から (9) は図 1-3-1 の CONDITION CODE REGISTER NOTES の番号である。
~ は、その命令のフェッチサイクルから、次の命令のフェッチサイクルの直前までの周期の数である。
# は、その命令のバイト数である。
MC6800 のクロックの 1 周期は、φ1 と φ2 の 2 つのフェーズを持つ。
cin は ALU への桁上げの入力である。
引き算は A + NOT(M) + cin で作る。cin = 1 なら A − M、cin = 0 なら A − M − 1 になる。
右端の欄 (図 1-3-1 には無い) には、類似の動作をする既存の命令を 1 つ書き、内部の動作がその命令とどこで違うかを書いた。違いを書いていない所は、その命令と同じである。
6800 は、命令を実行する間、φ1、φ2 ごとに、命令コードから次の 2 つを決める。
- どのレジスタの値を、どのバスやレジスタへ移すか
- ALU で何を計算するか (足し算か論理積か、桁上げの入力を 0 にするか 1 にするか など)
「同じ」は、その命令のフェッチサイクルから、次の命令が終わるまでの間、この 2 つが既存の命令と一致することを指す。 比べたときの次の命令は NOP (01) である。入力は付録 3 に書いた範囲である。 6800 では、命令の最後の周期は、次の命令の周期と重なる。 例えば「SBA (10) と同じ。cin = 0」は、桁上げの入力だけが SBA と違うことを指す。
違いは netlist の配線の名前で書く。 名前の働きは付録 4 に書いた。比べ方は付録 3 に書いた。
1. ACCA、ACCB、メモリの操作
TBA (17) は、内部で ACCB と $FF の論理積を取って ACCA に入れる。14 は $FF の代わりに ACCA を使う (acca/abl1) ので、ACCA と ACCB の論理積になる。15 は、さらに結果を ACCA に書かない (db/acca が無い)。
| 操作 | IMM | ~ | # | DIR | ~ | # | IND | ~ | # | EXT | ~ | # | INH | ~ | # | H | I | N | Z | V | C | 既存の命令との対応 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A − M − 1 → A | 83 | 2 | 2 | 93 | 3 | 2 | A3 | 5 | 2 | B3 | 4 | 3 | • | • | ↕ | ↕ | ↕ | ↕ | SUBA (80、90、A0、B0) と同じ。cin = 0 | |||
| B − M − 1 → B | C3 | 2 | 2 | D3 | 3 | 2 | E3 | 5 | 2 | F3 | 4 | 3 | • | • | ↕ | ↕ | ↕ | ↕ | SUBB (C0、D0、E0、F0) と同じ。cin = 0 | |||
| A − B − 1 → A | 12 | 2 | 1 | • | • | ↕ | ↕ | ↕ | ↕ | SBA (10) と同じ。cin = 0 | ||||||||||||
| A − B − 1 → A | 13 | 2 | 1 | • | • | ↕ | ↕ | ↕ | ↕ | SBA (10) と同じ。cin = 0 | ||||||||||||
| A • B → A | 14 | 2 | 1 | • | • | ↕ | ↕ | R | • | TBA (17) と同じ。acca/abl1 が違う | ||||||||||||
| A • B (A は変えない) | 15 | 2 | 1 | • | • | ↕ | ↕ | R | • | TBA (17) と同じ。acca/abl1 と db/acca が違う | ||||||||||||
| A + B → A | 1A | 2 | 1 | ↕ | • | ↕ | ↕ | ↕ | • | ABA (1B) と同じ。alu/c と alu/c_0 が違う | ||||||||||||
| A + B + 1 → A | 1C | 2 | 1 | • | • | ↕ | ↕ | ↕ | • | ABA (1B) と同じ。cin = 1。alu/c、alu/c_0、alu/h が違う | ||||||||||||
| A + B → A | 1D | 2 | 1 | • | • | ↕ | ↕ | ↕ | ↕ | ABA (1B) と同じ。alu/h が違う | ||||||||||||
| DAA (19) と同じ 10 進補正を A にする | 18 | 2 | 1 | • | • | ↕ | ↕ | ↕ | • | DAA (19) と同じ。C 入力が 0 のとき alu/c と alu/c_0 が違う。6 節を見る | ||||||||||||
| B → A | 1E | 2 | 1 | • | • | ↕ | ↕ | R | • | TBA (17) と同じ | ||||||||||||
| B → A | 1F | 2 | 1 | • | • | ↕ | ↕ | R | S | TBA (17) と同じ。alu/c と alu/c_0 が違う。注 A | ||||||||||||
| 00 − A (A は変えない) | 41 | 2 | 1 | • | • | ↕ | ↕ | (1) | (2) | NEGA (40) と同じ。db/acca だけが違う | ||||||||||||
| 00 − B (B は変えない) | 51 | 2 | 1 | • | • | ↕ | ↕ | (1) | (2) | NEGB (50) と同じ。db/accb だけが違う | ||||||||||||
| 00 − M → M | 61 | 7 | 2 | 71 | 6 | 3 | • | • | ↕ | ↕ | (1) | (2) | NEG (60、70) と同じ | |||||||||
| Ā → A | 42 | 2 | 1 | • | • | ↕ | ↕ | R | S | COMA (43) と同じ | ||||||||||||
| B̄ → B | 52 | 2 | 1 | • | • | ↕ | ↕ | R | S | COMB (53) と同じ | ||||||||||||
| M̄ → M | 62 | 7 | 2 | 72 | 6 | 3 | • | • | ↕ | ↕ | R | S | COM (63、73) と同じ | |||||||||
| A を右へ 1 ビットずらした結果でフラグを決める (A は変えない) | 45 | 2 | 1 | • | • | R | ↕ | (6) | ↕ | LSRA (44) と同じ。db/acca だけが違う | ||||||||||||
| B を右へ 1 ビットずらした結果でフラグを決める (B は変えない) | 55 | 2 | 1 | • | • | R | ↕ | (6) | ↕ | LSRB (54) と同じ。db/accb だけが違う | ||||||||||||
| M を右へ 1 ビットずらして M に入れる | 65 | 7 | 2 | 75 | 6 | 3 | • | • | R | ↕ | (6) | ↕ | LSR (64、74) と同じ | |||||||||
| A − 1 → A | 4B | 2 | 1 | • | • | ↕ | ↕ | (4) | 注 B | DECA (4A) と同じ。alu/c と alu/c_0 が違う | ||||||||||||
| B − 1 → B | 5B | 2 | 1 | • | • | ↕ | ↕ | (4) | 注 B | DECB (5A) と同じ。alu/c と alu/c_0 が違う | ||||||||||||
| M − 1 → M | 6B | 7 | 2 | 7B | 6 | 3 | • | • | ↕ | ↕ | (4) | 注 B | DEC (6A、7A) と同じ。alu/c と alu/c_0 が違う | |||||||||
| A → M (注 C) | 87 | 3 | 3 | • | • | ↕ | ↕ | R | • | 注 C | ||||||||||||
| B → M (注 C) | C7 | 3 | 3 | • | • | ↕ | ↕ | R | • | 注 C |
2. インデックスレジスタとスタックポインタの操作
| 操作 | IMM | ~ | # | DIR | ~ | # | IND | ~ | # | EXT | ~ | # | INH | ~ | # | H | I | N | Z | V | C | 既存の命令との対応 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| (XH/XL) − (M/M + 1) | CC | 3 | 3 | DC | 4 | 2 | EC | 6 | 2 | FC | 5 | 3 | • | • | (7) | ↕ | (8) | • | CPX (8C、9C、AC、BC) と同じ。注 D | |||
| SPH → M、SPL → (M + 1) (注 C) | 8F | 4 | 4 | • | • | (9) | ↕ | R | • | 注 C | ||||||||||||
| XH → M、XL → (M + 1) (注 C) | CF | 4 | 4 | • | • | (9) | ↕ | R | • | 注 C |
3. 分岐と飛び越しの操作
見出しは図 1-3-1 の JUMP AND BRANCH に合わせた。図 1-3-1 と同じく、サブルーチンの呼び出しと復帰も含む。
| 操作 | REL | ~ | # | IND | ~ | # | EXT | ~ | # | INH | ~ | # | H | I | N | Z | V | C | 既存の命令との対応 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| C = 1 のとき分岐 | 21 | 4 | 2 | • | • | • | • | • | • | 分岐の条件は BCS (25) と同じ。注 E | |||||||||
| BSR (8D) と同じ | CD | 8 | 2 | • | • | • | • | • | • | 注 D | |||||||||
| JSR (AD、BD) と同じ | ED | 8 | 2 | FD | 9 | 3 | • | • | • | • | • | • | 注 D | ||||||
| (SP + 1) → PCH、(SP + 2) → PCL、SP + 1 → SP | 38 | 5 | 1 | • | • | • | • | • | • | RTS (39) と同じ。ab/sp が違う。RTS は SP + 2 → SP | |||||||||
| (SP + 2) → B、(SP + 3) → A、(SP + 4) → XH、(SP + 5) → XL、(SP + 6) → PCH、(SP + 7) → PCL、SP + 1 → SP | 3A | 10 | 1 | • | • | • | • | • | • | RTI (3B) と同じ。ab/sp と db/ccr が違う。(SP + 1) は読むが CCR に入れない |
4. PC 以外のレジスタとフラグを変えない命令
| 操作 | INH | ~ | # | H | I | N | Z | V | C | 既存の命令との対応 |
|---|---|---|---|---|---|---|---|---|---|---|
| PC を 1 進める | 00 | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ |
| PC を 1 進める | 02 | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ。cin = 0。注 F |
| PC を 1 進める | 03 | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ。cin = 0。注 F |
| PC を 1 進める | 04 | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ。alu-and、db/adda、ndb/adda が違う |
| PC を 1 進める | 05 | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ。alu-and、db/adda、ndb/adda が違う |
| PC を 1 進める | 4E | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ。alu-and、db/adda、ndb/adda、sum/db が違う |
| PC を 1 進める | 5E | 2 | 1 | • | • | • | • | • | • | NOP (01) と同じ。alu-and、db/adda、ndb/adda、sum/db が違う |
5. 止まらない命令コード
3C、3D、9D、DD は命令が終了しない。アドレスバスの番地を 1 周期に 1 ずつ増やしながら、メモリを読み続ける。 確かめたのは命令の 59 周期目までである。無限に続くという判断は、付録 2 に書いた前提による。 9D と DD は HCF として知られている (Wheeler、BYTE 1977 年 12 月号)。 3C と 3D は HCF に似た命令コードである。9D、DD と違い、スタックに 2 バイト書く。その後の読み方は下の表のとおりで、9 周期目から、番地 SP から 1 ずつ増える番地を読み続ける。
命令の番地を N とする。SP は命令の前の値である。周期は、命令のフェッチサイクルを 1 周期目として数える。
| 周期 | 3C、3D | 9D、DD |
|---|---|---|
| 1 | N を読む | N を読む |
| 2 | N + 1 を読む | N + 1 を読む |
| 3 | 番地 SP に N + 1 の下位バイトを書く | $0001 を読む |
| 4 | 番地 SP − 1 に N + 1 の上位バイトを書く | $0002 を読む |
| 5 から 8 | 番地 SP − 2、SP − 1、SP − 2、SP − 1 を読む | 1 周期に 1 ずつ増える番地を読む |
| 9 から | 番地 SP から、1 周期に 1 ずつ増える番地を読む | 同上 |
3C と 3D は、N + 1 をスタックに積む。SP は 1 だけ減る。 9D と DD は何も書かない。3 周期目に番地 $0001 を読み、その後 1 周期に 1 ずつ増える番地を読む。この番地は SP、X、N によらない。SP は変えない。 4 個とも、R/W は書く周期のほかは 1 である。VMA は 1 のままである。ACCA、ACCB、X は変えない。
次の 6 組で確かめた。6 組目は、N と N + 1 で上位バイトが違う組で、3C と 3D だけを走らせた。
| SP | X | N |
|---|---|---|
| $0100 | $0000 | $F00F |
| $0000 | $1234 | $F00F |
| $8000 | $FFFF | $F00F |
| $FFF0 | $0100 | $E10F |
| $1234 | $8000 | $F0AF |
| $0100 | $0000 | $F0FF |
1 組目の入力で、命令の 9 周期目と 10 周期目から、58 周期目と 59 周期目まで、隣り合う周期の同じフェーズの全配線の値を比べた。φ1、φ2 で 50 組ずつ、100 組である。 違った配線は次のとおりである。
- 9D、DD: 番地を数える回路とアドレスバスの配線
- 3C、3D: 上に加えて、読んだ値が通るデータバスと ALU の配線。読む番地によってメモリの中身が違うからである
4 個とも、命令レジスタ (IR) は命令コードのまま変わらない。
6. DAA
DAA (Decimal Adjust Accumulator、19) は名前の通り、BCD 加算後の 10 進補正をする命令である。 補正では、ACCA に $00、$06、$60、$66 のどれかを足す。この値を以下 K と書く。 18 (未定義) も同じ 10 進補正をする。 ここには、M6800 Microprocessor Applications Manual (1975) に書いていないことと、読み違えやすいことだけを書く。 付録 1 の手法で検証した。
BCD の加算の結果としては起こらない入力
図 1-3-1 の脚注の 3 つの規則は、BCD の加算の結果としては起こらない入力でも、そのまま成り立つ。
上位と下位は、DAA を実行する前の ACCA の上位 4 ビットと下位 4 ビットである。
本来、DAA は BCD 同士の加算 (ABA、ADD、ADC) の直後に使う。そのときの DAA の入力は、加算の結果の ACCA、H、C である。 有効な BCD の値 2 つと、加算の前の C の全部の組を足した。結果の組 (ACCA、H、C) の重複を除くと、380 通りになる。 Table 2-1.4-2 の 9 行は、この 380 通りを含む 384 通りの範囲を書いている。 差の 4 通り (ACCA が $00 から $03、H = 1、C = 0) は、BCD の加算からは起こらない。
BCD の 1 桁は最大で 9 で、ADC では加算の前の C も足す。そのため、BCD の加算の結果は次の範囲に限られる。
- 下位の和が $10 以上になると、H が 1 になる。下位の和は大きくても $9 + $9 + 1 = $13 なので、そのときの結果の下位は 0-3 である
- 和全体が $100 以上になると、C が 1 になる。和全体は大きくても $99 + $99 + 1 = $133 なので、そのときの結果の上位は 0-3 である。下位で H が出ていなければ、下位からの桁上げを足さないので、上位の和は大きくても $9 + $9 = $12 で、結果の上位は 0-2 である
だから Table 2-1.4-2 は、H 入力が 1 の行の下位を 0-3、C 入力が 1 の行の上位を 0-2 か 0-3 までしか書いていない。
BCD の加算の後という条件を外すと、入力は、ACCA の 256 通りと H、C の 2 通りずつで、1024 通りになる。 このうち 644 通りは、BCD の加算からは起こらない。
次の表は、Table 2-1.4-2 の 9 行の範囲を 1024 通りまで広げたものである。 K と C 出力は、1024 通りの全部を走らせて求めた。どの行も、図 1-3-1 の脚注の 3 つの規則のとおりである。
| C 入力 | H 入力 | 上位 | 下位 | K | C 出力 | Table 2-1.4-2 との関係 |
|---|---|---|---|---|---|---|
| 0 | 0 | 0-9 | 0-9 | $00 | 0 | 1 行目と同じ |
| 0 | 0 | 0-8 | A-F | $06 | 0 | 2 行目と同じ |
| 0 | 0 | A-F | 0-9 | $60 | 1 | 4 行目と同じ |
| 0 | 0 | 9-F | A-F | $66 | 1 | 5 行目と同じ |
| 0 | 1 | 0-8 | 0-F | $06 | 0 | 3 行目の上位 0-8 の部分。下位を 0-3 から 0-F に広げた |
| 0 | 1 | 9 | 0-9 | $06 | 0 | 3 行目の上位 9 の部分。下位を 0-3 から 0-9 に広げた |
| 0 | 1 | 9 | A-F | $66 | 1 | 無い |
| 0 | 1 | A-F | 0-F | $66 | 1 | 6 行目。下位を 0-3 から 0-F に広げた |
| 1 | 0 | 0-F | 0-9 | $60 | 1 | 7 行目。上位を 0-2 から 0-F に広げた |
| 1 | 0 | 0-F | A-F | $66 | 1 | 8 行目。上位を 0-2 から 0-F に広げた |
| 1 | 1 | 0-F | 0-F | $66 | 1 | 9 行目。上位と下位を 0-3 から 0-F に広げた |
3 行目 (C 0、H 1、上位 0-9、下位 0-3) は、下位を 0-F に広げると、上位 9、下位 A-F の入力で K が $66 になる。 脚注の 3 つ目の規則 (下位が 9 を超え、上位が 9 なら、上位に 6 を足す) が働くからである。 そのため 3 つの行に分かれ、表は 9 行から 11 行になる。
C
C 入力は、DAA を実行する前の C フラグである。BCD の加算の直後に使うときは、その加算で出た桁上げを表す。 BCD の加算の直後に C 入力が 1 なら、10 進の桁上げはすでに起きているので、DAA は C を 0 にしない。この規則は、BCD の加算からは起こらない入力でも同じである。 C 入力が 0 なら、補正の足し算 (DAA の前の ACCA + K) で桁上げが出たとき、C は 1 になる。 図 1-3-1 の注 (3) は「すでに 1 なら 0 にしない」と規則だけを書き、理由を書いていない。
V
図 1-3-1 は ↕ と書き、Table 2-1.4-2 は「Not defined」と書く。どちらも、何で決まるかを書いていない。 V は、DAA の前の ACCA に K を足したときの符号あふれである。
DAA の後の ACCA = DAA の前の ACCA + K
V = ((DAA の前の ACCA ⊕ DAA の後の ACCA) ∧ (K ⊕ DAA の後の ACCA) ∧ $80) ≠ 0
DAA の後の ACCA は、和の下位 8 ビットである。
V が 1 になるのは 1024 通りのうち 216 通りである。V は H 入力によらない。
| C 入力 | V = 1 になる DAA の前の ACCA | 個数 (H 入力 2 通りの合計) |
|---|---|---|
| 0 | $7A から $7F | 12 |
| 1 | $1A から $7F | 204 |
V = 1 は、BCD の加算の結果を入力にしたときも起きる。380 通りのうち 36 通りがそうである。 例えば $38 + $42 = $7A の後に DAA を使うと、$7A + $06 = $80 になり、V = 1 になる。 V を必ず 0 にする実装は、この 36 通りで外れる。
7. 注
- 注 A (1F の C): C はデータによらず 1 になる。ACCB を 256 通り、C フラグを 0 と 1 の 2 通りで走らせ、512 通りとも C = 1 だった。
1F は、加算器の 2 つの入力に ACCB と $FF を入れ、cin を 1 にして、論理積の動作をする。
C が 1 になる理由は、ALU が論理積を加算器で作ることにある。netlist で分かる。
加算器の各ビットは、2 つの入力のビット A、B から、生成 g と伝播 p を作る。c を下のビットからの桁上げとする。
g は、そのビットで桁上げを作る条件である。p は、c を上へ伝える条件である。上へ出す桁上げは g OR (p AND c) である。
そのビットの和は p XOR c である。
足し算では p = A XOR B、g = A·B である。
論理積の動作 (
alu-andが High) では、p = NOT(A·B) になる。また bit 0 から bit 6 では、g が値によらず 1 になる。 cin も 1 なので、どのビットにも c = 1 が入る。だから各ビットの和は NOT(A·B) XOR 1 = A·B で、論理積になる。 bit 7 では g を 1 にしない。bit 7 の和を論理積にするのに要る c は、すでに bit 6 から入っている。bit 7 の g が変えるのは、加算器の外へ出る桁上げだけである。 bit 7 の 2 つの入力のビットを A7、B7 とする。bit 7 の g は A7·B7、p は NOT(A7·B7) で、どちらかが必ず 1 になる。だから論理積の動作では、加算器から必ず桁上げが出る。 演算の桁上げとは別に、C を 0 にする制御がある。CLRA の C が R なのは、CLRA が01xx11x1の形の命令コードに当たり、この制御が働くからである。1F は当たらないので、桁上げがそのまま C に入る。 - 注 B (4B、5B、6B、7B の C): 加算は、被演算数 + $FF、桁上げの入力 0 である。だから C は、被演算数が $00 のとき 0、それ以外で 1 になる。
- 注 C (87、C7、8F、CF): 命令の番地を N とする。2 周期目に N + 1 を読む。87 と C7 は N + 2 に書き、次の命令は N + 3 である。8F と CF は N + 2 と N + 3 に書き、次の命令は N + 4 である。
- 注 D (CC、DC、EC、FC、CD、ED、FD): 比べた既存の命令 (8C、9C、AC、BC、8D、AD、BD) との違いは、命令コードの bit 6 だけである。この 7 個はどれも
1xxx11xxに当たる。netlist をたどると、bit 6 の違いはこの形の命令コードでは結果を変えない。だから比べた既存の命令と同じ動きになる。 - 注 E (21 の分岐): 分岐するかどうかを決める回路を netlist からたどり、N、Z、V、C の 16 通りで計算した。21 は C = 1 の 8 通りで分岐する。同じ計算で 20 と 22 から 2F の 15 個は、図 1-3-1 の BRANCH TEST とすべて一致した。
- 注 F (02、03 の桁上げの入力): NOP (01) の桁上げの入力は 1 で、
$00 + $FF + 1 = $00を出す。02 と 03 は 0 で、$00 + $FF + 0 = $FFを出す。この結果はどこにも入らない。A、B、X、SP、CCR、メモリのどれも NOP と同じになる。03 はsr-cinも NOP と違うが、sr/adda(内部のバスの値を右へ 1 ビットずらして ALU の A の入口に入れる配線) が Low なので ALU の A の入口に入らない。NOP と、12 周期の間、全配線を比べて確かめた。
付録 1. 表の検証
3C、3D、9D、DD を除く 55 個について、1 節から 4 節に書いた操作、フラグ、周期の数、バイト数を走らせて確かめた。ただし 38、3A のバイト数は除く。 書いた内容と違う値が出た入力は 1 つも無い。 確かめたのは ACCA、ACCB、X、SP の値、CCR の下位 6 ビット、メモリへ書いた番地と値、次の命令の番地、周期の数である。 CC、DC、EC、FC、CD、ED、FD は、既存の命令と同じ入力で両方を走らせ、上の全部と、各周期のアドレス、R/W、VMA を比べた。
| 命令コード | 入力 | 通り数 |
|---|---|---|
| 83 | ACCA と M の 65536 通り全部。CCR は 2 つの値の排他的論理和の下位 6 ビット | 65536 |
| C3 | ACCB と M の 65536 通り全部。CCR は同上 | 65536 |
| 12、13、14、15、1A、1C、1D | ACCA と ACCB の 65536 通り全部。CCR は同上 | 65536 ずつ |
| 93、B3 | ACCA と M を境界の値の 10 個ずつ × CCR 8 通り | 800 ずつ |
| D3、F3 | ACCB と M を境界の値の 10 個ずつ × CCR 8 通り | 800 ずつ |
| A3、E3 | X 8 通り × 被演算数 10 個 × CCR 8 通り | 640 ずつ |
| 18、1E、1F、41、42、45、4B、51、52、55、5B、61、62、65、6B、71、72、75、7B、87、C7 | 値 256 通り × CCR 64 通り | 16384 ずつ |
| 61、62、65、6B (追加) | X 8 通り × M 10 個 × CCR 8 通り | 640 ずつ |
| 8F、CF | SP か X を 12 通り × CCR 64 通り | 768 ずつ |
| 00、02、03、04、05、4E、5E | ACCA と ACCB 3 組 × CCR 64 通り | 192 ずつ |
| 38、3A | SP 5 通り × CCR 64 通り | 320 ずつ |
| 21 | CCR 64 通り | 64 |
| 19 | 値 256 通り × CCR 64 通り | 16384 |
| CC、DC、EC、FC | X 8 通り × 被演算数 12 組 × CCR 8 通り | 768 ずつ |
| CD、ED、FD | SP 5 通り × X 3 通り × 飛び先 3 通り × CCR 8 通り | 360 ずつ |
境界の値として選んだ 10 個は $00、$01、$0F、$10、$7F、$80、$81、$8F、$FE、$FF である。 X の 8 通りは $0000、$0001、$00FF、$0100、$7FFF、$8000、$FFFE、$FFFF である。 CCR の 8 通りは $00、$3F、$01、$02、$04、$08、$10、$20 である。
この範囲で、I、H、N、Z、V の初めの値は、ACCA、ACCB、X、SP、C、書いた値、次の命令の番地を変えない。例外は 18 と 19 で、H の初めの値は K の下位の桁 (0 か 6) を変えるので、ACCA を変える。K の上位の桁と C は変えない。 C の初めの値で次の命令の番地が変わるのは 21 だけである。
3C、3D、9D、DD は命令が終了しないので、実行後の状態を 1 つの式で書けない。5 節の 6 組の入力で、周期ごとの番地と書いた値を確かめた。
付録 2. 未確認の点
- 既存の命令との対応の欄を決めるとき、入力は 128 通りから 2048 通りである。他の値で違う配線が出るかどうかは確かめていない
- 87、C7、8F、CF の既存の命令との対応の欄は、配線を比べていない
- 38 と 3A のバイト数は、次の命令の番地に出ないので確かめていない
- 注 E の 20 と 22 から 2F は、付録 1 の手法では検証し直していない
- 5 節の 4 個で、番地を数える回路の値がほかの配線を変えないことは確かめていない。「無限に繰り返す」はこれを前提にしている
- 5 節の 4 個で、CCR を変えて走らせていない
- visual6502 の netlist が実物の MC6800 と同じ動きをするかは確かめていない
付録 3. 既存の命令との対応の比べ方
配線の名前の働きは付録 4 に書いた。
比べた配線は次の 4 種類である。
- 名前に
/を含む配線 (#で始まるものを除く)。レジスタとバスの間をつなぐトランジスタを ON/OFF する配線である - ALU の動作を決める
alu-and、#alu-or、#alu-or-xor、alu-sl、do-alu-cin sr-cin。ただしsr/addaが High の間だけ- 1010。ただし
insn/c、insn/v、insn/iのどれかが High の間だけ。1010 は命令コードの bit 0 で決まり、この 3 本で C、V、I に入る。SEC、CLC などで、フラグを 1 にするか 0 にするかを決める値である
ほかの配線の違いは書かない。理由は次のとおりである。
- レジスタ (ACCA、ACCB、X、SP、PC、TMP) の入口に値を入れるトランジスタは、全部が上の 1 の配線で ON/OFF する
- フラグの入口は、1 の配線のほかに、
/を含まない制御の配線 (1108、1009、1111、1035、992、1011) でも ON/OFF する。この 6 本は、下の 51 組 (未定義の命令コード 51 個と、それぞれの既存の命令の組) のどの入力でも違わなかった - この入口を通る値は、レジスタ、バス、ALU の結果の値か、命令コードのビットから直接作る値 (
sr-cin、1010) である。後の 2 つは上の 3、4 で比べた - だから、比べた配線が一致すれば、どこからどこへ値を移すかと、ALU で何を計算するかが一致する。運ぶ値は一致するとは限らない。ほかの配線の違いは、運ぶ値の違いである
- 運ぶ値のうち、命令コードの値そのものは、フェッチサイクルで
db/tmpによって TMP に入る (256 個の命令コードで、同じフェーズにdb/tmpが High になる)。そのため、命令コードが違えば、その値を運ぶ配線に違いが出る。この値が ACCA、ACCB、X、SP、CCR、メモリの最終の値に影響しないことは、付録 1 で、表の操作のとおりの値になることで確かめた
入力は、CCR の 16 通り (N、Z、V、C) と ACCA、ACCB、被演算数の 8 組を掛けた 128 通りである。 X を使う組は X の 4 通りを、SP を使う組は SP の 4 通りを、18 は H の 2 通りを掛けた。 比べた範囲は、その命令のフェッチサイクルから、次の命令 (NOP、2 周期) が終わるまでである。 違いが最後に出たのは、最も遅い組で、次の命令の 2 周期目の φ2 の間だった。83、93、A3、B3、C3、D3、E3、F3、12、13、1C、21、02、03、04、05、4E、5E がそうである。
87、C7、8F、CF、3C、3D、9D、DD を除く 51 個を比べた。
18 を除く 50 個は、比べたどの入力でも、違いが出た配線の名前の集まりが同じだった。18 は C 入力が 0 の 128 通りでだけ alu/c と alu/c_0 が違う。
付録 4. 配線の名前
/ を含む名前は「元/先」の形で、元の値を先へ移す配線を表す。
数字だけの名前 (1010、1108 など) は、netlist で名前の無い配線の番号である。
表と付録 3 で使う名前の働きは次のとおりである。
| 名前 | 働き |
|---|---|
acca/abl1 | ACCA を ALU の B の入口に入れる |
db/acca | 内部のバスの値を ACCA に入れる (ACCA に書く) |
db/accb | 内部のバスの値を ACCB に入れる |
db/adda | 内部のバスの値を ALU の A の入口に入れる |
ndb/adda | 内部のバスの値の反転を ALU の A の入口に入れる |
alu-and | ALU で論理積を取る |
do-alu-cin | ALU の桁上げの入力 (cin) を 1 にする |
alu/c、alu/c_0 | ALU の桁上げを C に入れる |
alu/h | ALU の bit 3 から bit 4 への桁上げを H に入れる |
sum/db | ALU の結果を内部のバスに出す |
ab/sp | アドレスバスの値を SP に入れる (SP に書く) |
db/ccr | 内部のバスの値を CCR に入れる |
sr/adda | 内部のバスの値を 1 ビット右へずらして ALU の A の入口に入れる。bit 7 には sr-cin が入る |
sr-cin | sr/adda が High のときに、ALU の A の入口の bit 7 に入る値。命令コードの bit 1 で決まる |
db/tmp | 内部のバスの値を TMP (一時レジスタ) に入れる |