実数・関数演算ルーチンの改訂版
金野茂男
１．始めに最近、先年に著者の書き上げた実数・関数演算ルーチンを使用して、新たなＨＩＤの開発を思い立った。が、プログラムの先頭部分での変数や配列変数の宣言部で、アセンブラーエラーが発生することに気が付いた。２００７年に作成した「光学マウスキットを応用した卓上型経路長・面積計−その２」（１）中のＰＩＣ１８Ｆ２５２に、その実数・関数演算ルーチンが納まっている。このプログラムで解決方法を探した。要は以下の通りである。２０１０年になり、マイクロチップ社の提供している最新の「ＭＰＬＡＢ ＩＤＥ ｖ８．５３」をマイクロチップ社のＵＲＬからダウンロードした。この「ＭＰＬＡＢ ＩＤＥ ｖ８．５３」中の「ＭＰＡＳＭＷＩＮ」中のアセンブラー「ＭＰＡＳＭＶ５．３６｣ で、参考文献（１）に付属のアセンブラプログラムをアセンブルをすると、変数・配列宣言部分がエラーを出すようになってしまっていた。なぜそのようになったのかはわからない。それではと思い、同じ文献に付属のＨＥＸファイルのＰＩＣへの書き込みも試みた。正常に書き込めた。
書き込みの点では、最新の「ＭＰＬＡＢ ＩＤＥ ｖ８．５３」には問題はない事はわかった。
あれやこれやの試行錯誤の結果、アセンブルが正常行えるようにプログラムを修正することができた。以下その報告をする。
著者の公開しているＰＩＣ関係には、上述の実数・関数ルーチンが納まっているのは少なくない。
万が一、著者と同様のアセンブルの失敗に陥っているならば、本論文を参考にして、プログラムの変数宣言部分に若干の変更を加えればよいであろう。
２．プログラムの変更
以下に参考文献（１）に添付していたアセンブラプログラムの先頭にある宣言部分に、「ＭＰＬＡＢ ＩＤＥ ｖ８．５３」で正常にアセンブルできるように修正を加えたプログラムを掲載している。
極力、前のプログラムを消さないようにして、修正を加えている。「；」より右の文は注釈行とし、アセンブルから除外しているところである。前のプログラムと、ここで紹介しているプログラムを比較してみるのも良いであろう。
参考文献（１）の旧アセンブラを修正し、ハード回路はそのままに、最新「ＭＰＬＡＢ ＩＤＥｖ８．５３」でアセンブルし、そして同じＰＩＣ１８Ｆ２５２に正常に書き込みができ、前の通り、装置が正常に動作することは確認ずみである。
著者の他の装置の場合でも、該当する箇所を下のプログラムを参照しながら、修正していけばよい。
或いは、著者の提供しているプログラムを参考にして作成しているプログラムでも、同じ箇所を修正すれば、正常にアセンブリングができよう。
;**********************************************************************************;**********************************************************************************;org h'000' ;バンク０に設ける;変数の宣言CBLOCK
h'000'temp0
temp1
temp2
countercurrent
charnum
LCD̲mode;res;res;res;res;res;res;res1111111;一時的カウンタ変数;;;カウンタ変数;一時変数;表示する文字数を入れる;

mosi̲data ;resmiso̲dta ;resmotion;resdelta̲x;resdelta̲y;res11111;ＭＯＳＩポートに送り出すデータを納める;ＭＩＳＯポートから出力されるデータを納める;ＭＯＴＩＯＮレジスタの内容を受け取る変数;ｄｅｌｔａ＿Ｘレジスタの内容を納める変数;ｄｅｌｔａ＿Ｙレジスタの内容を納める変数

sum̲xsum̲y;res;res

11;Ｘ方向の移動量;Ｙ方向の移動量

figure100 ;resfigure10 ;resfigure1;res

111;１バイト１６進数を１０進数に変換したときに;桁の数値が収まる変数;-1-連続２バイト−３２７６８〜＋３２７６８
連続２バイト−３２７６８〜＋３２７６８

b15=符号ビット
b15=符号ビット

sign;res1;＋、−のＬＣＤ用データが収まる

sig
fig:8exp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

xsig
xfig:8xexp;res
1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res
1;数値の指数値が納まる

ysig
yfig:8yexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

sumxsig
sumxfig:8sumxexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

sumysig
sumyfig:8sumyexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

xi̲1sig
xi̲1fig:8xi̲1exp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

yi̲1sig
yi̲1fig:8yi̲1exp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

xisigxifig:8xiexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

yisig
yifig:8yiexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

