MC6800の未定義命令について
以下の文章は Claude と共同で作成したものである。 いままで私が調べた内容との齟齬はない。
MC6800 未定義の命令コード 59 個の動き
基準は M6800 Microprocessor Applications Manual (1975) の図 1-3-1 であるt。 この表の 59 個は、図 1-3-1 に無い命令コードである。
模型は visual6502 の chip-6800 の netlist を sim6800.c で解いたものである (JSSim と全ノードで一致。weak の 72 個を捨てる)。
記号は図 1-3-1 の凡例に従う。↕ = 結果で決まる、R = 0 にする、S = 1 にする、• = 変えない。 (1) から (9) は図 1-3-1 の CONDITION CODE REGISTER NOTES の番号である。
1. A、B、メモリの演算
| 操作 | IMMED OP ~ # | DIRECT OP ~ # | INDEX OP ~ # | EXTND OP ~ # | INHER OP ~ # | H | I | N | Z | V | C | 根拠 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A − M − 1 → A | 83 2 2 | 93 3 2 | A3 5 2 | B3 4 3 | • | • | ↕ | ↕ | ↕ | ↕ | SUBA と転送が同じ。桁上げの入力は C によらず 0 | |
| B − M − 1 → B | C3 2 2 | D3 3 2 | E3 5 2 | F3 4 3 | • | • | ↕ | ↕ | ↕ | ↕ | SUBB と転送が同じ。桁上げの入力は C によらず 0 | |
| A − B − 1 → A | 12 2 1、13 2 1 | • | • | ↕ | ↕ | ↕ | ↕ | SBA と転送が同じ。桁上げの入力は C によらず 0 | ||||
| A • B → A | 14 2 1 | • | • | ↕ | ↕ | R | • | TBA に acca/abl1 を足した転送 | ||||
| A • B (A は変えない) | 15 2 1 | • | • | ↕ | ↕ | R | • | 14 から db/acca を除いた転送 | ||||
| A + B → A | 1A 2 1 | ↕ | • | ↕ | ↕ | ↕ | • | ABA から alu/c を除いた転送 | ||||
| A + B + 1 → A | 1C 2 1 | • | • | ↕ | ↕ | ↕ | • | ABA から alu/h と alu/c を除いた転送。桁上げの入力は C によらず 1 | ||||
| A + B → A | 1D 2 1 | • | • | ↕ | ↕ | ↕ | ↕ | ABA から alu/h を除いた転送 | ||||
| DAA と同じ補正を A に足す | 18 2 1 | • | • | ↕ | ↕ | ↕ | • | DAA から alu/c を除いた転送 | ||||
| B → A | 1E 2 1 | • | • | ↕ | ↕ | R | • | TBA と転送が同じ | ||||
| B → A | 1F 2 1 | • | • | ↕ | ↕ | R | 注 A | TBA に alu/c を足した転送 | ||||
| 00 − A (A は変えない) | 41 2 1 | • | • | ↕ | ↕ | (1) | (2) | NEGA から db/acca を除いた転送 | ||||
| 00 − B (B は変えない) | 51 2 1 | • | • | ↕ | ↕ | (1) | (2) | NEGB から db/accb を除いた転送 | ||||
| 00 − M → M | 61 7 2 | 71 6 3 | • | • | ↕ | ↕ | (1) | (2) | NEG と転送が同じ。桁上げの入力は C によらず 1 | |||
| Ā → A | 42 2 1 | • | • | ↕ | ↕ | R | S | COMA と転送が同じ。桁上げの入力は C によらず 0 | ||||
| B̄ → B | 52 2 1 | • | • | ↕ | ↕ | R | S | COMB と転送が同じ。桁上げの入力は C によらず 0 | ||||
| M̄ → M | 62 7 2 | 72 6 3 | • | • | ↕ | ↕ | R | S | COM と転送が同じ。桁上げの入力は C によらず 0 | |||
| A を LSR (A は変えない) | 45 2 1 | • | • | R | ↕ | (6) | ↕ | LSRA から db/acca を除いた転送。sr-cin は C によらず 0 | ||||
| B を LSR (B は変えない) | 55 2 1 | • | • | R | ↕ | (6) | ↕ | LSRB から db/accb を除いた転送。sr-cin は C によらず 0 | ||||
| M を LSR → M | 65 7 2 | 75 6 3 | • | • | R | ↕ | (6) | ↕ | LSR と転送が同じ。sr-cin は C によらず 0 | |||
| A − 1 → A | 4B 2 1 | • | • | ↕ | ↕ | (4) | 注 B | DECA に alu/c を足した転送 | ||||
| B − 1 → B | 5B 2 1 | • | • | ↕ | ↕ | (4) | 注 B | DECB に alu/c を足した転送 | ||||
| M − 1 → M | 6B 7 2 | 7B 6 3 | • | • | ↕ | ↕ | (4) | 注 B | DEC に alu/c を足した転送 | |||
| A → M (注 C) | 87 3 3 | • | • | ↕ | ↕ | R | • | 注 C | ||||
| B → M (注 C) | C7 3 3 | • | • | ↕ | ↕ | R | • | 注 C |
2. インデックスレジスタとスタックポインタ
| 操作 | IMMED OP ~ # | DIRECT OP ~ # | INDEX OP ~ # | EXTND OP ~ # | INHER OP ~ # | 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 と同じ。注 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. 分岐と飛び越し
| 操作 | RELATIVE OP ~ # | INDEX OP ~ # | EXTND OP ~ # | INHER OP ~ # | H | I | N | Z | V | C | 根拠 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| C = 1 のとき分岐 (BCS と同じ条件) | 21 4 2 | • | • | • | • | • | • | BLS と転送が同じ。分岐の条件は注 E | |||
| BSR と同じ | CD 8 2 | • | • | • | • | • | • | 注 D | |||
| JSR と同じ | ED 8 2 | FD 9 3 | • | • | • | • | • | • | 注 D | ||
| (SP + 1) → PCH、(SP + 2) → PCL、SP + 1 → SP | 38 5 1 | • | • | • | • | • | • | RTS から最後の 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 から db/ccr と最後の ab/sp を除いた転送。(SP + 1) は読むが CCR に入れない |
4. レジスタとフラグを変えない
| 操作 | INHER OP ~ # | H | I | N | Z | V | C | 根拠 |
|---|---|---|---|---|---|---|---|---|
| PC を 1 進める | 00 2 1、02 2 1、03 2 1 | • | • | • | • | • | • | NOP と転送が同じ |
| PC を 1 進める | 04 2 1、05 2 1、4E 2 1、5E 2 1 | • | • | • | • | • | • | 転送は NOP と違う。A、B、X、SP、CCR へ読み込む転送とメモリへの書き込みが無い |
5. 後回しにした命令コード
3C、3D、9D、DD。40 周期のうちに次の取り込みが無い。40 周期の終わりでは、4 個ともアドレスバスが 1 周期に 1 ずつ増え、rw = 1、vma = 1 である。3C と 3D は、その前に $0000 に $01、$FFFF に $00 を書く。40 周期より後は走らせていない。
注
- 注 A (1F の C):
alu/cが ALU の桁上げを C に入れる。演算は AND である。$00 の記録では C = 1 になった。CLRA (同じalu/c、AND、B 側 $00) の図 1-3-1 の C は R である。C が何の値で決まるかは確かめていない。 - 注 B (4B、5B、6B、7B の C): 加算は 被演算数 + $FF、桁上げの入力 0 である。だから C は、被演算数が $00 のとき 0、それ以外で 1 になる。
- 注 C (87、C7、8F、CF): 命令の番地を N とする。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) と比べて違う積項は、
op-11xxxxxxとop-10xxxxxxの 2 本だけである。op-11xxxxxxはノード 919 だけを引き下ろし、919 は 954 だけを引き下ろす。954 はop-1xxx11xx_0でも下がる。op-10xxxxxxは#op-ta0-a-aluだけを引き下ろし、その道はノード 1020 を通る。1020 はop-1xxx11xxで下がる。7 組はどれも1xxx11xxに当たるので、954 と#op-ta0-a-aluの値は、違う積項によらず同じになる。 - 注 E (21 の分岐):
#takenの引き下ろしの道を netlist からたどり、N、Z、V、C の 16 通りで計算した。21 は C = 1 の 8 通りで分岐する。同じ計算で 20 と 22 から 2F の 15 個は、図 1-3-1 の BRANCH TEST とすべて一致した。
表の作り方
- 転送の比べ方。 各命令コードの記録から、半周期ごとに立つ名前付きノードのうち
/を含む名前 (acca/dbなど)、ALU の演算 (alu-and、#alu-or、#alu-or-xorの 3 本から AND、OR、XOR、ADD を決める)、alu-slを取り出した。この並びを、図 1-3-1 の 197 個と比べた。 - 値で変わる選び方の計算。 次の 3 つは、フラグで値が変わる。netlist の引き下ろしの道から計算した。記録の値と、定義済みの命令の図 1-3-1 の動きで、計算を確かめた。
#xalu-cin(桁上げの入力): 定義済みの 19 個 (SUBA、SBCA、ADCA、INCA、NEGA、COMA、SBA、ABA、CPX など) で、C = 0 と C = 1 の値が図 1-3-1 の式と合ったsr-cin(右シフトで bit 7 に入れる値): 45、55、65、75 ではop-xxxxxx0xが C によらず 0 にする#taken(分岐の成立): 注 E- DAA の補正のノード
da-c、da-h、dec-low-adjustは、A とフラグだけで決まる。命令コードに依らない
- フラグの記号。 同じフラグの読み込みのノード (
alu/nz、alu/v、alu-sub/cなど) を同じ演算で使う定義済みの命令の、図 1-3-1 の記号を使った。 - ~ と #。 ~ は次の取り込みまでの周期数である (記録から数えた)。# は、次の取り込みの番地と命令の番地の差である。38 と 3A は、図 1-3-1 の RTS、RTI と同じく 1 とした。
$00 の記録で合わせた値
記録は、次の命令 ($00) を 1 つ終えた後の値を読んだ。値が $00 以外になり、式を確かめられた命令コードだけを並べる。
| OP | 記録の値 | 式から出る値 |
|---|---|---|
| 83 | A = $FF、N = 1、C = 1 | $00 − $00 − 1 = $FF |
| 93 | A = $6C、C = 1 | M = ($0000) = $93。$00 − $93 − 1 = $6C |
| C3 | B = $FF、N = 1、C = 1 | $00 − $00 − 1 = $FF |
| 12、13 | A = $FF、N = 1、C = 1 | $00 − $00 − 1 = $FF |
| 1C | A = $01 | $00 + $00 + 1 = $01 |
| 42 | A = $FF、N = 1、C = 1 | Ā = $FF |
| 52、5B | B = $FF | B̄ = $FF、$00 − 1 = $FF |
| 4B | A = $FF、N = 1、C = 0 | $00 + $FF = $FF、桁上げ 0 |
| 61 | ($0000) ← $9F、N = 1、C = 1 | M = $61。$00 − $61 = $9F |
| 62 | ($0000) ← $9D | M̄ = $9D |
| 65 | ($0000) ← $32、V = 1、C = 1 | M = $65。LSR で $32、C = bit 0 = 1、V = N ⊕ C = 1 |
| 6B | ($0000) ← $6A、C = 1 | $6B − 1 = $6A、$6B ≠ $00 なので C = 1 |
| 71、72、75、7B | ($0000) ← $8F、$8D、$3A、$7A | 61、62、65、6B と同じ式。M = $71、$72、$75、$7B |
| 87、C7 | ($0002) ← $00、Z = 1 | A、B = $00 を N + 2 に書く |
| 8F、CF | ($0002)、($0003) ← $00 | SP、X = $0000 を N + 2、N + 3 に書く |
| 38 | SP = $0001 | SP + 1 |
| 3A | SP = $0001 | SP + 1 |
確かめていないこと
- 1F の C が何の値で決まるか (注 A)
- 値で変わる転送の許可が、2 の 4 つの他にあるか。1 の比べ方は $00 の記録だけを使う。だから値で変わる許可は、この比べ方では見つからない
- 14、15、1A、1C、1D、18 の式の値の出どころ (A、B のどちらか)。ノードの名前 (
acca/abl1、accb/dbなど) から書いた。$00 の記録では A と B が同じ値なので、見分けていない - 3C、3D、9D、DD の 40 周期より後の動き
- JSSim の模型が実物の MC6800 と同じ動きをすること