AKI- H8/3048foneのモニタプログラム環境での
はじめてのプログラ ミング簡単コマンド利用版

Copyright(C)12Mar2014
since 1Aug2003
coskx


1.はじめに


この文書は,AKI-H8におけるH8/3048foneのモニタプログラム,PCターミナルソフトでの学習を記述している。
モニタプログラムは,新しいプログラムの動作を検証する場合や,アセンブリ言語の学習者が,1命令ずつ機
械語命令を実行してCPUのふるまいを観察するプ ログラムである。モニタプログラムはROM(フラッシュメモ
リ)上に配置されており,検証対象のプログラムはRAM上に置かれる。検証対象のプログラムの 実行方法は2
つある。検証対象のプログラムは,モニタプログラムのデータの位置づけである。
(1)モニタプログラム実行時に直接アセンブリ言語を書き込む。
(2)PC上のエディタでアセンブリ言語プログラムを作り,クロスアセンブラなどを用いて 機械語プログラ
   ムに変換し,H8に転送する。
そして,モニタプログラムで実行可能となる。

第1段階としてモニタプログラム,PCターミナルソフト,クロスアセンブラ環境を構築する。
第2段階としてモニタプログラム上でアセンブリ言語によるH8プログラミングを学を学ぶ。アセンブリ語のプログラミング
については別の文書を参照のこと。
この文書では
PC上のターミナル画面からアセンブリニーモニックを直接入力してCPUの動作を見る方法
を示している。

trial5 をダウンロードするる。

このファイルを解凍すると「trial5」のフォルダが出てくるので,
作業用フォルダとして使う。内容は2.(2)で示している。
((本校)LANからのみ試用のためアクセスできる。)
4J電子計算機IIの授業ではこれを使います

以下は,(本校)情報工学科演習室の授業では不要な作業である。

(本校)内部LANからは環境整備のためのファイルがダウンロードできる。

クロスアセンブラ・コンパイラ環境

このファイルを解凍すると「h8v2」のフォルダが出てくるので,
「C:\program files」の中に入れる

前提
(1)「トランジスタ技術2002年3月号付録CDROM」より入手した,アセンブラ,Cコンパイラ関 係ファイルおよびインクルードファイル,ライブラリファイルはすべて「C:\Program Files\h8V2」に入っているものとする。
(2)MONITOR3048fone.MOTをルネサステクノロジから入手済とします。利用条件を承諾してダウンロードできます

MONITOR3048fone.MOTはルネサステクノロジが公開しているモニタソースをHEWでコ ンパイルしたものである。

(3)two2neg.exeを入手済とする。

「two2neg.exe」の取得は
http://www.vector.co.jp/soft/other/h8/se298946.htmlから行う。


(4)転送ソフト「h8w.exe」を利用します。h8w.exeの入っているフォルダ「H8W」は「C:\Program Files\h8v2\WRITER\H8W」を想定している。

転送ソフト「h8w.exe」はyamasan氏のオープンツールです。次の場所から入手できる。
http://ym3.plala.jp/yamasan/


2.モニタプログラムの実行まで

モニタプログラムとは,CPUのプログラム実行の様子を観察するためのプログラムである。

(1)作業用フォルダ trial5 をCドライブのルートに移動し,この中で作業する。
  (全角のフォルダ名は問題を起こすようです)

(2)作業用フォルダを開く。 (to_H8mon.htはハイパーターミナル用なのでここでは使いません。README.TXTはモニタアプリの説明書)

(3)goH8W3048fone.cmdにて MONITOR3048fone.MOTを書き込む。

この手順の意味

自分で作成したCプログラムをH8で動作させる場合は,Cのソースファイルからコンパイラシステムで実行形式にし,転送形式のMOTファイルをH8に転送していた。
ここでは自分で作成したプログラムではないがモニタプログラムがすでにMOT形式になっているので,MOTファイルをH8に転送するところだけ行う。

詳しく説明すると次のような手順になる。

WindowsPC側H8/3048fone側
シリアルケーブルがCOM1に接続されていることを確認する。シリアルケーブルが接続されていることを確認する。
 電源をOFFにする。
 Run/Write(Run/Boot)切り替えスイッチをWriteモードにする。
 電源をONにする。

