2014.12.31

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

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


[第91回]


●PICプログラムを割込受信&受信バッファに改良

19200bpsで/LDを実行すると受信エラーになるという問題の解決策としましては前回書きましたようにWindows側でアドレス情報をASCIIからバイナリに変換してから送るという考え方もあります。
それはそれで合理的なのですが、実はMYCPU80用のZB3DOS(CP/M互換DOS)システムプログラムには、もうメモリの空きがほとんど残っていないのです。
ことに/LDを含むマシン語モニタプログラムはROM上の配置に全く余裕がなくて、もうプログラムをいじることがほとんどできません。
あえてそれをやろうとしますと、システムプログラムの再配置というとんでもない作業をしなければなりません。
まあ、どうしてもやらなければならないということになってしまいましたら、そうするより仕方がないのですが、今回の場合にはあえてそのようにしなくても、ほかの方法をとることができそうです。

実はPIC16F88のRS232C受信プログラムは今までちょいと手抜きをしておりまして、ごくごく簡単な受信プログラムになっております。
割込み受信でもなく、受信バッファもPIC内蔵の1バイトのみというシンプルなプログラムです。
それを今回は大幅に書き換えて、割込み受信を使い、さらに受信バッファとしても80バイトのリングバッファを設けました。

PICプログラムをそのように変更したうえで、あらためて19200bpsでテストしてみましたところ、/LDでも受信エラーは発生しなくなりました。
CP/Mにエントリして、MSDOSを起動し、STARTREKも実行しましたが問題はありませんでした。



下はそのときのログです。
上から8行目で/LDを実行しています。
前回はWindows側でSleepを実行しました。
今回はSleepは外しましたが/LDはエラーにならずに正常に実行できています。

logfile mycpu80log\12310848.txt open
mzbdos3L 2014.12.29 by Chunichidenko

MYCPU80に接続しました(19200bps)
0001 001E - z
1000 00C3 - 
*** mycpu80 zb3basic ****
>/ld mcpm5d.bin,cc00
loading MCPM5D.BIN ...19be(6590)bytes loaded,from CC00 to E5BD
>/cpm
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>dir
A: MBASIC   COM : STARTREK BAS : PIP      COM : ESC4     MAC
A: VFTST6   TXT : VFDUMP1  COM : VFDUMP2  COM : VFDUMP   COM
A: VFD05    COM : STARTRK2 BAS : TREKINST BAS
A>mbasic
BASIC-80 Rev. 5.21
[CP/M Version]
Copyright 1977-1981 (C) by Microsoft
Created: 28-Jul-81
28728 Bytes free
Ok
load "STARTREK
Ok
run







                   THE USS ENTERPRISE --- NCC-1701

                  ,------*------,
  ,-------------   '---  ------'
   '-------- --'      / /
       ,---' '-------/ /--,
        '----------------'


                    ,------*------,
    ,-------------   '---  ------'
     '-------- --'      / /
         ,---' '-------/ /--,
          '----------------'


                      ,------*------,
      ,-------------   '---  ------'
       '-------- --'      / /
           ,---' '-------/ /--,
            '----------------'


                        ,------*------,
        ,-------------   '---  ------'
         '-------- --'      / /
             ,---' '-------/ /--,
              '----------------'


                          ,------*------,
          ,-------------   '---  ------'
           '-------- --'      / /
               ,---' '-------/ /--,
                '----------------'


                            ,------*------,
            ,-------------   '---  ------'
             '-------- --'      / /
                 ,---' '-------/ /--,
                  '----------------'


                              ,------*------,
              ,-------------   '---  ------'
               '-------- --'      / /
                   ,---' '-------/ /--,
                    '----------------'


                                ,------*------,
                ,-------------   '---  ------'
                 '-------- --'      / /
                     ,---' '-------/ /--,
                      '----------------'


                                  ,------*------,
                  ,-------------   '---  ------'
                   '-------- --'      / /
                       ,---' '-------/ /--,
                        '----------------'


                                    ,------*------,
                    ,-------------   '---  ------'
                     '-------- --'      / /
                         ,---' '-------/ /--,
                          '----------------'


                                      ,------*------,
                      ,-------------   '---  ------'
                       '-------- --'      / /
                           ,---' '-------/ /--,
                            '----------------'


                                        ,------*------,
                        ,-------------   '---  ------'
                         '-------- --'      / /
                             ,---' '-------/ /--,
                              '----------------'


                                          ,------*------,
                          ,-------------   '---  ------'
                           '-------- --'      / /
                               ,---' '-------/ /--,
                                '----------------'


                                            ,------*------,
                            ,-------------   '---  ------'
                             '-------- --'      / /
                                 ,---' '-------/ /--,
                                  '----------------'


                                              ,------*------,
                              ,-------------   '---  ------'
                               '-------- --'      / /
                                   ,---' '-------/ /--,
                                    '----------------'


                                                ,------*------,
                                ,-------------   '---  ------'
                                 '-------- --'      / /
                                     ,---' '-------/ /--,
                                      '----------------'


                                                  ,------*------,
                                  ,-------------   '---  ------'
                                   '-------- --'      / /
                                       ,---' '-------/ /--,
                                        '----------------'


                                                    ,------*------,
                                    ,-------------   '---  ------'
                                     '-------- --'      / /
                                         ,---' '-------/ /--,
                                          '----------------'


                                                      ,------*------,
                                      ,-------------   '---  ------'
                                       '-------- --'      / /
                                           ,---' '-------/ /--,
                                            '----------------'


                                                        ,------*------,
                                        ,-------------   '---  ------'
                                         '-------- --'      / /
                                             ,---' '-------/ /--,
                                              '----------------'