tanasig;res 1 ;tanafig:8;res 8 ;tanaexp;res 1 ;tancsig;res 1 ;tancfig:8;res 8 ;tancexp;res 1 ;pathsig
pathfig:8pathexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

stepsig
stepfig:8stepexp;res1;数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;数値の仮数が納まる。８桁分用意する。
;res1;数値の指数値が納まる

asig;res 1 ;afig:8;res 8 ;aexp;res 1 ;bsig;res 1 ;bfig:8;res 8 ;３角形のヘロンの公式の３辺の数値が納まる
bexp;res 1 ;csig;res 1 ;cfig:8;res 8 ;-2-cexp;res1;

dsig;res 1 ;;res 8 ;dfig:8dexp;res 1 ;ssig;res 1 ;sfig:8;res 8 ;作業変数群
sexp;res 1 ;areasig;res 1 ;areafig:8;res 8 ;面積値が納まる
areaexp;res 1 ;parasig;res 1 ;parafig:8;res 8 ;縮尺からの換算数値が納まる
paraexp;res 1 ;num̲counter ;res 1 ;算用数値が入る
number:4;res 4 ;整数値最大４桁の換算数値が納める
fig̲number ;res 1 ;上記数値を決める時に使用するいわゆる桁数
unit;res 1 ;単位対応の数値が納まる。 0=mm,1=cm,2=m,3=km
my̲status;res 1 ;状態指定ビットとして使用する
ENDC#defineinput̲flagmy̲status,0 ;=0で入力中、=1で入力終了;**********************************************************************************;**********************************************************************************;;ＬＣＤの制御用ポートの割り当て。
#define contl̲E
PORTA,2 ;０=ＬＣＤ不動作、
１=ＬＣＤ動作#define contl̲RW
PORTA,1 ;０=ＬＣＤへ書き込み １=ＬＣＤから読み出し#define contl̲RS
PORTA,0 ;０=命令、
１=記号／バイト#define LED̲monitor PORTA,3 ;ポートＡの第３ビットをモニターに使用#define lcd̲dataPORTB;ＬＣＤデータ用ポートのＢポートにラベル名を付ける。
;ＬＣＤに転送する各命令のコードの定義;使用するＬＣＤのテクニカルノートを参照すること
;
２進数
処理
clear
equ
1; 00000001
表示をクリアhomeequ2; 00000010
カーソルをホームへ
shift̲lequ24; 00011000
表示を左へ移動shift̲requ
28; 00011100
表示を右へ移動crsr̲lequ
16; 00010000
カーソルを左へ移動
crsr̲requ
20; 00010100
カーソルを右へ移動
crsr̲eequ32; 00100000
ファンクションをセット
blink̲cequ
11; 00001011
表示オフ、カーソルオン、ブリンクオン
no̲crsrequ
8; 00001000
表示オフ、カーソルオフ、ブリンクオフ
ret̲bakequ
192; 11000000
改行とリターン;ＬＣＤに表示する文字コードの定義
columnequb'00111010'
degreeequb'11011111'
piriodequb'00101110'
charlimit equ
16;ＬＣＤの１行の表示可能文字数
allcharequ
31;ＬＣＤに表示できる総文字数;ＬＣＤに表示する各文字の文字数
Labonameequ15;' **Kinno Labo**'Devisename
equ13;' Opt Sencer'-3-;ＡＤＮＳ−５０３０端子と接続するＰＩＣの端子の命名#define NRESET PORTC,4;リセットピン。Ｌ入力でアクチブ#define NCS
PORTC,3;チップ選択。Ｌ入力でアクチブ
PORTC,2;シリアルクロック入力#define SCLK
#define MOSIPORTC,1;シリアルデータ入力#define MISOPORTC,0;シリアルデータ出力;#define#define#define#define#definecenter̲sw
right̲sw
left̲swup̲sw
down̲sw

PORTC,7
PORTA,5
PORTC,6
PORTA,4
PORTC,5;;クロスキースイッチの名前;;;;**********************************************************************************;************** 浮動小数点演算用変数定義 バンク５に設ける *************************;**********************************************************************************;org h'500' ;バンク５に設ける
CBLOCK
h'500'
xsig̲B5
xfig̲B5:8
xexp̲B5;res1;先行数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;先行数値の仮数が納まる。８桁分用意する。
;res1;先行数値の指数値が納まる

ysig̲B5yfig̲B5:8yexp̲B5;res1;後行数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;後行数値の仮数が納まる。８桁分用意する。
;res1;後行数値の指数値が納まる

