SSブログ
English Version

SuperSimpleController(その10)I/O命令追加 [OriginalCPU]

 前回の記事で書いたプリント基板はElecrowさんから昨日(2021/03/20)届いたのですが、手配中の74HCU04のSMDタイプがまだ届いていないので部品待ち状態です。

 今回はI/O関連のマシン語の実装について書いてみます。

 下表がマシン語コード表のアップデート版で橙色の部分が今回追加したマシン語です。マシン語実行時に影響を受けるレジスタを記入した「register」カラムを追記しました。
 従来、CALL命令とRET命令ではR0とR1レジスタが破壊されていましたが、プログラムの実行効率が悪くなるのでR0は保存されるように改善しています(このためRET命令のクロックが20から22に増加した)
 I/O命令でのアドレスは直値の方法とR1レジスタ指定の二通りを実装しました。

 また、I/O命令の他にRX(=R1:R0レジスタペア)とPCとの相互のロード命令とRXへの直値ロード命令も追加しました。

Simple8Z マシン語コード表 第3版

★変更 2021/08/17 "OUT (R1),R0"のクロック数を7から8に変更(VDPSG基板の評価結果を反映)
★変更 2021/04/25 演算処理を考慮して20Hを"LD RX,im16"から"LD R1, R0"に変更
★変更 2021/04/09 メモリライト(WR)命令でクリティカルなタイミングがあったので再度修正
★変更 2021/04/05 メモリライト(WR)命令でクリティカルなタイミングがあったので修正
★変更 2021/04/02 JP命令関連でクリティカルなタイミングがあったので修正
★変更 2021/03/24 「RD_R0 adr16」でR1を保存するように改善


 今回実施したマシン語の試験用ソースのリストが下記になります。
 I/O命令を追加したのでHelloを表示後に入力をエコーバックするというシリアル通信処理を想定した内容にしています。

今回実施した試験プログラム(アセンブリ言語)
;++++++++++++++++++++++++++++++++++++++++ ; Simle8Z test008 program ; by skyriver ; V0.01 2021/03/16 ;++++++++++++++++++++++++++++++++++++++++ .list 8000 RAM EQU 8000H ; RAM's top address FFFF STACK EQU 0FFFFH ; stack low byte 00FE STACKP EQU 0FEH ; initial stack low byte value 00C0 SIO_CMD EQU 0C0H 00C1 SIO_DAT EQU SIO_CMD + 1 0123 JPADR EQU 0123H 0000' ASEG ORG 0 LD_R0 STACKP ; x7 R0:FE R1: 0000 10 + DB 10H 0001 FE + DB STACKP WR_R0 STACK ; x18 R0:FE R1: set stack pointer 0002 50 + DB 50H 0003 FFFF + DW STACK LD_RX JPADR ; x24 R0:23 R1:01 0005 20 + DB 20H 0006 0123 + DW JPADR JP_RX ; x29 R0:23 R1:01 0008 D0 + DB 0D0H ORG JPADR LD_RX_PC ; x34 R0:23 R1:01 0123 D8 + DB 0D8H LD_R1 SIO_CMD ; x38 R0:23 R1:C0 0124 18 + DB 18H 0125 C0 + DB SIO_CMD LD_R0 00010111B ; x42(4) resett R0:17 R1:C0 0126 10 + DB 10H 0127 17 + DB 00010111B OUT_R1_R0 ; x49(7) R0:17 R1:C0 0128 A0 + DB 0A0H LD_R0 00010100B ; x53(4) R0:14 R1:C0 0129 10 + DB 10H 012A 14 + DB 00010100B OUT_R1_R0 ; x60(7) R0:14 R1:C0 012B A0 + DB 0A0H LD_R0 <(LOW MSG) - 1> ; x64(4) R0:5F R1:C0 012C 10 + DB 10H 012D 5E + DB (LOW MSG) - 1 WR_R0 saveR0 ; x75(11) R0:5F R1:00 012E 50 + DB 50H 012F 8000 + DW saveR0 0131 LOOP: RD_R0 saveR0 ; x86(11) R0:5F R1:00 0131 60 + DB 60H 0132 8000 + DW saveR0 INC_R0 ; x89(3) R0:60 R1:00 0134 3D + DB 3DH WR_R0 saveR0 ; x100(11) R0:60 R1:00 0135 50 + DB 50H 0136 8000 + DW saveR0 RD_R1_R0 <HIGH MSG> ; x110(10) R0:60 R1:48 0138 80 + DB 80H 0139 01 + DB HIGH MSG CKZR1 ; x113(3) R0:60 R1:48 013A 4F + DB 4FH LD_R0_R1 ; x116(3) 013B 2F + DB 2FH JZ ECHO ; x124(8) R0:60 R1:48 013C C2 + DB 0C2H 013D 0144 + DW (ECHO) - 1 CALL PUTC ; x148(24) 013F B0 + DB 0B0H 0140 0152 + DW (PUTC) - 1 JP LOOP ; x214(8) 0142 C0 + DB 0C0H 0143 0130 + DW (LOOP) - 1 ; because increment PC after set PC 0145 ECHO: IN_R0 SIO_CMD ; (8) 0145 98 + DB 98H 0146 C0 + DB SIO_CMD SHR_R0 ; (3) 0147 3A + DB 3AH JNC ECHO ; (8) 0148 C5 + DB 0C5H 0149 0144 + DW (ECHO) - 1 IN_R0 SIO_DAT ; (8) 014B 98 + DB 98H 014C C1 + DB SIO_DAT CALL PUTC ; (24) 014D B0 + DB 0B0H 014E 0152 + DW (PUTC) - 1 JP ECHO ; (8) 0150 C0 + DB 0C0H 0151 0144 + DW (ECHO) - 1 ; because increment PC after set PC ; output character to SIO ; R0 <- data ; 0153 PUTC: LDF_R1_R0 ; x151(3) 0153 40 + DB 40H IN_R0 SIO_CMD ; x159(8) 0154 98 + DB 98H 0155 C0 + DB SIO_CMD SHR_R0 ; x162(3) 0156 3A + DB 3AH SHR_R0 ; x165(3) 0157 3A + DB 3AH LD_R0_R1 ; x168(3) 0158 2F + DB 2FH JNC PUTC ; x176(8) if tx not ready 0159 C5 + DB 0C5H 015A 0152 + DW (PUTC) - 1 OUT_R0 SIO_DAT ; x184(8) 015C 90 + DB 90H 015D C1 + DB SIO_DAT RET ; x206(22) 015E E0 + DB 0E0H 015F 48 65 6C 6C MSG: DB "Hello,world", 13,10,0 0163 6F 2C 77 6F 0167 72 6C 64 0D 016B 0A 00 ORG RAM 8000 saveR0: DS 1 END No Fatal error(s)


 折角なので手持ちにあったシリアル通信用チップ(MC68B50)をブレッドボード上で仮接続して試験しました。通信用クロックはPIC12F683を使って9.6KHzを生成し、MC68B50に供給しています。

シリアル通信用クロックgenelator(PIC12F683)
/* SIO clock genelator for Simple8Z test008 * PIC12F683 * Ver 0.01 made by skyriver 2021/03/17 */ #include <INT16CXX.H> // define config bit assign(PIC12F683) #define conf_FCMEN (1<<11) // Fail-Safe Clock Monitor Enable #define conf_IESO (1<<10) // Internal External Switchover bit #define conf_BODEN1 (1<<9) // Brown-out Detect Selection bit #define conf_BODEN0 (1<<8) // Brown-out Detect Selection bit #define conf_CPD_ (1<<7) // Data code Protection(0:enable) #define conf_CP_ (1<<6) // Code Protection(0:enable) #define conf_MCLRE (1<<5) // GP3/MCLR_ pin function secet bit(1:MCLR) #define conf_PWRTEN_ (1<<4) // Power-up Timer Enablr bit(0:enable) #define conf_WDTEN (1<<3) // Watchdog Timer enable bit(1:enable) #define conf_FOSC_RC 0b111 #define conf_FOSC_RCIO 0b110 #define conf_FOSC_INTOSC 0b101 #define conf_FOSC_INTOSCIO 0b100 #define conf_FOSC_EC 0b011 #define conf_FOSC_HS 0b010 #define conf_FOSC_XT 0b001 #define conf_FOSC_LP 0b000 #pragma config = conf_CPD_ | conf_CP_ | conf_FOSC_INTOSCIO /* initialize H/W and workarea */ void init( void ) { GPIO = 0b00000000; // GP0:IntReq WPU = 0b00000000; // 1:Pull-up enable TRISIO = 0b00111011; // 0:output, 1:input CMCON0 = 0b00000111; // Comparator off CMCON1 = 0b00000011; // comp output is asynchronization VRCON = 0b00001000; // Vref is off ANSEL = 0b00000000; // 0:dig, 1:ana OSCCON = 0b01110001; // 8MHz internal clock OPTION = 0b00000000; // PortB_PullUp Fosc/4 T1PreScaler:1/2T WPU = 0b00110111; // PullUp enable // 8000000/(9600*4) = 208.3 T2CON = 0b0000100; // Timer2 on,pre/post scaler 1:1 PR2 = 208; // (PR2+1)/2 = 104 : duty 50% CCP1CON = 0b00001100; // LSBS:00 PWM mode(active high) CCPR1L = 104; PCON = 0b00000000; } void main( void ) { init(); while ( 1 ) { } }


 MC68B50のE信号(チップイネーブル)は正論理なので本来ならSimple8Zの外部接続用コネクタ内のIOR/信号(MEM/信号を反転したもの)を反転して接続すべきですが、動作試験ということでMEM/信号を直接接続しました。

追加したシリアルチップ(MC68B50)


 試験用ソフト内のPUTC処理のRET命令実行直後に停止させた際のロジアナ画面が下図になります。
 12:IRW/が命令フェッチ信号でこの信号が0の箇所がマシン語の区切りです。

試験用ソフト実行時のロジアナ画面例



 シリアル通信で"Hello"の最初の'H'を出力している部分を拡大したものが下図です。
 確かに'H'が出力されています^^

試験用ソフト実行時のロジアナ画面例('H'出力部)



★追記 2021/03/22 {
 上図ではディバッグのためにクロックを50Hzにしているので'H'のシリアル出力時間と比較しCPUの動作がかなり遅くなっています。クロックを約130KHzにした場合のロジアナ波形が下図になります。クロック上限は未評価です。

クロック約130KHzでの'H'出力

}

 上記の試験用ソースにあるエコーバック部分に関してはまだ動作確認できていませんが、MC68B50のTxDataとRxDataにシリアルUSB変換モジュールを接続してTeraTermでモニタした結果が下図になります。

 CPUボードを組み立てた際に多くの人が出力するであろうなんの変哲もないただのハロー表示画面ですが、今回は自作のCPUで出したものなので感慨深いものがありますね。

Simple8Zでの初めてのHello,world



★追記 2021/03/22
 エコーバック試験も通りました^^
 ノートPCのTeraTermのバックカラーは暗かったということが判ったw

エコーバックもOK




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

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。