SSブログ

HCS08 に64ビットの足し算をさせる [CodeWarrior]このエントリーを含むはてなブックマーク#

昔書いたプログラムの断片が出てきたので,記録にとめておきます.

64ビットの型が存在する

HCS08は,純粋な8ビットマイコンです.そのため,あまりビット長の多い数値の演算は得意としません.一方, CodeWarrior が提供する MC9S08QG8.H ヘッダファイルには, dlong という64ビットの型が宣言されています.あたかも,64ビットの演算が可能であるかのようです.

typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];

しかしながら,この型は,「長さ2の unsigned long の配列」を再定義したものに過ぎません.従って, C でプログラムを書くときには,32ビットの long 型の演算はできますが,64ビットの dlong 型の演算を使うことは出来ません. dlong 型は,あくまでも64ビットの領域を確保するための型なのです.

64ビットの値の演算がほしい

型が存在するのなら,使ってみたいものです.そこで,64ビットの演算を行う関数を作成してみました.まずは,64ビットの場所に16ビットの値を足し込む関数です.

void add_dl_w(dlong *lhs, word rhs) {
  __asm {
    LDHX  lhs
    LDA   7,X
    ADD   rhs:1
    STA   7,X
    LDA   6,X
    ADC   rhs:0
    STA   6,X
    LDA   5,X
    ADC   #0
    STA   5,X
    LDA   4,X
    ADC   #0
    STA   4,X
    LDA   3,X
    ADC   #0
    STA   3,X
    LDA   2,X
    ADC   #0
    STA   2,X
    LDA   1,X
    ADC   #0
    STA   1,X
    LDA   0,X
    ADC   #0
    STA   0,X
  }
}

ループなどを使っていると,長くなるので,ベタにアセンブラで記述しています.関数の引数である, rhslhs は,アセンブラ記述の中でも使用することが出来ます.

続いて,64ビットの場所に32ビットの値を足し込む関数です.

void add_dl_dw(dlong *lhs, dword rhs) {
  __asm {
    LDHX  lhs
    LDA   7,X
    ADD   rhs:3
    STA   7,X
    LDA   6,X
    ADC   rhs:2
    STA   6,X
    LDA   5,X
    ADC   rhs:1
    STA   5,X
    LDA   4,X
    ADC   rhs:0
    STA   4,X
    LDA   3,X
    ADC   #0
    STA   3,X
    LDA   2,X
    ADC   #0
    STA   2,X
    LDA   1,X
    ADC   #0
    STA   1,X
    LDA   0,X
    ADC   #0
    STA   0,X
  }
}

プログラムの断片にあったのは,足し算だけでした.


nice!(0)  コメント(1)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 1

某社OB

HC08のサポートは進化しているのね~ オリジナルの開発者としてはうれしい限り。オークヒルでの開発から19年。歳もとったし、会社も無くなったねえ(^^

そういや、Twitterをフォローしたよ。
by 某社OB (2010-05-20 11:11) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。