MONITOR3048fone.MOT」を「goH8W3048fone.cmd」にドラッグ&ドロップする。(.motがマイコン側に転送される)

 
転送終了まで待つ。 
 電源をOFFにする。
 Run/Write(Run/Boot)切り替えスイッチをRunモードにする。

(4)teraterm_H8_mon.cmdでteratermを立ち上げる。

(5)H8/3048foneをrunモードで電源ONにして起動し,次の表示が現れたらOKである。モニタが応答している。

モニタの起動

 H8/3048 Series Advanced Mode Monitor Ver. 3.0A
 Copyright (C) 2003 Renesas Technology Corp.

:


(6)helpの表示
「?」を入力するとメモリ状況と簡単な利用方法が表示されます。

モニタのhelp

: ?
 Monitor Vector 00000 - 000FF
 Monitor ROM    00100 - 059F9
 Monitor RAM    FEF10 - FEFE3
 User    Vector FF000 - FF0FF

 .  : Changes contents of H8/300H registers.
 A  : Assembles source sentences from the keyboard.
 B  : Sets or displays or clear breakpoint(s).
 D  : Displays memory contents.
 DA : Disassembles memory contents.
 F  : Fills specified memory range with data.
 G  : Executes real-time emulation.
 H8 : Displays contents of H8/3048 peripheral registers.
 L  : Loads user program into memory from host system.
 M  : Changes memory contents.
 R  : Displays contents of H8/300H registers.
 S  : Executes single emulation(s) and displays instruction and registers.
:

「A?」や「D?」のように入力すると,そのコマンドの使い方の説明を見ることが出来ます。


(7) 画面表示と同じ内容をテキストファイル出力
ログファイル出力設定を行うと,モニタ画面上の表示と同じものがログファイルに書き出され,
報告書作成に便利である。


teraterm

「ファイル」メニューの「ログ」コマンドでログ出力ファイル名を設定する。
ログ出力ファイルはデスクトップに置くとよい。

teratermを起動したままにして,H8/3048foneの電源をOFFにして,もう一度(5)(6)を実行して,
ログファイルに画面と同じ内容が書きだされたか,確認しなさい。


3.H8/3048foneにおけるCPU内のレジスタとメモリ配置

実際にプログラムを動作させる前に,簡単にH8のレジスタとメモリについて説明する。

3.1 レジスタ

レジスタはCPUの作業を行う場所である。(何ができるかは後で順に紹介する)

レジスタは32ビット幅で8個あり,名前はER0,ER1,ER2,ER3,ER4,ER5,ER6,ER7である。
またER0は,2つの16ビット幅レジスタE0,R0として使うこともできる。
(従って,R0とER0を同時に別の用途に使うことはできない)
さらにまた16ビット幅レジスタR0は,2つの8ビット幅のレジスタR0H,R0Lとして使うこともできる。
(従って,R0LとR0やER0を同時に別の用途に使うことはできない)

ER0 (32bit)

または

E0 (16bit)

R0 (16bit)

または

E0 (16bit)

R0H (8bit)

R0L (8bit)

                  レジスタER0の構造と使われ方

ER0の構造はER1,ER2,ER3,ER4,ER5,ER6でも同じである。
例えばER1では次のようになっている

ER1 (32bit)

または

E1 (16bit)

R1 (16bit)

または

E1 (16bit)

R1H (8bit)

R1L (8bit)

                  レジスタER1の構造と使われ方

もう一例を上げれば,ER2では次のようになっている

ER2 (32bit)

または

E2 (16bit)

R2 (16bit)

または

E2 (16bit)

R2H (8bit)

R2L (8bit)

                  レジスタER2の構造と使われ方

bit,byteと16進表示についてまとめておこう


ビット数
バイト数
16進表現桁数
表現範囲
略号
バイト
8bit
1byte
2桁
00-FF
B
ワード
16bit
2byte
4桁
0000-FFFF
W
ロングワード
32bit
4byte
8桁
00000000-FFFFFFFF
L


ここで,先のモニタでrコマンドを使ってレジスタの内容を表示 させてみよう。

モニタの起動

H8/3048 Series Advanced Mode Monitor Ver. 3.0A
Copyright (C) 2003 Renesas Technology Corp.

: r
  PC=000000  CCR=80:I.......  SP=000FFF00
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00

