独自言語 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)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
picleコンパイラの最新版は下記のリンクからダウンロード可能です。
「独自言語 picle compiler on PIC24FJ」
また、picleコンパイラの動作確認のために DotMatrixLed を表示デバイスとしたライフゲームを作ってみました。
GAME言語でDotMAtrixLED制御した際と同様の回路を使っています。
GAME言語ではインタープリタだったので MAX7219 設定のためアセンブリ言語を使い高速化しましたが、picle コンパイラでは当然アセンブリ言語での記述は不要です^^
DotMatrixLED上でライフゲームが表示される様子を YouTube にアップしましたのでご覧ください。タイマーを入れ表示間隔を100msにしています(タイマーを入れないと早すぎてよく見えないw)
https://youtu.be/TSiOo6CGVqE
picleのソースは次のとおりです。これくらいの行数(150行)でもコンパイルは一瞬で完了します。
# 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] [ 前へ ] 連載記事 [ 次へ ]
コメント 0