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