YOUR ORDERS ARE AS FOLLOWS:
--------------------------
   DESTROY THE 19 KLINGON WARSHIPS WHICH HAVE INVADED
   THE GALAXY BEFORE THEY CAN ATTACK FEDERATION HEADQUARTERS
   ON STARDATE 2428 . THIS GIVES YOU 28 DAYS. THERE ARE 
   3 STARBASES IN THE GALAXY FOR RESUPPLYING YOUR SHIP.

ARE YOU READY TO ACCEPT COMMAND ('N' FOR INSTRUCTIONS)? y


YOUR MISSION BEGINS WITH YOUR STARSHIP LOCATED
IN THE GALACTIC QUADRANT, 'CAPELLA I'.

   +--1---2---3---4---5---6---7---8-+
 1 |                         <E>  * | 1         STARDATE          2400.0
 2 |                                | 2         CONDITION          GREEN
 3 |      *               *         | 3         QUADRANT            3 , 5 
 4 |                  *             | 4         SECTOR              1 , 7 
 5 |                                | 5         PHOTON TORPEDOES      10
 6 |                      *         | 6         TOTAL ENERGY        3000
 7 |          *   *   *             | 7         SHIELDS                0
 8 |                                | 8         KLINGONS REMAINING    19
   +--1---2---3---4---5---6---7---8-+

COMMAND? ^C
Break in 2060
Ok
system

A>/exit
>
0000 00C3 - 
リモート接続を終了しました
logfile closed at Wed Dec 31 08:51:58 2014


それならばということで、38400bpsでもテストをしてみたのですが、ちょっと無理があるようで受信エラーの表示は出ませんでしたが受信データに誤りが発生してしまうようで、ロード後にプログラムを実行すると異常な動作になってしまいました。
やっぱり信頼性が第一ですので無理をしないで19200bpsでいくことにいたしました。

●PIC16F88プログラム

参考までにボーレート19200bpsで受信割込みと受信バッファを使ったPIC16F88のプログラムリストをお見せします。
最近はアセンブラを使わないでPICのプログラムもCコンパイラで書くという方が多いようです。
時代遅れなのかも知れませんが、この程度のプログラムでしたら、やっぱりアセンブラで書きたいものです。

;;;PIC 16F88  mycpu 232c IN & OUT rs_bi27.ASM(from rs_bi2.asm 10/2/18)
;10/2/16 2/17 2/18 binary read/write
;10/6/2 9600baugh/ 14/7/3 2400bps
;clock=4MHz/ 14/7/4 8MHz
;7/4 19200bps/8MHz
;14/12/30 read buffer
;
        #include <p16f88.inc>        ; processor specific variable definitions  