ここでER0=00000000 と表示されているのが, レジスタER0の内容である。16進8ケタでER0=0を表している。
(1byte=8bitは16進で2ケタ,2byte=16bitは16進で4ケタ,4byte=32bitは16進で8ケタで表され る。)

もし,ER0=12345678 になっているとすれば,次の3つの可能性がある。
  (1)ER0=12345678(Hex)
  (2)E0=1234
(Hex) R0=5678(Hex)
  (3)E0=1234(Hex) R0H=56(Hex) R0L=78(Hex)


3.2 メモリ配置

ここではH8/3048foneをモード7で使用しているので,以下のようなメモリ配置になっている。

ROM領域 00000-1FFFF (128kbyte,フラッシュメモリ,書き込みソフトでしか書き込めない)
 ベクタエリア 00000-000FF
 ユーザエリア 00100-1FFFF (ここでいうユーザエリアにはモニタプログラムも含まれる)
RAM領域 FEF10-FFF0F (4kbyte,マイコン上のプログラムで変更可能)
 ユーザエリア FEF10-FFEFF (ここでいうユーザエリアにはモニタプログラムも含まれる)
 特別なRAM領域 FFEFF-FFF0F

このうち,モニタプログラムが動作している状況ではユーザのプログラム,データはすべてRAM領域を使う。
しかもモニタの作業領域もあるため,ユーザに開放されているのは次の範囲である。

ユーザベクタ FF030 - FF12F
プログラム,データ,スタック FF130-FFEFF

3.3 推奨されるメモリ割り当て

そうするとモニタを利用した学習用のちいさなプログラムでは以下の利用方法が推奨される。

プログラム領域 FF130-FF7FF  (1.75kbyte-48byte)
データ領域   FF800-FFDFF (1.5kbyte)
スタック領域  FFE00-FFEFF (0.25kbyte)
         スタックポインタ初期値はFFF00,スタック領域先頭番地FFE00はめやすである。

メモリMAP

00000
-000FF
ROM ベクタエリア(モニタプログラム用)
00100
-1FFFF
ROM モニタプログラムエリア

20000
-FEF0F

  メモリ非実装領域
FEF10
-FF02F
RAM モニタプログラム作業領域
FF030
-FF12F
RAM ユーザベクタ領域

FF130
-FFEFF

RAM ユーザ領域
  プログラム領域
  データ領域
  スタック領域
FFF00
-FFF0F
RAM 特別(8ビットアドレスによる高速アクセス領域)
FFF10
-FFF1B
  未使用
FFF1C
-FFFFF
I/O I/O領域

参考1 ユーザ領域でのプログラム,データ,スタックの境界は変更できる。 
参考2 モニタプログラムを用いないH8/3048fone利用方法ではプログラムはROM領域を,動的データはRAM領域を使用するので,サイズはそ れぞれ128kbyteと4kbyteが利用可能となっている。

モニタプログラムでdコマンドを使ってメモリの様子を表示してみよう。表示するアドレスは0番地から1F番地とする。

モニタの起動

H8/3048 Series Advanced Mode Monitor Ver. 3.0A
Copyright (C) 2003 Renesas Technology Corp.

: r
PC=000000 CCR=80:I....... SP=000FFF00
ER0=00000000 ER1=00000000 ER2=00000000 ER3=00000000
ER4=00000000 ER5=00000000 ER6=00000000 ER7=000FFF00
: d 0 1f
  <ADDR>                  <  D  A  T  A  >                     < ASCII CODE >
  00000   00 00 01 00 00 00 28 16  00 00 28 1A 00 00 28 1E   "......(...(...(."
  00010   00 00 28 22 00 00 28 26  00 00 28 2A 00 00 28 2E   "..("..(&..(*..(."

<ADDR>の表示は,メモリの0,1,2,3,...番地の値が順に,00,00,01,00,00,00,28,16,...となっていることを示している。
また,1B番地は2A,1F番地は2Eであることもわかるであろう。

4.テストプログラムの入力と実行

(1)ここでは簡単なテストプログラムの入力と実行を行なう。
 メモリ上におかれた2つの整数の和を作り,別のメモリに格納する。
 ただし,演算はCPU内のレジスタ間でしか行えないため,メモリの内容をレジスタに載せてから
 和を作って,レジスタ内に出来た和を目的のメモリに保存する必要がある。


 プログラムは次のようなものである。
 (プログラムはFF200番地から格納する。)
 スタックポインタを初期化する(使わないのでしなくてもよい)
 FF800,FF801番地の2byteデータをレジスタR0に載せる
 FF802,FF803番地の2byteデータをレジスタR1に載せる
 R0とR1の値を加えてR0にしまう
 R0の2ByteデータをFF804,FF805番地にしまう
 FF21C番地には,FF21C番地へジャンプ(ブランチ)する命令を書く(無限ループ)(braがジャンプ命令)

 結局FF800番地の2バイトの値とFF802番地の2バイトの値の和をFF804番地の2バイトに保存することになる。

(2)実行の手順
 1)プログラムニーモニックの手入力
 2)FF800,FF802,FF804番地に適当なデータをしまう
 3)FF800,FF802,FF804番地の内容を確認する
 4)1ステップずつプログラムを実行する
 5)FF800,FF802,FF804番地の内容を確認する

