So-net無料ブログ作成
English Version

独自言語 picle のコンパイラ化(その10) [PIC]

 picleコンパイラで実行前にグローバル変数を初期化(ゼロクリア)するようにしました。
 picleコンパイラの最新版は下記のリンクからダウンロード可能です。
    独自言語 picle compiler on PIC24FJ

 また、picleコンパイラの動作確認のために DotMatrixLed を表示デバイスとしたライフゲームを作ってみました。
 GAME言語でDotMAtrixLED制御した際と同様の回路を使っています。

 GAME言語ではインタープリタだったので MAX7219 設定のためアセンブリ言語を使い高速化しましたが、picle コンパイラでは当然アセンブリ言語での記述は不要です^^

 DotMatrixLED上でライフゲームが表示される様子を YouTube にアップしましたのでご覧ください。タイマーを入れ表示間隔を100msにしています(タイマーを入れないと早すぎてよく見えないw)


 https://youtu.be/TSiOo6CGVqE


 picleのソースは次のとおりです。これくらいの行数(150行)でもコンパイルは一瞬で完了します。

 Dot Matrix Life Game(picle)
# DotMatrixLed Life Game in picle

var _LedLat,_Disp,_Shift;
var DoBit,CsBit,CkBit;
var SizeX,SizeY;
var _Cnt;
var X,Y;

proc LedWrite( adrs, dat ) {
    var i;
    dat = adrs*256 + dat;
    _LedLat[0] = _LedLat[0]&(~(CsBit|CkBit));
    for ( i = 0; i < 16; i=i+1 ) {
        if ( dat < 0 ) {
            _LedLat[0] = _LedLat[0] | DoBit;
        } else {
            _LedLat[0] = _LedLat[0] & ~DoBit;
        }
        _LedLat[0] = _LedLat[0]|CkBit;
        dat = dat * 2;
        _LedLat[0] = _LedLat[0]&~CkBit;
    }
}

proc LedWrMode( adrs, dat ) {
    LedWrite( adrs, dat );
    LedWrite( adrs, dat );
    LedWrite( adrs, dat );
    _LedLat[0] = _LedLat[0] | CsBit;
}

proc Disp() {
    var adrs;
    for ( adrs = 1; adrs <= 8; adrs=adrs+1 ) {
        LedWrite( adrs, _Disp[adrs+15] );
        LedWrite( adrs, _Disp[adrs+7] );
        LedWrite( adrs, _Disp[adrs-1] );
        _LedLat[0] = _LedLat[0]|CsBit;
    }
}

proc Clear() {
    var i;
    for ( i = SizeX*SizeY-1; i >= 0; i=i-1 ) {
        _Cnt[i] = 0;
        Y = i / SizeX;
        if ( Modulo_ = 0 ) {
            _Disp[ Y ] = 0;
        }
    }
    for ( i = SizeX*SizeY/16; i > 0; i=i-1 ) {
        X = Rand_(SizeX/2) + SizeX/4;
        Y = Rand_(SizeY/2) + SizeY/4;
        _Disp[ Y ] = _Disp[ Y ] | _Shift[ X ];
    }
}

proc Init() {
    var i, shift;
    var _LedTris;
    SizeX = 8;
    SizeY = 8 * 3;
    _LedTris = $2c0;
    _LedLat = $2c4;
    DoBit = 1;
    CsBit = 4;
    CkBit = 2;
    _LedLat[0] = 0;
    _LedTris[0] = $f8;
    LedWrMode( 9, 0 );  # set no decode mode
    LedWrMode( 11, 7 ); # set scan limit 0-7
    LedWrMode( 10, 4 ); # set intencity
    LedWrMode( 12, 1 ); # set shutdown mode(normal)
    LedWrMode( 15, 0 ); # set test mode(normal)
    _Cnt = Array_;
    _Shift = Array_(SizeX*SizeY/2);
    _Disp = _Shift + 8;
    shift = 1;
    for ( i = 0; i < 8; i=i+1 ) {
        _Shift[ i ] = shift;
        shift = shift * 2;
    }
    Clear();
}

proc Inc() {
    var xx,yy,ytmp,pos;
    for ( yy=Y-1; yy<=Y+1; yy=yy+1 ) {
        ytmp = (yy+SizeY)%SizeY*SizeX;
        for ( xx=X-1; xx<=X+1; xx=xx+1+(yy=Y) ) {
            pos = ytmp+(xx+SizeX)%SizeX;
            _Cnt[pos] = _Cnt[pos]+1;
        }
    }
}

proc Wait() {
    while ( Timer_ ) {}
    Timer_ = 10;
}

proc main() {
    var count,pos;
    var flg,flgb,scnt;
    var dsp;
    Seed_(123);
    Init();
    scnt = 0;
    do {
        Disp();
        PrnStr_( "" );  # to sense key
        Wait();
        flg = 0;
        for ( Y=0; Y<SizeY; Y=Y+1 ) {
            dsp = _Disp[ Y ];
            for ( X=0; X<SizeX; X=X+1 ) {
                if ( dsp & _Shift[ X ] ) {
                    Inc();
                    flg = flg+1;
                }
            }
        }
        for ( Y = 0; Y < SizeY; Y=Y+1 ) {
            pos = SizeX * Y;
            for ( X = 0; X < SizeX; X=X+1 ) {
                count = _Cnt[ pos + X ];
                _Cnt[ pos + X ] = 0;
                if ( count = 3 ) {
                    _Disp[ Y ] = _Disp[ Y ] | _Shift[ X ];
                } else {
                    if ( count <> 2 ) {
                        _Disp[ Y ] = _Disp[ Y ] & ~_Shift[ X ];
                    }
                }
            }
        }
        if ( (scnt>5)|(flg=0) ) {
            Clear();
            scnt = 0;
            flg = -1;
        } else {
            if (flg=flgb) {
                scnt = scnt+1;
            } else {
                flgb = flg;
                scnt = 0;
            }
        }
    } while (1);
}


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(3) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

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

トラックバック 3