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 } }
ループなどを使っていると,長くなるので,ベタにアセンブラで記述しています.関数の引数である, rhs
と lhs
は,アセンブラ記述の中でも使用することが出来ます.
続いて,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 } }
プログラムの断片にあったのは,足し算だけでした.
HC08のサポートは進化しているのね~ オリジナルの開発者としてはうれしい限り。オークヒルでの開発から19年。歳もとったし、会社も無くなったねえ(^^
そういや、Twitterをフォローしたよ。
by 某社OB (2010-05-20 11:11)