(3)実行時のモニタの画面
ここではプログラムをFF200から置いて実行させている。

内容

モニタ画面

プログラムの入力
(Assemble アセンブル)
a ff200」は次に与えるアセンブリプログラムを機械 語に変
換して,ff200番地から,書き込みなさいの意味。 *2
プログラムの説明は下部 *5にある

アセンブリソースプログラムを入力すると,モニタプログラムが,機械語に変換しながらFF200番地から書き込んでくれる。
ある命令が何バイトでできているかをモニタプログラムが理
解し,次の命令をどの番地に書くかを指示してくれる。

アセンブリソースプログラムはどこにも保存されていない。

: a ff200
  FF200   >  mov.l #fff00,er7
  FF206   >  mov.w @ff800:24,r0
  FF20C   >  mov.w @ff802:24,r1
  FF212   >  add.w r1,r0
  FF214   >  mov.w r0,@ff804:24
  FF21A   >  bra ff21a:8
  FF21C   >  .

書き込まれた機械語プログラムの確認表示
(Display)
d ff200 ff21f」はFF200番地から FF21F番地までのメモリ
内の値を表示しなさいの意味。
(この表示の意味がわからなかったら本ページの10を見なさい)

FF200番地からFF21B番地まで機械語プログラムが書いてあ
る。しかし,人間には意味不明である。
CPUにとってのプログラムはこれである。(CPUはアセンブリ
プログラムを理解することはできない)
人間は機械語プログラムを見てもFF200番地からどこまでが
最初の1命令かもわからない。

: d ff200 ff21f
  <ADDR>                  <  D  A  T  A  >                     < ASCII CODE >
  FF200   7A 07 00 0F FF 00 6B 20  00 0F F8 00 6B 21 00 0F   "z.....k ....k!.."
  FF210   F8 02 09 10 6B A0 00 0F  F8 04 40 FE FF F9 FF F7   "....k.....@....."
プログラムの確認
(DisAssemble ディスアセンブル)
da ff200 ff21a」はFF200番地から FF21A番地までのメモリ
内の値を機械語プログラムだとして,アセンブリ言語に翻訳し
表示しなさいの意味。

FF200からFF21Aまでをモニタプログラムに翻訳,表示させた
ことになる。
先に入力したソースプログラムが見えている。

codeはアセンブリ言語が機械語に変換されたもので,ここで
は2バイト命令や6バイト命令になっていることがわかる。

mnemonic(ニモニック)は機械語命令を人間が覚えやすいよ
うにした単語である。この部分のことをopecode(オペコード)
(operational code)ともいう

operand(オペランド)は命令対象を示す。
: da ff200 ff21a
  <ADDR>  <CODE>                <MNEMONIC> <OPERAND>
  FF200   7A07000FFF00          MOV.L      #H'000FFF00:32,ER7
  FF206   6B20000FF800          MOV.W      @H'FF800:24,R0
  FF20C   6B21000FF802          MOV.W      @H'FF802:24,R1
  FF212   0910                  ADD.W      R1,R0
  FF214   6BA0000FF804          MOV.W      R0,@H'FF804:24
  FF21A   40FE                  BRA        FF21A:8
ff800番地付近のメモリ表示
(設定前)

*1