;
;Program Configuration Register 1
        __CONFIG _CONFIG1,_CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_ON & _INTRC_IO
;Program Configuration Register 2
        __CONFIG _CONFIG2,
;
cf=0
zf=2
f=1
w=0
;
indata equ 20
outdata equ 22
cntr1 equ 23
cntr2 equ 24
rddata equ 25
hxl equ 26
hxh equ 27
hxwk equ 28
bfrdend equ 29
bfwrend equ 2a
bfcntr equ 2b
savew equ 2c
savests equ 2d
savefsr equ 2e 
;
;read buffer from 30 to 7f
;
     org 00
st0
     goto start
;
        org 04
        goto int
;
     org 05
start
     bsf STATUS,5 ;bank 1
        movlw 7c;=8MHz
        movwf OSCCON
     movlw 96;RB7=in,RB2=RX,RB1=in RB4=IN/OUT(first,IN) RB3=ERRout
     movwf TRISB
;RB7,RB6 are used for TX handshake
;RB1,RB0 are used for RX handshake
;RB4 is used for 'bit5' of the DATA from/to CPU
         movlw 0FF; RA=IN/OUT(first,IN)
        movwf TRISA
;RA is used 'DATA' from/to CPU,except RA5
        movlw 0
         movwf ANSEL;a0-a6 are DIGITAL
;
;baugh_rate set
     ;movlw 19;=25,  9600 baugh/4MHz
        ;movlw 67;=103,  4800bps/8MHz,2400bps/4MHz
        ;movlw 33;=51,  9600bps/8MHz
        movlw 19;=25,  19200bps/8MHz
     movwf SPBRG
;non parity & BRGH=1
     movlw 24;TXENABLE
     movwf TXSTA
        bsf PIE1,5;RCIE enable
     bcf STATUS,5 ;bank 0
        clrf bfcntr
        movlw 30
        movwf bfrdend
        movwf bfwrend
        movlw 0ff;first,RB0,RB3=1
        movwf PORTB
     movlw 90
     movwf RCSTA
        movlw 0c0
        movwf INTCON
;start
;
rdck
;232c read
        clrwdt
        btfss PORTB,7
        goto wdata
        movf bfcntr,w
        btfsc STATUS,zf;   if not zero,BFDATA is available
        goto rdck
;read RX data from BF
        movf bfrdend,w
        movwf FSR
        movf INDF,w
        movwf outdata
        decf bfcntr,f
        incf bfrdend,f
        btfss bfrdend,7
        goto dout
        movlw 30
        movwf bfrdend
; 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       
;
;in TX data from cpu & LINE out 
wdata
        movlw 0ff
        movwf PORTB
        bsf STATUS,5;bank1
        movlw 0FF
        movwf TRISA;RA in
        movlw 96
        movwf TRISB;RB4 in
        bcf STATUS,5;bank0
        nop;wait a small time
        nop
        movf PORTA,w
        movwf rddata
        btfsc PORTB,4
        goto rd5set
        bcf rddata,5
        goto wdata1
rd5set
        bsf rddata,5
wdata1
        bcf PORTB,6;BUSY out
        movf rddata,w
        call souts
wdata2
        clrwdt
        btfss PORTB,7;if STROBE OFF from CPU
        goto wdata2
        bsf PORTB,6;READY out
        goto rdck
;
errstop
        bcf PORTB,3;error!
eloop
        clrwdt
        goto eloop
;
; subroutine
;
souts
        bsf STATUS,5;bank 1
souts2
        clrwdt
        btfss TXSTA,1
        goto souts2
        bcf STATUS,5;bank 0
        movwf TXREG
        return
;
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
;
     end
;


本日は大晦日です。
今年もあと2時間足らずとなってしまいました。
最後になりましたが、今年一年拙文にお付き合いいただき有難うございました。
来年も倍旧のお引き立てをお願いいたします。
それでは皆様、よいお年をお迎えください。

MYCPU80でCP/Mを![第91回]
2014.12.31upload

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