「もぐらたたき」 プログラム

ここでは、制御用のプログラムについて書きます。

もぐらたたき本体

執筆中...

LED Matrix ドライバー

環境

avr-libcに含まれるio.hはI/Oポートにアクセスするとき、1バイトごとにしかアクセスできず不便だったので、ビットフィールドを使って1ビットごとにアクセスできるヘッダファイルをつくりました(iostr.h)。ようするに、ルネサスのH8シリーズのヘッダファイルのようにポートへアクセスできます(H8シリーズと同様 memory-mapped I/Oでよかった...)。[ダウンロード iostr.h]

注: 本当は、全部大文字を使いたかったんですが、#include <io.h>すると、同名のラベルがdefineされてしまうので、泣く泣く小文字にしています。しかし、まだ未完成なので、今回利用していないポートはまだ使えません。

ほかのプログラムに応用がききそうなモジュール

整数→文字列変換

// (signed)int型から10進数の文字列へ
char *i2dec(
    char buf[],   // 出力先のバッファへのポインタ
    int digit,    // 桁数
    int i )       // 変換もとの符号付整数
{
    char *pos = buf + digit;
    unsigned int u;   // 絶対値
    int negative = 0; // 負数のフラグ
    if (i < 0) {
        negative = 1;
        u = ((unsigned int)(-(1+i))) + 1;
    } else 
        u = i;
    *pos = '\0';
    do {
        if( buf<pos ) {
            *--pos = '0' + (u % 10);
            u /= 10;
        } else {
            *pos='#';       // overflow
            return pos;
        }
    } while (u); // 最下位から最上位まで
    
    if (negative) { // -符号をつける
        if( buf<pos )
            *--pos = '-';
        else {
            *pos='#';       // overflow
            return pos;
        }
    }
    while (buf<pos)
        *--pos = ' ';
    return pos;      // 文字列の始まりへのポインタ
}

// int型から n進数の文字列へ
char *i2asc(char buf[], int digit, unsigned long i, int radix)
{
    char hextable[] = "0123456789abcdef";
    char *pos = buf + digit;
    
    *pos = '\0';
    
    do {
        if( buf<pos ) {
            *--pos = hextable[(i % radix)];
            i /= radix;
        } else {
            *pos='#';       // over
            return pos;
        }
    } while (i);
    
    while (buf<pos)
        *--pos = ' ';
    
    return pos;
}

ライフゲーム :-)

//////////////////////////////////////////////////////////////////
// Life
void life()
{
    int i,j,k,n,gen;
    int di,dj;
    
    Moffset = 0;

    for(;;) {
        // Copy 
        for (i=0; i<32; ++i) {
            RAMpat[i] = RAMpat[i+32] = eep_get_word( &EEPpat[i] );
        }
        exact_ms(100);
        
        putprg("Generating...\r");
        
        for(gen=0; gen<200; gen++) {
            //dbgint(gen);
            segsetdec(gen);
            if (GlobalMode != modeLIFE)
                return;
            //exact_ms(1);
            for(i=0; i<32; ++i)
                RAMpat[i+32] = RAMpat[i];
            for(i=0; i<32; ++i) {
                for(j=0; j<16; ++j) {
                    n=0;
                    for(di=-1; di<=1; ++di) {
                        for(dj=-1; dj<=1; ++dj) {
                            if( Mexist(i+di, j+dj) && (!(di==0 && dj==0)) )
                                n++;
                        }
                }
                    if(Mexist(i,j)) {
                        if(n==2 || n==3)
                            RAMpat[i] |= (1<<j);    // 1
                        else
                            RAMpat[i] &= ~(1<<j);   // 0
                    } else {
                        if(n==3)
                            RAMpat[i] |= (1<<j);    // 1
                        else
                            RAMpat[i] &= ~(1<<j);   // 0
                    }
                }
            }
        }
    }
}

int Mexist(int x, int y)
{
    if( x<0 || x>31 || y<0 || y>15 )
        return 0;
    
    return (RAMpat[x+32] & (1<<y) );
}