zsig̲B5zfig̲B5:8zexp̲B5;res1;結果数値の仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;結果数値の仮数が納まる。８桁分用意する。
;res1;結果数値の指数値が納まる

xwork̲B5:32 ;resywork̲B5:32 ;reszwork̲B5:32 ;res323232;３２バイト配列で加減算を行うための配列その１;３２バイト配列で加減算を行うための配列その２;３２バイト配列で加減算を行うための配列その３asig̲B5afig̲B5:8aexp̲B5;res1;仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;res1;ワーク変数。浮動小数点型の指数値が納まる

bsig̲B5bfig̲B5:8
bexp̲B5;res1;仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;res1;ワーク変数。浮動小数点型の指数値が納まる

csig̲B5
cfig̲B5:8
cexp̲B5;res1;仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;res1;ワーク変数。浮動小数点型の指数値が納まる

dsig̲B5
dfig̲B5:8
dexp̲B5;res1;仮数符号（第１ビット）と指数符号（第０ビット）が納まる;res8;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する;res1;ワーク変数。浮動小数点型の指数値が納まる

counter̲B5
current̲B5
point̲B5
repeat̲B5;res;res;res;res

1111;表示した文字数のカウンタ変数;一時変数;小数点用のカレント変数;漸化式の反復回数;関数演算時に使用するワーク変数
esig̲B5;res1;仮数符号（第１ビット）、指数符号（第０ビット）が納まる
efig̲B5:8;res8;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
eexp̲B5;res1;数値の指数値が納まる
fsig̲B5
ffig̲B5:8
fexp̲B5;res1;res8;res1;仮数符号（第１ビット）、指数符号（第０ビット）が納まる;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;数値の指数値が納まる-4-gsig̲B5gfig̲B5:8gexp̲B5;res1;res8;res1;仮数符号（第１ビット）、指数符号（第０ビット）が納まる;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;数値の指数値が納まる

hsig̲B5hfig̲B5:8hexp̲B5;res1;res8;res1;仮数符号（第１ビット）、指数符号（第０ビット）が納まる;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;数値の指数値が納まる

ksig̲B5kfig̲B5:8kexp̲B5;res1;res8;res1;仮数符号（第１ビット）、指数符号（第０ビット）が納まる;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;数値の指数値が納まる

psig̲B5pfig̲B5:8pexp̲B5;res1;res8;res1;仮数符号（第１ビット）、指数符号（第０ビット）が納まる;ワーク配列。浮動小数点型の仮数が納まる。８桁分用意する。
;数値の指数値が納まる

tri̲fun̲sel̲B5cord̲para0̲B5cord̲para1̲B5;res;res;res

111;三角関数の種類を選択する変数;三角関数演算ルーチン内で使用できる変数その０;三角関数演算ルーチン内で使用できる変数その１exp̲para0̲B5
exp̲para1̲B5expvar̲B5;res;res;res

111;指数関数ルーチンで使用する変数その０;指数関数ルーチンで使用する変数その１;指数関数ルーチンで使用する変数

log̲para0̲B5
log̲para1̲B5logvar̲B5;res;res;res

111;対数関数ルーチンで使用する変数その０;対数関数ルーチンで使用する変数その１;対数関数ルーチンで使用する変数

ENDC;定数の宣言limit̲B5 equ32

３．終わりにマイクロチップ社の旧ＭＰＬＡＢで、正常に開発できていたプログラムが、最新ＭＰＬＡＢでは正常にアセンブリングができなくなっている。この理由はわからない。不正常の１つは、旧バージョン
では問題の無かった配列変数を簡単に定義できた「ＲＥＳ］ディレクチブである。新バージョンでは受け付けてくれない。アセンブラ文章の書き方によっては「ＲＥＳ」を受け付けるようにもなるが、他の所でおかしなくなる。何故か。エラーメッセージも良くわからない。ＰＩＣＳＴＡＲＴ Ｐｌｕｓライターに付属しているマニュアルには、何らの注釈もなく、どのＰＩＣでも、どのＭＰＬＡＢのバージョンでもＲＥＳの使用ができるような説明なのだが。
その他、不可思議な箇所は幾つかある。が、とにかく上記のように旧プログラムを修正すれば、プログラムは正常に動作する。
今後は、その時点での開発環境を詳細に記述すべきであることを改めて認識した。今回の開発環境
はパソコンはＷｉｎｄｏｗｓ ＸＰである。
参考文献（１）光学マウスキットを応用した卓上型経路長・面積計−その２」金野茂男、小山高専電子制御工学科、２００７年６月著者のＵＲＬで公開発表。
２０１０年８月１１日-5-