まだなにもしていないため,各番地にどのような値が保存さ
れているかは不明で,実際にはこれとは異なる値が表示さ
れる。
: d ff800 ff80f
  <ADDR>                  <  D  A  T  A  >                     < ASCII CODE >
  FF800   12 34 23 45 35 79 DB 7B  E2 8C E7 5B 04 80 E7 7A   ".4#E5y.{...[...z"

ff800番地付近のメモリ内容の変更
「m ff800」はFF800番地から順に内容を書き換えるの
意味。
変更前の値(12,34,23,45,・・・)はここに示したものとは異なるだろう*2

: m ff800
  FF800   12  ?  11
  FF801   34  ?  22
  FF802   23  ?  33
  FF803   45  ?  44
  FF804   35  ?  55
  FF805   79  ?  66
  FF806   DB  ?  .

ff800番地付近のメモリ表示
(設定後)
(実行前)
*1

値が書き換わったことがわかるであろう

: d ff800 ff80f
  <ADDR>                  <  D  A  T  A  >                     < ASCII CODE >
  FF800   11 22 33 44 55 66 DB 7B  E2 8C E7 5B 04 80 E7 7A   "."3DUf.{...[...z"
レジスタの確認
*3

SPとER7は同じレジスタである
: r
  PC=0FF11A  CCR=80:I.......  SP=000FFF10
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF10
プログラムカウンタ
(PC)の変更
*2
: .pc
  PC=0FF11A  ?  0ff200
  CCR=80  ?  .
レジスタの確認
プログラムカウンタが変更されているのがわかる。
: r
  PC=0FF200  CCR=80:I.......  SP=000FFF10
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF10
1ステップずつ
実行 *4
: s
  PC=0FF206  CCR=80:I.......  SP=000FFF00
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
  FF200   7A07000FFF00          MOV.L      #H'000FFF00:32,ER7
: s
  PC=0FF20C  CCR=80:I.......  SP=000FFF00
  ER0=00001122  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
  FF206   6B20000FF800          MOV.W      @H'FF800:24,R0
: s
  PC=0FF212  CCR=80:I.......  SP=000FFF00
  ER0=00001122  ER1=00003344  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
  FF20C   6B21000FF802          MOV.W      @H'FF802:24,R1
: s
  PC=0FF214  CCR=80:I.......  SP=000FFF00
  ER0=00004466  ER1=00003344  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
  FF212   0910                  ADD.W      R1,R0
: s
  PC=0FF21A  CCR=80:I.......  SP=000FFF00
  ER0=00004466  ER1=00003344  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
  FF214   6BA0000FF804          MOV.W      R0,@H'FF804:24

ER7の値を変更したが
わかりにくい。
ER7の値はSP
の値でもある。

ER0の下位4桁
はR0を示している。
もとはFF800にあっ
た値である。

ER1の下位4桁
はR1を示している。
もとはFF802にあっ
た値である。

ER0の下位4桁はR0,
ここに和
が格納された


アドレスFF804に
R0の値が格納
されたはず。
次のd命令で確かめる。

ff800番地付近のメモリ表示(実行後)
1122(Hex)+3344(Hex)=4466(Hex)が確認でき,
正しく動作したことがわかる。
*1

: d ff800 ff80f
  <ADDR>                  <  D  A  T  A  >                     < ASCII CODE >
  FF800   11 22 33 44 44 66 DB 7B  E2 8C E7 5B 04 80 E7 7A   "."3DDf.{...[...z"


*1 ビッグエンディアン:十六進数0x1122はメモリ上で 11,22の順で並んでいる。
*2 「.」を打つとそれ以降の変更作業は終了,変更しないときは単に[Enter]を押す。
*3 レジスタの表示について

PC プログラムカウンタ  24ビット(16進表現で6ケタ)
H8/3048foneのモード7(現在の使用方法)では下位20ビット(16進表現で下位5ケタ)のみ使用
CCR コンディションコードレジスタ  8bit(16進表現で2ケタ)
割り込みマスクはこのレジスタの第7bit(I)
SP スタックポインタ  32ビット(16進表現で8ケタ) 実はER7と同じもの
ER0-
 ER7

7つのレジスタ  32ビット(16進表現で8ケタ)
ただし,ER0=12345678のように表示されていたら
ER0に12345678が入っていると読むか,E0とR0にそれぞれ1234と5678が入っていると読むかは
前後関係から読み取る必要がある。
またE0に1234,R0HとR0Lにそれぞれ56と78が入っていると読むのかもしれない。
前後関係から読み取る必要がある。


*4 sコマンドの時の表示は,最初の3行では1つの命令を実行し終わった時の新しいプログラムカウンタや各レジスタ内容を表示し,
4行目は実行された命令のアドレス,機械語,ニーモニックを表示している。

A領域   PC=0FF206  CCR=80:I.......  SP=000FFF00
  ER0=00000000  ER1=00000000  ER2=00000000  ER3=00000000
  ER4=00000000  ER5=00000000  ER6=00000000  ER7=000FFF00
B領域   FF200   7A07000FFF00          MOV.L      #H'000FFF00:32,ER7

B領域の命令を実行した結果,各レジスタはA領域の ようになった」と解釈すればよい。

B領
の命令とは
FF200番地に書いてある「7A07000FFF00」の ことで,CPUはこれを読み取って動作している。
その意味は「MOV.L #H'000FFF00:32,ER7」 であると,モニタプログラムが人間にわか
るように翻訳してくれている。(CPUがこの表示の意味を解釈しているわけではない。)

また,この命令はFF200にあったが,実行後はPCの値はこの命令語の構成バイト数
(6バイト 16進で12桁)だけ増えて,FF206になっているのがわかる。


*5プログラムの説明

mov.l #fff00,er7


mov.w @ff800:24,r0


mov.w @ff802:24,r1


add.w r1,r0


mov.w r0,@ff804:24


bra ff21a:8

値FFF00をレジスタer7(スタックポインタ)に格納
movはmove(移動する)
「.l」はlongword(4バイト)の意味
FF800番地の内容をレジスタr0に格納 24というのは24ビット幅でアドレスを表すの意味
「.w」はword(2バイト)の意味,
「:24」は(アドレスが)24 ビットで表現されているの意味

FF802番地の内容をレジスタr0に格納
「.w」はword(2バイト)の意味,
「:24」は(アドレスが)24 ビット
で表現されているの意味
レジスタr1の内容をレジスタr0の内容と足し算し,レジスタr0の内容とする
addは加える
「.w」はword(2バイト)の意味
レジスタr0の内容をFF804番地に格納する
「.w」はword(2バイト)の意味,
「:24」は(アドレスが)24 ビット
で表現されているの意味
FF21aへジャンプ ただし,アドレスは8ビット幅の相対アドレスに変換して表す
braはbranch(分岐する)
「:8」は(アドレスが)8 ビットで表現されているの意味

 .l .w .b について

「.l」はlongword(4バイト)の値を対象としているという意味
「.w」はword(2バイト)の
値を対象としているという意味
「.b」はbyte(1バイト)の
値を対象としているという意味

  アドレスのビット数を24としているが,実際使われているのは20ビットである。
  この不一致は,このモニタプログラムの汎用性のためだと思われる

 #と@について

「#」は即値を表し,「@」はポインタを表している。

mov.l #fff00,er7 は即値fff00(Hex)をレジスタer7に保存している

mov.w @ff800:24,r0 は24ビットで表されるff800番地(:24なので)から始まる2バイト
(.wなので)を2バイトレジスタr0に保存している。
もし
mov.w #ff800:24,r0 だったら24ビットの値ff800を2バイト転送(.wなので)で
2バイトレジスタr0に保存するの意味になるが,24ビットの値を2バイト(16ビット)の
レジスタには保存できないので,これは許されない。
もし
mov.w #f800,r0 なら値f800を2バイト転送(.wなので)で2バイトレジスタr0に
保存するの意味になる

mov.w r0,@ff804:24 は2バイトレジスタr0内の値を,24ビットで表されるff804番地
(:24なので)から始まる2バイト
(.wなので)に保存するの意味になる。


スタックポインタはサブルーチンコール時の戻りアドレスなど重要な内容の格納場所を示すレジスタなので,
CPU起動時にスタック領域の一番後ろを指すようにしておく。

    MOV.L    #H'FFF10,ER7    ;スタックポインタ設定

言葉の説明

アセンブリ言語
(人間が理解できる)

mov.l #fff00,er7
mov.w @ff800:24,r0
mov.w @ff802:24,r1
add.w r1,r0
mov.w r0,@ff804:24
bra ff21a:8

  →→→
翻訳作業の名前
アセンブル
翻訳プログラムの名前
アセンブラ

  ←←←
翻訳作業の名前
ディスアセンブル
翻訳プログラムの名前
ディスアセンブラ

機械語
(CPUが理解できる)

7A 07 00 0F FF 00 6B 20
00 0F F8 00 6B 21 00 0F
F8 02 09 10 6B A0 00 0F
F8 04 40 FE

モニタプログラム内には,簡易なアセンブラ,ディスアセンブラが組み込まれている。

 

H8 命令ニーモニクの説明マニュアル 学内高速読み取りバッファより

 



7.参考(1) 各コマンドの説明

 モニタにおいて,コマンドの後ろに「?」をつけると各コマンドの説明が表示されます。

各コマンドのhelp

: b ?
 1. Sets breakpoint at specified address.
      B <address> [RET]
 2. Displays breakpoint(s).
      B [RET]
 3. Clear breakpoint(s).
      B - [<address>] [RET]
   <address> : address of breakpoint
: d ?
 Displays memory contents.
      D <address1> [<address2>] [;<size>] [RET]
   <address1> : dump area start address
   <address2> : dump area end   address
   <size>     : B -- byte
                W -- word
                L -- long word
: f ?
 Fills specified memory range with data.
      F <address1> <address2> <data> [RET]
   <address1> : filling area start address
   <address2> : filling area end   address
   <data>     : filling byte data
: h8 ?
 Displays contents of H8/3048 peripheral registers.
      H8 <name> [RET]
   <name> : DMAC0 - Direct Memory Access Controller 0
            DMAC1 - Direct Memory Access Controller 1
            ITU   - 16bit Integrated Timer pulse Unit
            ITU0  - 16bit Integrated Timer pulse Unit 0
            ITU1  - 16bit Integrated Timer pulse Unit 1
            ITU2  - 16bit Integrated Timer pulse Unit 2
            ITU3  - 16bit Integrated Timer pulse Unit 3
            ITU4  - 16bit Integrated Timer pulse Unit 4
            TPC   - programmable Timing Pattern Controller
            WDT   - Watch Dog Timer
            SCI0  - Serial Communication Interface 0
            SCI1  - Serial Communication Interface 1
            I/O   - I/O port
            D/A   - D/A converter
            A/D   - A/D converter
            INTC  - INTerrupt Controller
            BSC   - BuS Controller,etc.
:

 

8.参考(2) アッセンブルコマンド「Asm2Mon.cmd」


Asm2Mon.cmd

rem ------------------------------------------------------------------------
rem H8のモニタ上で実行する実習用ソースファイルからMOTファイルを作ります
rem H8Cコンパイラver2のセットに対応しています。
rem ASMのソースファイルのドラッグ&ドロップに対応
rem ------------------------------------------------------------------------

@echo off
echo Assemble, link and convert command for H8 ASM-programing with V2 ver1.00
echo Copyright(c) 29June2006 coskx
REM Copyright(c) 9Dec2002 coskx

rem カレントドライブ・カレントディレクトリへ移動
%~d1
cd %~p1

rem コンパイラのパスの設定
path=%path%;%HOMEDRIVE%\Program Files\h8v2\bin
set h8inc=%HOMEDRIVE%\Progra~1\h8v2\include
set h8lib=%HOMEDRIVE%\Progra~1\h8v2\lib

rem 誤ったファイルがドロップされたか,単なるダブルクリックで起動した場合は何もしない
if exist %~n1.src goto ASSEMBLE
if exist %~n1.mar goto ASSEMBLE
goto NO_SOURCE_ERROR

:ASSEMBLE
asm38 %~n1.src -so -cr -list
if not exist %~n1.obj goto ASM_ERROR

:LINK
rem ----------------------------------------------------------------------------
lnk %~n1 -PRINT=%~n1  >q9j2h5c4k6b1.txt
type q9j2h5c4k6b1.txt
find "**" q9j2h5c4k6b1.txt >nul
if errorlevel 1 goto CONVERT
del q9j2h5c4k6b1.txt
if exist %~n1.abs del %~n1.abs
goto LINK_ERROR

:CONVERT
del q9j2h5c4k6b1.txt
rem ----------------------------------------------------------------------------
rem Sフォーマットに変換 xxx.motの作成
cnvs %~n1.abs
del %~n1.abs
del %~n1.obj
ren %~n1.MOT %~n11.MOT
two2neg.exe <%~n11.MOT >%~n1.MOT
del %~n11.MOT

goto TERMINAL

:NO_SOURCE_ERROR
echo *** error *** ASMのソースファイルが指定されていません。
goto TERMINAL

:ASM_ERROR
echo *** error *** コンパイルエラーがありました。
goto TERMINAL

:LINK_ERROR
echo *** error *** リンクエラーです。
goto TERMINAL

:TERMINAL
echo Pushing any key leads the exit.
pause >nul
exit

 

9.参考(3)h8v2フォルダの構成例


h8v2の構成例
C:\Program Files\h8v2
├─BIN
│      ASM38.EXE
│      C38ASM.EXE
│      C38CGN.EXE
│      C38FRNT.EXE
│      C38MID.EXE
│      C38PEP.EXE
│      CH38.EXE
│      CNVS.EXE
│      h8v2cc.cmd
│      LNK.EXE
│      OPT38.EXE
│      OPTLNK38.EXE
│     
├─INCLUDE
│      3048F.H
│      3048FONE.H
│      3048S.H
│      3664S.H
│      ASSERT.H
│      CTYPE.H
│      ERRNO.H
│      FLOAT.H
│      INDIRECT.H
│      LIMITS.H
│      MACHINE.H
│      MATH.H
│      NO_FLOAT.H
│      SETJMP.H
│      STDARG.H
│      STDDEF.H
│      STDIO.H
│      STDLIB.H
│      STRING.H
│     
├─LIB
│  │  C38HA.LIB
│  │  C38HAS.LIB
│  │  C38HN.LIB
│  │  C38HNS.LIB
│  │  C38REG.LIB
│  │  C38REGS.LIB
│  │  C8S26A.LIB
│  │  C8S26AS.LIB
│  │  C8S26N.LIB
│  │  C8S26NS.LIB
│  │  start3048.OBJ
│  │  start3048I.OBJ
│  │ 
│         

10.参考(4)メモリダンプの表現(メモリの状態表示)

メモリは1バイト(=8ビット,16進法で表現すると2桁)のデータを多く蓄えている場所である。
1バイトごとにアドレスが割り振られていて。0番地から1番地,2番地,・・・と続いている。
例えば,0番地に18,1番地に19,2番地に1A,3番地に1B,・・・の様にデータが保存されている様子を,
アドレスとデータのペアで表現すると,次のようになる。


アドレス
データ
0
18
1
19
2
1A
3
1B
4
28
5
29
6
2A
7
2B
8
38
9
39
A
3A
B
3B
C
48
D
49
E
4A
F
4B
10
58
11
59
12
5A
13
5B
14
68
15
69
16
6A
17
6B
18
78
19
79
1A
7A
1B
7B
1C
88
1D
89
1E
8A
1F
8B
20
98
21
99

続く


上記の表現では縦に長くなりすぎるので,次のように表すのが普通で,意味は同じである。


0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00000
18
19
1A
1B
28
29
2A
2B
38
39
3A
3B
48
49
4A
4B
00010
58
59
5A
5B
68
69
6A
6B
78
79
7A
7B
88
89
8A
8B
00020
98
99
9A
 ・・・  続く

続く

















もし,FFF00番台のメモリ内容を32バイト分表示すると次のように表示される。


0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
FFF00
18
19
1A
1B
28
29
2A
2B
38
39
3A
3B
48
49
4A
4B
FFF10
58
59
5A
5B
68
69
6A
6B
78
79
7A
7B
88
89
8A
8B

実際の表示では次のように,データを文字コードだとしたら文字は何になるかを右側に書いている。
例えばFF200番地のデータは7Aであり,7Aを文字コードとする文字は「z」である。

  <ADDR>                  <  D  A  T  A  >                     < ASCII CODE >
  FF200   7A 07 00 0F FF 00 6B 20  00 0F F8 00 6B 21 00 0F   "z.....k ....k!.."
  FF210   F8 02 09 10 6B A0 00 0F  F8 04 40 FE FF F9 FF F7   "....k.....@....."