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 ~ #HINZVC根拠
A − M − 1 → A83 2 293 3 2A3 5 2B3 4 3SUBA と転送が同じ。桁上げの入力は C によらず 0
B − M − 1 → BC3 2 2D3 3 2E3 5 2F3 4 3SUBB と転送が同じ。桁上げの入力は C によらず 0
A − B − 1 → A12 2 1、13 2 1SBA と転送が同じ。桁上げの入力は C によらず 0
A • B → A14 2 1RTBA に acca/abl1 を足した転送
A • B (A は変えない)15 2 1R14 から db/acca を除いた転送
A + B → A1A 2 1ABA から alu/c を除いた転送
A + B + 1 → A1C 2 1ABA から alu/halu/c を除いた転送。桁上げの入力は C によらず 1
A + B → A1D 2 1ABA から alu/h を除いた転送
DAA と同じ補正を A に足す18 2 1DAA から alu/c を除いた転送
B → A1E 2 1RTBA と転送が同じ
B → A1F 2 1R注 ATBA に 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 → M61 7 271 6 3(1)(2)NEG と転送が同じ。桁上げの入力は C によらず 1
Ā → A42 2 1RSCOMA と転送が同じ。桁上げの入力は C によらず 0
B̄ → B52 2 1RSCOMB と転送が同じ。桁上げの入力は C によらず 0
M̄ → M62 7 272 6 3RSCOM と転送が同じ。桁上げの入力は C によらず 0
A を LSR (A は変えない)45 2 1R(6)LSRA から db/acca を除いた転送。sr-cin は C によらず 0
B を LSR (B は変えない)55 2 1R(6)LSRB から db/accb を除いた転送。sr-cin は C によらず 0
M を LSR → M65 7 275 6 3R(6)LSR と転送が同じ。sr-cin は C によらず 0
A − 1 → A4B 2 1(4)注 BDECA に alu/c を足した転送
B − 1 → B5B 2 1(4)注 BDECB に alu/c を足した転送
M − 1 → M6B 7 27B 6 3(4)注 BDEC に alu/c を足した転送
A → M (注 C)87 3 3R注 C
B → M (注 C)C7 3 3R注 C

2. インデックスレジスタとスタックポインタ

操作IMMED OP ~ #DIRECT OP ~ #INDEX OP ~ #EXTND OP ~ #INHER OP ~ #HINZVC根拠
(XH/XL) − (M/M + 1)CC 3 3DC 4 2EC 6 2FC 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 ~ #HINZVC根拠
C = 1 のとき分岐 (BCS と同じ条件)21 4 2BLS と転送が同じ。分岐の条件は注 E
BSR と同じCD 8 2注 D
JSR と同じED 8 2FD 9 3注 D
(SP + 1) → PCH、(SP + 2) → PCL、SP + 1 → SP38 5 1RTS から最後の 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 → SP3A 10 1RTI から db/ccr と最後の ab/sp を除いた転送。(SP + 1) は読むが CCR に入れない

4. レジスタとフラグを変えない

操作INHER OP ~ #HINZVC根拠
PC を 1 進める00 2 1、02 2 1、03 2 1NOP と転送が同じ
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-11xxxxxxop-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 とすべて一致した。

表の作り方

  1. 転送の比べ方。 各命令コードの記録から、半周期ごとに立つ名前付きノードのうち / を含む名前 (acca/db など)、ALU の演算 (alu-and#alu-or#alu-or-xor の 3 本から AND、OR、XOR、ADD を決める)、alu-sl を取り出した。この並びを、図 1-3-1 の 197 個と比べた。
  2. 値で変わる選び方の計算。 次の 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-cda-hdec-low-adjust は、A とフラグだけで決まる。命令コードに依らない
  3. フラグの記号。 同じフラグの読み込みのノード (alu/nzalu/valu-sub/c など) を同じ演算で使う定義済みの命令の、図 1-3-1 の記号を使った。
  4. ~ と #。 ~ は次の取り込みまでの周期数である (記録から数えた)。# は、次の取り込みの番地と命令の番地の差である。38 と 3A は、図 1-3-1 の RTS、RTI と同じく 1 とした。

$00 の記録で合わせた値

記録は、次の命令 ($00) を 1 つ終えた後の値を読んだ。値が $00 以外になり、式を確かめられた命令コードだけを並べる。

OP記録の値式から出る値
83A = $FF、N = 1、C = 1$00 − $00 − 1 = $FF
93A = $6C、C = 1M = ($0000) = $93。$00 − $93 − 1 = $6C
C3B = $FF、N = 1、C = 1$00 − $00 − 1 = $FF
12、13A = $FF、N = 1、C = 1$00 − $00 − 1 = $FF
1CA = $01$00 + $00 + 1 = $01
42A = $FF、N = 1、C = 1Ā = $FF
52、5BB = $FFB̄ = $FF、$00 − 1 = $FF
4BA = $FF、N = 1、C = 0$00 + $FF = $FF、桁上げ 0
61($0000) ← $9F、N = 1、C = 1M = $61。$00 − $61 = $9F
62($0000) ← $9DM̄ = $9D
65($0000) ← $32、V = 1、C = 1M = $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、$7A61、62、65、6B と同じ式。M = $71、$72、$75、$7B
87、C7($0002) ← $00、Z = 1A、B = $00 を N + 2 に書く
8F、CF($0002)、($0003) ← $00SP、X = $0000 を N + 2、N + 3 に書く
38SP = $0001SP + 1
3ASP = $0001SP + 1

確かめていないこと

  • 1F の C が何の値で決まるか (注 A)
  • 値で変わる転送の許可が、2 の 4 つの他にあるか。1 の比べ方は $00 の記録だけを使う。だから値で変わる許可は、この比べ方では見つからない
  • 14、15、1A、1C、1D、18 の式の値の出どころ (A、B のどちらか)。ノードの名前 (acca/abl1accb/db など) から書いた。$00 の記録では A と B が同じ値なので、見分けていない
  • 3C、3D、9D、DD の 40 周期より後の動き
  • JSSim の模型が実物の MC6800 と同じ動きをすること