ECOはエセコンパイラ。
コンパイラ軽~く作れるならそれでもいいけど、それはちょっと難しい。
それに似たことをテイよくやる。
例えばこんな話。
処理内容が
※Cソース
(それ以前にaやbには値が入っている)
a += b // aにbを足しこむ
if(a>=256){ // aの範囲は0~255なのでクリッピング
a=255;
}
if(a<0){
a=0;
}
そのCPUには足した後256以上だったら255にしてくれる命令adds がある。飽和演算とよばれているやつ。
それをつかえば※の処理は1行で書けるのだ。
adds areg breg
が、ただ※のCソースを普通にコンパイルしたのでは
adds areg breg のコードは吐いてくれない。
//////////////////
さて、どうしようか?
ECOでの対処法の典型例を書く。
//////////////////
大筋
1.一旦シミュレータを作る
2.そのソースがそのまま使えるソースジェネレータを書く
//////////////////
1.一旦シミュレータを作る。
0~255の値をとる変数クラスを作り
関数 += を実装する。
class Reg8
{
const char *m_name;
int m_value;
Reg8(const char *name)
{
m_name=name;
}
operator += (Reg8 b)
{
m_value+=b.m_va
if(m_value>=256)
m_value=255;
}
if(m_value<0){
m_value=0;
}
}
};
///
すると※の処理はC++のソースで
Reg8 areg("areg");
Reg8 breg("breg");
(ここになんらかのareg,bregを設定する処理)
areg+=breg;
と書ける。
実際にとして動かしてみれば、
void main()
{
Reg8 areg("areg");
Reg8 breg("breg");
areg.m_value=20
breg.m_value=70
areg+=breg;
}
レジスタの動きがシミュレートできて。
計算が終わるとareg.m_valueに255が入ることが確かめられる。
つづく