SSブログ
English Version

SuperSimpleController(その6)JP命令が動いた! [OriginalCPU]

 前回の記事の冒頭でジャンプ命令の処理の中でアドレスが想定通りに設定されないことを書きロジアナ画面も貼りましたが、原因が判明しジャンプ命令が無事動作するようになりました^^

 原因はなんとTL866II用のUV-EPROMアダプタ(中華製)でした orz
 ALUとして使っているM27C322への書込みはM27C4096のピン配置に変換するアダプタを用いて8回書き込んでいますが、書込みブロック設定用のDIPスイッチが上下逆に取り付けられているため、ブロックアドレスが反転していましたw
 その他、ブレッドボードで使っていたリード線が2本断線していました orz

TL866用アダプタ


 今回使ったテストプログラムは下記の4バイトのマシン語です(LOOPラベルへのJP命令でループするので最後のHALTは実行されません)。

テスト用のサンプルプログラム
  0000'                	ASEG
                       
                       	ORG	0
                       
                       	NOP
  0000    08     +     	DB	08H
  0001                 LOOP:	JP	LOOP
  0001    C4     +     	DB	0C4H
  0002    0000   +     	DW	LOOP - 1
                       
                       	HALT
  0004    FF     +     	DB	0FFH
                       
                       
                       	END
 


 下図がジャンプでループしている時のロジアナ画面になります。

JP命令でループ動作中のロジアナ画面


 このジャンプ命令には今回設計したCPUの多くのリソースの制御処理が含まれていて、これが動作したということは多くのリソースが正常動作していると言えると思います。

 ジャンプ命令の具体的な処理は下記になります(まだ最適化は行っていません)。
 因みに、本CPUのバス幅はデータが8bitでアドレスが16bitになります。「SuperSimpleController(その3)」の記事に載せたブロック図を参照してもらうと判り易いと思います。

 条件ジャンプにも対応するために、条件に合致しなかった場合も下記の6項以降は実行されるのでジャンプ命令で指定するアドレスは

   ジャンプ先アドレス - 1

の値を設定するようにしました。

  1. PCをインクリメント
  2. ジャンプ先のLowアドレスをR1にセーブ
  3. PCをインクリメント
  4. ジャンプ先のhighアドレスをPCのhigh側にロード
  5. R1レジスタの内容をPCのlow側にロード
  6. PCをインクリメント
  7. PCが示すメモリの内容をIRにフェッチ

 上記のロジアナ画面でも判るように、ジャンプ命令の実行時間は現状10クロックです。
 また、ジャンプ命令でR1レジスタの内容が壊れてしまいます(どこかで聞いたような・・F8?)

 今回検討中のオリジナルCPUはROM内のuCODE(制御信号の時系列データ)でマシン語の処理内容を記述する方式なので、ロジックICの変更無しにアーキテクチャの変更がある程度できるようになっています。

 参考にuCODEのソースも貼っておきます。
 JP命令の処理部分は下記リストの「CSTART 0C0H  ; **** JP」と書かれた部分を参照してください。

