On Thursday, Nov 7, 2002, at 15:56 Asia/Tokyo, Pan, Guanguru wrote:
> ところが、取説にサンプルプログラムのリストが載っている通信機能
> を試すソフトTEST.MARを手入力し、コンパイラしたら、どうしてもエラーが
> でます。
で、下にのせたハンさんのプログラムですが、とりあえずエラーになりそうなのは、
1) プログラム本体のおかれる場所が 0x00100 からになっていない
-> "reset:" ラベルの前に ".section reset0,code,locate=h'00100" とかをいれる
2) 33行目あたりからいくつか "#r0l" がある
-> "r0l" ですよね。
3) 50行目あたりに "#' a'", "#' z'" がある
-> "#'a'", "#'z'" だったのでは?
ぱっと僕に分かったのはこれくらいですが。ほかにも形式的でない問題があるかもしれません。
ところで、このプログラムは最初に試すにしては複雑すぎませんか?
一番最後のところに別のサンプルプログラム MYTERM.TXT をのせておきました。こっちは起動後 SCI1(書き込みに使う方)
で'S'送信->1文字受信するまで待ち->'R'送信するだけのシンプルなものです。使っているテクニックとかも少ないので、どうでしょう?
**** TEST.MAR by Pan ****
.heading 'Test for H8/3048 98.01.16'
.print src,nocref,nosct,list
;----------------------------------------------
; Simple In/Out for H8/3048
; H8/3048 SingleChip Advanced Mode
;----------------------------------------------
;
.CPU 300HA:20 ;H8/300H Advanced Mode,20 bit addr
;
;
;---------------------------------------------
; rest vector table
;---------------------------------------------
.section rom,data,locate=h'0
;
.data.l reset
;
;---------------------------------------------
reset:
mov.l #stack,sp
bsr inisci
loop:
bsr inch
bsr outch
bra loop
;
;--------------------------------------------
; inisci InitSCI
;--------------------------------------------
inisci:
mov.b #0,r0l
mov.b #r0l,@sci0scr ;clear all flags
mov.b #0,r0l
mov.b #r0l,@sci0smr ;Ascnc, 8bit, Noparity, (Even), stop1, 1/1
mov.b #51,r0l
mov.b #r0l,@sci0brr ;9600 baud (CPU=16MHz)
mov.w #280,r0 ;wait 1 bit time (1/9600 sec)
inisc1: dec.w #1,r0
bne inisc1
mov.b #h'30,r0l
mov.b #r0l,@sci0scr ;scr=0011 0000 (TE=1,RE=1)
mov.b @sci0ssr,r0l ;Dummy Read
mov.b #h'80,r0l
mov.b #r0l,@sci0ssr ;Clear Error Flag (TDRE=1)
rts
;-------------------------------------------
; inch to r0l
; if err then carry=1
;-------------------------------------------
inch: bsr inchxx ;to upper
cmp.b #' a',r0l
blo inch2
cmp.b #' z',r0l
bhi inch2
and.b #h'df,r0l ;'a'(0x61)ÅÑ'A'(0x41)
inch2: rts
inchxx: mov.b @sci0ssr,r0l
and.b #h'78,r0l
beq inchxx ;RDRF=ORER=FER=PER=0
btst.b #6,@sci0ssr:8
beq incher
mov.b @sci0rdr,r0l
bclr.b #6,@sci0ssr
andc.b #h'fe,ccr ;clear carry
rts
;
incher: mov.b #h'80,r0l
mov.b r0l,@sci0ssr
orc.b #1,ccr
rts
;------------------------------------------
; outch from r0l
;------------------------------------------
outch: btst.b #7,@sci0ssr
beq outch
mov.b r0l,@sci0tdr
bclr.b #7,@sci0ssr
rts
;
.section stk,stack,locate=h'ff400
stack: .equ $
;
ramend: .equ h'fff0f
;
;------------------------------------------
; internal I/O defs h'fff1c - h'ffff
;--sci defs
.section io,data,locate=h'fffb0
sci0smr .res.b 1 ; h'fffb0 ;serial mode register (h'fffb0)
sci0brr .res.b 1 ; h'fffb1 ;serial bit rate register
sci0scr .res.b 1 ; h'fffb2 ;serial control register
sci0tdr .res.b 1 ; h'fffb3 ;serial TX data
sci0ssr .res.b 1 ; h'fffb4 ;serial status register
sci0rdr .res.b 1 ; h'fffb5 ;serial RX data
;
.end
**** TEST.MAR ends ****
**** MYTERM.TXT ****
.CPU 300HA
; SCI ch1 Initialize Subroutine
SMR1 .EQU H'FFFFB8
BRR1 .EQU H'FFFFB9
SCR1 .EQU H'FFFFBA
TDR1 .EQU H'FFFFBB
SSR1 .EQU H'FFFFBC
RDR1 .EQU H'FFFFBD
.SECTION RESET0, DATA, LOCATE=H'00000
.DATA.L INIT
.ORG H'000E4
.DATA.L IN_CHR
.SECTION ROM,CODE,LOCATE=H'00100
INIT:
SCI_INIT:
MOV.B #0,R0L
MOV.B R0L,@SCR1 ;TE=0, RE=0, CKE1=0, CKE0=0
MOV.B R0L,@SMR1 ;SMR= 0000 0000 (n=0)
MOV.B #51,R0L
MOV.B R0L,@BRR1 ;BRR=51 (N=51)
MOV.W #280,R0
SCI_INIT_WAIT:
DEC.W #1,R0
BNE SCI_INIT_WAIT
MOV.B #H'70,R0L
MOV.B R0L,@SCR1 ;SCR=0111 0000 (RIE=1,TE=1,RE=1)
MOV.B @SSR1,R0L ;Dummy Read
MOV.B #H'80,R0L
MOV.B R0L,@SSR1 ;Clear Error Flag (TDRE=1)
MOV.L #H'FFFF00,ER7 ;set SP
BCLR #7,@FLAG ;clear flag
ANDC #B'01111111,CCR ;enable interrupt
MOV.B #H'53,R0L
JSR @OUT_DATA
WAITLOOP:
BTST #7,@FLAG ;check Rx data
BEQ WAITLOOP
MOV.B #H'52,R0L
JSR @OUT_DATA
ENDLOOP:
JMP @ENDLOOP
; 1 Data Transmit Subroutine
OUT_DATA:
BTST.B #7,@SSR1 ; TEST TDRE
BEQ OUT_DATA ; WAIT IF TDRE=0
MOV.B R0L,@TDR1 ; WRITE DATA TO TRD
BCLR.B #7,@SSR1 ; CLEAR TDRE
RTS
IN_CHR: PUSH.W R0
BCLR #6,@SSR1 ;stop interrupt
MOV.B @RDR1,R0L
MOV.B R0L,@R_DATA
BSET #7,@FLAG ;set flag
POP.W R0
RTE
.SECTION WORK,DATA,LOCATE=H'FFFF00
R_DATA: .RES.B 1
FLAG: .RES.B 1
.END