You are here

Add new comment

 長々とお付き合い頂きありがとうございます。
 CPI命令を削除してSTX/LDX命令を8bit単位にしました。それに伴い、オペコード以外に、内部接続や動作も見直しました。
 ブロック図レベルで色々変更したため、回路の再設計前にiverilogで動作確認予定です。本体完成度9割、テストベンチ0割。

> スタック操作も8bitのみにして、BSR/JSRでの戻りアドレスはレジスタ
 命令ステップ数は倍増になりますが、合計実行クロック数では大差なさそうなので、そのほうが良いですね。
 実は、戻りアドレスのレジスタ退避は、回路的には一番簡単そうなため、最初期案ではそうしていました。

 しかし、JSR命令でCPに退避する場合の一時レジスタ不要の回路を思いつかず、CP以外に退避では演算用のレジスタが不足しそう、と考え断念していました。
 バス周りの回路を再検討し、加算器付きMAレジスタを一時レジスタとして共用することにしました。

 上記に伴いLDX/STX命令のオペランドを変更、PCの代わりにFL(SF,ZF,OF,CF)とACにして、割込みもプログラマの責任で対応できるようにしました。
 ただ、STI,CLI命令相当の動作をどうするか要検討。多分I/Oにレジスタを接続して実現。
 またXCH命令の回路も、再検討に伴い、MAレジスタとMDレジスタを一時レジスタに共用する(2)案に変更。

(1) X = X ^ Y ; Y = X ^ Y ; X = X ^ Y
 全組み合わせのレジスタセレクタが必要でバス周りの回路が複雑

(2) MAR = X ; MDR = Y ; Y = MAR ; X = MDR
 2つの一時レジスタが必要

(3) レジスタマッピングレジスタを追加
 回路未検討。クロック速度は低下するがクロック数は最小

> 比較命令の無いもの
RISC-Vは比較命令と分岐命令が悪魔合体していて、正直その発想はなかった。

> JSR/JMP以外のJcc命令をなくす
 すでに分岐命令のオペコードは1つだけで、覚えやすい3文字ニモニックを考えつかないというアホな理由もあり、BSR/JSR命令は無条件のみです。
 1byteの条件スキップ命令も検討しましたが、次の命令が1byteか2byteかによって挙動が変わり、状態管理が一段階複雑化するため、諦めました。

> フラグは……転送系の命令では変化しないものが多い
 自分は転送系でフラグ変化するCPUを、6809以外知りません。もしかして68xx系でも6809だけ?
 転送系の命令でCF変化したら、ALU幅超の演算が大変になることに今更ですが気付いたため、LDX/STX/XCH命令は変化なし、LDA/STA/INX/DCX命令はZFのみ変化にしました。

 以下が少しオペコードを移動した最新版です。名前は小さな4bitCPUということで、ATOM-8をリスペクトしてATOM4としました。
 こんな長いコメントが書き込めることにちょっと驚き。verilogを貼ろうとしたら、タブスペースが消えて読めなかった。

Rn R0..R15
Rx #0:FL,#0:AC,R5:R4..R15:R14

BP (R3:R2:R1:R0)
CP (R7:R6:R5:R4)
DP (R11:R10:R9:R8)
EP (R15:R14:R13:R12)

0000:0000 NOP
0000:0001 HLT
0000:0010 CLC CF = 0
0000:0011 SEC CF = 1
0000:0100 ROR AC(n) = AC(n+1) ; AC(3) = AC(0) ; CF = AC(0)
0000:0101 RRC AC(n) = AC(n+1) ; AC(3) = CF ; CF = AC(0)
0000:0110 ROL AC(n) = AC(n-1) ; AC(0) = AC(3) ; CF = AC(3)
0000:0111 RLC AC(n) = AC(n-1) ; AC(0) = CF ; CF = AC(3)

0000:1000 INX MAR = BP + 1 ; BP = MAR
0000:1001 XCH MAR = CP ; MDR = BP ; BP = MAR ; CP = MDR
0000:1010 XCH MAR = DP ; MDR = BP ; BP = MAR ; DP = MDR
0000:1011 XCH MAR = EP ; MDR = BP ; BP = MAR ; EP = MDR
0000:1100 DCX MAR = BP - 1 ; BP = MAR
0000:1101 XCH MAR = CP ; MDR = DP ; DP = MAR ; CP = MDR
0000:1110 XCH MAR = DP ; MDR = EP ; EP = MAR ; DP = MDR
0000:1111 XCH MAR = EP ; MDR = CP ; CP = MAR ; EP = MDR

0001:bbbb XOI AC = AC ^ uint4
0010:bbbb ANI AC = AC & uint4
0011:bbbb ORI AC = AC | uint4
0100:bbbb ADI AC = AC + uint4 + CF
0101:bbbb LDI AC = uint4

0110:0xxx LDX MAR = BP - 1 ; MDR = [MAR] ; Rx = MDR ; BP = MAR
0110:1xxx LDX MAR = BP ; MDR = [MAR] ; Rx = MDR ; MAR = BP + 1 ; BP = MAR
0111:0xxx STX MAR = BP - 1 ; MDR = Rx ; [MAR] = MDR ; BP = MAR
0111:1xxx STX MAR = BP ; MDR = Rx ; [MAR] = MDR ; MAR = BP + 1 ; BP = MAR

1000:0000 BSR MAR = PC + int8 ; CP = PC ; PC = MAR
1000:0001 BRA MAR = PC + int8 ; PC = MAR
1000:0010 BNE if ZF==0 ; MAR = PC + int8 ; PC = MAR
1000:0011 BEQ if ZF==1 ; MAR = PC + int8 ; PC = MAR
1000:0100 BLO if CF==0 ; MAR = PC + int8 ; PC = MAR
1000:0101 BHS if CF==1 ; MAR = PC + int8 ; PC = MAR
1000:0110 BLT if (SF^OF)==1 ; MAR = PC + int8 ; PC = MAR
1000:0111 BGE if (SF^OF)==0 ; MAR = PC + int8 ; PC = MAR

1000:1000 JSR MAR = CP + int8 ; CP = PC ; PC = MAR
1000:1001 JMP MAR = CP + int8 ; PC = MAR
1000:1010 JNE if ZF==0 ; MAR = CP + int8 ; PC = MAR
1000:1011 JEQ if ZF==1 ; MAR = CP + int8 ; PC = MAR
1000:1100 JLO if CF==0 ; MAR = CP + int8 ; PC = MAR
1000:1101 JHS if CF==1 ; MAR = CP + int8 ; PC = MAR
1000:1110 JLT if (SF^OF)==1 ; MAR = CP + int8 ; PC = MAR
1000:1111 JGE if (SF^OF)==0 ; MAR = CP + int8 ; PC = MAR

1001:nnnn XOR AC = AC ^ Rn
1010:nnnn AND AC = AC & Rn
1011:nnnn ORR AC = AC | Rn
1100:nnnn ADC AC = AC + Rn + CF
1101:nnnn LDA AC = Rn
1110:nnnn SBB AC = AC - Rn + CF
1111:nnnn STA Rn = AC

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。