作成中のuCODEリスト
;++++++++++++++++++++++++++++++++++ ; uCODE data for Simple8Z ; made by skyriver ; Ver 0.01 2021/02/04 ;++++++++++++++++++++++++++++++++++ ; Simple8Z control signals bit assign (*:active low) 0001 PLW EQU 01H ; write PCL 0002 PHW EQU 02H ; write PCH 0004 FLW EQU 04H ; write FLG 0008 IRW EQU 08H ;*write IR 0010 PCS0 EQU 10H ; PCL, PHL control(S0) 0020 PCS1 EQU 20H ; PCL, PCH control(S1) 0040 MEM EQU 40H ;*select memoy not I/O 0080 ALUR EQU 80H ;*read ALU 0100 RD EQU 0100H ;*read 0200 WR EQU 0200H ;*write 0400 R0W EQU 0400H ; write R0 0800 R1W EQU 0800H ; write R1 1000 ALD EQU 1000H ; load(latch) addr into ADH, ADL 2000 ALR EQU 2000H ;*read ADL(addr low) 4000 AHR EQU 4000H ;*read ADL(addr high) 8000 PWEN EQU 8000H ; enable PLW,PHW independent Z,C flags ; low active control signals 63C8 NEGSIG EQU (IRW or MEM or ALUR or RD or WR or ALR or AHR) SETHI macro bit ; set sig high SIGNAL set SIGNAL OR bit endm SETLOW macro bit ; set sig low SIGNAL set SIGNAL AND NOT bit endm ACT macro bit ; set sig active IF bit AND NEGSIG SIGNAL set SIGNAL AND NOT bit ELSE SIGNAL set SIGNAL OR bit ENDIF endm CLR macro bit ; clear sig IF bit AND NEGSIG SIGNAL set SIGNAL OR bit ELSE SIGNAL set SIGNAL AND NOT bit ENDIF endm ACTS macro bits ; set control signals to active irp bit,<bits> ACT bit endm endm CLRS macro bits ; set control signals to non active irp bit,<bits> CLR bit endm endm PCCLR macro ; set PC to clear-mode CLR PCS0 CLR PCS1 endm PCDEC macro ; set PC to decrement-mode ACT PCS0 CLR PCS1 endm PCLOAD macro ; set PC to load-mode CLR PCS0 ACT PCS1 endm PCINC macro ; set PC to incriment-mode ACT PCS0 ACT PCS1 endm ; uCode last value inc-mode E2B0 LastVal EQU (NEGSIG OR PCS0 OR PCS1 OR PWEN) AND (NOT RD) AND (NOT IRW) AND (NOT MEM) E2B0 SIGNAL SET LastVal CODE macro ; generate control data DW SIGNAL endm ENDCODE macro ; last code of each proc SIGNAL SET LastVal CODE ; set IR endm CSTART macro code ; uCODE start .xlist rept (code) * 2 - $ DB -1 endm .list ORG (code) * 2 endm 0000' ASEG ORG 0 CSTART 00H ; **** RST PCCLR CLR IRW ; have to clear IRW, for IRH's S0 quickly rise CODE 0000 E288 + DW SIGNAL ACT PLW ; set PCL ACT PHW ; set PCH CODE ; clear PC 0002 E28B + DW SIGNAL CLR PLW CLR PHW ACT RD ; memory read PCINC ; set PC to increment-mode CODE 0004 E2B8 + DW SIGNAL ENDCODE 0006 E2B0 + DW SIGNAL CSTART 08H ; **** NOP CLR IRW ; have to clear IRW at top of uCODE(if not then fetch code again) ACT PLW CODE ; inc addr 0010 E2B9 + DW SIGNAL CODE 0012 E2B9 + DW SIGNAL CODE 0014 E2B9 + DW SIGNAL ENDCODE 0016 E2B0 + DW SIGNAL CSTART 0C0H ; **** JP:0C4H JZ:0C0H JNZ:0C1H JC:0C2H JNC:0C3H CLR IRW ; have to clear IRW at top of uCODE(if not then fetch code again) ACT PLW CODE ; inc PC 0180 E2B9 + DW SIGNAL CLR PLW ACT R1W CODE ; save low addr to R1 0182 EAB8 + DW SIGNAL CLR R1W ACT PLW CODE ; inc PC 0184 E2B9 + DW SIGNAL CLR PLW CLR PWEN ; disable PLW,PHW PCLOAD ; set PC to load-mode CODE ; set load-mode 0186 62A8 + DW SIGNAL ACT PHW CODE ; write high addr to PC 0188 62AA + DW SIGNAL CLR PHW CLR RD ACT ALUR ; read R1 register CODE ; read ALU(R1:low addr) 018A 6328 + DW SIGNAL ACT PLW CODE ; set low addr to PC 018C 6329 + DW SIGNAL ACT PWEN CLR ALUR CLR PLW PCINC ; set PC to increment-mode ACT RD CODE ; set inc-mode, activate RD 018E E2B8 + DW SIGNAL ACT PLW CODE ; inc PC 0190 E2B9 + DW SIGNAL ENDCODE ; latch IR and inc PC 0192 E2B0 + DW SIGNAL CSTART 0F8H ; **** HALT code:F8H-FFH CLR IRW ; have to clear IRW at top of uCODE(if not then fetch code again) CODE ; inc PC 01F0 E2B8 + DW SIGNAL ENDCODE 01F2 E2B0 + DW SIGNAL END Macros: ACT ACTS CLR CLRS CODE CSTART ENDCODE PCCLR PCDEC PCINC PCLOAD SETHI SETLOW Symbols: 4000 AHR 1000 ALD 2000 ALR 0080 ALUR 0004 FLW 0008 IRW E2B0 LASTVAL 0040 MEM 63C8 NEGSIG 0010 PCS0 0020 PCS1 0002 PHW 0001 PLW 8000 PWEN 0400 R0W 0800 R1W 0100 RD E2B0 SIGNAL 0200 WR No Fatal error(s)



★追記 2021/02/15
 uCODEの作成もだいぶ慣れてきたので上記のジャンプ命令の部分を最適化してみました。上記のテスト用サンプルプログラム実行時のロジアナ画面を下図に示します。ジャンプ命令の実行時間は従来の10クロックから8クロックに短縮されました。

 PCのローバイトへの書込み信号であるPCLWが常に変化していることからこれ以上の短縮は難しいと思います。

ジャンプ命令の最適化後のロジアナ画面




[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー