2015.3.2

前へ

ホームページトップへ戻る

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第144回]


●シリアル入力ルーチン(3)

前回の続きです。
下はPIC16F87のプログラムです。
ZB3BASIC+ZB3DOSシステムではPIC16F87を使います。
FT232RLを介してシリアル受信したデータをパラレルに変換してCPUに送出するプログラム部分です。
かなりややこしいことをやっていますから、わかりにくいと思いますが。

 ; RX data out to CPU
dout
        bsf STATUS,5;bank1
        movlw 0
        movwf TRISA;RA out
        movlw 86
        movwf TRISB;RB4 out
        bcf STATUS,5;bank0
dout1
        clrwdt
        btfss PORTB,7
        goto wdata
        btfss PORTB,1;if CPU READY
        goto dout1
;data out
        movf outdata,w
        movwf PORTA
        btfsc outdata,5
        goto pb4set
        bcf PORTB,4
        goto dout2
pb4set
        bsf PORTB,4
dout2
        nop
        bcf PORTB,0;STROBE ON
dout3
        clrwdt
        btfss PORTB,7
        goto wdata;if 'TX DATA' from CPU is available
        btfsc PORTB,1;wait till CPU ready
        goto dout3
        bsf PORTB,0;STROBE OFF
        goto rdck       
;

このプログラムもあらためて見ると直したいところがあるのですが、それはさておき、これだけを見ていても特に問題があるようには見えません。
しかし。
こちらを見ると問題が見えてきます。

;
int
        movwf savew
        swapf STATUS,w
        movwf savests
        bcf STATUS,5;bank0
        movf RCSTA,w
        andlw 06;errcheck
        btfss STATUS,zf
        goto errstop
        incf bfcntr,f
        movf bfcntr,w
        sublw 50
        btfsc STATUS,zf;buffer full
        goto errstop
        movf FSR,w
        movwf savefsr
        movf bfwrend,w
        movwf FSR
        movf RCREG,w
        movwf INDF
        incf bfwrend,f
        btfss bfwrend,7
        goto int2
        movlw 30
        movwf bfwrend
int2
        movf savefsr,w
        movwf FSR
        bcf PIR1,5;rcif
        swapf savests,w
        movwf STATUS
        swapf savew,f
        swapf savew,w
        retfie
;

割込みプログラムです。
ボーレートが高いため、普通にデータを受信していたのでは、データを落としてしまう可能性があります。
そこで受信割込みを使うことにしました。
シリアルデータを受信すると受信割込みが発生して、この割込みプログラムが実行されます。
この割込みプログラムは受信データを受信バッファに蓄えます。

そういうことだったのです。
ZB3BASIC+ZB3DOSシステムのPICはシリアルデータを受信するために割込みが発生していたのでした。
すると。
もしも割込みが下のようなタイミングで発生したとしますと。



CPUの側はそんなことはわかりませんから、さっさとBUSY(D0 OUT)をHにしてしまいます。
PICの側ではたまたま発生した受信割込みのためにBUSY信号がH→L→Hと変化したことを見逃してしまいます。
そこで割り込みから復帰したあとも、BUSYがLになるのを待ち続けます。
一方でCPUの側は次のデータを受け取るためにふたたびSTB(D0 IN)を見るとLになっていますから、次のデータだと思ってBUSYをLにして同じデータを二度読みしてしまいます。
ここでやっとPICはBUSYがLになったのを見てSTB(D0 IN)をHにします。

どこが問題だったかといいますと、CPUの側が勝手にBUSYをHにしてしまったところにありました。
勝手にHにするのではなくて、PICがBUSY=Lを見てSTBをHにしたことを確認してからBUSYをHにすべきでした(下のタイミングチャート)。



CPUがデータを読み込むタイミング(縦線の位置)も変更しています。

そこでTK−80モニタプログラムのシリアル入力プログラムを下のように直しました。

              ;
                ORG $02A0
              ;
02A0 DB98     SIN:IN 98
02A2 0F         RRC
02A3 DAA002     JC SIN
02A6 DB94       IN 94
02A8 4F         MOV C,A
02A9 3EFE       MVI A,FE;BUSY
02AB D398       OUT 98
02AD DB98     SIN2:IN 98
02AF 0F         RRC
02B0 D2AD02     JNC SIN2
02B3 3EFF       MVI A,FF;READY
02B5 D398       OUT 98
02B7 79         MOV A,C
02B8 C9         RET
              ;

ZB3DOSのMBIOSルーチンも同じように直しました。
その結果システムプログラムのロード中にときどき発生していた気持ちの悪い異常動作は発生しなくなりました。

昨年7月以来、半年以上にわたって書いてきました当記事もやっと無事終了を迎えることができました。
当初はもっと早く完了できるつもりだったのですが、いろいろなことがあってここまで来てしまいました。
当初の予定からは大幅に遅延してしまいましたが、なんとかMYCPU80用ZB3BASIC+ZB3DOS(CP/M互換DOS)セットも無事に製品として発送を開始することができました。
振り返ってみますと、書き足りなかったことなどもありますが、まずは今回にて当テーマのひとまずの完了とさせていただきます。
拙い文章にお付き合いいただきました皆様に心から感謝申し上げます。

MYCPU80でCP/Mを![第144回]
2015.3.2upload

前へ

ホームページトップへ戻る