So-net無料ブログ作成
検索選択

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

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。