情報工学教育用に開発された8ビットマイクロプロセッサKUE-CHIP2の命令 セットアーキテクチャを実現することを課題とする.但し,外部インタフェー スは与えられたものを変更してはならない.また,KUE-CHIP2のSFL記述でのモ ジュール名はKUE_CHIP2とする.
メモリ空間は512バイトでバイト単位に指定される.0バイト目から255バイ ト目はプログラム領域とよばれ,プログラムまたはデータを格納する領域とし て利用する.256バイト目から511バイト目まではデータ領域と呼ばれ,データ を格納する領域としてのみ利用する.
プログラム領域またはデータ領域を指定するアドレスの最上位ビット(第9ビッ ト目)は命令コード内のビットから生成される.このビットで,プログラム領 域またはデータ領域のいずれにアクセスするかが決められる.なお,すべての メモリ空間はKUE-CHIP2の外部にある.
KUE-CHIP2のデータ語は最上位ビット(第7ビット)が符号に対応し,2の補数 表示で負の数を表す.
KUE-CHIP2の命令サイズは1バイトまたは2バイトであり,以下の4種類の形式で 構成される.
KUE-CHIP2のアドレスモードの一覧を以下に示す.
ACC :アキュムレータ
IX :インデックスレジスタ
d :即値アドレス
[d] :絶対アドレス(プログラム領域)
(d) :絶対アドレス(データ領域)
[IX+d] :インデックス修飾アドレス(プログラム領域を指定)
(IX+d) :インデックス修飾アドレス(データ領域を指定)
アキュムレータACCとインデックスレジスタIXの2つのレジスタ指定と,メモリ アクセス時のアドレス指定ができる.メモリアクセス時のアドレス指定には5 つのモードがあり,即値アドレス,絶対アドレス(プログラム領域指定とデー タ領域指定),インデックスレジスタによる修飾アドレス(プログラム領域指定 とデータ領域指定)がある.
即値アドレスでは第2オペランドの内容がそのままデータとなる.絶対アドレ スでは第2オペランドの内容がデータの格納されているアドレスを示す.イン デックス修飾アドレスでは第2オペランドの内容とインデックスレジスタIXの 内容を加算して決まる値が第2オペランドのアドレスとなる.インデックス修 飾アドレスでのオーバフローは無視される.
命令語は1バイトあるいは2バイトで構成され,命令はプログラム領域にアドレ スの若番から老番に格納される.すなはち,命令の2バイト目は1バイト目の次 のアドレスに置かれ,分岐命令が成功する場合を除いて次のアドレスの命令が 次に実行される.
命令は19種で,入力命令2,シフト命令2,算術論理演算命令8,フラグセット 命令2,ロード命令,ストア命令,ブランチ命令,NOP命令,停止命令からなる.
各命令の簡単な動作は以下のとおりである.
[タイプ1] NOP(No OPeration) 何もしない. HLT(HaLT) 停止命令. OUT(OUTput) 出力命令.ACCの内容をOBUFへ移す. IN(INput) 入力命令.IBUFの内容をACCへ移す. RCF(Reset CF) 桁上げフラグCFをリセットする. SCF(Set CF) 桁上げフラグCFをセットする. [タイプ2] Bcc(Branch cc) 分岐命令.条件コードccによって分岐. [タイプ3] Ssm(Shift sm) シフト命令.smはシフトモードの指定. Rsm(Rotate vsm) 巡回シフト命令. [タイプ4] LD(LoaD) ロード命令.メモリの内容をレジスタへ移す. ST(STore) ストア命令.レジスタの内容をメモリへ移す. SBC(SuBtract with Carry)減算命令.桁上げフラグCFを考慮する. ADC(ADd with Carry) 加算命令.桁上げフラグCFを考慮する. SUB(SUBtract) 減算命令.桁上げフラグCFを考慮しない. ADD(ADD) 加算命令.桁上げフラグCFを考慮しない. EOR(Exclusive OR) ビット毎の排他的論理和演算命令. OR(OR) ビット毎の論理和演算命令. AND(AND) ビット毎の論理積演算命令. CMP(CoMPare) 比較命令.
命令コードと動作の詳細を以下に示す.下記の命令コードに違反した命令に対 する動作の保証は不要である.
略記号 命令コード 命令の動作
NOP 0 0 0 0 0 - - - 何もしない
HLT 0 0 0 0 1 - - - 停止
0 1 0 1 - - - - 未使用(HLT)
OUT 0 0 0 1 0 - - - (ACC)->OBUF
IN 0 0 0 1 1 - - - (IBUF)->ACC
RCF 0 0 1 0 0 - - - 0->CF
SCF 0 0 1 0 1 - - - 1->CF
Bcc 0 0 1 1 cc 条件が成立すれば,分岐アドレス->PC
Ssm 0 1 0 0 A 0 sm (op1)->(shift,rotate)->op1
Rsm 0 1 0 0 A 1 sm はみ出したビット->CF
LD 0 1 1 0 A B (op2)->op1
ST 0 1 1 1 A B (op1)->op2
(注)ST命令の場合,B=100,101,110,111のみ可能.
SBC 1 0 0 0 A B (op1)-(op2)-CF->op1
ADC 1 0 0 1 A B (op1)+(op2)+CF->op1
SUB 1 0 1 0 A B (op1)-(op2)->op1
ADD 1 0 1 1 A B (op1)+(op2)->op1
EOR 1 1 0 0 A B (op1)eor(op2)->op1
OR 1 1 0 1 A B (op1)and(op2)->op1
AND 1 1 1 0 A B (op1)or(op2)->op1
CMP 1 1 1 1 A B (op1)-(op2)
ここで,op1,op2は各々第1,第2オペランドである.第1,第2オペランドのア ドレスモードを示すA,Bの意味を以下に示す.
A=0 ACC
A=1 IX
B=000 ACC
B=001 IX
B=01- d
B=100 [d]
B=101 (d)
B=110 [IX+d]
B=111 (IX+d)
シフトモードsmの意味を以下に示す.
RA 0 0 Right Arithmetically
LA 0 1 Left Arithmetically
RL 1 0 Right Logically
LL 1 1 Left Logically
条件コードccの意味を以下に示す.
A 0 0 0 0 Always
VF 1 0 0 0 on oVerFlow VF=1
NZ 0 0 0 1 on Not Zero ZF=0
Z 1 0 0 1 on Zero ZF=1
ZP 0 0 1 0 on Zero or Positive NF=0
N 1 0 1 0 on Negative NF=1
P 0 0 1 1 on Positive (NF or ZF)=0
ZN 1 0 1 1 on Zero or Negative (NF or ZF)=1
NI 0 1 0 0 on No Input IBUF_FLG_IN=0
NO 1 1 0 0 on No Output OBUF_FLG_IN=1
NC 0 1 0 1 on Not Carry CF=0
C 1 1 0 1 on Carry CF=1
GE 0 1 1 0 on Greater than or Equal (VF eor NF)=0
LT 1 1 1 0 on Less Than (VF eor NF)=1
GT 0 1 1 1 on Greater Than ((VF eor NF) or ZF)=0
LE 1 1 1 1 on Less than or Equal ((VF eor NF) or ZF)=1
シフト命令Ssmと巡回シフト命令Rsmの動作を以下に示す.SLAとSLLでは,実行 後の各フラグの状態のみが異なる.
SRA命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :d7 d7 d6 d5 d4 d3 d2 d1 d0
SLA命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :d6 d5 d4 d3 d2 d1 d0 0 d7
SRL命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 : 0 d7 d6 d5 d4 d3 d2 d1 d0
SLL命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :d6 d5 d4 d3 d2 d1 d0 0 d7
RRA命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :cf d7 d6 d5 d4 d3 d2 d1 d0
RLA命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :d6 d5 d4 d3 d2 d1 d0 cf d7
RRL命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :d0 d7 d6 d5 d4 d3 d2 d1 d0
RLL命令
レジスタ(ビット) :b7 b6 b5 b4 b3 b2 b1 b0 CFフラグ
実行前 :d7 d6 d5 d4 d3 d2 d1 d0 ドントケア
実行後 :d6 d5 d4 d3 d2 d1 d0 d7 d7
次に,各命令の実行に影響するフラグ及び命令実行後のフラグの設定条件(実 行後の状態)を以下に示す.
命令 実行への影響 実行後の状態
CF VF NF ZF CF VF NF ZF
NOP No OPeration - - - - - - - -
HLT HaLT - - - - - - - -
OUT OUTput - - - - - - - -
IN INput - - - - - - - -
RCF Reset Carry Flug - - - - 0 - - -
SCF Set Carry Flug - - - - 1 - - -
SRA Shift Right Arithmetically - - - - b0 0 N Z
SLA Shift Left Arithmetically - - - - b7 V N Z
SRL Shift Right Logically - - - - b0 0 N Z
SLL Shift Left Logically - - - - b7 0 N Z
RRA Rotate Right Arithmetically o - - - b0 0 N Z
RLA Rotate Left Arithmetically o - - - b7 V N Z
RRL Rotate Right Logically - - - - b0 0 N Z
RLL Rotate Left Logically - - - - b7 0 N Z
LD LoaD - - - - - - - -
ST STore - - - - - - - -
SBC SuBtract with Carry o - - - C V N Z
ADC ADd with Carry o - - - C V N Z
SUB SUBtract - - - - - V N Z
ADD ADD - - - - - V N Z
EOR Exclusive OR - - - - - 0 N Z
OR OR - - - - - 0 N Z
AND AND - - - - - 0 N Z
CMP CoMPare - - - - - V N Z
BA Branch Always - - - - - - - -
BVF Branch on oVerFlow - o - - - - - -
BNZ Branch on Not Zero - - - o - - - -
BZ Branch on Zero - - - o - - - -
BZP Branch on Zero or Positive - - o - - - - -
BN Branch on Negative - - o - - - - -
BP Branch on Positive - - o o - - - -
BZN Branch on Zero or Negative - - o o - - - -
BNI Branch on No Input - - - - - - - -
BNO Branch on No Output - - - - - - - -
BNC Branch on No Carry o - - - - - - -
BC Branch on Carry o - - - - - - -
BGE Branch on Greater than or Equal - o o - - - - -
BLT Branch on Less Than - o o - - - - -
BGT Branch on Greater Than - o o o - - - -
BLE Branch on Less Than or Equal - o o o - - - -
ここで記号の意味は以下の通りである.
実行への影響
o : 影響する.
- : 影響しない.
実行後の状態
C : 桁上げまたは桁落ちが発生した場合に1が設定される.
V : オーバフローが発生した場合に1が設定される.
N : 演算結果の第7ビットの値が設定される.
Z : 演算結果が0の場合に1が設定される
b7: 第1オペランドの第7ビットの値が設定される.
b0: 第1オペランドの第0ビットの値が設定される.
0 : 0が設定される.
1 : 1が設定される.
- : 変化しない.
KUE-CHIP2は以下の外部入出力端子を持つ.
上記4つの外部端子については,PARTHENONで自動生成される端子であり, SFLでは記述しない.
性能の客観的な評価を行う基準として,4.1および4.2に示す2つのベンチマー クプログラムの実行時間(マシンサイクル数)をシュミレータで測定して,設計 データに添付することが望ましい.ただし,実行時間のみが設計の良さを判定 する基準ではない.
256個の逆順に並んだデータ 127(7FH),126(7EH),...,0(00H),-1(FFH),-2(FEH),...,-128(80H)を下記のプロ グラムでソートする.
バブルソートによって,データ領域のDATA(00H番地)から始まる,N(80H番地) バイトのデータを昇順に整列する.ここで,データは,2個から256個の範囲と する.ただし,データが256個の場合はNを0とする.なお,ベンチマークプロ グラムでは,ソートの完了判定にキャリーフラグを利用している.
入力:
80 : 08 (ソートするデータの長さ)
100 : 10 FF 40 80 C0 D8 7F CD (ソートするデータ)
出力:
100 : 80 C0 CD D8 FF 10 40 7F (ソート結果)
*** KUE-CHIP2 Assembler ver.1.0 by H.Ochi ***
* Bubble Sorting
* Programmed by Akira Uejima, May. 3, 1992
* Data(singned) on data page
00 : DATA: EQU 00H
* Data Length(byte) on program page
80 : N: EQU 80H
* Work Area(loop counter) on program page
90 : WORK1: EQU 90H
* Work Area(swap area) on program page
91 : WORK2: EQU 91H
00 : 6C 80 LD IX, [N]
02 : AA 01 SUB IX, 1
04 : 7C 90 ST IX, [WORK1]
06 : C9 LP1: EOR IX, IX
07 : 20 RCF
08 : 67 00 LP2: LD ACC, (IX+DATA)
0A : F7 01 CMP ACC, (IX+DATA+1)
0C : 3F 19 BLE SKIP
0E : 74 91 ST ACC, [WORK2]
10 : 67 01 LD ACC, (IX+DATA+1)
12 : 77 00 ST ACC, (IX+DATA)
14 : 64 91 LD ACC, [WORK2]
16 : 77 01 ST ACC, (IX+DATA+1)
18 : 2F SCF
19 : BA 01 SKIP: ADD IX, 1
1B : FC 90 CMP IX, [WORK1]
1D : 31 08 BNZ LP2
1F : 35 29 BNC FIN
21 : 6C 90 LD IX, [WORK1]
23 : AA 01 SUB IX, 1
25 : 7C 90 ST IX, [WORK1]
27 : 31 06 BNZ LP1
29 : 0F FIN: HLT
END
課題1の入力データならびに出力データ(ともに256バイト)に対してCRC(Cyclic Redundancy Check)コードを下記のプログラムによって生成する.
シフト/ローテート命令や論理演算命令を使用して,データ領域のDATA(00H 番地)から始まるN(80H番地)バイトのデータのCRCコードを計算する.データの 最大長は256バイトである.ただし,データ長が256バイトの場合は,バイト数 Nを0とする.尚,CRCコードの生成多項式として,CCITT X.25規格の $X^{16}+X^{12}+X^5+1$を用いている.
入力:
80 : 08 (データのバイト数)
100 : 62 FF 75 CO 75 C1 C9 7D (データ)
出力:
C0 : B0 8A (CRC)
*** KUE-CHIP2 Assembler ver.1.0 by H.Ochi ***
* Calculate CRC(Cyclic Redundancy Check) Code
* Programmed by Akira Uejima, May. 3, 1992
* Data on date page
00 : DATA: EQU 00H
* Data Length(byte) on program page
80 : N: EQU 80H
* Resultant CRC on program page
C0 : C1: EQU 0C0H
C1 : C2: EQU 0C1H
* Work Area on program page
F0 : WORK: EQU 0F0H
00 : 62 FF LD ACC, 0FFH
02 : 74 C0 ST ACC, [C1]
04 : 74 C1 ST ACC, [C2]
06 : C9 EOR IX, IX
07 : 7C F0 ST IX, [WORK]
09 : 64 C0 LP1: LD ACC, [C1]
0B : C7 00 EOR ACC, (IX+DATA)
0D : 74 C0 ST ACC, [C1]
0F : 6A 08 LD IX, 8
11 : 64 C1 LP2: LD ACC, [C2]
13 : 43 SLL ACC
14 : 74 C1 ST ACC, [C2]
16 : 64 C0 LD ACC, [C1]
18 : 45 RLA ACC
19 : 74 C0 ST ACC, [C1]
1B : 35 27 BNC SKIP
1D : C4 42 EOR ACC, [P1]
1F : 74 C0 ST ACC, [C1]
21 : 64 C1 LD ACC, [C2]
23 : C4 43 EOR ACC, [P2]
25 : 74 C1 ST ACC, [C2]
27 : AA 01 SKIP: SUB IX, 1
29 : 33 11 BP LP2
2B : 6C F0 LD IX, [WORK]
2D : BA 01 ADD IX, 1
2F : FC 80 CMP IX, [N]
31 : 7C F0 ST IX, [WORK]
33 : 31 09 BNZ LP1
35 : 64 C1 LD ACC, [C2]
37 : C2 FF EOR ACC, 0FFH
39 : 74 C1 ST ACC, [C2]
3B : 64 C0 LD ACC, [C1]
3D : C2 FF EOR ACC, 0FFH
3F : 74 C0 ST ACC, [C1]
41 : 0F HLT
* CRC Generator Polynomial on program page
* CCITT(X^16 + X^12 + X^5 + 1) -> 1 0001 0000 0010 0001
* 1 0 2 1
42 : 10 P1: PROG 10H
43 : 21 P2: PROG 21H
END