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 |
;;;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 ; |